using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; // // 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; } /// /// 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 + 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!; #if false /// /// Indica gli asset/cespiti /// public bool IsAsset { get; set; } = false; /// /// Indica che è un operatore umano /// public bool IsHuman { get; set; } = false; /// /// Costo fisso risorsa per UM tipo ammortamento /// public double UnitCostFix { get; set; } = 0; /// /// Unità di misura della risorsa tipo fisso/ammortamento /// public string UmFix { get; set; } = ""; /// /// Costo unitario risorsa per UM tipo consumabili /// public double UnitCostProp { get; set; } = 0; /// /// Unità di misura della risorsa /// public string UmProp { get; set; } = string.Empty; #endif } }