*/ final class UpdateDiscount implements Action { /** * @param \App\Actions\Discounts\UpdateDiscountInput $input */ public function __invoke(ActionInput $input): Discount { Assert::isInstanceOf($input, UpdateDiscountInput::class); $discount = $input->discount; $discount->type = $input->type; $discount->value = $input->value; $discount->is_old_price_displayed = $input->is_old_price_displayed; $discount->date_start = $input->period->start !== null ? Carbon::instance($input->period->start) : null; $discount->date_end = $input->period->end !== null ? Carbon::instance($input->period->end) : null; $discount->saveOrFail(); $this->syncAssociatedProducts($discount, $input->associatedProductsIds); return $discount; } /** * @param array $productIdList */ private function syncAssociatedProducts(Discount $discount, array $productIdList): void { Product::query() ->where('discount_id', $discount->id) ->whereNotIn('id', $productIdList) ->update(['discount_id' => null]); if (! empty($productIdList)) { Product::query() ->whereIn('id', $productIdList) ->update(['discount_id' => $discount->id]); } } }