Files
zentral/src/Apollinare.Domain/Entities/Warehouse/StockMovement.cs
2025-11-29 14:52:39 +01:00

202 lines
4.3 KiB
C#

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