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