public async Task <Tuple <List <ProductReportViewModel>, int> > SearchAsync(ProductReportRequestModel request)
        {
            ReportDbContext db = new ReportDbContext();
            BaseRepository <ProductReport> repo = new BaseRepository <ProductReport>(db);
            var service = new BaseService <ProductReport, ProductReportRequestModel, ProductReportViewModel>(repo);
            Tuple <List <ProductReportViewModel>, int> tuple = await service.SearchAsync(request);

            return(tuple);
        }
Exemple #2
0
        public async Task <ResultList <Persistence.EFModels.Product> > ProductReport(ProductReportRequestModel model)
        {
            _logger.Info("ProductReport Started");

            var result = await _productStore.ProductReport(model.MaxQuantity, model.MinQuantity,
                                                           model.Enabled, model.MaxPrice, model.MinPrice, model.StorageId, model.SupplierId);

            _logger.Info("ProductReport Finished");

            return(result);
        }
        public ResultList <Product> ProductReport(ProductReportRequestModel model)
        {
            /*
             *  In EntityFrameworkCore we have two methods for executing Stored Procedures that:
             *  1- Query for records from a database - FromSqlRaw()
             *  2- Execute a command (typically DML) on the database - ExecuteSqlRaw() or the awaitable ExecuteSqlRawAsync()
             *  https://referbruv.com/blog/posts/working-with-stored-procedures-in-aspnet-core-ef-core
             */

            var maxQuantityParam = new SqlParameter("@MaxQuantity", model.MaxQuantity);
            var minQuantityParam = new SqlParameter("@MinQuantity", model.MinQuantity);
            var enabledParam     = new SqlParameter("@Enabled", model.Enabled);
            var maxPriceParam    = new SqlParameter("@MaxPrice", model.MaxPrice);
            var minPriceParam    = new SqlParameter("@MinPrice", model.MinPrice);
            var storageIdParam   = new SqlParameter("@StorageId", model.StorageId == null ? DBNull.Value : model.StorageId);
            var supplierIdParam  = new SqlParameter("@SupplierId", model.SupplierId == null ? DBNull.Value : model.SupplierId);

            var result = _context.Products.FromSqlRaw("exec spGetProductReport @MaxQuantity, @MinQuantity, @Enabled, @MaxPrice, @MinPrice, @StorageId, @SupplierId",
                                                      maxQuantityParam, minQuantityParam, enabledParam, maxPriceParam,
                                                      minPriceParam, storageIdParam, supplierIdParam).ToList();

            //The required column 'StorageId' was not present in the results of a 'FromSql' operation.
            return(ResultList <Product> .Successful(null));
        }
Exemple #4
0
 public ResultList <Product> ProductReportEfCore(ProductReportRequestModel product)
 {
     return(_productEfCoreService.ProductReport(product));
 }
Exemple #5
0
 public async Task <ResultList <Product> > ProductReportSp(ProductReportRequestModel product)
 {
     return(await _productSpService.ProductReport(product));
 }
Exemple #6
0
        public Tuple <List <ProductReport>, int> GetProductStockReport(ProductReportRequestModel request)
        {
            BusinessDbContext db = base.Repository.Db as BusinessDbContext;

            request.StartDate = request.StartDate.Date;
            request.EndDate   = request.EndDate.Date.AddDays(1).AddMinutes(-1);

            var dbSaleDetailsDone                 = db.SaleDetails.Include(x => x.Sale).Where(x => x.Sale.OrderState == OrderState.Delivered || x.Sale.OrderState == OrderState.Completed).AsQueryable();
            var dbSaleDetailsProcessing           = db.SaleDetails.Include(x => x.Sale).Where(x => x.Sale.OrderState > OrderState.Pending && x.Sale.OrderState < OrderState.Delivered).AsQueryable();
            var dbPurchaseDetails                 = db.PurchaseDetails.AsQueryable();
            var dbStockTransferOutDetailsApproved = db.StockTransferDetails.Include(x => x.StockTransfer).Where(x => x.StockTransfer.TransferState == StockTransferState.Approved).AsQueryable();
            var dbStockTransferInDetailsApproved  = db.StockTransferDetails.Include(x => x.StockTransfer).Where(x => x.StockTransfer.TransferState == StockTransferState.Approved).AsQueryable();
            var dbStockTransferOutDetailsPending  = db.StockTransferDetails.Include(x => x.StockTransfer).Where(x => x.StockTransfer.TransferState == StockTransferState.Pending).AsQueryable();
            var dbStockTransferInDetailsPending   = db.StockTransferDetails.Include(x => x.StockTransfer).Where(x => x.StockTransfer.TransferState == StockTransferState.Pending).AsQueryable();

            if (request.WarehouseId.IdIsOk() && request.WarehouseId != new Guid().ToString())
            {
                dbSaleDetailsDone                 = dbSaleDetailsDone.Where(x => x.WarehouseId == request.WarehouseId);
                dbSaleDetailsProcessing           = dbSaleDetailsProcessing.Where(x => x.WarehouseId == request.WarehouseId);
                dbPurchaseDetails                 = dbPurchaseDetails.Where(x => x.WarehouseId == request.WarehouseId);
                dbStockTransferOutDetailsApproved =
                    dbStockTransferOutDetailsApproved.Where(x => x.SourceWarehouseId == request.WarehouseId);
                dbStockTransferInDetailsApproved =
                    dbStockTransferInDetailsApproved.Where(x => x.DestinationWarehouseId == request.WarehouseId);
            }

            List <StockReportModelTemp> purchaseDetailListBefore = dbPurchaseDetails
                                                                   .Where(x => x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) < request.StartDate)
                                                                   .GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.Paid),
                RowsCount       = x.Select(y => y.PurchaseId).Distinct().Count()
            }).ToList();

            List <StockReportModelTemp> saleDetailListBeforeDone = dbSaleDetailsDone.Where(x =>
                                                                                           x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.PaidAmount),
                RowsCount       = x.Select(y => y.SaleId).Distinct().Count()
            }).ToList();
            List <StockReportModelTemp> saleDetailListBeforeProcessing = dbSaleDetailsProcessing.Where(x =>
                                                                                                       x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.PaidAmount),
                RowsCount       = x.Select(y => y.SaleId).Distinct().Count()
            }).ToList();

            List <StockReportModelTemp> purchaseDetailList = dbPurchaseDetails
                                                             .Where(x => x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) >= request.StartDate && DbFunctions.TruncateTime(x.Created) <= request.EndDate)
                                                             .GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.Paid),
                RowsCount       = x.Select(y => y.PurchaseId).Distinct().Count()
            }).ToList();

            List <StockReportModelTemp> saleDetailListDone = dbSaleDetailsDone.Where(x =>
                                                                                     x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) >= request.StartDate && DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.PaidAmount),
                RowsCount       = x.Select(y => y.SaleId).Distinct().Count()
            }).ToList();

            List <StockReportModelTemp> saleDetailListProcessing = dbSaleDetailsProcessing.Where(x =>
                                                                                                 x.ShopId == request.ShopId && DbFunctions.TruncateTime(x.Created) >= request.StartDate && DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId).Select(x => new StockReportModelTemp()
            {
                ProductDetailId = x.Key,
                Quantity        = x.Sum(y => y.Quantity),
                Amount          = x.Sum(y => y.PaidAmount),
                RowsCount       = x.Select(y => y.SaleId).Distinct().Count()
            }).ToList();

            List <StockReportModelTemp> stockTransferInDetailListBeforeApproved  = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferInDetailListApproved        = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferOutDetailListBeforeApproved = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferOutDetailListApproved       = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferInDetailListBeforePending   = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferInDetailListPending         = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferOutDetailListBeforePending  = new List <StockReportModelTemp>();
            List <StockReportModelTemp> stockTransferOutDetailListPending        = new List <StockReportModelTemp>();

            if (request.WarehouseId.IdIsOk() && request.WarehouseId != new Guid().ToString())
            {
                stockTransferInDetailListBeforeApproved = dbStockTransferInDetailsApproved
                                                          .Where(x => x.ShopId == request.ShopId &&
                                                                 x.DestinationWarehouseId == request.WarehouseId &&
                                                                 DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId)
                                                          .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferOutDetailListBeforeApproved = dbStockTransferOutDetailsApproved
                                                           .Where(x => x.ShopId == request.ShopId &&
                                                                  x.SourceWarehouseId == request.WarehouseId &&
                                                                  DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId)
                                                           .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferInDetailListApproved = dbStockTransferInDetailsApproved
                                                    .Where(x => x.ShopId == request.ShopId &&
                                                           x.DestinationWarehouseId == request.WarehouseId &&
                                                           DbFunctions.TruncateTime(x.Created) >= request.StartDate &&
                                                           DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId)
                                                    .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferOutDetailListApproved = dbStockTransferOutDetailsApproved
                                                     .Where(x => x.ShopId == request.ShopId &&
                                                            x.SourceWarehouseId == request.WarehouseId &&
                                                            DbFunctions.TruncateTime(x.Created) >= request.StartDate &&
                                                            DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId)
                                                     .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferInDetailListBeforePending = dbStockTransferInDetailsPending
                                                         .Where(x => x.ShopId == request.ShopId &&
                                                                x.DestinationWarehouseId == request.WarehouseId &&
                                                                DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId)
                                                         .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferOutDetailListBeforePending = dbStockTransferOutDetailsPending
                                                          .Where(x => x.ShopId == request.ShopId &&
                                                                 x.SourceWarehouseId == request.WarehouseId &&
                                                                 DbFunctions.TruncateTime(x.Created) < request.StartDate).GroupBy(x => x.ProductDetailId)
                                                          .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferInDetailListPending = dbStockTransferInDetailsPending
                                                   .Where(x => x.ShopId == request.ShopId &&
                                                          x.DestinationWarehouseId == request.WarehouseId &&
                                                          DbFunctions.TruncateTime(x.Created) >= request.StartDate &&
                                                          DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId)
                                                   .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();

                stockTransferOutDetailListPending = dbStockTransferOutDetailsPending
                                                    .Where(x => x.ShopId == request.ShopId &&
                                                           x.SourceWarehouseId == request.WarehouseId &&
                                                           DbFunctions.TruncateTime(x.Created) >= request.StartDate &&
                                                           DbFunctions.TruncateTime(x.Created) <= request.EndDate).GroupBy(x => x.ProductDetailId)
                                                    .Select(x => new StockReportModelTemp()
                {
                    ProductDetailId = x.Key,
                    Quantity        = x.Sum(y => y.Quantity),
                    Amount          = x.Sum(y => y.PriceTotal),
                    RowsCount       = x.Select(y => y.StockTransferId).Distinct().Count()
                }).ToList();
            }

            var productDetails = db.ProductDetails.AsQueryable();

            if (request.IsProductActive)
            {
                productDetails = productDetails.Where(x => x.IsActive);
            }

            var products = productDetails.Where(x => x.ShopId == request.ShopId).Include(x => x.ProductCategory)
                           .Include(x => x.ProductCategory.ProductGroup).ToList().OrderBy(x => x.Name);

            List <ProductReport> productReports = new List <ProductReport>();

            foreach (var productDetail in products)
            {
                StockReportModelTemp purchaseDetail       = purchaseDetailList.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp saleDetailDone       = saleDetailListDone.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp saleDetailProcessing = saleDetailListProcessing.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                StockReportModelTemp purchaseDetailBefore =
                    purchaseDetailListBefore.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp saleDetailBeforeDone       = saleDetailListBeforeDone.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp saleDetailBeforeProcessing = saleDetailListBeforeProcessing.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                StockReportModelTemp stockInApproved  = stockTransferInDetailListApproved.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp stockOutApproved = stockTransferOutDetailListApproved.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                StockReportModelTemp stockInPending  = stockTransferInDetailListPending.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);
                StockReportModelTemp stockOutPending = stockTransferOutDetailListPending.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                StockReportModelTemp stockInBeforeApproved = stockTransferInDetailListBeforeApproved.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                StockReportModelTemp stockOutBeforeApproved = stockTransferOutDetailListBeforeApproved.FirstOrDefault(x => x.ProductDetailId == productDetail.Id);

                var purchaseQuantityBefore         = purchaseDetailBefore?.Quantity ?? 0;
                var stockInQuantityBeforeApproved  = stockInBeforeApproved?.Quantity ?? 0;
                var stockOutQuantityBeforeApproved = stockOutBeforeApproved?.Quantity ?? 0;
                var saleQuantityBeforeDone         = saleDetailBeforeDone?.Quantity ?? 0;
                var saleQuantityBeforeProcessing   = saleDetailBeforeProcessing?.Quantity ?? 0;
                var startingToday = stockInQuantityBeforeApproved
                                    + purchaseQuantityBefore
                                    - saleQuantityBeforeProcessing
                                    - saleQuantityBeforeDone
                                    - stockOutQuantityBeforeApproved;

                var productReport = new ProductReport();
                productReport.Id = productDetail.Id;
                productReport.ProductDetailId               = productDetail.Id;
                productReport.ProductDetailName             = productDetail.Name;
                productReport.ProductCategoryId             = productDetail.ProductCategoryId;
                productReport.ProductCategoryName           = productDetail.ProductCategory.Name;
                productReport.ProductGroupId                = productDetail.ProductCategory.ProductGroupId;
                productReport.ProductGroupName              = productDetail.ProductCategory.ProductGroup.Name;
                productReport.QuantityStartingToday         = startingToday;
                productReport.QuantityPurchaseToday         = purchaseDetail?.Quantity ?? 0;
                productReport.QuantitySaleDoneToday         = saleDetailDone?.Quantity ?? 0;
                productReport.QuantitySaleProcessingToday   = saleDetailProcessing?.Quantity ?? 0;
                productReport.QuantityStockInApprovedToday  = stockInApproved?.Quantity ?? 0;
                productReport.QuantityStockOutApprovedToday = stockOutApproved?.Quantity ?? 0;
                productReport.QuantityStockInPendingToday   = stockInPending?.Quantity ?? 0;
                productReport.QuantityStockOutPendingToday  = stockOutPending?.Quantity ?? 0;
                productReport.AmountSaleToday               = saleDetailDone?.Amount ?? 0;
                productReport.RowsCount = saleDetailDone?.RowsCount ?? 0;
                productReport.ShopId    = productDetail.ShopId;
                productReport.Created   = request.StartDate;
                productReport.IsActive  = productDetail.IsActive;

                productReport.QuantityEndingToday =
                    startingToday
                    + productReport.QuantityPurchaseToday
                    + productReport.QuantityStockInApprovedToday
                    - productReport.QuantitySaleToday
                    - productReport.QuantityStockOutApprovedToday;

                productReports.Add(productReport);
            }

            //var reportViewModels = productReports.ConvertAll(x => new ProductReportViewModel(x)).ToList();

            return(new Tuple <List <ProductReport>, int>(productReports, productReports.Count));
        }