feat(catalog): model availability as global decisions

This commit is contained in:
2026-08-25 09:03:04 -03:00
parent d9635d47ba
commit 98bfc0d5e9
13 changed files with 220 additions and 149 deletions

View File

@@ -2,7 +2,6 @@
namespace App\Domains\Catalog\Resources;
use App\Domains\Catalog\Enums\AvailabilitySubject;
use App\Domains\Catalog\Enums\InventoryPolicy;
use App\Domains\Catalog\Enums\ProductLayout;
use App\Domains\Catalog\Models\CatalogItem;
@@ -39,20 +38,13 @@ class CatalogFeaturedItemResource extends JsonResource
'nombre' => $catalogItem->nombre,
'descripcion' => $catalogItem->descripcion,
'precio' => $catalogItem->precio,
'availability' => $this->availability(
$availableStock,
$remainingUserQuota,
),
'availability' => $this->availability($availableStock, $remainingUserQuota),
'variants' => $catalogItem->variants
->map(function (Variant $variant) use ($catalogItem, $remainingUserQuota): array {
->map(function (Variant $variant) use ($catalogItem): array {
$variantStock = $catalogItem->inventory_policy === InventoryPolicy::Unlimited
? null
: $variant->inventory->availableStock();
$availability = $this->availability(
$variantStock,
$remainingUserQuota,
AvailabilitySubject::Variant,
);
$availability = $this->availability($variantStock, null);
return [
'id' => $variant->id,
@@ -66,7 +58,7 @@ class CatalogFeaturedItemResource extends JsonResource
'values' => $variant->selectorOptions($catalogItem->itemAttributes),
];
})
->filter(fn (array $variant): bool => $variant['availability']['capabilities']['display'])
->filter(fn (array $variant): bool => $variant['availability']['state'] === 'visible')
->values(),
];
@@ -120,9 +112,9 @@ class CatalogFeaturedItemResource extends JsonResource
private function availability(
?int $stock,
?int $remainingUserQuota,
AvailabilitySubject $subject = AvailabilitySubject::Product,
): array {
return app(CatalogItemAllowanceService::class)
->availability($stock, $remainingUserQuota, $subject);
->availability($stock, $remainingUserQuota)
->toArray();
}
}

View File

@@ -2,7 +2,6 @@
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;
@@ -46,7 +45,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'])
->filter(fn (array $variant): bool => $variant['availability']['state'] === 'visible')
->values(),
'selected_variant' => $this->when(
$selectedVariant !== null,
@@ -161,7 +160,7 @@ class CatalogItemDetailResource extends JsonResource
$variantStock = $this->variantStock($variant);
$availability = $this->availability(
$variantStock,
AvailabilitySubject::Variant,
false,
);
return [
@@ -195,12 +194,11 @@ class CatalogItemDetailResource extends JsonResource
/** @return array<string, mixed> */
private function availability(
?int $stock,
AvailabilitySubject $subject = AvailabilitySubject::Product,
bool $includeUserQuota = true,
): array {
return app(CatalogItemAllowanceService::class)->availability(
$stock,
$this->getAttribute('remaining_user_quota'),
$subject,
);
$includeUserQuota ? $this->getAttribute('remaining_user_quota') : null,
)->toArray();
}
}

View File

@@ -2,7 +2,6 @@
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\Variant;
@@ -37,7 +36,7 @@ class CatalogSearchItemResource extends JsonResource
: $variant->inventory?->availableStock();
$availability = $this->availability(
$variantStock,
AvailabilitySubject::Variant,
false,
);
return [
@@ -52,7 +51,7 @@ class CatalogSearchItemResource extends JsonResource
'values' => $variant->selectorOptions($this->itemAttributes),
];
})
->filter(fn (array $variant): bool => $variant['availability']['capabilities']['display'])
->filter(fn (array $variant): bool => $variant['availability']['state'] === 'visible')
->values(),
];
}
@@ -60,12 +59,11 @@ class CatalogSearchItemResource extends JsonResource
/** @return array<string, mixed> */
private function availability(
?int $stock,
AvailabilitySubject $subject = AvailabilitySubject::Product,
bool $includeUserQuota = true,
): array {
return app(CatalogItemAllowanceService::class)->availability(
$stock,
$this->getAttribute('remaining_user_quota'),
$subject,
);
$includeUserQuota ? $this->getAttribute('remaining_user_quota') : null,
)->toArray();
}
}