201 lines
5.5 KiB
C#
201 lines
5.5 KiB
C#
// <Auto-Generated>
|
|
// This is here so CodeMaid doesn't reorganize this document
|
|
// </Auto-Generated>
|
|
namespace EgwCoreLib.Lux.Data.DbModel.Sales
|
|
{
|
|
/// <summary>
|
|
/// Classe delle offerte commerciali
|
|
/// </summary>
|
|
[Table("sales_offer")]
|
|
public class OfferModel
|
|
{
|
|
/// <summary>
|
|
/// ID del record
|
|
/// </summary>
|
|
[Key]
|
|
public int OfferID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Environment della richiesta
|
|
/// </summary>
|
|
public EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS Envir { get; set; } = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
|
|
|
|
/// <summary>
|
|
/// Anno rif offerta
|
|
/// </summary>
|
|
public int RefYear { get; set; } = DateTime.Today.Year;
|
|
|
|
/// <summary>
|
|
/// Numero prog offerta nell'anno (da calcolare)
|
|
/// </summary>
|
|
public int RefNum { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Indice revisione
|
|
/// </summary>
|
|
public int RefRev { get; set; } = 1;
|
|
|
|
/// <summary>
|
|
/// Codice calcolato offerta ANNO.NUMERO.REV
|
|
/// inizia per SO = SalesOffer
|
|
/// </summary>
|
|
[NotMapped]
|
|
public string OfferCode
|
|
{
|
|
get => $"SO.{RefYear:00}.{RefNum:000000}.{RefRev:000}";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Descrizione generale
|
|
/// </summary>
|
|
public string Description { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// ID Cliente
|
|
/// </summary>
|
|
public int CustomerID { get; set; }
|
|
|
|
/// <summary>
|
|
/// ID Dealer
|
|
/// </summary>
|
|
public int DealerID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Dizionario serializzato delle preselezioni (opzionale)
|
|
/// </summary>
|
|
public string DictPresel { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Dizionario valorizzato dei parametri attivi
|
|
/// </summary>
|
|
[NotMapped]
|
|
public Dictionary<string, string> DictParameter
|
|
{
|
|
get
|
|
{
|
|
Dictionary<string, string> answ = new();
|
|
if (!string.IsNullOrEmpty(DictPresel))
|
|
{
|
|
answ = JsonConvert.DeserializeObject<Dictionary<string, string>>(DictPresel) ?? new Dictionary<string, string>();
|
|
}
|
|
return answ;
|
|
}
|
|
//set
|
|
//{
|
|
// DictPresel = JsonConvert.SerializeObject(value);
|
|
//}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Validità Offerta
|
|
/// </summary>
|
|
public DateTime ValidUntil { get; set; } = DateTime.Now.AddMonths(1);
|
|
|
|
/// <summary>
|
|
/// DataOra inserimento
|
|
/// </summary>
|
|
public DateTime Inserted { get; set; }
|
|
|
|
/// <summary>
|
|
/// DataOra ultima modifica
|
|
/// </summary>
|
|
public DateTime Modified { get; set; }
|
|
|
|
/// <summary>
|
|
/// DataOra richiesta per il completamento dell'ordine
|
|
/// </summary>
|
|
public DateTime DueDateReq { get; set; } = DateTime.Today.AddDays(30);
|
|
|
|
/// <summary>
|
|
/// DataOra promessa per il completamento dell'ordine
|
|
/// </summary>
|
|
public DateTime DueDateProm { get; set; } = DateTime.Today.AddDays(60);
|
|
|
|
/// <summary>
|
|
/// note di consegna (opzionali)
|
|
/// </summary>
|
|
public string ConsNote { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Enum stato offerta
|
|
/// </summary>
|
|
public OfferStates OffertState { get; set; } = OfferStates.Open;
|
|
|
|
/// <summary>
|
|
/// Sconto applicato (deve essere < del MAX)
|
|
/// </summary>
|
|
public double Discount { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Numero Item compresi
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double NumItems
|
|
{
|
|
get => OfferRowNav?.Sum(x => x.Qty) ?? 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Numero ProdItem compresi
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double NumProdItems
|
|
{
|
|
get => OfferRowNav?.Sum(x => x.ProdItemQtyTot) ?? 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Numero Item compresi
|
|
/// </summary>
|
|
[NotMapped]
|
|
public int NumRows
|
|
{
|
|
get => OfferRowNav?.Count ?? 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Costo totale offerta (rock bottom)
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double TotalCost
|
|
{
|
|
get => OfferRowNav?.Sum(x => x.TotalCost) ?? 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Prezzo totale offerta (compreso di amrginalità)
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double TotalPrice
|
|
{
|
|
get => OfferRowNav?.Sum(x => x.TotalPrice) ?? 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sconto massimo applicabile
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double MaxDiscount
|
|
{
|
|
get => (TotalCost > 0 && TotalPrice > TotalCost) ? (TotalPrice - TotalCost) / TotalPrice : 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigazione Customer
|
|
/// </summary>
|
|
[ForeignKey("CustomerID")]
|
|
public virtual CustomerModel CustomerNav { get; set; } = null!;
|
|
|
|
/// <summary>
|
|
/// Navigazione Dealer
|
|
/// </summary>
|
|
[ForeignKey("DealerID")]
|
|
public virtual DealerModel DealerNav { get; set; } = null!;
|
|
|
|
/// <summary>
|
|
/// Navigazione alle righe offerta
|
|
/// </summary>
|
|
public virtual ICollection<OfferRowModel> OfferRowNav { get; set; } = new List<OfferRowModel>();
|
|
}
|
|
}
|