public GeneralLedgerLine CreateGeneralLedgerLine(DrOrCrSide DrCr, int accountId, decimal amount)
        {
            var line = new GeneralLedgerLine()
            {
                DrCr      = DrCr,
                AccountId = accountId,
                Amount    = amount,
            };

            return(line);
        }
Beispiel #2
0
        public async Task <IActionResult> PostJournal(long id)
        {
            try
            {
                var journal = await _repo.GetJournalEntryById(id);

                //update status
                journal.Posted = true;

                //build ledger
                if (journal.GeneralLedgerHeaderId == null || journal.GeneralLedgerHeaderId == 0)
                {
                    var ledger = new GeneralLedgerHeader();
                    ledger.Description = journal.ReferenceNo;

                    //ledger-lines
                    foreach (var item in journal.JournalEntryLines)
                    {
                        var newLedgerLine = new GeneralLedgerLine();
                        newLedgerLine.AccountId = item.AccountId;
                        newLedgerLine.Account   = item.Account;//we need to attach the entity as it is being checked in validate method below.
                        newLedgerLine.DrCr      = item.DrCr;
                        newLedgerLine.Amount    = item.Amount;

                        //add line to ledger
                        ledger.GeneralLedgerLines.Add(newLedgerLine);
                    }

                    //validate ledger
                    var isValid = await ValidateGeneralLedgerEntry(ledger);

                    if (isValid)
                    {
                        //TODO: refactor and/or improve
                        //saving the ledger
                        _db.GeneralLedgerHeaders.Add(ledger);
                        await _db.SaveChangesAsync();


                        journal.GeneralLedgerHeaderId = ledger.Id;
                        //TODO: do we need to attach the entity itself?
                        await _db.SaveChangesAsync();
                    }
                }
                return(Ok(journal));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(BadRequest(e.Message));
            }
        }
        public GeneralLedgerLine CreateGeneralLedgerLine(TransactionTypes DrCr, int accountId, decimal amount)
        {
            var line = new GeneralLedgerLine()
            {
                DrCr       = DrCr,
                AccountId  = accountId,
                Amount     = amount,
                CreatedBy  = Thread.CurrentPrincipal.Identity.Name,
                CreatedOn  = DateTime.Now,
                ModifiedBy = Thread.CurrentPrincipal.Identity.Name,
                ModifiedOn = DateTime.Now
            };

            return(line);
        }
Beispiel #4
0
        public void AddPurchaseOrderReceipt(PurchaseReceiptHeader purchaseOrderReceipt)
        {
            var     glLines       = new List <GeneralLedgerLine>();
            decimal totalAmount   = purchaseOrderReceipt.PurchaseReceiptLines.Sum(d => d.Amount);
            decimal taxAmount     = purchaseOrderReceipt.GetTotalTax();
            decimal totalDiscount = 0;

            foreach (var lineItem in purchaseOrderReceipt.PurchaseReceiptLines)
            {
                var     item = _inventoryService.GetItemById(lineItem.ItemId);
                decimal lineItemTotalAmountAfterTax = lineItem.Amount - lineItem.LineTaxAmount;

                GeneralLedgerLine debitInventory = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, item.InventoryAccount.Id, lineItemTotalAmountAfterTax);
                glLines.Add(debitInventory);

                GeneralLedgerLine creditGRNClearingAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Cr, GetGeneralLedgerSetting().GoodsReceiptNoteClearingAccountId.Value, lineItemTotalAmountAfterTax);
                glLines.Add(creditGRNClearingAccount);

                lineItem.InventoryControlJournal = _inventoryService.CreateInventoryControlJournal(lineItem.ItemId,
                                                                                                   lineItem.MeasurementId,
                                                                                                   DocumentTypes.PurchaseReceipt,
                                                                                                   lineItem.ReceivedQuantity,
                                                                                                   null,
                                                                                                   lineItem.ReceivedQuantity * item.Cost,
                                                                                                   null);
            }

            if (taxAmount > 0)
            {
            }

            if (totalDiscount > 0)
            {
            }

            GeneralLedgerHeader glHeader = _financialService.CreateGeneralLedgerHeader(DocumentTypes.PurchaseReceipt, purchaseOrderReceipt.Date, string.Empty);

            glHeader.GeneralLedgerLines = glLines;

            if (_financialService.ValidateGeneralLedgerEntry(glHeader))
            {
                purchaseOrderReceipt.GeneralLedgerHeader = glHeader;

                purchaseOrderReceipt.No = GetNextNumber(SequenceNumberTypes.PurchaseReceipt).ToString();
                _purchaseReceiptRepo.Insert(purchaseOrderReceipt);
            }
        }
Beispiel #5
0
        public void AddPurchaseInvoice(PurchaseInvoiceHeader purchaseIvoice, int?purchaseOrderId)
        {
            #region Auto create purchase order
            if (!purchaseOrderId.HasValue)
            {
                var po = new PurchaseOrderHeader()
                {
                    Date        = purchaseIvoice.Date,
                    No          = GetNextNumber(SequenceNumberTypes.PurchaseOrder).ToString(),
                    Vendor      = purchaseIvoice.Vendor,
                    VendorId    = purchaseIvoice.VendorId.Value,
                    Description = purchaseIvoice.Description,
                };
                foreach (var line in purchaseIvoice.PurchaseInvoiceLines)
                {
                    var item = _inventoryService.GetItemById(line.ItemId);

                    po.PurchaseOrderLines.Add(new PurchaseOrderLine()
                    {
                        ItemId        = item.Id,
                        MeasurementId = line.MeasurementId,
                        Quantity      = line.Quantity,
                        Cost          = item.Cost.Value,
                        Discount      = line.Discount.HasValue ? line.Discount.Value : 0,
                        Amount        = line.Amount * line.Quantity,
                    });
                }
                purchaseIvoice.PurchaseOrders.Add(po);
                //var poReceipt = new PurchaseReceiptHeader()
                //{
                //    Date = DateTime.Now,
                //    VendorId = po.VendorId.Value,
                //    PurchaseOrderHeaderId = po.Id,
                //};

                //foreach (var line in purchaseIvoice.PurchaseInvoiceLines)
                //{
                //    poReceipt.PurchaseReceiptLines.Add(new PurchaseReceiptLine()
                //    {
                //        ItemId = line.ItemId,
                //        MeasurementId = line.MeasurementId,
                //        Quantity = line.Quantity,
                //        ReceivedQuantity = (line.ReceivedQuantity.HasValue ? line.ReceivedQuantity.Value : 0),
                //        Cost = line.Cost.Value,
                //        Amount = line.Cost.Value * (line.ReceivedQuantity.HasValue ? line.ReceivedQuantity.Value : 0),
                //    });
                //}

                //po.PurchaseReceipts.Add(poReceipt);

                //AddPurchaseOrderReceipt(poReceipt);
            }
            #endregion

            var glHeader = _financialService.CreateGeneralLedgerHeader(DocumentTypes.PurchaseInvoice, purchaseIvoice.Date, purchaseIvoice.Description);

            decimal totalTaxAmount = 0, totalAmount = 0, totalDiscount = 0;
            var     taxes = new List <KeyValuePair <int, decimal> >();

            foreach (var line in purchaseIvoice.PurchaseInvoiceLines)
            {
                var lineTaxes = _financialService.ComputeInputTax(purchaseIvoice.VendorId.GetValueOrDefault(), line.ItemId, line.Quantity, line.Amount, line.Discount.GetValueOrDefault());

                var lineAmount = line.Quantity * line.Amount;

                var totalLineAmount = lineAmount + lineTaxes.Sum(t => t.Value);

                totalAmount += (decimal)totalLineAmount;

                foreach (var t in lineTaxes)
                {
                    taxes.Add(t);
                }

                var     item = _inventoryService.GetItemById(line.ItemId);
                decimal lineItemTotalAmountAfterTax = line.Amount - lineTaxes.Sum(t => t.Value);

                GeneralLedgerLine debitInventory = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, item.InventoryAccount.Id, lineItemTotalAmountAfterTax);
                glHeader.GeneralLedgerLines.Add(debitInventory);

                GeneralLedgerLine creditGRNClearingAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Cr, GetGeneralLedgerSetting().GoodsReceiptNoteClearingAccountId.Value, lineItemTotalAmountAfterTax);
                glHeader.GeneralLedgerLines.Add(creditGRNClearingAccount);

                line.InventoryControlJournal = _inventoryService.CreateInventoryControlJournal(line.ItemId,
                                                                                               line.MeasurementId,
                                                                                               DocumentTypes.PurchaseReceipt,
                                                                                               line.Quantity,
                                                                                               null,
                                                                                               line.Quantity * item.Cost,
                                                                                               null);
            }

            if (taxes != null && taxes.Count > 0)
            {
                var groupedTaxes = from t in taxes
                                   group t by t.Key into grouped
                                   select new
                {
                    Key   = grouped.Key,
                    Value = grouped.Sum(t => t.Value)
                };

                totalTaxAmount = taxes.Sum(t => t.Value);

                foreach (var tax in groupedTaxes)
                {
                    var tx = _financialService.GetTaxes().Where(t => t.Id == tax.Key).FirstOrDefault();
                    var debitPurchaseTaxAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, tx.PurchasingAccountId.Value, tax.Value);
                    glHeader.GeneralLedgerLines.Add(debitPurchaseTaxAccount);
                }
            }

            if (totalDiscount > 0)
            {
            }

            Vendor vendor = GetVendorById(purchaseIvoice.VendorId.Value);
            var    creditVendorAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Cr, vendor.AccountsPayableAccountId.Value, totalAmount);
            glHeader.GeneralLedgerLines.Add(creditVendorAccount);

            var debitGRNClearingAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, GetGeneralLedgerSetting().GoodsReceiptNoteClearingAccountId.Value, totalAmount - totalTaxAmount);
            glHeader.GeneralLedgerLines.Add(debitGRNClearingAccount);

            if (_financialService.ValidateGeneralLedgerEntry(glHeader))
            {
                purchaseIvoice.GeneralLedgerHeader = glHeader;

                purchaseIvoice.No = GetNextNumber(SequenceNumberTypes.PurchaseInvoice).ToString();
                _purchaseInvoiceRepo.Insert(purchaseIvoice);

                if (purchaseOrderId.HasValue)
                {
                    // TODO: Look for other way to update the purchase order's invoice header id field so that it shall be in a single transaction along with purchase invoice saving
                    var purchOrder = GetPurchaseOrderById(purchaseOrderId.GetValueOrDefault());
                    //purchOrder.PurchaseInvoiceHeaderId = purchaseIvoice.Id;
                    _purchaseOrderRepo.Update(purchOrder);
                }
            }
        }
Beispiel #6
0
        public void PostPurchaseInvoice(int invoiceId)
        {
            var purchaseInvoice = GetPurchaseInvoiceById(invoiceId);

            if (purchaseInvoice.GeneralLedgerHeaderId.HasValue)
            {
                throw new Exception("Invoice is already posted. Update is not allowed.");
            }

            var glHeader = _financialService.CreateGeneralLedgerHeader(DocumentTypes.PurchaseInvoice, purchaseInvoice.Date, purchaseInvoice.Description);

            decimal totalTaxAmount = 0, totalAmount = 0, totalDiscount = 0;
            var     taxes = new List <KeyValuePair <int, decimal> >();

            foreach (var lineItem in purchaseInvoice.PurchaseInvoiceLines)
            {
                var item = _inventoryService.GetItemById(lineItem.ItemId);

                if (!item.GLAccountsValidated())
                {
                    throw new Exception("Item is not correctly setup for financial transaction. Please check if GL accounts are all set.");
                }

                var lineAmount = lineItem.Quantity * lineItem.Amount;

                var lineDiscountAmount = (lineItem.Discount / 100) * lineAmount;
                totalDiscount += lineDiscountAmount.GetValueOrDefault();

                var totalLineAmount = lineAmount - lineDiscountAmount;

                totalAmount += totalLineAmount.GetValueOrDefault();

                var lineTaxes = _financialService.ComputeInputTax(purchaseInvoice.VendorId.GetValueOrDefault(), lineItem.ItemId, lineItem.Quantity, lineItem.Amount, lineItem.Discount.GetValueOrDefault());

                foreach (var t in lineTaxes)
                {
                    taxes.Add(t);
                }

                var lineTaxAmount = lineTaxes != null && lineTaxes.Count > 0 ? lineTaxes.Sum(t => t.Value) : 0;
                totalLineAmount = totalLineAmount - lineTaxAmount;

                GeneralLedgerLine debitInventory = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, item.InventoryAccount.Id, totalLineAmount.GetValueOrDefault());
                glHeader.GeneralLedgerLines.Add(debitInventory);

                GeneralLedgerLine creditGRNClearingAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Cr, GetGeneralLedgerSetting().GoodsReceiptNoteClearingAccountId.Value, totalLineAmount.GetValueOrDefault());
                glHeader.GeneralLedgerLines.Add(creditGRNClearingAccount);

                lineItem.InventoryControlJournal = _inventoryService.CreateInventoryControlJournal(lineItem.ItemId,
                                                                                                   lineItem.MeasurementId,
                                                                                                   DocumentTypes.PurchaseReceipt,
                                                                                                   lineItem.Quantity,
                                                                                                   null,
                                                                                                   lineItem.Quantity * item.Cost,
                                                                                                   null);
            }

            if (taxes != null && taxes.Count > 0)
            {
                var groupedTaxes = from t in taxes
                                   group t by t.Key into grouped
                                   select new
                {
                    Key   = grouped.Key,
                    Value = grouped.Sum(t => t.Value)
                };

                totalTaxAmount = taxes.Sum(t => t.Value);

                foreach (var tax in groupedTaxes)
                {
                    var tx = _financialService.GetTaxes().Where(t => t.Id == tax.Key).FirstOrDefault();
                    var debitPurchaseTaxAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, tx.PurchasingAccountId.Value, tax.Value);
                    glHeader.GeneralLedgerLines.Add(debitPurchaseTaxAccount);
                }
            }

            if (totalDiscount > 0)
            {
                var purchasesDiscountAccount      = base.GetGeneralLedgerSetting().PurchaseDiscountAccount;
                var creditPurchaseDiscountAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, purchasesDiscountAccount.Id, Math.Round(totalDiscount, 2, MidpointRounding.ToEven));
                glHeader.GeneralLedgerLines.Add(creditPurchaseDiscountAccount);
            }

            Vendor vendor = GetVendorById(purchaseInvoice.VendorId.Value);
            var    creditVendorAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Cr, vendor.AccountsPayableAccountId.Value, totalAmount);

            glHeader.GeneralLedgerLines.Add(creditVendorAccount);

            var debitGRNClearingAccount = _financialService.CreateGeneralLedgerLine(DrOrCrSide.Dr, GetGeneralLedgerSetting().GoodsReceiptNoteClearingAccountId.Value, totalAmount - totalTaxAmount);

            glHeader.GeneralLedgerLines.Add(debitGRNClearingAccount);

            if (_financialService.ValidateGeneralLedgerEntry(glHeader))
            {
                purchaseInvoice.GeneralLedgerHeader = glHeader;

                purchaseInvoice.No = GetNextNumber(SequenceNumberTypes.PurchaseInvoice).ToString();
                _purchaseInvoiceRepo.Update(purchaseInvoice);
            }
        }