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

238 lines
5.8 KiB
C#

namespace Apollinare.Domain.Entities.Warehouse;
/// <summary>
/// Articolo del modulo magazzino con gestione completa di partite e seriali
/// </summary>
public class WarehouseArticle : BaseEntity
{
/// <summary>
/// Codice univoco articolo (SKU)
/// </summary>
public string Code { get; set; } = string.Empty;
/// <summary>
/// Descrizione articolo
/// </summary>
public string Description { get; set; } = string.Empty;
/// <summary>
/// Descrizione breve per etichette
/// </summary>
public string? ShortDescription { get; set; }
/// <summary>
/// Codice a barre principale (EAN/UPC)
/// </summary>
public string? Barcode { get; set; }
/// <summary>
/// Codice fornitore/produttore
/// </summary>
public string? ManufacturerCode { get; set; }
/// <summary>
/// Categoria articolo
/// </summary>
public int? CategoryId { get; set; }
/// <summary>
/// Unità di misura principale (es. PZ, KG, LT, MT)
/// </summary>
public string UnitOfMeasure { get; set; } = "PZ";
/// <summary>
/// Unità di misura secondaria per conversione
/// </summary>
public string? SecondaryUnitOfMeasure { get; set; }
/// <summary>
/// Fattore di conversione tra UoM primaria e secondaria
/// </summary>
public decimal? UnitConversionFactor { get; set; }
/// <summary>
/// Tipo di gestione magazzino
/// </summary>
public StockManagementType StockManagement { get; set; } = StockManagementType.Standard;
/// <summary>
/// Se true, l'articolo è gestito a partite (lotti)
/// </summary>
public bool IsBatchManaged { get; set; }
/// <summary>
/// Se true, l'articolo è gestito a seriali
/// </summary>
public bool IsSerialManaged { get; set; }
/// <summary>
/// Se true, l'articolo ha scadenza
/// </summary>
public bool HasExpiry { get; set; }
/// <summary>
/// Giorni di preavviso scadenza
/// </summary>
public int? ExpiryWarningDays { get; set; }
/// <summary>
/// Scorta minima (sotto questo livello scatta alert)
/// </summary>
public decimal? MinimumStock { get; set; }
/// <summary>
/// Scorta massima
/// </summary>
public decimal? MaximumStock { get; set; }
/// <summary>
/// Punto di riordino
/// </summary>
public decimal? ReorderPoint { get; set; }
/// <summary>
/// Quantità di riordino standard
/// </summary>
public decimal? ReorderQuantity { get; set; }
/// <summary>
/// Lead time in giorni per approvvigionamento
/// </summary>
public int? LeadTimeDays { get; set; }
/// <summary>
/// Metodo di valorizzazione per questo articolo (override del default)
/// </summary>
public ValuationMethod? ValuationMethod { get; set; }
/// <summary>
/// Costo standard (per valorizzazione a costo standard)
/// </summary>
public decimal? StandardCost { get; set; }
/// <summary>
/// Ultimo costo di acquisto
/// </summary>
public decimal? LastPurchaseCost { get; set; }
/// <summary>
/// Costo medio ponderato corrente
/// </summary>
public decimal? WeightedAverageCost { get; set; }
/// <summary>
/// Prezzo di vendita base
/// </summary>
public decimal? BaseSellingPrice { get; set; }
/// <summary>
/// Peso in Kg
/// </summary>
public decimal? Weight { get; set; }
/// <summary>
/// Volume in metri cubi
/// </summary>
public decimal? Volume { get; set; }
/// <summary>
/// Larghezza in cm
/// </summary>
public decimal? Width { get; set; }
/// <summary>
/// Altezza in cm
/// </summary>
public decimal? Height { get; set; }
/// <summary>
/// Profondità in cm
/// </summary>
public decimal? Depth { get; set; }
/// <summary>
/// Immagine principale
/// </summary>
public byte[]? Image { get; set; }
/// <summary>
/// Mime type immagine
/// </summary>
public string? ImageMimeType { get; set; }
/// <summary>
/// Se attivo, l'articolo può essere movimentato
/// </summary>
public bool IsActive { get; set; } = true;
/// <summary>
/// Note aggiuntive
/// </summary>
public string? Notes { get; set; }
// Navigation properties
public WarehouseArticleCategory? Category { get; set; }
public ICollection<StockLevel> StockLevels { get; set; } = new List<StockLevel>();
public ICollection<StockMovementLine> MovementLines { get; set; } = new List<StockMovementLine>();
public ICollection<ArticleBatch> Batches { get; set; } = new List<ArticleBatch>();
public ICollection<ArticleSerial> Serials { get; set; } = new List<ArticleSerial>();
public ICollection<ArticleBarcode> Barcodes { get; set; } = new List<ArticleBarcode>();
}
/// <summary>
/// Tipo di gestione magazzino per l'articolo
/// </summary>
public enum StockManagementType
{
/// <summary>
/// Gestione standard (quantità)
/// </summary>
Standard = 0,
/// <summary>
/// Non gestito a magazzino (servizi, ecc.)
/// </summary>
NotManaged = 1,
/// <summary>
/// Gestione a peso variabile
/// </summary>
VariableWeight = 2,
/// <summary>
/// Kit/Distinta base
/// </summary>
Kit = 3
}
/// <summary>
/// Metodo di valorizzazione magazzino
/// </summary>
public enum ValuationMethod
{
/// <summary>
/// Costo medio ponderato
/// </summary>
WeightedAverage = 0,
/// <summary>
/// First In First Out
/// </summary>
FIFO = 1,
/// <summary>
/// Last In First Out
/// </summary>
LIFO = 2,
/// <summary>
/// Costo standard
/// </summary>
StandardCost = 3,
/// <summary>
/// Costo specifico (per partita/seriale)
/// </summary>
SpecificCost = 4
}