/// <summary>
 /// Guarda una interface salida traspaso y regresa el item insertado.
 /// </summary>
 /// <param name="interfaceSalidaTraspaso"></param>
 /// <returns></returns>
 internal void Actualizar(InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso)
 {
     try
     {
         var interfaceSalidaTraspasoDal = new InterfaceSalidaTraspasoDAL();
         interfaceSalidaTraspasoDal.Actualizar(interfaceSalidaTraspaso);
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Guarda una interface salida traspaso y regresa el item insertado.
        /// </summary>
        /// <param name="interfaceSalidaTraspaso"></param>
        /// <returns></returns>
        internal InterfaceSalidaTraspasoInfo Crear(InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso)
        {
            InterfaceSalidaTraspasoInfo result;

            try
            {
                var interfaceSalidaTraspasoDal = new InterfaceSalidaTraspasoDAL();
                result = interfaceSalidaTraspasoDal.Crear(interfaceSalidaTraspaso);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }

            return(result);
        }
 /// <summary>
 /// Obtiene datos de Interface Salida Traspaso
 /// por Lotes
 /// </summary>
 /// <param name="lotes"></param>
 /// <param name="fecha"> </param>
 /// <param name="foliosTraspaso"> </param>
 /// <returns></returns>
 internal List <InterfaceSalidaTraspasoInfo> ObtenerInterfaceSalidaTraspasoLotes(List <LoteInfo> lotes, DateTime fecha, List <PolizaSacrificioModel> foliosTraspaso)
 {
     try
     {
         Logger.Info();
         var interfaceSalidaTraspaspDAL = new InterfaceSalidaTraspasoDAL();
         return(interfaceSalidaTraspaspDAL.ObtenerInterfaceSalidaTraspasoLotes(lotes, fecha, foliosTraspaso));
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtiene el listado de organizaciones que se han registrado del dia
 /// </summary>
 /// <returns></returns>
 internal InterfaceSalidaTraspasoInfo ObtenerInterfaceSalidaTraspasoPorLote(LoteInfo loteInfo)
 {
     try
     {
         Logger.Info();
         var interfaceSalidaTraspaspBl = new InterfaceSalidaTraspasoDAL();
         return(interfaceSalidaTraspaspBl.ObtenerInterfaceSalidaTraspasoPorLote(loteInfo));
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtiene una coleccion con los datos que han
 /// sido traspasados por medio de la interface
 /// </summary>
 /// <param name="organizacionID"></param>
 /// <param name="fechaInicial"></param>
 /// <param name="fechaFinal"></param>
 /// <returns></returns>
 internal List <InterfaceSalidaTraspasoInfo> ObtenerTraspasosPorFechaConciliacion(int organizacionID, DateTime fechaInicial, DateTime fechaFinal)
 {
     try
     {
         Logger.Info();
         var interfaceSalidaTraspaspDAL = new InterfaceSalidaTraspasoDAL();
         return(interfaceSalidaTraspaspDAL.ObtenerTraspasosPorFechaConciliacion(organizacionID, fechaInicial,
                                                                                fechaFinal));
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtiene el listado de organizaciones que se han registrado del dia
 /// </summary>
 /// <returns></returns>
 internal List <InterfaceSalidaTraspasoInfo> ObtenerListaInterfaceSalidaTraspaso()
 {
     try
     {
         var interfaceSalidaTraspaspBl = new InterfaceSalidaTraspasoDAL();
         var listado = interfaceSalidaTraspaspBl.ObtenerListaInterfaceSalidaTraspaso();
         if (listado != null)
         {
             foreach (var interfaceSalidaTraspasoInfo in listado)
             {
                 if (interfaceSalidaTraspasoInfo.OrganizacionDestino != null)
                 {
                     var organizacionBl = new OrganizacionBL();
                     interfaceSalidaTraspasoInfo.OrganizacionDestino =
                         organizacionBl.ObtenerPorID(
                             interfaceSalidaTraspasoInfo.OrganizacionDestino.OrganizacionID);
                 }
                 if (interfaceSalidaTraspasoInfo.Formula != null)
                 {
                     var formulaBl = new FormulaBL();
                     interfaceSalidaTraspasoInfo.Formula = formulaBl.ObtenerPorID(interfaceSalidaTraspasoInfo.Formula.FormulaId);
                 }
                 if (interfaceSalidaTraspasoInfo.TipoGanado != null)
                 {
                     var tipoGanadoBl = new TipoGanadoBL();
                     interfaceSalidaTraspasoInfo.TipoGanado =
                         tipoGanadoBl.ObtenerPorID(interfaceSalidaTraspasoInfo.TipoGanado.TipoGanadoID);
                     interfaceSalidaTraspasoInfo.Sexo = interfaceSalidaTraspasoInfo.TipoGanado.Sexo;
                 }
             }
         }
         return(listado);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
 /// <summary>
 /// Obtiene datos de Interface Salida Traspaso
 /// por Lotes
 /// </summary>
 /// <param name="folioTraspaso"></param>
 internal List <InterfaceSalidaTraspasoInfo> ObtenerInterfaceSalidaTraspaso(PolizaSacrificioModel folioTraspaso)
 {
     try
     {
         Logger.Info();
         var interfaceSalidaTraspaspDAL = new InterfaceSalidaTraspasoDAL();
         List <InterfaceSalidaTraspasoInfo> resultado = interfaceSalidaTraspaspDAL
                                                        .ObtenerInterfaceSalidaTraspaso(folioTraspaso);
         return(resultado);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
        /// <summary>
        /// Guarda una lista de interface salida traspaso.
        /// </summary>
        /// <param name="interfaceSalidaTraspaso"></param>
        internal Dictionary <long, decimal> CrearLista(InterfaceSalidaTraspasoInfo interfaceSalidaTraspaso)
        {
            decimal costoGanado = 0;

            try
            {
                var interfaceSalidaTraspasoDal = new InterfaceSalidaTraspasoDAL();
                using (var scope = new TransactionScope())
                {
                    interfaceSalidaTraspaso.TraspasoGanado =
                        interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Select(det => det.TraspasoGanado).
                        FirstOrDefault();
                    interfaceSalidaTraspaso.SacrificioGanado =
                        interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Select(det => det.SacrificioGanado).
                        FirstOrDefault();

                    InterfaceSalidaTraspasoInfo interfaceSalidaTraspasoGuardado;

                    if (interfaceSalidaTraspaso.InterfaceSalidaTraspasoId > 0)
                    {
                        Actualizar(interfaceSalidaTraspaso);
                        interfaceSalidaTraspasoGuardado = interfaceSalidaTraspaso;
                    }
                    else
                    {
                        var folioBL = new FolioBL();
                        interfaceSalidaTraspaso.FolioTraspaso = folioBL.ObtenerFolio(interfaceSalidaTraspaso.OrganizacionId
                                                                                     , TipoFolio.TraspasoGanado);
                        interfaceSalidaTraspasoGuardado = Crear(interfaceSalidaTraspaso);
                    }
                    var loteBL = new LoteBL();
                    if (interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.Any())
                    {
                        interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle.ForEach(
                            det =>
                            det.InterfaceSalidaTraspasoID = interfaceSalidaTraspasoGuardado.InterfaceSalidaTraspasoId);

                        interfaceSalidaTraspasoDal.CrearLista(interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle);
                        List <LoteInfo> lotes = interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle
                                                .Select(lote => new LoteInfo
                        {
                            LoteID  = lote.Lote.LoteID,
                            Cabezas = lote.Cabezas,
                            UsuarioModificacionID = lote.UsuarioCreacionID
                        }).ToList();
                        loteBL.AcutalizaCabezasLoteXML(lotes);
                        List <LoteInfo> lotesCabezas = lotes.GroupBy(lote => lote.LoteID).Select(x => new LoteInfo
                        {
                            LoteID  = x.Key,
                            Cabezas = x.Sum(cab => cab.Cabezas),
                            UsuarioModificacionID = x.Select(usu => usu.UsuarioModificacionID).FirstOrDefault()
                        }).ToList();
                        List <LoteInfo> lotesDesactivar =
                            (from ist in interfaceSalidaTraspaso.ListaInterfaceSalidaTraspasoDetalle
                             from lote in lotesCabezas
                             where ist.Lote.Cabezas - lote.Cabezas == 0
                             select lote).ToList();
                        if (lotesDesactivar.Any())
                        {
                            loteBL.DesactivarLoteXML(lotesDesactivar);
                        }
                    }
                    #region POLIZA
                    if (interfaceSalidaTraspasoGuardado.PesoBruto > 0 && interfaceSalidaTraspasoGuardado.PesoTara > 0)
                    {
                        var      polizaBL       = new PolizaBL();
                        int      organizacionID = interfaceSalidaTraspasoGuardado.OrganizacionId;
                        DateTime fechaEnvio     = interfaceSalidaTraspasoGuardado.FechaEnvio;
                        long     folio          = interfaceSalidaTraspasoGuardado.FolioTraspaso;

                        IList <PolizaInfo> polizasGanado =
                            polizaBL.ObtenerPolizaConDocumentoSAPPendientes(TipoPoliza.SalidaGanado, organizacionID, fechaEnvio);
                        if (polizasGanado != null)
                        {
                            polizasGanado = polizasGanado.Where(con => con.Concepto.StartsWith(string.Format("ST-{0} ", folio))).ToList();
                        }
                        if (polizasGanado == null || !polizasGanado.Any())
                        {
                            InterfaceSalidaTraspasoInfo interfaceSalidaTraspasoSacarDetalle =
                                ObtenerInterfaceSalidaTraspasoPorFolioOrganizacion(interfaceSalidaTraspasoGuardado);
                            if (interfaceSalidaTraspasoSacarDetalle != null)
                            {
                                interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle =
                                    interfaceSalidaTraspasoSacarDetalle.ListaInterfaceSalidaTraspasoDetalle;
                            }
                            List <LoteInfo> lotesAnimal = interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle
                                                          .Select(lote => new LoteInfo
                            {
                                LoteID = lote.Lote.LoteID
                            }).ToList();
                            var animalBL = new AnimalBL();
                            List <AnimalInfo> animales
                                = animalBL.ObtenerAnimalesPorLoteXML(lotesAnimal, interfaceSalidaTraspaso.OrganizacionId);
                            int cabezas = interfaceSalidaTraspasoGuardado.ListaInterfaceSalidaTraspasoDetalle
                                          .Sum(cab => cab.Cabezas);
                            if (cabezas > animales.Count)
                            {
                                throw new ExcepcionServicio("No existe suficiente inventario para realizar el traspaso.");
                            }

                            var polizaSalidaGanado =
                                FabricaPoliza.ObtenerInstancia().ObtenerTipoPoliza(TipoPoliza.SalidaGanado);
                            polizasGanado = polizaSalidaGanado.GeneraPoliza(interfaceSalidaTraspasoGuardado);
                            if (polizasGanado != null && polizasGanado.Any())
                            {
                                polizasGanado.ToList().ForEach(datos =>
                                {
                                    datos.OrganizacionID =
                                        interfaceSalidaTraspaso.OrganizacionId;
                                    datos.UsuarioCreacionID =
                                        interfaceSalidaTraspaso.UsuarioModificacionID ??
                                        0;
                                    datos.ArchivoEnviadoServidor = 1;
                                });
                                polizaBL.GuardarServicioPI(polizasGanado, TipoPoliza.SalidaGanado);
                            }
                        }
                        if (polizasGanado != null)
                        {
                            costoGanado =
                                polizasGanado.Where(imp => imp.Importe.IndexOf('-') < 0).Sum(
                                    imp => Convert.ToDecimal(imp.Importe));
                        }
                    }

                    #endregion POLIZA
                    scope.Complete();
                }
            }
            catch (ExcepcionServicio ex)
            {
                Logger.Error(ex);
                throw new ExcepcionServicio(MethodBase.GetCurrentMethod(), ex);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(new Dictionary <long, decimal> {
                { interfaceSalidaTraspaso.FolioTraspaso, costoGanado }
            });
        }
        /// <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);
        }