345 lines
10 KiB
C#
345 lines
10 KiB
C#
using EgwCoreLib.Lux.Data.DbModel.Catalog;
|
|
using EgwCoreLib.Lux.Data.DbModel.Items;
|
|
using EgwCoreLib.Lux.Data.DbModel.Production;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
using static EgwCoreLib.Lux.Core.Enums;
|
|
|
|
// <Auto-Generated>
|
|
// This is here so CodeMaid doesn't reorganize this document
|
|
// </Auto-Generated>
|
|
namespace EgwCoreLib.Lux.Data.DbModel.Sales
|
|
{
|
|
[Table("sales_order_row")]
|
|
public class OrderRowModel
|
|
{
|
|
/// <summary>
|
|
/// ID del record
|
|
/// </summary>
|
|
[Key]
|
|
public int OrderRowID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Riferimento Ordine
|
|
/// </summary>
|
|
public int OrderID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Riga Ordine (per ordinamento)
|
|
/// </summary>
|
|
public int RowNum { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Environment della richiesta
|
|
/// </summary>
|
|
public EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS Envir { get; set; } = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
|
|
|
|
/// <summary>
|
|
/// Enum stato Riga Ordine x assegnazione/pianificazione
|
|
/// </summary>
|
|
public OrderStates OrderRowState { get; set; } = OrderStates.Created;
|
|
|
|
/// <summary>
|
|
/// Campo salvato dell'UID da codice DataMatrix calcolato
|
|
/// inizia per SOR = SalesOfferRow
|
|
/// </summary>
|
|
public string OrderRowUID { get; set; } = "POR.25.0123ABCD";
|
|
|
|
/// <summary>
|
|
/// Codice calcolato Ordine ANNO.NUMERO
|
|
/// inizia per PO = PurchaseOrder
|
|
/// </summary>
|
|
[NotMapped]
|
|
public string OrderRowCode
|
|
{
|
|
get => $"POR.{Inserted:yy}.{OrderRowID:X8}";
|
|
}
|
|
|
|
/// <summary>
|
|
/// ID dell'articolo di vendita Orderto
|
|
/// </summary>
|
|
public int SellingItemID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Riferimento (opzionale9 al template da cui è derivato
|
|
/// </summary>
|
|
public int? TemplateRowID { get; set; } = null;
|
|
|
|
/// <summary>
|
|
/// Quantità della risorsa
|
|
/// </summary>
|
|
public double Qty { get; set; } = 1;
|
|
|
|
/// <summary>
|
|
/// Costo dei componeti BOM (RockBottom)
|
|
/// </summary>
|
|
public double BomCost { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Prezzo dei componeti BOM (scontabile)
|
|
/// </summary>
|
|
public double BomPrice { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Costo produzione Fase/Step (RockBottom)
|
|
/// </summary>
|
|
public double StepCost { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Prezzo produzione Fase/Step (scontabile)
|
|
/// </summary>
|
|
public double StepPrice { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// LeadTime puro (tempo di lavorazione): somma dei LeadTime da ItemSteps
|
|
/// </summary>
|
|
|
|
public double StepLeadTime { get; set; } = 0;
|
|
/// <summary>
|
|
/// FlowTime totale (tempo di attraversamento): somma dei FlowTime da ItemSteps
|
|
/// </summary>
|
|
|
|
public double StepFlowTime { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Costo Totale Risorsa (BOM + Fase)
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double UnitCost
|
|
{
|
|
get => BomCost + StepCost;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Costo Totale Risorsa (BOM + Fase)
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double UnitPrice
|
|
{
|
|
get => BomPrice + StepPrice;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sconto massimo applicabile
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double MaxDiscount
|
|
{
|
|
get => (UnitCost > 0 && UnitPrice > UnitCost) ? (UnitPrice - UnitCost) / UnitPrice : 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Costo Totale risorsa
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double TotalCost
|
|
{
|
|
get => UnitCost * Qty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Costo Totale risorsa
|
|
/// </summary>
|
|
[NotMapped]
|
|
public double TotalPrice
|
|
{
|
|
get => UnitPrice * Qty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Definisce se sia calcolabile, dato il tipo SellingItem
|
|
/// </summary>
|
|
[NotMapped]
|
|
public bool CalcEnabled
|
|
{
|
|
get => ImgType == ImageType.Calculated;
|
|
#if false
|
|
{
|
|
bool answ = false;
|
|
if (SellingItemNav != null)
|
|
{
|
|
answ = SellingItemNav.SourceType == ItemSourceType.Jwd || SellingItemNav.SourceType == ItemSourceType.FileBTL;
|
|
}
|
|
return answ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tipo immagine da visualizzare
|
|
/// </summary>
|
|
public ImageType ImgType { get; set; } = ImageType.ND;
|
|
|
|
/// <summary>
|
|
/// Restituisce UID da impiegare x immagine
|
|
/// </summary>
|
|
[NotMapped]
|
|
public string ImgUID
|
|
{
|
|
get
|
|
{
|
|
string answ = "";
|
|
// se non calcolabile
|
|
if (CalcEnabled)
|
|
{
|
|
answ = string.IsNullOrEmpty(OrderRowUID) ? OrderRowCode : OrderRowUID;
|
|
}
|
|
else
|
|
{
|
|
// cerco in primis se ha template...
|
|
if (TemplateRowID != null && TemplateRowID > 0)
|
|
{
|
|
//answ= $"TR.{TemplateRowID:X16}";
|
|
answ = TemplateRowModel.ImgUrl(TemplateRowID ?? 0);
|
|
}
|
|
// altrimenti da selling item...
|
|
else if (SellingItemID > 0)
|
|
{
|
|
//answ = $"SP.{SellingItemID:X12}";
|
|
answ = SellingItemModel.ImgUrl(SellingItemID);
|
|
}
|
|
}
|
|
return answ;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Valore serializzato della composizione articolo (in formato JWD x finestra)
|
|
/// </summary>
|
|
public string SerStruct { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Nomi risorsa file associato alla riga offerta (es per BTL)
|
|
/// URI come risorsa dentro folder offerta/riga-offerta/guid
|
|
/// </summary>
|
|
public string FileResource { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Nomi file originale associato alla riga offerta (es per BTL)
|
|
/// </summary>
|
|
public string FileName { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Dimensione del file (per visualizzazione rapida)
|
|
/// </summary>
|
|
public long FileSize { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// BOM serializzata per la produzione dell'item
|
|
/// </summary>
|
|
public string ItemBOM { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Lista dei Job Cost Drivers calcolati dall'engine (necessari x calcolo Steps)
|
|
/// </summary>
|
|
public string ItemJCD { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Lista dei TAGS associati all'item (es selezione ciclo)
|
|
/// </summary>
|
|
public string ItemTags { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Quantità degli item da produrre (es parti del serramento, singole parti BTL...)
|
|
/// </summary>
|
|
public int ProdItemQty { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Tempo complessivo stimato (secondo Status come stima, balance, ...)
|
|
/// </summary>
|
|
public decimal ProdEstimTime { get; set; } = 0;
|
|
|
|
/// <summary>
|
|
/// Quantità degli item da produrre per PEZZO (es parti del serramento, singole parti BTL...)
|
|
/// </summary>
|
|
public double ProdItemQtyTot
|
|
{
|
|
get => Qty * ProdItemQty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Riferimento JobID Ciclo corrente (tra quelli ammissibili dato ItemJCD)
|
|
/// </summary>
|
|
public int JobID { get; set; }
|
|
|
|
/// <summary>
|
|
/// Elenco StepDTO (Fasi Costificate, sommabili) per la stima tempi / costi
|
|
/// </summary>
|
|
public string ItemSteps { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Oggetto serializzato contentente lista degli Estimate su tutte le macchine utilizzabili, serve a
|
|
/// - carico macchine
|
|
/// - pianificazione
|
|
/// </summary>
|
|
public string ProdEstimate { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// Validazione dati BOM (Inteso come gruppi tutti trovati/esistenti)
|
|
/// </summary>
|
|
public bool BomOk { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Validazione livello item per Costo e range dimensione
|
|
/// </summary>
|
|
public bool ItemOk { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Note libere
|
|
/// </summary>
|
|
public string Note { get; set; } = "";
|
|
|
|
#if false
|
|
/// <summary>
|
|
/// Stack degli ultimi item serializzati per Uno/Redo actions
|
|
/// </summary>
|
|
[NotMapped]
|
|
public List<string> UndoRedoSerStruct { get; set; } = new List<string>();
|
|
#endif
|
|
|
|
|
|
/// <summary>
|
|
/// DataOra inserimento
|
|
/// </summary>
|
|
public DateTime Inserted { get; set; } = DateTime.Now;
|
|
|
|
/// <summary>
|
|
/// DataOra ultima modifica
|
|
/// </summary>
|
|
public DateTime Modified { get; set; } = DateTime.Now;
|
|
|
|
/// <summary>
|
|
/// Indica che è in attesa aggiornamento BOM
|
|
/// </summary>
|
|
public bool AwaitBom { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Indica che è in attesa aggiornamento Price
|
|
/// </summary>
|
|
public bool AwaitPrice { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Navigazione Order
|
|
/// </summary>
|
|
[ForeignKey("OrderID")]
|
|
public virtual OrderModel OrderNav { get; set; } = null!;
|
|
|
|
/// <summary>
|
|
/// Navigazione Item
|
|
/// </summary>
|
|
[ForeignKey("SellingItemID")]
|
|
public virtual SellingItemModel? SellingItemNav { get; set; }
|
|
|
|
/// <summary>
|
|
/// Navigazione TemplateRow
|
|
/// </summary>
|
|
[ForeignKey("TemplateRowID")]
|
|
public virtual TemplateRowModel? TemplateRowNav { get; set; }
|
|
|
|
/// <summary>
|
|
/// Navigazione alle righe ProdItem
|
|
/// </summary>
|
|
public virtual ICollection<ProductionItemModel> ProdItemNav { get; set; } = new List<ProductionItemModel>();
|
|
}
|
|
}
|