feat(inventory): track administrative entry reservations

This commit is contained in:
2026-09-24 09:34:42 -03:00
parent 3671b95a83
commit 884da2c89a
8 changed files with 73 additions and 11 deletions

View File

@@ -237,7 +237,7 @@ class CatalogItem extends Model
->whereHas(
'inventory',
fn (Builder $inventoryQuery): Builder => $inventoryQuery
->whereColumn('inventories.real_stock', '>', 'inventories.reserved_stock')
->whereRaw('inventories.real_stock > inventories.reserved_stock + inventories.entry_reserved_stock')
)
)
->orWhere(function (Builder $directItemQuery): void {
@@ -249,7 +249,7 @@ class CatalogItem extends Model
->orWhereHas(
'inventory',
fn (Builder $availableInventoryQuery): Builder => $availableInventoryQuery
->whereColumn('inventories.real_stock', '>', 'inventories.reserved_stock')
->whereRaw('inventories.real_stock > inventories.reserved_stock + inventories.entry_reserved_stock')
);
});
});

View File

@@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
'sold_units',
'refunded_units',
'reserved_stock',
'entry_reserved_stock',
'real_stock',
])]
class Inventory extends Model
@@ -35,6 +36,7 @@ class Inventory extends Model
'sold_units' => 'integer',
'refunded_units' => 'integer',
'reserved_stock' => 'integer',
'entry_reserved_stock' => 'integer',
'real_stock' => 'integer',
];
}
@@ -59,7 +61,16 @@ class Inventory extends Model
public function availableStock(): int
{
return max(0, $this->real_stock - $this->reserved_stock);
return max(0, $this->real_stock - $this->reserved_stock - $this->entry_reserved_stock);
}
public function reserveEntry(int $amount, bool $tracksInventory): void
{
if ($amount < 1 || ($tracksInventory && $this->availableStock() < $amount)) {
throw new \InvalidArgumentException('No hay stock disponible para la reserva de entradas.');
}
$this->entry_reserved_stock += $amount;
$this->save();
}
public function reserve(int $amount, bool $tracksInventory): void
@@ -92,7 +103,7 @@ class Inventory extends Model
throw new \InvalidArgumentException('La cantidad reservada no alcanza para confirmar la compra.');
}
if ($tracksInventory && $this->real_stock < $amount) {
if ($tracksInventory && $this->real_stock - $this->entry_reserved_stock < $amount) {
throw new \InvalidArgumentException('No hay suficiente stock real para confirmar la compra.');
}