using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Consoles; using Sarand.BusinessMgr.Net.Standard.Base.Core; using Sarand.BusinessMgr.Net.Standard.Base.Mgr; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Bus { //======================================================================= public abstract class SbmCommodity : SbmHierarchyItem { //------------------------------------------------------------------- // Columns. public enum Column { Hidden, Pos, Id, // Commodity. Type, Type_Code, Type_Desc, Code, DescBrief, DescOrder, DescDetail, DrawingNo, DrawingIssue, ImagePath, Image, Category1Code, Category1_Desc, Category2Code, Category2_Desc, Category3Code, Category3_Desc, Location, Department, CatalogRef, // Specification. Weight, Weight_UomId, Weight_Unit, Weight_ValueUnits, Length, Length_UomId, Length_Unit, Length_ValueUnits, Volume, Volume_UomId, Volume_Unit, Volume_ValueUnits, Density, Density_UomId, Density_Unit, Density_ValueUnits, BoxQuantity, BoxQuantity_UomId, BoxQuantity_Unit, BoxQuantity_ValueUnits, Dimensions, SpecSummary, ICNTariffCode, Barcode, // Codings with its Desc. RangeCode, RangeDesc, ColourCode, ColourDesc, SourceCode, SourceDesc, SupplyMethodCode, SupplyMethodDesc, HandlingCode, HandlingDesc, DeliveryCode, DeliveryDesc, MaterialCode, MaterialDesc, FinishCode, FinishDesc, PromotionCode, PromotionDesc, NominalCode, NominalCodePurchase, // Purchasing. AssociationIdSupplier, Supplier_Name, Supplier_Ref, CostPrice, CostPrice_Fmt, PlaceOfOrigin, // Material currency amount. MaterialCost, MaterialCost_Fmt, MaterialCurrencyId, MaterialCurrency_Code, MaterialCurrency_Symbol, // ExWorks currency amount. ExWorksCost, ExWorksCost_Fmt, ExWorksCurrencyId, ExWorksCurrency_Code, ExWorksCurrency_Symbol, ReorderLevel, ReorderQty, QtyOnOrder, // Sales. AssociationIdCustomer, Customer_Name, SalesPrice, SalesPrice_Fmt, RetailPrice, RetailPrice_Fmt, RetailPricePlanned, RetailPricePlanned_Fmt, UomIdSale, GrossPrice, GrossPrice_Fmt, UnitOfSale, CarriageCostIndicative, CarriageCostIndicative_Fmt, MinOrderQty, PackQty, PackQtySale, TaxCodeId, TaxCode, TaxRate, LastOrderDate, LastOrderQty, // Customer definition. Cust_ProductCode, Cust_AmountRetail, Cust_AmountRetail_Fmt, Cust_CurrencyIdRetail, Cust_CurrencyIdRetail_Code, Cust_CurrencyIdRetail_Symbol, Cust_PromotionCode, Cust_PromotionDesc, // Stock. QtyInStock, QtyAllocated, FreeStock, // Stock take - held against commodity, eg. imported from Sage. StockTakeDate, StockTakeQty, StockTake_Date, // Sales budget. OrderQtyDecimals, CommodityIdSalesProj, SalesProj_Annual, SalesProjMonthlyProp, SalesProjMonth01, SalesProjMonth02, SalesProjMonth03, SalesProjMonth04, SalesProjMonth05, SalesProjMonth06, SalesProjMonth07, SalesProjMonth08, SalesProjMonth09, SalesProjMonth10, SalesProjMonth11, SalesProjMonth12, SalesProj_Jan, SalesProj_Feb, SalesProj_Mar, SalesProj_Apr, SalesProj_May, SalesProj_Jun, SalesProj_Jul, SalesProj_Aug, SalesProj_Sep, SalesProj_Oct, SalesProj_Nov, SalesProj_Dec, SalesProj_Period, // Derived from monthly figures - projected stock during specified period. SalesYtdFinancial, // Current year. SalesYtdCalendar, SalesPyFinancial, // Prior year. SalesPyCalendar, SalesMonthCurrent, SalesMonthPast01, SalesMonthPast02, SalesMonthPast03, SalesMonthPast04, SalesMonthPast05, SalesMonthPast06, SalesMonthPast07, SalesMonthPast08, SalesMonthPast09, SalesMonthPast10, SalesMonthPast11, SalesMonthPast12, // Quantity of stock sold. /// Completed orders during period defined by parameter dates. StockSold_Period, // Stock Levels: // Quantity current level at selected or defined location filter. Stock_CurrentLevel, Stock_CurrentLevel_Sales, Stock_CurrentLevel_Calc, Stock_CurrentLevel_All, Stock_ImminentLevel, //Quantity allocated at selected or defined location filter. Stock_Allocated, Stock_Allocated_Sales, Stock_Allocated_Calc, Stock_Allocated_All, Stock_Available, Stock_Available_MinZero, Stock_Available_Sales, Stock_Available_Sales_MinZero, Stock_ImminentAvailable, Stock_CurrentVsReorder, Stock_ImminentVsReorder, Stock_AvailVsReorder, Stock_ImminentAvailVsReorder, // Stock bays. Stock_Bays, Stock_Bay1, Stock_Bay2, Stock_Bay3, // Stock date due/ Stock_NextDue_Date, Stock_NextDue_Quantity, Stock_NextDue_Commodity_Date, Stock_NextDue_Commodity_Quantity, Stock_NextDue_Container_Date, Stock_NextDue_Container_Quantity, Stock_Due_Imminently, // Stock due in weeks for commodity & container Stock_DueIn_Week1, Stock_DueIn_Week2, Stock_DueIn_Week3, Stock_DueIn_Week4, Stock_DueIn_Week5, Stock_DueIn_Week6, Stock_DueIn_Week7, Stock_DueIn_Week8, Stock_DueIn_Week9, Stock_DueIn_Week10, Stock_DueIn_Week11, Stock_DueIn_Week12, //Stock due range of weeks Stock_DueIn_Week1To2, Stock_DueIn_Week3To4, Stock_DueIn_Week5To6, Stock_DueIn_Week7To8, Stock_DueIn_Week9To10, Stock_DueIn_Week11To12, // Stock due week onwards Stock_DueIn_Week7On, Stock_DueIn_Week13On, // Stock due in by calendar month. Stock_DueIn_MonthCurrent, Stock_DueIn_Month01, Stock_DueIn_Month02, Stock_DueIn_Month03, Stock_DueIn_Month04, Stock_DueIn_Month05, Stock_DueIn_Month06, Stock_DueIn_Month07, Stock_DueIn_Month08, Stock_DueIn_Month09, Stock_DueIn_Month10, Stock_DueIn_Month11, Stock_DueIn_Month12, // Stock due up to 3+ months Stock_DueIn_MonthTo03, Stock_DueIn_MonthTo06, Stock_DueIn_MonthTo09, Stock_DueIn_MonthTo12, // Stock due range of months Stock_DueIn_Month04To06, Stock_DueIn_Month07To09, Stock_DueIn_Month10To12, Stock_DueIn_Month07To12, // Stock due month onwards Stock_DueIn_Month04On, Stock_DueIn_Month05On, Stock_DueIn_Month06On, Stock_DueIn_Month07On, Stock_DueIn_Month13On, // Stock Provisional due in (via containers). Stock_DueIn_Provisional, // Stock allocations. // Stock allocated by future weeks Stock_Allocated_Week1, Stock_Allocated_Week2, Stock_Allocated_Week3To4, Stock_Allocated_Week5To6, Stock_Allocated_Week7To8, Stock_Allocated_Week9To10, Stock_Allocated_Week11To12, Stock_Allocated_Week13On, // Stock allocated in current month with tis future months. Stock_Allocated_MonthCurrent, Stock_Allocated_Month01, Stock_Allocated_Month02, Stock_Allocated_Month03, Stock_Allocated_Month04, Stock_Allocated_Month05, Stock_Allocated_Month06, Stock_Allocated_Month07, Stock_Allocated_Month08, Stock_Allocated_Month09, Stock_Allocated_Month10, Stock_Allocated_Month11, Stock_Allocated_Month12, // End of month stock level in future (derived): Stock_EndOfMonth_Current, // Stock level at end of current month [derived] with its future months. Stock_EndOfMonth_01, Stock_EndOfMonth_02, Stock_EndOfMonth_03, Stock_EndOfMonth_04, Stock_EndOfMonth_05, Stock_EndOfMonth_06, Stock_EndOfMonth_07, Stock_EndOfMonth_08, Stock_EndOfMonth_09, Stock_EndOfMonth_10, Stock_EndOfMonth_11, Stock_EndOfMonth_12, // Requirements. /// Earliest item price irrespective of status, by commodity Id (specific to issue). Reqnt_AmountUnit_Earliest_ById, /// Earliest item price irrespective of status, by commodity code (ie. any issue). Reqnt_AmountUnit_Earliest_ByCode, // Associated data. CommodityCustomer_Count, CommoditySupplier_Count, Process_Count, PortfolioItem_Count, // Barcode images. BarcodeImagePath, BarcodeImage, // Common properties. Notes, Flag, Status, Status_Desc, Status_Ind, Status_Current_Y, Status_Current_X, Status_Current_Tick, CreateOn_Date, UpdateOn_Date, } //------------------------------------------------------------------- /// Properties other than common. public class DataProperties { // Commodity. public SysId AffiliateIdOwner { get; set; } = new SysId(); public Sbm.CommodityType CommodityType { get; set; } = Sbm.CommodityType.Unknown; public String Code { get; set; } = ""; public String DescBrief { get; set; } = ""; public String DescOrder { get; set; } = ""; public String DescDetail { get; set; } = ""; public String DrawingNumber { get; set; } = ""; public String DrawingIssue { get; set; } = ""; public String IncrementDrawingIssue { get; set; } = ""; public SysId AssetCatId { get; set; } = new SysId(); public String ImagePath { get; set; } = ""; public String Category1 { get; set; } = ""; public String Category2 { get; set; } = ""; public String Category3 { get; set; } = ""; public String Location { get; set; } = ""; public String Department { get; set; } = ""; public String CatalogRef { get; set; } = ""; // Specification. public decimal Weight { get; set; } = 0.0m; public SysId UomIdWeight { get; set; } = new SysId(); public decimal Length { get; set; } = 0.0m; public SysId UomIdLength { get; set; } = new SysId(); public decimal Volume { get; set; } = 0.0m; public SysId UomIdVolume { get; set; } = new SysId(); public decimal Density { get; set; } = 0.0m; public SysId UomIdDensity { get; set; } = new SysId(); public decimal BoxQuantity { get; set; } = 0.0m; public SysId UomIdBox { get; set; } = new SysId(); public String Dimensions { get; set; } = ""; public String SpecSummary { get; set; } = ""; // Codings. public String RangeCode { get; set; } = ""; public String ColourCode { get; set; } = ""; public String SourceCode { get; set; } = ""; public String SupplyMethodCode { get; set; } = ""; public String HandlingCode { get; set; } = ""; public String DeliveryCode { get; set; } = ""; public String MaterialCode { get; set; } = ""; public String FinishCode { get; set; } = ""; public String PromotionCode { get; set; } = ""; public String NominalCode { get; set; } = ""; public String NominalCodePurchase { get; set; } = ""; public String ICNTariffCode { get; set; } = ""; // Production time. public decimal TimeProd { get; set; } = 0.0m; public SysId UomIdTimeProd { get; set; } = new SysId(); // Purchasing. public SysId AssociationIdSupplier { get; set; } = new SysId(); public String SupplierRef { get; set; } = ""; public decimal CostPrice { get; set; } = 0.0m; public String PlaceOfOrigin { get; set; } = ""; public decimal MaterialCost { get; set; } = 0.0m; public SysId CurrencyIdMaterial { get; set; } = new SysId(); public decimal ExWorksCost { get; set; } = 0.0m; public SysId CurrencyIdExWorks { get; set; } = new SysId(); public decimal ReorderLevel { get; set; } = 0.0m; public decimal ReorderQty { get; set; } = 0.0m; public decimal QtyOnOrder { get; set; } = 0.0m; // Sales. public SysId AssociationIdCustomer { get; set; } = new SysId(); public decimal SalesPrice { get; set; } = 0.0m; public decimal RetailPrice { get; set; } = 0.0m; public decimal RetailPricePlanned { get; set; } = 0.0m; public SysId UomIdSale { get; set; } = new SysId(); public decimal CarriageCostIndicative { get; set; } = 0.0m; public decimal MinOrderQty { get; set; } = 0.0m; public decimal PackQtySale { get; set; } = 0.0m; public SysId TaxCodeId { get; set; } = new SysId(); public DateTime LastOrderDate { get; set; } = DateTime.MinValue; public decimal LastOrderQty { get; set; } = 0.0m; // Stock. public decimal QtyInStock { get; set; } = 0.0m; public decimal QtyAllocated { get; set; } = 0.0m; public decimal FreeStock { get; set; } = 0.0m; public DateTime StockTakeDate { get; set; } = DateTime.MinValue; public decimal StockTakeQty { get; set; } = 0.0m; // Projecetd sales. public SysId CommodityIdSalesProj { get; set; } = new SysId(); public decimal SalesProjAnnual { get; set; } = 0.0m; public decimal SalesProjMonth01 { get; set; } = 0.0m; public decimal SalesProjMonth02 { get; set; } = 0.0m; public decimal SalesProjMonth03 { get; set; } = 0.0m; public decimal SalesProjMonth04 { get; set; } = 0.0m; public decimal SalesProjMonth05 { get; set; } = 0.0m; public decimal SalesProjMonth06 { get; set; } = 0.0m; public decimal SalesProjMonth07 { get; set; } = 0.0m; public decimal SalesProjMonth08 { get; set; } = 0.0m; public decimal SalesProjMonth09 { get; set; } = 0.0m; public decimal SalesProjMonth10 { get; set; } = 0.0m; public decimal SalesProjMonth11 { get; set; } = 0.0m; public decimal SalesProjMonth12 { get; set; } = 0.0m; // Proposed sales - budget. public decimal SalesPropAnnual { get; set; } = 0.0m; public decimal SalesPropMonth01 { get; set; } = 0.0m; public decimal SalesPropMonth02 { get; set; } = 0.0m; public decimal SalesPropMonth03 { get; set; } = 0.0m; public decimal SalesPropMonth04 { get; set; } = 0.0m; public decimal SalesPropMonth05 { get; set; } = 0.0m; public decimal SalesPropMonth06 { get; set; } = 0.0m; public decimal SalesPropMonth07 { get; set; } = 0.0m; public decimal SalesPropMonth08 { get; set; } = 0.0m; public decimal SalesPropMonth09 { get; set; } = 0.0m; public decimal SalesPropMonth10 { get; set; } = 0.0m; public decimal SalesPropMonth11 { get; set; } = 0.0m; public decimal SalesPropMonth12 { get; set; } = 0.0m; } // Data. public new class Data : SacsHierarchyItem.Data { // Data members. private readonly DataProperties data = new DataProperties(); // Construction. public Data() { Status = DefaultStatus; } // Commodity. public SysId AffiliateIdOwner { get { return data.AffiliateIdOwner; } set { CheckChanged(data.AffiliateIdOwner, value); data.AffiliateIdOwner = value; } } public Sbm.CommodityType CommodityType { get { return data.CommodityType; } set { CheckChanged((int)data.CommodityType, (int)value); data.CommodityType = value; } } public String Code { get { return data.Code; } set { CheckChanged(data.Code, value); data.Code = value; } } public String DescBrief { get { return data.DescBrief; } set { CheckChanged(data.DescBrief, value); data.DescBrief = value; } } public String DescOrder { get { return data.DescOrder; } set { CheckChanged(data.DescOrder, value); data.DescOrder = value; } } public String DescDetail { get { return data.DescDetail; } set { CheckChanged(data.DescDetail, value); data.DescDetail = value; } } public String DrawingNumber { get { return data.DrawingNumber; } set { CheckChanged(data.DrawingNumber, value); data.DrawingNumber = value; } } public String DrawingIssue { get { return data.DrawingIssue; } set { CheckChanged(data.DrawingIssue, value); data.DrawingIssue = value; } } public static String IncrementDrawingIssue(String issueOld) { String sIssue = issueOld; if (!sIssue.IsEmpty()) { bool bCarryOver = true; bool bLastPosNumeric = true; // Work from right to left: for (int i = sIssue.Length - 1; bCarryOver && i >= 0; i--) { char c = sIssue[i]; if (c >= '0' && c <= '8') { // Numbers '0' through '8' are incremented with no carry: c = c++; bLastPosNumeric = true; bCarryOver = false; } else if (c == '9') { // Number '9' becomes '0' with carry: c = '0'; bLastPosNumeric = true; bCarryOver = true; } else if ((c >= 'A' && c <= 'Y') || (c >= 'a' && c <= 'y')) { // Letters 'A' through 'Y' are incremented with no carry: c = c++; bLastPosNumeric = false; bCarryOver = false; } else if (c == 'Z' || c == 'z') { // Number 'Z' becomes 'A' with carry: c = c == 'Z' ? 'A' : 'a'; bLastPosNumeric = false; bCarryOver = true; } if (bCarryOver) sIssue = (bLastPosNumeric ? "1" : "A") + sIssue; } } return sIssue; } public SysId AssetCatId { get { return data.AssetCatId; } set { CheckChanged(data.AssetCatId, value); data.AssetCatId = value; } } public String ImagePath { get { return data.ImagePath; } set { CheckChanged(data.ImagePath, value); data.ImagePath = value; } } public String Category1 { get { return data.Category1; } set { CheckChanged(data.Category1, value); data.Category1 = value; } } public String Category2 { get { return data.Category2; } set { CheckChanged(data.Category2, value); data.Category2 = value; } } public String Category3 { get { return data.Category3; } set { CheckChanged(data.Category3, value); data.Category3 = value; } } public String Location { get { return data.Location; } set { CheckChanged(data.Location, value); data.Location = value; } } public String Department { get { return data.Department; } set { CheckChanged(data.Department, value); data.Department = value; } } public String CatalogRef { get { return data.CatalogRef; } set { CheckChanged(data.CatalogRef, value); data.CatalogRef = value; } } // Specification. public decimal Weight { get { return data.Weight; } set { CheckChanged(data.Weight, value); data.Weight = value; } } public SysId UomIdWeight { get { return data.UomIdWeight; } set { CheckChanged(data.UomIdWeight, value); data.UomIdWeight = value; } } public decimal Length { get { return data.Length; } set { CheckChanged(data.Length, value); data.Length = value; } } public SysId UomIdLength { get { return data.UomIdLength; } set { CheckChanged(data.UomIdLength, value); data.UomIdLength = value; } } public decimal Volume { get { return data.Volume; } set { CheckChanged(data.Volume, value); data.Volume = value; } } public SysId UomIdVolume { get { return data.UomIdVolume; } set { CheckChanged(data.UomIdVolume, value); data.UomIdVolume = value; } } public decimal Density { get { return data.Density; } set { CheckChanged(data.Density, value); data.Density = value; } } public SysId UomIdDensity { get { return data.UomIdDensity; } set { CheckChanged(data.UomIdDensity, value); data.UomIdDensity = value; } } public decimal BoxQuantity { get { return data.BoxQuantity; } set { CheckChanged(data.BoxQuantity, value); data.BoxQuantity = value; } } public SysId UomIdBox { get { return data.UomIdBox; } set { CheckChanged(data.UomIdBox, value); data.UomIdBox = value; } } public String Dimensions { get { return data.Dimensions; } set { CheckChanged(data.Dimensions, value); data.Dimensions = value; } } public String SpecSummary { get { return data.SpecSummary; } set { CheckChanged(data.SpecSummary, value); data.SpecSummary = value; } } // Codings. public String RangeCode { get { return data.RangeCode; } set { CheckChanged(data.RangeCode, value); data.RangeCode = value; } } public String ColourCode { get { return data.ColourCode; } set { CheckChanged(data.ColourCode, value); data.ColourCode = value; } } public String SourceCode { get { return data.SourceCode; } set { CheckChanged(data.SourceCode, value); data.SourceCode = value; } } public String SupplyMethodCode { get { return data.SupplyMethodCode; } set { CheckChanged(data.SupplyMethodCode, value); data.SupplyMethodCode = value; } } public String HandlingCode { get { return data.HandlingCode; } set { CheckChanged(data.HandlingCode, value); data.HandlingCode = value; } } public String DeliveryCode { get { return data.DeliveryCode; } set { CheckChanged(data.DeliveryCode, value); data.DeliveryCode = value; } } public String MaterialCode { get { return data.MaterialCode; } set { CheckChanged(data.MaterialCode, value); data.MaterialCode = value; } } public String FinishCode { get { return data.FinishCode; } set { CheckChanged(data.FinishCode, value); data.FinishCode = value; } } public String PromotionCode { get { return data.PromotionCode; } set { CheckChanged(data.PromotionCode, value); data.PromotionCode = value; } } public String NominalCode { get { return data.NominalCode; } set { CheckChanged(data.NominalCode, value); data.NominalCode = value; } } public String NominalCodePurchase { get { return data.NominalCodePurchase; } set { CheckChanged(data.NominalCodePurchase, value); data.NominalCodePurchase = value; } } public String ICNTariffCode { get { return data.ICNTariffCode; } set { CheckChanged(data.ICNTariffCode, value); data.ICNTariffCode = value; } } // Production time. public decimal TimeProd { get { return data.TimeProd; } set { CheckChanged(data.TimeProd, value); data.TimeProd = value; } } public SysId UomIdTimeProd { get { return data.UomIdTimeProd; } set { CheckChanged(data.UomIdTimeProd, value); data.UomIdTimeProd = value; } } // Purchasing. public SysId AssociationIdSupplier { get { return data.AssociationIdSupplier; } set { CheckChanged(data.AssociationIdSupplier, value); data.AssociationIdSupplier = value; } } public String SupplierRef { get { return data.SupplierRef; } set { CheckChanged(data.SupplierRef, value); data.SupplierRef = value; } } public decimal CostPrice { get { return data.CostPrice; } set { CheckChanged(data.CostPrice, value); data.CostPrice = value; } } public String PlaceOfOrigin { get { return data.PlaceOfOrigin; } set { CheckChanged(data.PlaceOfOrigin, value); data.PlaceOfOrigin = value; } } public decimal MaterialCost { get { return data.MaterialCost; } set { CheckChanged(data.MaterialCost, value); data.MaterialCost = value; } } public SysId CurrencyIdMaterial { get { return data.CurrencyIdMaterial; } set { CheckChanged(data.CurrencyIdMaterial, value); data.CurrencyIdMaterial = value; } } public decimal ExWorksCost { get { return data.ExWorksCost; } set { CheckChanged(data.ExWorksCost, value); data.ExWorksCost = value; } } public SysId CurrencyIdExWorks { get { return data.CurrencyIdExWorks; } set { CheckChanged(data.CurrencyIdExWorks, value); data.CurrencyIdExWorks = value; } } public decimal ReorderLevel { get { return data.ReorderLevel; } set { CheckChanged(data.ReorderLevel, value); data.ReorderLevel = value; } } public decimal ReorderQty { get { return data.ReorderQty; } set { CheckChanged(data.ReorderQty, value); data.ReorderQty = value; } } public decimal QtyOnOrder { get { return data.QtyOnOrder; } set { CheckChanged(data.QtyOnOrder, value); data.QtyOnOrder = value; } } // Sales. public SysId AssociationIdCustomer { get { return data.AssociationIdCustomer; } set { CheckChanged(data.AssociationIdCustomer, value); data.AssociationIdCustomer = value; } } public decimal SalesPrice { get { return data.SalesPrice; } set { CheckChanged(data.SalesPrice, value); data.SalesPrice = value; } } public decimal RetailPrice { get { return data.RetailPrice; } set { CheckChanged(data.RetailPrice, value); data.RetailPrice = value; } } public decimal RetailPricePlanned { get { return data.RetailPricePlanned; } set { CheckChanged(data.RetailPricePlanned, value); data.RetailPricePlanned = value; } } public SysId UomIdSale { get { return data.UomIdSale; } set { CheckChanged(data.UomIdSale, value); data.UomIdSale = value; } } public decimal CarriageCostIndicative { get { return data.CarriageCostIndicative; } set { CheckChanged(data.CarriageCostIndicative, value); data.CarriageCostIndicative = value; } } public decimal MinOrderQty { get { return data.MinOrderQty; } set { CheckChanged(data.MinOrderQty, value); data.MinOrderQty = value; } } public decimal PackQtySale { get { return data.PackQtySale; } set { CheckChanged(data.PackQtySale, value); data.PackQtySale = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { CheckChanged(data.TaxCodeId, value); data.TaxCodeId = value; } } public DateTime LastOrderDate { get { return data.LastOrderDate; } set { CheckChanged(data.LastOrderDate, value); data.LastOrderDate = value; } } public decimal LastOrderQty { get { return data.LastOrderQty; } set { CheckChanged(data.LastOrderQty, value); data.LastOrderQty = value; } } // Stock. public decimal QtyInStock { get { return data.QtyInStock; } set { CheckChanged(data.QtyInStock, value); data.QtyInStock = value; } } public decimal QtyAllocated { get { return data.QtyAllocated; } set { CheckChanged(data.QtyAllocated, value); data.QtyAllocated = value; } } public decimal FreeStock { get { return data.FreeStock; } set { CheckChanged(data.FreeStock, value); data.FreeStock = value; } } public DateTime StockTakeDate { get { return data.StockTakeDate; } set { CheckChanged(data.StockTakeDate, value); data.StockTakeDate = value; } } public decimal StockTakeQty { get { return data.StockTakeQty; } set { CheckChanged(data.StockTakeQty, value); data.StockTakeQty = value; } } // Projected sales. public SysId CommodityIdSalesProj { get { return data.CommodityIdSalesProj; } set { CheckChanged(data.CommodityIdSalesProj, value); data.CommodityIdSalesProj = value; } } public decimal SalesProjAnnual { get { return data.SalesProjAnnual; } set { CheckChanged(data.SalesProjAnnual, value); data.SalesProjAnnual = value; } } public decimal SalesProjMonth01 { get { return data.SalesProjMonth01; } set { CheckChanged(data.SalesProjMonth01, value); data.SalesProjMonth01 = value; } } public decimal SalesProjMonth02 { get { return data.SalesProjMonth02; } set { CheckChanged(data.SalesProjMonth02, value); data.SalesProjMonth02 = value; } } public decimal SalesProjMonth03 { get { return data.SalesProjMonth03; } set { CheckChanged(data.SalesProjMonth03, value); data.SalesProjMonth03 = value; } } public decimal SalesProjMonth04 { get { return data.SalesProjMonth04; } set { CheckChanged(data.SalesProjMonth04, value); data.SalesProjMonth04 = value; } } public decimal SalesProjMonth05 { get { return data.SalesProjMonth05; } set { CheckChanged(data.SalesProjMonth05, value); data.SalesProjMonth05 = value; } } public decimal SalesProjMonth06 { get { return data.SalesProjMonth06; } set { CheckChanged(data.SalesProjMonth06, value); data.SalesProjMonth06 = value; } } public decimal SalesProjMonth07 { get { return data.PackQtySale; } set { CheckChanged(data.SalesProjMonth07, value); data.SalesProjMonth07 = value; } } public decimal SalesProjMonth08 { get { return data.SalesProjMonth08; } set { CheckChanged(data.SalesProjMonth08, value); data.SalesProjMonth08 = value; } } public decimal SalesProjMonth09 { get { return data.SalesProjMonth09; } set { CheckChanged(data.SalesProjMonth09, value); data.SalesProjMonth09 = value; } } public decimal SalesProjMonth10 { get { return data.SalesProjMonth10; } set { CheckChanged(data.SalesProjMonth10, value); data.SalesProjMonth10 = value; } } public decimal SalesProjMonth11 { get { return data.SalesProjMonth11; } set { CheckChanged(data.SalesProjMonth11, value); data.SalesProjMonth11 = value; } } public decimal SalesProjMonth12 { get { return data.SalesProjMonth12; } set { CheckChanged(data.SalesProjMonth12, value); data.SalesProjMonth12 = value; } } // Proposed sales - budget. public decimal SalesPropAnnual { get { return data.SalesPropAnnual; } set { CheckChanged(data.SalesPropAnnual, value); data.SalesPropAnnual = value; } } public decimal SalesPropMonth01 { get { return data.SalesPropMonth01; } set { CheckChanged(data.SalesPropMonth01, value); data.SalesPropMonth01 = value; } } public decimal SalesPropMonth02 { get { return data.SalesPropMonth02; } set { CheckChanged(data.SalesPropMonth02, value); data.SalesPropMonth02 = value; } } public decimal SalesPropMonth03 { get { return data.SalesPropMonth03; } set { CheckChanged(data.SalesPropMonth03, value); data.SalesPropMonth03 = value; } } public decimal SalesPropMonth04 { get { return data.SalesPropMonth04; } set { CheckChanged(data.SalesPropMonth04, value); data.SalesPropMonth04 = value; } } public decimal SalesPropMonth05 { get { return data.SalesPropMonth05; } set { CheckChanged(data.SalesPropMonth05, value); data.SalesPropMonth05 = value; } } public decimal SalesPropMonth06 { get { return data.SalesPropMonth06; } set { CheckChanged(data.SalesPropMonth06, value); data.SalesPropMonth06 = value; } } public decimal SalesPropMonth07 { get { return data.PackQtySale; } set { CheckChanged(data.SalesPropMonth07, value); data.SalesPropMonth07 = value; } } public decimal SalesPropMonth08 { get { return data.SalesPropMonth08; } set { CheckChanged(data.SalesPropMonth08, value); data.SalesPropMonth08 = value; } } public decimal SalesPropMonth09 { get { return data.SalesPropMonth09; } set { CheckChanged(data.SalesPropMonth09, value); data.SalesPropMonth09 = value; } } public decimal SalesPropMonth10 { get { return data.SalesPropMonth10; } set { CheckChanged(data.SalesPropMonth10, value); data.SalesPropMonth10 = value; } } public decimal SalesPropMonth11 { get { return data.SalesPropMonth11; } set { CheckChanged(data.SalesPropMonth11, value); data.SalesPropMonth11 = value; } } public decimal SalesPropMonth12 { get { return data.SalesPropMonth12; } set { CheckChanged(data.SalesPropMonth12, value); data.SalesPropMonth12 = value; } } internal void PopulateFrom(Data data) { // Commodity. AffiliateIdOwner = data.AffiliateIdOwner; CommodityType = data.CommodityType; Code = data.Code; DescBrief = data.DescBrief; DescOrder = data.DescOrder; DescDetail = data.DescDetail; DrawingNumber = data.DrawingNumber; DrawingIssue = data.DrawingIssue; AssetCatId = data.AssetCatId; ImagePath = data.ImagePath; Category1 = data.Category1; Category2 = data.Category2; Category3 = data.Category3; Location = data.Location; Department = data.Department; CatalogRef = data.CatalogRef; // Specification. Weight = data.Weight; UomIdWeight = data.UomIdWeight; Length = data.Length; UomIdLength = data.UomIdLength; Volume = data.Volume; UomIdVolume = data.UomIdVolume; Density = data.Density; UomIdDensity = data.UomIdDensity; BoxQuantity = data.BoxQuantity; UomIdBox = data.UomIdBox; Dimensions = data.Dimensions; SpecSummary = data.SpecSummary; // Codings. RangeCode = data.RangeCode; ColourCode = data.ColourCode; SourceCode = data.SourceCode; SupplyMethodCode = data.SupplyMethodCode; HandlingCode = data.HandlingCode; DeliveryCode = data.DeliveryCode; MaterialCode = data.MaterialCode; FinishCode = data.FinishCode; PromotionCode = data.PromotionCode; NominalCode = data.NominalCode; NominalCodePurchase = data.NominalCodePurchase; ICNTariffCode = data.ICNTariffCode; // Production time. TimeProd = data.TimeProd; UomIdTimeProd = data.UomIdTimeProd; // Purchasing. AssociationIdSupplier = data.AssociationIdSupplier; SupplierRef = data.SupplierRef; CostPrice = data.CostPrice; PlaceOfOrigin = data.PlaceOfOrigin; MaterialCost = data.MaterialCost; CurrencyIdMaterial = data.CurrencyIdMaterial; ExWorksCost = data.ExWorksCost; CurrencyIdExWorks = data.CurrencyIdExWorks; ReorderLevel = data.ReorderLevel; ReorderQty = data.ReorderQty; QtyOnOrder = data.QtyOnOrder; // Sales. AssociationIdCustomer = data.AssociationIdCustomer; SalesPrice = data.SalesPrice; RetailPrice = data.RetailPrice; RetailPricePlanned = data.RetailPricePlanned; UomIdSale = data.UomIdSale; CarriageCostIndicative = data.CarriageCostIndicative; MinOrderQty = data.MinOrderQty; PackQtySale = data.PackQtySale; TaxCodeId = data.TaxCodeId; LastOrderDate = data.LastOrderDate; LastOrderQty = data.LastOrderQty; // Stock. QtyInStock = data.QtyInStock; QtyAllocated = data.QtyAllocated; FreeStock = data.FreeStock; StockTakeDate = data.StockTakeDate; StockTakeQty = data.StockTakeQty; // Projecetd sales. CommodityIdSalesProj = data.CommodityIdSalesProj; SalesProjAnnual = data.SalesProjAnnual; SalesProjMonth01 = data.SalesProjMonth01; SalesProjMonth02 = data.SalesProjMonth02; SalesProjMonth03 = data.SalesProjMonth03; SalesProjMonth04 = data.SalesProjMonth04; SalesProjMonth05 = data.SalesProjMonth05; SalesProjMonth06 = data.SalesProjMonth06; SalesProjMonth07 = data.SalesProjMonth07; SalesProjMonth08 = data.SalesProjMonth08; SalesProjMonth09 = data.SalesProjMonth09; SalesProjMonth10 = data.SalesProjMonth10; SalesProjMonth11 = data.SalesProjMonth11; SalesProjMonth12 = data.SalesProjMonth12; // Proposed sales - budget. SalesPropAnnual = data.SalesPropAnnual; SalesPropMonth01 = data.SalesPropMonth01; SalesPropMonth02 = data.SalesPropMonth02; SalesPropMonth03 = data.SalesPropMonth03; SalesPropMonth04 = data.SalesPropMonth04; SalesPropMonth05 = data.SalesPropMonth05; SalesPropMonth06 = data.SalesPropMonth06; SalesPropMonth07 = data.SalesPropMonth07; SalesPropMonth08 = data.SalesPropMonth08; SalesPropMonth09 = data.SalesPropMonth09; SalesPropMonth10 = data.SalesPropMonth10; SalesPropMonth11 = data.SalesPropMonth11; SalesPropMonth12 = data.SalesPropMonth12; base.PopulateFrom(data); } public Data Clone() { Data data = new Data(); data.PopulateFrom(this); return data; } } public new class ErrField : SacsHierarchyItem.ErrField { // Identifies the field that has invalid data. // Commodity. public ValidValue AffiliateIdOwner { get; set; } = ValidValue.Valid; public ValidValue CommodityType { get; set; } = ValidValue.Valid; public ValidValue Code { get; set; } = ValidValue.Valid; public ValidValue DescBrief { get; set; } = ValidValue.Valid; public ValidValue DescOrder { get; set; } = ValidValue.Valid; public ValidValue DescDetail { get; set; } = ValidValue.Valid; public ValidValue DrawingNumber { get; set; } = ValidValue.Valid; public ValidValue DrawingIssue { get; set; } = ValidValue.Valid; public ValidValue AssetCatId { get; set; } = ValidValue.Valid; public ValidValue ImagePath { get; set; } = ValidValue.Valid; public ValidValue Category1 { get; set; } = ValidValue.Valid; public ValidValue Category2 { get; set; } = ValidValue.Valid; public ValidValue Category3 { get; set; } = ValidValue.Valid; public ValidValue Location { get; set; } = ValidValue.Valid; public ValidValue Department { get; set; } = ValidValue.Valid; public ValidValue CatalogRef { get; set; } = ValidValue.Valid; // Specification. public ValidValue Weight { get; set; } = ValidValue.Valid; public ValidValue UomIdWeight { get; set; } = ValidValue.Valid; public ValidValue Length { get; set; } = ValidValue.Valid; public ValidValue UomIdLength { get; set; } = ValidValue.Valid; public ValidValue Volume { get; set; } = ValidValue.Valid; public ValidValue UomIdVolume { get; set; } = ValidValue.Valid; public ValidValue Density { get; set; } = ValidValue.Valid; public ValidValue UomIdDensity { get; set; } = ValidValue.Valid; public ValidValue BoxQuantity { get; set; } = ValidValue.Valid; public ValidValue UomIdBox { get; set; } = ValidValue.Valid; public ValidValue Dimensions { get; set; } = ValidValue.Valid; public ValidValue SpecSummary { get; set; } = ValidValue.Valid; // Codings. public ValidValue RangeCode { get; set; } = ValidValue.Valid; public ValidValue ColourCode { get; set; } = ValidValue.Valid; public ValidValue SourceCode { get; set; } = ValidValue.Valid; public ValidValue SupplyMethodCode { get; set; } = ValidValue.Valid; public ValidValue HandlingCode { get; set; } = ValidValue.Valid; public ValidValue DeliveryCode { get; set; } = ValidValue.Valid; public ValidValue MaterialCode { get; set; } = ValidValue.Valid; public ValidValue FinishCode { get; set; } = ValidValue.Valid; public ValidValue PromotionCode { get; set; } = ValidValue.Valid; public ValidValue NominalCode { get; set; } = ValidValue.Valid; public ValidValue NominalCodePurchase { get; set; } = ValidValue.Valid; public ValidValue ICNTariffCode { get; set; } = ValidValue.Valid; // Production time. public ValidValue TimeProd { get; set; } = ValidValue.Valid; public ValidValue UomIdTimeProd { get; set; } = ValidValue.Valid; // Purchasing. public ValidValue AssociationIdSupplier { get; set; } = ValidValue.Valid; public ValidValue SupplierRef { get; set; } = ValidValue.Valid; public ValidValue CostPrice { get; set; } = ValidValue.Valid; public ValidValue PlaceOfOrigin { get; set; } = ValidValue.Valid; public ValidValue MaterialCost { get; set; } = ValidValue.Valid; public ValidValue CurrencyIdMaterial { get; set; } = ValidValue.Valid; public ValidValue ExWorksCost { get; set; } = ValidValue.Valid; public ValidValue CurrencyIdExWorks { get; set; } = ValidValue.Valid; public ValidValue ReorderLevel { get; set; } = ValidValue.Valid; public ValidValue ReorderQty { get; set; } = ValidValue.Valid; public ValidValue QtyOnOrder { get; set; } = ValidValue.Valid; // Sales. public ValidValue AssociationIdCustomer { get; set; } = ValidValue.Valid; public ValidValue SalesPrice { get; set; } = ValidValue.Valid; public ValidValue RetailPrice { get; set; } = ValidValue.Valid; public ValidValue RetailPricePlanned { get; set; } = ValidValue.Valid; public ValidValue UomIdSale { get; set; } = ValidValue.Valid; public ValidValue CarriageCostIndicative { get; set; } = ValidValue.Valid; public ValidValue MinOrderQty { get; set; } = ValidValue.Valid; public ValidValue PackQtySale { get; set; } = ValidValue.Valid; public ValidValue TaxCodeId { get; set; } = ValidValue.Valid; public ValidValue LastOrderDate { get; set; } = ValidValue.Valid; public ValidValue LastOrderQty { get; set; } = ValidValue.Valid; // Stock. public ValidValue QtyInStock { get; set; } = ValidValue.Valid; public ValidValue QtyAllocated { get; set; } = ValidValue.Valid; public ValidValue FreeStock { get; set; } = ValidValue.Valid; public ValidValue StockTakeDate { get; set; } = ValidValue.Valid; public ValidValue StockTakeQty { get; set; } = ValidValue.Valid; // Projecetd sales. public ValidValue CommodityIdSalesProj { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonthlyProp { get; set; } = ValidValue.Valid; public ValidValue SalesProjAnnual { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth01 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth02 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth03 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth04 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth05 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth06 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth07 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth08 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth09 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth10 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth11 { get; set; } = ValidValue.Valid; public ValidValue SalesProjMonth12 { get; set; } = ValidValue.Valid; // Proposed sales - budget. public ValidValue SalesPropAnnual { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth01 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth02 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth03 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth04 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth05 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth06 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth07 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth08 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth09 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth10 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth11 { get; set; } = ValidValue.Valid; public ValidValue SalesPropMonth12 { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- // Data members. private readonly Data data = new Data(); public static readonly Byte Flag_SellingProhibited = 0x01; //------------------------------------------------------------------- // Construction. protected SbmCommodity(ISbmUserContext_Core userContext, SysId id, SysId affiliateIdOwner, Sbm.CommodityType commodityType, String code) : base(userContext, id) { base.SetData(data); AffiliateIdOwner = affiliateIdOwner; CommodityType = commodityType; Code = code; Status = DefaultStatus; } //------------------------------------------------------------------- // Commodity status. private static readonly List commodityStatuses = new List() { SaStatus.Current, SaStatus.Superseded, SaStatus.Discontinued, }; public static SaStatus DefaultStatus { get { return SaStatus.Current; } } public static List ValidStatuses { get { return new List(commodityStatuses); } } public static DataValue.TriStateType GetStatusTriState(SaStatus status) { switch (status) { case SaStatus.Active: case SaStatus.Current: return DataValue.TriStateType.Green; case SaStatus.OnHold: return DataValue.TriStateType.Amber; case SaStatus.Inactive: case SaStatus.Cancelled: case SaStatus.Disabled: return DataValue.TriStateType.Red; case SaStatus.Deleted: return DataValue.TriStateType.Purple; } return DataValue.TriStateType.Unknown; } //------------------------------------------------------------------- // Utilities. public ItemId GetItemId() { return new ItemId((short)Sbm.ItemType.Commodity, Id); } //------------------------------------------------------------------- // Properties. public Data GetData() { return data.Clone(); } public void SetData(Data data) { // Properties that cannot be changed if previously specified. if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id)) throw new NotSupportedException($"{SysUtil.Fn} Id cannot be changed"); // Populate individual properties to ensure that 'Changed' indicator is kept up to date. this.data.PopulateFrom(data); } //------------------------------------------------------------------- // Attributes. public SysId AffiliateIdOwner { get { return data.AffiliateIdOwner; } set { data.AffiliateIdOwner = value; } } public Sbm.CommodityType CommodityType { get { return data.CommodityType; } set { data.CommodityType = value; } } public String Code { get { return data.Code; } set { data.Code = value; } } public String GetCodeIssue(String delim = "/") { String CodeIssue = Code; if (!DrawingIssue.IsEmpty()) CodeIssue += delim + DrawingIssue; return CodeIssue; } public String DescBrief { get { return data.DescBrief; } set { data.DescBrief = value; } } public String DescOrder { get { return data.DescOrder; } set { data.DescOrder = value; } } public String DescDetail { get { return data.DescDetail; } set { data.DescDetail = value; } } public String DrawingNumber { get { return data.DrawingNumber; } set { data.DrawingNumber = value; } } public String DrawingIssue { get { return data.DrawingIssue; } set { data.DrawingIssue = value; } } public static String IncrementDrawingIssue(String issueOld) { String sIssue = issueOld; if (!sIssue.IsEmpty()) { bool bCarryOver = true; bool bLastPosNumeric = true; // Work from right to left: for (int i = sIssue.Length - 1; bCarryOver && i >= 0; i--) { char c = sIssue[i]; if (c >= '0' && c <= '8') { // Numbers '0' through '8' are incremented with no carry: c = c++; bLastPosNumeric = true; bCarryOver = false; } else if (c == '9') { // Number '9' becomes '0' with carry: c = '0'; bLastPosNumeric = true; bCarryOver = true; } else if ((c >= 'A' && c <= 'Y') || (c >= 'a' && c <= 'y')) { // Letters 'A' through 'Y' are incremented with no carry: c = c++; bLastPosNumeric = false; bCarryOver = false; } else if (c == 'Z' || c == 'z') { // Number 'Z' becomes 'A' with carry: c = c == 'Z' ? 'A' : 'a'; bLastPosNumeric = false; bCarryOver = true; } if (bCarryOver) sIssue = (bLastPosNumeric ? "1" : "A") + sIssue; } } return sIssue; } public SysId AssetCatId { get { return data.AssetCatId; } set { data.AssetCatId = value; } } public String ImagePath { get { return data.ImagePath; } set { data.ImagePath = value; } } public String Category1 { get { return data.Category1; } set { data.Category1 = value; } } public String Category2 { get { return data.Category2; } set { data.Category2 = value; } } public String Category3 { get { return data.Category3; } set { data.Category3 = value; } } public String Location { get { return data.Location; } set { data.Location = value; } } public String Department { get { return data.Department; } set { data.Department = value; } } public String CatalogRef { get { return data.CatalogRef; } set { data.CatalogRef = value; } } //------------------------------------------------------------------- public decimal Weight { get { return data.Weight; } set { data.Weight = value; } } public SysId UomIdWeight { get { return data.UomIdWeight; } set { data.UomIdWeight = value; } } public decimal Length { get { return data.Length; } set { data.Length = value; } } public SysId UomIdLength { get { return data.UomIdLength; } set { data.UomIdLength = value; } } public decimal Volume { get { return data.Volume; } set { data.Volume = value; } } public SysId UomIdVolume { get { return data.UomIdVolume; } set { data.UomIdVolume = value; } } public decimal Density { get { return data.Density; } set { data.Density = value; } } public SysId UomIdDensity { get { return data.UomIdDensity; } set { data.UomIdDensity = value; } } public decimal BoxQuantity { get { return data.BoxQuantity; } set { data.BoxQuantity = value; } } public SysId UomIdBox { get { return data.UomIdBox; } set { data.UomIdBox = value; } } //------------------------------------------------------------------- public String Dimensions { get { return data.Dimensions; } set { data.Dimensions = value; } } public String SpecSummary { get { return data.SpecSummary; } set { data.SpecSummary = value; } } public String RangeCode { get { return data.RangeCode; } set { data.RangeCode = value; } } public String ColourCode { get { return data.ColourCode; } set { data.ColourCode = value; } } public String SourceCode { get { return data.SourceCode; } set { data.SourceCode = value; } } public String SupplyMethodCode { get { return data.SupplyMethodCode; } set { data.SupplyMethodCode = value; } } public String HandlingCode { get { return data.HandlingCode; } set { data.HandlingCode = value; } } public String DeliveryCode { get { return data.DeliveryCode; } set { data.DeliveryCode = value; } } public String MaterialCode { get { return data.MaterialCode; } set { data.MaterialCode = value; } } public String FinishCode { get { return data.FinishCode; } set { data.FinishCode = value; } } public String PromotionCode { get { return data.PromotionCode; } set { data.PromotionCode = value; } } public String NominalCode { get { return data.NominalCode; } set { data.NominalCode = value; } } public String NominalCodePurchase { get { return data.NominalCodePurchase; } set { data.NominalCodePurchase = value; } } public String ICNTariffCode { get { return data.ICNTariffCode; } set { data.ICNTariffCode = value; } } //------------------------------------------------------------------- public decimal TimeProd { get { return data.TimeProd; } set { data.TimeProd = value; } } public SysId UomIdTimeProd { get { return data.UomIdTimeProd; } set { data.UomIdTimeProd = value; } } //------------------------------------------------------------------- public SysId AssociationIdSupplier { get { return data.AssociationIdSupplier; } set { data.AssociationIdSupplier = value; } } public String SupplierRef { get { return data.SupplierRef; } set { data.SupplierRef = value; } } public decimal CostPrice { get { return data.CostPrice; } set { data.CostPrice = value; } } public String PlaceOfOrigin { get { return data.PlaceOfOrigin; } set { data.PlaceOfOrigin = value; } } public decimal MaterialCost { get { return data.MaterialCost; } set { data.MaterialCost = value; } } public SysId CurrencyIdMaterial { get { return data.CurrencyIdMaterial; } set { data.CurrencyIdMaterial = value; } } public decimal ExWorksCost { get { return data.ExWorksCost; } set { data.ExWorksCost = value; } } public SysId CurrencyIdExWorks { get { return data.CurrencyIdExWorks; } set { data.CurrencyIdExWorks = value; } } public decimal ReorderLevel { get { return data.ReorderLevel; } set { data.ReorderLevel = value; } } public decimal ReorderQty { get { return data.ReorderQty; } set { data.ReorderQty = value; } } public decimal QtyOnOrder { get { return data.QtyOnOrder; } set { data.QtyOnOrder = value; } } //------------------------------------------------------------------- public SysId AssociationIdCustomer { get { return data.AssociationIdCustomer; } set { data.AssociationIdCustomer = value; } } public decimal SalesPrice { get { return data.SalesPrice; } set { data.SalesPrice = value; } } public decimal RetailPrice { get { return data.RetailPrice; } set { data.RetailPrice = value; } } public decimal RetailPricePlanned { get { return data.RetailPricePlanned; } set { data.RetailPricePlanned = value; } } public SysId UomIdSale { get { return data.UomIdSale; } set { data.UomIdSale = value; } } public decimal CarriageCostIndicative { get { return data.CarriageCostIndicative; } set { data.CarriageCostIndicative = value; } } public decimal MinOrderQty { get { return data.MinOrderQty; } set { data.MinOrderQty = value; } } public decimal PackQtySale { get { return data.PackQtySale; } set { data.PackQtySale = value; } } public SysId TaxCodeId { get { return data.TaxCodeId; } set { data.TaxCodeId = value; } } public DateTime LastOrderDate { get { return data.LastOrderDate; } set { data.LastOrderDate = value; } } public decimal LastOrderQty { get { return data.LastOrderQty; } set { data.LastOrderQty = value; } } //------------------------------------------------------------------- public decimal QtyInStock { get { return data.QtyInStock; } set { data.QtyInStock = value; } } public decimal QtyAllocated { get { return data.QtyAllocated; } set { data.QtyAllocated = value; } } public decimal FreeStock { get { return data.FreeStock; } set { data.FreeStock = value; } } public DateTime StockTakeDate { get { return data.StockTakeDate; } set { data.StockTakeDate = value; } } public decimal StockTakeQty { get { return data.StockTakeQty; } set { data.StockTakeQty = value; } } //------------------------------------------------------------------- public SysId CommodityIdSalesProj { get { return data.CommodityIdSalesProj; } set { data.CommodityIdSalesProj = value; } } public decimal SalesProjAnnual { get { return data.SalesProjAnnual; } set { data.SalesProjAnnual = value; } } public decimal SalesProjMonth01 { get { return data.SalesProjMonth01; } set { data.SalesProjMonth01 = value; } } public decimal SalesProjMonth02 { get { return data.SalesProjMonth02; } set { data.SalesProjMonth02 = value; } } public decimal SalesProjMonth03 { get { return data.SalesProjMonth03; } set { data.SalesProjMonth03 = value; } } public decimal SalesProjMonth04 { get { return data.SalesProjMonth04; } set { data.SalesProjMonth04 = value; } } public decimal SalesProjMonth05 { get { return data.SalesProjMonth05; } set { data.SalesProjMonth05 = value; } } public decimal SalesProjMonth06 { get { return data.SalesProjMonth06; } set { data.SalesProjMonth06 = value; } } public decimal SalesProjMonth07 { get { return data.PackQtySale; } set { data.SalesProjMonth07 = value; } } public decimal SalesProjMonth08 { get { return data.SalesProjMonth08; } set { data.SalesProjMonth08 = value; } } public decimal SalesProjMonth09 { get { return data.SalesProjMonth09; } set { data.SalesProjMonth09 = value; } } public decimal SalesProjMonth10 { get { return data.SalesProjMonth10; } set { data.SalesProjMonth10 = value; } } public decimal SalesProjMonth11 { get { return data.SalesProjMonth11; } set { data.SalesProjMonth11 = value; } } public decimal SalesProjMonth12 { get { return data.SalesProjMonth12; } set { data.SalesProjMonth12 = value; } } //------------------------------------------------------------------- // Projected sales. /// Get projected sale by month (1-12) public decimal GetSalesProj(int month) { if (month == 1) return SalesProjMonth01; else if (month == 2) return SalesProjMonth02; else if (month == 3) return SalesProjMonth03; else if (month == 4) return SalesProjMonth04; else if (month == 5) return SalesProjMonth05; else if (month == 6) return SalesProjMonth06; else if (month == 7) return SalesProjMonth07; else if (month == 8) return SalesProjMonth08; else if (month == 9) return SalesProjMonth09; else if (month == 10) return SalesProjMonth10; else if (month == 11) return SalesProjMonth11; else if (month == 12) return SalesProjMonth12; // etc return 0; } /// Set projected sale by month (1-12) public void SetSalesProj(int month, decimal value) { if (month == 1) SalesProjMonth01 = value; else if (month == 2) SalesProjMonth02 = value; else if (month == 4) SalesProjMonth04 = value; else if (month == 5) SalesProjMonth05 = value; else if (month == 6) SalesProjMonth06 = value; else if (month == 7) SalesProjMonth07 = value; else if (month == 8) SalesProjMonth08 = value; else if (month == 9) SalesProjMonth09 = value; else if (month == 10) SalesProjMonth10 = value; else if (month == 11) SalesProjMonth11 = value; else if (month == 12) SalesProjMonth12 = value; // etc } //------------------------------------------------------------------- public decimal SalesPropAnnual { get { return data.SalesPropAnnual; } set { data.SalesPropAnnual = value; } } public decimal SalesPropMonth01 { get { return data.SalesPropMonth01; } set { data.SalesPropMonth01 = value; } } public decimal SalesPropMonth02 { get { return data.SalesPropMonth02; } set { data.SalesPropMonth02 = value; } } public decimal SalesPropMonth03 { get { return data.SalesPropMonth03; } set { data.SalesPropMonth03 = value; } } public decimal SalesPropMonth04 { get { return data.SalesPropMonth04; } set { data.SalesPropMonth04 = value; } } public decimal SalesPropMonth05 { get { return data.SalesPropMonth05; } set { data.SalesPropMonth05 = value; } } public decimal SalesPropMonth06 { get { return data.SalesPropMonth06; } set { data.SalesPropMonth06 = value; } } public decimal SalesPropMonth07 { get { return data.PackQtySale; } set { data.SalesPropMonth07 = value; } } public decimal SalesPropMonth08 { get { return data.SalesPropMonth08; } set { data.SalesPropMonth08 = value; } } public decimal SalesPropMonth09 { get { return data.SalesPropMonth09; } set { data.SalesPropMonth09 = value; } } public decimal SalesPropMonth10 { get { return data.SalesPropMonth10; } set { data.SalesPropMonth10 = value; } } public decimal SalesPropMonth11 { get { return data.SalesPropMonth11; } set { data.SalesPropMonth11 = value; } } public decimal SalesPropMonth12 { get { return data.SalesPropMonth12; } set { data.SalesPropMonth12 = value; } } //------------------------------------------------------------------- // Proported sales. /// Get proported sale by month (1-12) public decimal GetSalesProp(int month) { if (month == 1) return SalesPropMonth01; else if (month == 2) return SalesPropMonth02; else if (month == 3) return SalesPropMonth03; else if (month == 4) return SalesPropMonth04; else if (month == 5) return SalesPropMonth05; else if (month == 6) return SalesPropMonth06; else if (month == 7) return SalesPropMonth07; else if (month == 8) return SalesPropMonth08; else if (month == 9) return SalesPropMonth09; else if (month == 10) return SalesPropMonth10; else if (month == 11) return SalesPropMonth11; else if (month == 12) return SalesPropMonth12; // etc return 0; } /// Set proported sale by month (1-12) public void SetSalesProp(int month, decimal value) { if (month == 1) SalesPropMonth01 = value; else if (month == 2) SalesPropMonth02 = value; else if (month == 4) SalesPropMonth04 = value; else if (month == 5) SalesPropMonth05 = value; else if (month == 6) SalesPropMonth06 = value; else if (month == 7) SalesPropMonth07 = value; else if (month == 8) SalesPropMonth08 = value; else if (month == 9) SalesPropMonth09 = value; else if (month == 10) SalesPropMonth10 = value; else if (month == 11) SalesPropMonth11 = value; else if (month == 12) SalesPropMonth12 = value; // etc } //------------------------------------------------------------------- // Flags. public bool SellingProhibited { get { return GetFlag(Flag_SellingProhibited); } set { SetFlag(Flag_SellingProhibited, value); } } //------------------------------------------------------------------- // Associated data. public List CostEstimates { get; set; } public List ItemProcesses { get; set; } //------------------------------------------------------------------- // P a r a m s //------------------------------------------------------------------- /// Commodity status categories. public enum StatusCat { Any = 0, NotDeleted, Current, } /// Parameters - filters for a List of Commodities public new class Params : SacsHierarchyItem.Params { // Commodity Ids. public List IdsIncluded { get; } = new List(); public List IdsExcluded { get; } = new List(); // Commodity. public Sbm.CommodityType CommodityType { get; set; } public bool StockItemsOnly { get; set; } = false; public String CodeFull { get; set; } public String CodePartial { get; set; } public String DescBriefFull { get; set; } public String DescBriefPartial { get; set; } public String DrawingNoFull { get; set; } public String DrawingNoPartial { get; set; } public String DrawingIssueFull { get; set; } public String DrawingIssuePartial { get; set; } /// Generic search value - code, descriptions, drawing no etc. public String Search { get; set; } // Category. public String CatalogRefPartial { get; set; } public List Categories { get; } = new List(); // Customer. public SysId AssociationIdCustomer { get; set; } public String CustomerName { get; set; } public SysId AssociationIdCommodityCustomer { get; set; } public String AccountCodeCommodityCustomer { get; set; } // Supplier. public SysId AssociationIdSupplier { get; set; } public String SupplierName { get; set; } // Order references. public String OrderRef { get; set; } public String SalesOrderRef { get; set; } public String PurchaseOrderRef { get; set; } // Codes. public String RangeCode { get; set; } public String ColourCode { get; set; } public String SourceCode { get; set; } public String SupplyMethodCode { get; set; } public String HandlingCode { get; set; } public String DeliveryCode { get; set; } public String MaterialCode { get; set; } public String FinishCode { get; set; } public String PromotionCode { get; set; } // Price Set. public List PriceSetIdsIncluded { get; } = new List(); public List PriceSetIdsExcluded { get; } = new List(); // Stock Control. public Sbm.LocationFilter StockLocationFilter { get; set; } public SysId LocationIdStock { get; set; } public DateTime StockSoldFrom { get; set; } public DateTime StockSoldTo { get; set; } public DateTime ProjectedSalesFrom { get; set; } public DateTime ProjectedSalesTo { get; set; } // Stock level. public decimal StockLevelMin { get; set; } = decimal.MinValue; public decimal StockLevelMax { get; set; } = decimal.MinValue; // Portfolio. public SysId PortfolioIdInclude { get; set; } public SysId PortfolioIdExclude { get; set; } public SysId PortfolioForItemCountId { get; set; } // Currency. public SysId CurrencyIdMaterial { get; set; } public SysId CurrencyIdExWorks { get; set; } // Price. public decimal SalesPrice { get; set; } public decimal RetailPrice { get; set; } public SysId UomIdSale { get; set; } public SysId TaxCodeId { get; set; } public DateTime StockTakeDate { get; set; } public SysId CommodityIdSalesProj { get; set; } public decimal SalesProjAnnual { get; set; } /// Commodity status. public StatusCat StatusCat { get; set; } = StatusCat.NotDeleted; // Utilities. public List GetDisplayValues(ISbmUserContext_Core userContext) { SbmAccountMgr accountMgr = null; List lValue = new List(); using (SbmSessionConsole sessionConsole = SbmGlobals.Application.CreateSessionConsole(userContext)) { // Commodities to exclude. if (IdsIncluded.Count > 0) lValue.Add("Included commodities", IdsIncluded.Count.ToString()); if (IdsExcluded.Count > 0) lValue.Add("Excluded commodities", IdsExcluded.Count.ToString()); // Commodity type. if (CommodityType > 0) lValue.Add("Type", SbmSystem.GetCodesOfType(userContext, Sbm.SystemCode.CommodityType).GetDescForType(CommodityType, CommodityType.ToString())); else if (CommodityType == Sbm.CommodityType.AnyProduct) lValue.Add("Type", "Any product"); if (StockItemsOnly) lValue.Add("Stock items only", "True"); // Commodity code. if (!StringUtil.IsEmpty(CodeFull)) lValue.Add("Code", CodeFull); else if (!StringUtil.IsEmpty(CodePartial)) lValue.Add("Code contains", CodePartial); // Drawing number. if (!StringUtil.IsEmpty(DrawingNoFull)) lValue.Add("Drawing no", DrawingNoFull); else if (!StringUtil.IsEmpty(DrawingNoPartial)) lValue.Add("Drawing no starts", DrawingNoPartial); if (!StringUtil.IsEmpty(DrawingIssueFull)) lValue.Add("Drawing issue", DrawingIssueFull); else if (!StringUtil.IsEmpty(DrawingIssuePartial)) lValue.Add("Drawing issue starts", DrawingIssuePartial); // Commodity description. if (!StringUtil.IsEmpty(DescBriefFull)) lValue.Add("Description", DescBriefFull); if (!StringUtil.IsEmpty(DescBriefPartial)) lValue.Add("Description starts", DescBriefPartial); // Category. if (Categories.Count > 0) lValue.Add("Categories", Categories.Concat(",")); // Catalog reference. if (!StringUtil.IsEmpty(CatalogRefPartial)) lValue.Add("Catalog ref start", CatalogRefPartial); // Codings. if (!StringUtil.IsEmpty(RangeCode)) lValue.Add("Range code", RangeCode); if (!StringUtil.IsEmpty(ColourCode)) lValue.Add("Colour code", ColourCode); if (!StringUtil.IsEmpty(SourceCode)) lValue.Add("Source code", SourceCode); if (!StringUtil.IsEmpty(SupplyMethodCode)) lValue.Add("SupplyMethod code", SupplyMethodCode); if (!StringUtil.IsEmpty(HandlingCode)) lValue.Add("Handling code", HandlingCode); if (!StringUtil.IsEmpty(DeliveryCode)) lValue.Add("Delivery code", DeliveryCode); if (!StringUtil.IsEmpty(MaterialCode)) lValue.Add(sessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, "Material") + " code", MaterialCode); if (!StringUtil.IsEmpty(FinishCode)) lValue.Add(sessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_FinishCode, "Finish") + " code", FinishCode); if (!StringUtil.IsEmpty(PromotionCode)) lValue.Add(sessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, "Promotion") + " code", PromotionCode); // Price sets. if (PriceSetIdsIncluded.Count > 0) lValue.Add("Included in price sets", PriceSetIdsIncluded.Count.ToString()); if (PriceSetIdsExcluded.Count > 0) lValue.Add("Excluded from price sets", PriceSetIdsExcluded.Count.ToString()); // Customer. if (SysId.IsValid(AssociationIdCustomer)) { if (accountMgr == null) accountMgr = SbmGlobals.System.CreateAccountMgr(userContext); lValue.Add("Customer", accountMgr.GetAssociationTargetName(AssociationIdCustomer)); } if (!StringUtil.IsEmpty(CustomerName)) lValue.Add("Customer name starts", CustomerName); if (!StringUtil.IsEmpty(SupplierName)) lValue.Add("Supplier name starts", SupplierName); if (!StringUtil.IsEmpty(SalesOrderRef)) lValue.Add("SO reference starts", SalesOrderRef); if (!StringUtil.IsEmpty(PurchaseOrderRef)) lValue.Add("PO reference starts", PurchaseOrderRef); // Transaction. if (!StringUtil.IsEmpty(OrderRef)) lValue.Add("Transaction reference", OrderRef); // Stock: if (StockLocationFilter == Sbm.LocationFilter.Sales) lValue.Add("Stock location", "Sales locations only"); else if (StockLocationFilter == Sbm.LocationFilter.Calc) lValue.Add("Stock location", "Calculated locations only"); else if (StockLocationFilter == Sbm.LocationFilter.All) lValue.Add("Stock location", "All locations"); if (SysId.IsValid(LocationIdStock)) lValue.Add("Stock location", SysId.ToString(LocationIdStock)); if (DateUtil.IsValid(StockSoldFrom)) lValue.Add("Stock sold from", DateUtil.Format(StockSoldFrom, "d-MMM-yyyy")); if (DateUtil.IsValid(StockSoldTo)) lValue.Add("Stock sold to", DateUtil.Format(StockSoldTo, "d-MMM-yyyy")); if (DateUtil.IsValid(ProjectedSalesFrom)) lValue.Add("Proj sales from", DateUtil.Format(ProjectedSalesFrom, "d-MMM-yyyy")); if (DateUtil.IsValid(ProjectedSalesTo)) lValue.Add("Proj sales to", DateUtil.Format(ProjectedSalesTo, "d-MMM-yyyy")); if (StockLevelMin > decimal.MinValue) lValue.Add("Stock level >= ", StockLevelMin.ToString("N2")); if (StockLevelMax > decimal.MinValue) lValue.Add("Stock level <= ", StockLevelMax.ToString("N2")); // Commodities with definitions for Customer. if (SysId.IsValid(AssociationIdCommodityCustomer)) { if (accountMgr == null) accountMgr = SbmGlobals.System.CreateAccountMgr(userContext); lValue.Add("Commodity definitions for customer", accountMgr.GetAssociationTargetName(AssociationIdCommodityCustomer)); } if (!StringUtil.IsEmpty(AccountCodeCommodityCustomer)) lValue.Add("Commodity definitions for customer", AccountCodeCommodityCustomer); // Commodity status category. if (StatusCat == StatusCat.Current) lValue.Add("Status", "Current"); } // Portfolio: //PortfolioIdInclude; //PortfolioIdExclude; // Clean-up. if (accountMgr != null) accountMgr.Dispose(); return lValue; } } } //======================================================================= // C o m m o d i t y D a t a L i s t //======================================================================= public static class SbmCommodityList { /// Check whether commodity exists/locate in list with specified Id. public static bool FindById(this List values, SysId commodityId) { if (!SysId.IsValid(commodityId)) return false; return values.Exists(item => item.Id.Equals(commodityId)); } public static bool FindByType(this List values, String commodityType) { if (StringUtil.IsEmpty(commodityType)) return false; return values.Exists(item => item.CommodityType.ToString().EqualsCI(commodityType)); } public static bool FindByCode(this List values, String commodityCode) { if (StringUtil.IsEmpty(commodityCode)) return false; return values.Exists(item => item.Code.EqualsCI(commodityCode)); } } //======================================================================= }