* @version 1.0.0 */ class InventorySerial extends Model { protected $fillable = [ 'inventory_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 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): void { $this->update([ 'status' => 'vendido', 'sale_detail_id' => $saleDetailId, ]); } /** * 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, 'return_detail_id' => null, ]); } /** * Verificar si el serial está devuelto */ public function isReturned(): bool { return $this->status === 'devuelto'; } }