public InvoiceItem InvoiceItemEntityMapper(InvoiceItemsDTO invoiceItem)
 {
     return(new InvoiceItem
     {
         ID = invoiceItem.ID,
         InvoiceID = invoiceItem.InvoiceID,
         Price = Math.Round(invoiceItem.Price, 2),
         Quantity = Math.Round(invoiceItem.Quantity, 2),
         Description = invoiceItem.Description,
         Total = Math.Round(invoiceItem.Total, 2),
         AddedDate = DateTime.Now,
         AddedBy = "Admin"
     });
 }
        public async Task <ActionResult <InvoicesDTO> > addItem(int inInvoiceID, int inProductOptionID, int inQuantity)
        {
            Invoices invoice = await db.Invoices.FindAsync(inInvoiceID);

            if (invoice == null)
            {
                return(new JsonResult(new { Status = "error", Message = "No Invoices With The Id: " + inInvoiceID }));
            }

            ProductOptions prodOpt = await db.ProductOptions.FindAsync(inProductOptionID);

            if (prodOpt == null)
            {
                return(new JsonResult(new { Status = "error", Message = "No Product Option With The Id: " + inProductOptionID }));
            }

            Products prod = await db.Products.FindAsync(prodOpt.ProductID);

            if (prod == null)
            {
                return(new JsonResult(new { Status = "error", Message = "No Product With The Id: " + prodOpt.ProductID }));
            }

            prodOpt.Product = prod;

            if (inQuantity < 1)
            {
                return(new JsonResult(new { Status = "error", Message = "Quantity Can't be less than 1" }));
            }


            InvoiceItems invoiceItems = new InvoiceItems
            {
                InvoiceID         = invoice.Id,
                ProductOptionID   = prodOpt.Id,
                prod_name         = prodOpt.Product.name,
                prod_desc         = prodOpt.Product.desc,
                prod_region       = prodOpt.Product.region,
                prod_roast        = prodOpt.Product.roast,
                prod_altitude_max = prodOpt.Product.altitude_max,
                prod_altitude_min = prodOpt.Product.altitude_min,
                prod_bean_type    = prodOpt.Product.bean_type,
                prod_image_url    = prodOpt.Product.image_url,
                opt_price         = prodOpt.price,
                opt_weight        = prodOpt.weight,
                quantity          = inQuantity
            };

            db.InvoiceItems.Add(invoiceItems);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (Exception e)
            {
                return(new JsonResult(new { Status = "error", Message = "Error adding item to invoice" }));
            }

            try
            {
                updateTotalInvoice(invoice.Id, invoiceItems.opt_price, invoiceItems.quantity);
            }
            catch (Exception e)
            {
                return(new JsonResult(new { Status = "error", Message = e }));
            }

            InvoicesDTO invcDTO = new InvoicesDTO
            {
                Id                  = invoice.Id,
                total               = invoice.total,
                UserID              = invoice.UserID,
                discount_code       = invoice.discount_code,
                discount_percentage = invoice.discount_percentage,
                isFreeShipping      = invoice.isFreeShipping,
                tax                 = invoice.tax,
                created_at          = invoice.created_at,
                updated_at          = invoice.created_at
            };

            InvoiceItemsDTO invoiceItemsDTO = new InvoiceItemsDTO
            {
                Id                = invoiceItems.Id,
                InvoiceID         = invoice.Id,
                ProductOptionID   = prodOpt.Id,
                prod_name         = prodOpt.Product.name,
                prod_desc         = prodOpt.Product.desc,
                prod_region       = prodOpt.Product.region,
                prod_roast        = prodOpt.Product.roast,
                prod_altitude_max = prodOpt.Product.altitude_max,
                prod_altitude_min = prodOpt.Product.altitude_min,
                prod_bean_type    = prodOpt.Product.bean_type,
                prod_image_url    = prodOpt.Product.image_url,
                opt_price         = prodOpt.price,
                opt_weight        = prodOpt.weight,
                quantity          = inQuantity
            };

            if (invcDTO.invoiceItems == null)
            {
                List <InvoiceItemsDTO> tempList = new List <InvoiceItemsDTO>();
                tempList.Add(invoiceItemsDTO);
                invcDTO.invoiceItems = tempList;
            }
            else
            {
                invcDTO.invoiceItems.Add(invoiceItemsDTO);
            }

            return(new JsonResult(new { Status = "success", Message = invcDTO }));
        }