/// <summary> /// Builds the sales snapshot /// </summary> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <param name="invoiceStatuses"></param> /// <param name="search"></param> /// <returns></returns> private SalesSearchSnapshot BuildSalesSearchSnapshot(DateTime startDate, DateTime endDate, IEnumerable <Guid> invoiceStatuses, string search) { // Get all the statuses var statuses = AllStatuses(); // Loop and set selected statuses foreach (var status in statuses) { if (invoiceStatuses.Contains(status.Key)) { status.Checked = true; } } // Get the SQL var sql = ReportSqlHelper.SalesByItem.GetSaleSearchSql(startDate, endDate, invoiceStatuses, search); // Execure the SQL var results = ApplicationContext.DatabaseContext.Database.Query <SaleItem>(sql).ToList(); // Group results by the product key var groupedResults = results.GroupBy(x => x.ExtendedData.GetProductKey()); // List of ProductLineItem to add var ProductLineItemList = new List <ProductLineItem>(); var currencySymbol = this.ActiveCurrencies.FirstOrDefault(); // Loop each product foreach (var productGroup in groupedResults) { // We do a try as the product may be deleted and not exist anymore try { // Get the base/master product (We need it for the name) var product = _merchello.Query.Product.GetByKey(productGroup.Key); if (product != null) { var productLineItem = new ProductLineItem { Name = product.Name, Quantity = productGroup.Sum(x => x.Quantity), Variants = new List <ProductLineItem>(), CurrencySymbol = currencySymbol.Symbol }; // Get the correct total decimal productGroupTotal = 0; foreach (var p in productGroup) { productGroupTotal += p.Price * p.Quantity; } productLineItem.Total = productGroupTotal; foreach (var variants in productGroup.GroupBy(x => x.Name)) { var variantLineItem = new ProductLineItem { Name = variants.FirstOrDefault().Name, Quantity = variants.Sum(x => x.Quantity), CurrencySymbol = currencySymbol.Symbol }; // Get the correct total decimal productVariantTotal = 0; foreach (var v in variants) { productVariantTotal += v.Price * v.Quantity; } variantLineItem.Total = productVariantTotal; productLineItem.Variants.Add(variantLineItem); } if (productLineItem.Variants.Count() == 1) { if (productLineItem.Variants.FirstOrDefault().Name == product.Name) { // Same as base product so clear productLineItem.Variants.Clear(); } } ProductLineItemList.Add(productLineItem); } } catch (Exception ex) { MultiLogHelper.Error <SalesSearchReportApiController>("Error in BuildSalesSearchSnapshot", ex); } } // Make final model var salesSearchSnapshot = new SalesSearchSnapshot { EndDate = endDate, Search = search, StartDate = startDate, InvoiceStatuses = statuses, Products = ProductLineItemList.OrderByDescending(x => x.Total) }; // return return(salesSearchSnapshot); }
public SalesSearchSnapshot UpdateData(SalesSearchSnapshot salesSearchSnapshot) { return(BuildSalesSearchSnapshot(salesSearchSnapshot.StartDate, salesSearchSnapshot.EndDate, salesSearchSnapshot.InvoiceStatuses.Where(x => x.Checked).Select(x => x.Key), salesSearchSnapshot.Search)); }