namespace CAPI.Custom.Data { using CAPI.Custom.Entities; using framework_business; using framework_library; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; /// /// Summary description for QuotesContext_BuyoutSuppliers /// public partial class QuotesContext { public QuoteBuyoutSupplier QuoteBuyoutSuppliers_GetOrCreateBuyoutSupplier(int quoteId, int supplierId) { var supplier = Suppliers.FirstOrDefault(p => p.itemID == supplierId); var buyoutSupplier = QuoteBuyoutSuppliers .FirstOrDefault(p => p.isActive.Value && p.ParentSurfaceItemId == quoteId && p.TradingName .Equals(supplier.TradingName, StringComparison.OrdinalIgnoreCase) ); if (buyoutSupplier.IsNull()) { string currency = supplier.Currency; decimal exchangeRate = 0m; if (!new string[] { "", "ZAR " }.Contains(currency)) { exchangeRate = ExchangeRates.FirstOrDefault(p => p.ForexCurrency.Equals(currency)) ?.BuyExchangeRate.TryParseDecimal() .GetValueOrDefault() ?? 0m; } var freight = Freights .FirstOrDefault(p => p.SupplierTradingName.Equals( supplier.TradingName) )?.Freight.TryParseDecimal().GetValueOrDefault() ?? 0m; buyoutSupplier = new QuoteBuyoutSupplier { isActive = true, ParentSurfaceItemId = quoteId, ContactPerson = supplier.Contacts, Currency = supplier.Currency, DefaultDiscount = supplier.DefaultDiscount, DefaultLeadtime = supplier.DefaultLeadtime, Duty = 0m, Email = supplier.PrimaryEmail, ExchangeRate = exchangeRate, Freight = freight, Notes = supplier.Notes, //QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierStatus = supplier.SupplierDetails_SupplierDetails_SupplierStatus, Telephone = supplier.Telephone, VATRate = supplier.VATRate.TryParseDecimal(), TradingName = supplier.TradingName, BuyoutQuoteType = 1137 // Selected Items }; buyoutSupplier = BusinessUtils.Create(buyoutSupplier); QuoteBuyoutSuppliers_CreateBuyoutItems(buyoutSupplier); } return buyoutSupplier; } //public IEnumerable QuoteBuyoutSuppliers_CreateBuyoutItems(int userId, QuoteBuyoutSupplier buyoutSupplier) //{ // int itemId = buyoutSupplier.itemID; // var nonStockOnlyType = GetBuyoutQuoteTypes().FirstOrDefault(p => p.Display.Equals("Non-Stock Only")); // int quoteId = buyoutSupplier.ParentSurfaceItemId.Value; // string supplierName = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_SupplierTradingName; // decimal exRate = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierExchangeRate.GetValueOrDefault(); // bool nonStockOnly = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutQuoteType.Value.Equals(nonStockOnlyType.Id); // try // { // //CVH 2019-03-20 Get buyout items already saved, need to update existing, instead of deleting and inserting new // ArrayList existBuyoutItems = xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteBuyoutItems), "ParentSurfaceItemId", itemId.ToString(), "", "publ_"); // //load supplier quote items, if existing // ArrayList quoteItems = xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteItems), "isActive,ParentSurfaceItemId,QuoteItems_QuoteItems_QuoteItemsSupplier", "1," + quoteId + "," + supplierName, "", "publ_", false); // if (quoteItems != null && quoteItems.Count > 0) // { // foreach (oQuoteItems quoteItem in quoteItems) // { // oQuoteBuyoutItems buyObj = new oQuoteBuyoutItems(); // //CVH 2019-03-20 Find existing buyout item (if any) // for (int i = existBuyoutItems.Count - 1; i >= 0; i--) // { // oQuoteBuyoutItems existItm = (oQuoteBuyoutItems)existBuyoutItems[i]; // if (quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber == existItm.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsPartNumber && // quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber == existItm.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber) // { // buyObj = existItm; // //remove item from list, will Delete all left over existing items (in case quote items have been removed) // existBuyoutItems.RemoveAt(i); // } // } // //create new item if none exist yet, but don't update if it does exist, nothing to update // if (buyObj.recId <= 0) // { // oSurfaceItem buyItem = new oSurfaceItem(); // buyItem.createdBy = userId; // buyItem.dateCreated = System.DateTime.Now; // buyItem.isActive = true; // buyItem.isDeleted = false; // buyItem.surfaceId = 3059;//Quote Buyout Items // buyItem.recId = xData.SaveTyped("recId", typeof(oSurfaceItem), buyItem); // buyObj.isActive = true; // buyObj.itemID = buyItem.recId; // buyObj.ParentSurfaceItemId = itemId; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber = quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsBrand = quoteItem.QuoteItems_QuoteItems_QuoteItemsBrand; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCondition = quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition; // decimal zar = quoteItem.QuoteItems_QuoteItems_QuoteItemsCostPrice; // decimal forex = 0; // if (exRate != 0) // { // forex = zar / exRate; // } // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCostPriceZAR = zar; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCostPriceForex = forex; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDescription = quoteItem.QuoteItems_QuoteItems_QuoteItemsDescription; // decimal discount = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierDefaultDiscount.TryParseDecimal().GetValueOrDefault(); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDiscount = discount; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDutyCost = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsFreightCost = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsLeadtime = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierDefaultLeadtime; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsPartNumber = quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityAvailable = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantityAvailable; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityRequired = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsTotalCost = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsWeightKG = quoteItem.QuoteItems_QuoteItems_QuoteItemsWeightKG; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSequence = quoteItem.QuoteItems_QuoteItems_QuoteItemsSequenceNumber; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSelected = true; // buyObj.surfaceId = buyItem.surfaceId; // buyObj.recId = xData.SaveTyped("recId", typeof(oQuoteBuyoutItems), buyObj, "publ_", false); // } // } // } // else // { // //CVH 2019-01-24 Do Row number with order by master number desc, sequence number asc. Otherwise it uses the wrong sequence number on the buyout item // string query = ";WITH cte AS " + // "( " + // " SELECT *, " + // " ROW_NUMBER() " + // " OVER(PARTITION BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + // " ORDER BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber DESC, QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence ASC) AS rn " + // " FROM publ_QuoteRequestItems " + // " WHERE isActive = 1 AND ParentSurfaceItemId = " + quoteId + " " + // ") " + // "SELECT QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + // " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber " + // " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription " + // " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG " + // " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence " + // " , SUM(QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired) AS QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired " + // "FROM cte " + // "WHERE rn = 1 " + // "GROUP BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + // " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber " + // " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription " + // " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG " + // " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence " + // "ORDER BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber "; // DataTable dtRequestItems = xData.GetCustomTypedTable(query); // //CVH 2019-03-22 If Non-stock only, get the list request items that are CEP Inventory items, need to remove those from buyout items // DataTable dtCEPInventoryReqItems = new DataTable(); // if (nonStockOnly && dtRequestItems != null && dtRequestItems.Rows.Count > 0) // { // string requestItems = ""; // foreach (DataRow row in dtRequestItems.Rows) // { // if (requestItems == "") // requestItems = "'" + row["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'"; // else // requestItems += ",'" + row["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'"; // } // if (requestItems != "") // { // string nsQuery = "select SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber from publ_SupplierPricelistParts p " + // " where p.isActive = 1 and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPricelistStatus = 'Current' " + // " and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsSupplierName = 'CEP Inventory' " + // " and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber in (" + requestItems + ") "; // dtCEPInventoryReqItems = xData.GetCustomTypedTable(nsQuery); // } // } // //load all requested items // foreach (DataRow reqItem in dtRequestItems.Rows) // { // //CVH 2019-03-20 Don't create a buyout item for a "blank" item // if (reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() == "" && // reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber"].ToString() == "Not found") // continue; // //CVH 2019-03-22 If data in CEP list, non stock has been selected, so check if item exists in CEP list, if so skip and don't add as buyout item // if (dtCEPInventoryReqItems != null && dtCEPInventoryReqItems.Rows.Count > 0) // { // if (dtCEPInventoryReqItems.Select("SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber = '" + reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'").Count() > 0) // continue; // } // oQuoteBuyoutItems buyObj = new oQuoteBuyoutItems(); // //CVH 2019-03-20 Find existing buyout item (if any) // for (int i = existBuyoutItems.Count - 1; i >= 0; i--) // { // oQuoteBuyoutItems existItm = (oQuoteBuyoutItems)existBuyoutItems[i]; // if (reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() == existItm.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsPartNumber && // reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber"].ToString() == existItm.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber) // { // buyObj = existItm; // //remove item from list, will Delete all left over existing items (in case quote items have been removed) // existBuyoutItems.RemoveAt(i); // } // } // if (buyObj.recId <= 0) // { // oSurfaceItem buyItem = new oSurfaceItem(); // buyItem.createdBy = userId; // buyItem.dateCreated = System.DateTime.Now; // buyItem.isActive = true; // buyItem.isDeleted = false; // buyItem.surfaceId = 3059;//Quote Buyout Items // buyItem.recId = xData.SaveTyped("recId", typeof(oSurfaceItem), buyItem); // buyObj.isActive = true; // buyObj.itemID = buyItem.recId; // buyObj.ParentSurfaceItemId = itemId; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber"].ToString(); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsBrand = "CEP"; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCondition = ""; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCostPriceForex = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCostPriceZAR = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDescription = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription"].ToString(); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDiscount = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierDefaultDiscount.TryParseDecimal().GetValueOrDefault(); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDutyCost = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsFreightCost = 0; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsLeadtime = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierDefaultLeadtime; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsPartNumber = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString(); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityAvailable = 0; // int qty = 0; // int.TryParse(reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired"].ToString(), out qty); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityRequired = qty; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsTotalCost = 0; // decimal kg = 0; // decimal.TryParse(reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG"].ToString(), out kg); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsWeightKG = kg; // int sequence = 0; // int.TryParse(reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence"].ToString(), out sequence); // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSequence = sequence; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSelected = true; // buyObj.surfaceId = buyItem.surfaceId; // buyObj.recId = xData.SaveTyped("recId", typeof(oQuoteBuyoutItems), buyObj, "publ_", false); // } // else // { // //CVH 2019-03-22 Need to make all selected (in case deselected before clicking the Non-stock only button) // buyObj.isActive = true; // buyObj.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSelected = true; // xData.UpdateTyped("recId", buyObj.recId.ToString(), typeof(oQuoteBuyoutItems), buyObj, "publ_"); // } // } // } // //CVH 2019-03-20 Remove all buyout items no longer in quote items list // foreach (oQuoteBuyoutItems remOjb in existBuyoutItems) // { // foreach (oSurfaceItem remItm in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", remOjb.itemID.ToString())) // { // remItm.isDeleted = true; // remItm.isActive = false; // xData.UpdateTyped("recId", remItm.recId.ToString(), typeof(oSurfaceItem), remItm); // } // xData.DeletePublishedSurfaceItem(remOjb.surfaceId, remOjb.itemID); // } // //foreach (oSurfaceItem supplierBuyout in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", base.SurfaceAppItemId.ToString())) // //{ // // PopulateSurfaceFormCustom(supplierBuyout, false); // //} // //upSurfaceGrid3061_QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierItems.Update(); // } // catch (Exception ex) // { // exception.HandleException("surface:", MethodBase.GetCurrentMethod().Name, ex, userId); // //Response.Redirect("/error", false); // } // return QuoteBuyoutItems.Where(p => p.ParentSurfaceItemId == itemId && p.isActive.Value) // .OrderBy(p => p.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSequence); //} public IEnumerable QuoteBuyoutSuppliers_CreateBuyoutItems(QuoteBuyoutSupplier buyoutSupplier) { var nonStockOnlyTypeId = SurfaceLookups .Where(p => p.isActive.Value && p.LookupCategory.lookupCategory.Equals("Buyout Quote Type", StringComparison.OrdinalIgnoreCase) && "Non-Stock Only".Equals(p.display) ) .Select(p => p.recId) .FirstOrDefault(); //var nonStockOnlyTypeId = GetBuyoutQuoteTypes().FirstOrDefault(p => "Non-Stock Only".Equals(p.Display))?.Id; var buyoutSupplierId = buyoutSupplier.itemID; var quoteId = buyoutSupplier.ParentSurfaceItemId.GetValueOrDefault(); var supplierName = buyoutSupplier.TradingName.Trim(); var exRate = buyoutSupplier.ExchangeRate.GetValueOrDefault(); var nonStockOnly = nonStockOnlyTypeId.Equals(buyoutSupplier.BuyoutQuoteType.GetValueOrDefault()); try { //CVH 2019-03-20 Get buyout items already saved, need to update existing, instead of deleting and inserting new var existBuyoutItems = QuoteBuyoutItems.Where(p => p.ParentSurfaceItemId == buyoutSupplierId).ToList(); //ArrayList existBuyoutItems = xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteBuyoutItems), "ParentSurfaceItemId", buyoutSupplierItemId.ToString(), "", "publ_"); //load supplier quote items, if existing var quoteItems = QuoteItems .Where(p => p.isActive.Value && p.ParentSurfaceItemId == quoteId && p.Supplier == supplierName ).ToList(); //ArrayList quoteItems = xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteItems), "isActive,ParentSurfaceItemId,QuoteItems_QuoteItems_QuoteItemsSupplier", "1," + quoteItemId + "," + supplierName, "", "publ_", false); if (quoteItems.Any()) { foreach (var quoteItem in quoteItems) { var buyObj = new QuoteBuyoutItem(); var existingBuyoutItem = existBuyoutItems .Where(p => p.MasterPartNumber == quoteItem.MasterPartNumber && p.PartNumber == quoteItem.PartNumber ).ToArray(); //CVH 2019-03-20 Find existing buyout item (if any) for (int i = existBuyoutItems.Count - 1; i >= 0; i--) { var existItm = existBuyoutItems[i]; if (quoteItem.PartNumber == existItm.PartNumber && quoteItem.MasterPartNumber == existItm.MasterPartNumber) { buyObj = existItm; //remove item from list, will Delete all left over existing items (in case quote items have been removed) existBuyoutItems.RemoveAt(i); } } //create new item if none exist yet, but don't update if it does exist, nothing to update if (buyObj.recId <= 0) { var currency = quoteItem.SupplierCurrency; decimal eRate = 0; if (!new string[] { "", "ZAR" }.Contains(currency)) { eRate = ExchangeRates.FirstOrDefault(p => p.ForexCurrency == currency) ?.BuyExchangeRate.TryParseDecimal() .GetValueOrDefault() ?? 0m; } decimal zar = quoteItem.CostPrice.GetValueOrDefault(); decimal forex = 0; if (eRate != 0) { forex = zar / eRate; } decimal supplierDiscount = buyoutSupplier.DefaultDiscount .TryParseDecimal().GetValueOrDefault(); decimal supplierDuty = buyoutSupplier.Duty .GetValueOrDefault(); decimal supplierFreight = buyoutSupplier.Freight .GetValueOrDefault(); decimal dutyCost = BusinessUtils.GetSellingPrice(zar, supplierDuty) - zar; decimal freightCost = BusinessUtils.GetSellingPrice(zar, supplierFreight) - zar; decimal discount = (zar * supplierDiscount / 100m); decimal totalCost = zar + freightCost + dutyCost - discount; // oSurfaceItem buyItem = new oSurfaceItem(); //buyItem.createdBy = userId; //buyItem.dateCreated = System.DateTime.Now; //buyItem.isActive = true; //buyItem.isDeleted = false; //buyItem.surfaceId = 3059;//Quote Buyout Items //buyItem.recId = xData.SaveTyped("recId", typeof(oSurfaceItem), buyItem); //buyObj.isActive = true; //buyObj.itemID = buyItem.recId; buyObj.ParentSurfaceItemId = buyoutSupplierId; buyObj.MasterPartNumber = quoteItem.MasterPartNumber; buyObj.Brand = quoteItem.Brand; buyObj.Condition = quoteItem.Condition; buyObj.CostPriceZAR = zar; buyObj.CostPriceForex = forex; buyObj.Description = quoteItem.Description; buyObj.Discount = supplierDiscount; buyObj.DutyCost = dutyCost; buyObj.FreightCost = freightCost; buyObj.Leadtime = buyoutSupplier.DefaultLeadtime; buyObj.PartNumber = quoteItem.PartNumber; buyObj.QuantityAvailable = quoteItem.QuantityAvailable; buyObj.QuantityRequired = quoteItem.QuantitySelected; buyObj.TotalCost = totalCost; buyObj.WeightKG = quoteItem.WeightKG; buyObj.Sequence = quoteItem.Sequence; buyObj.Selected = true; buyObj = BusinessUtils.Create(buyObj); //buyObj.surfaceId = buyItem.surfaceId; //buyObj.recId = xData.SaveTyped("recId", typeof(oQuoteBuyoutItems), buyObj, "publ_", false); } } } else { //string query = "select QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber, " + // "QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription, SUM(QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired) as QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired " + // "from publ_QuoteRequestItems where isActive = 1 and ParentSurfaceItemId = " + base.ParentSurfaceItemId + " " + // "group by QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber, " + // "QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription " + // "order by QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber"; // CVH 2019-01-24 Do Row number with order by master number desc, sequence number asc. // Otherwise it uses the wrong sequence number on the buyout item string query = ";WITH cte AS " + "( " + " SELECT *, " + " ROW_NUMBER() " + " OVER(PARTITION BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + " ORDER BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber DESC, QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence ASC) AS rn " + " FROM publ_QuoteRequestItems " + " WHERE isActive = 1 AND ParentSurfaceItemId = " + quoteId + " " + ") " + "SELECT QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber " + " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription " + " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG " + " , QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence " + " , SUM(QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired) AS QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired " + "FROM cte " + "WHERE rn = 1 " + "GROUP BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber " + " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber " + " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription " + " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG " + " ,QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence " + "ORDER BY QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber "; DataTable dtRequestItems = xData.GetCustomTypedTable(query); //CVH 2019-03-22 If Non-stock only, get the list request items that are CEP Inventory items, need to remove those from buyout items var dtCEPInventoryReqItems = new List(); //DataTable dtCEPInventoryReqItems = new DataTable(); if (nonStockOnly && dtRequestItems.IsNotNull() && dtRequestItems.Rows.Count > 0) { HashSet requestItemsHash = new HashSet(); //string requestItems = string.Empty; foreach (DataRow row in dtRequestItems.Rows) { string partNumber = row.Field("QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"); requestItemsHash.Add(partNumber); //if (requestItems.IsEmpty()) // requestItems = "'" + row["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'"; //else // requestItems += ",'" + row["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'"; } if (requestItemsHash.Any()) { dtCEPInventoryReqItems = SupplierPricelistParts .Where(p => p.isActive.Value && "Current" == p.PricelistStatus && "CEP Inventory" == p.SupplierName && requestItemsHash.Contains(p.PartNumber) ).ToList(); //string nsQuery = "select SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber from publ_SupplierPricelistParts p " + // " where p.isActive = 1 and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPricelistStatus = 'Current' " + // " and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsSupplierName = 'CEP Inventory' " + // " and p.SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber in (" + requestItems + ") "; // dtCEPInventoryReqItems = xData.GetCustomTypedTable(nsQuery); } } //load all requested items foreach (DataRow reqItem in dtRequestItems.Rows) { string partNumber = reqItem.Field("QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"); string masterNumber = reqItem.Field("QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber"); //CVH 2019-03-20 Don't create a buyout item for a "blank" item if (partNumber.IsEmpty() && "Not found".Equals(masterNumber)) continue; // CVH 2019-03-22 If data in CEP list, non stock has been selected, // so check if item exists in CEP list, if so skip and don't add as buyout item if (dtCEPInventoryReqItems.Any()) { if (dtCEPInventoryReqItems.Any(p => p.PartNumber == partNumber)) //if (dtCEPInventoryReqItems.Select("SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber = '" + // reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber"].ToString() + "'").Count() > 0) continue; } var buyObj = new QuoteBuyoutItem(); //CVH 2019-03-20 Find existing buyout item (if any) for (int i = existBuyoutItems.Count - 1; i >= 0; i--) { var existItm = existBuyoutItems[i]; if (partNumber == existItm.PartNumber && masterNumber == existItm.MasterPartNumber) { buyObj = existItm; //remove item from list, will Delete all left over existing items (in case quote items have been removed) existBuyoutItems.RemoveAt(i); } } if (buyObj.recId <= 0) { decimal duty = BusinessUtils.GetSellingPrice(0, 0); decimal freight = BusinessUtils.GetSellingPrice(0, 0); decimal supplierDiscount = buyoutSupplier.DefaultDiscount.TryParseDecimal().GetValueOrDefault(); //decimal totalCost = zar + freightCost + dutyCost - discount; //oSurfaceItem buyItem = new oSurfaceItem(); //buyItem.createdBy = userId; //buyItem.dateCreated = System.DateTime.Now; //buyItem.isActive = true; //buyItem.isDeleted = false; //buyItem.surfaceId = 3059;//Quote Buyout Items //buyItem.recId = xData.SaveTyped("recId", typeof(oSurfaceItem), buyItem); //buyObj.isActive = true; //buyObj.itemID = buyItem.recId; buyObj.ParentSurfaceItemId = buyoutSupplierId; buyObj.MasterPartNumber = masterNumber; buyObj.Brand = "CEP"; buyObj.Condition = string.Empty; buyObj.CostPriceForex = 0; buyObj.CostPriceZAR = 0; buyObj.Description = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsDescription"].ToString(); buyObj.Discount = supplierDiscount; buyObj.DutyCost = 0; buyObj.FreightCost = 0; buyObj.Leadtime = buyoutSupplier.DefaultLeadtime; buyObj.PartNumber = partNumber; buyObj.QuantityAvailable = 0; int qty = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired"].ToString().TryParseInt().GetValueOrDefault(); buyObj.QuantityRequired = qty; buyObj.TotalCost = 0; decimal kg = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsWeightKG"].ToString().TryParseDecimal().GetValueOrDefault(); buyObj.WeightKG = kg; int sequence = reqItem["QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence"].ToString().TryParseInt().GetValueOrDefault(); buyObj.Sequence = sequence; buyObj.Selected = true; buyObj = BusinessUtils.Create(buyObj); //buyObj.surfaceId = buyItem.surfaceId; //buyObj.recId = xData.SaveTyped("recId", typeof(oQuoteBuyoutItems), buyObj, "publ_", false); } else { //CVH 2019-03-22 Need to make all selected (in case deselected before clicking the Non-stock only button) buyObj.isActive = true; buyObj.Selected = true; BusinessUtils.Update(buyObj); //xData.UpdateTyped("recId", buyObj.recId.ToString(), typeof(oQuoteBuyoutItems), buyObj, "publ_"); } } } //CVH 2019-03-20 Remove all buyout items no longer in quote items list foreach (var remOjb in existBuyoutItems) { foreach (oSurfaceItem remItm in xData.GetTypedByCriteriaSpecific("recId", typeof(oSurfaceItem), "recId", remOjb.itemID.ToString())) { remItm.isDeleted = true; remItm.isActive = false; xData.UpdateTyped("recId", remItm.recId.ToString(), typeof(oSurfaceItem), remItm); } xData.DeletePublishedSurfaceItem(remOjb.surfaceId, remOjb.itemID); } } catch (Exception ex) { BusinessUtils.HandleException(ex); throw; } return QuoteBuyoutItems.Where(p => p.ParentSurfaceItemId == buyoutSupplierId && p.isActive.Value) .OrderBy(p => p.Sequence); } public int RecalculateBuyoutItems(int itemId) { var buyoutSupplier = QuoteBuyoutSuppliers.SingleOrDefault(p => p.itemID == itemId); var buyoutItems = QuoteBuyoutItems.Where(p => p.ParentSurfaceItemId == itemId); decimal freight = buyoutSupplier.Freight.GetValueOrDefault(); decimal duty = buyoutSupplier.Duty.GetValueOrDefault(); foreach (var item in buyoutItems) { item.FreightCost = item.CostPriceZAR * freight / 100m; item.DutyCost = item.CostPriceZAR * duty / 100m; item.TotalCost = item.CostPriceZAR - (item.CostPriceZAR * item.Discount / 100m) + item.FreightCost + item.DutyCost; } return SaveChanges(); } /// /// /// /// /// itemID public void QuoteBuyoutSuppliers_ExportQuoteItems(int buyoutSupplierId) { var buyoutSupplier = QuoteBuyoutSuppliers .Where(p => p.itemID == buyoutSupplierId) .Select(p => new { p.itemID, p.ParentSurfaceItemId, p.TradingName, p.Currency }).FirstOrDefault(); var quote = Quotes .Where(p => p.itemID == buyoutSupplier.ParentSurfaceItemId) .Select(p => new { p.itemID, p.CustomerDefaultMargin }).FirstOrDefault(); if (quote.IsNotNull()) { var buyoutItems = QuoteBuyoutItems .Where(p => p.isActive.Value && p.ParentSurfaceItemId == buyoutSupplier.itemID && p.Selected.Value && p.QuantityAvailable > 0) .ToList(); var quoteItems = QuoteItems .Where(p => p.isActive.Value && p.ParentSurfaceItemId == buyoutSupplier.ParentSurfaceItemId ) .ToList(); foreach (var buyoutItem in buyoutItems) { QuoteItem quoteItem = quoteItems.FirstOrDefault(p => p.MasterPartNumber == buyoutItem.MasterPartNumber && p.Brand == buyoutItem.Brand && p.Condition == buyoutItem.Condition && p.Supplier == buyoutSupplier.TradingName) ?? new QuoteItem(); quoteItem.Margin = quote.CustomerDefaultMargin.TryParseDecimal(); quoteItem.LeadTime = buyoutItem.Leadtime; quoteItem.CostPrice = buyoutItem.TotalCost; //decimal divideBy = 1m - (quoteItem.QuoteItems_QuoteItems_QuoteItemsMargin.GetValueOrDefault() / 100m); quoteItem.CalculateSellingPrice(newMargin: quoteItem.Margin);// QuoteItems_QuoteItems_QuoteItemsSellingPrice = divideBy == 0 ? 0 : quoteItem.QuoteItems_QuoteItems_QuoteItemsCostPrice / divideBy; quoteItem.QuantityAvailable = buyoutItem.QuantityAvailable; if (quoteItem.recId == 0) { quoteItem.ParentSurfaceItemId = quote.itemID; quoteItem.MasterPartNumber = buyoutItem.MasterPartNumber; quoteItem.Brand = buyoutItem.Brand; quoteItem.Condition = buyoutItem.Condition; quoteItem.Description = buyoutItem.Description; quoteItem.PartNumber = buyoutItem.PartNumber; quoteItem.Supplier = buyoutSupplier.TradingName; quoteItem.WeightKG = buyoutItem.WeightKG; quoteItem.WarehouseLocation = string.Empty; quoteItem.SupplierCurrency = buyoutSupplier.Currency; quoteItem.Sequence = buyoutItem.Sequence; /* CVH 2019-01-22 Set supplier sequence: 0 - Inventory Items (not used) 1 - CEP Inventory pricelist 2 - CAT pricelist 3 - Other pricelists in alpha order 4 - Buyout supplier lists in alpha order */ quoteItem.SupplierSequence = 4; QuoteItems.Add(quoteItem); } SaveChanges(); } SupplierItemsExported?.Invoke(this, new QuoteEvent { QuoteId = quote.itemID }); } } } }