public List <ProduccionFormulaDetalleInfo> CrearListaProduccionFormulaDetalle(List <ProcesarArchivoInfo> lista, string formula)
        {
            var seguridad = (SeguridadInfo)ObtenerSeguridad();
            var listaGlobalFormulaDetalle = new List <ProduccionFormulaDetalleInfo>();

            var ingredientePL = new IngredientePL();

            try
            {
                //sacamos los Productos
                var Prod = from w in lista
                           where w.Formula == formula && w.Marca != "2"
                           group w by w.Codigo into g
                           select new
                {
                    FirstLetter = g.Key,
                    Words       = g
                };

                var formulaPL = new FormulaPL();

                var formulasTodas = formulaPL.ObtenerTodos(EstatusEnum.Activo);

                foreach (var produccion in Prod)
                {
                    var produccionFormulaDetalle            = new ProduccionFormulaDetalleInfo();
                    List <ProcesarArchivoInfo> listafltrada = lista.Where(k => k.Formula == formula && k.Codigo == produccion.FirstLetter).ToList();

                    decimal cantidad = (from prod in listafltrada select prod.Real).Sum();

                    produccionFormulaDetalle.Producto = new ProductoInfo
                    {
                        ProductoId = int.Parse(produccion.FirstLetter)
                    };
                    produccionFormulaDetalle.CantidadProducto = cantidad;
                    produccionFormulaDetalle.Activo           = EstatusEnum.Activo;

                    var formulaExiste =
                        formulasTodas.FirstOrDefault(
                            fo =>
                            fo.Descripcion.ToUpper().Trim().Equals(formula.ToUpper().Trim(),
                                                                   StringComparison.InvariantCultureIgnoreCase));

                    if (formulaExiste == null)
                    {
                        formulaExiste = new FormulaInfo();
                    }

                    IngredienteInfo ingredienteInfo = ingredientePL.ObtenerPorIdOrganizacionFormulaProducto(formulaExiste.FormulaId, int.Parse(produccion.FirstLetter), seguridad.Usuario.Organizacion.OrganizacionID);

                    if (ingredienteInfo == null)
                    {
                        return(null);
                    }
                    produccionFormulaDetalle.Ingrediente = ingredienteInfo;
                    listaGlobalFormulaDetalle.Add(produccionFormulaDetalle);
                }
            }
            catch (Exception er)
            {
                Logger.Error(er);
                return(null);
            }
            return(listaGlobalFormulaDetalle);
        }
        private IList <PolizaInfo> ObtenerPoliza(PolizaConsumoAlimentoModel contenedor)
        {
            var polizasConsumo = new List <PolizaInfo>();

            TipoPolizaInfo tipoPoliza =
                TiposPoliza.FirstOrDefault(clave => clave.TipoPolizaID == TipoPoliza.ConsumoAlimento.GetHashCode());

            if (tipoPoliza == null)
            {
                throw new ExcepcionServicio(string.Format("{0} {1}", "EL TIPO DE POLIZA", TipoPoliza.ConsumoAlimento));
            }

            string textoDocumento = tipoPoliza.TextoDocumento;
            string tipoMovimiento = tipoPoliza.ClavePoliza;
            string postFijoRef3   = tipoPoliza.PostFijoRef3;

            var linea = 1;
            var ref3  = new StringBuilder();

            ref3.Append("03");
            ref3.Append(
                string.Format("{0}{1}{2}", DateTime.Today.Day, DateTime.Today.Month, DateTime.Today.Year).PadLeft(
                    10, ' '));
            ref3.Append(new Random(10).Next(10, 20));
            ref3.Append(new Random(30).Next(30, 40));
            ref3.Append(DateTime.Now.Millisecond);
            ref3.Append(postFijoRef3);

            string numeroDocumento = ObtenerNumeroReferenciaFolio(contenedor.AlmacenMovimiento.FolioMovimiento);

            DateTime            fecha        = contenedor.Reparto.Fecha;
            string              archivoFolio = ObtenerArchivoFolio(fecha);
            IList <CostoInfo>   costos       = ObtenerCostos();
            IList <FormulaInfo> formulas     = ObtenerFormulas();

            OrganizacionInfo                    organizacion;
            List <RepartoDetalleInfo>           repatoAgrupado = null;
            List <ProduccionFormulaDetalleInfo> produccionAgrupado;

            CostoInfo costo =
                costos.FirstOrDefault(
                    tipo => "002".Equals(tipo.ClaveContable));

            if (costo == null)
            {
                costo = new CostoInfo();
            }
            PolizaInfo polizaConsumo;

            IList <CuentaSAPInfo> cuentasSAP = ObtenerCuentasSAP();

            if (cuentasSAP == null)
            {
                cuentasSAP = new List <CuentaSAPInfo>();
            }
            CuentaSAPInfo cuentaSap;

            if (contenedor.Reparto != null && contenedor.Reparto.DetalleReparto != null &&
                contenedor.Reparto.DetalleReparto.Any())
            {
                repatoAgrupado = contenedor.Reparto.DetalleReparto
                                 .GroupBy(formu => formu.FormulaIDServida)
                                 .Select(agrupado => new RepartoDetalleInfo
                {
                    OrganizacionID =
                        agrupado.Select(org => org.OrganizacionID).FirstOrDefault(),
                    Importe          = agrupado.Sum(imp => imp.Importe),
                    FormulaIDServida =
                        agrupado.Select(form => form.FormulaIDServida).FirstOrDefault()
                }).Where(imp => imp.Importe > 0).ToList();
                for (var indexReparto = 0; indexReparto < repatoAgrupado.Count; indexReparto++)
                {
                    RepartoDetalleInfo detalle = repatoAgrupado[indexReparto];

                    organizacion = ObtenerOrganizacionIVA(detalle.OrganizacionID);
                    cuentaSap    = cuentasSAP.FirstOrDefault(clave => clave.CuentaSAP.Equals("1151401002"));
                    if (cuentaSap == null)
                    {
                        throw new ExcepcionServicio(string.Format("{0} {1}", "CUENTA NO CONFIGURADA PARA",
                                                                  costo.Descripcion));
                    }
                    var datos = new DatosPolizaInfo
                    {
                        NumeroReferencia = numeroDocumento,
                        FechaEntrada     = fecha,
                        Folio            = numeroDocumento,
                        Importe          = string.Format("{0}", detalle.Importe.ToString("F2")),
                        Renglon          = Convert.ToString(linea),
                        ImporteIva       = "0",
                        Ref3             = ref3.ToString(),
                        ClaseDocumento   = postFijoRef3,
                        Cuenta           = cuentaSap.CuentaSAP,
                        ArchivoFolio     = archivoFolio,
                        DescripcionCosto = cuentaSap.Descripcion,
                        PesoOrigen       = 0,
                        Division         = organizacion.Division,
                        TipoDocumento    = textoDocumento,
                        Concepto         = String.Format("{0}-{1} {2}",
                                                         tipoMovimiento,
                                                         numeroDocumento,
                                                         cuentaSap.CuentaSAP),
                        Sociedad = organizacion.Sociedad,
                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                    };
                    linea++;
                    polizaConsumo = GeneraRegistroPoliza(datos);
                    polizasConsumo.Add(polizaConsumo);
                }
            }
            int almacenID = 0;

            if (contenedor.ProduccionFormula != null && contenedor.ProduccionFormula.ProduccionFormulaDetalle != null &&
                contenedor.ProduccionFormula.ProduccionFormulaDetalle.Any())
            {
                produccionAgrupado =
                    contenedor.ProduccionFormula.ProduccionFormulaDetalle
                    .GroupBy(formu => formu.ProduccionFormulaId)
                    .Select(agrupado => new ProduccionFormulaDetalleInfo
                {
                    ProduccionFormulaId = agrupado.Key,
                    OrganizacionID      =
                        agrupado.Select(org => org.OrganizacionID).FirstOrDefault(),
                    AlmacenID = agrupado.Select(alm => alm.AlmacenID).FirstOrDefault()
                }).ToList();
                ClaseCostoProductoInfo         producto;
                IList <ClaseCostoProductoInfo> almacenesProductosCuentas;
                FormulaInfo formula;
                for (var indexFormula = 0; indexFormula < produccionAgrupado.Count; indexFormula++)
                {
                    ProduccionFormulaDetalleInfo detalle = produccionAgrupado[indexFormula];

                    almacenID = detalle.AlmacenID;
                    almacenesProductosCuentas = ObtenerCostosProducto(almacenID);
                    organizacion = ObtenerOrganizacionIVA(detalle.OrganizacionID);
                    formula      = formulas.FirstOrDefault(clave => clave.FormulaId == detalle.ProduccionFormulaId);
                    if (formula == null)
                    {
                        formula =
                            formulas.FirstOrDefault(clave => clave.Producto.ProductoId == detalle.ProduccionFormulaId);
                        if (formula == null)
                        {
                            formula = new FormulaInfo
                            {
                                Producto = new ProductoInfo()
                            };
                        }
                    }
                    decimal importe = 0;
                    if (repatoAgrupado != null)
                    {
                        importe =
                            repatoAgrupado.Where(formu => formu.FormulaIDServida == formula.FormulaId).Sum(
                                imp => imp.Importe);
                        if (importe == 0)
                        {
                            importe =
                                repatoAgrupado.Where(formu => formu.FormulaIDServida == formula.Producto.ProductoId).Sum
                                    (imp => imp.Importe);
                        }
                    }
                    if (importe == 0)
                    {
                        continue;
                    }
                    producto =
                        almacenesProductosCuentas.FirstOrDefault(p => p.ProductoID == formula.Producto.ProductoId);
                    if (producto == null)
                    {
                        throw new ExcepcionServicio(string.Format("{0} {1}", "CUENTA NO CONFIGURADA PARA EL PRODUCTO",
                                                                  formula.Producto.Descripcion));
                    }
                    cuentaSap = cuentasSAP.FirstOrDefault(cuenta => cuenta.CuentaSAPID == producto.CuentaSAPID);
                    if (cuentaSap == null)
                    {
                        throw new ExcepcionServicio(string.Format("{0} {1}", "CUENTA NO CONFIGURADA PARA EL PRODUCTO",
                                                                  formula.Producto.Descripcion));
                    }
                    var datos = new DatosPolizaInfo
                    {
                        NumeroReferencia = numeroDocumento,
                        FechaEntrada     = fecha,
                        Importe          = string.Format("{0}", (importe * -1).ToString("F2")),
                        Renglon          = Convert.ToString(linea),
                        ImporteIva       = "0",
                        Ref3             = ref3.ToString(),
                        Cuenta           = cuentaSap.CuentaSAP,
                        ClaseDocumento   = postFijoRef3,
                        ArchivoFolio     = archivoFolio,
                        DescripcionCosto = cuentaSap.Descripcion,
                        PesoOrigen       = 0,
                        Division         = organizacion.Division,
                        TipoDocumento    = textoDocumento,
                        Folio            = numeroDocumento,
                        Concepto         = String.Format("{0}-{1} {2}",
                                                         tipoMovimiento,
                                                         numeroDocumento,
                                                         cuentaSap.CuentaSAP),
                        Sociedad = organizacion.Sociedad,
                        Segmento = string.Format("{0}{1}", PrefijoSegmento, organizacion.Sociedad),
                    };
                    linea++;
                    polizaConsumo = GeneraRegistroPoliza(datos);
                    polizasConsumo.Add(polizaConsumo);
                }
            }
            return(polizasConsumo);
        }
 /// <summary>
 /// Obtiene una lista de produccion de formula
 /// </summary>
 /// <param name="reader"></param>
 /// <returns></returns>
 internal static List <ProduccionFormulaInfo> ObtenerPorConciliacion(IDataReader reader)
 {
     try
     {
         Logger.Info();
         var distribuciones = new List <ProduccionFormulaInfo>();
         ProduccionFormulaInfo distribucion;
         while (reader.Read())
         {
             distribucion = new ProduccionFormulaInfo
             {
                 ProduccionFormulaId = Convert.ToInt32(reader["ProduccionFormulaID"]),
                 Organizacion        = new OrganizacionInfo
                 {
                     OrganizacionID = Convert.ToInt32(reader["OrganizacionID"]),
                     Descripcion    = Convert.ToString(reader["Organizacion"])
                 },
                 FolioFormula = Convert.ToInt32(reader["FolioFormula"]),
                 Formula      = new FormulaInfo
                 {
                     FormulaId   = Convert.ToInt32(reader["FormulaID"]),
                     Descripcion = Convert.ToString(reader["Formula"]),
                     Producto    = new ProductoInfo
                     {
                         ProductoId          = Convert.ToInt32(reader["ProductoID"]),
                         ProductoDescripcion = Convert.ToString(reader["Producto"])
                     }
                 },
                 CantidadProducida          = Convert.ToDecimal(reader["CantidadProducida"]),
                 FechaProduccion            = Convert.ToDateTime(reader["FechaProduccion"]),
                 AlmacenMovimientoEntradaID = reader["AlmacenMovimientoEntradaID"] != null?Convert.ToInt64(reader["AlmacenMovimientoEntradaID"]) : 0,
                                                  AlmacenMovimientoSalidaID = reader["AlmacenMovimientoSalidaID"] != null?Convert.ToInt64(reader["AlmacenMovimientoSalidaID"]) : 0,
                                                                                  DescripcionFormula = Convert.ToString(reader["Formula"]),
                                                                                  Activo             = Convert.ToBoolean(reader["Activo"]).BoolAEnum(),
             };
             distribuciones.Add(distribucion);
         }
         reader.NextResult();
         var distribucionIngredientesOrganizaciones = new List <ProduccionFormulaDetalleInfo>();
         ProduccionFormulaDetalleInfo distribucionIngredienteOrganizacion;
         while (reader.Read())
         {
             distribucionIngredienteOrganizacion = new ProduccionFormulaDetalleInfo
             {
                 Producto = new ProductoInfo
                 {
                     ProductoId          = Convert.ToInt32(reader["ProductoID"]),
                     Descripcion         = Convert.ToString(reader["Producto"]),
                     ProductoDescripcion = Convert.ToString(reader["Producto"]),
                     UnidadMedicion      = new UnidadMedicionInfo
                     {
                         UnidadID    = Convert.ToInt32(reader["UnidadID"]),
                         ClaveUnidad = Convert.ToString(reader["ClaveUnidad"])
                     },
                 },
                 CantidadProducto = Convert.ToDecimal(reader["CantidadProducto"]),
                 Ingrediente      = new IngredienteInfo
                 {
                     IngredienteId = Convert.ToInt32(reader["IngredienteID"])
                 },
                 AlmacenInventarioLoteID    = Convert.ToInt32(reader["AlmacenInventarioLoteID"]),
                 ProduccionFormulaId        = Convert.ToInt32(reader["ProduccionFormulaID"]),
                 ProduccionFormulaDetalleId = Convert.ToInt32(reader["ProduccionFormulaDetalleID"]),
             };
             distribucionIngredientesOrganizaciones.Add(distribucionIngredienteOrganizacion);
         }
         distribuciones.ForEach(datos =>
         {
             datos.ProduccionFormulaDetalle =
                 distribucionIngredientesOrganizaciones.Where(
                     id => id.ProduccionFormulaId == datos.ProduccionFormulaId).ToList();
         });
         return(distribuciones);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }