public void PreparePurchaseReceiptViewModel(Core.Domain.Purchases.PurchaseOrderHeader po) { Id = po.Id; No = po.No; Date = po.Date; Vendor = po.Vendor.Name; Amount = po.PurchaseOrderLines.Sum(a => a.Amount); foreach (var line in po.PurchaseOrderLines) { PurchaseInvoiceLines.Add(new AddPurchaseInvoiceLine() { Id = line.Id, ItemId = line.ItemId, PurchaseOrderLineId = line.Id, UnitOfMeasurementId = line.MeasurementId, Quantity = line.Quantity, Cost = line.Cost }); } }
public IActionResult SavePurchaseInvoice([FromBody] Dto.Purchasing.PurchaseInvoice purchaseInvoiceDto) { string[] errors = null; try { if (!ModelState.IsValid) { errors = new string[ModelState.ErrorCount]; foreach (var val in ModelState.Values) { for (int i = 0; i < ModelState.ErrorCount; i++) { errors[i] = val.Errors[i].ErrorMessage; } } return(new BadRequestObjectResult(errors)); } bool isNew = purchaseInvoiceDto.Id == 0; Core.Domain.Purchases.PurchaseInvoiceHeader purchaseInvoice = null; Core.Domain.Purchases.PurchaseOrderHeader purchaseOrder = null; // Creating a new invoice if (isNew) { // if fromsalesorderid has NO value, then create automatically a new sales order. if (!purchaseInvoiceDto.FromPurchaseOrderId.HasValue) { purchaseOrder = new Core.Domain.Purchases.PurchaseOrderHeader(); purchaseOrder.Date = purchaseInvoiceDto.InvoiceDate; purchaseOrder.VendorId = purchaseInvoiceDto.VendorId; purchaseOrder.ReferenceNo = purchaseInvoiceDto.ReferenceNo; purchaseOrder.PaymentTermId = purchaseInvoiceDto.PaymentTermId; purchaseOrder.Status = Core.Domain.PurchaseOrderStatus.FullReceived; } else { // else, your invoice is created from existing (open) sales order. purchaseOrder = _purchasingService.GetPurchaseOrderById(purchaseInvoiceDto.FromPurchaseOrderId.GetValueOrDefault()); } // populate invoice header purchaseInvoice = new Core.Domain.Purchases.PurchaseInvoiceHeader(); purchaseInvoice.VendorId = purchaseInvoiceDto.VendorId; purchaseInvoice.Date = purchaseInvoiceDto.InvoiceDate; purchaseInvoice.VendorInvoiceNo = purchaseInvoice.VendorId.GetValueOrDefault().ToString(); // TO BE REPLACE BY INVOICE NO FROM VENDOR purchaseInvoice.ReferenceNo = purchaseInvoiceDto.ReferenceNo; purchaseInvoice.PaymentTermId = purchaseInvoiceDto.PaymentTermId; foreach (var line in purchaseInvoiceDto.PurchaseInvoiceLines) { var purchaseInvoiceLine = new Core.Domain.Purchases.PurchaseInvoiceLine(); purchaseInvoice.PurchaseInvoiceLines.Add(purchaseInvoiceLine); purchaseInvoiceLine.Amount = line.Amount.GetValueOrDefault(); purchaseInvoiceLine.Discount = line.Discount.GetValueOrDefault(); purchaseInvoiceLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseInvoiceLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseInvoiceLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); // line.Id here is referring to PurchaseOrderLineId. It is pre-populated when you create a new purchase invoice from purchase order. if (line.Id != 0) { purchaseInvoiceLine.PurchaseOrderLineId = line.Id; } else { // if you reach here, this line item is newly added to invoice which is not originally in sales order. create correspondin orderline and add to sales order. var purchaseOrderLine = new Core.Domain.Purchases.PurchaseOrderLine(); purchaseOrderLine.Amount = line.Amount.GetValueOrDefault(); purchaseOrderLine.Discount = line.Discount.GetValueOrDefault(); purchaseOrderLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseOrderLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseOrderLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); purchaseOrder.PurchaseOrderLines.Add(purchaseOrderLine); purchaseInvoiceLine.PurchaseOrderLine = purchaseOrderLine; // map invoice line to newly added orderline } } } else { // if you reach here, you are updating existing invoice. purchaseInvoice = _purchasingService.GetPurchaseInvoiceById(purchaseInvoiceDto.Id); if (purchaseInvoice.GeneralLedgerHeaderId.HasValue) { throw new Exception("Invoice is already posted. Update is not allowed."); } purchaseInvoice.Date = purchaseInvoiceDto.InvoiceDate; purchaseInvoice.VendorInvoiceNo = purchaseInvoice.VendorId.GetValueOrDefault().ToString(); // TO BE REPLACE BY INVOICE NO FROM VENDOR purchaseInvoice.ReferenceNo = purchaseInvoiceDto.ReferenceNo; purchaseInvoice.PaymentTermId = purchaseInvoiceDto.PaymentTermId; foreach (var line in purchaseInvoiceDto.PurchaseInvoiceLines) { var existingLine = purchaseInvoice.PurchaseInvoiceLines.Where(id => id.Id == line.Id).FirstOrDefault(); if (purchaseInvoice.PurchaseInvoiceLines.Where(id => id.Id == line.Id).FirstOrDefault() != null) { existingLine.Amount = line.Amount.GetValueOrDefault(); existingLine.Discount = line.Discount.GetValueOrDefault(); existingLine.Quantity = line.Quantity.GetValueOrDefault(); existingLine.ItemId = line.ItemId.GetValueOrDefault(); existingLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); } else { //if you reach here, this line item is newly added to invoice. also, it has no SalesOrderLineId. var purchaseInvoiceLine = new Core.Domain.Purchases.PurchaseInvoiceLine(); purchaseInvoiceLine.Amount = line.Amount.GetValueOrDefault(); purchaseInvoiceLine.Discount = line.Discount.GetValueOrDefault(); purchaseInvoiceLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseInvoiceLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseInvoiceLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); purchaseInvoice.PurchaseInvoiceLines.Add(purchaseInvoiceLine); var purchaseOrderLine = new Core.Domain.Purchases.PurchaseOrderLine(); purchaseOrderLine.Amount = line.Amount.GetValueOrDefault(); purchaseOrderLine.Discount = line.Discount.GetValueOrDefault(); purchaseOrderLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseOrderLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseOrderLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); // but on what order should the new orderline be added? // note: each invoice is map to one and only one sales order. it can't be done that invoice lines came from multiple sales orders. // with this rule, we are sure that all invoice lines are contained in the same sales order. // therefore, we could just pick the first line, get the salesorderlineid, then get the salesorderheader. // you will retrieve purchaseorder one time. if (purchaseOrder == null) { // use the last value of existingLine purchaseOrder = _purchasingService.GetPurchaseOrderById(existingLine.PurchaseOrderLine.PurchaseOrderHeaderId); purchaseOrder.PurchaseOrderLines.Add(purchaseOrderLine); } purchaseInvoiceLine.PurchaseOrderLine = purchaseOrderLine; // map invoice line to newly added orderline } } } if (!isNew) { var deleted = (from line in purchaseInvoice.PurchaseInvoiceLines where !purchaseInvoiceDto.PurchaseInvoiceLines.Any(x => x.Id == line.Id) select line).ToList(); foreach (var line in deleted) { purchaseInvoice.PurchaseInvoiceLines.Remove(line); } } _purchasingService.SavePurchaseInvoice(purchaseInvoice, purchaseOrder); return(new ObjectResult(Ok())); } catch (Exception ex) { errors = new string[1] { ex.InnerException != null ? ex.InnerException.Message : ex.Message }; return(new BadRequestObjectResult(errors)); } }
public IActionResult SavePurchaseOrder([FromBody] Dto.Purchasing.PurchaseOrder purchaseOrderDto) { string[] errors = null; if (!ModelState.IsValid) { errors = new string[ModelState.ErrorCount]; foreach (var val in ModelState.Values) { for (int i = 0; i < ModelState.ErrorCount; i++) { errors[i] = val.Errors[i].ErrorMessage; } } return(new BadRequestObjectResult(errors)); } try { bool isNew = purchaseOrderDto.Id == 0; Core.Domain.Purchases.PurchaseOrderHeader purchaseOrder = null; if (isNew) { purchaseOrder = new Core.Domain.Purchases.PurchaseOrderHeader(); } else { purchaseOrder = _purchasingService.GetPurchaseOrderById(purchaseOrderDto.Id); } purchaseOrder.ReferenceNo = purchaseOrderDto.ReferenceNo; purchaseOrder.PaymentTermId = purchaseOrderDto.PaymentTermId; purchaseOrder.VendorId = purchaseOrderDto.VendorId; purchaseOrder.Date = purchaseOrderDto.OrderDate; foreach (var line in purchaseOrderDto.PurchaseOrderLines) { if (!isNew) { var existingLine = purchaseOrder.PurchaseOrderLines.Where(id => id.Id == line.Id).FirstOrDefault(); if (purchaseOrder.PurchaseOrderLines.Where(id => id.Id == line.Id).FirstOrDefault() != null) { existingLine.Amount = line.Amount.GetValueOrDefault(); existingLine.Discount = line.Discount.GetValueOrDefault(); existingLine.Quantity = line.Quantity.GetValueOrDefault(); existingLine.ItemId = line.ItemId.GetValueOrDefault(); existingLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); } else { var purchaseOrderLine = new Core.Domain.Purchases.PurchaseOrderLine(); purchaseOrderLine.Amount = line.Amount.GetValueOrDefault(); purchaseOrderLine.Discount = line.Discount.GetValueOrDefault(); purchaseOrderLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseOrderLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseOrderLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); purchaseOrder.PurchaseOrderLines.Add(purchaseOrderLine); } } else { var purchaseOrderLine = new Core.Domain.Purchases.PurchaseOrderLine(); purchaseOrderLine.Amount = line.Amount.GetValueOrDefault(); purchaseOrderLine.Discount = line.Discount.GetValueOrDefault(); purchaseOrderLine.Quantity = line.Quantity.GetValueOrDefault(); purchaseOrderLine.ItemId = line.ItemId.GetValueOrDefault(); purchaseOrderLine.MeasurementId = line.MeasurementId.GetValueOrDefault(); purchaseOrder.PurchaseOrderLines.Add(purchaseOrderLine); } } if (isNew) { _purchasingService.AddPurchaseOrder(purchaseOrder, true); } else { var deleted = (from line in purchaseOrder.PurchaseOrderLines where !purchaseOrderDto.PurchaseOrderLines.Any(x => x.Id == line.Id) select line).ToList(); foreach (var line in deleted) { if (line.PurchaseInvoiceLines.Count() > 0) { throw new Exception("The line cannot be deleted. An invoice line is created from the item."); } } foreach (var line in deleted) { purchaseOrder.PurchaseOrderLines.Remove(line); } _purchasingService.UpdatePurchaseOrder(purchaseOrder); } return(new OkObjectResult(Ok())); } catch (Exception ex) { errors = new string[1] { ex.InnerException != null ? ex.InnerException.Message : ex.Message }; return(new BadRequestObjectResult(errors)); } }