Exemplo n.º 1
0
        public static void AddDetails(InvoiceLead Invoice, IDataRepositoryFactory dataRepositoryFactory, bool updateTaxes = true)
        {
            var invoiceDetailRepo = dataRepositoryFactory.GetDataRepositories <LeadDetail>();

            Invoice.LeadDetails.ForEach(x =>
            {
                x.InvoiceLeadId = 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);
            }
        }
Exemplo n.º 2
0
        static void UpdateInvoiceTaxes(InvoiceLead invoice, IDataRepositoryFactory dataRepositoryFactory)
        {
            var invoiceTaxRepo       = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceTaxRepository>();
            var productTaxRepository = dataRepositoryFactory.GetCustomDataRepositories <IProductTaxRepository>();
            var invoiceTaxes         = invoiceTaxRepo.GetInvoiceTaxes(invoice.InvoiceNumber).ToList();

            if (invoiceTaxes != null && invoiceTaxes.Count > 0)
            {
                foreach (var tax in invoiceTaxes)
                {
                    invoiceTaxRepo.Remove(tax.Id);
                }
            }
            Dictionary <long, decimal> amountPerTax = new Dictionary <long, decimal>();

            invoice.LeadDetails.ForEach(x =>
            {
                x.InvoiceLeadId = invoice.Id;

                var productTaxes = x.Product?.Taxes != null && x.Product?.Taxes.Count() > 0 ? x.Product.Taxes :
                                   productTaxRepository.GetProductTaxes(x.ProductId);
                foreach (var impuesto in productTaxes)
                {
                    if (amountPerTax.Any(i => i.Key == impuesto.TaxId))
                    {
                        amountPerTax[impuesto.TaxId] += impuesto.Tax.Rate * x.BeforeTaxesAmount;
                    }
                    else
                    {
                        amountPerTax.Add(impuesto.TaxId, impuesto.Tax.Rate * x.BeforeTaxesAmount);
                    }
                }
            });

            foreach (var invoiceTaxAmount in amountPerTax)
            {
                InvoiceTax InvoiceImpuesto = new InvoiceTax()
                {
                    CreatedBy     = invoice.CreatedBy,
                    Active        = true,
                    InvoiceId     = invoice.Id,
                    CreatedDate   = DateTime.Now,
                    TaxId         = invoiceTaxAmount.Key,
                    CurrencyId    = invoice.CurrencyId,
                    TaxAmount     = invoiceTaxAmount.Value,
                    InvoiceNumber = string.IsNullOrEmpty(invoice.InvoiceNumber) ? invoice.DocumentNumber : invoice.InvoiceNumber,
                };
                invoiceTaxRepo.Add(InvoiceImpuesto);
            }
        }
Exemplo n.º 3
0
        public static void AddQuoteDetails(InvoiceLead invoice, IDataRepositoryFactory dataRepositoryFactory)
        {
            var detailsRepo = dataRepositoryFactory.GetDataRepositories <LeadDetail>();

            invoice.LeadDetails.ForEach(x =>
            {
                x.InvoiceLeadId = invoice.Id;
                x.CreatedDate   = DateTime.Now;
                x.CreatedBy     = invoice.CreatedBy;
                x.Active        = true;
                x.Date          = DateTime.Now;
                x.ModifiedDate  = DateTime.Now;
                detailsRepo.Add(x);
            });

            UpdateInvoiceTaxes(invoice, dataRepositoryFactory);
        }
Exemplo n.º 4
0
        public static Result <InvoiceLead> UpdateQuoteDetails(InvoiceLead invoice, IDataRepositoryFactory dataRepositoryFactory)
        {
            var detailsRepo      = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceDetailRepository>();
            var oldDetails       = detailsRepo.GetByInvoiceId(invoice.Id).ToList();
            var newDetails       = invoice.LeadDetails.Where(x => x.Id == 0).ToList();
            var modifiedDetails  = invoice.LeadDetails.Except(newDetails).ToList().Except(oldDetails).ToList();
            var untouchedDetails = invoice.LeadDetails.Intersect(oldDetails).ToList();


            // BORRA LOS QUE YA NO EXISTEN EN LA invoice NUEVA
            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);
                }
            });

            //INSERTAR DETALLES NUEVOS
            InvoiceLead newinvoice = new InvoiceLead(invoice);

            newinvoice.LeadDetails = newDetails;
            AddQuoteDetails(newinvoice, dataRepositoryFactory);


            modifiedDetails.ForEach(d =>
            {
                detailsRepo.Update(d);
            });

            UpdateInvoiceTaxes(invoice, dataRepositoryFactory);
            return(new Result <InvoiceLead>(0, 0, "ok_msg", new List <InvoiceLead>()
            {
                invoice
            }));
        }
Exemplo n.º 5
0
        protected override Result <LeadDetail> ProcessReturnDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead lead)
        {
            var invoiceDetailRepo = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceDetailRepository>();
            var productRepo       = dataRepositoryFactory.GetDataRepositories <Product>();
            var productBasesRepo  = dataRepositoryFactory.GetDataRepositories <CompositeProduct>();
            var productUnitRepo   = dataRepositoryFactory.GetDataRepositories <UnitProductEquivalence>();

            var baseDetails = invoiceDetailRepo.GetChildren(detail.Id).ToList();

            baseDetails.ForEach(p =>
            {
                var currentProduct = p.Product ?? productRepo.Get(p.ProductId).Data.FirstOrDefault();



                var instance = GetBillProductOrServiceInstance.GetBillingInstance(currentProduct);
                // decimal nuevaQuantity = p.Quantity * detail.Quantity;
                LeadDetail detailTemp = new LeadDetail()
                {
                    Id            = p.Id,
                    Active        = p.Active,
                    WarehouseId   = p.WarehouseId ?? null,
                    Quantity      = p.Quantity * (detail.ReturnAmount / detail.Quantity),
                    ReturnAmount  = p.Quantity * (detail.ReturnAmount / detail.Quantity),
                    ParentId      = p.ParentId ?? null,
                    Defective     = detail.Defective,
                    InvoiceLeadId = p.InvoiceLeadId,
                    Product       = p.Product,
                    ProductId     = p.ProductId,
                    Unit          = p.Unit,
                    UnitId        = p.UnitId
                };

                var resultado = instance.ReturnProductService(branchOfficeId, detailTemp, dataRepositoryFactory, lead);
            });

            return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>()
            {
                detail
            }));
        }
Exemplo n.º 6
0
        protected override Result <LeadDetail> ProcessDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead lead)
        {
            var detailService    = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceDetailRepository>();
            var productRepo      = dataRepositoryFactory.GetDataRepositories <Product>();
            var productBasesRepo = dataRepositoryFactory.GetDataRepositories <CompositeProduct>();
            var productUnitRepo  = dataRepositoryFactory.GetDataRepositories <UnitProductEquivalence>();
            var productBases     = detail.Product.BaseCompositeProducts == null || detail.Product.BaseCompositeProducts.Count() == 0 ? productBasesRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList() :
                                   detail.Product.BaseCompositeProducts.ToList();

            detail.WarehouseId = null;
            detail.UnitId      = null;
            var detailResult = detailService.Add(detail);

            productBases.ForEach(p =>
            {
                var currentProduct = productRepo.Get(p.BaseProductId).Data.FirstOrDefault();

                var currentUnit = p.UnitProductEquivalence == null ? p.BaseProductUnitId.HasValue ?
                                  productUnitRepo.Get(p.BaseProductUnitId.Value).Data.FirstOrDefault() : null : p.UnitProductEquivalence;

                var instance = GetBillProductOrServiceInstance.GetBillingInstance(currentProduct);
                // decimal nuevaQuantity = p.Quantity * detail.Quantity;
                LeadDetail detailTemp = new LeadDetail(detail)
                {
                    Quantity  = p.Quantity * detail.Quantity,
                    UnitId    = currentUnit != null ? currentUnit.Unit.Id : p.BaseProductUnitId,
                    ProductId = p.BaseProductId,
                    ParentId  = detailResult.Id,
                    Product   = currentProduct,
                    Free      = true
                };
                var result = instance.ProcessProductService(branchOfficeId, detailTemp, dataRepositoryFactory, lead).Data.FirstOrDefault();
                if (result.SaveRegister)
                {
                    detailService.Add(result);
                }
            });
            detail.SaveRegister = false;
            return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>()
            {
                detail
            }));
        }
Exemplo n.º 7
0
        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
            }));
        }
Exemplo n.º 8
0
        protected override Result <LeadDetail> ProcessDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead invoiceLead)
        {
            var        inventoriesRepo  = dataRepositoryFactory.GetDataRepositories <Inventory>();
            var        warehouseRepo    = dataRepositoryFactory.GetDataRepositories <Warehouse>();
            var        productUnitsRepo = dataRepositoryFactory.GetDataRepositories <UnitProductEquivalence>();
            LeadDetail newDetail        = new LeadDetail(detail);

            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;
            var convertionResult = ProductsHelper.ConvertToProductPrincipalUnit(
                newDetail.Quantity,
                newDetail.UnitId.Value,
                newDetail.Product.ProductUnits.ToList()
                );

            if (convertionResult.Status < 0)
            {
                return(new Result <LeadDetail>(-1, -1, convertionResult.Message));
            }

            decimal warehouseQuantity = (decimal)convertionResult.Data.FirstOrDefault();
            decimal quantitySumm      = warehouseQuantity;

            LeadDetail newDetailCustom = new LeadDetail(newDetail)
            {
                Quantity = warehouseQuantity
            };
            Warehouse warehouse = null;

            if ((invoiceLead.WarehouseId <= 0))
            {
                var branchOfficeWarehouses = warehouseRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.BranchOfficeId == branchOfficeId &&
                                                                                              y.Code.ToLower() != "DEF")).Data.ToList();
                // ojo ojo ojo
                var productInventory = inventoriesRepo.Get(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == newDetail.ProductId &&
                                                                                       y.Quantity >= warehouseQuantity && branchOfficeWarehouses.Select(r => r.Id).ToList().Contains(y.WarehouseId)));

                if (productInventory == null)
                {
                    return(new Result <LeadDetail>(-1, -1, "outOfStock_msg"));
                }
                // ojo ojo ojo

                warehouse = branchOfficeWarehouses.FirstOrDefault(x => x.Id == productInventory.WarehouseId);
            }
            else
            {
                warehouse = warehouseRepo.Get(invoiceLead.WarehouseId).Data.FirstOrDefault();
            }


            if ((invoiceLead.WarehouseId > 0) && (inventoriesRepo.Get(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == newDetail.ProductId &&
                                                                                                  y.Quantity >= warehouseQuantity && y.WarehouseId == invoiceLead.WarehouseId)) == null))
            {
                return(new Result <LeadDetail>(-1, -1, $"outOfStock_msg | {detail.Product?.Name?? ""}"));
            }

            if (warehouse == null)
            {
                var branchOfficeWarehouses = warehouseRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.BranchOfficeId == branchOfficeId &&
                                                                                              y.Code.ToLower() != "DEF")).Data.ToList();
                // ojo ojo ojo
                var branchOfficeInventory = inventoriesRepo.GetAll(x => x.AsNoTracking().Where(y => y.Active == true && y.ProductId == newDetail.ProductId &&
                                                                                               y.Quantity > 0 && branchOfficeWarehouses.Select(r => r.Id).ToList().Contains(y.WarehouseId))).Data.ToList();

                if (branchOfficeInventory == null)
                {
                    return(new Result <LeadDetail>(-1, -1, $"outOfStock_msg | {newDetail.Product.Name}"));
                }


                convertionResult = ProductsHelper.ConvertToProductPrincipalUnit(
                    branchOfficeInventory.Sum(p => p.Quantity),
                    branchOfficeInventory.FirstOrDefault().UnitId,
                    newDetail.Product.ProductUnits.ToList()
                    );
                if (convertionResult.Status < 0)
                {
                    return(new Result <LeadDetail>(-1, -1, convertionResult.Message));
                }

                decimal warehousesQuantitySumm = (decimal)convertionResult.Data.FirstOrDefault();

                if (warehousesQuantitySumm < warehouseQuantity)
                {
                    return(new Result <LeadDetail>(-1, -1, $"outOfStock_msg | {newDetail.Product.Name}"));
                }

                foreach (Inventory warehouseProduct in branchOfficeInventory)
                {
                    if (quantitySumm <= 0)
                    {
                        break;
                    }
                    decimal currentWarehouseQuantity = warehouseProduct.Quantity;
                    if (quantitySumm < currentWarehouseQuantity)
                    {
                        currentWarehouseQuantity = quantitySumm;
                    }

                    newDetailCustom          = new LeadDetail(newDetail);
                    newDetailCustom.Quantity = (decimal)ProductsHelper.ConvertFromProductPrincipalUnit(
                        currentWarehouseQuantity,
                        newDetail.UnitId.Value,
                        newDetail.Product.ProductUnits.ToList()
                        ).Data.FirstOrDefault();

                    newDetailCustom.WarehouseId = warehouseProduct.WarehouseId;
                    //  newDetailCustom.UnitId = newDetailCustom.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary).UnitId;
                    InventoryHelper.UpdateInventory(newDetailCustom, warehouseRepo.Get(warehouseProduct.WarehouseId).Data.FirstOrDefault(), invoiceLead, dataRepositoryFactory);
                    newDetail.WarehouseId = warehouseProduct.WarehouseId;

                    quantitySumm -= currentWarehouseQuantity;
                }
            }
            else
            {
                newDetail.WarehouseId  = warehouse.Id;
                newDetailCustom.Unit   = newDetailCustom.Product.ProductUnits.FirstOrDefault(x => x.IsPrimary).Unit;
                newDetailCustom.UnitId = newDetailCustom.Unit.Id;
                InventoryHelper.UpdateInventory(newDetailCustom, warehouse, invoiceLead, dataRepositoryFactory);
            }

            return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>()
            {
                newDetail
            }));
        }
Exemplo n.º 9
0
        protected override Result <LeadDetail> ProcessDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead invoice)
        {
            var newDetail = new LeadDetail(detail);

            newDetail.WarehouseId = null;
            newDetail.UnitId      = null;
            return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>()
            {
                detail
            }));
        }
Exemplo n.º 10
0
 protected override Result <LeadDetail> ProcessReturnDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead invoice)
 {
     return(new Result <LeadDetail>(0, 0, "ok_msg", new List <LeadDetail>()
     {
         detail
     }));
 }
Exemplo n.º 11
0
        public static Result <object> AddInventory(LeadDetail detail, InvoiceLead invoiceLead, 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.AsNoTracking().Where(y => y.Active == true && y.ProductId == detail.ProductId)).Data.ToList();


                if (detail.WarehouseId.HasValue)
                {
                    Inventory currentInventory = inventoryRepo.Get(x => x.AsNoTracking().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.ToList()
                            );
                        if (convertionResult.Status < 0)
                        {
                            return(convertionResult);
                        }

                        currentInventory.Quantity = (decimal)convertionResult.Data.FirstOrDefault();

                        convertionResult = ProductsHelper.ConvertToProductPrincipalUnit(
                            detail.Quantity,
                            detail.UnitId.Value,
                            detail.Product.ProductUnits.ToList()
                            );
                        if (convertionResult.Status < 0)
                        {
                            return(convertionResult);
                        }

                        detail.Quantity = (decimal)convertionResult.Data.FirstOrDefault();
                        var units = detail.Product.ProductUnits ?? productUnitsRepo.GetAll(x => x.AsNoTracking().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", invoiceLead.InvoiceNumber ?? invoiceLead.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"));
        }
Exemplo n.º 12
0
        public static Result <LeadDetail> UpdateProductInventory(BranchOffice branchOffice, LeadDetail detail, IDataRepositoryFactory _repositoryFactory, InvoiceLead invoice)
        {
            LeadDetail newdetail     = new LeadDetail(detail);
            var        productRepo   = _repositoryFactory.GetDataRepositories <Product>();
            var        inventoryRepo = _repositoryFactory.GetDataRepositories <Inventory>();
            var        detailRepo    = _repositoryFactory.GetDataRepositories <LeadDetail>();

            var service = GetBillProductOrServiceInstance.GetBillingInstance(detail.Product);
            var result  = service.ProcessProductService(branchOffice.Id, detail, _repositoryFactory, invoice);

            if (result.Status >= 0)
            {
                result.Data = new List <LeadDetail>()
                {
                    newdetail
                }
            }
            ;


            return(result);
        }
    }
Exemplo n.º 13
0
        public static Result <object> UpdateInventory(LeadDetail detail, Warehouse currentWarehouse, InvoiceLead invoiceLead, 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.AsNoTracking().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.ToList()
                    );
                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.ToList()
                    );

                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.AsNoTracking().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",
                                                                       invoiceLead.InvoiceNumber ?? invoiceLead.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}"));
            }
        }
 protected abstract Result <LeadDetail> ProcessReturnDetail(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory dataRepositoryFactory, InvoiceLead lead);
 public Result <LeadDetail> ReturnProductService(long branchOfficeId, LeadDetail detail, IDataRepositoryFactory _dataRepositoryFactory, InvoiceLead lead)
 {
     return(ProcessReturnDetail(branchOfficeId, detail, _dataRepositoryFactory, lead));
 }
Exemplo n.º 16
0
        public static Result <InvoiceLead> UpdateDetails(InvoiceLead invoice, IDataRepositoryFactory dataRepositoryFactory)
        {
            var detailsRepo      = dataRepositoryFactory.GetCustomDataRepositories <IInvoiceDetailRepository>();
            var productUnitsRepo = dataRepositoryFactory.GetCustomDataRepositories <IUnitProductEquivalenceRepository>();
            var oldDetails       = detailsRepo.GetByInvoiceId(invoice.Id).ToList();
            var newDetails       = invoice.LeadDetails.Where(x => x.Id == 0).ToList();
            var modifiedDetails  = invoice.LeadDetails.Except(newDetails).ToList().Except(oldDetails).ToList();
            var untouchedDetails = invoice.LeadDetails.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);
                    }
                }
            });


            InvoiceLead newinvoice = new InvoiceLead(invoice);

            newinvoice.LeadDetails = 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.ToList()
                        ).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.ToList()
                        ).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");
                        }


                        LeadDetail nuevoDetalle = new LeadDetail()
                        {
                            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)
                    {
                        LeadDetail detailToInsert = new LeadDetail(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 <InvoiceLead>(0, 0, "ok_msg", new List <InvoiceLead>()
            {
                invoice
            }));
        }