feat(catalog): scope availability policies by subject

This commit is contained in:
2026-08-24 15:15:47 -03:00
parent a73b628bb4
commit 2323994f30
7 changed files with 126 additions and 32 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Domains\Catalog\Resources;
use App\Domains\Catalog\Enums\AvailabilitySubject;
use App\Domains\Catalog\Enums\InventoryPolicy;
use App\Domains\Catalog\Models\CatalogItem;
use App\Domains\Catalog\Models\ItemAttribute;
@@ -45,6 +46,7 @@ class CatalogItemDetailResource extends JsonResource
),
'variants' => $this->variants
->map(fn (Variant $variant): array => $this->variantData($variant))
->filter(fn (array $variant): bool => $variant['availability']['capabilities']['display'])
->values(),
'selected_variant' => $this->when(
$selectedVariant !== null,
@@ -157,6 +159,10 @@ class CatalogItemDetailResource extends JsonResource
$values = $variant->selectionOptions($this->itemAttributes);
$eventDates = $variant->selectedEventDates();
$variantStock = $this->variantStock($variant);
$availability = $this->availability(
$variantStock,
AvailabilitySubject::Variant,
);
return [
'id' => $variant->id,
@@ -166,7 +172,7 @@ class CatalogItemDetailResource extends JsonResource
'event_dates' => $eventDates->map(fn ($eventDate): string => $eventDate->date->format('Y-m-d'))->values(),
'descripcion' => $variant->getDescription(),
'precio' => number_format($variant->getPrice(), 2, '.', ''),
'availability' => $this->availability($variantStock, 'variant'),
'availability' => $availability,
'values' => $values,
];
}
@@ -187,12 +193,14 @@ class CatalogItemDetailResource extends JsonResource
}
/** @return array<string, mixed> */
private function availability(?int $stock, string $scope = 'product'): array
{
private function availability(
?int $stock,
AvailabilitySubject $subject = AvailabilitySubject::Product,
): array {
return app(CatalogItemAllowanceService::class)->availability(
$stock,
$this->getAttribute('remaining_user_quota'),
$scope,
$subject,
);
}
}