Exemplo n.º 1
0
        public IActionResult PurchaseInvoice(int id)
        {
            var purchaseInvoice    = _purchasingService.GetPurchaseInvoiceById(id);
            var purchaseInvoiceDto = new Dto.Purchasing.PurchaseInvoice()
            {
                Id          = purchaseInvoice.Id,
                VendorId    = purchaseInvoice.VendorId.Value,
                VendorName  = purchaseInvoice.Vendor.Party.Name,
                InvoiceDate = purchaseInvoice.Date,
                AmountPaid  = purchaseInvoice.AmountPaid(),
                IsPaid      = purchaseInvoice.IsPaid(),
                Posted      = purchaseInvoice.GeneralLedgerHeader != null
            };

            foreach (var item in purchaseInvoice.PurchaseInvoiceLines)
            {
                var line = new Dto.Purchasing.PurchaseInvoiceLine()
                {
                    Id            = item.Id,
                    ItemId        = item.ItemId,
                    MeasurementId = item.MeasurementId,
                    Quantity      = item.Quantity,
                    Amount        = item.Amount,
                    Discount      = item.Discount
                };

                purchaseInvoiceDto.PurchaseInvoiceLines.Add(line);
            }
            // is this journal entry ready for posting?
            if (!purchaseInvoiceDto.Posted && purchaseInvoiceDto.PurchaseInvoiceLines.Count >= 1)
            {
                purchaseInvoiceDto.ReadyForPosting = true;
            }
            return(new ObjectResult(purchaseInvoiceDto));
        }
Exemplo n.º 2
0
        public IActionResult PostPurchaseInvoice([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));
                }

                _purchasingService.PostPurchaseInvoice(purchaseInvoiceDto.Id);

                return(new ObjectResult(Ok()));
            }
            catch (Exception ex)
            {
                errors = new string[1] {
                    ex.InnerException != null ? ex.InnerException.Message : ex.Message
                };
                return(new BadRequestObjectResult(errors));
            }
        }
Exemplo n.º 3
0
        public IActionResult PurchaseInvoices()
        {
            var purchaseInvoices = _purchasingService.GetPurchaseInvoices();
            IList <Dto.Purchasing.PurchaseInvoice> purchaseInvoicesDto = new List <Dto.Purchasing.PurchaseInvoice>();

            foreach (var purchaseInvoice in purchaseInvoices)
            {
                var purchaseInvoiceDto = new Dto.Purchasing.PurchaseInvoice()
                {
                    Id              = purchaseInvoice.Id,
                    No              = purchaseInvoice.No,
                    VendorId        = purchaseInvoice.VendorId.Value,
                    VendorName      = purchaseInvoice.Vendor.Party.Name,
                    InvoiceDate     = purchaseInvoice.Date,
                    AmountPaid      = purchaseInvoice.AmountPaid(),
                    IsPaid          = purchaseInvoice.IsPaid(),
                    Posted          = purchaseInvoice.GeneralLedgerHeader != null,
                    VendorInvoiceNo = purchaseInvoice.VendorInvoiceNo,
                    ReferenceNo     = purchaseInvoice.ReferenceNo
                };

                foreach (var line in purchaseInvoice.PurchaseInvoiceLines)
                {
                    var lineDto = new Dto.Purchasing.PurchaseInvoiceLine()
                    {
                        ItemId        = line.ItemId,
                        MeasurementId = line.MeasurementId,
                        Quantity      = line.Quantity,
                        Amount        = line.Amount,
                        Discount      = line.Discount
                    };
                    purchaseInvoiceDto.PurchaseInvoiceLines.Add(lineDto);
                }

                purchaseInvoicesDto.Add(purchaseInvoiceDto);
            }

            return(new ObjectResult(purchaseInvoicesDto));
        }
Exemplo n.º 4
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));
            }
        }