using CAPI.Custom.Entities; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CAPI.Custom.Data { public static class DbSetSurfaceItemExtensions { public static TSurfaceItem GetFirstByItemId(this DbSet dbSet, int itemId) where TSurfaceItem : class, ISurfaceEntity { return dbSet.FirstOrDefault(p => p.itemID == itemId); } /// /// Returns collection so projection can be applied. /// /// /// /// /// public static IQueryable GetByItemId(this DbSet dbSet, int itemId) where TSurfaceItem : class, ISurfaceEntity { return dbSet.Where(p => p.itemID == itemId); } /// /// Gets Active Child Surface Items /// /// /// /// /// public static IQueryable GetByParentId(this DbSet dbSet, int parentItemId) where TSurfaceItem : class, ISurfaceChildEntity { return dbSet.Where(p => p.isActive.Value && p.ParentSurfaceItemId == parentItemId); } public static IQueryable GetQueryItemByParentId(this DbSet dbSet, int parentItemId) where TChildQueryItem : class, ISurfaceQueryChildEntity { return dbSet.Where(p => p.isActive.Value && p.ParentSurfaceItemId == parentItemId.ToString()); } public static TEntity Create(this TEntity entity) where TEntity : class { return QuotesContext.Create().Create(entity); } public static TEntity Update(this TEntity entity) where TEntity : class { return QuotesContext.Create().Update(entity); } public static int Delete(this TEntity entity) where TEntity : class { return QuotesContext.Create().Delete(entity); } } // public static class EntityExtensions //{ // static object _lock = new object(); // static SurfaceLookup _quoteReceivedStatus; // static SurfaceLookup QuoteReceivedStatus // { // get // { // if (_quoteReceivedStatus.IsNull()) // { // lock (_lock) // { // using (var db = new QuotesContext()) // { // _quoteReceivedStatus = db.GetBuyoutStatusesQuoteReceived(); // } // } // } // return _quoteReceivedStatus; // } // } // public static bool IsQuoteReceived(this QuoteBuyoutSupplier entity) // { // return QuoteReceivedStatus.recId.Equals(entity.QuoteBuyoutSuppliers_QuoteBuyoutSuppliers_QuoteBuyoutSupplierStatus); // } // public static QuoteBuyoutSupplier GetParent(this QuoteBuyoutItem entity, QuotesContext context = null) // { // if (context.IsNull()) // { // context = new QuotesContext(); // } // return context.QuoteBuyoutSuppliers.SingleOrDefault(p => p.itemID == entity.ParentSurfaceItemId); // } // #region QuoteRequestItem // public static bool MasterOrPartNumbersMatch(this QuoteRequestItem requestItem, QuoteItem quoteItem) // { // bool masterMatches = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber == quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber; // bool partMatches = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber == quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber; // return masterMatches || partMatches; // } // #endregion // #region QuoteItemsFinal // //public static QuoteItemsFinal MapFromQuoteAndRequestItems(this QuoteItemsFinal finalItem, int quoteId, QuoteRequestItem requestItem, QuoteItem quoteItem) // //{ // // decimal totalPrizeZAR = quoteItem.QuoteItems_QuoteItems_QuoteItemsSellingPrice.GetValueOrDefault() // // * quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected.GetValueOrDefault(); // // //Ref: "QuoteItemsFinal"."AdditionalDescription" < "QuoteRequestItem"."AdditionalDescription" // // //Ref: "QuoteItemsFinal"."Brand" < "QuoteItem"."Brand" // // //Ref: "QuoteItemsFinal"."Category" < "QuoteItem"."Category" // // //Ref: "QuoteItemsFinal"."Condition" < "QuoteItem"."Condition" // // //Ref: "QuoteItemsFinal"."Description" < "QuoteItem"."Description" // // //Ref: "QuoteItemsFinal"."LeadTime" < "QuoteItem"."LeadTime" // // //Ref: "QuoteItemsFinal"."Location" < "QuoteItem"."BinLocation" // // //Ref: "QuoteItemsFinal"."MasterPartNumber" < "QuoteItem"."PartsMasterPartNumber" // // //Ref: "QuoteItemsFinal"."MinorCode" < "QuoteItem"."MinorCode" // // //Ref: "QuoteItemsFinal"."PartNumber" < "QuoteItem"."PartNumber" // // //Ref: "QuoteItemsFinal"."QuantityAvailable" < "QuoteItem"."QuantityAvailable" // // //Ref: "QuoteItemsFinal"."QuoteItemsLink" < "QuoteItem"."ItemID" // // //Ref: "QuoteItemsFinal"."SubCategory" < "QuoteItem"."Subcategory" // // //Ref: "QuoteItemsFinal"."Supplier" < "QuoteItem"."Supplier" // // //Ref: "QuoteItemsFinal"."UniqueNumber" < "QuoteItem"."InventoryItemsUniqueNumber" // // //Ref: "QuoteItemsFinal"."UnitPriceZAR" < "QuoteItem"."SellingPrice" // // //Ref: "QuoteItemsFinal"."WeightKG" < "QuoteItem"."WeightKG" // // //Ref: "QuoteItemsFinal"."SequenceNumber" < "QuoteRequestItem"."ItemSequence" // // if (finalItem.IsNew) // // { // // finalItem.isActive = true; // // finalItem.ParentSurfaceItemId = quoteId; // // finalItem.Status = true; // // } // // // TODO: // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalAdditionalDescription = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsAdditionalDescription; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalBrand = quoteItem.QuoteItems_QuoteItems_QuoteItemsBrand; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalCategory = quoteItem.QuoteItems_QuoteItems_QuoteItemsCategory; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalCondition = quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDescription = quoteItem.QuoteItems_QuoteItems_QuoteItemsDescription; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDimensionalDescription = string.Empty; //TODO // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalLeadTime = quoteItem.QuoteItems_QuoteItems_QuoteItemsLeadTime; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalMasterPartNumber = quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalMinorCode = quoteItem.QuoteItems_QuoteItems_QuoteItemsMinorCode; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalPartNumber = quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantityAvailable.GetValueOrDefault(); // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityRequired = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected.GetValueOrDefault(); // // //QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityRequired = reqMatch.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsQuantityRequired; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalSequenceNumber = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence.GetValueOrDefault(); // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalSubCategory = quoteItem.QuoteItems_QuoteItems_QuoteItemsSubcategory; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalTotalPriceZAR = totalPrizeZAR; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUniqueNumber = quoteItem.QuoteItems_QuoteItems_InventoryItemsUniqueNumber; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUnitPriceZAR = quoteItem.QuoteItems_QuoteItems_QuoteItemsSellingPrice.GetValueOrDefault(); // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalWeightKG = quoteItem.QuoteItems_QuoteItems_QuoteItemsWeightKG.GetValueOrDefault(); // // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsLink = quoteItem.itemID; // // finalItem.Supplier = quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplier; // // finalItem.QuoteItemsFinal_QuoteItemsFinal_InvoicedQty = 0; // // finalItem.Location = quoteItem.QuoteItems_QuoteItems_QuoteItemsBinLocation.NullOrEmptyCoalesce(quoteItem.QuoteItems_QuoteItems_QuoteItemsWarehouseLocation); // // return finalItem; // //} // /// // /// Map RequestItem properties to FinalItem // /// // /// // /// // /// // public static QuoteItemsFinal FillFrom(this QuoteItemsFinal finalItem, QuoteRequestItem requestItem) // { // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalAdditionalDescription = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsAdditionalDescription; // // TODO: we using this field? // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDimensionalDescription = string.Empty; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalSequenceNumber = requestItem.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsItemSequence.GetValueOrDefault(); // return finalItem; // } // /// // /// Map QuoteItem properties to FinalItem // /// // /// // /// // /// // public static QuoteItemsFinal FillFrom(this QuoteItemsFinal finalItem, QuoteItem quoteItem) // { // decimal totalPrizeZAR = quoteItem.QuoteItems_QuoteItems_QuoteItemsSellingPrice.GetValueOrDefault() // * quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected.GetValueOrDefault(); // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalBrand = quoteItem.QuoteItems_QuoteItems_QuoteItemsBrand; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalCategory = quoteItem.QuoteItems_QuoteItems_QuoteItemsCategory; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalCondition = quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDescription = quoteItem.QuoteItems_QuoteItems_QuoteItemsDescription; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalDimensionalDescription = string.Empty; //TODO // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalLeadTime = quoteItem.QuoteItems_QuoteItems_QuoteItemsLeadTime; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalMasterPartNumber = quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalMinorCode = quoteItem.QuoteItems_QuoteItems_QuoteItemsMinorCode; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalPartNumber = quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityAvailable = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantityAvailable.GetValueOrDefault(); // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalQuantityRequired = quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected.GetValueOrDefault(); // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalSubCategory = quoteItem.QuoteItems_QuoteItems_QuoteItemsSubcategory; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalTotalPriceZAR = totalPrizeZAR; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUniqueNumber = quoteItem.QuoteItems_QuoteItems_InventoryItemsUniqueNumber; // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalUnitPriceZAR = quoteItem.QuoteItems_QuoteItems_QuoteItemsSellingPrice.GetValueOrDefault(); // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsFinalWeightKG = quoteItem.QuoteItems_QuoteItems_QuoteItemsWeightKG.GetValueOrDefault(); // finalItem.QuoteItemsFinal_QuoteItemsFinal_QuoteItemsLink = quoteItem.itemID; // finalItem.Supplier = quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplier; // finalItem.Location = quoteItem.QuoteItems_QuoteItems_QuoteItemsBinLocation.NullOrEmptyCoalesce(quoteItem.QuoteItems_QuoteItems_QuoteItemsWarehouseLocation); // finalItem.WarehouseLocation = quoteItem.QuoteItems_QuoteItems_QuoteItemsWarehouseLocation; // return finalItem; // } // public static QuoteItem FillFrom(this QuoteItem quoteItem, InventoryItemResult inventoryItem) // { // //quoteItem.ParentSurfaceItemId = quoteId; // quoteItem.QuoteItems_QuoteItems_InventoryItemsUniqueNumber = inventoryItem.UniqueNumber; // quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber = inventoryItem.MasterNumber; // quoteItem.QuoteItems_QuoteItems_QuoteItemsBinLocation = inventoryItem.BinLocation; // quoteItem.QuoteItems_QuoteItems_QuoteItemsBrand = inventoryItem.Brand; // quoteItem.QuoteItems_QuoteItems_QuoteItemsCategory = inventoryItem.Category; // quoteItem.QuoteItems_QuoteItems_QuoteItemsCondition = inventoryItem.Condition; // quoteItem.QuoteItems_QuoteItems_QuoteItemsCostPrice = inventoryItem.AverageCost; // quoteItem.QuoteItems_QuoteItems_QuoteItemsDescription = inventoryItem.Description; // quoteItem.QuoteItems_QuoteItems_QuoteItemsLeadTime = "STOCK"; // //quoteItem.QuoteItems_QuoteItems_QuoteItemsMargin = margin; // quoteItem.QuoteItems_QuoteItems_QuoteItemsMinorCode = inventoryItem.MinorCode; // quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber = inventoryItem.PartNumber; // quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantityAvailable = inventoryItem.Available; // quoteItem.QuoteItems_QuoteItems_QuoteItemsQuantitySelected = 0; // //quoteItem.QuoteItems_QuoteItems_QuoteItemsSellingPrice = sellingPrice; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSequenceNumber = 0; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSubcategory = inventoryItem.SubCategory; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplier = "INVENTORY"; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplierCurrency = "ZAR"; // quoteItem.QuoteItems_QuoteItems_QuoteItemsSupplierSequenceNumber = 0; // quoteItem.QuoteItems_QuoteItems_QuoteItemsWarehouseLocation = inventoryItem.WarehouseLocation; // quoteItem.QuoteItems_QuoteItems_QuoteItemsWeightKG = inventoryItem.WeightKG; // return quoteItem; // } // public static QuoteRequestItem GetMatchingRequestItem(this QuoteItem quoteItem, IEnumerable requestItems) // { // return requestItems.Where(p => // p.isActive.Value // && (quoteItem.QuoteItems_QuoteItems_PartsMasterPartNumber == // p.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsMasterNumber // || quoteItem.QuoteItems_QuoteItems_QuoteItemsPartNumber == // p.QuoteRequestItems_QuoteRequestItems_QuoteRequestItemsPartNumber) // ).OrderByDescending(p => p.recId) // .FirstOrDefault(); // } // #endregion // } /// /// Updates InventoryItem /// public static class QuotesContextExtensions { public static InventoryItem UpdateTotalsFromManagementItems(this QuotesContext db, InventoryItem item, bool saveChanges = false) { var childItems = db.InventoryManagement.GetByParentId(item.itemID).ToList(); if (childItems.Any()) { foreach (var cItem in childItems) { cItem.Available = cItem.OnHand.GetValueOrDefault() - cItem.Committed.GetValueOrDefault(); } item.AverageCost = childItems.Average(p => p.AverageUnitCost ?? 0m); item.TotalAvailable = childItems.Sum(p => p.Available ?? 0); item.TotalCommitted = childItems.Sum(p => p.Committed ?? 0); item.TotalOnHand = childItems.Sum(p => p.OnHand ?? 0); item.TotalOnOrder = childItems.Sum(p => p.OnOrder ?? 0); item.TotalAvailable = item.TotalOnHand.GetValueOrDefault() - item.TotalCommitted.GetValueOrDefault(); item.TotalValue = item.TotalOnHand.GetValueOrDefault() * item.AverageCost.GetValueOrDefault(); } if (saveChanges) db.SaveChanges(); return item; } public static PartsMaster UpdateTotalAvailableFromInventoryItems(this QuotesContext db, PartsMaster partMaster, bool saveChanges = false) { var inventoryItems = db.InventoryItems.GetByParentId(partMaster.itemID).ToList(); if (inventoryItems.Any()) { foreach(var item in inventoryItems) { db.UpdateTotalsFromManagementItems(item, saveChanges); } partMaster.TotalAvailable = inventoryItems.Sum(p => p.TotalAvailable ?? 0); } else { partMaster.TotalAvailable = 0; } if (saveChanges) db.SaveChanges(); return partMaster; } } }