예제 #1
0
        private async Task <UnpaidDispositionReportDetailViewModel> GetReportData(int categoryId, int accountingUnitId, int divisionId, DateTimeOffset?dateTo, bool isImport, bool isForeignCurrency)
        {
            //var dateStart = dateFrom.GetValueOrDefault().ToUniversalTime();
            var dateEnd = (dateTo.HasValue ? dateTo.Value : DateTime.MaxValue).ToUniversalTime();

            var query = from pdItems in _dbContext.PurchasingDispositionItems

                        join pds in _dbContext.PurchasingDispositions on pdItems.PurchasingDispositionId equals pds.Id into joinPurchasingDispositions
                        from pd in joinPurchasingDispositions.DefaultIfEmpty()

                        join pdDetailItems in _dbContext.PurchasingDispositionDetails on pdItems.Id equals pdDetailItems.PurchasingDispositionItemId into joinPurchasingDispositionDetails
                        from pdDetailItem in joinPurchasingDispositionDetails.DefaultIfEmpty()

                        join urnItems in _dbContext.UnitReceiptNoteItems on pdItems.EPOId equals urnItems.EPOId.ToString() into joinUnitReceiptNoteItems
                        from urnItem in joinUnitReceiptNoteItems.DefaultIfEmpty()

                        join upoItems in _dbContext.UnitPaymentOrderItems on urnItem.Id equals upoItems.URNId into joinUnitPaymentOrderItems
                        from upoItem in joinUnitPaymentOrderItems.DefaultIfEmpty()

                        join upos in _dbContext.UnitPaymentOrders on upoItem.UPOId equals upos.Id into joinUnitPaymentOrders
                        from upo in joinUnitPaymentOrders.DefaultIfEmpty()

                        join epos in _dbContext.ExternalPurchaseOrders on pdItems.EPOId equals epos.Id.ToString() into joinExternalPurchaseOrders
                        from epo in joinExternalPurchaseOrders.DefaultIfEmpty()

                            where pd.PaymentDueDate <= dateEnd && pd.IsPaid == false && epo.SupplierIsImport == isImport
                        select new
            {
                pdItems.Id,

                pd.CreatedUtc,
                pd.IsPaid,
                pd.DispositionNo,
                pd.PaymentDueDate,
                pd.DivisionId,
                pd.DivisionCode,
                pd.DivisionName,
                pd.CurrencyId,
                pd.CurrencyCode,
                pd.CurrencyRate,
                pd.CategoryId,
                pd.CategoryCode,
                pd.CategoryName,
                pd.SupplierName,
                pd.DPP,
                pd.IncomeTaxBy,
                pd.IncomeTaxValue,
                pd.VatValue,

                pdDetailItem.UnitId,
                pdDetailItem.UnitCode,
                pdDetailItem.UnitName,

                urnItem.UnitReceiptNote.URNNo,

                upoItem.UnitPaymentOrder.UPONo,
                upoItem.UnitPaymentOrder.InvoiceNo,

                epo.SupplierIsImport
            };

            query = query.GroupBy(x => x.Id).Select(y => y.First());

            if (!isForeignCurrency && !isImport)
            {
                query = query.Where(x => x.CurrencyCode == "IDR");
            }
            else if (isForeignCurrency)
            {
                query = query.Where(x => x.CurrencyCode != "IDR");
            }

            if (accountingUnitId > 0)
            {
                var unitFilterIds = await _currencyProvider.GetUnitsIdsByAccountingUnitId(accountingUnitId);

                if (unitFilterIds.Count() > 0)
                {
                    query = query.Where(x => unitFilterIds.Contains(x.UnitId));
                }
            }

            //var categoryFilterIds = await _currencyProvider.GetCategoryIdsByAccountingCategoryId(accountingCategoryId);
            //if (categoryFilterIds.Count() > 0)
            //    query = query.Where(x => categoryFilterIds.Contains(x.CategoryId));

            if (categoryId > 0)
            {
                query = query.Where(x => x.CategoryId == categoryId.ToString());
            }

            if (divisionId > 0)
            {
                query = query.Where(x => x.DivisionId == divisionId.ToString());
            }

            var queryResult = query.OrderByDescending(x => x.PaymentDueDate).ToList();

            var unitIds = queryResult.Select(item =>
            {
                int.TryParse(item.UnitId, out var unitId);
                return(unitId);
            }).Distinct().ToList();
            var units = await _currencyProvider.GetUnitsByUnitIds(unitIds);

            var accountingUnits = await _currencyProvider.GetAccountingUnitsByUnitIds(unitIds);

            var itemCategoryIds = queryResult.Select(item =>
            {
                int.TryParse(item.CategoryId, out var itemCategoryId);
                return(itemCategoryId);
            }).Distinct().ToList();
            var categories = await _currencyProvider.GetCategoriesByCategoryIds(itemCategoryIds);

            var accountingCategories = await _currencyProvider.GetAccountingCategoriesByCategoryIds(itemCategoryIds);

            var reportResult = new UnpaidDispositionReportDetailViewModel();

            foreach (var item in queryResult)
            {
                int.TryParse(item.UnitId, out var unitId);
                var unit           = units.FirstOrDefault(element => element.Id == unitId);
                var accountingUnit = new AccountingUnit();
                if (unit != null)
                {
                    accountingUnit = accountingUnits.FirstOrDefault(element => element.Id == unit.AccountingUnitId);
                }

                //int.TryParse(item.CategoryId, out var itemCategoryId);
                //var category = categories.FirstOrDefault(element => element.Id == itemCategoryId);
                //var accountingCategory = new AccountingCategory();
                //if (category != null)
                //{
                //    accountingCategory = accountingCategories.FirstOrDefault(element => element.Id == category.AccountingCategoryId);
                //}

                var category            = _categories.FirstOrDefault(_category => _category.Id.ToString() == item.CategoryId);
                var categoryLayoutIndex = 0;
                if (category != null)
                {
                    categoryLayoutIndex = category.ReportLayoutIndex;
                }

                double total         = 0;
                double totalCurrency = 0;
                if (item.IncomeTaxBy == "Supplier")
                {
                    total         = item.DPP + item.VatValue - item.IncomeTaxValue;
                    totalCurrency = (item.DPP + item.VatValue - item.IncomeTaxValue) * item.CurrencyRate;
                }
                else
                {
                    total         = item.DPP + item.VatValue;
                    totalCurrency = (item.DPP + item.VatValue) * item.CurrencyRate;
                }


                var reportItem = new DispositionReport()
                {
                    DispositionNo   = item.DispositionNo,
                    DispositionDate = item.CreatedUtc,
                    CategoryId      = item.CategoryId,
                    CategoryName    = item.CategoryName,
                    CategoryCode    = item.CategoryCode,
                    CurrencyId      = item.CurrencyId,
                    CurrencyCode    = item.CurrencyCode,
                    CurrencyRate    = (decimal)item.CurrencyRate,
                    //AccountingCategoryName = accountingCategory.Name,
                    //AccountingCategoryCode = accountingCategory.Code,
                    //AccountingLayoutIndex = accountingCategory.AccountingLayoutIndex,
                    DPP                 = (decimal)item.DPP,
                    DPPCurrency         = (decimal)(item.DPP * item.CurrencyRate),
                    InvoiceNo           = item.InvoiceNo,
                    VAT                 = (decimal)item.VatValue,
                    Total               = (decimal)total,
                    TotalCurrency       = (decimal)totalCurrency,
                    SupplierName        = item.SupplierName,
                    UnitId              = item.UnitId,
                    UnitName            = item.UnitName,
                    UnitCode            = item.UnitCode,
                    AccountingUnitName  = accountingUnit.Name,
                    AccountingUnitCode  = accountingUnit.Code,
                    UPONo               = item.UPONo,
                    URNNo               = item.URNNo,
                    IncomeTax           = (decimal)item.IncomeTaxValue,
                    IncomeTaxBy         = item.IncomeTaxBy,
                    PaymentDueDate      = item.PaymentDueDate.Date,
                    DivisionName        = item.DivisionName,
                    CategoryLayoutIndex = categoryLayoutIndex,
                };

                reportResult.Reports.Add(reportItem);
            }

            reportResult.UnitSummaries = reportResult.Reports
                                         .GroupBy(report => new { report.AccountingUnitName, report.CurrencyCode })
                                         .Select(report => new Summary()
            {
                Name             = report.Key.AccountingUnitName,
                CurrencyCode     = report.Key.CurrencyCode,
                SubTotal         = report.Sum(sum => sum.Total),
                SubTotalCurrency = report.Sum(sum => sum.TotalCurrency),
                //AccountingLayoutIndex = report.Select(item => item.AccountingLayoutIndex).FirstOrDefault()
            })
                                         .OrderBy(report => report.Name).ToList();

            reportResult.CurrencySummaries = reportResult.Reports
                                             .GroupBy(report => new { report.CurrencyCode })
                                             .Select(report => new Summary()
            {
                CurrencyCode     = report.Key.CurrencyCode,
                SubTotal         = report.Sum(sum => sum.Total),
                SubTotalCurrency = report.Sum(sum => sum.TotalCurrency)
            }).OrderBy(order => order.CurrencyCode).ToList();

            reportResult.CategorySummaries = reportResult.Reports
                                             .GroupBy(report => new { report.CategoryName, report.CategoryId, report.CurrencyCode })
                                             .Select(report => new Summary()
            {
                CategoryName = report.Key.CategoryName,
                CategoryId   = report.Key.CategoryId,
                CurrencyCode = report.Key.CurrencyCode,
                SubTotal     = report.Sum(sum => sum.Total)
            })
                                             .OrderBy(order => order.CategoryName).ToList();

            reportResult.Reports          = reportResult.Reports.OrderBy(order => order.CategoryLayoutIndex).ToList();
            reportResult.GrandTotal       = reportResult.Reports.Sum(sum => sum.TotalCurrency);
            reportResult.UnitSummaryTotal = reportResult.UnitSummaries.Sum(categorySummary => categorySummary.SubTotalCurrency);

            return(reportResult);
        }