public GeneralLedgerLine CreateGeneralLedgerLine(DrOrCrSide DrCr, int accountId, decimal amount) { var line = new GeneralLedgerLine() { DrCr = DrCr, AccountId = accountId, Amount = amount, }; return(line); }
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); }
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); } }
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); } } }
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); } }