/// <summary>
 /// Obtiene los fletes
 /// </summary>
 /// <param name="contratoInfo"></param>
 /// <returns></returns>
 public List <ProgramaciondeFletesInfo> ObtenerFletes(ContratoInfo contratoInfo)
 {
     try
     {
         Logger.Info();
         var programacionFletesDal = new ProgramaciondeFletesDAL();
         var costosFletes          = new CostoBL();
         List <ProgramaciondeFletesInfo> resultado = programacionFletesDal.ObtenerFletes(contratoInfo);
         if (resultado != null)
         {
             foreach (var programaciondeFletesInfo in resultado)
             {
                 var fleteDetalle =
                     costosFletes.ObtenerPorFleteID(programaciondeFletesInfo.Flete.FleteID);
                 programaciondeFletesInfo.Flete.LisaFleteDetalleInfo = fleteDetalle;
             }
         }
         return(resultado);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Obtiene
        /// </summary>
        /// <param name="organizacionID"> </param>
        /// <param name="folioOrigen"> </param>
        /// <returns></returns>
        internal EntradaGanadoCosteoInfo ObtenerDatosInterfaceSalidaTraspaso(int organizacionID, int folioOrigen)
        {
            EntradaGanadoCosteoInfo entradaGanadoCosteo = null;

            try
            {
                Logger.Info();
                var interfaceSalidaTraspaspBl = new InterfaceSalidaTraspasoDAL();
                InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso =
                    interfaceSalidaTraspaspBl.ObtenerDatosInterfaceSalidaTraspaso(organizacionID, folioOrigen);
                if (interfaceSalidaTraspaso != null)
                {
                    entradaGanadoCosteo = new EntradaGanadoCosteoInfo
                    {
                        ListaCalidadGanado  = new List <EntradaGanadoCalidadInfo>(),
                        ListaCostoEntrada   = new List <EntradaGanadoCostoInfo>(),
                        ListaEntradaDetalle = new List <EntradaDetalleInfo>(),
                    };
                    var animalBL = new AnimalBL();
                    var interfaceSalidaTraspasoCostoBL = new InterfaceSalidaTraspasoCostoBL();
                    List <InterfaceSalidaTraspasoCostoInfo> interfaceSalidaTraspasoCosto =
                        interfaceSalidaTraspasoCostoBL.ObtenerCostosInterfacePorDetalle(interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle);
                    var animalesID = new HashSet <long>(interfaceSalidaTraspasoCosto.Select(id => id.AnimalID));
                    List <AnimalInfo> animalesTraspaso = animalesID.Select(ani => new AnimalInfo
                    {
                        AnimalID = ani,
                        Activo   = false
                    }).ToList();
                    List <AnimalInfo> animalesMovimientoSalidaTraspaso = animalBL.ObtenerMovimientosPorXML(animalesTraspaso);
                    if (animalesMovimientoSalidaTraspaso != null && animalesMovimientoSalidaTraspaso.Any())
                    {
                        var animalesMovimiento = new List <AnimalMovimientoInfo>();
                        animalesMovimientoSalidaTraspaso.ForEach(
                            movs => animalesMovimiento.AddRange(movs.ListaAnimalesMovimiento));

                        int     pesoNeto     = interfaceSalidaTraspaso.PesoBruto - interfaceSalidaTraspaso.PesoTara;
                        decimal pesoLote     = 0;
                        int     totalCabezas = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Sum(cab => cab.Cabezas);

                        var costoBL = new CostoBL();
                        IList <CostoInfo> costos = costoBL.ObtenerTodos(EstatusEnum.Activo);
                        int cabezas = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Sum(cabe => cabe.Cabezas);
                        entradaGanadoCosteo.ListaCalidadGanado.AddRange(
                            animalesMovimientoSalidaTraspaso.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                                calidad => new EntradaGanadoCalidadInfo
                        {
                            CalidadGanado
                                = new CalidadGanadoInfo
                                {
                                    CalidadGanadoID =
                                        calidad.Select(
                                            id =>
                                            id.CalidadGanado.CalidadGanadoID).
                                        FirstOrDefault(),
                                    Calidad     = calidad.Select(cal => cal.CalidadGanado.Calidad).FirstOrDefault(),
                                    Descripcion = calidad.Select(cal => cal.CalidadGanado.Descripcion).FirstOrDefault(),
                                    Sexo        =
                                        calidad.Select(
                                            id => id.CalidadGanado.Sexo).
                                        FirstOrDefault()
                                },
                            Valor = calidad.Count(),
                        }));
                        pesoLote = (pesoNeto * cabezas) / totalCabezas;
                        int pesoPromedio = Convert.ToInt32(pesoLote / totalCabezas);
                        entradaGanadoCosteo.ListaEntradaDetalle.AddRange(
                            interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                                detalle => new EntradaDetalleInfo
                        {
                            TipoGanado = new TipoGanadoInfo
                            {
                                TipoGanadoID = detalle.Key,
                                Descripcion  = detalle.Select(des => des.TipoGanado.Descripcion).FirstOrDefault()
                            },
                            Cabezas              = detalle.Select(des => des.Cabezas).FirstOrDefault(),
                            PesoOrigen           = detalle.Select(des => des.Cabezas).FirstOrDefault() * pesoPromedio,
                            FechaSalidaInterface = interfaceSalidaTraspaso.FechaEnvio,
                        }));
                        int pesoTotalAgrupado = Convert.ToInt32(entradaGanadoCosteo.ListaEntradaDetalle.Sum(det => det.PesoOrigen));
                        if (pesoTotalAgrupado != pesoNeto)
                        {
                            int diferencia = pesoNeto - pesoTotalAgrupado;
                            EntradaDetalleInfo primerDetalle = entradaGanadoCosteo.ListaEntradaDetalle.FirstOrDefault();
                            if (primerDetalle != null)
                            {
                                primerDetalle.PesoOrigen = primerDetalle.PesoOrigen + diferencia;
                            }
                        }
                        //entradaGanadoCosteo.ListaEntradaDetalle.AddRange(
                        //    animalesMovimientoSalidaTraspaso.GroupBy(tipo => tipo.TipoGanado.TipoGanadoID).Select(
                        //        detalle => new EntradaDetalleInfo
                        //        {
                        //            TipoGanado = new TipoGanadoInfo
                        //            {
                        //                TipoGanadoID = detalle.Key,
                        //                Descripcion =
                        //                    detalle.Select(
                        //                        des =>
                        //                        des.TipoGanado.Descripcion).
                        //                    FirstOrDefault()
                        //            },
                        //            Cabezas = detalle.Count(),
                        //            PesoOrigen = pesoLote,
                        //            FechaSalidaInterface = interfaceSalidaTraspaso.FechaEnvio,
                        //        }));
                        entradaGanadoCosteo.ListaCostoEntrada.AddRange(interfaceSalidaTraspasoCosto
                                                                       .GroupBy(cos => cos.Costo.CostoID).Select(grp =>
                                                                                                                 new EntradaGanadoCostoInfo
                        {
                            Costo = new CostoInfo
                            {
                                CostoID       = grp.Key,
                                ImporteCosto  = grp.Sum(imp => imp.Importe),
                                ClaveContable = costos.Where(id => id.CostoID == grp.Key)
                                                .Select(clave => clave.ClaveContable)
                                                .FirstOrDefault(),
                                Descripcion = costos.Where(id => id.CostoID == grp.Key)
                                              .Select(desc => desc.Descripcion)
                                              .FirstOrDefault()
                            },
                            Importe = grp.Sum(imp => imp.Importe),
                        }));
                        ValidarPeso(entradaGanadoCosteo, pesoNeto);
                        AgruparValoresInterfaz(entradaGanadoCosteo, organizacionID, interfaceSalidaTraspaso, interfaceSalidaTraspasoCosto);
                        CompletarCalidadGanado(entradaGanadoCosteo);
                        AsignarProveedorSuKarne300(entradaGanadoCosteo);
                    }
                }
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(entradaGanadoCosteo);
        }