public IHttpActionResult Post([FromBody] InvoiceDTO value)
        {
            try
            {
                if (value == null)
                {
                    return(BadRequest());
                }

                string userName = null;
                if (HttpContext.Current != null && HttpContext.Current.User != null &&
                    HttpContext.Current.User.Identity.Name != null)
                {
                    userName = HttpContext.Current.User.Identity.Name;
                }

                if (value.Amount != value.InvoiceItems.Sum(it => it.Amount))
                {
                    return(BadRequest("Invocie Amount Miss Match with total Invoice Item Amount"));
                }

                if (value.GST != value.InvoiceItems.Sum(it => it.GST))
                {
                    return(BadRequest("Invocie GST Miss Match with total Invoice Item GST"));
                }

                var invoice = value.ToDomain();
                invoice.CreateUser  = userName;
                invoice.ChangeUser  = userName;
                invoice.Concurrency = Guid.NewGuid();

                _InvoiceRepo.Add(invoice);

                _uow.SaveChanges();

                if (invoice.ID > 0)
                {
                    return(Created <InvoiceDTO>(Request.RequestUri + "/" + invoice.ID, invoice.ToDTO()));
                }

                return(BadRequest());
            }
            catch (Exception ex)
            {
                return(InternalServerError());
            }
        }
        public IHttpActionResult Put(int id, [FromBody] InvoiceDTO value)
        {
            if (value == null)
            {
                return(BadRequest());
            }

            string userName = null;

            if (HttpContext.Current != null && HttpContext.Current.User != null &&
                HttpContext.Current.User.Identity.Name != null)
            {
                userName = HttpContext.Current.User.Identity.Name;
            }

            if (value.Amount != value.InvoiceItems.Sum(it => it.Amount))
            {
                return(BadRequest("Invocie Amount Miss Match with total Invoice Item Amount"));
            }

            if (value.GST != value.InvoiceItems.Sum(it => it.GST))
            {
                return(BadRequest("Invocie GST Miss Match with total Invoice Item GST"));
            }


            var originalInvoice = _InvoiceRepo.Get()
                                  .Include(i => i.InvoiceItems.Select(ii => ii.ProductInvoiceItem))
                                  .Include(i => i.InvoiceItems.Select(ii => ii.JsonInvoiceItem))
                                  .FirstOrDefault <Invoice>(c => c.ID == id);

            if (originalInvoice == null)
            {
                return(NotFound());
            }

            var invoice = value.ToDomain(originalInvoice);

            invoice.ChangeUser  = userName;
            invoice.Concurrency = Guid.NewGuid();

            _InvoiceRepo.Update(invoice);
            try
            {
                _uow.SaveChanges();

                return(Created <InvoiceDTO>(Request.RequestUri + "/" + invoice.ID, invoice.ToDTO()));
            }
            catch (DbEntityValidationException ex)
            {
                //StringBuilder sb = new StringBuilder();

                //foreach (var failure in ex.EntityValidationErrors)
                //{
                //    sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                //    foreach (var error in failure.ValidationErrors)
                //    {
                //        sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                //        sb.AppendLine();
                //    }
                //}
                //  throw new DbEntityValidationException(
                //    "Entity Validation Failed - errors follow:\n" +
                //    sb.ToString(), ex
                //); // Add the original exception as the innerException

                return(InternalServerError());
            }
            catch (Exception ex)
            {
                return(InternalServerError());
            }
        }