pdv.backend/app/Models/InventorySerial.php

146 lines
3.1 KiB
PHP

<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* Modelo para números de serie de inventario
*
* @author Moisés Cortés C. <moises.cortes@notsoweb.com>
* @version 1.0.0
*/
class InventorySerial extends Model
{
protected $fillable = [
'inventory_id',
'warehouse_id',
'movement_id',
'transfer_movement_id',
'exit_movement_id',
'serial_number',
'status',
'sale_detail_id',
'return_detail_id',
'notes',
];
protected $casts = [
'status' => 'string',
];
public function inventory()
{
return $this->belongsTo(Inventory::class);
}
public function warehouse()
{
return $this->belongsTo(Warehouse::class);
}
public function movement()
{
return $this->belongsTo(InventoryMovement::class);
}
public function transferMovement()
{
return $this->belongsTo(InventoryMovement::class, 'transfer_movement_id');
}
public function exitMovement()
{
return $this->belongsTo(InventoryMovement::class, 'exit_movement_id');
}
public function markAsExited(int $exitMovementId): void
{
$this->update([
'status' => 'salida',
'exit_movement_id' => $exitMovementId,
]);
}
public function restoreFromExit(): void
{
$this->update([
'status' => 'disponible',
'exit_movement_id' => null,
]);
}
public function isExited(): bool
{
return $this->status === 'salida';
}
public function saleDetail()
{
return $this->belongsTo(SaleDetail::class);
}
public function returnDetail()
{
return $this->belongsTo(ReturnDetail::class);
}
/**
* Verificar si el serial está disponible
*/
public function isAvailable(): bool
{
return $this->status === 'disponible';
}
/**
* Marcar como vendido
*/
public function markAsSold(int $saleDetailId, ?int $warehouseId = null): void {
$this->update([
'status' => 'vendido',
'sale_detail_id' => $saleDetailId,
'warehouse_id' => $warehouseId,
]);
}
/**
* Marcar como disponible (ej: cancelación de venta)
*/
public function markAsAvailable(): void
{
$this->update([
'status' => 'disponible',
'sale_detail_id' => null,
]);
}
/**
* Marcar como devuelto
*/
public function markAsReturned(int $returnDetailId): void
{
$this->update([
'status' => 'devuelto',
'return_detail_id' => $returnDetailId,
]);
}
/**
* Restaurar a disponible desde devuelto
*/
public function restoreFromReturn(): void
{
$this->update([
'status' => 'disponible',
'sale_detail_id' => null,
]);
}
/**
* Verificar si el serial está devuelto
*/
public function isReturned(): bool
{
return $this->status === 'devuelto';
}
}