feat: implement Stockable interface and methods for Bundle and ProductVariant models

This commit is contained in:
ncoronel 2026-07-14 16:11:25 -03:00
parent 1d56d27350
commit ceb1e2b04a
3 changed files with 52 additions and 2 deletions

View File

@ -10,13 +10,15 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Casts\Attribute;
use App\Domains\Shared\Contracts\Stockable;
#[Fillable([
'tenant_codigo',
'nombre',
'descripcion',
'precio',
])]
class Bundle extends Model
class Bundle extends Model implements Stockable
{
use HasFactory;
@ -47,6 +49,28 @@ class Bundle extends Model
return $this->hasMany(BundleItem::class, 'bundle_id');
}
public function incrementRealStock(int $amount): void
{
if ($amount < 0) {
throw new \InvalidArgumentException('El monto a incrementar debe ser positivo.');
}
foreach ($this->items as $item) {
$item->variant->incrementRealStock($amount * $item->cantidad);
}
}
public function decrementRealStock(int $amount): void
{
if ($amount < 0) {
throw new \InvalidArgumentException('El monto a decrementar debe ser positivo.');
}
foreach ($this->items as $item) {
$item->variant->decrementRealStock($amount * $item->cantidad);
}
}
public function incrementReservedStock(int $amount): void
{
if ($amount < 0) {
@ -80,6 +104,13 @@ class Bundle extends Model
}
}
public function validateStock(): void
{
if ($this->stock_tecnico <= 0) {
throw new \InvalidArgumentException('El bundle no tiene stock técnico disponible.');
}
}
protected function stockTecnico(): Attribute
{
return Attribute::get(function () {

View File

@ -12,6 +12,10 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Casts\Attribute;
use App\Domains\Shared\Contracts\Stockable;
#[Fillable([
'producto_id',
'inventory_policy',
@ -23,7 +27,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
'minimum_use_date',
'maximum_use_date',
])]
class ProductVariant extends Model
class ProductVariant extends Model implements Stockable
{
use HasFactory;

View File

@ -0,0 +1,15 @@
<?php
namespace App\Domains\Shared\Contracts;
interface Stockable
{
public function incrementRealStock(int $amount): void;
public function decrementRealStock(int $amount): void;
public function incrementReservedStock(int $amount): void;
public function decrementReservedStock(int $amount): void;
public function confirmReservedStock(int $amount): void;
public function validateStock(): void;
}