public static void AddDetails(Invoice Invoice, IDataRepositoryFactory dataRepositoryFactory, bool updateTaxes = true) { var invoiceDetailRepo = dataRepositoryFactory.GetDataRepositories <InvoiceDetail>(); Invoice.InvoiceDetails.ForEach(x => { x.InvoiceId = Invoice.Id; x.CreatedDate = DateTime.Now; x.CreatedBy = Invoice.CreatedBy; x.Active = true; x.Date = DateTime.Now; x.ModifiedDate = DateTime.Now; var result = InventoryHelper.UpdateProductInventory(Invoice.BranchOffice, x, dataRepositoryFactory, Invoice); if (result.Status < 0) { throw new Exception(result.Message); } else { x = result.Data.FirstOrDefault(); } if (x.SaveRegister) { invoiceDetailRepo.Add(x); } }); if (updateTaxes) { UpdateInvoiceTaxes(Invoice, dataRepositoryFactory); } }
public static Result <Invoice> UpdateDetails(Invoice invoice, IDataRepositoryFactory dataRepositoryFactory) { var detailsRepo = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceDetailRepository>(); var productUnitsRepo = dataRepositoryFactory.GetCustomDataRepositories <IUnitProductEquivalenceRepository>(); var oldDetails = detailsRepo.GetByInvoiceId(invoice.Id).ToList(); var newDetails = invoice.InvoiceDetails.Where(x => x.Id == 0).ToList(); var modifiedDetails = invoice.InvoiceDetails.Except(newDetails).ToList().Except(oldDetails).ToList(); var untouchedDetails = invoice.InvoiceDetails.Intersect(oldDetails).ToList(); oldDetails.ForEach(d => { bool existe = (modifiedDetails.Exists(x => x.ProductId == d.ProductId && d.ParentId == null) || untouchedDetails.Exists(x => x.ProductId == d.ProductId && d.ParentId == null)); if (!existe) { detailsRepo.Remove(d.Id); var result = InventoryHelper.AddInventory(d, invoice, dataRepositoryFactory); if (result.Status < 0) { throw new Exception(result.Message); } } }); Invoice newinvoice = new Invoice(invoice); newinvoice.InvoiceDetails = newDetails; AddDetails(newinvoice, dataRepositoryFactory); modifiedDetails.ForEach(d => { if (!d.Product.IsService) { var oldDetail = oldDetails.Where(x => x.Id == d.Id).FirstOrDefault(); decimal currentQuantity = (decimal)ProductsHelper.ConvertToProductPrincipalUnit( d.Quantity, d.UnitId.Value, d.Product.ProductUnits == null || d.Product.ProductUnits.Count == 0 ? productUnitsRepo.GetProductUnits(d.ProductId).ToList() : d.Product.ProductUnits ).Data.FirstOrDefault(); decimal oldQuantity = (decimal)ProductsHelper.ConvertToProductPrincipalUnit( oldDetail.Quantity, oldDetail.UnitId.Value, oldDetail.Product.ProductUnits == null || oldDetail.Product.ProductUnits.Count == 0 ? productUnitsRepo.GetProductUnits(oldDetail.ProductId).ToList() : oldDetail.Product.ProductUnits ).Data.FirstOrDefault(); decimal difference = currentQuantity - oldQuantity; if (difference > 0) { var warehouse = invoice.BranchOffice.Warehouses?.Where(y => y.Id == d.WarehouseId).FirstOrDefault(); if (warehouse == null) { throw new Exception("warehouseError_msg"); } InvoiceDetail nuevoDetalle = new InvoiceDetail() { Product = d.Product, ProductId = d.ProductId, Quantity = difference, UnitId = d.UnitId ?? null, Unit = d.Unit ?? null }; var result = InventoryHelper.UpdateInventory(nuevoDetalle, warehouse, invoice, dataRepositoryFactory); if (result.Status < 0) { throw new Exception(result.Message); } } else if (difference < 0) { InvoiceDetail detailToInsert = new InvoiceDetail(d); detailToInsert.Quantity = Math.Abs(difference); detailToInsert.Unit = d.Product.ProductUnits.Where(u => u.IsPrimary).FirstOrDefault().Unit; detailToInsert.UnitId = detailToInsert.Unit.Id; var result = InventoryHelper.AddInventory(detailToInsert, invoice, dataRepositoryFactory); if (result.Status < 0) { throw new Exception(result.Message); } } detailsRepo.Update(d); } else { detailsRepo.Update(d); } }); UpdateInvoiceTaxes(invoice, dataRepositoryFactory); return(new Result <Invoice>(0, 0, "ok_msg", new List <Invoice>() { invoice })); }