commitcd99a6489bMerge:ebcbbb1e63a036Author: ncoronel <ncoronel@quo.ar> Date: Wed Aug 26 10:12:44 2026 -0300 Merge branch 'fix/simplify_stock_reservations' of https://gitea.quo.ar/tbianchini/shopit-back into fix/simplify_stock_reservations commitebcbbb1774Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:33:39 2026 -0300 fix(cart): reconcile expired cart mutations commit3dd378ed06Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:15 2026 -0300 docs(stock): describe associated entity expiration commit4f705175bdAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:14 2026 -0300 test(stock): cover propagated reservation expiration commit82570fe941Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:09:52 2026 -0300 refactor(stock): propagate reservation expiration commitd2a2b323e0Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 docs(stock): document terminal reservation recovery commitec67623b7bAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 test(stock): cover terminal reservation lifecycle commitf6f138e180Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:41 2026 -0300 refactor(stock): make expired reservations terminal commitd612b7a118Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:30 2026 -0300 docs(stock): describe unified expiration ownership commit49f42d4507Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:23 2026 -0300 test(stock): cover authoritative reservation expiration commit1881cc1d4bAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:17 2026 -0300 refactor(stock): make reservation expiration authoritative commit00ec37d8a0Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:34 2026 -0300 docs(stock): document centralized reservation flow commitd9f374c718Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:29 2026 -0300 test(stock): cover aggregate reservation lifecycle commitbbfdf8f342Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:23 2026 -0300 refactor(stock): centralize reservation aggregate commit8a0f29bdaeAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:33:39 2026 -0300 fix(cart): reconcile expired cart mutations commit198ed400a9Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:15 2026 -0300 docs(stock): describe associated entity expiration commit23d83166e6Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:14 2026 -0300 test(stock): cover propagated reservation expiration commitcb090402d0Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:09:52 2026 -0300 refactor(stock): propagate reservation expiration commitc120b6f7c0Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 docs(stock): document terminal reservation recovery commit1106fa28b4Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 test(stock): cover terminal reservation lifecycle commit896fb81bcfAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:41 2026 -0300 refactor(stock): make expired reservations terminal commit8545fbc645Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:30 2026 -0300 docs(stock): describe unified expiration ownership commitdd6dcb708aAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:23 2026 -0300 test(stock): cover authoritative reservation expiration commit624b246ff5Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:17 2026 -0300 refactor(stock): make reservation expiration authoritative commit007b95b904Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:34 2026 -0300 docs(stock): document centralized reservation flow commit0b3c8c93beAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:29 2026 -0300 test(stock): cover aggregate reservation lifecycle commitede718e448Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:23 2026 -0300 refactor(stock): centralize reservation aggregate commite63a03601aAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:33:39 2026 -0300 fix(cart): reconcile expired cart mutations commit389373ad8cAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:15 2026 -0300 docs(stock): describe associated entity expiration commitace02a3133Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:10:14 2026 -0300 test(stock): cover propagated reservation expiration commitd69a6210f6Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 16:09:52 2026 -0300 refactor(stock): propagate reservation expiration commit3c0b43fea3Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 docs(stock): document terminal reservation recovery commit9b0008626bAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:47 2026 -0300 test(stock): cover terminal reservation lifecycle commit61861e331aAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:58:41 2026 -0300 refactor(stock): make expired reservations terminal commit2cc9d7dd97Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:30 2026 -0300 docs(stock): describe unified expiration ownership commitf982bcead1Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:23 2026 -0300 test(stock): cover authoritative reservation expiration commit7a85e1731dAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:28:17 2026 -0300 refactor(stock): make reservation expiration authoritative commit6db99e775aAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:34 2026 -0300 docs(stock): document centralized reservation flow commite5f7ba3615Author: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:29 2026 -0300 test(stock): cover aggregate reservation lifecycle commit24bfef431bAuthor: ncoronel <ncoronel@quo.ar> Date: Tue Aug 25 15:05:23 2026 -0300 refactor(stock): centralize reservation aggregate
81 lines
2.8 KiB
PHP
81 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Purchase\Resources;
|
|
|
|
use App\Domains\Purchase\Models\Purchase;
|
|
use App\Domains\Purchase\Models\PurchaseItem;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Resources\Json\JsonResource;
|
|
|
|
/**
|
|
* @mixin Purchase
|
|
*/
|
|
class PurchaseResource extends JsonResource
|
|
{
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function toArray(Request $request): array
|
|
{
|
|
$items = $this->resource->relationLoaded('items')
|
|
? $this->resource->getRelation('items')
|
|
: collect();
|
|
$ticketsCount = array_key_exists('tickets_count', $this->resource->getAttributes())
|
|
? (int) $this->resource->getAttribute('tickets_count')
|
|
: null;
|
|
|
|
$subtotal = $items->isNotEmpty()
|
|
? $items->reduce(
|
|
fn (float $carry, PurchaseItem $item): float => $carry + $this->resolveItemSubtotal($item),
|
|
0.0,
|
|
)
|
|
: (float) ($this->total ?? 0);
|
|
|
|
$total = $this->status === Purchase::STATUS_PAID && $this->total !== null
|
|
? (float) $this->total
|
|
: ($items->isNotEmpty()
|
|
? $items->reduce(
|
|
fn (float $carry, PurchaseItem $item): float => $carry + $this->resolveItemTotal($item),
|
|
0.0,
|
|
)
|
|
: (float) ($this->total ?? 0));
|
|
|
|
return [
|
|
'id' => $this->id,
|
|
'cart_id' => $this->cart_id,
|
|
'tenant_codigo' => $this->tenant_codigo,
|
|
'user_id' => $this->user_id,
|
|
'created_at' => $this->created_at,
|
|
'status' => $this->status,
|
|
'payment_method' => $this->payment_method,
|
|
'expires_at' => $this->stockReservation?->expires_at,
|
|
'dni' => $this->dni,
|
|
'transfer_payer_dni' => $this->transfer_payer_dni,
|
|
'telefono' => $this->telefono,
|
|
'nombre_apellido' => $this->nombre_apellido,
|
|
'email' => $this->email,
|
|
'items_source' => $items->isNotEmpty() ? 'purchase' : null,
|
|
'items' => PurchaseItemResource::collection($items),
|
|
'tickets_count' => $this->when($ticketsCount !== null, $ticketsCount),
|
|
'has_generated_tickets' => $this->when($ticketsCount !== null, $ticketsCount > 0),
|
|
'subtotal' => $this->formatMoney($subtotal),
|
|
'total' => $this->formatMoney($total),
|
|
];
|
|
}
|
|
|
|
protected function resolveItemSubtotal(PurchaseItem $item): float
|
|
{
|
|
return (float) $item->precio_unitario * $item->cantidad;
|
|
}
|
|
|
|
protected function resolveItemTotal(PurchaseItem $item): float
|
|
{
|
|
return (float) ($item->total ?? 0);
|
|
}
|
|
|
|
protected function formatMoney(float|int|string|null $amount): string
|
|
{
|
|
return number_format((float) ($amount ?? 0), 2, '.', '');
|
|
}
|
|
}
|