Ejemplo n.º 1
0
        /// <summary>
        /// Obtiene el detalle de la orden sacrificio
        /// </summary>
        /// <param name="ds">Data set con los datos</param>
        /// <param name="activo">Indica si el registro del detalle se puede editar</param>
        /// <returns></returns>
        internal static IList <OrdenSacrificioDetalleInfo> ObtenerDetalleOrdenSacrificio(DataSet ds, bool activo)
        {
            IList <OrdenSacrificioDetalleInfo> listaOrdenSacrificio = null;

            try
            {
                Logger.Info();
                DataTable dt         = ds.Tables[ConstantesDAL.DtDatos];
                var       usuarioDAL = new UsuarioDAL();
                var       corralDal  = new CorralDAL();
                var       loteDal    = new LoteDAL();
                listaOrdenSacrificio = (from detalle in dt.AsEnumerable()
                                        select new OrdenSacrificioDetalleInfo
                {
                    OrdenSacrificioDetalleID = detalle.Field <int>("OrdenSacrificioDetalleID"),
                    OrdenSacrificioID = detalle.Field <int>("OrdenSacrificioID"),
                    FolioOrdenSacrificio = detalle.Field <int>("FolioSalida"),
                    Corraleta = corralDal.ObtenerPorId(detalle.Field <int>("CorraletaID")),
                    Lote = loteDal.ObtenerPorID(detalle.Field <int>("LoteID")),
                    CorraletaCodigo = detalle.Field <string>("CorraletaCodigo"),
                    Cabezas = detalle.Field <int>("CabezasLote"),
                    DiasEngordaGrano = detalle.Field <int>("DiasEngordaGrano"),
                    DiasRetiro = detalle.Field <int>("DiasRetiro"),
                    CabezasASacrificar = detalle.Field <int>("CabezasSacrificio"),
                    Turno = (TurnoEnum)detalle.Field <int>("Turno"),
                    Proveedor = new ProveedorInfo {
                        Descripcion = detalle.Field <string>("Proveedor")
                    },
                    Clasificacion = detalle.Field <string>("Clasificacion"),
                    Orden = detalle.Field <int>("Orden"),
                    Turnos = Enum.GetValues(typeof(TurnoEnum)).Cast <TurnoEnum>().ToList(),
                    Usuario = usuarioDAL.ObtenerPorID(detalle.Field <int>("UsuarioCreacion")),
                    Activo = activo,
                    CabezasActuales = detalle.Field <int>("CabezasActuales"),
                    Seleccionable = true
                }).ToList();

                if (listaOrdenSacrificio != null)
                {
                    foreach (var ordenDetalle in listaOrdenSacrificio)
                    {
                        ordenDetalle.Corral = corralDal.ObtenerPorId(ordenDetalle.Lote.CorralID);
                        //if(ordenDetalle.Corral.TipoCorral.TipoCorralID != TipoCorral.Intensivo.GetHashCode() && ordenDetalle.CabezasActuales == 0)
                        //{
                        //    ordenDetalle.Seleccionable = false;
                        //}
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
            return(listaOrdenSacrificio);
        }
        private void GeneraLineasDetalle(SalidaGanadoEnTransitoInfo salidaMuerte)
        {
            try
            {
                //salidaMuerte.LoteID;
                //var corralOrganizacion = CorralBL.ObtenerCorralesPorOrganizacionID(salidaMuerte.OrganizacionID).FirstOrDefault(corral => corral.LoteID == salidaMuerte.LoteID);

                var corralDal = new CorralDAL();
                var loteDal   = new LoteDAL();

                //corralMuerte = corralDal.ObtenerPorId(corralOrganizacion.CorralID);
                loteMuerte   = loteDal.ObtenerPorID(salidaMuerte.LoteID);
                corralMuerte = corralDal.ObtenerPorId(salidaMuerte.CorralID);

                var entradaGanado = new EntradaGanadoTransitoInfo();
                if (loteMuerte != null)
                {
                    entradaGanado.Lote = loteMuerte;
                }

                PolizaModel.Detalle = new List <PolizaDetalleModel>();
                {
                    //var pesoMuertePromedio = corralOrganizacion.PesoPromedio;
                    var detalleModel = new PolizaDetalleModel
                    {
                        CantidadCabezas = salidaMuerte.NumCabezas.ToString(CultureInfo.InvariantCulture),
                        TipoGanado      = CONCEPTO,
                        PesoTotal       = salidaMuerte.Kilos.ToString("N"),
                        PesoPromedio    = (salidaMuerte.Kilos / salidaMuerte.NumCabezas).ToString("N"),
                        //PrecioPromedio = Math.Abs(salidaMuerte.Importe / salidaMuerte.NumCabezas).ToString("N", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                        //PrecioPromedio = Math.Abs(salidaMuerte.Importe / corralOrganizacion.PesoPromedio/salidaMuerte.NumCabezas).ToString("N2", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                        PrecioPromedio = (salidaMuerte.Importe / (salidaMuerte.Kilos / salidaMuerte.NumCabezas) / salidaMuerte.NumCabezas).ToString("N2", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                        //precio promedio por kilo=costo total/Peso total
                        //precio promedio kilo*peso total*num cabezas=importe
                        ImportePromedio = (salidaMuerte.Importe).ToString("N2", CultureInfo.CurrentCulture),    //estaba en :"N2"
                        Corral          = corralMuerte.Codigo,
                        Lote            = entradaGanado.Lote.Lote
                    };
                    PolizaModel.Detalle.Add(detalleModel);
                }
                polizaImpresion.GenerarDetalles("Detalle");
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// metodo que genera el encabezado
        /// </summary>
        /// <param name="salidaVenta">objeto de la venta</param>
        private void GeneraLineasDetalle(SalidaGanadoEnTransitoInfo salidaVenta)
        {
            //var corralOrganizacion = CorralBL.ObtenerCorralesPorOrganizacionID(salidaVenta.OrganizacionID).FirstOrDefault(corral => corral.LoteID == salidaVenta.LoteID);

            var corralDal = new CorralDAL();
            var loteDal   = new LoteDAL();


            corralVenta = corralDal.ObtenerPorId(salidaVenta.CorralID);
            loteVenta   = loteDal.ObtenerPorID(salidaVenta.LoteID);


            var entradaGanado = new EntradaGanadoTransitoInfo();

            if (loteVenta != null)
            {
                entradaGanado.Lote = loteVenta;
            }

            PolizaModel.Detalle = new List <PolizaDetalleModel>();
            {
                var detalleModel = new PolizaDetalleModel
                {
                    CantidadCabezas = salidaVenta.NumCabezas.ToString("F0"),
                    TipoGanado      = CONCEPTO,
                    PesoTotal       = (salidaVenta.Kilos).ToString("F0"),
                    PesoPromedio    = (salidaVenta.Kilos / salidaVenta.NumCabezas).ToString("F0"),
                    PrecioPromedio  = (salidaVenta.DetallesSalida.Sum(costo => costo.ImporteCosto) / (salidaVenta.Kilos / salidaVenta.NumCabezas) / salidaVenta.NumCabezas).ToString("N", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                    ImportePromedio = Math.Abs(salidaVenta.DetallesSalida.Sum(costo => costo.ImporteCosto)).ToString("N", CultureInfo.CurrentCulture).Replace("$", string.Empty),

                    Corral       = corralVenta.Codigo,
                    PrecioVenta  = Math.Abs(salidaVenta.Importe / salidaVenta.NumCabezas).ToString("N", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                    ImporteVenta = Math.Abs(salidaVenta.Importe).ToString("N", CultureInfo.CurrentCulture).Replace("$", string.Empty),
                    Lote         = entradaGanado.Lote.Lote
                };
                PolizaModel.Detalle.Add(detalleModel);
            }
            polizaImpresion.GenerarDetalles("Detalle");
        }
        /// <summary>
        /// guardar corte por transferencia
        /// </summary>
        /// <param name="guardarAnimalCorte"></param>
        /// <param name="listaTratamientos"></param>
        /// <returns></returns>
        internal CorteTransferenciaGanadoGuardarInfo GuardarCorteTransferencia(CorteTransferenciaGanadoGuardarInfo guardarAnimalCorte, IList <TratamientoInfo> listaTratamientos)
        {
            try
            {
                using (var transaction = new TransactionScope())
                {
                    Logger.Info();
                    //var corteTransferenciaGanado = new CorteTransferenciaGanadoDAL();
                    var animalBl                  = new AnimalBL();
                    var animalMovimientoBL        = new AnimalMovimientoBL();
                    var corralBl                  = new CorralBL();
                    var interfaceSalidaAnimalBl   = new InterfaceSalidaAnimalBL();
                    var interfaceSalidoAnimalInfo =
                        interfaceSalidaAnimalBl.ObtenerNumeroAreteIndividual(
                            guardarAnimalCorte.AnimalCorteTransferenciaInfo.Arete, guardarAnimalCorte.OrganizacionId);

                    if (guardarAnimalCorte.AnimalActualInfo != null)
                    {
                        guardarAnimalCorte.AnimalCorteTransferenciaInfo.FechaCompra =
                            guardarAnimalCorte.AnimalActualInfo.FechaCompra;
                    }
                    else
                    {
                        if (interfaceSalidoAnimalInfo != null)
                        {
                            guardarAnimalCorte.AnimalCorteTransferenciaInfo.FechaCompra =
                                interfaceSalidoAnimalInfo.FechaCompra;
                        }
                    }

                    var resultoAnimalInfo = animalBl.GuardarAnimal(guardarAnimalCorte.AnimalCorteTransferenciaInfo);
                    guardarAnimalCorte.AnimalCorteTransferenciaInfo = resultoAnimalInfo;
                    guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.AnimalID =
                        guardarAnimalCorte.AnimalCorteTransferenciaInfo.AnimalID;

                    var loteBl              = new LoteBL();
                    var resultadoLote       = -1;
                    var resultadoLoteOrigen = loteBl.ObtenerPorID(guardarAnimalCorte.AnimalMovimientoOrigenInfo.LoteID);
                    var resultadoLoteBL     =
                        loteBl.ObtenerLotesActivos(
                            guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.OrganizacionID,
                            Convert.ToInt32(guardarAnimalCorte.CorralInfoGen.CorralID));
                    if (resultadoLoteBL == null)
                    {
                        //var corralInfo = new CorralInfo
                        //{
                        //    Codigo = guardarAnimalCorte.TxtCorralDestino,
                        //    TipoCorral = new TipoCorralInfo { TipoCorralID = (int)TipoCorral.Improductivos },
                        //    Organizacion = new OrganizacionInfo { OrganizacionID = guardarAnimalCorte.OrganizacionId }
                        //};
                        CorralInfo resultadoCorralPl = corralBl.ObtenerPorId(guardarAnimalCorte.CorralDestinoID);
                        if (resultadoCorralPl != null)
                        {
                            var loteCrear         = new LoteBL();
                            var tipoProcesoBl     = new TipoProcesoBL();
                            var tipoProcesoResult =
                                tipoProcesoBl.ObtenerPorOrganizacion(guardarAnimalCorte.OrganizacionId);
                            var loteInfoLote = new LoteInfo
                            {
                                Activo               = EstatusEnum.Activo,
                                Cabezas              = Convert.ToInt32(0),
                                CabezasInicio        = Convert.ToInt32(0),
                                CorralID             = resultadoCorralPl.CorralID,
                                DisponibilidadManual = false,
                                OrganizacionID       =
                                    guardarAnimalCorte.AnimalMovimientoOrigenInfo.OrganizacionID,
                                TipoCorralID      = resultadoCorralPl.TipoCorral.TipoCorralID,
                                TipoProcesoID     = tipoProcesoResult,
                                UsuarioCreacionID = resultadoCorralPl.UsuarioCreacionID,
                            };
                            resultadoLote = loteCrear.GuardaLote(loteInfoLote);
                            guardarAnimalCorte.LoteDestinoInfo = loteCrear.ObtenerPorID(resultadoLote);
                        }
                    }
                    else
                    {
                        guardarAnimalCorte.LoteDestinoInfo = resultadoLoteBL;
                    }
                    //Se manda a guardar movimiento de salida de enfermeria
                    //var animalSalidaInfo = new AnimalSalidaInfo();
                    //animalSalidaInfo = animalBl.ObtenerAnimalSalidaAnimalID(guardarAnimalCorte.AnimalCorteTransferenciaInfo.AnimalID);

                    //guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.CorralID = animalSalidaInfo.CorralId;
                    //guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.LoteID = animalSalidaInfo.LoteId;
                    //guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.TipoMovimientoID = (int)TipoMovimiento.SalidaEnfermeria;
                    //guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo = animalMovimientoBL.GuardarAnimalMovimiento(guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo);

                    //Se manda a guardar movimiento de corte por transferencia
                    guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.CorralID =
                        guardarAnimalCorte.CorralInfoGen.CorralID;
                    guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.LoteID = resultadoLoteBL != null
                        ? resultadoLoteBL.LoteID
                        : resultadoLote;
                    guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.TipoMovimientoID =
                        (int)TipoMovimiento.CortePorTransferencia;
                    guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo =
                        animalMovimientoBL.GuardarAnimalMovimiento(
                            guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo);

                    if (guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo != null &&
                        guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo.AnimalMovimientoID > 0)
                    {
                        if (resultadoLoteOrigen != null && guardarAnimalCorte.LoteDestinoInfo != null)
                        {
                            guardarAnimalCorte.CorralGlobal                  = guardarAnimalCorte.AnimalMovimientoOrigenInfo.CorralID;
                            guardarAnimalCorte.LoteDestinoInfo.Cabezas       = guardarAnimalCorte.LoteDestinoInfo.Cabezas + 1;
                            guardarAnimalCorte.LoteDestinoInfo.CabezasInicio =
                                guardarAnimalCorte.LoteDestinoInfo.CabezasInicio + 1;
                            resultadoLoteOrigen.Cabezas = resultadoLoteOrigen.Cabezas - 1;
                            var filtroActualizaCabezas = new FiltroActualizarCabezasLote
                            {
                                LoteIDOrigen          = resultadoLoteOrigen.LoteID,
                                LoteIDDestino         = guardarAnimalCorte.LoteDestinoInfo.LoteID,
                                CabezasProcesadas     = 1,
                                UsuarioModificacionID =
                                    guardarAnimalCorte.UsuarioCreacionID
                            };
                            var cabezas = loteBl.ActualizarCabezasProcesadas(filtroActualizaCabezas);
                            //TODO nuevo metodo
                            //loteBl.ActualizaNoCabezasEnLote(guardarAnimalCorte.LoteDestinoInfo, resultadoLoteOrigen);
                            loteBl.ActualizarSalidaEnfermeria(guardarAnimalCorte.AnimalMovimientoOrigenInfo);
                            loteBl.ActualizarFechaSalidaEnLote(resultadoLoteOrigen);
                            //if (resultadoLoteOrigen.Cabezas == 0)
                            //{
                            //    resultadoLoteOrigen.Activo = (int)EstatusEnum.Inactivo;
                            //    loteBl.ActualizaActivoEnLote(resultadoLoteOrigen);
                            //}
                            // ObtenerTotalCabezas(loteCorralOrigen);
                        }
                        if (ObtenerTotalCabezas(guardarAnimalCorte.AnimalMovimientoOrigenInfo))
                        {
                            corralBl.TraspasarAnimalSalidaEnfermeria(
                                guardarAnimalCorte.AnimalSalidaGuardarInfo.CorraletaId,
                                guardarAnimalCorte.AnimalMovimientoOrigenInfo.LoteID);
                            //loteDAL.EliminarSalidaEnfermeria(guardarAnimalCorte.AnimalMovimientoOrigenInfo);
                        }
                    }

                    if (guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo != null)
                    {
                        var almacenMovimientoInfo = new AlmacenMovimientoInfo
                        {
                            AlmacenID          = guardarAnimalCorte.AlmacenID,
                            AnimalMovimientoID =
                                guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo
                                .AnimalMovimientoID,
                            TipoMovimientoID  = (int)TipoMovimiento.SalidaPorConsumo,
                            Status            = (int)EstatusInventario.Aplicado,
                            Observaciones     = "",
                            UsuarioCreacionID = guardarAnimalCorte.UsuarioCreacionID,
                            AnimalID          =
                                guardarAnimalCorte.AnimalMovimientoCorteTransferenciaInfo
                                .AnimalID,
                            //Verificar
                            CostoID = (int)Costo.MedicamentoDeImplante,
                        };
                        var almacenBL = new AlmacenBL();
                        almacenBL.GuardarDescontarTratamientos(
                            listaTratamientos.Where(item => item.Seleccionado && item.Habilitado).ToList(),
                            almacenMovimientoInfo);
                    }
                    var loteProyeccionBL = new LoteProyeccionBL();
                    LoteProyeccionInfo proyeccionDestino =
                        loteProyeccionBL.ObtenerPorLote(guardarAnimalCorte.LoteDestinoInfo);
                    //guardarAnimalCorte.LoteDestinoInfo.LoteID
                    if (proyeccionDestino == null)
                    {
                        LoteProyeccionInfo proyeccionOrigen = loteProyeccionBL.ObtenerPorLote(resultadoLoteOrigen);

                        if (proyeccionOrigen != null && resultadoLoteOrigen != null && guardarAnimalCorte.LoteDestinoInfo != null)
                        {
                            proyeccionOrigen.LoteProyeccionID = 0;
                            int      diasEngordaOrigen = proyeccionOrigen.DiasEngorda;
                            DateTime fechaInicioLote   = resultadoLoteOrigen.FechaInicio;
                            int      diasEngordaReales =
                                new TimeSpan(DateTime.Now.Ticks - fechaInicioLote.Ticks).Days;

                            if ((diasEngordaOrigen - diasEngordaReales) <= 0)
                            {
                                proyeccionOrigen.DiasEngorda = 0;
                            }
                            else
                            {
                                proyeccionOrigen.DiasEngorda = diasEngordaOrigen - diasEngordaReales;
                            }

                            proyeccionOrigen.LoteID            = guardarAnimalCorte.LoteDestinoInfo.LoteID;
                            proyeccionOrigen.UsuarioCreacionID = guardarAnimalCorte.UsuarioCreacionID;
                            loteProyeccionBL.Guardar(proyeccionOrigen);

                            var loteDAL = new LoteDAL();
                            var filtroDisponibilidad = new FiltroDisponilidadInfo
                            {
                                UsuarioId = guardarAnimalCorte.UsuarioCreacionID,
                                ListaLoteDisponibilidad =
                                    new List <DisponibilidadLoteInfo>
                                {
                                    new DisponibilidadLoteInfo
                                    {
                                        LoteId = guardarAnimalCorte.LoteDestinoInfo.LoteID,
                                        FechaDisponibilidad =
                                            resultadoLoteOrigen.FechaDisponibilidad,
                                        DisponibilidadManual =
                                            resultadoLoteOrigen.DisponibilidadManual
                                    }
                                }
                            };
                            loteDAL.ActualizarLoteDisponibilidad(filtroDisponibilidad);
                        }
                    }

                    transaction.Complete();
                    return(guardarAnimalCorte);
                }
            }
            catch (ExcepcionGenerica)
            {
                return(null);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// Metodo para guardar la configuracion de reimplantes
 /// </summary>
 /// <param name="configuracionReimplante">Representa el Contexto de lo que se va a guardar</param>
 public int GuardarConfiguracionReimplante(ConfiguracionReimplanteModel configuracionReimplante)
 {
     try
     {
         Logger.Info();
         var loteReimplanteBL       = new LoteReimplanteBL();
         var loteProyeccionDAL      = new LoteProyeccionDAL();
         var loteDAL                = new LoteDAL();
         int result                 = configuracionReimplante.LoteProyeccion.LoteProyeccionID;
         var opciones               = new TransactionOptions();
         var filtroDisponilidadInfo = new FiltroDisponilidadInfo
         {
             UsuarioId = configuracionReimplante.LoteProyeccion.UsuarioCreacionID,
             ListaLoteDisponibilidad =
                 new List <DisponibilidadLoteInfo>
             {
                 new DisponibilidadLoteInfo
                 {
                     LoteId = configuracionReimplante.Lote.LoteID,
                     FechaDisponibilidad  = configuracionReimplante.FechaDisponible,
                     DisponibilidadManual = false
                 }
             }
         };
         opciones.IsolationLevel = IsolationLevel.ReadUncommitted;
         opciones.Timeout        = new TimeSpan(2, 0, 0);
         using (var scope = new TransactionScope(TransactionScopeOption.Required, opciones))
         {
             if (configuracionReimplante.LoteProyeccion.LoteProyeccionID == 0)
             {
                 configuracionReimplante.LoteProyeccion.OrganizacionID = configuracionReimplante.Corral.Organizacion.OrganizacionID;
                 configuracionReimplante.LoteProyeccion.LoteID         = configuracionReimplante.Lote.LoteID;
                 result = loteProyeccionDAL.Crear(configuracionReimplante.LoteProyeccion);
                 configuracionReimplante.LoteProyeccion.LoteProyeccionID = result;
                 loteProyeccionDAL.CrearBitacora(configuracionReimplante.LoteProyeccion);
             }
             else
             {
                 if (configuracionReimplante.LoteProyeccion.AplicaBitacora)
                 {
                     loteProyeccionDAL.Actualizar(configuracionReimplante.LoteProyeccion);
                     loteProyeccionDAL.CrearBitacora(configuracionReimplante.LoteProyeccion);
                 }
             }
             if (configuracionReimplante.LoteProyeccion.ListaReimplantes != null &&
                 configuracionReimplante.LoteProyeccion.ListaReimplantes.Any())
             {
                 configuracionReimplante.LoteProyeccion.ListaReimplantes.ToList().ForEach(
                     reimp => reimp.LoteProyeccionID = result);
                 loteReimplanteBL.GuardarListaReimplantes(
                     configuracionReimplante.LoteProyeccion.ListaReimplantes.ToList());
             }
             loteDAL.ActualizarLoteDisponibilidad(filtroDisponilidadInfo);
             if (configuracionReimplante.Lote.AplicaCierreLote)
             {
                 loteDAL.ActualizaFechaCierre(configuracionReimplante.Lote.LoteID, configuracionReimplante.UsuarioCreacionID);
             }
             scope.Complete();
         }
         return(result);
     }
     catch (ExcepcionGenerica)
     {
         throw;
     }
     catch (Exception ex)
     {
         Logger.Error(ex);
         throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
     }
 }
Ejemplo n.º 6
0
        //Metodo que guarda el movimiento
        private void GuardarMovimientoTraspasoGanadoCorrales(List <AnimalInfo> aretesTotal, CorralInfo corralInfo, UsuarioInfo usuarioInfo)
        {
            //var animalInfo = new AnimalInfo();
            int loteOrigenID       = 0;
            int loteDestinoID      = 0;
            var loteBl             = new LoteBL();
            var animalBL           = new AnimalBL();
            var animalMovimientoBL = new AnimalMovimientoBL();
            var tipoProcesoBl      = new TipoProcesoBL();
            var fechaBL            = new FechaBL();
            var loteProyeccionBL   = new LoteProyeccionBL();

            List <AnimalMovimientoInfo> ultimosMovimientos = animalBL.ObtenerUltimoMovimientoAnimalXML(aretesTotal,
                                                                                                       usuarioInfo.
                                                                                                       Organizacion.
                                                                                                       OrganizacionID);

            if (ultimosMovimientos == null)
            {
                ultimosMovimientos = new List <AnimalMovimientoInfo>();
            }

            var resultadoLoteBl = loteBl.ObtenerLotesActivos(usuarioInfo.Organizacion.OrganizacionID,
                                                             Convert.ToInt32(corralInfo.CorralID));

            var tipoProcesoResult =
                tipoProcesoBl.ObtenerPorOrganizacion(usuarioInfo.Organizacion.OrganizacionID);

            var fechaServidor = fechaBL.ObtenerFechaActual();

            IList <LoteInfo> lotesCorrales = loteBl.ObtenerPorOrganizacionEstatus(
                usuarioInfo.Organizacion.OrganizacionID, EstatusEnum.Activo);

            if (lotesCorrales == null)
            {
                lotesCorrales = new List <LoteInfo>();
            }

            IList <LoteProyeccionInfo> lotesProyeccion =
                loteProyeccionBL.ObtenerPorLoteXML(usuarioInfo.Organizacion.OrganizacionID, lotesCorrales);


            var resultadoLote = -1;

            using (var transaction = new TransactionScope())
            {
                if (resultadoLoteBl == null)
                {
                    var loteCrear    = new LoteBL();
                    var loteInfoLote = new LoteInfo
                    {
                        Activo               = EstatusEnum.Activo,
                        Cabezas              = Convert.ToInt32(0),
                        CabezasInicio        = Convert.ToInt32(0),
                        CorralID             = corralInfo.CorralID,
                        DisponibilidadManual = false,
                        OrganizacionID       = usuarioInfo.Organizacion.OrganizacionID,
                        TipoCorralID         = corralInfo.TipoCorral.TipoCorralID,
                        TipoProcesoID        = tipoProcesoResult,
                        UsuarioCreacionID    = usuarioInfo.UsuarioID
                    };
                    resultadoLote = loteCrear.GuardaLote(loteInfoLote);
                    if ((corralInfo.TipoCorral != null &&
                         corralInfo.TipoCorral.TipoCorralID != TipoCorral.Enfermeria.GetHashCode()) ||
                        (corralInfo.TipoCorralId > 0 &&
                         corralInfo.TipoCorralId != TipoCorral.Enfermeria.GetHashCode()))
                    {
                        loteBl.ActualizaFechaCierre(resultadoLote, usuarioInfo.UsuarioID);
                    }
                }

                foreach (var animalInfo in aretesTotal)
                {
                    var animalMovimientoInfo = new AnimalMovimientoInfo();

                    animalInfo.OrganizacionIDEntrada = usuarioInfo.Organizacion.OrganizacionID;
                    //Obtener ultimo movimiento del animal
                    var ultimoMovimientoInfo =
                        ultimosMovimientos.FirstOrDefault(ani => ani.AnimalID == animalInfo.AnimalID);
                    if (ultimoMovimientoInfo != null)
                    {
                        animalMovimientoInfo.OrganizacionID = usuarioInfo.Organizacion.OrganizacionID;
                        animalMovimientoInfo.AnimalID       = animalInfo.AnimalID;

                        animalMovimientoInfo.CorralID = corralInfo.CorralID;
                        animalMovimientoInfo.LoteID   = resultadoLoteBl != null ? resultadoLoteBl.LoteID : resultadoLote;
                        DateTime diaHoy = fechaServidor.FechaActual.Date;
                        animalMovimientoInfo.FechaMovimiento   = diaHoy.Date;
                        animalMovimientoInfo.Peso              = ultimoMovimientoInfo.Peso;
                        animalMovimientoInfo.Temperatura       = ultimoMovimientoInfo.Temperatura;
                        animalMovimientoInfo.TipoMovimientoID  = (int)TipoMovimiento.TraspasoDeGanado;
                        animalMovimientoInfo.TrampaID          = ultimoMovimientoInfo.TrampaID;
                        animalMovimientoInfo.OperadorID        = ultimoMovimientoInfo.OperadorID;
                        animalMovimientoInfo.Observaciones     = String.Empty;
                        animalMovimientoInfo.Activo            = EstatusEnum.Activo;
                        animalMovimientoInfo.UsuarioCreacionID = usuarioInfo.UsuarioID;

                        //Se manda a guardar el registro en base de datos
                        animalMovimientoInfo = animalMovimientoBL.GuardarAnimalMovimiento(animalMovimientoInfo);
                        if (animalMovimientoInfo == null || animalMovimientoInfo.AnimalMovimientoID <= 0)
                        {
                            return;
                        }

                        var resultadoLoteOrigen  = loteBl.ObtenerPorID(ultimoMovimientoInfo.LoteID);
                        var resultadoLoteDestino = loteBl.ObtenerPorID(animalMovimientoInfo.LoteID);

                        if (resultadoLoteDestino != null)
                        {
                            resultadoLoteDestino.UsuarioModificacionID = usuarioInfo.UsuarioID;
                        }

                        //Incrementar y Decrementar cabezas
                        if (resultadoLoteOrigen != null && resultadoLoteDestino != null)
                        {
                            loteOrigenID  = resultadoLoteOrigen.LoteID;
                            loteDestinoID = resultadoLoteDestino.LoteID;

                            resultadoLoteDestino.Cabezas       = resultadoLoteDestino.Cabezas + 1;
                            resultadoLoteDestino.CabezasInicio = resultadoLoteDestino.CabezasInicio + 1;
                            resultadoLoteOrigen.Cabezas        = resultadoLoteOrigen.Cabezas - 1;

                            //Verificar si el Lote tiene cabezas en 0 para inactivarlo
                            resultadoLoteOrigen = loteBl.ObtenerPorID(ultimoMovimientoInfo.LoteID);
                            if (resultadoLoteOrigen.Cabezas != 0)
                            {
                                continue;
                            }
                        }
                    }
                }

                var loteOrigenInfo  = loteBl.ObtenerPorID(loteOrigenID);
                var loteDestinoInfo = loteBl.ObtenerPorID(loteDestinoID);

                if (lotesProyeccion != null && lotesProyeccion.Any())
                {
                    LoteProyeccionInfo proyeccionOrigen =
                        lotesProyeccion.FirstOrDefault(lote => lote.LoteID == loteOrigenInfo.LoteID);
                    LoteProyeccionInfo proyeccionDestino =
                        lotesProyeccion.FirstOrDefault(lote => lote.LoteID == loteDestinoInfo.LoteID);
                    if (proyeccionOrigen != null && proyeccionDestino == null)
                    {
                        proyeccionOrigen.LoteProyeccionID = 0;
                        int      diasEngordaOrigen = proyeccionOrigen.DiasEngorda;
                        DateTime fechaInicioLote   = loteOrigenInfo.FechaInicio;
                        int      diasEngordaReales =
                            new TimeSpan(DateTime.Now.Ticks - fechaInicioLote.Ticks).Days;

                        if ((diasEngordaOrigen - diasEngordaReales) <= 0)
                        {
                            proyeccionOrigen.DiasEngorda = 0;
                        }
                        else
                        {
                            proyeccionOrigen.DiasEngorda = diasEngordaOrigen - diasEngordaReales;
                        }

                        proyeccionOrigen.LoteID            = loteDestinoInfo.LoteID;
                        proyeccionOrigen.UsuarioCreacionID = usuarioInfo.UsuarioID;
                        loteProyeccionBL.Guardar(proyeccionOrigen);

                        var loteDAL = new LoteDAL();
                        var filtroDisponibilidad = new FiltroDisponilidadInfo
                        {
                            UsuarioId = usuarioInfo.UsuarioID,
                            ListaLoteDisponibilidad =
                                new List <DisponibilidadLoteInfo>
                            {
                                new DisponibilidadLoteInfo
                                {
                                    LoteId = loteDestinoInfo.LoteID,
                                    FechaDisponibilidad  = loteOrigenInfo.FechaDisponibilidad,
                                    DisponibilidadManual = loteOrigenInfo.DisponibilidadManual
                                }
                            }
                        };
                        loteDAL.ActualizarLoteDisponibilidad(filtroDisponibilidad);
                    }
                }


                List <AnimalInfo> animalesOrigen =
                    animalBL.ObtenerAnimalesPorLote(usuarioInfo.Organizacion.OrganizacionID,
                                                    loteOrigenID);
                if (animalesOrigen != null && animalesOrigen.Any())
                {
                    loteOrigenInfo.Cabezas = animalesOrigen.Count;
                }

                List <AnimalInfo> animalesDestino =
                    animalBL.ObtenerAnimalesPorLote(usuarioInfo.Organizacion.OrganizacionID,
                                                    loteDestinoID);
                if (animalesDestino != null && animalesDestino.Any())
                {
                    loteDestinoInfo.Cabezas = animalesDestino.Count;
                }
                //Se actualizan las cabezas que tiene el lote
                var filtro = new FiltroActualizarCabezasLote
                {
                    CabezasProcesadas     = aretesTotal.Count,
                    LoteIDDestino         = loteDestinoInfo.LoteID,
                    LoteIDOrigen          = loteOrigenInfo.LoteID,
                    UsuarioModificacionID = usuarioInfo.UsuarioID
                };

                loteBl.ActualizarCabezasProcesadas(filtro);

                transaction.Complete();
            }
        }