ldc-boutique-cnc-sable/infra/Adapters/Repositories/EloquentPickupExceptionRepository.php
Jérémy Munsch 584fee7e69
fix(EloquentPickupExceptionRepository): include pivot data in exception mapping
Updated the mapping function to include pivot data for pickup exceptions, ensuring accurate retrieval of associated order deadlines and replacement dates.
2026-10-29 17:02:07 +01:00

109 lines
3.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Infrastructure\Adapters\Repositories;
use App\Models\PickupException;
use App\Models\Shop;
use App\Models\ShopPickupExceptionPivot;
use Carbon\CarbonPeriod;
use Domain\Models\Entities\PickupExceptionOnDate;
use Domain\Models\ValueObjects\Entities\PickupExceptionId;
use Domain\Models\ValueObjects\Entities\ShopId;
use Domain\Models\ValueObjects\ShopPickupOverride;
use Domain\Ports\Repositories\PickupExceptionRepository;
use Illuminate\Support\Carbon;
class EloquentPickupExceptionRepository implements PickupExceptionRepository
{
#[\Override]
public function find(PickupExceptionId $id): ?PickupExceptionOnDate
{
$ex = PickupException::query()
->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()
);
}
}