Files
shopit-back/app/Domains/Ticket/Resources/AdminApp/AdminAppTicketResource.php

88 lines
3.0 KiB
PHP

<?php
namespace App\Domains\Ticket\Resources\AdminApp;
use App\Domains\Catalog\Models\ItemAttribute;
use App\Domains\Purchase\Models\PurchaseItem;
use App\Domains\Ticket\Models\Ticket;
use App\Domains\Ticket\Resources\TicketResource;
use Illuminate\Http\Request;
/** @mixin Ticket */
class AdminAppTicketResource extends TicketResource
{
/** @return array<string, mixed> */
public function toArray(Request $request): array
{
$purchaseItem = $this->sourcePurchaseItem();
return [
...parent::toArray($request),
'source_purchase_id' => $this->source_purchase_id,
'order_number' => $this->source_purchase_id,
'product' => $purchaseItem?->item_nombre
?? $this->sourceCatalogItem?->nombre
?? $this->name,
'amount' => $purchaseItem?->precio_unitario,
'client' => $this->sourcePurchase?->nombre_apellido ?? $this->user?->nombre_apellido,
'date' => $this->sourcePurchase?->created_at,
'status' => $this->status,
'scanned_by' => $this->scannerUser?->nombre_apellido,
'variant_properties' => $this->variantProperties(),
];
}
private function sourcePurchaseItem(): ?PurchaseItem
{
return $this->sourcePurchase?->items->first(function (PurchaseItem $item): bool {
if ($this->source_variant_id !== null) {
return $item->source_variant_id === $this->source_variant_id;
}
return $item->source_catalog_item_id === $this->source_catalog_item_id
&& $item->source_variant_id === null;
});
}
/**
* @return list<array{
* code: string,
* label: string,
* values: list<array{value: string, label: string}>
* }>
*/
private function variantProperties(): array
{
$variant = $this->sourceVariant;
if ($variant === null) {
return [];
}
$itemAttributes = $variant->definitions
->map(fn ($definition) => $definition->itemAttribute)
->filter()
->merge($variant->catalogItem?->itemAttributes ?? collect())
->unique('id')
->values();
return $variant->selectionOptions($itemAttributes)
->map(function (array $selection, string $attributeCode) use ($itemAttributes): array {
$itemAttribute = $itemAttributes->first(
fn (ItemAttribute $itemAttribute): bool => $itemAttribute->attribute?->codigo
=== $attributeCode,
);
$values = array_is_list($selection) ? $selection : [$selection];
return [
'code' => $attributeCode,
'label' => $itemAttribute?->attribute?->nombre
?? ($attributeCode === 'event_date' ? 'Fecha' : $attributeCode),
'values' => array_values($values),
];
})
->values()
->all();
}
}