//
// 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;
}
}
}