public static RepartoDetalleInfo ObtenerOrdenRepartoDetalleTarde(int loteID, int repartoID, int corralID, string fechaReparto)
        {
            IList <RepartoDetalleInfo> repartoDetalleLista = null;
            RepartoDetalleInfo         repartoDetalle      = null;
            LoteInfo    lote      = null;
            RepartoInfo reparto   = new RepartoInfo();
            RepartoPL   repartoPL = new RepartoPL();
            LotePL      lotePL    = new LotePL();
            var         corralPL  = new CorralPL();

            try
            {
                var fecha = DateTime.Parse(fechaReparto.ToString(CultureInfo.InvariantCulture));

                var seguridad = (SeguridadInfo)HttpContext.Current.Session["Seguridad"];

                if (seguridad != null)
                {
                    lote = lotePL.ObtenerPorId(loteID);
                    CorralInfo corral = corralPL.ObtenerPorId(corralID);

                    /*DateTime fecha = new DateTime();
                     * fecha = DateTime.Now;
                     * fecha = fecha.AddDays(-1);*/
                    if (lote != null)
                    {
                        reparto = repartoPL.ObtnerPorLote(lote, fecha);
                    }
                    else
                    {
                        reparto = repartoPL.ObtnerPorFechaCorral(corral, fecha);
                    }

                    if (reparto != null)
                    {
                        repartoDetalleLista = repartoPL.ObtenerDetalle(reparto);

                        if (repartoDetalleLista != null)
                        {
                            for (int i = 0; i < repartoDetalleLista.Count; i++)
                            {
                                if (repartoDetalleLista[i].TipoServicioID == (int)TipoServicioEnum.Vespertino)
                                {
                                    repartoDetalle = repartoDetalleLista[i];
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }

            return(repartoDetalle);
        }
        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>
        /// Carga el archivo data link en la orden de reparto
        /// </summary>
        /// <param name="validacionDatalink"></param>
        /// <param name="usuario"></param>
        /// <returns></returns>
        internal ResultadoOperacion CargarArchivoDatalink(ValidacionDataLink validacionDatalink, UsuarioInfo usuario)
        {
            var validar   = new DataLinkInfo();
            var resultado = new ResultadoOperacion {
                Resultado = true
            };

            try
            {
                Logger.Info();
                var corralBl  = new CorralBL();
                var loteBl    = new LoteBL();
                var repartoBl = new RepartoBL();
                using (var camionRepartoBl = new CamionRepartoBL())
                {
                    var servicioAlimentoBL           = new ServicioAlimentoBL();
                    var datalinks                    = new List <DataLinkInfo>();
                    var repartosServicioAlimentacion = new List <RepartoInfo>();
                    var repartosDetalles             = new List <RepartoDetalleInfo>();
                    var corralesEliminar             = new List <CorralInfo>();

                    var formulaBL = new FormulaBL();
                    IList <FormulaInfo> formulasExistentes = formulaBL.ObtenerTodos(EstatusEnum.Activo);

                    IList <CamionRepartoInfo> camionesRepartoOrganizacion =
                        camionRepartoBl.ObtenerPorOrganizacionID(usuario.Organizacion.OrganizacionID);

                    foreach (var dataLink in validacionDatalink.ListaDataLink)
                    {
                        validar = dataLink;

                        //CamionRepartoInfo camionRepartoInfo = camionRepartoBl.ObtenerPorNumeroEconomico(dataLink.NumeroCamion.Trim(), usuario.Organizacion.OrganizacionID);
                        CamionRepartoInfo camionRepartoInfo =
                            camionesRepartoOrganizacion.FirstOrDefault(
                                cam =>
                                cam.NumeroEconomico.Equals(dataLink.NumeroCamion.Trim(),
                                                           StringComparison.CurrentCultureIgnoreCase));
                        dataLink.CamionReparto = camionRepartoInfo;
                        CorralInfo corral = corralBl.ObtenerPorCodicoOrganizacionCorral(new CorralInfo
                        {
                            Codigo       = dataLink.CodigoCorral,
                            Organizacion = new OrganizacionInfo {
                                OrganizacionID = usuario.Organizacion.OrganizacionID
                            },
                            Activo = EstatusEnum.Activo,
                        });
                        if (corral != null)
                        {
                            var lote = loteBl.ObtenerPorCorralCerrado(usuario.Organizacion.OrganizacionID, corral.CorralID);
                            if (lote == null)
                            {
                                lote = new LoteInfo();
                            }
                            //if (lote != null)
                            //{

                            var fecha   = ObtenerFecha(dataLink.CadenaFechaReparto);
                            var reparto = repartoBl.ObtenerRepartoPorFechaCorralServicio(fecha, corral, dataLink.TipoServicio);
                            if (reparto != null)
                            {
                                //var formulaBl = new FormulaBL();
                                //int formulaId;
                                //int.TryParse(dataLink.ClaveFormula, out formulaId);
                                var formula = formulasExistentes.FirstOrDefault(fo => fo.Descripcion.Equals(dataLink.ClaveFormula.Trim(), StringComparison.CurrentCultureIgnoreCase));
                                if (formula != null)
                                {
                                    dataLink.FormulaServida = formula;
                                    dataLink.Reparto        = reparto;
                                    dataLink.UsuarioID      = usuario.UsuarioID;
                                    dataLink.OrganizacionID = usuario.Organizacion.OrganizacionID;
                                    datalinks.Add(dataLink);
                                }
                            }
                            //Si el Lote no se encuentra en el Reparto, buscarlo en la tabla ServicioAlimento
                            else
                            {
                                ServicioAlimentoInfo servicioAlimentoInfo =
                                    servicioAlimentoBL.ObtenerPorCorralID(usuario.Organizacion.OrganizacionID,
                                                                          corral.CorralID);

                                if (servicioAlimentoInfo != null)
                                {
                                    LoteDescargaDataLinkModel datosLote =
                                        loteBl.ObtenerLoteDataLink(usuario.Organizacion.OrganizacionID, lote.LoteID);

                                    if (datosLote == null)
                                    {
                                        datosLote = new LoteDescargaDataLinkModel
                                        {
                                            PesoInicio  = 0,
                                            FechaInicio = fecha,
                                            Cabezas     = 0,
                                        };
                                    }


                                    //var formulaBl = new FormulaBL();
                                    //int formulaId;
                                    //int.TryParse(dataLink.ClaveFormula, out formulaId);
                                    //var formula = formulaBl.ObtenerPorID(formulaId);
                                    var formula = formulasExistentes.FirstOrDefault(fo => fo.Descripcion.Equals(dataLink.ClaveFormula.Trim(), StringComparison.CurrentCultureIgnoreCase));
                                    if (formula != null)
                                    {
                                        var repartoNuevo = new RepartoInfo
                                        {
                                            OrganizacionID    = usuario.Organizacion.OrganizacionID,
                                            LoteID            = lote.LoteID,
                                            Corral            = corral,
                                            Fecha             = fecha,
                                            PesoInicio        = datosLote.PesoInicio,
                                            PesoProyectado    = 0,
                                            DiasEngorda       = Convert.ToInt32((fecha - datosLote.FechaInicio).TotalDays),
                                            PesoRepeso        = 0,
                                            DetalleReparto    = new List <RepartoDetalleInfo>(),
                                            UsuarioCreacionID = usuario.UsuarioID,
                                            Activo            = EstatusEnum.Activo
                                        };

                                        var detalleReparto = new RepartoDetalleInfo
                                        {
                                            TipoServicioID      = dataLink.TipoServicio,
                                            FormulaIDProgramada = servicioAlimentoInfo.FormulaID,
                                            FormulaIDServida    = formula.FormulaId,
                                            CantidadProgramada  = servicioAlimentoInfo.KilosProgramados,
                                            CantidadServida     = dataLink.KilosServidos,
                                            HoraReparto         = dataLink.Hora,
                                            CostoPromedio       = 0,
                                            Importe             = 0,
                                            Servido             = true,
                                            Cabezas             = datosLote.Cabezas == 0 ? 1 : datosLote.Cabezas,
                                            EstadoComederoID    = EstadoComederoEnum.Normal.GetHashCode(),
                                            CamionRepartoID     = dataLink.CamionReparto.CamionRepartoID,
                                            UsuarioCreacionID   = usuario.UsuarioID,
                                            Activo = EstatusEnum.Activo
                                        };
                                        repartoNuevo.DetalleReparto.Add(detalleReparto);

                                        repartosServicioAlimentacion.Add(repartoNuevo);

                                        var corralEliminar = new CorralInfo
                                        {
                                            CorralID = corral.CorralID,
                                            UsuarioModificacionID = usuario.UsuarioID
                                        };
                                        corralesEliminar.Add(corralEliminar);
                                    }
                                }
                            }
                            //}
                            //else
                            //{
                            //    var bitacoraBL = new BitacoraIncidenciasBL();
                            //    var errorInfo = new BitacoraErroresInfo
                            //        {
                            //            AccionesSiapID = AccionesSIAPEnum.DeDataLink,
                            //            Mensaje = "No es posible aplicar el consumo para el corral: " + corral.Codigo,
                            //            UsuarioCreacionID = usuario.UsuarioID
                            //        };

                            //    //DescargarArchivoDataLink
                            //    bitacoraBL.GuardarError(errorInfo);
                            //}
                        }
                    }
                    if (datalinks.Count > 0)
                    {
                        if (datalinks.Any(x => x.CamionReparto == null))
                        {
                            resultado.Resultado          = false;
                            resultado.DescripcionMensaje = ResourceServices.DescargaDataLink_msgCamionNoAsignado;
                        }
                        else
                        {
                            using (var transaccion = new TransactionScope())
                            {
                                if (repartosServicioAlimentacion.Any())
                                {
                                    foreach (var repartoInfo in repartosServicioAlimentacion)
                                    {
                                        int repartoID = repartoBl.Guardar(repartoInfo);
                                        repartoInfo.DetalleReparto.ToList().ForEach(rep => rep.RepartoID = repartoID);
                                        repartosDetalles.AddRange(repartoInfo.DetalleReparto);
                                    }
                                    repartoBl.GuardarRepartoDetalle(repartosDetalles);
                                    if (corralesEliminar.Any())
                                    {
                                        servicioAlimentoBL.EliminarXML(corralesEliminar);
                                    }
                                }

                                var res = repartoBl.CargarArchivoDatalink(datalinks);
                                resultado.RegistrosAfectados = res;
                                resultado.DescripcionMensaje = ResourceServices.DescargarDataLink_GuradadoOk;
                                transaccion.Complete();
                            }

                            RenombrarArchivos(validacionDatalink);
                        }
                    }
                    else
                    {
                        resultado.Resultado          = false;
                        resultado.DescripcionMensaje = ResourceServices.DescargarDataLink_NoSecargo;
                    }
                }
            }
            catch (ExcepcionGenerica)
            {
                if (validar != null)
                {
                }
                resultado.Resultado = false;
                throw;
            }
            catch (Exception ex)
            {
                if (validar != null)
                {
                }
                resultado.Resultado = false;
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(resultado);
        }
        public static int GuardarReparto(List <CambiosReporteInfo> cambiosDetalle, string fechaReparto)
        {
            int valorRetorno = 0;

            try
            {
                var repartoPl = new RepartoPL();
                var corralPL  = new CorralPL();
                var lotePL    = new LotePL();

                var seguridad = (SeguridadInfo)HttpContext.Current.Session["Seguridad"];
                //informacion del la organzacion y usuario
                if (seguridad != null)
                {
                    int organizacionId = seguridad.Usuario.Organizacion.OrganizacionID;
                    int usuario        = seguridad.Usuario.UsuarioID;
                    var fecha          = DateTime.Parse(fechaReparto.ToString(CultureInfo.InvariantCulture));

                    List <string> codigosCorral = cambiosDetalle.Select(det => det.CorralInfo.Codigo).Distinct().ToList();

                    List <CorralInfo> corralesOrganizacion = corralPL.ObtenerCorralesPorCodigosCorral(codigosCorral,
                                                                                                      organizacionId);

                    List <CambiosReporteInfo> repartosInactivar = new List <CambiosReporteInfo>();

                    int  cantidadManiana = 0;
                    bool bandera         = false;

                    foreach (CambiosReporteInfo t in cambiosDetalle)
                    {
                        t.OrganizacionID        = organizacionId;
                        t.UsuarioModificacionID = usuario;
                        t.FechaReparto          = fecha;

                        #region Eliminar Duplicados
                        if (t.RepartoID == 0)
                        {
                            CorralInfo corralCompleto =
                                corralesOrganizacion.FirstOrDefault(
                                    cor =>
                                    cor.Codigo.Trim().Equals(t.CorralInfo.Codigo.Trim(),
                                                             StringComparison.InvariantCultureIgnoreCase));
                            if (corralCompleto == null)
                            {
                                continue;
                            }

                            var corral = new CorralInfo
                            {
                                Organizacion = new OrganizacionInfo
                                {
                                    OrganizacionID = organizacionId
                                },
                                CorralID = corralCompleto.CorralID
                            };

                            RepartoInfo repartoCorral = repartoPl.ObtnerPorFechaCorral(corral, fecha);
                            if (repartoCorral != null)
                            {
                                RepartoDetalleInfo repartoDetalleMatutino =
                                    repartoCorral.DetalleReparto.FirstOrDefault(
                                        rep => rep.TipoServicioID == TipoServicioEnum.Matutino.GetHashCode());

                                RepartoDetalleInfo repartoDetalleVespertino =
                                    repartoCorral.DetalleReparto.FirstOrDefault(
                                        rep => rep.TipoServicioID == TipoServicioEnum.Vespertino.GetHashCode());

                                LoteInfo lote = lotePL.ObtenerLotesActivos(organizacionId, corralCompleto.CorralID);

                                if (t.TipoServicioID == (int)TipoServicioEnum.Matutino)
                                //&& t.Servido == 1)
                                {
                                    if (repartoDetalleMatutino != null)
                                    {
                                        //cantidadManiana = t.CantidadServida;
                                        //if(repartoCorral.Fecha.Date == DateTime.Now.Date)
                                        //{
                                        //    t.NoModificar = true;
                                        //}
                                        cantidadManiana = repartoDetalleMatutino.CantidadProgramada;
                                        bandera         = true;
                                    }
                                }

                                if (repartoDetalleMatutino != null)
                                {
                                    if (repartoCorral.LoteID == 0 || !repartoDetalleMatutino.Servido)
                                    {
                                        t.Lote        = lote.Lote;
                                        t.Cabezas     = lote.Cabezas;
                                        t.CambiarLote = true;
                                        t.RepartoID   = repartoCorral.RepartoID;
                                        //t.RepartoDetalleIdManiana = repartoDetalleMatutino.RepartoDetalleID;
                                        if (repartoDetalleVespertino != null)
                                        {
                                            t.RepartoDetalleIdTarde = repartoDetalleVespertino.RepartoDetalleID;
                                        }
                                    }
                                    else
                                    if (repartoCorral.LoteID != lote.LoteID)
                                    {
                                        if (t.TipoServicioID == (int)TipoServicioEnum.Vespertino)
                                        {
                                            if (repartoDetalleVespertino != null)
                                            {
                                                var repartoInactivar = new CambiosReporteInfo
                                                {
                                                    RepartoDetalleIdTarde = repartoDetalleVespertino.RepartoDetalleID,
                                                    InactivarDetalle      = true,
                                                    CorralInfo            = new CorralInfo(),
                                                    UsuarioModificacionID = usuario,
                                                    FechaReparto          = fecha
                                                };
                                                repartosInactivar.Add(repartoInactivar);
                                            }
                                            t.Lote = lote.Lote;
                                        }
                                        else
                                        {
                                            t.RepartoDetalleIdManiana = repartoDetalleMatutino.RepartoDetalleID;
                                        }
                                    }
                                }
                            }
                        }
                        #endregion Eliminar Duplicados

                        var repartoDetalleManiana = new RepartoDetalleInfo();
                        if (t.RepartoID > 0)
                        {
                            IList <RepartoDetalleInfo> detalleRepartos =
                                repartoPl.ObtenerDetalle(new RepartoInfo {
                                RepartoID = t.RepartoID
                            });

                            if (detalleRepartos != null && detalleRepartos.Any())
                            {
                                repartoDetalleManiana =
                                    detalleRepartos.FirstOrDefault(
                                        det => det.TipoServicioID == TipoServicioEnum.Matutino.GetHashCode());
                            }
                        }
                        if (t.TipoServicioID == (int)TipoServicioEnum.Matutino)
                        //&& t.Servido == 1)
                        {
                            if (repartoDetalleManiana != null)
                            {
                                //cantidadManiana = t.CantidadServida;
                                if (t.FechaReparto.Date == DateTime.Now.Date && t.Servido == 1)
                                {
                                    t.NoModificar = true;
                                }
                                if (t.Servido == 1)
                                {
                                    cantidadManiana = repartoDetalleManiana.CantidadServida;
                                }
                                else
                                {
                                    cantidadManiana = repartoDetalleManiana.CantidadProgramada;
                                }
                                bandera = true;
                            }
                        }

                        if (bandera && t.TipoServicioID == (int)TipoServicioEnum.Vespertino)
                        {
                            if (t.CantidadProgramada == 0)
                            {
                                t.CantidadProgramada = 0;
                            }
                            else
                            {
                                t.CantidadProgramada = t.CantidadProgramada - cantidadManiana;
                            }

                            if (cantidadManiana == 0)
                            {
                                t.ValidaPorcentaje = 0;
                            }
                            else
                            {
                                t.ValidaPorcentaje = 1;
                            }

                            bandera         = false;
                            cantidadManiana = 0;
                        }
                    }
                    cambiosDetalle.AddRange(repartosInactivar);
                    valorRetorno = repartoPl.GenerarOrdenRepartoConfiguracionAjustes(cambiosDetalle.Where(cam => cam.NoModificar == false).ToList());
                }
            }
            catch (Exception ex)
            {
                valorRetorno = -1;
            }
            return(valorRetorno);
        }
        public static RepartoInfo ObtenerOrdenReparto(int loteID, int corralID, string fechaReparto)
        {
            RepartoInfo reparto   = null;
            LoteInfo    lote      = null;
            RepartoPL   repartoPL = new RepartoPL();
            LotePL      lotePL    = new LotePL();
            var         corralPL  = new CorralPL();
            var         fecha     = DateTime.Parse(fechaReparto);

            try
            {
                var seguridad = (SeguridadInfo)HttpContext.Current.Session["Seguridad"];

                if (seguridad != null)
                {
                    lote = lotePL.ObtenerPorId(loteID);
                    CorralInfo corral = corralPL.ObtenerPorId(corralID);
                    //if (lote != null)
                    //{
                    if (lote != null)
                    {
                        reparto = repartoPL.ObtnerPorLote(lote, fecha);
                    }
                    else
                    {
                        reparto = repartoPL.ObtnerPorFechaCorral(corral, fecha);
                    }

                    if (lote != null && reparto == null)
                    {
                        reparto = repartoPL.ObtnerPorFechaCorral(corral, fecha);
                        if (reparto == null || reparto.LoteID == 0 || reparto.LoteID != lote.LoteID)
                        {
                            reparto = null;
                        }
                    }

                    if (reparto != null && reparto.DetalleReparto != null /* &&
                                                                           * reparto.DetalleReparto.Count ==
                                                                           * reparto.DetalleReparto.Where(dato => dato.Servido == true).ToList().Count()*/)
                    {
                        var matutinosServidos  = 0;
                        var vespertinoServidos = 0;

                        matutinosServidos =
                            reparto.DetalleReparto.Count(
                                tmpDetalleReparto =>
                                tmpDetalleReparto.TipoServicioID == (int)TipoServicioEnum.Matutino &&
                                tmpDetalleReparto.Servido);
                        if (matutinosServidos > 0)
                        {
                            reparto.TotalRepartos = 1;
                        }
                        vespertinoServidos =
                            reparto.DetalleReparto.Count(
                                tmpDetalleReparto =>
                                tmpDetalleReparto.TipoServicioID == (int)TipoServicioEnum.Vespertino &&
                                tmpDetalleReparto.Servido);

                        reparto.CantidadPedido = reparto.DetalleReparto.Where(
                            tmpDetalleReparto =>
                            tmpDetalleReparto.TipoServicioID == (int)TipoServicioEnum.Vespertino ||
                            tmpDetalleReparto.TipoServicioID == (int)TipoServicioEnum.Matutino)
                                                 .ToList().Sum(tmpDetalleReparto => tmpDetalleReparto.CantidadProgramada);

                        if (vespertinoServidos > 0)
                        {
                            reparto.TotalRepartos = 2;
                        }
                        if (reparto.TotalRepartos == 0)
                        {
                            reparto.TotalRepartos = 3;
                        }
                        RepartoDetalleInfo repartoMatutino = reparto.DetalleReparto.FirstOrDefault(
                            tmpDetalleReparto =>
                            tmpDetalleReparto.TipoServicioID == (int)TipoServicioEnum.Matutino);
                        if (repartoMatutino != null)
                        {
                            reparto.CantidadProgramadaManiana = repartoMatutino.CantidadProgramada;
                        }
                    }
                    else
                    {
                        reparto = new RepartoInfo {
                            Fecha = fecha, TotalRepartos = 0
                        };
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }

            return(reparto);
        }