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
            }));
        }
        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
            }));
        }