/// <summary>
        /// Asigna los costos de los subproductos al costo
        /// ya generado
        /// </summary>
        /// <param name="lista"></param>
        /// <param name="productoId"></param>
        /// <param name="organizacionID"> </param>
        private void AsignarCostosSubProductos(List <ReporteInventarioMateriaPrimaInfo> lista, int productoId, int organizacionID)
        {
            var productoBL = new ProductoBL();
            var producto   = new ProductoInfo
            {
                ProductoId = productoId
            };

            producto = productoBL.ObtenerPorID(producto);
            if (producto != null)
            {
                switch ((FamiliasEnum)producto.Familia.FamiliaID)
                {
                case FamiliasEnum.Premezclas:
                    var organizacion = new OrganizacionInfo
                    {
                        OrganizacionID = organizacionID,
                        Activo         = EstatusEnum.Activo
                    };
                    var almacenBL    = new AlmacenBL();
                    var tiposAlmacen = new List <TipoAlmacenEnum> {
                        TipoAlmacenEnum.MateriasPrimas
                    };
                    List <AlmacenInfo> almacenes = almacenBL.ObtenerAlmacenPorTiposAlmacen(tiposAlmacen,
                                                                                           organizacion);
                    var almacenMovimientoBL = new AlmacenMovimientoBL();
                    IEnumerable <AlmacenMovimientoSubProductosModel> productosPremezcla =
                        lista.Select(x => new AlmacenMovimientoSubProductosModel
                    {
                        FechaMovimiento =
                            x.FechaMovimiento,
                        ProductoID = productoId
                    });
                    productosPremezcla = almacenMovimientoBL.ObtenerMovimientosSubProductos(productosPremezcla);
                    if (productosPremezcla != null)
                    {
                        var premezclaDetalleBL          = new PremezclaBL();
                        List <PremezclaInfo> premezclas =
                            premezclaDetalleBL.ObtenerPorOrganizacionDetalle(organizacion);
                        PremezclaInfo premezcla;

                        List <ReporteInventarioMateriaPrimaInfo> entradasMateriaPrima =
                            lista.Where(entrada => entrada.CostoId > 0).ToList();
                        if (entradasMateriaPrima != null)
                        {
                            ReporteInventarioMateriaPrimaInfo entradaMateriaPrima;
                            for (var index = 0; index < entradasMateriaPrima.Count; index++)
                            {
                                premezcla =
                                    premezclas.FirstOrDefault(
                                        id => id.Producto.ProductoId == productoId);
                                if (premezcla != null)
                                {
                                    entradaMateriaPrima = entradasMateriaPrima[index];
                                    int almacenID =
                                        productosPremezcla.Where(
                                            almMov =>
                                            almMov.AlmacenMovimientoID == entradaMateriaPrima.AlmacenMovimientoID).
                                        Select(id => id.AlmacenID).FirstOrDefault();
                                    if (almacenes.Any(id => id.AlmacenID == almacenID))
                                    {
                                        AlmacenMovimientoSubProductosModel almacenMovimientoSubProductosModel =
                                            productosPremezcla.FirstOrDefault(
                                                prod => prod.ProductoID == premezcla.Producto.ProductoId &&
                                                prod.FechaMovimiento.ToShortDateString().Equals(
                                                    entradaMateriaPrima.FechaMovimiento.ToShortDateString()));
                                        if (almacenMovimientoSubProductosModel != null)
                                        {
                                            IEnumerable <AlmacenMovimientoSubProductosModel> subProductos = productosPremezcla
                                                                                                            .Join(premezcla.ListaPremezclaDetalleInfos,
                                                                                                                  pp => pp.ProductoID, pd => pd.Producto.ProductoId,
                                                                                                                  (pp, pd) => pp).Where(
                                                fechaInicio =>
                                                fechaInicio.AlmacenMovimientoID ==
                                                (almacenMovimientoSubProductosModel.AlmacenMovimientoID +
                                                 1) &&
                                                fechaInicio.FechaMovimiento.ToShortDateString().Equals(
                                                    entradaMateriaPrima.FechaMovimiento.ToShortDateString()));
                                            if (subProductos != null && subProductos.Any())
                                            {
                                                entradaMateriaPrima.ImporteSubProductos =
                                                    subProductos.Sum(imp => imp.Importe);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                }
            }
        }
        /// <summary>
        /// Hace el guardado de la premezcla
        /// </summary>
        internal void Guardar(PremezclaInfo premezclaInfo, List <PremezclaDetalleInfo> listaPremezclaDetalle, List <PremezclaDetalleInfo> listaPremezclaEliminados, int usuario)
        {
            try
            {
                var premezclaBl                = new PremezclaBL();
                var premezclaDetalleBl         = new PremezclaDetalleBL();
                var listaPremezclasModificados = new List <PremezclaDetalleInfo>();
                var listaPremezclasAgregadas   = new List <PremezclaDetalleInfo>();
                using (var transaction = new TransactionScope())
                {
                    //Si no esta guardado se crea
                    int premezclaId;
                    if (!premezclaInfo.Guardado)
                    {
                        premezclaId = premezclaBl.Crear(premezclaInfo);
                    }
                    else
                    {
                        premezclaId = premezclaInfo.PremezclaId;
                    }

                    premezclaInfo.PremezclaId = premezclaId;

                    //Guardar detalles y actualizar modificados
                    listaPremezclasModificados.AddRange(listaPremezclaDetalle.Where(detalleInfo => detalleInfo.Guardado));
                    listaPremezclasAgregadas.AddRange(listaPremezclaDetalle.Where(detalleInfo => !detalleInfo.Guardado));

                    if (listaPremezclasAgregadas.Count > 0)
                    {
                        premezclaDetalleBl.Crear(listaPremezclasAgregadas, premezclaInfo);
                    }

                    if (listaPremezclasModificados.Count > 0)
                    {
                        foreach (var listaPremezclasModificadoP in listaPremezclasModificados)
                        {
                            listaPremezclasModificadoP.UsuarioModificacionId = usuario;
                        }
                        premezclaDetalleBl.Actualizar(listaPremezclasModificados);
                    }

                    //Desactivar eliminados
                    if (listaPremezclaEliminados.Count > 0)
                    {
                        foreach (var listaPremezclaEliminado in listaPremezclaEliminados)
                        {
                            listaPremezclaEliminado.Activo = EstatusEnum.Inactivo;
                        }
                        premezclaDetalleBl.Actualizar(listaPremezclaEliminados);
                    }

                    transaction.Complete();
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }