Exemple #1
0
        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}"));
            }
        }
Exemple #5
0
        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);
        }