public void Should_Success_Build_BaseResponses()
        {
            var idCOAResult = new IdCOAResult()
            {
                COACode = "",
                Code    = "",
                Id      = 0
            };

            var bankAccountCOAResult = new BankAccountCOAResult()
            {
                AccountCOA = "",
                Id         = 0
            };

            var incomeTaxCOAResult = new IncomeTaxCOAResult()
            {
                COACodeCredit = "",
                Id            = 0
            };

            Assert.NotNull(idCOAResult);
            Assert.NotNull(bankAccountCOAResult);
            Assert.NotNull(incomeTaxCOAResult);
        }
        private async Task AutoCreateJournalTransaction(PPHBankExpenditureNote model)
        {
            var journalTransactionToPost = new JournalTransaction()
            {
                Date        = model.Date,
                Description = "Bon Terima Unit",
                ReferenceNo = model.No,
                Status      = "POSTED",
                Items       = new List <JournalTransactionItem>()
            };

            int.TryParse(model.BankId, out int bankAccountId);
            var bankAccount = BankAccounts.FirstOrDefault(entity => entity.Id == bankAccountId);

            if (bankAccount == null)
            {
                bankAccount = new BankAccountCOAResult()
                {
                    AccountCOA = "9999.00.00.00"
                };
            }

            int.TryParse(model.IncomeTaxId, out int incomeTaxId);
            var incomeTax = IncomeTaxes.FirstOrDefault(entity => entity.Id == incomeTaxId);

            if (incomeTax == null)
            {
                incomeTax = new IncomeTaxCOAResult()
                {
                    COACodeCredit = "9999.00"
                };
            }

            var journalDebitItems  = new List <JournalTransactionItem>();
            var journalCreditItems = new List <JournalTransactionItem>();

            journalCreditItems.Add(new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = bankAccount.AccountCOA
                },
                Credit = (decimal)model.TotalIncomeTax
            });

            var purchasingDocumentExpeditionIds = model.Items.Select(item => item.PurchasingDocumentExpeditionId).ToList();
            var purchasingDocumentExpeditions   = await dbContext.PurchasingDocumentExpeditions.Include(entity => entity.Items).Where(entity => purchasingDocumentExpeditionIds.Contains(entity.Id)).ToListAsync();

            foreach (var item in model.Items)
            {
                var purchasingDocumentExpedition = purchasingDocumentExpeditions.FirstOrDefault(entity => entity.Id == item.PurchasingDocumentExpeditionId);
                var division = Divisions.FirstOrDefault(entity => entity.Code == purchasingDocumentExpedition.DivisionCode);
                if (division == null)
                {
                    division = new IdCOAResult()
                    {
                        COACode = "0"
                    };
                }

                journalDebitItems.Add(new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = $"{incomeTax.COACodeCredit}.{division.COACode}.00"
                    },
                    Debit = (decimal)purchasingDocumentExpedition.IncomeTax
                });
            }

            journalDebitItems = journalDebitItems.GroupBy(grouping => grouping.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.Key
                },
                Debit  = s.Sum(sum => Math.Round(sum.Debit.GetValueOrDefault(), 4)),
                Credit = 0,
                //Remark = string.Join("\n", s.Select(grouped => grouped.Remark).ToList())
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalDebitItems);

            journalCreditItems = journalCreditItems.GroupBy(grouping => grouping.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.Key
                },
                Debit  = 0,
                Credit = s.Sum(sum => Math.Round(sum.Credit.GetValueOrDefault(), 4)),
                //Remark = string.Join("\n", s.Select(grouped => grouped.Remark).ToList())
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalCreditItems);

            if (journalTransactionToPost.Items.Any(item => item.COA.Code.Split(".").FirstOrDefault().Equals("9999")))
            {
                journalTransactionToPost.Status = "DRAFT";
            }

            string journalTransactionUri = "journal-transactions";
            var    httpClient            = (IHttpClientService)_serviceProvider.GetService(typeof(IHttpClientService));
            var    response = await httpClient.PostAsync($"{APIEndpoint.Finance}{journalTransactionUri}", new StringContent(JsonConvert.SerializeObject(journalTransactionToPost).ToString(), Encoding.UTF8, General.JsonMediaType));

            response.EnsureSuccessStatusCode();
        }
        private async Task AutoCreateJournalTransaction(PPHBankExpenditureNote model)
        {
            var jsonSerializerSettings = new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            };

            var divisions    = JsonConvert.DeserializeObject <List <IdCOAResult> >(_jsonDivisions ?? "[]", jsonSerializerSettings);
            var units        = JsonConvert.DeserializeObject <List <IdCOAResult> >(_jsonUnits ?? "[]", jsonSerializerSettings);
            var categories   = JsonConvert.DeserializeObject <List <CategoryCOAResult> >(_jsonCategories ?? "[]", jsonSerializerSettings);
            var incomeTaxes  = JsonConvert.DeserializeObject <List <IncomeTaxCOAResult> >(_jsonIncomeTaxes ?? "[]", jsonSerializerSettings);
            var accountBanks = JsonConvert.DeserializeObject <List <BankAccountCOAResult> >(_jsonAccountBanks ?? "[]", jsonSerializerSettings);

            var journalTransactionToPost = new JournalTransaction()
            {
                Date        = model.Date,
                Description = "Pengajuan Pembayaran PPh",
                ReferenceNo = model.No,
                Status      = "POSTED",
                Items       = new List <JournalTransactionItem>()
            };

            int.TryParse(model.BankId, out int bankAccountId);
            var bankAccount = accountBanks.FirstOrDefault(entity => entity.Id == bankAccountId);

            if (bankAccount == null)
            {
                bankAccount = new BankAccountCOAResult()
                {
                    AccountCOA = "9999.00.00.00"
                };
            }

            //int.TryParse(model.IncomeTaxId, out int incomeTaxId);
            //var incomeTax = incomeTaxes.FirstOrDefault(entity => entity.Id == incomeTaxId);
            //if (incomeTax == null)
            //{
            //    incomeTax = new IncomeTaxCOAResult()
            //    {
            //        COACodeCredit = "9999.00"
            //    };
            //}

            var journalDebitItems  = new List <JournalTransactionItem>();
            var journalCreditItems = new List <JournalTransactionItem>();

            var upoNos            = model.Items.Select(element => element.UnitPaymentOrderNo).ToList();
            var unitPaymentOrders = dbContext.UnitPaymentOrders.Where(entity => upoNos.Contains(entity.UPONo)).ToList();


            var purchasingDocumentExpeditionIds = model.Items.Select(item => item.PurchasingDocumentExpeditionId).ToList();
            var purchasingDocumentExpeditions   = await dbContext.PurchasingDocumentExpeditions.Include(entity => entity.Items).Where(entity => purchasingDocumentExpeditionIds.Contains(entity.Id)).ToListAsync();

            foreach (var item in model.Items)
            {
                var unitPaymentOrder = unitPaymentOrders.FirstOrDefault(element => element.UPONo == item.UnitPaymentOrderNo);
                if (unitPaymentOrder == null)
                {
                    unitPaymentOrder = new UnitPaymentOrder();
                }

                var purchasingDocumentExpedition = purchasingDocumentExpeditions.FirstOrDefault(entity => entity.Id == item.PurchasingDocumentExpeditionId);
                var division = divisions.FirstOrDefault(entity => entity.Code == purchasingDocumentExpedition.DivisionCode);
                if (division == null)
                {
                    division = new IdCOAResult()
                    {
                        COACode = "0"
                    };
                }

                int.TryParse(unitPaymentOrder.IncomeTaxId, out int incomeTaxId);
                var incomeTax = incomeTaxes.FirstOrDefault(entity => entity.Id == incomeTaxId);
                if (incomeTax == null)
                {
                    incomeTax = new IncomeTaxCOAResult()
                    {
                        COACodeCredit = "9999.00"
                    };
                }

                journalDebitItems.Add(new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = $"{incomeTax.COACodeCredit}.{division.COACode}.00"
                    },
                    Debit = (decimal)purchasingDocumentExpedition.IncomeTax * (decimal)model.CurrencyRate.GetValueOrDefault()
                });
            }


            journalCreditItems.Add(new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = bankAccount.AccountCOA
                },
                Credit = journalDebitItems.Sum(element => element.Debit)
            });

            journalDebitItems = journalDebitItems.GroupBy(grouping => grouping.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.Key
                },
                Debit  = s.Sum(sum => Math.Round(sum.Debit.GetValueOrDefault(), 4)),
                Credit = 0,
                //Remark = string.Join("\n", s.Select(grouped => grouped.Remark).ToList())
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalDebitItems);

            journalCreditItems = journalCreditItems.GroupBy(grouping => grouping.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.Key
                },
                Debit  = 0,
                Credit = s.Sum(sum => Math.Round(sum.Credit.GetValueOrDefault(), 4)),
                //Remark = string.Join("\n", s.Select(grouped => grouped.Remark).ToList())
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalCreditItems);

            if (journalTransactionToPost.Items.Any(item => item.COA.Code.Split(".").FirstOrDefault().Equals("9999")))
            {
                journalTransactionToPost.Status = "DRAFT";
            }

            string journalTransactionUri = "journal-transactions";
            var    httpClient            = (IHttpClientService)_serviceProvider.GetService(typeof(IHttpClientService));
            var    response = await httpClient.PostAsync($"{APIEndpoint.Finance}{journalTransactionUri}", new StringContent(JsonConvert.SerializeObject(journalTransactionToPost).ToString(), Encoding.UTF8, General.JsonMediaType));

            response.EnsureSuccessStatusCode();
        }