* @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'; } }