// // This is here so CodeMaid doesn't reorganize this document // namespace EgwCoreLib.Lux.Data.DbModel.Cost { /// /// Risorsa / Centro di Costo, con costi / Hourly /// [Table("cost_resource")] public class ResourceModel { /// /// ID del record /// [Key] public int ResourceID { get; set; } /// /// Condice Risorsa x Raggruppamento / Ordinamento /// public string CodResource { get; set; } = "000"; /// /// Nome/Descrizione /// public string Name { get; set; } = string.Empty; /// /// ID del driver di costo impiegato, tipicamente 1 = WorkHour /// public int CostDriverID { get; set; } /// /// Valore di riferimento del CostDriver per il calcolo dell'importo unitario della risorsa /// Se è basato su WorkHour diventa il budget annuale della risorsa disponibile /// Tipicamente le Ore di impiego a buget risorsa, es 220gg x 8h /// public decimal CostDriverBudget { get; set; } = 1; /// /// Costo totale (rif al CostDriverBudget) componente FIXED (macchinari) della risorsa (ove applicabile), comprendendo /// - ammortamenti /// - costi di manutenzione ordinaria /// - costi di manutenzione straordinaria (se stimabili, in periodo post ammortamento) /// public decimal FixedCost { get; set; } = 0; /// /// Costo totale (rif al CostDriverBudget) componente variabile (tipicamente Energia) /// nb: stima basata sul (costo medio energia aziendale) * consumo effettivo (se disponibile), altrimenti (stima potenza media impiegata) * (ore di impiego stimate) /// public decimal VariableCost { get; set; } = 0; /// /// Costo della componente HR sulla gestione impianto (rif al CostDriverBudget) /// public decimal LaborCost { get; set; } = 0; /// /// Costi di OverHead (rif al CostDriverBudget) da ribaltare su risorsa (tipicamente struttura) /// public decimal OverHeadCost { get; set; } = 0; /// /// Costo di overhead (come % on top del resto) /// public decimal OverHeadPerc { get; set; } = 0.15M; /// /// EBT ovvero marginalità minima garantita on top del resto dei costi e OH /// public decimal EBTPerc { get; set; } = 0.1M; /// /// Margine sul prezzo ovvero valore da potersi eventualmente scontare /// public decimal PriceMargin { get; set; } = 0.2M; /// /// Costo Netto la risorsa su base CostDriver /// [NotMapped] private decimal BaseNetCost { get => CostDriverBudget == 0 ? 0 : (FixedCost + LaborCost + VariableCost + OverHeadCost) / CostDriverBudget; } /// /// Costo RockBottom Risorsa su base CostDriver /// [NotMapped] public decimal BaseRockBottomCost { get => BaseNetCost * (1 + OverHeadPerc) * (1 + EBTPerc); } /// /// Prezzo comprensivo di margine di ricarico massimo scontabile (sul RockBottom) /// [NotMapped] public decimal BasePrice { get => BaseRockBottomCost * (1 + PriceMargin); } /// /// Navigazione Driver costo /// [ForeignKey("CostDriverID")] public virtual CostDriverModel DriverNav { get; set; } = null!; /// /// Navigazione agli step che lo impiegano /// public virtual ICollection JobStepNav { get; set; } = new List(); [NotMapped] public bool IsUsed { get => JobStepNav != null && JobStepNav.Count > 0; } } }