//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
// }
//}