//using CAPI.Custom.Data; //using CAPI.Custom.Entities; //using framework_business; //using System; //using System.Collections.Generic; //using System.Linq; //using CAPI.Custom.Domain.Quotes; //using System.Data; //using AutoMapper; //using CAPI.Custom.Repositories; //namespace CAPI.Custom.Services //{ // /// // /// Meant to replace BusinessUtils // /// // public class QuotesService // { // private readonly QuotesContext db; // private readonly string IN_STOCK = "STOCK"; // public QuotesService(QuotesContext db = null) // { // this.db = db ?? QuotesContext.Create(); // RegisterEvents(); // } // ~QuotesService() // { // db.Dispose(); // UnregisterEvents(); // } // #region Quotes // public IQueryable Quotes => db.Quotes; // public IQueryable GetQuotesTradingNames() => // db.Quotes.Where(p => p.isActive.Value) // .Select(p => p.CustomerTradingName) // .Distinct().OrderBy(p => p); // public IQueryable GridItems => db.vQuoteGridItems // .OrderByDescending(p => p.QuoteInformation_QuoteNumber); // public vQuoteGridItem GetGridItemById(int quoteId) => // db.vQuoteGridItems.FirstOrDefault(p => p.itemID == quoteId); // public vQuote GetViewByItemId(int quoteId) => // db.vQuotes.FirstOrDefault(p => p.itemID == quoteId); // public QuoteModel GetByItemIDModel(int itemId) // { // return Mapper.Map(GetByItemID(itemId), new QuoteModel()); // } // public Quote GetByItemId(int itemId) // { // return GetByItemID(itemId); // } // public Quote Create(Quote quote) // { // var setup = db.Setup; // var user = db.Users.Find(db.User.Id); // int invoiceNumber = BusinessUtils.GetNextSalesInvoiceNumber(); // string quoteNumber = GetQuoteNumberFromInvoiceNumber(invoiceNumber); // quote.Number = quoteNumber; // quote.Date = DateTime.Now; // TryResolveMissingData(quote); // CopyPhysicalAddressToDeliveryAddress(quote); // // save quote to get itemID // db.Quotes.Add(quote); // db.SaveChanges(); // Sale salesQuote = new Sale // { // accountNo = quote.CustomerCode, // comments = quote.FinalNotes, // dateOfCapture = DateTime.Now, // dateOfService = quote.Date, // invoiceNo = invoiceNumber, // itemType = "QT", // isVisible = true, // name = quote.CustomerTradingName, // postalAddress = quote.CustomerPostalAddress, // statusId = (int)pNums.SalesSatus.Draft, // surfaceItemId = quote.itemID, // surname = quote.CustomerContactName, // vatNum = quote.CustomerVATNumber, // email = quote.CustomerContactEmail, // }; // SalesExtraNote extraNote = new SalesExtraNote // { // note = quote.FinalNotes, // type = pNums.DocumentType.Quote.GetHashCode(), // number = salesQuote.invoiceNo, // dateSaved = DateTime.Now, // }; // db.Sales.Add(salesQuote); // db.SalesExtraNotes.Add(extraNote); // db.SaveChanges(); // return quote; // } // public Quote Create(int customerId, int? contactId = null) // { // var customer = db.Customers.GetFirstByItemId(customerId); // if (customer.IsNull()) return null; // var contacts = db.Contacts.GetQueryItemByParentId(customer.itemID).ToList() // .OrderBy(p => Math.Abs(customer.PrimaryEmail.CompareTo(p.Email))) // .ThenBy(p => p.Name); // var contact = contacts.FirstOrDefault(); // if (contactId.HasValue) // { // contact = contacts.FirstOrDefault(p => p.itemID == contactId.Value) ?? contact; // } // var quote = new Quote // { // Date = DateTime.Now, // // Customer Info // CustomerCode = customer.Code, // CustomerCurrency = customer.Currency.NullOrEmptyCoalesce("ZAR"), // CustomerIsParent = customer.IsParent, // CustomerLegalEntity = customer.LegalEntity, // CustomerParentCompany = customer.ParentCompany, // CustomerPhysicalAddress = customer.PhysicalAddress, // CustomerPostalAddress = customer.PostalAddress, // CustomerTradingName = customer.TradingName, // CustomerType = customer.Type, // CustomerVATNumber = customer.VATRegistered, // CustomerVATRate = customer.VATRate, // CustomerDefaultDiscount = customer.DefaultDiscount, // CustomerDefaultMargin = customer.DefaultMargin, // // Contact Info // CustomerContactName = contact?.Name ?? customer.Contacts, // CustomerContactEmail = contact.Email ?? customer.PrimaryEmail, // CustomerContactMobileNumber = contact?.Mobile ?? string.Empty, // CustomerContactTelephone = contact?.Telephone ?? customer.Telephone, // ItemsDefaultMargin = customer.DefaultMargin // }; // return Create(quote); // } // public Quote Update(Quote entity) // { // TryResolveMissingData(entity); // var quote = db.Update(entity); // UpdateQuoteSales(quote); // //var salesQuote = db.Sales.FirstOrDefault(p => p.surfaceItemId == quote.itemID); // //if (salesQuote.IsNotNull()) // //{ // // salesQuote.postalAddress = quote.QuoteCustomerDetails_QuoteCustomerDetails_CustomerPostalAddress; // // salesQuote.accountNo = quote.QuoteCustomerDetails_QuoteCustomerDetails_CustomerCode; // // salesQuote.name = quote.QuoteInformation_CustomerTradingName; // // salesQuote.surname = quote.None_QuoteInformation_ContactName; // // salesQuote.comments = quote.QuoteFinal_QuoteFinalItems_QuoteFinalItemsNotes; // // var extraNote = db.SalesExtraNotes.FirstOrDefault(p => p.number == salesQuote.invoiceNo); // // if (extraNote.IsNotNull()) // // { // // extraNote.note = quote.QuoteFinal_QuoteFinalItems_QuoteFinalItemsNotes; // // extraNote.dateSaved = DateTime.Now; // // } // // db.SaveChanges(); // //} // return quote; // } // public void UpdateQuoteSales(Quote quote) // { // //var quote = GetByItemId(quoteId); // var salesQuote = db.Sales.FirstOrDefault(p => p.surfaceItemId == quote.itemID); // if (salesQuote.IsNotNull()) // { // salesQuote.postalAddress = quote.CustomerPostalAddress; // salesQuote.accountNo = quote.CustomerCode; // salesQuote.name = quote.CustomerTradingName; // salesQuote.surname = quote.CustomerContactName; // salesQuote.comments = quote.FinalNotes; // var extraNote = db.SalesExtraNotes.FirstOrDefault(p => p.number == salesQuote.invoiceNo); // if (extraNote.IsNotNull()) // { // extraNote.note = quote.FinalNotes; // extraNote.dateSaved = DateTime.Now; // } // db.SaveChanges(); // } // } // public int Delete(int quoteId) // { // var quote = db.Quotes.GetFirstByItemId(quoteId); // // exit if quoteId does not exist // if (quote.IsNull()) return 0; // // gather all quote related information // var buyoutSuppliers = db.QuoteBuyoutSuppliers.Where(p => quoteId == p.ParentSurfaceItemId); // var buyoutSupplierIds = buyoutSuppliers.Select(p => p.itemID).ToArray(); // var buyoutItems = db.QuoteBuyoutItems.Where(p => buyoutSupplierIds.Contains(p.ParentSurfaceItemId.Value)); // var enquiryItems = db.QuoteEnquiryItems.Where(p => quoteId == p.ParentSurfaceItemId); // var requestItems = db.QuoteRequestItems.Where(p => quoteId == p.ParentSurfaceItemId); // var quoteItems = db.QuoteItems.Where(p => quoteId == p.ParentSurfaceItemId); // var finalItems = db.QuoteItemsFinal.Where(p => quoteId == p.ParentSurfaceItemId); // // remove collections that have items // if (finalItems.Any()) db.QuoteItemsFinal.RemoveRange(finalItems); // if (buyoutItems.Any()) db.QuoteBuyoutItems.RemoveRange(buyoutItems); // if (buyoutSuppliers.Any()) db.QuoteBuyoutSuppliers.RemoveRange(buyoutSuppliers); // if (quoteItems.Any()) db.QuoteItems.RemoveRange(quoteItems); // if (requestItems.Any()) db.QuoteRequestItems.RemoveRange(requestItems); // if (enquiryItems.Any()) db.QuoteEnquiryItems.RemoveRange(enquiryItems); // // remove sales information // var sale = db.Sales.FirstOrDefault(p => p.surfaceItemId == quoteId); // if (sale.IsNotNull()) // { // var extraNote = db.SalesExtraNotes.FirstOrDefault(p => p.number == sale.invoiceNo); // if (extraNote.IsNotNull()) // { // db.SalesExtraNotes.Remove(extraNote); // } // db.Sales.Remove(sale); // } // // remove quote // db.Quotes.Remove(quote); // return db.SaveChanges(); // } // public Quote AcceptQuote(int quoteId) // { // var quote = GetByItemID(quoteId); // if (quote.IsNull()) // throw new ArgumentException($"Could not find Quote with itemID: {quoteId}", "quoteId"); // quote.StatusId = QuoteStatus.Accepted; // quote.AcceptedDate = DateTime.Now; // Update(quote); // this.QuoteAccepted?.Invoke(this, new QuoteEvent { QuoteId = quoteId }); // return quote; // } // public void ProcessQuote(int quoteId) // { // var processor = new QuoteProcessor(dbContext: db); // processor.ProcessQuote(quoteId); // QuotesItems_RemoveMatchingSurplusWarehouseQuoteItems(quoteId); // QuoteItems_CheckPreviouslyQuotedPrice(quoteId); // QuoteItems_ApplyCATListPrice(quoteId); // } // #region Helpers // public decimal GetVATRate(Quote quote) // { // decimal vatRate = quote.CustomerVATRate.IsNotEmpty() // ? quote.CustomerVATRate.TryParseDecimal().GetValueOrDefault() // : db.Setup.vatRate.GetValueOrDefault(); // return vatRate; // } // public decimal GetVATRate(int quoteId) // { // var quote = db.Quotes.GetByItemId(quoteId).FirstOrDefault(); // return GetVATRate(quote); // } // protected string GetQuoteNumberFromInvoiceNumber(int invoiceNumber) // { // string quoteNumber = db.Setup.saleQTEPrefix; // int saleQTENumLength = db.Setup.saleQTENumLength.GetValueOrDefault(); // quoteNumber = quoteNumber.PadRight(saleQTENumLength - invoiceNumber.ToString().Length, '0'); // quoteNumber += invoiceNumber.ToString(); // return quoteNumber; // } // protected void TryResolveMissingData(Quote quote) // { // if (quote.Date.IsNull()) // quote.Date = DateTime.Now; // //if (quote.LastUpdated.IsEmpty()) // // quote.LastUpdated = BusinessUtils.FormatDateToString(DateTime.Now); // if (quote.LastUpdatedByDisplay.IsEmpty()) // { // var user = db.Users.Find(db.User.Id); // quote.LastUpdatedByDisplay = user?.userDisplay ?? string.Empty; // } // if (!quote.StatusId.HasValue) // quote.StatusId = QuoteStatus.Draft; // var customerName = quote.CustomerTradingName; // if (quote.CustomerTradingName.IsEmpty()) // quote.CustomerTradingName = customerName; // if (quote.CustomerVATRate.IsEmpty()) // quote.CustomerVATRate = $"{db.Setup.vatRate}%"; // } // protected IQueryable GetSelectedFinalItems(int quoteId) => GetFinalItems(quoteId).Where(p => p.Status); // protected DateTime? EstimateDeliveryDate(int quoteId, DateTime? acceptedDate = null) // { // var initDate = acceptedDate; // if (initDate.IsNull()) // { // initDate = db.Quotes.GetByItemId(quoteId) // .Select(p => p.AcceptedDate) // .FirstOrDefault(); // } // if (initDate.IsNull()) // throw new ArgumentException("Missing AcceptedDate", "Quote.AcceptedDate"); // var maxLeadTime = GetSelectedFinalItems(quoteId) // .Select(p => p.LeadTime) // .Distinct() // // Only parameterless constructors and initializers are supported in LINQ to Entities // .ToList() // .Select(p => new LeadTime(p)) // .Max(); // if (maxLeadTime.IsNull()) return (DateTime?)null; // var estimatedDeliveryDate = initDate.Value.Add(maxLeadTime.ToTimeSpan()); // return estimatedDeliveryDate; // } // protected int GetQuoteItemSupplierSequence(string supplierName) // { // /* // Item order logic: // 1. INVENTORY (always first) // 2. CEP Inventory // 3. Then Surplus Warehouse // 4. Then remaining suppliers in Alpha Order // */ // var order = new string[] { // "INVENTORY", // "CEP Inventory", // "SURPLUS WAREHOUSE" // }; // var orderIndex = Array.IndexOf(order, supplierName); // if (orderIndex < 0) orderIndex = order.Length + 1; // return orderIndex; // } // /// // /// Update Delivery Address with Customer Physical Address // /// // /// // protected void CopyPhysicalAddressToDeliveryAddress(Quote quote) // { // if (!new bool[] { // quote.DeliveryCity.IsNotEmpty(), // quote.DeliveryCountry.IsNotEmpty(), // quote.DeliveryPostalCode.IsNotEmpty(), // quote.DeliveryState.IsNotEmpty(), // quote.DeliveryStreet.IsNotEmpty(), // quote.DeliverySuburb.IsNotEmpty() // }.Contains(true)) // { // var address = quote.CustomerPhysicalAddress?.Split(',') // ?? new string[] { }; // if (address.Length > 0) quote.DeliveryStreet = address[0]; // if (address.Length > 1) quote.DeliverySuburb = address[1]; // if (address.Length > 2) quote.DeliveryCity = address[2]; // if (address.Length > 3) quote.DeliveryState = address[3]; // if (address.Length > 4) quote.DeliveryCountry = address[4]; // if (address.Length > 5) quote.DeliveryPostalCode = address[5]; // } // } // #endregion // #endregion // #region Child Collections // public IQueryable GetEnquiryItems(int quoteId) => // db.QuoteEnquiryItems.GetByParentId(quoteId) // .OrderBy(p => p.Sequence); // public IQueryable GetRequestItems(int quoteId) => db.QuoteRequestItems.GetByParentId(quoteId); // public List GetItems(int quoteId) // { // var sortedMasterNumbers = db.QuoteRequestItems // .GetByParentId(quoteId) // .OrderBy(p => p.Sequence) // .Select(p => p.MasterNumber) // .ToArray(); // var items = db.QuoteItems // .Where(p => p.ParentSurfaceItemId == quoteId) // .ToList(); // if (items.Any(p => !(p.PriceCheckIsChecked ?? false))) // { // QuoteItems_CheckPreviouslyQuotedPrice(quoteId); // } // items = db.QuoteItems.GetByParentId(quoteId).ToList() // .OrderBy(p => Array.IndexOf(sortedMasterNumbers, p.MasterPartNumber)) // //.ThenBy(p => p.QuoteItems_QuoteItems_QuoteItemsSequenceNumber) // .ThenBy(p => p.MasterPartNumber) // .ThenBy(p => GetQuoteItemSupplierSequence(p.Supplier)) // .ThenBy(p => p.Supplier) // .ToList(); // return items; // } // public IQueryable GetBuyoutSuppliers(int quoteId) => // db.QuoteBuyoutSuppliers.GetByParentId(quoteId) // .OrderBy(p => p.TradingName); // public IQueryable GetFinalItems(int quoteId) => // db.QuoteItemsFinal.GetByParentId(quoteId) // .OrderBy(p => p.Sequence); // public IQueryable GetQuoteItemsFinalInStock(int quoteId) => // GetFinalItems(quoteId).Where(p => p.LeadTime == IN_STOCK); // #endregion // #region Events // // Quote Events // public event EventHandler QuoteAccepted; // public event EventHandler QuoteCreated; // public event EventHandler QuoteDeleted; // public event EventHandler QuoteUpdated; // public event EventHandler QuoteProcessed; // // QuoteItem Events // public event EventHandler QuoteItemRecalcuated; // // QuoteFinalItems Events // public event EventHandler QuoteFinalRefreshed; // // Buyout Supplier Events // public event EventHandler BuyoutSupplierCreated; // public event EventHandler SupplierItemsExported; // // Buyout Items Events // public event EventHandler BuyoutItemRecalculated; // public event EventHandler BuyoutItemsExported; // private void RegisterEvents() // { // QuoteAccepted += OnQuoteAccepted; // SupplierItemsExported += OnSupplierItemsExported; // BuyoutItemRecalculated += OnBuyoutItemRecalculated; // BuyoutItemsExported += OnBuyoutItemsExported; // QuoteFinalRefreshed += OnQuoteFinalRefreshed; // } // private void UnregisterEvents() // { // QuoteAccepted -= OnQuoteAccepted; // SupplierItemsExported -= OnSupplierItemsExported; // BuyoutItemRecalculated -= OnBuyoutItemRecalculated; // BuyoutItemsExported -= OnBuyoutItemsExported; // QuoteFinalRefreshed -= OnQuoteFinalRefreshed; // } // protected void OnQuoteAccepted(object sender, QuoteEvent args) // { // } // protected void OnSupplierItemsExported(object sender, QuoteEvent args) // { // Quotes_CalcualteQuoteItemTotals(args.QuoteId); // } // protected void OnBuyoutItemRecalculated(object sender, BuyoutSupplierEvent args) // { // QuoteBuyoutItems_ExportToQuoteItems(args.BuyoutSupplierId); // } // protected void OnBuyoutItemsExported(object sender, BuyoutSupplierEvent args) // { // Quotes_CalcualteQuoteItemTotals(args.QuoteId); // } // private void OnQuoteFinalRefreshed(object sender, QuoteEvent e) // { // QuoteItemsFinal_CalcualteTotals(e.QuoteId); // var quote = db.Quotes.GetFirstByItemId(e.QuoteId); // if (quote.IsNotNull()) // { // quote.DeliveryEstimatedDate = EstimateDeliveryDate(quote.itemID, DateTime.Now); // db.Update(quote); // } // } // #endregion // #region Quote Buyout Suppliers // public QuoteBuyoutSupplier QuoteBuyoutSuppliers_GetOrCreateBuyoutSupplier(int quoteId, int supplierId) // { // var supplier = db.Suppliers.FirstOrDefault(p => p.itemID == supplierId); // var buyoutSupplier = db.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 = db.ExchangeRates.FirstOrDefault(p => // p.ForexCurrency.Equals(currency)) // ?.BuyExchangeRate.TryParseDecimal() // .GetValueOrDefault() ?? 0m; // } // var freight = db.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(QuoteBuyoutSupplier buyoutSupplier) // { // var nonStockOnlyTypeId = db.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 = db.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 = db.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 = db.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 = db.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 db.QuoteBuyoutItems.Where(p => p.ParentSurfaceItemId == buyoutSupplierId && p.isActive.Value) // .OrderBy(p => p.Sequence); // } // public int RecalculateBuyoutItems(int itemId) // { // var buyoutSupplier = db.QuoteBuyoutSuppliers.SingleOrDefault(p => p.itemID == itemId); // var buyoutItems = db.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 db.SaveChanges(); // } // /// // /// // /// // /// // /// itemID // public void QuoteBuyoutSuppliers_ExportQuoteItems(int buyoutSupplierId) // { // var buyoutSupplier = db.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.ItemsDefaultMargin // }).FirstOrDefault(); // if (quote.IsNotNull()) // { // var buyoutItems = db.QuoteBuyoutItems // .Where(p => // p.isActive.Value // && p.ParentSurfaceItemId == buyoutSupplier.itemID // && p.Selected.Value // && p.QuantityAvailable > 0) // .ToList(); // var quoteItems = db.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.ItemsDefaultMargin.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; // db.QuoteItems.Add(quoteItem); // } // db.SaveChanges(); // } // SupplierItemsExported?.Invoke(this, new QuoteEvent { QuoteId = quote.itemID }); // } // } // #endregion // #region Buyout Items // public QuoteBuyoutItem QuoteBuyoutItem_Recalculate(QuoteBuyoutItem item, QuoteBuyoutSupplier buyoutSupplier = null, bool exportQuoteItems = true) // { // var stored = db.QuoteBuyoutItems.Find(item.recId); // if (buyoutSupplier.IsNull()) // { // buyoutSupplier = db.QuoteBuyoutSuppliers.SingleOrDefault(p => p.itemID == item.ParentSurfaceItemId); // } // var supplierFreight = buyoutSupplier.Freight.GetValueOrDefault(); // //var supplierDiscount = buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierDefaultDiscount // // .TryParseDecimal().GetValueOrDefault(); // var supplierDuty = buyoutSupplier.Duty.GetValueOrDefault(); // var storedAvailable = stored.QuantityAvailable.GetValueOrDefault(); // var storedCost = stored.TotalCost.GetValueOrDefault(); // decimal forex = item.CostPriceForex.GetValueOrDefault(); // decimal zar = item.CostPriceZAR.GetValueOrDefault(); // decimal discount = item.Discount.GetValueOrDefault(); // int qtyAvail = item.QuantityAvailable.GetValueOrDefault(); // decimal freight = 0; // decimal duty = 0; // decimal discountAmount = 0; // decimal total = 0; // if (!new string[] { "", "ZAR" }.Contains(buyoutSupplier.Currency)) // { // zar = forex * buyoutSupplier.ExchangeRate.GetValueOrDefault(); // } // freight = BusinessUtils.GetSellingPrice(zar, supplierFreight) - zar; // duty = BusinessUtils.GetSellingPrice(zar, supplierDuty) - zar; // discountAmount = (zar * discount / 100m); // // changed variable discount for supplierDiscount // total = zar + freight + duty - discountAmount; // stored.Brand = item.Brand; // stored.Condition = item.Condition; // stored.CostPriceForex = forex; // stored.CostPriceZAR = zar; // stored.Discount = discount; // stored.DutyCost = duty; // stored.FreightCost = freight; // stored.Leadtime = item.Leadtime; // stored.QuantityAvailable = qtyAvail; // stored.TotalCost = total; // stored.Selected = item.Selected; // db.SaveChanges(); // if (exportQuoteItems) // { // BuyoutItemRecalculated?.Invoke(this, new BuyoutSupplierEvent // { // BuyoutSupplierId = buyoutSupplier.itemID, // QuoteId = buyoutSupplier.ParentSurfaceItemId.GetValueOrDefault() // }); // //var buyoutStatus = GetBuyoutStatusesQuoteReceived(); // //if (buyoutStatus.Id.Equals(buyoutSupplier.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierStatus.GetValueOrDefault()) // // && (stored.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityAvailable > 0 // // || stored.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsTotalCost > 0)) // //{ // // QuoteBuyoutItems_ExportToQuoteItems(userId, buyoutSupplier.itemID); // //} // } // return stored; // } // public QuoteBuyoutItem QuoteBuyoutItems_Clone(int quoteBuyoutItemId) // { // var cloneItem = db.QuoteBuyoutItems.FirstOrDefault(p => p.itemID == quoteBuyoutItemId); // //var buyoutSupplier = cloneItem.GetParent(context: this); // if (!cloneItem.IsNull()) // { // var newItem = new QuoteBuyoutItem // { // isActive = true, // ParentSurfaceItemId = cloneItem.ParentSurfaceItemId.GetValueOrDefault(), // MasterPartNumber = cloneItem.MasterPartNumber, // Brand = cloneItem.Brand, // Condition = cloneItem.Condition, // CostPriceForex = cloneItem.CostPriceForex.GetValueOrDefault(), // CostPriceZAR = cloneItem.CostPriceZAR, // Description = cloneItem.Description, // Discount = cloneItem.Discount, // DutyCost = cloneItem.DutyCost, // FreightCost = cloneItem.FreightCost, // Leadtime = cloneItem.Leadtime, // PartNumber = cloneItem.PartNumber, // QuantityAvailable = cloneItem.QuantityAvailable, // QuantityRequired = cloneItem.QuantityRequired, // Selected = cloneItem.Selected, // TotalCost = cloneItem.TotalCost, // WeightKG = cloneItem.WeightKG, // Sequence = cloneItem.Sequence, // surfaceId = cloneItem.surfaceId // }; // newItem = BusinessUtils.Create(newItem); // var buyoutSupplier = db.QuoteBuyoutSuppliers.SingleOrDefault(p => p.itemID == newItem.ParentSurfaceItemId); // if (buyoutSupplier.IsQuoteReceived()) // { // QuoteBuyoutItems_ExportToQuoteItems(buyoutSupplier.itemID); // } // return newItem; // } // return null; // } // public void QuoteBuyoutItems_ExportToQuoteItems(int buyoutSupplierId /*itemID*/) // { // var userId = db.User.Id; // /* // any item on the Buyout that has a value in Available greater than 0 // and that has an amount in Cost Price greater than 0 // must pull through to the Quote Items with that Supplier Name as a new row // only push the item details to Quote Items when the Buyout Status = Quote Received // */ // var buyoutSupplier = db.QuoteBuyoutSuppliers.FirstOrDefault(p => p.itemID == buyoutSupplierId); // if (!buyoutSupplier.IsQuoteReceived()) return; // var quote = db.Quotes.SingleOrDefault(p => p.itemID == buyoutSupplier.ParentSurfaceItemId); // foreach (oQuoteBuyoutItems buyItem in xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteBuyoutItems), "isActive,ParentSurfaceItemId,QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSelected,QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityAvailable", "1," + buyoutSupplier.itemID + ",1,~>0", "", "publ_", false)) // { // oQuoteItems quoteItem = new oQuoteItems(); // foreach (oQuoteItems tmp in xData.GetTypedByCriteriaSpecific("recId", typeof(oQuoteItems), // "isActive,ParentSurfaceItemId,QuoteItems_QuoteItems_PartsMasterPartNumber,QuoteItems_QuoteItems_QuoteItemsBrand,QuoteItems_QuoteItems_QuoteItemsCondition,QuoteItems_QuoteItems_QuoteItemsSupplier", // "1," + buyoutSupplier.ParentSurfaceItemId + "," + buyItem.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber + "," + buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsBrand + "," + buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCondition + "," + buyoutSupplier.TradingName, // "", "publ_", false)) // { // quoteItem = tmp; // } // //CVH 2019-03-21 Get default margin from quote. Also calcualte selling price // foreach (oQuotes qt in xData.GetTypedByCriteriaSpecific("recId", typeof(oQuotes), "itemID", buyoutSupplier.ParentSurfaceItemId.ToString(), "", "publ_")) // { // quoteItem.QuoteItems_QuoteItems_QuoteItemsMargin = // qt.QuoteCustomerDetails_QuoteCustomerDetails_QuoteCustomerDefaultMargin // .TryParseDecimal().GetValueOrDefault(); // } // quoteItem.QuoteItems_QuoteItems_QuoteItemsLeadTime = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsLeadtime; // quoteItem.QuoteItems_QuoteItems_QuoteItemsCostPrice = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsTotalCost; // quoteItem.CalculateSellingPrice(); // quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantityAvailable = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsQuantityAvailable; // if (quoteItem.recId > 0) // { // xData.UpdateTyped("recId", quoteItem.recId.ToString(), typeof(oQuoteItems), quoteItem, "publ_", false); // } // else // { // oSurfaceItem item = new oSurfaceItem(); // item.createdBy = userId; // item.dateCreated = System.DateTime.Now; // item.isActive = true; // item.isDeleted = false; // item.surfaceId = 3058;//QuoteItems // item.recId = xData.SaveTyped("recId", typeof(oSurfaceItem), item); // quoteItem.isActive = true; // quoteItem.itemID = item.recId; // quoteItem.ParentSurfaceItemId = buyoutSupplier.ParentSurfaceItemId.GetValueOrDefault(); // quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_PartsMasterPartNumber; // quoteItem.QuoteItems_QuoteItems_QuoteItemsBrand = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsBrand; // quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsCondition; // quoteItem.QuoteItems_QuoteItems_QuoteItemsDescription = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsDescription; // quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsPartNumber; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplier = buyoutSupplier.TradingName; // quoteItem.QuoteItems_QuoteItems_QuoteItemsWeightKG = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsWeightKG; // //CVH 2019-02-18 // quoteItem.QuoteItems_QuoteItems_QuoteItemsWarehouseLocation = ""; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplierCurrency = buyoutSupplier.Currency; // //CVH 2019-01-22 Set sequence number same as buyout item sequence // quoteItem.QuoteItems_QuoteItems_QuoteItemsSequenceNumber = buyItem.QuoteBuyoutItems_QuoteBuyoutItems_QuoteBuyoutItemsSequence; // /* 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.QuoteItems_QuoteItems_QuoteItemsSupplierSequenceNumber = 4; // quoteItem.surfaceId = item.surfaceId; // quoteItem.recId = xData.SaveTyped("recId", typeof(oQuoteItems), quoteItem, "publ_", false); // } // } // BuyoutItemsExported?.Invoke(this, new BuyoutSupplierEvent { BuyoutSupplierId = buyoutSupplier.itemID, QuoteId = quote.itemID }); // // Quotes_CalcualteQuoteItemTotals(userId, quote.itemID); // } // #endregion // #region Quote Items // // CEP-33 - Quote Items (CAT List Column) // public void QuotesItems_RemoveMatchingSurplusWarehouseQuoteItems(int quoteId) // { // string supplierName = "SURPLUS WAREHOUSE"; // var masterGroups = (from qi in db.QuoteItems // where qi.isActive.Value // && qi.ParentSurfaceItemId == quoteId // && supplierName == qi.Supplier // orderby qi.CostPrice descending // group qi by qi.MasterPartNumber into grp // where grp.Count() > 1 // select grp) // .ToList(); // foreach (var group in masterGroups) // { // var nullOr0 = new int?[] { null, 0 }; // var priciest = group.OrderByDescending(p => p.CostPrice).First(); // db.QuoteItems.RemoveRange(group.Where(p => p.itemID != priciest.itemID // // item has none selected // && nullOr0.Contains(p.QuantitySelected))); // db.SaveChanges(); // } // } // /// // /// Checks for Previously Quoted Items for the Same Customer // /// // /// // /// quote.itemID // public void QuoteItems_CheckPreviouslyQuotedPrice(int quoteId) // { // var withinDate = DateTime.Now.AddMonths(-6); // var currentQuote = GetByItemID(quoteId);// db.Quotes.SingleOrDefault(p => p.itemID == quoteId); // var quoteItems = db.QuoteItems.Where(p => p.ParentSurfaceItemId == currentQuote.itemID && !(p.PriceCheckIsChecked ?? false)) // .ToList(); // if (!quoteItems.Any()) return; // //var hasChanges = new List(); // // get previously quoted items // foreach (var currentItem in quoteItems.Where(p => !p.IsCATList.Value)) // { // var prevQuotedItem = (from item in db.QuoteItems // join quote in db.vQuotes on item.ParentSurfaceItemId equals quote.itemID // where quote.IsFinalized.Value // && quote.QuoteInformation_CustomerTradingName == currentQuote.CustomerTradingName // && item.MasterPartNumber == currentItem.MasterPartNumber // && item.Condition == currentItem.Condition // && item.QuantitySelected > 0 // && quote.None_QuoteInformation_QuoteDate.Value <= currentQuote.Date.Value // && quote.itemID < currentQuote.itemID // && quote.None_QuoteInformation_QuoteDate.Value >= withinDate // orderby quote.itemID descending, // item.SellingPrice.Value descending // select new // { // QuoteDate = quote.None_QuoteInformation_QuoteDate, // QuoteNumber = quote.QuoteInformation_QuoteNumber, // QuoteItemId = item.itemID, // SellPrice = item.SellingPrice // }) // .FirstOrDefault(); // currentItem.PriceCheckCheckDate = DateTime.Now; // if (prevQuotedItem.IsNotNull()) // { // currentItem.PriceCheckIsChecked = true; // currentItem.PriceCheckNewSellPrice = prevQuotedItem.SellPrice.GetValueOrDefault(); // currentItem.PriceCheckOldSellPrice = currentItem.SellingPrice.GetValueOrDefault(); // currentItem.PriceCheckQuoteDate = prevQuotedItem.QuoteDate.GetValueOrDefault(); // currentItem.PriceCheckQuoteItemId = prevQuotedItem.QuoteItemId; // currentItem.PriceCheckQuoteNumber = prevQuotedItem.QuoteNumber; // currentItem.SellingPrice = currentItem.PriceCheckNewSellPrice.GetValueOrDefault(); // // recalculate margin // currentItem.Margin = BusinessUtils.GetMargin( // costPrice: currentItem.CostPrice, // newSellingPrice: currentItem.SellingPrice); // db.Update(currentItem); // } // } // } // /// // /// // /// // /// // /// quote.itemID // public void QuoteItems_ApplyCATListPrice(int quoteId) // { // var quoteItems = db.QuoteItems.Where(p => p.ParentSurfaceItemId == quoteId && !p.CATListCostPrice.HasValue) // .OrderBy(p => p.Sequence) // .ThenBy(p => p.MasterPartNumber) // .ThenBy(p => p.SupplierSequence) // .ThenBy(p => p.Supplier) // .ToList(); // //var addItems = new List(); // foreach (var quoteItem in quoteItems) // { // if (!quoteItem.IsCATList.Value) // //if (!"CAT".Equals(quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplier)) // { // // get highest cat list cost price for the master number and set as CatListCostPrice // var catListCostPrice = quoteItems.Where(catItem => catItem.IsCATList.Value // && quoteItem.MasterPartNumber == catItem.MasterPartNumber // // check condition? // //&& quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition == catItem.QuoteItems_QuoteItems_QuoteItemsCondition // ) // .Select(catItem => catItem.CostPrice).Max().GetValueOrDefault(); // if (catListCostPrice == 0) // { // catListCostPrice = (from p in db.QuoteItems // where p.ParentSurfaceItemId == quoteId // && p.MasterPartNumber == quoteItem.MasterPartNumber // select p) // .Select(p => p.CATListCostPrice).Max().GetValueOrDefault(); // } // quoteItem.CATListCostPrice = catListCostPrice; // db.Update(quoteItem); // } // } // } // #region CEP-93 // public List GetSupplierItems(int quoteId) // { // string query = $@" // SELECT // itemID // ,PartNumber = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber // ,SupplierName = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsSupplierName // ,Brand = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsBrand // ,Condition = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsCondition // ,Available = ISNULL(SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsAvailability, 0) // ,Price = ISNULL(SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsSalesPrice, 0) // ,Currency = CASE // WHEN SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsCurrency = '' // THEN 'ZAR' // ELSE SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsCurrency // END // ,Note = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsNote // FROM publ_SupplierPricelistParts // WHERE // 'Current' = SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPricelistStatus // AND SupplierPricelistParts_SupplierPricelistParts_SupplierPricelistPartsPartNumber IN ( // SELECT DISTINCT(QuoteItems_QuoteItems_QuoteItemsPartNumber) // FROM publ_QuoteItems // WHERE ParentSurfaceItemId = {quoteId} // )"; // var result = db.Database.SqlQuery(query).ToList(); // return result; // } // public void QuoteItems_RefreshCostPriceAndAvailability(int quoteId) // { // // fetch all buyout suppliers in quote // var buyoutSuppliers = db.QuoteBuyoutSuppliers // .Where(p => // p.isActive.Value // && p.ParentSurfaceItemId == quoteId // ).ToList(); // // fetch all buyout items from all suppliers // var buyoutSupplierIds = buyoutSuppliers.Select(p => p.itemID).ToArray(); // var buyoutItems = db.QuoteBuyoutItems // .Where(p => buyoutSupplierIds.Contains(p.ParentSurfaceItemId.Value)) // .ToList(); // // fetch quote items // var quoteItems = db.QuoteItems.Where(p => // p.isActive.Value // && p.ParentSurfaceItemId == quoteId // && "CAT" != p.Supplier) // .ToList(); // // fetch all supplier items where part number is in quote // List priceListItems = GetSupplierItems(quoteId); // quoteItems.ForEach(quoteItem => // { // var buyoutSupplier = buyoutSuppliers.FirstOrDefault(p => // p.TradingName // == quoteItem.Supplier); // var lineItem = priceListItems.FirstOrDefault(p => p.Equals(quoteItem)); // if (lineItem.IsNotNull()) // { // var costPrice = BusinessUtils.ApplyExchangeRate( // lineItem.Price, // lineItem.Currency); // var availability = lineItem.Available; // if (buyoutSupplier.IsNotNull()) // { // var buyoutItem = buyoutItems.FirstOrDefault(p => // p.MasterPartNumber == quoteItem.MasterPartNumber // && p.PartNumber == quoteItem.PartNumber // && p.Brand == quoteItem.Brand // && p.Condition == quoteItem.Condition // && p.ParentSurfaceItemId == buyoutSupplier.itemID); // if (buyoutItem.IsNotNull()) // { // if (availability != buyoutItem.QuantityAvailable.GetValueOrDefault() // || costPrice != buyoutItem.CostPriceZAR.GetValueOrDefault()) // { // buyoutItem.CostPriceZAR = costPrice; // buyoutItem.QuantityAvailable = availability; // var supplierRate = buyoutSupplier.ExchangeRate // .GetValueOrDefault(); // if (supplierRate > 0) // { // buyoutItem.CostPriceForex // = costPrice / supplierRate; // } // // this method will do additional calculations and save the buyout item // // and the related quote item // QuoteBuyoutItem_Recalculate(buyoutItem, buyoutSupplier: buyoutSupplier); // } // } // } // else // CEP Inventory Item // { // // update if any differences // if (availability != quoteItem.QuantityAvailable.GetValueOrDefault() // || costPrice != quoteItem.CostPrice.GetValueOrDefault()) // { // quoteItem.QuantityAvailable = availability; // quoteItem.CostPrice = costPrice; // // update margin based on cost and selling prices // quoteItem.Margin = BusinessUtils.GetMargin( // costPrice: quoteItem.CostPrice, // newSellingPrice: quoteItem.SellingPrice); // BusinessUtils.Update(quoteItem); // } // } // } // }); // } // #endregion // public void QuoteItems_FixSorting(int quoteId/*quote.itemID*/) // { // var masterNumbers = (from p in db.QuoteRequestItems.GetByParentId(quoteId) // where p.ParentSurfaceItemId == quoteId // orderby p.Sequence // select p.MasterNumber) // .Distinct() // .ToList(); // var quoteItems = db.QuoteItems.GetByParentId(quoteId) // .OrderBy(p => p.Sequence) // .ThenBy(p => p.MasterPartNumber) // .ThenBy(p => p.SupplierSequence) // .ThenBy(p => p.Supplier) // .ToList(); // List items = new List(); // masterNumbers.ForEach(p => // { // items.AddRange(from q in quoteItems where q.MasterPartNumber == p select q); // }); // } // public QuoteItem QuoteItems_Recalculate(QuoteItem quoteItem) // { // var stored = db.QuoteItems.Find(quoteItem.recId); // bool marginChanged = stored.Margin // != quoteItem.Margin; // bool sellingPriceChanged = stored.SellingPrice // != quoteItem.SellingPrice; // if (marginChanged) // { // // set new margin // stored.Margin = // quoteItem.Margin; // // calculate new selling price // stored.SellingPrice = // BusinessUtils.GetSellingPrice( // costPrice: stored.CostPrice, // newMargin: quoteItem.Margin); // } // else if (sellingPriceChanged) // { // // set new selling price // stored.SellingPrice = // quoteItem.SellingPrice; // // calculate new margin // stored.Margin = // BusinessUtils.GetMargin( // costPrice: stored.CostPrice, // newSellingPrice: quoteItem.SellingPrice); // } // stored.QuantitySelected = // quoteItem.QuantitySelected; // db.SaveChanges(); // return db.QuoteItems.Find(quoteItem.recId); // } // #endregion // #region Quote Items Final // public void QuoteFinalItems_Refresh(int quoteId) // { // try // { // int updates = 0; // // Gather Request Items // var requestItems = db.QuoteRequestItems.GetByParentId(quoteId) // .OrderBy(p => p.Sequence) // .Select(p => new // { // p.itemID, // ParentSurfaceItemId = p.ParentSurfaceItemId ?? 0, // AdditionalDescription = p.AdditionalDescription, // Description = p.Description, // Sequence = p.Sequence ?? 0, // MasterNumber = p.MasterNumber, // PartNumber = p.PartNumber, // QuantityOutstanding = p.QuantityOutstanding ?? 0, // QuantityRequired = p.QuantityRequired ?? 0, // QuantitySelected = p.QuantitySelected ?? 0, // WeightKG = p.WeightKG ?? 0m // }).ToList(); // // Gather Final Items // var finalItems = db.QuoteItemsFinal.GetByParentId(quoteId).ToList(); // // Gather Buyout Suppliers // var buyoutSuppliers = db.QuoteBuyoutSuppliers.GetByParentId(quoteId) // .Select(p => new // { // p.itemID, // ParentSurfaceItemId = p.ParentSurfaceItemId ?? 0, // // set value to zar if empty // Currency = (p.Currency ?? "ZAR") == "" // ? "ZAR" : (p.Currency ?? "ZAR"), // ExchangeRate = p.ExchangeRate ?? 0m, // Supplier = p.TradingName, // }).ToList(); // // Gather Buyout Items from all Buyout Suppliers in Quote // var buyoutSupplierIds = buyoutSuppliers.Select(p => p.itemID).ToList(); // var buyoutItems = db.QuoteBuyoutItems.Where(p => p.isActive.Value && buyoutSupplierIds.Contains(p.ParentSurfaceItemId.Value)) // .Select(p => new // { // p.itemID, // ParentSurfaceItemId = p.ParentSurfaceItemId ?? 0, // MasterNumber = p.MasterPartNumber, // Brand = p.Brand, // Condition = p.Condition, // CostPriceForex = p.CostPriceForex ?? 0m, // CostPriceZAR = p.CostPriceZAR ?? 0m, // Discount = p.Discount ?? 0m, // PartNumber = p.PartNumber, // }).ToList(); // //Gather Quote Items // var requestMasterNumbers = requestItems.Select(p => p.MasterNumber).ToList(); // var quoteItems = db.QuoteItems.GetByParentId(quoteId) // .Where(p => // p.QuantitySelected.Value > 0 // && !p.IsCATList.Value // ).Select(p => new // { // p.itemID, // ParentSurfaceItemId = p.ParentSurfaceItemId ?? 0, // UniqueNumber = p.UniqueNumber, // MasterNumber = p.MasterPartNumber, // BinLocation = p.BinLocation, // Brand = p.Brand, // Category = p.Category, // Condition = p.Condition, // CostPrice = p.CostPrice ?? 0m, // Description = p.Description, // LeadTime = p.LeadTime, // Margin = p.Margin ?? 0m, // MinorCode = p.MinorCode, // PartNumber = p.PartNumber, // QuantityAvailable = p.QuantityAvailable ?? 0, // QuantitySelected = p.QuantitySelected ?? 0, // SellingPrice = p.SellingPrice ?? 0m, // Sequence = p.Sequence, // Subcategory = p.Subcategory, // Supplier = p.Supplier, // // set value to zar if empty // Currency = (p.SupplierCurrency ?? "ZAR") == "" // ? "ZAR" : (p.SupplierCurrency ?? "ZAR"), // SupplierSequence = p.SupplierSequence, // WarehouseLocation = p.WarehouseLocation, // WeightKG = p.WeightKG ?? 0m, // }).ToList() // .OrderBy(p => requestMasterNumbers.IndexOf(p.MasterNumber)) // .ThenBy(p => p.SupplierSequence) // .ThenBy(p => p.Supplier) // .ToList(); // //foreach (var quoteItem in quoteItems) // //{ // // int quantityToMatch = quoteItem.QuantitySelected; // // Dictionary reqQtyMatches = new Dictionary(); // // // still don't know what this loop is for // // foreach (var requestItem in requestItems) // // { // // if (quantityToMatch > 0) // // { // // if (quantityToMatch >= requestItem.QuantitySelected) // // { // // reqQtyMatches[requestItem.itemID] = requestItem.QuantitySelected; // // quantityToMatch -= requestItem.QuantitySelected; // // requestItem.QuantitySelected = 0; // // } // // else // // { // // reqQtyMatches[requestItem.itemID] = quantityToMatch; // // requestItem.QuantitySelected -= quantityToMatch; // // quantityToMatch = 0; // // } // // } // // } // //} // HashSet updatedFinalItems = new HashSet(); // var finalItemIndex = 1; // foreach (var requestItem in requestItems) // { // var qItems = quoteItems.Where(p => // p.MasterNumber == requestItem.MasterNumber // && p.Sequence == requestItem.Sequence // ).ToList(); // foreach (var quoteItem in qItems) // { // var finalItem = finalItems.FirstOrDefault(p => p.QuoteItemsLink == quoteItem.itemID) // ?? new QuoteItemsFinal() // { // Status = true, // isActive = true, // ParentSurfaceItemId = quoteId, // QuoteItemsLink = quoteItem.itemID // }; // // TODO: we using this field? // finalItem.DimensionalDescription = string.Empty; // finalItem.Sequence = finalItemIndex++; // // fill or update from requestItem // finalItem.AdditionalDescription = requestItem.AdditionalDescription; // finalItem.QuantityRequired = requestItem.QuantitySelected; // // fill or update from quoteItem // finalItem.Brand = quoteItem.Brand; // finalItem.Category = quoteItem.Category; // finalItem.Condition = quoteItem.Condition; // finalItem.Description = quoteItem.Description; // finalItem.LeadTime = quoteItem.LeadTime; // finalItem.MasterPartNumber = quoteItem.MasterNumber; // finalItem.MinorCode = quoteItem.MinorCode; // finalItem.PartNumber = requestItem.PartNumber; // finalItem.SubCategory = quoteItem.Subcategory; // finalItem.TotalPriceZAR = quoteItem.SellingPrice * quoteItem.QuantitySelected; // finalItem.UniqueNumber = quoteItem.UniqueNumber; // finalItem.UnitPriceZAR = quoteItem.SellingPrice; // finalItem.WeightKG = quoteItem.WeightKG; // finalItem.QuoteItemsLink = quoteItem.itemID; // finalItem.Supplier = quoteItem.Supplier; // finalItem.Location = quoteItem.BinLocation; // finalItem.WarehouseLocation = quoteItem.WarehouseLocation; // finalItem.QuantityAvailable = quoteItem.QuantitySelected; // //(quoteItem.QuantitySelected >= requestItem.QuantitySelected) // //? quoteItem.QuantitySelected - requestItem.QuantitySelected // //: requestItem.QuantitySelected - quoteItem.QuantitySelected; // /* // * CostPrizeZAR and CostPrizeForex // * // - Items coming from INVENTORY have a Cost in Quote Items...that’s the actual cost. // - For Local Buyouts Forex will also be 0. // - But for Overseas Buyouts both the ZAR and Forex to be populated. // - The Purchase Order will use the field relevant to the Supplier currency BUT, // we need both for later reporting. // */ // var buyoutSupplier = buyoutSuppliers.FirstOrDefault(p => p.Supplier == quoteItem.Supplier); // // set value from quoteItem // finalItem.CostPriceZAR = quoteItem.CostPrice; // if (buyoutSupplier.IsNotNull()) // { // var buyoutItem = buyoutItems.FirstOrDefault(p => // p.ParentSurfaceItemId == buyoutSupplier.itemID // && quoteItem.MasterNumber == p.MasterNumber // && quoteItem.PartNumber == p.PartNumber // && quoteItem.Brand == p.Brand // && quoteItem.Condition == p.Condition // ); // finalItem.ExchangeRate = buyoutSupplier.ExchangeRate; // if (buyoutItem.IsNotNull()) // { // // set values from buyout supplier and item // finalItem.CostPriceZAR = buyoutItem.CostPriceZAR - buyoutItem.Discount; // // Overseas Buyouts both the ZAR and Forex to be populated // if (!"ZAR".EqualsIgnoreCase(buyoutSupplier.Currency)) // { // finalItem.CostPriceFOREX = buyoutItem.CostPriceForex - buyoutItem.Discount; // } // } // } // finalItem = BusinessUtils.Upsert(finalItem); // updates++; // updatedFinalItems.Add(finalItem.itemID); // } // } // var excludedFinalItems = finalItems.Where(p => !updatedFinalItems.Contains(p.itemID)); // // delete existing final items which related quote item is not selected // // (quoteItem.SelectedQuantity <= 0) // if (excludedFinalItems.Any()) // { // foreach (var finalItem in excludedFinalItems) // { // db.Delete(finalItem); // updates++; // } // } // //if (updates > 0) // //{ // // QuoteItemsFinal_CalcualteTotals(quoteId); // //} // this.QuoteFinalRefreshed?.Invoke(this, new QuoteEvent { QuoteId = quoteId }); // } // catch (Exception ex) // { // // handle exception // BusinessUtils.HandleException(ex); // throw; // } // } // public bool QuoteItemsFinal_UpdateStatus(int itemId, bool status) // { // var entity = db.QuoteItemsFinal.FirstOrDefault(p => p.itemID == itemId); // bool result = false; // if (entity.IsNotNull() && entity.Status != status) // { // entity.Status = status; // result = db.SaveChanges() > 0; // } // //if (result) // //{ // // QuoteItemsFinal_CalcualteTotals(userId, entity.ParentSurfaceItemId.Value); // //} // return result; // } // public QuoteItemsFinalTotals QuoteItemsFinal_CalcualteTotals(int quoteId) // { // var totals = new QuoteItemsFinalTotals(0); // try // { // var quote = db.Quotes.FirstOrDefault(p => p.itemID == quoteId); // if (quote.IsNull()) return null; // // customer set vat rate // var vatRate = GetVATRate(quote); // totals = new QuoteItemsFinalTotals(vatRate); // //recalculate totals // var finalItems = db.QuoteItemsFinal.Where(p => p.isActive.Value && p.ParentSurfaceItemId == quoteId && p.Status); // foreach (var f in finalItems) // { // int quantity = f.QuantityRequired.GetValueOrDefault(); // if (quantity < 0) quantity = 0; // totals.WeightKG += f.WeightKG.GetValueOrDefault() * (decimal)quantity; // totals.VATExcluded += f.TotalPriceZAR.GetValueOrDefault(); // } // quote.FinalTotalWeightKG = totals.WeightKG; // quote.FinalSubtotalexclVAT = totals.VATExcluded; // quote.FinalVAT = totals.VAT; // quote.FinalTotalinclVAT = totals.VATIncluded; // BusinessUtils.Update(quote); // } // catch (Exception ex) // { // BusinessUtils.HandleException(ex); // throw; // } // return totals; // } // public Dictionary> QuoteItemsFinal_GetByQuote(int quoteId) // { // return db.QuoteItemsFinal // .Where(p => // p.isActive.Value // && p.ParentSurfaceItemId == quoteId // ).GroupBy(p => p.Supplier).OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.ToList()); // } // #endregion // #region Quote Request Items // public IQueryable QuoteRequestItems_Recalculate(int quoteId, string masterNumber) // { // return new RequestItemsCalculator(new QuoteRepository()).Execute(quoteId, masterNumber); // } // #endregion // #region Quotes // public QuoteItemsTotals Quotes_CalcualteQuoteItemTotals(int quoteId /*itemID*/) // { // var totals = new QuoteItemsTotals(0); // try // { // var setup = db.Setup; // var quote = db.Quotes.FirstOrDefault(p => p.itemID == quoteId); // if (quote.IsNull()) return null; // // customer set vat rate // var vatRate = GetVATRate(quote); // totals = new QuoteItemsTotals(vatRate); // var quoteItems = db.QuoteItems // .Where(p => // p.isActive.Value // && p.ParentSurfaceItemId == quote.itemID // && p.QuantitySelected > 0 // ) // .ToList(); // foreach (QuoteItem quoteItem in quoteItems) // { // int quantity = quoteItem.QuantitySelected.GetValueOrDefault(); // if (quantity < 0) quantity = 0; // var sellingPrice = quoteItem.SellingPrice.GetValueOrDefault(); // var costPrice = quoteItem.CostPrice.GetValueOrDefault(); // var weightKG = quoteItem.WeightKG.GetValueOrDefault(); // totals.WeightKG += weightKG * (decimal)quantity; // totals.Cost += costPrice * (decimal)quantity; // totals.GrossProfit += (sellingPrice - costPrice) * (decimal)quantity; // totals.VATExcluded += sellingPrice * (decimal)quantity; // } // quote.ItemsTotalWeightKG = totals.WeightKG; // quote.ItemsTotalCost = totals.Cost; // quote.ItemsTotalMargin = totals.Margin; // quote.ItemsGrossProfit = totals.GrossProfit; // quote.ItemsSubtotalexclVAT = totals.VATExcluded; // quote.ItemsVAT = totals.VAT; // quote.ItemsTotalinclVAT = totals.VATIncluded; // db.SaveChanges(); // } // catch (Exception ex) // { // BusinessUtils.HandleException(ex); // throw; // } // return totals; // } // #endregion // #region private methods // private Quote GetByItemID(int itemId) // { // return db.Quotes.GetFirstByItemId(itemId); // } // #endregion // } //}