コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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));
            }
        }