public void Should_Succes_Instantiate_validateService()
        {
            var serviceProviderMock = new Mock <IServiceProvider>();
            var service             = new Lib.Services.ValidateService.ValidateService(serviceProviderMock.Object);

            CreditBalanceViewModel viewModel = new CreditBalanceViewModel();

            service.Validate(viewModel);

            Assert.NotNull(service);
        }
        public List <CreditBalanceViewModel> GetReport(bool isImport, string suplierName, int month, int year, int offSet, bool isForeignCurrency)
        {
            IQueryable <CreditorAccountModel> query  = DbContext.CreditorAccounts.Where(x => x.SupplierIsImport == isImport).AsQueryable();
            List <CreditBalanceViewModel>     result = new List <CreditBalanceViewModel>();
            int previousMonth = month - 1;
            int previousYear  = year;

            if (previousMonth == 0)
            {
                previousMonth = 12;
                previousYear  = year - 1;
            }

            if (isForeignCurrency)
            {
                query = query.Where(entity => entity.CurrencyCode != "IDR");
            }

            query = query.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == month && x.UnitReceiptNoteDate.Value.Year == year);
            if (!string.IsNullOrEmpty(suplierName))
            {
                query = query.Where(x => x.SupplierName == suplierName);
            }



            foreach (var item in query.GroupBy(x => x.SupplierCode).ToList())
            {
                var productsUnion  = string.Join("\n", item.Select(x => x.Products).ToList());
                var uniqueProducts = string.Join("\n", productsUnion.Split("\n").Distinct());

                var creditBalance = new CreditBalanceViewModel()
                {
                    StartBalance = DbSet.AsQueryable().Where(x => x.SupplierCode == item.Key &&
                                                             x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == previousMonth &&
                                                             x.UnitReceiptNoteDate.Value.Year == previousYear).ToList().Sum(x => x.FinalBalance),
                    Products     = uniqueProducts,
                    Purchase     = item.Sum(x => x.UnitReceiptMutation),
                    Payment      = item.Sum(x => x.BankExpenditureNoteMutation),
                    FinalBalance = item.Sum(x => x.FinalBalance),
                    SupplierName = item.FirstOrDefault() == null ? "" : item.FirstOrDefault().SupplierName ?? "",
                    Currency     = item.FirstOrDefault() == null ? "" : item.FirstOrDefault().CurrencyCode ?? "",
                    CurrencyRate = item.FirstOrDefault() == null ? 1 : item.FirstOrDefault().CurrencyRate
                };
                creditBalance.FinalBalance = creditBalance.StartBalance + creditBalance.Purchase - creditBalance.Payment;
                result.Add(creditBalance);
            }

            return(result.OrderBy(x => x.Currency).ThenBy(x => x.Products).ThenBy(x => x.SupplierName).ToList());
        }
        public List <CreditBalanceViewModel> GetReportv2(bool isImport, string suplierName, int month, int year, int offSet, bool isForeignCurrency, int divisionId)
        {
            var query = DbContext.CreditorAccounts.Where(entity => entity.SupplierIsImport == isImport);

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

            DateTimeOffset firstDayOfMonth = new DateTime(year, month, 1);
            DateTimeOffset lastDayOfMonth  = firstDayOfMonth.AddMonths(1);

            query = query.Where(entity => (entity.UnitReceiptNoteDate.HasValue && entity.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).DateTime < lastDayOfMonth.DateTime) || (entity.MemoDate.HasValue && entity.MemoDate.GetValueOrDefault().AddHours(offSet).DateTime < lastDayOfMonth.DateTime) || (entity.UnitPaymentCorrectionDate.HasValue && entity.UnitPaymentCorrectionDate.GetValueOrDefault().AddHours(offSet).DateTime < lastDayOfMonth.DateTime) || (entity.BankExpenditureNoteDate.HasValue && entity.BankExpenditureNoteDate.GetValueOrDefault().AddHours(offSet).DateTime < lastDayOfMonth.DateTime) || (entity.PurchasingMemoDate.HasValue && entity.PurchasingMemoDate.GetValueOrDefault().AddHours(offSet).DateTime < lastDayOfMonth.DateTime));

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

            if (!string.IsNullOrWhiteSpace(suplierName))
            {
                query = query.Where(entity => entity.SupplierName == suplierName);
            }

            var queryResult = query.OrderBy(entity => entity.SupplierName).ToList();

            var result = new List <CreditBalanceViewModel>();

            //var initialBalance =
            foreach (var item in queryResult)
            {
                var itemResult = new CreditBalanceViewModel()
                {
                    Currency     = item.CurrencyCode,
                    CurrencyRate = item.CurrencyRate,
                    DivisionId   = item.DivisionId,
                    DivisionName = item.DivisionName,
                    Products     = item.Products,
                    SupplierCode = item.SupplierCode,
                    SupplierName = item.SupplierName
                };

                if (item.UnitPaymentCorrectionId == 0)
                {
                    if (item.UnitReceiptNoteDate.HasValue && item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).DateTime < firstDayOfMonth.DateTime && (item.IsStartBalance || item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Year >= 2021))
                    {
                        itemResult.StartBalance         = item.UnitReceiptNoteDPP - item.IncomeTaxAmount;
                        itemResult.StartBalanceCurrency = item.DPPCurrency - (item.IncomeTaxAmount / item.CurrencyRate);
                    }

                    if (item.UnitReceiptNoteDate.HasValue && item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Year == year && item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Month == month)
                    {
                        itemResult.Purchase         = item.UnitReceiptNoteDPP - item.IncomeTaxAmount;
                        itemResult.PurchaseCurrency = item.DPPCurrency - (item.IncomeTaxAmount / item.CurrencyRate);
                    }

                    if (item.MemoDate.HasValue && item.MemoDate.GetValueOrDefault().AddHours(offSet).DateTime < firstDayOfMonth.DateTime && (item.IsStartBalance || item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Year >= 2021))
                    {
                        itemResult.StartBalance         += item.UnitReceiptNotePPN;
                        itemResult.StartBalanceCurrency += item.VATAmount;
                    }

                    if (item.MemoDate.HasValue && item.MemoDate.GetValueOrDefault().AddHours(offSet).Year == year && item.MemoDate.GetValueOrDefault().AddHours(offSet).Month == month)
                    {
                        itemResult.Purchase         += item.UnitReceiptNotePPN;
                        itemResult.PurchaseCurrency += item.VATAmount;
                    }

                    if (item.BankExpenditureNoteDate.HasValue && item.BankExpenditureNoteDate.GetValueOrDefault().AddHours(offSet).DateTime < firstDayOfMonth.DateTime && (item.IsStartBalance || item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Year >= 2021))
                    {
                        itemResult.StartBalance -= item.BankExpenditureNoteMutation;
                        //itemResult.StartBalance -= item.UnitReceiptNoteDPP;
                        itemResult.StartBalanceCurrency -= item.DPPCurrency;
                        itemResult.StartBalanceCurrency -= item.VATAmount;
                    }

                    if (item.BankExpenditureNoteDate.HasValue && item.BankExpenditureNoteDate.GetValueOrDefault().AddHours(offSet).Year == year && item.BankExpenditureNoteDate.GetValueOrDefault().AddHours(offSet).Month == month)
                    {
                        itemResult.Payment         = item.BankExpenditureNoteMutation;
                        itemResult.PaymentCurrency = item.DPPCurrency + item.VATAmount - (item.IncomeTaxAmount / item.CurrencyRate);
                    }

                    if (item.PurchasingMemoDate.HasValue && item.PurchasingMemoDate.GetValueOrDefault().AddHours(offSet).Year == year && item.PurchasingMemoDate.GetValueOrDefault().AddHours(offSet).Month == month)
                    {
                        itemResult.Payment         = (decimal)item.PurchasingMemoAmount;
                        itemResult.PaymentCurrency = (decimal)item.PurchasingMemoAmount / item.CurrencyRate;
                    }
                }
                else
                {
                    if (item.UnitPaymentCorrectionDate.HasValue && item.UnitPaymentCorrectionDate.GetValueOrDefault().AddHours(offSet).DateTime < firstDayOfMonth.DateTime && (item.IsStartBalance || item.UnitReceiptNoteDate.GetValueOrDefault().AddHours(offSet).Year >= 2021))
                    {
                        itemResult.StartBalance         += (item.UnitPaymentCorrectionMutation);
                        itemResult.StartBalanceCurrency += (item.UnitPaymentCorrectionMutation / item.CurrencyRate);
                    }

                    if (item.UnitPaymentCorrectionDate.HasValue && item.UnitPaymentCorrectionDate.GetValueOrDefault().AddHours(offSet).Year == year && item.UnitPaymentCorrectionDate.GetValueOrDefault().AddHours(offSet).Month == month)
                    {
                        itemResult.Purchase         = (item.UnitPaymentCorrectionMutation);
                        itemResult.PurchaseCurrency = (item.UnitPaymentCorrectionMutation / item.CurrencyRate);
                    }
                }

                result.Add(itemResult);
            }

            if (result.Count > 0)
            {
                result = result
                         .GroupBy(element => new { element.SupplierName, element.DivisionId, element.Currency })
                         .Select(element => new CreditBalanceViewModel()
                {
                    Currency             = element.Key.Currency,
                    CurrencyRate         = element.FirstOrDefault().CurrencyRate,
                    DivisionId           = element.Key.DivisionId,
                    DivisionName         = element.FirstOrDefault().DivisionName,
                    FinalBalance         = element.Sum(sum => sum.StartBalance + sum.Purchase - sum.Payment),
                    FinalBalanceCurrency = element.Sum(sum => sum.StartBalanceCurrency + sum.PurchaseCurrency - sum.PaymentCurrency),
                    PaidAmount           = element.Sum(sum => sum.PaidAmount),
                    PaidAmountCurrency   = element.Sum(sum => sum.PaidAmountCurrency),
                    Payment              = element.Sum(sum => sum.Payment),
                    PaymentCurrency      = element.Sum(sum => sum.PaymentCurrency),
                    Products             = string.Join('\n', element.Select(select => select.Products)),
                    Purchase             = element.Sum(sum => sum.Purchase),
                    PurchaseCurrency     = element.Sum(sum => sum.PurchaseCurrency),
                    StartBalance         = element.Sum(sum => sum.StartBalance),
                    StartBalanceCurrency = element.Sum(sum => sum.StartBalanceCurrency),
                    SupplierCode         = element.FirstOrDefault().SupplierCode,
                    SupplierName         = element.FirstOrDefault().SupplierName
                })
                         .ToList();
            }

            return(result.OrderBy(element => element.Currency).ThenBy(element => element.SupplierName).ToList());
        }
Пример #4
0
        public List <CreditBalanceViewModel> GetReport(bool isImport, string suplierName, int month, int year, int offSet, bool isForeignCurrency, int divisionId)
        {
            var firstDayOfMonth = new DateTime(year, month, 1);

            IQueryable <CreditorAccountModel> query = DbContext.CreditorAccounts.Where(x => x.SupplierIsImport == isImport).AsQueryable();


            List <CreditBalanceViewModel> result = new List <CreditBalanceViewModel>();
            int previousMonth = month - 1;
            int previousYear  = year;

            if (previousMonth == 0)
            {
                previousMonth = 12;
                previousYear  = year - 1;
            }


            if (isForeignCurrency)
            {
                query = query.Where(entity => entity.CurrencyCode != "IDR");
            }
            //else

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

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

            var queryRemainingBalance = query;

            if (!string.IsNullOrEmpty(suplierName))
            {
                query = query.Where(x => x.SupplierName == suplierName);
            }
            else
            {
                queryRemainingBalance = query.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.DateTime < firstDayOfMonth);
            }

            query = query.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == month && x.UnitReceiptNoteDate.Value.Year == year);

            var data = query.ToList();

            if (string.IsNullOrEmpty(suplierName))
            {
                data.AddRange(queryRemainingBalance.ToList());
            }

            var grouppedData = data.GroupBy(x => new { x.SupplierCode, x.DivisionCode, x.CurrencyCode }).ToList();

            foreach (var item in grouppedData)
            {
                var productsUnion  = string.Join("\n", item.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == month && x.UnitReceiptNoteDate.Value.Year == year).Select(x => x.Products).ToList());
                var uniqueProducts = string.Join("\n", productsUnion.Split("\n").Distinct());
                //var now = DateTimeOffset.Now;

                var creditBalance = new CreditBalanceViewModel()
                {
                    StartBalance = DbSet
                                   .AsQueryable()
                                   .Where(x => x.SupplierCode == item.Key.SupplierCode && x.DivisionCode == item.Key.DivisionCode && x.CurrencyCode == item.Key.CurrencyCode && x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.DateTime < firstDayOfMonth)
                                   .ToList().Sum(x => x.UnitReceiptMutation - x.BankExpenditureNoteMutation),
                    Products     = uniqueProducts,
                    Purchase     = item.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == month && x.UnitReceiptNoteDate.Value.Year == year).Sum(x => x.UnitReceiptMutation),
                    Payment      = item.Where(x => x.UnitReceiptNoteDate.HasValue && x.UnitReceiptNoteDate.Value.Month == month && x.UnitReceiptNoteDate.Value.Year == year).Sum(x => x.BankExpenditureNoteMutation),
                    FinalBalance = item.Sum(x => x.FinalBalance),
                    SupplierName = item.FirstOrDefault() == null ? "" : item.FirstOrDefault().SupplierName ?? "",
                    Currency     = item.FirstOrDefault() == null ? "" : item.FirstOrDefault().CurrencyCode ?? "",
                    CurrencyRate = item.FirstOrDefault() == null ? 1 : item.FirstOrDefault().CurrencyRate,
                    DivisionName = item.FirstOrDefault() == null ? "" : item.FirstOrDefault().DivisionName ?? "",
                };

                creditBalance.FinalBalance = creditBalance.StartBalance + creditBalance.Purchase - creditBalance.Payment;
                result.Add(creditBalance);
            }

            return(result.OrderBy(x => x.SupplierName).ToList());
        }