/// <summary>
 /// Metodo para Guardar/Modificar una Entrada Ganado Costeo
 /// </summary>
 /// <param name="filtroCalificacionGanadoInfo"></param>
 public void GuardarCalidadGanado(FiltroCalificacionGanadoInfo filtroCalificacionGanadoInfo)
 {
     try
     {
         Logger.Info();
         var entradaGanadoCosteoBL = new EntradaGanadoCosteoBL();
         entradaGanadoCosteoBL.GuardarCalidadGanado(filtroCalificacionGanadoInfo);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        ///     Obtiene una Entrada Ganado Costeo por su Entrada Id
        /// </summary>
        /// <param name="entradaID"></param>
        /// <returns></returns>
        public EntradaGanadoCosteoInfo ObtenerPorEntradaID(int entradaID)
        {
            try
            {
                Logger.Info();
                var entradaGanadoCosteoBL      = new EntradaGanadoCosteoBL();
                EntradaGanadoCosteoInfo result = entradaGanadoCosteoBL.ObtenerPorEntradaGanadoID(entradaID);

                return(result);
            }
            catch (ExcepcionGenerica)
            {
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
 /// <summary>
 /// Obtiene una lista de entradas ganado costeo
 /// </summary>
 /// <param name="organizacionID"></param>
 /// <param name="fechaInicial"></param>
 /// <param name="fechaFinal"></param>
 /// <returns></returns>
 public List <EntradaGanadoCosteoInfo> ObtenerEntradasPorFechasConciliacion(int organizacionID, DateTime fechaInicial, DateTime fechaFinal)
 {
     try
     {
         Logger.Info();
         var entradaGanadoCosteoBL             = new EntradaGanadoCosteoBL();
         List <EntradaGanadoCosteoInfo> result =
             entradaGanadoCosteoBL.ObtenerEntradasPorFechasConciliacion(organizacionID, fechaInicial, fechaFinal);
         return(result);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtener muerte de ganado intensivo
 /// </summary>
 /// <param name="corral"></param>
 /// <returns></returns>
 internal GanadoIntensivoInfo ObtenerMuerteGanadoIntensivo(CorralInfo corral)
 {
     try
     {
         Logger.Info();
         var muerteGanadoIntensivoDAL = new GanadoIntensivoDAL();
         GanadoIntensivoInfo muerteGanadoIntensivoInfo = new GanadoIntensivoInfo();
         var      loteBL                = new LoteBL();
         var      entradaGanadoBL       = new EntradaGanadoBL();
         var      entradaGanadoCosteoBL = new EntradaGanadoCosteoBL();
         LoteInfo lote = loteBL.ObtenerLotesActivos(corral.Organizacion.OrganizacionID, corral.CorralID);
         if (lote != null)
         {
             muerteGanadoIntensivoInfo.Lote         = lote;
             muerteGanadoIntensivoInfo.TotalCabezas = lote.Cabezas;
             var entrada = entradaGanadoBL.ObtenerEntradaGanadoLoteCorral(lote);
             if (entrada != null)
             {
                 muerteGanadoIntensivoInfo.EntradaGanado = entrada;
                 EntradaGanadoCosteoInfo entradaGanadoCosteo = entradaGanadoCosteoBL.ObtenerPorEntradaGanadoID(entrada.EntradaGanadoID);
                 if (entradaGanadoCosteo != null)
                 {
                     muerteGanadoIntensivoInfo.EntradaGanadoCosteo = entradaGanadoCosteo;
                 }
             }
         }
         return(muerteGanadoIntensivoInfo);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Metodo para Guardar/Modificar una Entrada Ganado Costeo
 /// </summary>
 /// <param name="contenedorCosteoEntradaGanadoInfo"></param>
 public MemoryStream Guardar(ContenedorCosteoEntradaGanadoInfo contenedorCosteoEntradaGanadoInfo)
 {
     try
     {
         Logger.Info();
         var          entradaGanadoCosteoBL = new EntradaGanadoCosteoBL();
         MemoryStream stream = entradaGanadoCosteoBL.Guardar(contenedorCosteoEntradaGanadoInfo);
         return(stream);
     }
     catch (ExcepcionServicio)
     {
         throw;
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Obtiene los valores para la reimpresion de
        /// la poliza de entrada de ganado
        /// </summary>
        /// <param name="entradaGanado"></param>
        /// <param name="polizaClave"> </param>
        private MemoryStream ReimprimirPolizaEntrada(EntradaGanadoInfo entradaGanado, TipoPolizaInfo polizaClave)
        {
            EntradaGanadoCosteoInfo entradaGanadoCosteo;
            var esGanadera            = false;
            var entradaGanadoCosteoBL = new EntradaGanadoCosteoBL();

            if (entradaGanado.TipoOrigen == TipoOrganizacion.Ganadera.GetHashCode())
            {
                var interfaceSalidaTraspasoBL = new InterfaceSalidaTraspasoBL();
                entradaGanadoCosteo =
                    interfaceSalidaTraspasoBL.ObtenerDatosInterfaceSalidaTraspaso(entradaGanado.OrganizacionID, entradaGanado.FolioOrigen);
                esGanadera = true;

                EntradaGanadoCosteoInfo entradaGanadoCosteoComplementoCostos
                    = entradaGanadoCosteoBL.ObtenerPorEntradaGanadoID(entradaGanado.EntradaGanadoID);
                entradaGanadoCosteo.ListaCostoEntrada.AddRange(entradaGanadoCosteoComplementoCostos.ListaCostoEntrada.Where(id => id.Costo.CostoID != 1));
            }
            else
            {
                entradaGanadoCosteo = entradaGanadoCosteoBL.ObtenerPorEntradaGanadoID(entradaGanado.EntradaGanadoID);
            }

            MemoryStream pdf = null;

            if (entradaGanadoCosteo != null)
            {
                if (!esGanadera)
                {
                    var          cuentaPL          = new CuentaBL();
                    const string CUENTA_INVENTARIO = "CTAINVTRAN";
                    entradaGanadoCosteo.ListaCostoEntrada.ForEach(costo =>
                    {
                        if (!string.IsNullOrWhiteSpace(costo.DescripcionCuenta))
                        {
                            return;
                        }
                        var claveContable = cuentaPL.ObtenerPorClaveCuentaOrganizacion(CUENTA_INVENTARIO,
                                                                                       entradaGanado.OrganizacionOrigenID);
                        if (claveContable != null)
                        {
                            costo.DescripcionCuenta = claveContable.Descripcion;
                        }
                    });
                }
                var contenedorCosteoEntrada = new ContenedorCosteoEntradaGanadoInfo
                {
                    EntradaGanado       = entradaGanado,
                    EntradaGanadoCosteo = entradaGanadoCosteo
                };
                PolizaAbstract poliza;
                var            tipoPoliza = esGanadera ? TipoPoliza.EntradaGanadoDurango : TipoPoliza.EntradaGanado;
                if (esGanadera)
                {
                    poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(tipoPoliza);
                }
                else
                {
                    poliza = FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(tipoPoliza);
                }
                var polizaBL       = new PolizaBL();
                int organizacionID = entradaGanado.OrganizacionID;

                IList <PolizaInfo> polizasEntrada = polizaBL.ObtenerPoliza(tipoPoliza, organizacionID,
                                                                           entradaGanado.FechaEntrada,
                                                                           entradaGanado.FolioEntrada.ToString(),
                                                                           polizaClave.ClavePoliza, 1);
                if (polizasEntrada != null)
                {
                    polizasEntrada = poliza.GeneraPoliza(contenedorCosteoEntrada);
                    pdf            = poliza.ImprimePoliza(contenedorCosteoEntrada, polizasEntrada);
                }
            }
            return(pdf);
        }
        internal Dictionary <int, decimal> ObtenerCostoFleteProrrateado(EntradaGanadoInfo entradaGanado, List <EntradaGanadoCostoInfo> listaCostosEmbarque, List <EntradaGanadoInfo> listaCompraDirecta)
        {
            var pesosOrigen         = new Dictionary <int, decimal>();
            var importesProrrateado = new Dictionary <int, decimal>();

            var interfaceSalidaDAL = new InterfaceSalidaDAL();
            List <InterfaceSalidaInfo> listaInterfaceSalida = null;

            listaInterfaceSalida = listaCompraDirecta.Any() ?
                                   interfaceSalidaDAL.ObtenerPorEmbarqueIDConCompraDirecta(entradaGanado) :
                                   interfaceSalidaDAL.ObtenerPorEmbarqueID(entradaGanado);


            if (listaInterfaceSalida == null)
            {
                return(null);
            }

            entradaGanado.ListaInterfaceSalida = listaInterfaceSalida;

            var detalles = listaInterfaceSalida.SelectMany(isa => isa.ListaInterfaceDetalle).SelectMany(isd => isd.ListaInterfaceSalidaAnimal);

            var pesosDetalles = (from isa in detalles
                                 group isa by isa.SalidaID
                                 into agrupado
                                 select new
            {
                SalidaID = agrupado.Key,
                PesoOrigen = agrupado.Sum(animal => animal.PesoCompra)
            }).ToList();

            pesosDetalles.ForEach(pesos => pesosOrigen.Add(pesos.SalidaID, pesos.PesoOrigen));

            if (!pesosDetalles.Any())
            {
                return(null);
            }

            decimal pesoTotalOrigen = pesosDetalles.Sum(pes => pes.PesoOrigen);
            decimal pesoEscala      = 0;

            if (entradaGanado.TipoOrigen != (int)TipoOrganizacion.CompraDirecta)
            {
                pesoEscala = pesosOrigen[entradaGanado.FolioOrigen];

                if (listaCompraDirecta.Any())
                {
                    //Obtener Los pesos de las compras directas ya costeadas
                    var     entradaGanadoCosteoBL        = new EntradaGanadoCosteoBL();
                    var     entradaGanadoCosteoInfo      = new EntradaGanadoCosteoInfo();
                    decimal pesoTotalOrigenCompraDirecta = 0;

                    foreach (var compraDirecta in listaCompraDirecta)
                    {
                        pesoTotalOrigenCompraDirecta = 0;
                        entradaGanadoCosteoInfo      = entradaGanadoCosteoBL.ObtenerPorEntradaGanadoID(compraDirecta.EntradaGanadoID);
                        if (entradaGanadoCosteoInfo != null && entradaGanadoCosteoInfo.ListaEntradaDetalle != null &&
                            entradaGanadoCosteoInfo.ListaEntradaDetalle.Any())
                        {
                            pesoTotalOrigenCompraDirecta =
                                (from entradaDetalle in entradaGanadoCosteoInfo.ListaEntradaDetalle
                                 select entradaDetalle.PesoOrigen)
                                .Sum();
                        }
                        pesoTotalOrigen = pesoTotalOrigen + pesoTotalOrigenCompraDirecta;
                    }
                }
            }

            listaCostosEmbarque.ForEach(costos =>
            {
                var costoUnitarioKilo = costos.Importe / pesoTotalOrigen;
                ////TODO:Con el peso escala cuando es compra directa
                decimal costoFlete = Math.Round(costoUnitarioKilo * pesoEscala, 2);

                importesProrrateado.Add(costos.Costo.CostoID, costoFlete);
            });

            return(importesProrrateado);
        }