public Result <object> RemoveEntries(string sequence) { Result <object> result = new Result <object>(-1, -1, "error_msg"); using (var tran = _Context.Database.BeginTransaction()) { try { var entries = _Context.SuppliersReturns.AsNoTracking().Where(x => x.Active == true && x.Sequence == sequence).ToList(); entries.ForEach(e => { e.Active = false; var productUnits = _Context.UnitProductsEquivalences.AsNoTracking().Where(x => x.Active == true && x.ProductId == e.ProductId).ToList(); var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( e.Quantity, e.UnitId, productUnits ); var inventory = _Context.Inventory.AsNoTracking().FirstOrDefault(x => x.Active == true && x.ProductId == e.ProductId && x.WarehouseId == e.WarehouseId); inventory.Quantity += (decimal)convertionResult.Data.FirstOrDefault(); decimal currentBalance = inventory.Quantity; var movement = new WarehouseMovement() { CurrentBalance = currentBalance, BranchOfficeId = inventory.BranchOfficeId, MovementType = Enums.MovementTypes.IN.ToString(), ProductId = inventory.ProductId, Quantity = -(decimal)convertionResult.Data.FirstOrDefault(), Reference = sequence, UnitId = inventory.UnitId, WarehouseId = inventory.WarehouseId }; _Context.Inventory.Update(inventory); _Context.SaveChanges(); warehouseMovements.Add(movement); }); _Context.SuppliersReturns.UpdateRange(entries); _Context.SaveChanges(); tran.Commit(); result = new Result <object>(0, 0, "ok_msg"); } catch (Exception ex) { tran.Rollback(); result = new Result <object>(-1, -1, "error_msg", null, new Exception(ex.Message)); } } return(result); }
protected override Result <LeadDetail> ProcessReturnDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead invoice) { Inventory currentInventory = null; var warehouseRepo = dataRepositoryFactory.GetDataRepositories <Warehouse>(); var productRepo = dataRepositoryFactory.GetDataRepositories <Product>(); var inventoryRepo = dataRepositoryFactory.GetDataRepositories <Inventory>(); var productUnitsRepo = dataRepositoryFactory.GetDataRepositories <UnitProductEquivalence>(); var logMovementsRepo = dataRepositoryFactory.GetDataRepositories <WarehouseMovement>(); if (detail.WarehouseId.HasValue) { detail.Product.ProductUnits = detail.Product.ProductUnits == null || detail.Product.ProductUnits.Count() == 0 ? productUnitsRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList() : detail.Product.ProductUnits; if (detail.Defective) { var defectiveWarehouse = warehouseRepo.Get(x => x.AsNoTracking().Where(y => y.Active == true && y.Code == "DEF" && y.BranchOfficeId == branchOfficeId)); if (defectiveWarehouse == null) { return(new Result <LeadDetail>(-1, -1, $"defWarehouseNotExit_msg")); } currentInventory = inventoryRepo.Get(x => x.AsNoTracking().Where(y => y.Active == true && y.BranchOfficeId == branchOfficeId && y.ProductId == detail.ProductId && y.WarehouseId == defectiveWarehouse.Id)) ?? new Inventory() { WarehouseId = defectiveWarehouse.Id, ProductId = detail.ProductId, Active = true, Quantity = 0, CreatedBy = detail.CreatedBy, CreatedDate = DateTime.Now, BranchOfficeId = branchOfficeId, UnitId = detail.Product.ProductUnits.FirstOrDefault(u => u.IsPrimary).UnitId, Product = detail.Product }; } else { currentInventory = inventoryRepo.Get(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == detail.ProductId && y.WarehouseId == detail.WarehouseId)); } if (currentInventory != null) { currentInventory.Product.ProductUnits = currentInventory.Product.ProductUnits == null || currentInventory.Product.ProductUnits.Count() == 0 ? productUnitsRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == currentInventory.ProductId)).Data.ToList(): currentInventory.Product.ProductUnits; currentInventory.Quantity = (decimal)ProductsHelper.ConvertToProductPrincipalUnit( currentInventory.Quantity, detail.Product.ProductUnits.FirstOrDefault(pu => pu.IsPrimary).UnitId, detail.Product.ProductUnits.ToList() ).Data.FirstOrDefault(); detail.Quantity = (decimal)ProductsHelper.ConvertToProductPrincipalUnit( detail.Quantity, detail.UnitId.Value, detail.Product.ProductUnits.ToList() ).Data.FirstOrDefault(); var units = detail.Product.ProductUnits == null || detail.Product.ProductUnits.Count() == 0 ? productUnitsRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList() : detail.Product.ProductUnits; var warehouseMov = new WarehouseMovement(currentInventory.WarehouseId, detail.ProductId, detail.Quantity, true, units.Where(u => u.IsPrimary).FirstOrDefault().UnitId, branchOfficeId, "IN", invoice.InvoiceNumber ?? invoice.DocumentNumber ?? string.Empty); logMovementsRepo.Add(warehouseMov); currentInventory.Quantity += detail.Quantity; currentInventory.UnitId = currentInventory.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary).UnitId; Product Product = productRepo.Get(detail.ProductId).Data.FirstOrDefault(); Product.Existence += detail.Quantity; productRepo.Update(Product); if (currentInventory.Id > 0) { inventoryRepo.Update(currentInventory); } else { inventoryRepo.Add(currentInventory); } } else { return(new Result <LeadDetail>(-1, -1, "outOfStock_msg")); } } return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>() { detail })); }
public static Result <object> AddInventory(InvoiceDetail detail, Invoice invoice, IDataRepositoryFactory _repositoryFactory) { var warehouseMovementRepo = _repositoryFactory.GetDataRepositories <WarehouseMovement>(); var productUnitsRepo = _repositoryFactory.GetDataRepositories <UnitProductEquivalence>(); var productRepo = _repositoryFactory.GetDataRepositories <Product>(); var inventoryRepo = _repositoryFactory.GetDataRepositories <Inventory>(); if (!detail.Product.IsService) { detail.Product.ProductUnits = detail.Product.ProductUnits ?? productUnitsRepo.GetAll(x => x.Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList(); if (detail.WarehouseId.HasValue) { Inventory currentInventory = inventoryRepo.Get(x => x.Where(y => y.Active == true && y.ProductId == detail.ProductId && y.WarehouseId == detail.WarehouseId.Value)); if (currentInventory != null) { var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( currentInventory.Quantity, detail.Product.ProductUnits.Where(pu => pu.IsPrimary).FirstOrDefault().UnitId, detail.Product.ProductUnits ); if (convertionResult.Status < 0) { return(convertionResult); } currentInventory.Quantity = (decimal)convertionResult.Data.FirstOrDefault(); convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( detail.Quantity, detail.UnitId.Value, detail.Product.ProductUnits ); if (convertionResult.Status < 0) { return(convertionResult); } detail.Quantity = (decimal)convertionResult.Data.FirstOrDefault(); var units = detail.Product.ProductUnits ?? productUnitsRepo.GetAll(x => x.Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList(); currentInventory.Quantity += detail.Quantity; Product Product = productRepo.Get(detail.ProductId).Data.FirstOrDefault(); Product.Existence += detail.Quantity; productRepo.Update(Product); inventoryRepo.Update(currentInventory); WarehouseMovement movimientoAlmacen = new WarehouseMovement(currentInventory.WarehouseId, detail.ProductId, detail.Quantity, true, units.Where(u => u.IsPrimary).FirstOrDefault().UnitId, 0, "IN", invoice.InvoiceNumber ?? invoice.DocumentNumber ?? string.Empty, currentInventory.Quantity); warehouseMovementRepo.Add(movimientoAlmacen); return(new Result <object>(0, 0, "ok_msg")); } else { return(new Result <object>(-1, -1, $"outOfStock_msg | {detail.Product.Name}")); } } } return(new Result <object>(0, 0, "ok_msg")); }
public static Result <object> UpdateInventory(InvoiceDetail detail, Warehouse currentWarehouse, Invoice invoice, IDataRepositoryFactory _repositoryFactory) { var warehouseMovementRepo = _repositoryFactory.GetDataRepositories <WarehouseMovement>(); var productUnitsRepo = _repositoryFactory.GetDataRepositories <UnitProductEquivalence>(); var productRepo = _repositoryFactory.GetDataRepositories <Product>(); var inventoryRepo = _repositoryFactory.GetDataRepositories <Inventory>(); Inventory currentInventory = inventoryRepo.Get(x => x.Where(y => y.Active == true && y.ProductId == detail.ProductId && y.WarehouseId == currentWarehouse.Id)); if (currentInventory != null) { var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( detail.Quantity, detail.UnitId.Value, detail.Product.ProductUnits ); if (convertionResult.Status >= 0) { detail.Quantity = (decimal)convertionResult.Data.FirstOrDefault(); } else { return(convertionResult); } detail.UnitId = detail.Product.ProductUnits.FirstOrDefault(pu => pu.IsPrimary).UnitId; convertionResult = ProductsHelper.ConvertFromProductPrincipalUnit( currentInventory.Quantity, detail.Product.ProductUnits.Where(pu => pu.IsPrimary).FirstOrDefault().UnitId, detail.Product.ProductUnits ); if (convertionResult.Status >= 0) { currentInventory.Quantity = (decimal)convertionResult.Data.FirstOrDefault(); } else { return(convertionResult); } if (currentInventory.Quantity < detail.Quantity) { return(new Result <object>(-1, -1, $"outOfStock_msg | {detail.Product.Name},{currentWarehouse.Name}")); } else { currentInventory.Quantity -= detail.Quantity; Product product = productRepo.Get(detail.ProductId).Data?.FirstOrDefault(); product.Existence -= detail.Quantity; productRepo.Update(product); inventoryRepo.Update(currentInventory); var units = detail.Product.ProductUnits ?? productUnitsRepo.GetAll(x => x.Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data; WarehouseMovement movement = new WarehouseMovement(currentWarehouse.Id, detail.ProductId, detail.Quantity * -1, true, units.Where(u => u.IsPrimary).FirstOrDefault().UnitId, 0, "OUT", invoice.InvoiceNumber ?? invoice.DocumentNumber ?? string.Empty, currentInventory.Quantity); warehouseMovementRepo.Add(movement); return(new Result <object>(0, 0, "ok_msg")); } } else { return(new Result <object>(-1, -1, $"outOfStock_msg | {detail.Product.Name},{currentWarehouse.Name}")); } }
public Result <object> AddInventoryList(List <SupplierReturn> entries, string reference, string details) { var result = new Result <object>(-1, -1, "error_msg"); using (var tran = _Context.Database.BeginTransaction()) { try { string sequence = sequenceRepo.CreateSequence(SequenceTypes.SupplierReturns); List <Inventory> inventories = new List <Inventory>(); entries.ForEach(e => { var currency = e.Currency ?? _Context.Currencies.Find(e.CurrencyId); _Context.Entry <Currency>(currency).State = EntityState.Detached; e.ExchangeRate = currency.ExchangeRate; e.Details = details; e.Date = DateTime.Now; e.Reference = reference; e.BeforeTaxAmount = e.ProductCost * e.Quantity; if (e.TaxAmount <= 0 && e.NoTaxes == false) { throw new Exception("taxIsReq_msg"); } e.TotalAmount = e.TaxAmount + e.BeforeTaxAmount; e.ExchangeRateAmount = e.TotalAmount * currency.ExchangeRate; e.Sequence = sequence; int inventoryIndex = inventories.FindIndex(x => x.ProductId == e.ProductId && x.WarehouseId == e.WarehouseId); e.Product = e.Product != null ? e.Product : new Product() { Id = e.ProductId }; e.Product.ProductUnits = _Context.UnitProductsEquivalences.Include(x => x.Unit).AsNoTracking().Where(x => x.Active == true && x.ProductId == e.ProductId); var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( e.Quantity, e.UnitId, e.Product.ProductUnits.ToList() ); if (inventoryIndex < 0) { inventories.Add(new Inventory() { Quantity = -1 * (convertionResult.Status >= 0 ? (decimal)convertionResult.Data.FirstOrDefault() : 0), BranchOfficeId = e.BranchOfficeId, ProductId = e.ProductId, UnitId = e.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary == true).UnitId, WarehouseId = e.WarehouseId }); } else { inventories[inventoryIndex].Quantity += -1 * (convertionResult.Status >= 0 ? (decimal)convertionResult.Data.FirstOrDefault() : 0); } e.Supplier = null; e.Product = null; e.Unit = null; e.Warehouse = null; e.Currency = null; }); if (entries.Count > 0) { _Context.SuppliersReturns.AddRange(entries); _Context.SaveChanges(); } inventories.ForEach(inventory => { decimal currentQuantity = 0; var currentInventory = _Context.Inventory.AsNoTracking().FirstOrDefault(x => x.ProductId == inventory.ProductId && x.WarehouseId == inventory.WarehouseId && x.UnitId == inventory.UnitId && x.Active == true); if (currentInventory != null) { currentInventory.Quantity += inventory.Quantity; currentQuantity = currentInventory.Quantity; _Context.Inventory.Update(currentInventory); _Context.SaveChanges(); } else { throw new Exception("inventoryDoesntExist_msg"); } var movement = new WarehouseMovement() { CurrentBalance = currentQuantity, BranchOfficeId = inventory.BranchOfficeId, MovementType = Enums.MovementTypes.OUT.ToString(), ProductId = inventory.ProductId, Quantity = inventory.Quantity, Reference = sequence, UnitId = inventory.UnitId, WarehouseId = inventory.WarehouseId }; warehouseMovements.Add(movement); }); tran.Commit(); return(new Result <object>(0, 0, "ok_msg")); } catch (Exception ex) { tran.Rollback(); result = new Result <object>(-1, -1, "error_msg", null, new Exception(ex.Message)); } } return(result); }
public Result <object> AddTransfersList(List <WarehouseTransfer> entries, string reference, string details) { var result = new Result <object>(-1, -1, "error_msg"); using (var tran = _Context.Database.BeginTransaction()) { try { string sequence = sequenceRepo.CreateSequence(SequenceTypes.WarehouseTransfers); List <Inventory> inventories = new List <Inventory>(); entries.ForEach(e => { e.Details = details; e.Date = DateTime.Now; e.Reference = reference; e.Sequence = sequence; int destinyIndex = inventories.FindIndex(x => x.ProductId == e.ProductId && x.WarehouseId == e.DestinyId); int originIndex = inventories.FindIndex(x => x.ProductId == e.ProductId && x.WarehouseId == e.OriginId); e.Product = e.Product != null ? e.Product : new Product() { Id = e.ProductId }; e.Product.ProductUnits = _Context.UnitProductsEquivalences.Include(x => x.Unit).AsNoTracking().Where(x => x.Active == true && x.ProductId == e.ProductId); var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit( e.Quantity, e.UnitId, e.Product.ProductUnits.ToList() ); if (destinyIndex < 0) { inventories.Add(new Inventory() { Quantity = convertionResult.Status >= 0 ? (decimal)convertionResult.Data.FirstOrDefault() : 0, BranchOfficeId = e.DestinyBranchOfficeId, ProductId = e.ProductId, UnitId = e.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary == true).UnitId, WarehouseId = e.DestinyId }); } else { inventories[destinyIndex].Quantity += convertionResult.Status >= 0 ? (decimal)convertionResult.Data.FirstOrDefault() : 0; } if (originIndex < 0) { inventories.Add(new Inventory() { Quantity = convertionResult.Status >= 0 ? -1 * (decimal)convertionResult.Data.FirstOrDefault() : 0, BranchOfficeId = e.OriginBranchOfficeId, ProductId = e.ProductId, UnitId = e.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary == true).UnitId, WarehouseId = e.OriginId }); } else { inventories[originIndex].Quantity += convertionResult.Status >= 0 ?-1 * (decimal)convertionResult.Data.FirstOrDefault() : 0; } e.OriginBranchOffice = null; e.Product = null; e.Unit = null; e.DestinyBranchOffice = null; e.Origin = null; e.Destiny = null; }); _Context.WarehousesTransfers.AddRange(entries); _Context.SaveChanges(); inventories.ForEach(inventory => { if (inventory.Quantity != 0) { var currentInventory = _Context.Inventory.AsNoTracking().FirstOrDefault(x => x.ProductId == inventory.ProductId && x.WarehouseId == inventory.WarehouseId && x.UnitId == inventory.UnitId && x.Active == true); if (currentInventory != null) { currentInventory.Quantity += inventory.Quantity; _Context.Inventory.Update(currentInventory); } else { _Context.Inventory.Add(inventory); } _Context.SaveChanges(); var movement = new WarehouseMovement() { CurrentBalance = currentInventory.Quantity, BranchOfficeId = inventory.BranchOfficeId, MovementType = inventory.Quantity > 0 ? Enums.MovementTypes.IN.ToString() : Enums.MovementTypes.OUT.ToString(), ProductId = inventory.ProductId, Quantity = inventory.Quantity, Reference = sequence, UnitId = inventory.UnitId, WarehouseId = inventory.WarehouseId }; warehouseMovements.Add(movement); } }); tran.Commit(); return(new Result <object>(0, 0, "ok_msg")); } catch (Exception ex) { tran.Rollback(); result = new Result <object>(-1, -1, "error_msg", null, new Exception(ex.Message)); } } return(result); }