feat(catalog): scope availability policies by subject
This commit is contained in:
@@ -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\Enums\ProductLayout;
|
||||
use App\Domains\Catalog\Models\CatalogItem;
|
||||
@@ -47,6 +48,11 @@ class CatalogFeaturedItemResource extends JsonResource
|
||||
$variantStock = $catalogItem->inventory_policy === InventoryPolicy::Unlimited
|
||||
? null
|
||||
: $variant->inventory->availableStock();
|
||||
$availability = $this->availability(
|
||||
$variantStock,
|
||||
$remainingUserQuota,
|
||||
AvailabilitySubject::Variant,
|
||||
);
|
||||
|
||||
return [
|
||||
'id' => $variant->id,
|
||||
@@ -56,14 +62,11 @@ class CatalogFeaturedItemResource extends JsonResource
|
||||
'event_dates' => $variant->selectedEventDates()->map(fn ($eventDate): string => $eventDate->date->format('Y-m-d'))->values(),
|
||||
'descripcion' => $variant->getDescription(),
|
||||
'precio' => number_format($variant->getPrice(), 2, '.', ''),
|
||||
'availability' => $this->availability(
|
||||
$variantStock,
|
||||
$remainingUserQuota,
|
||||
'variant',
|
||||
),
|
||||
'availability' => $availability,
|
||||
'values' => $variant->selectorOptions($catalogItem->itemAttributes),
|
||||
];
|
||||
})
|
||||
->filter(fn (array $variant): bool => $variant['availability']['capabilities']['display'])
|
||||
->values(),
|
||||
];
|
||||
|
||||
@@ -117,9 +120,9 @@ class CatalogFeaturedItemResource extends JsonResource
|
||||
private function availability(
|
||||
?int $stock,
|
||||
?int $remainingUserQuota,
|
||||
string $scope = 'product',
|
||||
AvailabilitySubject $subject = AvailabilitySubject::Product,
|
||||
): array {
|
||||
return app(CatalogItemAllowanceService::class)
|
||||
->availability($stock, $remainingUserQuota, $scope);
|
||||
->availability($stock, $remainingUserQuota, $subject);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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\Variant;
|
||||
@@ -34,6 +35,10 @@ class CatalogSearchItemResource extends JsonResource
|
||||
$variantStock = $this->inventory_policy === InventoryPolicy::Unlimited
|
||||
? null
|
||||
: $variant->inventory?->availableStock();
|
||||
$availability = $this->availability(
|
||||
$variantStock,
|
||||
AvailabilitySubject::Variant,
|
||||
);
|
||||
|
||||
return [
|
||||
'id' => $variant->id,
|
||||
@@ -43,21 +48,24 @@ class CatalogSearchItemResource extends JsonResource
|
||||
'event_dates' => $variant->selectedEventDates()->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' => $variant->selectorOptions($this->itemAttributes),
|
||||
];
|
||||
})
|
||||
->filter(fn (array $variant): bool => $variant['availability']['capabilities']['display'])
|
||||
->values(),
|
||||
];
|
||||
}
|
||||
|
||||
/** @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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user