where('id', $id->value) ->first(); return $ex ? $this->toDomain($ex) : null; } #[\Override] public function persist(PickupExceptionOnDate $entity): void { $model = PickupException::query() ->where('id', $entity->id->value) ->firstOrNew(); $model->id = $entity->id->value->toString(); $model->date = Carbon::instance($entity->date); $model->label = $entity->label; $model->repeatable = $entity->repeatable; $model->repeat_frequency = $entity->repeatFrequency; $model->auto_updated = $entity->autoUpdated; $model->save(); } #[\Override] public function delete(PickupExceptionOnDate $entity): void { PickupException::query() ->where('id', $entity->id->value) ->delete(); } public function getExceptionsForShop(ShopId $shopId, CarbonPeriod $period): array { $shop = Shop::query() ->where('id', $shopId->value) ->firstOrFail(); return $shop->pickupExceptions() ->where('date', '>', $period->getStartDate()->toImmutable()) ->where('date', '<=', $period->getEndDate()?->toImmutable()) ->get() ->map(fn (PickupException $ex) => $this->toShopDomain($ex, $ex->pivot)) ->all(); } public function getAllExceptions(): array { return PickupException::query() ->get() ->map(fn (PickupException $ex) => $this->toDomain($ex)) ->all(); } public function getExceptionsAssociatedWithShop(ShopId $shopId): array { $shop = Shop::query() ->where('id', $shopId->value) ->firstOrFail(); $shop->relationLoaded('pickupExceptions') ?: $shop->load('pickupExceptions'); return $shop->pickupExceptions ->map(fn (PickupException $ex) => $this->toShopDomain($ex, $ex->pivot)) ->all(); } private function toDomain(PickupException $model): PickupExceptionOnDate { return new PickupExceptionOnDate( id: $model->getId(), date: $model->date->toImmutable(), label: $model->label, repeatable: (bool) $model->repeatable, repeatFrequency: $model->repeat_frequency, autoUpdated: (bool) $model->auto_updated ); } private function toShopDomain(PickupException $model, ?ShopPickupExceptionPivot $pivot = null): ShopPickupOverride { return new ShopPickupOverride( exception: $this->toDomain($model), replacementDate: $pivot?->replacement_date?->toImmutable(), orderDeadlineAt: $pivot?->order_deadline_at?->toImmutable() ); } }