Esempio n. 1
0
        private void CreateJournalTransaction(BankExpenditureNoteModel model, IdentityService identityService)
        {
            var items = new List <JournalTransactionItem>();

            foreach (var detail in model.Details)
            {
                var sumDataByUnit = detail.Items.GroupBy(g => g.UnitCode).Select(s => new
                {
                    s.First().UnitCode,
                    Total = s.Sum(sm => sm.Price)
                });

                foreach (var datum in sumDataByUnit)
                {
                    var item = new JournalTransactionItem()
                    {
                        COA = new COA()
                        {
                            Code = COAGenerator.GetDebtCOA(model.SupplierImport, detail.DivisionName, datum.UnitCode)
                        },
                        Debit = datum.Total
                    };

                    items.Add(item);
                }
            }

            items = items.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA   = s.First().COA,
                Debit = s.Sum(sm => sm.Debit)
            }).ToList();

            var bankJournalItem = new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = model.BankAccountCOA
                },
                Credit = items.Sum(s => s.Debit)
            };

            items.Add(bankJournalItem);

            var modelToPost = new JournalTransaction()
            {
                Date        = DateTimeOffset.Now,
                Description = "Bukti Pengeluaran Bank",
                ReferenceNo = model.DocumentNo,
                Items       = items
            };

            string journalTransactionUri = "journal-transactions";
            //var httpClient = new HttpClientService(identityService);
            var httpClient = (IHttpClientService)serviceProvider.GetService(typeof(IHttpClientService));
            var response   = httpClient.PostAsync($"{APIEndpoint.Finance}{journalTransactionUri}", new StringContent(JsonConvert.SerializeObject(modelToPost).ToString(), Encoding.UTF8, General.JsonMediaType)).Result;

            response.EnsureSuccessStatusCode();
        }
        //
        // Write a object instance to data output stream
        //
        public override void LooseMarshal(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut)
        {
            JournalTransaction info = (JournalTransaction)o;

            base.LooseMarshal(wireFormat, o, dataOut);
            LooseMarshalNestedObject(wireFormat, (DataStructure)info.TransactionId, dataOut);
            dataOut.Write(info.Type);
            dataOut.Write(info.WasPrepared);
        }
        //
        // Un-marshal an object instance from the data input stream
        //
        public override void LooseUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn)
        {
            base.LooseUnmarshal(wireFormat, o, dataIn);

            JournalTransaction info = (JournalTransaction)o;

            info.TransactionId = (TransactionId)LooseUnmarshalNestedObject(wireFormat, dataIn);
            info.Type          = dataIn.ReadByte();
            info.WasPrepared   = dataIn.ReadBoolean();
        }
        //
        // Write a object instance to data output stream
        //
        public override void TightMarshal2(OpenWireFormat wireFormat, Object o, BinaryWriter dataOut, BooleanStream bs)
        {
            base.TightMarshal2(wireFormat, o, dataOut, bs);

            JournalTransaction info = (JournalTransaction)o;

            TightMarshalNestedObject2(wireFormat, (DataStructure)info.TransactionId, dataOut, bs);
            dataOut.Write(info.Type);
            bs.ReadBoolean();
        }
        //
        // Un-marshal an object instance from the data input stream
        //
        public override void TightUnmarshal(OpenWireFormat wireFormat, Object o, BinaryReader dataIn, BooleanStream bs)
        {
            base.TightUnmarshal(wireFormat, o, dataIn, bs);

            JournalTransaction info = (JournalTransaction)o;

            info.TransactionId = (TransactionId)TightUnmarshalNestedObject(wireFormat, dataIn, bs);
            info.Type          = dataIn.ReadByte();
            info.WasPrepared   = bs.ReadBoolean();
        }
        //
        // Write the booleans that this object uses to a BooleanStream
        //
        public override int TightMarshal1(OpenWireFormat wireFormat, Object o, BooleanStream bs)
        {
            JournalTransaction info = (JournalTransaction)o;

            int rc = base.TightMarshal1(wireFormat, o, bs);

            rc += TightMarshalNestedObject1(wireFormat, (DataStructure)info.TransactionId, bs);
            bs.WriteBoolean(info.WasPrepared);

            return(rc + 1);
        }
        public void RejectTransaction([FromBody] JournalTransaction transaction)
        {
            var sqlTransaction = GetDbContext().Select <SqlEntities.JournalTransaction>()
                                 .FirstOrDefault(t => t.Id == transaction.Id);

            if (sqlTransaction == null)
            {
                return;
            }

            sqlTransaction.Status      = (int)TransactionStatusType.Rejected;
            sqlTransaction.ResolveDate = DateTime.Now;
            sqlTransaction.ResolvedBy  = transaction.ResolvedBy.Id;
            sqlTransaction.Description = transaction.Description;

            GetDbContext().Update(sqlTransaction);
        }
        public void AddTransaction([FromBody] JournalTransaction transaction)
        {
            var dbContext = GetDbContext();

            var sqlTransaction = new SqlEntities.JournalTransaction
            {
                CreatedBy   = transaction.CreatedBy.Id,
                CreateDate  = DateTime.Now,
                Description = transaction.Description,
                Type        = (int)transaction.Type,
                Status      = (int)transaction.Status
            };

            int transactionId = dbContext.Insert(sqlTransaction);

            if (transaction.Attachments != null)
            {
                var sqlAttachments = transaction.Attachments.Select(a => new SqlEntities.Attachment
                {
                    TransactionId = transactionId,
                    Name          = a.Name,
                    Path          = a.Path
                });

                foreach (var attachment in sqlAttachments)
                {
                    dbContext.Insert(attachment);
                }
            }



            var sqlEntries = transaction.Entries.Select(entry => new SqlEntities.JournalEntry
            {
                Amount        = entry.Amount,
                TransactionId = transactionId,
                Side          = (int)entry.Side,
                AccountId     = entry.Account.Id
            });

            foreach (var entry in sqlEntries)
            {
                dbContext.Insert(entry);
            }
        }
        public void ApproveTransaction([FromBody] JournalTransaction transaction)
        {
            var dbContext      = GetDbContext();
            var sqlTransaction = dbContext.Select <SqlEntities.JournalTransaction>().FirstOrDefault(t => t.Id == transaction.Id);

            //Terminate if transaction ID does not exist
            if (sqlTransaction == null)
            {
                return;
            }

            var entries = dbContext.Select <SqlEntities.JournalEntry>().Where(e => e.TransactionId == transaction.Id);

            PostTransactions(entries);

            sqlTransaction.Description = transaction.Description;
            sqlTransaction.Status      = (int)TransactionStatusType.Approved;
            sqlTransaction.ResolveDate = DateTime.Now;
            sqlTransaction.ResolvedBy  = transaction.ResolvedBy.Id;

            dbContext.Update(sqlTransaction);
        }
Esempio n. 10
0
        private static ISubledgerTransaction BuildSubledgerTransaction(TransactionType type, TransactionStatus status, decimal amount)
        {
            ISubledgerTransaction subledgerTransaction = null;

            if (type == TransactionType.Invoice)
            {
                subledgerTransaction = new InvoiceTransaction(status, amount);
            }
            else if (type == TransactionType.Credit)
            {
                subledgerTransaction = new CreditTransaction(amount);
            }
            else if (type == TransactionType.JournalAr || type == TransactionType.JournalNar)
            {
                subledgerTransaction = new JournalTransaction(amount);
            }
            else if (type == TransactionType.Receipt)
            {
                subledgerTransaction = new ReceiptTransaction(amount);
            }
            else if (type == TransactionType.Overpayment)
            {
                subledgerTransaction = new OverpaymentTransaction(amount);
            }
            else if (type == TransactionType.CreditBalanceTransferCredit || type == TransactionType.CreditBalanceTransferDebit || type == TransactionType.Allocation)
            {
                subledgerTransaction = new CreditBalanceTransferTransaction(amount);
            }
            else if (type == TransactionType.Discount)
            {
                subledgerTransaction = new DiscountTransaction(amount);
            }
            else if (type == TransactionType.Repurchase)
            {
                subledgerTransaction = new RepurchaseTransaction(amount);
            }
            return(subledgerTransaction);
        }
Esempio n. 11
0
        private async Task CreateJournalTransaction(BankExpenditureNoteModel model, IdentityService identityService)
        {
            //var unitPaymentOrderIds = model.Details.Select(detail => detail.UnitPaymentOrderId).ToList();
            //var unitPaymentOrders = dbContext.UnitPaymentOrders.Where(unitPaymentOrder => unitPaymentOrderIds.Contains(unitPaymentOrder.Id)).ToList();
            var items = new List <JournalTransactionItem>();

            foreach (var detail in model.Details)
            {
                //var unitPaymentOrder = unitPaymentOrders.FirstOrDefault(entity => entity.Id == detail.UnitPaymentOrderId);
                var sumDataByUnit = detail.Items.GroupBy(g => g.UnitCode).Select(s => new
                {
                    UnitCode = s.Key,
                    Total    = s.Sum(sm => sm.Price)
                });



                foreach (var datum in sumDataByUnit)
                {
                    var item = new JournalTransactionItem()
                    {
                        COA = new COA()
                        {
                            Code = COAGenerator.GetDebtCOA(model.SupplierImport, detail.DivisionName, datum.UnitCode)
                        },
                        Debit  = Convert.ToDecimal(datum.Total),
                        Remark = detail.UnitPaymentOrderNo + " / " + detail.InvoiceNo
                    };

                    var vatCOA = "";
                    if (detail.Vat > 0)
                    {
                        if (model.SupplierImport)
                        {
                            vatCOA = "1510.00." + COAGenerator.GetDivisionAndUnitCOACode(detail.DivisionName, datum.UnitCode);
                        }
                        else
                        {
                            vatCOA = "1509.00." + COAGenerator.GetDivisionAndUnitCOACode(detail.DivisionName, datum.UnitCode);
                        }
                    }

                    if (string.IsNullOrWhiteSpace(vatCOA))
                    {
                        var vatItem = new JournalTransactionItem()
                        {
                            COA = new COA()
                            {
                                Code = vatCOA
                            },
                            Debit = Convert.ToDecimal(datum.Total * 0.1)
                        };

                        items.Add(vatItem);
                    }

                    items.Add(item);
                }
            }

            //items = items.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            //{
            //    COA = s.First().COA,
            //    Debit = s.Sum(sm => Math.Round(sm.Debit.GetValueOrDefault(), 4))
            //}).ToList();

            var bankJournalItem = new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = model.BankAccountCOA
                },
                Credit = items.Sum(s => Math.Round(s.Debit.GetValueOrDefault(), 4))
            };

            items.Add(bankJournalItem);

            var modelToPost = new JournalTransaction()
            {
                Date        = DateTimeOffset.Now,
                Description = "Bukti Pengeluaran Bank",
                ReferenceNo = model.DocumentNo,
                Items       = items
            };

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

            response.EnsureSuccessStatusCode();
        }
        private async Task AutoCreateJournalTransaction(UnitPaymentCorrectionNote unitPaymentCorrection)
        {
            foreach (var unitPaymentCorrectionItem in unitPaymentCorrection.Items)
            {
                var unitReceiptNote = dbContext.UnitReceiptNotes.Where(entity => entity.URNNo == unitPaymentCorrectionItem.URNNo).Include(entity => entity.Items).FirstOrDefault();

                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 purchaseRequestIds = unitReceiptNote.Items.Select(s => s.PRId).ToList();
                var purchaseRequests   = dbContext.PurchaseRequests.Where(w => purchaseRequestIds.Contains(w.Id)).Select(s => new { s.Id, s.CategoryCode, s.CategoryId }).ToList();

                var externalPurchaseOrderIds = unitReceiptNote.Items.Select(s => s.EPOId).ToList();
                var externalPurchaseOrders   = dbContext.ExternalPurchaseOrders.Where(w => externalPurchaseOrderIds.Contains(w.Id)).Select(s => new { s.Id, s.IncomeTaxId, s.UseIncomeTax, s.IncomeTaxName, s.IncomeTaxRate, s.CurrencyCode, s.CurrencyRate }).ToList();



                var externalPurchaseOrderDetailIds = unitReceiptNote.Items.Select(s => s.EPODetailId).ToList();
                var externalPurchaseOrderDetails   = dbContext.ExternalPurchaseOrderDetails.Where(w => externalPurchaseOrderDetailIds.Contains(w.Id)).Select(s => new { s.Id, s.ProductId, TotalPrice = s.PricePerDealUnit * s.DealQuantity, s.DealQuantity }).ToList();

                //var postMany = new List<Task<HttpResponseMessage>>();

                //var journalTransactionsToPost = new List<JournalTransaction>();

                var journalTransactionToPost = new JournalTransaction()
                {
                    Date        = unitPaymentCorrection.CorrectionDate,
                    Description = $"Nota Koreksi {unitReceiptNote.URNNo}",
                    ReferenceNo = unitPaymentCorrection.UPCNo,
                    Status      = "POSTED",
                    Items       = new List <JournalTransactionItem>()
                };

                int.TryParse(unitReceiptNote.DivisionId, out var divisionId);
                var division = divisions.FirstOrDefault(f => f.Id.Equals(divisionId));
                if (division == null)
                {
                    division = new IdCOAResult()
                    {
                        COACode = "0"
                    };
                }
                else
                {
                    if (string.IsNullOrEmpty(division.COACode))
                    {
                        division.COACode = "0";
                    }
                }


                int.TryParse(unitReceiptNote.UnitId, out var unitId);
                var unit = units.FirstOrDefault(f => f.Id.Equals(unitId));
                if (unit == null)
                {
                    unit = new IdCOAResult()
                    {
                        COACode = "00"
                    };
                }
                else
                {
                    if (string.IsNullOrEmpty(unit.COACode))
                    {
                        unit.COACode = "00";
                    }
                }


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

                foreach (var unitReceiptNoteItem in unitReceiptNote.Items)
                {
                    var purchaseRequest        = purchaseRequests.FirstOrDefault(f => f.Id.Equals(unitReceiptNoteItem.PRId));
                    var externalPurchaseOrder  = externalPurchaseOrders.FirstOrDefault(f => f.Id.Equals(unitReceiptNoteItem.EPOId));
                    var unitPaymentOrderDetail = dbContext.UnitPaymentOrderDetails.FirstOrDefault(entity => entity.URNItemId == unitReceiptNoteItem.Id);

                    //double.TryParse(externalPurchaseOrder.IncomeTaxRate, out var incomeTaxRate);

                    //var currency = await _currencyProvider.GetCurrencyByCurrencyCode(externalPurchaseOrder.CurrencyCode);
                    //var currencyTupples = new Tuple<>
                    var currencyTuples = new List <Tuple <string, DateTimeOffset> > {
                        new Tuple <string, DateTimeOffset>(externalPurchaseOrder.CurrencyCode, unitPaymentCorrection.CorrectionDate)
                    };
                    var currency = await _currencyProvider.GetCurrencyByCurrencyCodeDateList(currencyTuples);

                    var currencyRate = currency != null && currency.FirstOrDefault() != null ? (decimal)currency.FirstOrDefault().Rate.GetValueOrDefault() : (decimal)externalPurchaseOrder.CurrencyRate;

                    //if (!externalPurchaseOrder.UseIncomeTax)
                    //    incomeTaxRate = 1;
                    //var externalPurchaseOrderDetail = externalPurchaseOrderDetails.FirstOrDefault(f => f.Id.Equals(item.EPODetailId));
                    var externalPOPriceTotal = externalPurchaseOrderDetails.Where(w => w.ProductId.Equals(unitReceiptNoteItem.ProductId) && w.Id.Equals(unitReceiptNoteItem.EPODetailId)).Sum(s => s.TotalPrice);



                    int.TryParse(purchaseRequest.CategoryId, out var categoryId);
                    var category = categories.FirstOrDefault(f => f.Id.Equals(categoryId));
                    if (category == null)
                    {
                        category = new CategoryCOAResult()
                        {
                            ImportDebtCOA = "9999.00",
                            LocalDebtCOA  = "9999.00",
                            PurchasingCOA = "9999.00",
                            StockCOA      = "9999.00"
                        };
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(category.ImportDebtCOA))
                        {
                            category.ImportDebtCOA = "9999.00";
                        }
                        if (string.IsNullOrEmpty(category.LocalDebtCOA))
                        {
                            category.LocalDebtCOA = "9999.00";
                        }
                        if (string.IsNullOrEmpty(category.PurchasingCOA))
                        {
                            category.PurchasingCOA = "9999.00";
                        }
                        if (string.IsNullOrEmpty(category.StockCOA))
                        {
                            category.StockCOA = "9999.00";
                        }
                    }

                    double.TryParse(externalPurchaseOrder.IncomeTaxRate, out var incomeTaxRate);

                    var grandTotal = (decimal)0.0;
                    if (unitPaymentCorrection.CorrectionType == "Harga Total")
                    {
                        grandTotal = (decimal)((unitPaymentCorrectionItem.PriceTotalAfter - unitPaymentCorrectionItem.PriceTotalBefore) * unitPaymentCorrectionItem.Quantity);
                    }
                    else if (unitPaymentCorrection.CorrectionType == "Harga Satuan")
                    {
                        grandTotal = (decimal)(unitPaymentCorrectionItem.PricePerDealUnitAfter - unitPaymentCorrectionItem.PricePerDealUnitBefore);
                    }
                    else if (unitPaymentCorrection.CorrectionType == "Jumlah")
                    {
                        grandTotal = (decimal)(unitPaymentOrderDetail.QuantityCorrection * unitPaymentOrderDetail.PricePerDealUnit);
                    }

                    if (grandTotal != 0)
                    {
                        if (unitPaymentCorrection.useIncomeTax)
                        {
                            int.TryParse(externalPurchaseOrder.IncomeTaxId, out var incomeTaxId);
                            var incomeTax = incomeTaxes.FirstOrDefault(f => f.Id.Equals(incomeTaxId));

                            if (incomeTax == null || string.IsNullOrWhiteSpace(incomeTax.COACodeCredit))
                            {
                                incomeTax = new IncomeTaxCOAResult()
                                {
                                    COACodeCredit = "9999.00"
                                };
                            }

                            var incomeTaxTotal = (decimal)incomeTaxRate / 100 * grandTotal;

                            journalDebitItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = unitReceiptNote.SupplierIsImport ? $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}" : $"{category.LocalDebtCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Debit = incomeTaxTotal
                            });

                            journalCreditItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{incomeTax.COACodeCredit}.{division.COACode}.{unit.COACode}"
                                },
                                Credit = incomeTaxTotal
                            });
                        }

                        if (unitPaymentCorrection.useVat)
                        {
                            var inVATCOA = "1509.00";
                            var totalVAT = (decimal)0.1 * grandTotal;
                            journalCreditItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = unitReceiptNote.SupplierIsImport ? $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}" : $"{category.LocalDebtCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Credit = totalVAT
                            });

                            journalDebitItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{inVATCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Debit  = totalVAT,
                                Remark = unitPaymentCorrection.VatTaxCorrectionNo
                            });
                        }

                        if (unitReceiptNote.SupplierIsImport && ((decimal)externalPOPriceTotal * currencyRate) > 100000000)
                        {
                            //Purchasing Journal Item
                            journalDebitItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{category.PurchasingCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Debit  = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });

                            //Debt Journal Item
                            journalCreditItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Credit = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });

                            //Stock Journal Item
                            journalDebitItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{category.StockCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Debit  = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });

                            //Purchasing Journal Item
                            journalCreditItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{category.PurchasingCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Credit = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });
                        }
                        else
                        {
                            //Purchasing Journal Item
                            journalDebitItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = $"{category.PurchasingCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Debit  = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });

                            if (SpecialCategoryCode.Contains(category.Code))
                            {
                                //Stock Journal Item
                                journalDebitItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = $"{category.StockCOA}.{division.COACode}.{unit.COACode}"
                                    },
                                    Debit  = grandTotal,
                                    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                });
                            }


                            //Debt Journal Item
                            journalCreditItems.Add(new JournalTransactionItem()
                            {
                                COA = new COA()
                                {
                                    Code = unitReceiptNote.SupplierIsImport ? $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}" : $"{category.LocalDebtCOA}.{division.COACode}.{unit.COACode}"
                                },
                                Credit = grandTotal,
                                Remark = $"- {unitReceiptNoteItem.ProductName}"
                            });

                            if (SpecialCategoryCode.Contains(category.Code))
                            {
                                //Purchasing Journal Item
                                journalCreditItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = $"{category.PurchasingCOA}.{division.COACode}.{unit.COACode}"
                                    },
                                    Credit = grandTotal,
                                    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                });
                            }
                        }
                    }
                }


                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)) > 0 ? s.Sum(sum => Math.Abs(Math.Round(sum.Debit.GetValueOrDefault(), 4))) : 0,
                    Credit = s.Sum(sum => Math.Round(sum.Debit.GetValueOrDefault(), 4)) > 0 ? 0 : s.Sum(sum => Math.Abs(Math.Round(sum.Debit.GetValueOrDefault(), 4))),
                    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
                    },
                    Credit = s.Sum(sum => Math.Round(sum.Credit.GetValueOrDefault(), 4)) > 0 ? s.Sum(sum => Math.Abs(Math.Round(sum.Credit.GetValueOrDefault(), 4))) : 0,
                    Debit  = s.Sum(sum => Math.Round(sum.Credit.GetValueOrDefault(), 4)) > 0 ? 0 : s.Sum(sum => Math.Abs(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";
                }

                if (journalTransactionToPost.Items.Count > 0)
                {
                    var 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();
                }
            }
        }
        public async Task CreateJournalTransactionUnitReceiptNote(UnitReceiptNote model)

        {
            var items = new List <JournalTransactionItem>();

            var purchasingItems    = new List <JournalTransactionItem>();
            var stockItems         = new List <JournalTransactionItem>();
            var debtItems          = new List <JournalTransactionItem>();
            var incomeTaxPaidItems = new List <JournalTransactionItem>();
            var incomeTaxItems     = new List <JournalTransactionItem>();
            var productListRemark  = new List <string>();

            foreach (var item in model.Items)
            {
                var purchaseRequest = dbContext.PurchaseRequests.FirstOrDefault(f => f.Id.Equals(item.PRId));
                var poExternalItem  = dbContext.ExternalPurchaseOrderItems.FirstOrDefault(f => f.PRId.Equals(item.PRId));
                var poExternal      = dbContext.ExternalPurchaseOrders.FirstOrDefault(f => f.Id.Equals(poExternalItem.EPOId));

                var purchasingCOACode = "";
                var stockCOACode      = "";
                var debtCOACode       = "";
                var incomeTaxCOACode  = "";
                if (purchaseRequest != null)
                {
                    purchasingCOACode = COAGenerator.GetPurchasingCOA(purchaseRequest.DivisionName, purchaseRequest.UnitCode, purchaseRequest.CategoryCode);
                    stockCOACode      = COAGenerator.GetStockCOA(purchaseRequest.DivisionName, purchaseRequest.UnitCode, purchaseRequest.CategoryCode);
                    debtCOACode       = COAGenerator.GetDebtCOA(model.SupplierIsImport, purchaseRequest.DivisionName, purchaseRequest.UnitCode);
                    if (poExternal.UseIncomeTax && double.TryParse(poExternal.IncomeTaxRate, out double test) && double.Parse(poExternal.IncomeTaxRate) > 0)
                    {
                        incomeTaxCOACode = COAGenerator.GetIncomeTaxCOA(poExternal.IncomeTaxName, purchaseRequest.DivisionName, purchaseRequest.UnitCode);
                    }
                }

                var journalPurchasingItem = new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = purchasingCOACode
                    },
                    Debit = item.PricePerDealUnit * item.ReceiptQuantity,
                };
                purchasingItems.Add(journalPurchasingItem);

                var journalStockItem = new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = stockCOACode
                    },
                    Debit = item.PricePerDealUnit * item.ReceiptQuantity,
                };
                stockItems.Add(journalStockItem);

                var journalDebtItem = new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = debtCOACode
                    },
                    Credit = item.PricePerDealUnit * item.ReceiptQuantity
                };
                debtItems.Add(journalDebtItem);

                if (poExternal.UseIncomeTax && double.Parse(poExternal.IncomeTaxRate) > 0)
                {
                    var pphItem = new JournalTransactionItem()
                    {
                        COA = new COA()
                        {
                            Code = incomeTaxCOACode
                        },
                        Credit = item.PricePerDealUnit * item.ReceiptQuantity * double.Parse(poExternal.IncomeTaxRate) / 100
                    };
                    incomeTaxItems.Add(pphItem);

                    var incomeTaxPaid = new JournalTransactionItem()
                    {
                        COA = new COA()
                        {
                            Code = debtCOACode
                        },
                        Debit = item.PricePerDealUnit * item.ReceiptQuantity * double.Parse(poExternal.IncomeTaxRate) / 100
                    };
                    incomeTaxPaidItems.Add(incomeTaxPaid);
                }


                productListRemark.Add($"- {item.ProductName}");
            }

            purchasingItems = purchasingItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Debit  = s.Sum(sum => sum.Debit),
                Remark = string.Join("\n", productListRemark)
            }).ToList();
            items.AddRange(purchasingItems);

            debtItems = debtItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Credit = s.Sum(sum => sum.Credit)
            }).ToList();
            items.AddRange(debtItems);

            incomeTaxPaidItems = incomeTaxPaidItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Debit = s.Sum(sum => sum.Debit)
            }).ToList();
            if (incomeTaxPaidItems.Count > 0)
            {
                items.AddRange(incomeTaxPaidItems);
            }

            incomeTaxItems = incomeTaxItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Credit = s.Sum(sum => sum.Credit)
            }).ToList();
            if (incomeTaxItems.Count > 0)
            {
                items.AddRange(incomeTaxItems);
            }

            stockItems = stockItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Debit  = s.Sum(sum => sum.Debit),
                Remark = string.Join("\n", productListRemark)
            }).ToList();
            items.AddRange(stockItems);

            var purchasingCreditItems = purchasingItems.GroupBy(g => g.COA.Code).Select(s => new JournalTransactionItem()
            {
                COA = new COA()
                {
                    Code = s.First().COA.Code
                },
                Credit = s.Sum(sum => sum.Debit)
            }).ToList();

            items.AddRange(purchasingCreditItems);

            var modelToPost = new JournalTransaction()
            {
                Date        = DateTimeOffset.Now,
                Description = "Bon Terima Unit",
                ReferenceNo = model.URNNo,
                Items       = items
            };

            string journalTransactionUri = "journal-transactions";
            var    httpClient            = (IHttpClientService)serviceProvider.GetService(typeof(IHttpClientService));

            var response = await httpClient.PostAsync($"{APIEndpoint.Finance}{journalTransactionUri}", new StringContent(JsonConvert.SerializeObject(modelToPost).ToString(), Encoding.UTF8, General.JsonMediaType));

            response.EnsureSuccessStatusCode();
        }
Esempio n. 14
0
        public async Task <int> AutoJournalVBRequest(VBFormDto form)
        {
            var externalPurchaseOrders     = _dbContext.ExternalPurchaseOrders.Where(entity => form.EPOIds.Contains(entity.Id)).Select(entity => new { entity.Id, entity.IncomeTaxId, entity.UseIncomeTax, entity.IncomeTaxName, entity.IncomeTaxRate, entity.CurrencyCode, entity.IncomeTaxBy, entity.SupplierIsImport }).ToList();
            var externalPurchaseOrderItems = _dbContext.ExternalPurchaseOrderItems.Where(entity => form.EPOIds.Contains(entity.EPOId)).Select(entity => new { entity.Id, entity.EPOId, entity.PRId, entity.UnitId }).ToList();
            var epoItemIds = externalPurchaseOrderItems.Select(element => element.Id).ToList();
            var externalPurchaseOrderDetails = _dbContext.ExternalPurchaseOrderDetails.Where(entity => epoItemIds.Contains(entity.EPOItemId)).Select(entity => new { entity.Id, entity.EPOItemId, entity.DealQuantity, entity.PricePerDealUnit, entity.IncludePpn }).ToList();

            var purchaseRequestIds = externalPurchaseOrderItems.Select(element => element.PRId).ToList();
            var purchaseRequests   = _dbContext.PurchaseRequests.Where(w => purchaseRequestIds.Contains(w.Id)).Select(s => new { s.Id, s.CategoryCode, s.CategoryId, s.UnitId, s.DivisionId }).ToList();

            var journalTransactionToPost = new JournalTransaction()
            {
                Date        = form.Date,
                Description = "Approval VB",
                ReferenceNo = form.DocumentNo,
                Status      = "POSTED",
                Items       = new List <JournalTransactionItem>()
            };

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

            foreach (var externalPurchaseOrderDetail in externalPurchaseOrderDetails)
            {
                var externalPurchaseOrderItem = externalPurchaseOrderItems.FirstOrDefault(element => element.Id == externalPurchaseOrderDetail.EPOItemId);
                var externalPurchaseOrder     = externalPurchaseOrders.FirstOrDefault(element => element.Id == externalPurchaseOrderItem.EPOId);
                var purchaseRequest           = purchaseRequests.FirstOrDefault(element => element.Id == externalPurchaseOrderItem.PRId);

                int.TryParse(purchaseRequest.CategoryId, out var categoryId);
                var category = Categories.FirstOrDefault(f => f._id.Equals(categoryId));
                if (category == null)
                {
                    category = new CategoryCOAResult()
                    {
                        ImportDebtCOA = "9999.00",
                        LocalDebtCOA  = "9999.00",
                        PurchasingCOA = "9999.00",
                        StockCOA      = "9999.00"
                    };
                }
                else
                {
                    if (string.IsNullOrEmpty(category.ImportDebtCOA))
                    {
                        category.ImportDebtCOA = "9999.00";
                    }
                    if (string.IsNullOrEmpty(category.LocalDebtCOA))
                    {
                        category.LocalDebtCOA = "9999.00";
                    }
                    if (string.IsNullOrEmpty(category.PurchasingCOA))
                    {
                        category.PurchasingCOA = "9999.00";
                    }
                    if (string.IsNullOrEmpty(category.StockCOA))
                    {
                        category.StockCOA = "9999.00";
                    }
                }

                int.TryParse(purchaseRequest.DivisionId, out var divisionId);
                var division = Divisions.FirstOrDefault(f => f.Id.Equals(divisionId));
                if (division == null)
                {
                    division = new IdCOAResult()
                    {
                        COACode = "0"
                    };
                }
                else
                {
                    if (string.IsNullOrEmpty(division.COACode))
                    {
                        division.COACode = "0";
                    }
                }

                int.TryParse(purchaseRequest.UnitId, out var unitId);
                var unit = Units.FirstOrDefault(f => f.Id.Equals(unitId));
                if (unit == null)
                {
                    unit = new IdCOAResult()
                    {
                        COACode = "00"
                    };
                }
                else
                {
                    if (string.IsNullOrEmpty(unit.COACode))
                    {
                        unit.COACode = "0";
                    }
                }

                int.TryParse(externalPurchaseOrder.IncomeTaxId, out var incomeTaxId);
                var incomeTax = IncomeTaxes.FirstOrDefault(f => f.Id.Equals(incomeTaxId));

                if (incomeTax == null || string.IsNullOrWhiteSpace(incomeTax.COACodeCredit))
                {
                    incomeTax = new IncomeTaxCOAResult()
                    {
                        COACodeCredit = "9999.00"
                    };
                }

                double.TryParse(externalPurchaseOrder.IncomeTaxRate, out var incomeTaxRate);

                var currency = await _currencyProvider.GetCurrencyByCurrencyCode(externalPurchaseOrder.CurrencyCode);

                var currencyRate = currency != null?currency.Rate.GetValueOrDefault() : 1;

                var basePrice  = externalPurchaseOrderDetail.PricePerDealUnit * externalPurchaseOrderDetail.DealQuantity * currencyRate;
                var totalPrice = basePrice;

                if (!externalPurchaseOrderDetail.IncludePpn)
                {
                    totalPrice += basePrice * 0.1;
                }

                if (externalPurchaseOrder.UseIncomeTax && externalPurchaseOrder.IncomeTaxBy.ToUpper() == "SUPPLIER")
                {
                    totalPrice -= basePrice * (incomeTaxRate / 100);
                }


                journalDebitItems.Add(new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = externalPurchaseOrder.SupplierIsImport ? $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}" : $"{category.LocalDebtCOA}.{division.COACode}.{unit.COACode}"
                    },
                    Debit = (decimal)totalPrice
                });



                journalCreditItems.Add(new JournalTransactionItem()
                {
                    COA = new COA()
                    {
                        Code = currency.Code.ToUpper() == "IDR" ? $"1011.00.{division.COACode}.{unit.COACode}" : $"1012.00.{division.COACode}.{unit.COACode}"
                    },
                    Credit = (decimal)totalPrice
                });
            }

            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
            }).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))
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalCreditItems);

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

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

            return((int)response.StatusCode);
        }
        public void LoadItems(JournalTransaction transaction)
        {
            this.DbContext.Entry(transaction).Collection(t => t.Debits).Load();

            this.DbContext.Entry(transaction).Collection(t => t.Credits).Load();
        }
Esempio n. 16
0
 /// <summary>
 /// Constructeur par initialisation avec les dépendances requise pour construire le contrôlleur
 /// </summary>
 /// <param name="journalTransaction"></param>
 public TransactionsController(JournalTransaction journalTransaction)
 {
     _journalTransaction = journalTransaction;
 }
        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();
        }
        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();
        }
Esempio n. 19
0
        public async Task <int> AutoJournalVBRequest(VBFormDto form)
        {
            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 unitPaymentOrderItemIds = _dbContext.UnitPaymentOrderItems.Where(entity => form.EPOIds.Contains(entity.UPOId)).Select(entity => entity.Id).ToList();
            var unitPaymentOrders      = _dbContext.UnitPaymentOrders.Where(entity => form.EPOIds.Contains(entity.Id)).ToList();
            var _unitPaymentOrderItems = _dbContext.UnitPaymentOrderItems.Where(entity => form.EPOIds.Contains(entity.UPOId)).ToList();
            var urnNos                = _unitPaymentOrderItems.Select(element => element.URNNo).ToList();
            var _unitReceiptNotes     = _dbContext.UnitReceiptNotes.Where(entity => urnNos.Contains(entity.URNNo)).ToList();
            var unitReceiptIds        = _unitReceiptNotes.Select(element => element.Id).ToList();
            var _unitReceiptNoteItems = _dbContext.UnitReceiptNoteItems.Where(entity => unitReceiptIds.Contains(entity.URNId)).ToList();
            var prIds                         = _unitReceiptNoteItems.Select(element => element.PRId).ToList();
            var _purchaseRequests             = _dbContext.PurchaseRequests.Where(entity => prIds.Contains(entity.Id)).ToList();
            var epoNos                        = _unitReceiptNoteItems.Select(element => element.EPONo).ToList();
            var _externalPurchaseOrders       = _dbContext.ExternalPurchaseOrders.Where(entity => epoNos.Contains(entity.EPONo)).ToList();
            var epoDetailIds                  = _unitReceiptNoteItems.Select(element => element.EPODetailId).ToList();
            var _externalPurchaseOrderDetails = _dbContext.ExternalPurchaseOrderDetails.Where(entity => epoDetailIds.Contains(entity.Id)).ToList();
            //var epoDetailIds = _dbContext.UnitPaymentOrderDetails.Where(entity => unitPaymentOrderItemIds.Contains(entity.UPOItemId)).Select(entity => entity.EPODetailId).ToList();

            //var externalPurchaseOrderItems = _dbContext.ExternalPurchaseOrderItems.Where(entity => form.EPOIds.Contains(entity.EPOId)).Select(entity => new { entity.Id, entity.EPOId, entity.PRId, entity.UnitId }).ToList();
            //var epoItemIds = externalPurchaseOrderItems.Select(element => element.Id).ToList();
            //var epoIds = externalPurchaseOrderItems.Select(element => element.EPOId).ToList();
            //var externalPurchaseOrders = _dbContext.ExternalPurchaseOrders.Where(entity => epoIds.Contains(entity.Id)).Select(entity => new { entity.Id, entity.IncomeTaxId, entity.UseIncomeTax, entity.IncomeTaxName, entity.IncomeTaxRate, entity.CurrencyCode, entity.IncomeTaxBy, entity.SupplierIsImport }).ToList();
            //var externalPurchaseOrderDetails = _dbContext.ExternalPurchaseOrderDetails.Where(entity => epoItemIds.Contains(entity.EPOItemId)).Select(entity => new { entity.Id, entity.EPOItemId, entity.DealQuantity, entity.PricePerDealUnit, entity.IncludePpn }).ToList();

            //var purchaseRequestIds = externalPurchaseOrderItems.Select(element => element.PRId).ToList();
            //var purchaseRequests = _dbContext.PurchaseRequests.Where(w => purchaseRequestIds.Contains(w.Id)).Select(s => new { s.Id, s.CategoryCode, s.CategoryId, s.UnitId, s.DivisionId }).ToList();

            var journalTransactionToPost = new JournalTransaction()
            {
                Date        = form.Date,
                Description = "Auto Journal Clearance VB",
                ReferenceNo = form.DocumentNo,
                Status      = "POSTED",
                Items       = new List <JournalTransactionItem>()
            };

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

            foreach (var unitPaymentOrder in unitPaymentOrders)
            {
                var urnIds           = _unitPaymentOrderItems.Where(element => element.UPOId == unitPaymentOrder.Id).Select(element => element.URNId).ToList();
                var unitReceiptNotes = _unitReceiptNotes.Where(element => urnIds.Contains(element.Id)).ToList();

                foreach (var unitReceiptNote in unitReceiptNotes)
                {
                    var unitReceiptNoteItems = _unitReceiptNoteItems.Where(element => element.URNId == unitReceiptNote.Id).ToList();
                    foreach (var unitReceiptNoteItem in unitReceiptNoteItems)
                    {
                        var purchaseRequest             = _purchaseRequests.FirstOrDefault(element => element.Id == unitReceiptNoteItem.PRId);
                        var externalPurchaseOrder       = _externalPurchaseOrders.FirstOrDefault(element => element.Id == unitReceiptNoteItem.EPOId);
                        var externalPurchaseOrderDetail = _externalPurchaseOrderDetails.FirstOrDefault(element => element.Id == unitReceiptNoteItem.EPODetailId);

                        if (purchaseRequest != null && externalPurchaseOrder != null && externalPurchaseOrderDetail != null)
                        {
                            int.TryParse(unitReceiptNote.DivisionId, out var divisionId);
                            var division = divisions.FirstOrDefault(f => f.Id.Equals(divisionId));
                            if (division == null)
                            {
                                division = new IdCOAResult()
                                {
                                    COACode = "0"
                                };
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(division.COACode))
                                {
                                    division.COACode = "0";
                                }
                            }

                            int.TryParse(unitReceiptNote.UnitId, out var unitId);
                            var unit = units.FirstOrDefault(f => f.Id.Equals(unitId));
                            if (unit == null)
                            {
                                unit = new IdCOAResult()
                                {
                                    COACode = "00"
                                };
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(unit.COACode))
                                {
                                    unit.COACode = "00";
                                }
                            }

                            int.TryParse(purchaseRequest.CategoryId, out var categoryId);
                            var category = categories.FirstOrDefault(element => element.Id == categoryId);
                            if (category == null)
                            {
                                category = new CategoryCOAResult()
                                {
                                    ImportDebtCOA = "9999.00",
                                    LocalDebtCOA  = "9999.00",
                                    PurchasingCOA = "9999.00",
                                    StockCOA      = "9999.00"
                                };
                            }
                            else
                            {
                                if (string.IsNullOrEmpty(category.ImportDebtCOA))
                                {
                                    category.ImportDebtCOA = "9999.00";
                                }
                                if (string.IsNullOrEmpty(category.LocalDebtCOA))
                                {
                                    category.LocalDebtCOA = "9999.00";
                                }
                                if (string.IsNullOrEmpty(category.PurchasingCOA))
                                {
                                    category.PurchasingCOA = "9999.00";
                                }
                                if (string.IsNullOrEmpty(category.StockCOA))
                                {
                                    category.StockCOA = "9999.00";
                                }
                            }

                            var currency = await GetBICurrency(externalPurchaseOrder.CurrencyCode, unitReceiptNote.ReceiptDate);

                            var currencyRate = currency != null ? (decimal)currency.Rate.GetValueOrDefault() : (decimal)externalPurchaseOrder.CurrencyRate;

                            var externalPOPriceTotal = externalPurchaseOrderDetail.PricePerDealUnit * externalPurchaseOrderDetail.DealQuantity;
                            double.TryParse(externalPurchaseOrder.IncomeTaxRate, out var incomeTaxRate);
                            var grandTotal = Convert.ToDecimal(unitReceiptNoteItem.ReceiptQuantity * unitReceiptNoteItem.PricePerDealUnit * (double)currencyRate);

                            var incomeTaxTotal = (decimal)0;
                            var vatTotal       = (decimal)0;
                            if (externalPurchaseOrder.UseIncomeTax && externalPurchaseOrder.IncomeTaxBy.ToUpper() == "SUPPLIER")
                            {
                                int.TryParse(externalPurchaseOrder.IncomeTaxId, out var incomeTaxId);
                                var incomeTax = incomeTaxes.FirstOrDefault(f => f.Id.Equals(incomeTaxId));
                                if (incomeTax == null || string.IsNullOrWhiteSpace(incomeTax.COACodeCredit))
                                {
                                    incomeTax = new IncomeTaxCOAResult()
                                    {
                                        COACodeCredit = "9999.00"
                                    };
                                }

                                incomeTaxTotal = (decimal)incomeTaxRate / 100 * grandTotal;

                                //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //{
                                //    Coa = new ChartsOfAccount()
                                //    {
                                //        Code = unitReceiptNote.SupplierIsImport ? $"{category.ImportDebtCoa}.{division.Coacode}.{unit.Coacode}" : $"{category.LocalDebtCoa}.{division.Coacode}.{unit.Coacode}"
                                //    },
                                //    Debit = incomeTaxTotal
                                //});

                                //journalDebitItems.Add(new JournalTransactionItem()
                                //{
                                //    COA = new COA()
                                //    {
                                //        Code = $"{incomeTax.COACodeCredit}.{division.COACode}.{unit.COACode}"
                                //    },
                                //    Debit = incomeTaxTotal
                                //});

                                //journalCreditItems.Add(new JournalTransactionItem()
                                //{
                                //    COA = new COA()
                                //    {
                                //        Code = !string.IsNullOrWhiteSpace(form.Bank.AccountCOA) ? $"{form.Bank.AccountCOA}" : $"9999.00.{division.COACode}.{unit.COACode}"
                                //    },
                                //    Credit = incomeTaxTotal
                                //});
                            }

                            if (externalPurchaseOrder.UseVat)
                            {
                                vatTotal = grandTotal * (decimal)0.1;
                            }

                            if (unitReceiptNote.SupplierIsImport && ((decimal)externalPOPriceTotal * currencyRate) > 100000000)
                            {
                                //Purchasing Journal Item
                                //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //{
                                //    Coa = new ChartsOfAccount()
                                //    {
                                //        Code = $"{category.PurchasingCoa}.{division.Coacode}.{unit.Coacode}"
                                //    },
                                //    Debit = grandTotal,
                                //    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                //});

                                //Debt Journal Item
                                journalDebitItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}"
                                    },
                                    Debit  = grandTotal - incomeTaxTotal + vatTotal,
                                    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                });

                                journalCreditItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = !string.IsNullOrWhiteSpace(form.Bank.AccountCOA) ? $"{form.Bank.AccountCOA}" : $"9999.00.{division.COACode}.{unit.COACode}"
                                    },
                                    Credit = grandTotal - incomeTaxTotal + vatTotal
                                });

                                //Stock Journal Item
                                //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //{
                                //    Coa = new ChartsOfAccount()
                                //    {
                                //        Code = $"{category.StockCoa}.{division.Coacode}.{unit.Coacode}"
                                //    },
                                //    Debit = grandTotal,
                                //    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                //});

                                //Purchasing Journal Item
                                //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //{
                                //    Coa = new ChartsOfAccount()
                                //    {
                                //        Code = $"{category.PurchasingCoa}.{division.Coacode}.{unit.Coacode}"
                                //    },
                                //    Debit = grandTotal,
                                //    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                //});
                            }
                            else
                            {
                                //Purchasing Journal Item
                                //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //{
                                //    Coa = new ChartsOfAccount()
                                //    {
                                //        Code = $"{category.PurchasingCoa}.{division.Coacode}.{unit.Coacode}"
                                //    },
                                //    Debit = grandTotal,
                                //    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                //});

                                if (SpecialCategoryCode.Contains(category.Code))
                                {
                                    //Stock Journal Item
                                    //journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                    //{
                                    //    Coa = new ChartsOfAccount()
                                    //    {
                                    //        Code = $"{category.StockCoa}.{division.Coacode}.{unit.Coacode}"
                                    //    },
                                    //    Debit = grandTotal,
                                    //    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                    //});
                                }

                                //Debt Journal Item
                                journalDebitItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = unitReceiptNote.SupplierIsImport ? $"{category.ImportDebtCOA}.{division.COACode}.{unit.COACode}" : $"{category.LocalDebtCOA}.{division.COACode}.{unit.COACode}"
                                    },
                                    Debit  = grandTotal - incomeTaxTotal + vatTotal,
                                    Remark = $"- {unitReceiptNoteItem.ProductName}"
                                });

                                journalCreditItems.Add(new JournalTransactionItem()
                                {
                                    COA = new COA()
                                    {
                                        Code = !string.IsNullOrWhiteSpace(form.Bank.AccountCOA) ? $"{form.Bank.AccountCOA}" : $"9999.00.{division.COACode}.{unit.COACode}"
                                    },
                                    Credit = grandTotal - incomeTaxTotal + vatTotal
                                });

                                //if (SpecialCategoryCode.Contains(category.Code))
                                //{
                                //    //Purchasing Journal Item
                                //    journalDebitItems.Add(new UAT.Data.Models.JournalTransactionItem()
                                //    {
                                //        Coa = new ChartsOfAccount()
                                //        {
                                //            Code = $"{category.PurchasingCoa}.{division.Coacode}.{unit.Coacode}"
                                //        },
                                //        Debit = grandTotal,
                                //        Remark = $"- {unitReceiptNoteItem.ProductName}"
                                //    });
                                //}
                            }
                        }
                    }
                }
            }

            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
            }).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))
            }).ToList();
            journalTransactionToPost.Items.AddRange(journalCreditItems);

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

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

            return((int)response.StatusCode);
        }