Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 public SalesSearchSnapshot UpdateData(SalesSearchSnapshot salesSearchSnapshot)
 {
     return(BuildSalesSearchSnapshot(salesSearchSnapshot.StartDate, salesSearchSnapshot.EndDate, salesSearchSnapshot.InvoiceStatuses.Where(x => x.Checked).Select(x => x.Key), salesSearchSnapshot.Search));
 }