namespace Apollinare.Domain.Entities.Warehouse;
///
/// Testata movimento di magazzino (carico, scarico, trasferimento, rettifica)
///
public class StockMovement : BaseEntity
{
///
/// Numero documento movimento
///
public string DocumentNumber { get; set; } = string.Empty;
///
/// Data movimento
///
public DateTime MovementDate { get; set; }
///
/// Tipo movimento
///
public MovementType Type { get; set; }
///
/// Causale movimento
///
public int? ReasonId { get; set; }
///
/// Magazzino di origine (per scarichi e trasferimenti)
///
public int? SourceWarehouseId { get; set; }
///
/// Magazzino di destinazione (per carichi e trasferimenti)
///
public int? DestinationWarehouseId { get; set; }
///
/// Riferimento documento esterno (DDT, fattura, ordine)
///
public string? ExternalReference { get; set; }
///
/// Tipo documento esterno
///
public ExternalDocumentType? ExternalDocumentType { get; set; }
///
/// ID fornitore (per carichi da acquisto)
///
public int? SupplierId { get; set; }
///
/// ID cliente (per scarichi per vendita)
///
public int? CustomerId { get; set; }
///
/// Stato del movimento
///
public MovementStatus Status { get; set; } = MovementStatus.Draft;
///
/// Data conferma movimento
///
public DateTime? ConfirmedDate { get; set; }
///
/// Utente che ha confermato
///
public string? ConfirmedBy { get; set; }
///
/// Valore totale movimento
///
public decimal? TotalValue { get; set; }
///
/// Note movimento
///
public string? Notes { get; set; }
// Navigation properties
public WarehouseLocation? SourceWarehouse { get; set; }
public WarehouseLocation? DestinationWarehouse { get; set; }
public MovementReason? Reason { get; set; }
public ICollection Lines { get; set; } = new List();
}
///
/// Tipo di movimento magazzino
///
public enum MovementType
{
///
/// Carico (aumento giacenza)
///
Inbound = 0,
///
/// Scarico (diminuzione giacenza)
///
Outbound = 1,
///
/// Trasferimento tra magazzini
///
Transfer = 2,
///
/// Rettifica inventariale (positiva o negativa)
///
Adjustment = 3,
///
/// Produzione (carico da ciclo produttivo)
///
Production = 4,
///
/// Consumo (scarico per produzione)
///
Consumption = 5,
///
/// Reso a fornitore
///
SupplierReturn = 6,
///
/// Reso da cliente
///
CustomerReturn = 7
}
///
/// Stato del movimento
///
public enum MovementStatus
{
///
/// Bozza (non ancora confermato)
///
Draft = 0,
///
/// Confermato (giacenze aggiornate)
///
Confirmed = 1,
///
/// Annullato
///
Cancelled = 2
}
///
/// Tipo documento esterno collegato
///
public enum ExternalDocumentType
{
///
/// Ordine fornitore
///
PurchaseOrder = 0,
///
/// DDT entrata
///
InboundDeliveryNote = 1,
///
/// Fattura acquisto
///
PurchaseInvoice = 2,
///
/// Ordine cliente
///
SalesOrder = 3,
///
/// DDT uscita
///
OutboundDeliveryNote = 4,
///
/// Fattura vendita
///
SalesInvoice = 5,
///
/// Ordine di produzione
///
ProductionOrder = 6,
///
/// Documento inventario
///
InventoryDocument = 7
}