feat: implement Stockable interface and methods for Bundle and ProductVariant models
This commit is contained in:
parent
1d56d27350
commit
ceb1e2b04a
|
|
@ -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 () {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue