Exemple #1
0
        private void UpsertDailyProductReport(
            string productDetailId,
            ReportParameterBase reportParameterBase,
            List <IGrouping <string, SaleDetail> > saleDetailsGrouped,
            List <IGrouping <string, PurchaseDetail> > purchaseDetailsGrouped,
            List <ProductDetail> productDetails,
            List <ProductCategory> categories)
        {
            ProductReportParameter parameter = new ProductReportParameter(
                reportParameterBase.Date,
                reportParameterBase.Value,
                reportParameterBase.ReportShopId);

            parameter.StartingQuantity = this.GetPrevious(parameter);

            var sold = saleDetailsGrouped.Exists(x => x.Key == productDetailId)
                           ? saleDetailsGrouped.First(x => x.Key == productDetailId).ToList()
                           : new List <SaleDetail>();
            var purchased = purchaseDetailsGrouped.Exists(x => x.Key == productDetailId)
                                ? purchaseDetailsGrouped.First(x => x.Key == productDetailId).ToList()
                                : new List <PurchaseDetail>();

            T   productDetail = productDetails.First(x => x.Id == productDetailId);
            var category      = categories.First(x => x.Id == productDetail.ProductCategoryId);
            var productReport = this.CreateModel(parameter, category, productDetail, purchased, sold);

            Console.WriteLine(
                $"Model saving - {productReport.Date} and product {productReport.ProductDetailName} and SaleQuantity {productReport.QuantitySaleToday}");
            this.SaveReport(productReport);
        }
Exemple #2
0
        private void ProcessShopClose(string shopId, IGrouping <int?, T> dailyGrouped)
        {
            if (dailyGrouped.Any())
            {
                var      year = dailyGrouped.First().Modified.Year;
                DateTime date = new DateTime(year, 1, 1).AddDays(dailyGrouped.Key.Value - 1);
                Console.WriteLine($"Processing {date.ToString("dd-MMMM-yyyy")}");
                ReportParameterBase p = new ReportParameterBase(

                    date,
                    date.ToString("dd-MMMM-yyyy"),
                    shopId);
                var reports = this.CreateReportModels(dailyGrouped.ToList(), p).ToList();
                this.SaveReports(reports);
            }
        }
Exemple #3
0
        public override IEnumerable <M> CreateReportModels(List <T> models, ReportParameterBase p)
        {
            string defaultAccountHeadId   = new Guid().ToString();
            string defaultAccountHeadName = "All";
            TransactionReportParameter previousParameter = new TransactionReportParameter(
                TransactionReportType.TransactionByAmount,
                defaultAccountHeadName,
                defaultAccountHeadId,
                null,
                p);

            var startingAll = this.GetPreviousEnding(previousParameter);

            var parameterAll = new TransactionReportParameter(
                TransactionReportType.TransactionByAmount,
                defaultAccountHeadName,
                defaultAccountHeadId,
                startingAll,
                p);

            var allReport = this.CreateReportModel(models, parameterAll);

            yield return(allReport);

            List <IGrouping <string, T> > transactionsByAccId = models.GroupBy(x => x.AccountHeadId).ToList();

            foreach (var tById in transactionsByAccId)
            {
                var accId = tById.Key;
                if (tById.Any())
                {
                    var transaction = tById.First();
                    previousParameter.TransactionReportType = TransactionReportType.TransactionByAccountHead;
                    previousParameter.AccountHeadId         = accId;
                    Dictionary <TransactionMedium, double> startingAmountsByAccount = GetPreviousEnding(previousParameter);
                    var parameterByAccount = new TransactionReportParameter(TransactionReportType.TransactionByAccountHead, transaction.AccountHeadName, accId, startingAmountsByAccount, p);
                    M   transactionReport  = this.CreateReportModel(tById.ToList(), parameterByAccount);
                    yield return(transactionReport);
                }
            }
        }
Exemple #4
0
        private void UpsertDailyAllProduct(
            string shopId,
            ReportTimeType reportTimeType,
            DateTime operationDate,
            List <PurchaseDetail> purchaseDetails,
            List <SaleDetail> saleDetails,
            List <ProductDetail> productDetails,
            List <ProductCategory> categories)
        {
            Console.WriteLine($"Operation date : {operationDate}");
            var dailyPurchase = purchaseDetails.Where(x => x.Modified.Date == operationDate);
            var dailySales    = saleDetails.Where(x => x.Modified.Date == operationDate);

            List <IGrouping <string, PurchaseDetail> > purchaseDetailsGrouped =
                dailyPurchase.GroupBy(x => x.ProductDetailId).ToList();
            List <IGrouping <string, SaleDetail> > saleDetailsGrouped = dailySales.GroupBy(x => x.ProductDetailId).ToList();

            //List<string> dailyPurchaseIds = purchaseDetailsGrouped.Select(x => x.Key).ToList();
            //List<string> dailySoldIds = saleDetailsGrouped.Select(x => x.Key).ToList();
            //List<string> dailyAllIds = dailySoldIds.Union(dailyPurchaseIds).ToList();
            List <string> dailyAllIds = productDetails.Select(x => x.Id).Distinct().ToList();


            string value = this.GetValue(reportTimeType, operationDate);
            ReportParameterBase reportParameterBase = new ReportParameterBase(operationDate, value, shopId);

            //foreach (string productDetailId in dailyAllIds)
            //{
            //    this.UpsertDailyProductReport(productDetailId, reportParameterBase, saleDetailsGrouped, purchaseDetailsGrouped, productDetails, categories);
            //}

            Parallel.ForEach(
                dailyAllIds,
                productDetailId => this.UpsertDailyProductReport(
                    productDetailId,
                    reportParameterBase,
                    saleDetailsGrouped,
                    purchaseDetailsGrouped,
                    productDetails,
                    categories));
        }
Exemple #5
0
        public override M CreateReportModel(List <T> models, ReportParameterBase reportParameter)
        {
            var parameter = (TransactionReportParameter)reportParameter;
            M   report    = new M();

            report.Id          = Guid.NewGuid().ToString();
            report.CreatedFrom = "BizBook";
            report.CreatedBy   = "Automatic";
            report.ModifiedBy  = "Automatic";
            report.Created     = DateTime.Today.Date;
            report.Modified    = DateTime.Today.Date;
            report.ShopId      = reportParameter.ReportShopId;

            report.ReportTimeType = reportParameter.ReportTimeType;
            report.Date           = reportParameter.Date.Date;
            report.Value          = reportParameter.Value;
            report.RowsCount      = models.Count;

            report.TransactionReportType = parameter.TransactionReportType;
            report.AccountHeadId         = parameter.AccountHeadId;
            report.AccountHeadName       = parameter.AccountHeadName;

            report.TotalStarting  = parameter.TotalStarting;
            report.CashStarting   = parameter.CashStarting;
            report.CardStarting   = parameter.CardStarting;
            report.ChequeStarting = parameter.ChequeStarting;
            report.MobileStarting = parameter.MobileStarting;
            report.OtherStarting  = parameter.OtherStarting;

            report.TotalRowsCount = models.Count;
            report.TotalIn        = models.GetIncome();
            report.TotalOut       = models.GetExpense();
            report.TotalEnding    = report.TotalStarting + report.TotalIn - report.TotalOut;

            var cashTransactions = models.Where(x => x.TransactionMedium == TransactionMedium.Cash).ToList();

            report.CashRowsCount = cashTransactions.Count;
            report.CashIn        = cashTransactions.GetIncome();
            report.CashOut       = cashTransactions.GetExpense();
            report.CashEnding    = report.CashStarting + report.CashIn - report.CashOut;

            var cardTransactions = models.Where(x => x.TransactionMedium == TransactionMedium.Card).ToList();

            report.CardRowsCount = cardTransactions.Count;
            report.CardIn        = cardTransactions.GetIncome();
            report.CardOut       = cardTransactions.GetExpense();
            report.CardEnding    = report.CardStarting + report.CardIn - report.CardOut;

            var chequeTransactions = models.Where(x => x.TransactionMedium == TransactionMedium.Cheque).ToList();

            report.ChequeRowsCount = chequeTransactions.Count;
            report.ChequeIn        = chequeTransactions.GetIncome();
            report.ChequeOut       = chequeTransactions.GetExpense();
            report.ChequeEnding    = report.ChequeStarting + report.ChequeIn - report.ChequeOut;

            var mobileTransactions = models.Where(x => x.TransactionMedium == TransactionMedium.Mobile).ToList();

            report.MobileRowsCount = mobileTransactions.Count;
            report.MobileIn        = mobileTransactions.GetIncome();
            report.MobileOut       = mobileTransactions.GetExpense();
            report.MobileEnding    = report.MobileStarting + report.MobileIn - report.MobileOut;

            var otherTransactions = models.Where(x => x.TransactionMedium == TransactionMedium.Other).ToList();

            report.OtherRowsCount = otherTransactions.Count;
            report.OtherIn        = otherTransactions.GetIncome();
            report.OtherOut       = otherTransactions.GetExpense();
            report.OtherEnding    = report.OtherStarting + report.OtherIn - report.OtherOut;

            return(report);
        }
Exemple #6
0
        public virtual void ShopClose(string shopId, DateTime start, DateTime end, ReportTimeType reportTimeType)
        {
            IQueryable <T> models = this.db.Set <T>().AsQueryable();
            Expression <Func <T, bool> > expression = x => x.ShopId == shopId && x.Modified >= start && x.Modified <= end;
            IQueryable <T> allModelsForTheShop      = models.Where(expression).OrderByDescending(x => x.Modified).AsQueryable();

            switch (reportTimeType)
            {
            case ReportTimeType.Daily:
                var years = allModelsForTheShop.GroupBy(this.yearKeySelector).Select(x => x.Key).ToList();
                foreach (var year in years)
                {
                    List <IGrouping <int?, T> > dailyGroupedModels = allModelsForTheShop
                                                                     .Where(x => x.Modified.Year == year).GroupBy(dayKeySelector).OrderBy(x => x.Key)
                                                                     .ToList();

                    foreach (IGrouping <int?, T> dailyGrouped in dailyGroupedModels)
                    {
                        this.ProcessShopClose(shopId, dailyGrouped);
                    }

                    // Parallel.ForEach(dailyGroupedModels, x => ProcessShopClose(shopId, end, x));
                }

                break;

            case ReportTimeType.Weekly:
                var weeklySales = allModelsForTheShop.GroupBy(weekKeySelector).OrderBy(x => x.Key).ToList();
                foreach (var week in weeklySales)
                {
                    if (week.Any())
                    {
                        List <T> weeklySalesList = week.OrderBy(x => x.Modified).ToList();
                        DateTime date            = weeklySalesList.First().Modified.Date;
                        string   value           = "Week " + calendar.GetWeekOfYear(
                            date,
                            CalendarWeekRule.FirstDay,
                            DayOfWeek.Sunday) + "-" + date.Year;
                        ReportParameterBase p = new ReportParameterBase(date, value, shopId);
                        var reports           = this.CreateReportModels(weeklySalesList, p).ToList();
                        this.SaveReports(reports);
                    }
                }
                break;

            case ReportTimeType.Monthly:
                var monthlySales = allModelsForTheShop.GroupBy(monthKeySelector).OrderBy(x => x.Key).ToList();
                foreach (var month in monthlySales)
                {
                    DateTime date = new DateTime(end.Year, month.Key.Value, 1);
                    if (month.Any())
                    {
                        ReportParameterBase p = new ReportParameterBase(
                            date,
                            date.ToString("MMMM-yyyy"),
                            shopId);
                        var reports = this.CreateReportModels(month.ToList(), p).ToList();
                        this.SaveReports(reports);
                    }
                }

                break;

            case ReportTimeType.Yearly:
                List <IGrouping <int?, T> > yearlySales = allModelsForTheShop.GroupBy(yearKeySelector).ToList();
                foreach (var yearlySale in yearlySales)
                {
                    DateTime            date = new DateTime((int)yearlySale.Key, 1, 1);
                    ReportParameterBase p    = new ReportParameterBase(date,
                                                                       date.ToString("yyyy"), shopId);
                    var reports = this.CreateReportModels(yearlySale.ToList(), p).ToList();
                    this.SaveReports(reports);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(reportTimeType), reportTimeType, null);
            }
        }
Exemple #7
0
 public abstract M CreateReportModel(List <T> models, ReportParameterBase reportParameter);
Exemple #8
0
 public abstract IEnumerable <M> CreateReportModels(List <T> models, ReportParameterBase p);