/// <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.º 2
0
        /// <summary>
        /// Metodo para generar la proyeccion de reimplante
        /// </summary>
        internal void GenerarProyeccionReimplante()
        {
            //ResultadoPolizaModel resultadoPolizaModel = null;
            try
            {
                Logger.Info();
                var organizacionBL   = new OrganizacionBL();
                var usuarioBL        = new UsuarioBL();
                var loteBL           = new LoteBL();
                var corralBl         = new CorralBL();
                var loteProyeccionBL = new LoteProyeccionBL();
                var loteReimplanteBL = new LoteReimplanteBL();
                //Se obtiene el usuario del proceso de alimentacion
                UsuarioInfo usuario = usuarioBL.ObtenerPorActiveDirectory(UsuarioProcesosEnum.ProyeccionReimplante.ToString());
                //Si se encontro el usuario
                if (usuario != null)
                {
                    //Consulta todas las organizaciones que esten activas
                    List <OrganizacionInfo> listaOrganizaciones =
                        organizacionBL.ObtenerTodos(EstatusEnum.Activo).ToList();
                    if (listaOrganizaciones != null && listaOrganizaciones.Any())
                    {
                        //Se obtienen las organizaciones que son de tipo ganadera
                        List <OrganizacionInfo> listaOrganizacionesFiltrada =
                            listaOrganizaciones.Where(
                                organizacion =>
                                organizacion.TipoOrganizacion.TipoOrganizacionID == (int)TipoOrganizacion.Ganadera)
                            .ToList();
                        if (listaOrganizacionesFiltrada.Count > 0)
                        {
                            foreach (OrganizacionInfo organizacion in listaOrganizacionesFiltrada)
                            {
                                try
                                {
                                    //using (var scope = new TransactionScope())
                                    //{

                                    //Obtener los corrales-Lotes que fueron reimplantados
                                    List <LoteCorralReimplanteInfo> listaCorrales = ObtenerCorralesReimplantados(organizacion);
                                    if (listaCorrales != null && listaCorrales.Any())
                                    {
                                        foreach (var loteCorral in listaCorrales)
                                        {
                                            //Obtener el tipo de ganado del lote
                                            TipoGanadoInfo tipoGanadoInfo = loteBL.ObtenerTipoGanadoLoteID(loteCorral.Lote);
                                            //Info del lote
                                            loteCorral.Lote = loteBL.ObtenerPorID(loteCorral.Lote.LoteID);

                                            //Obtener las proyecciones de los corrales origenes
                                            IList <LoteProyeccionInfo> listaProyeccionOrigen =
                                                loteProyeccionBL.ObtenerProyeccionDeLotesOrigen(loteCorral);

                                            if (listaProyeccionOrigen != null && listaProyeccionOrigen.Any())
                                            {
                                                var pesoReimplantePromedio = loteCorral.PesoReimplante /
                                                                             loteCorral.TotalCabezas;
                                                var pesoOrigenPromedio = loteCorral.PesoOrigen /
                                                                         loteCorral.TotalCabezas;

                                                //ObtenerDias engorda del corral
                                                var diasEngordaCorral =
                                                    corralBl.ObtenerDiasEngordaPorLote(loteCorral.Lote);
                                                //Calcular la Ganacia Diaria = (PesoReimplante-PesoOrigen)/DiasEngordaDelCorral
                                                decimal gananciaDiaria =
                                                    ((pesoReimplantePromedio - pesoOrigenPromedio) /
                                                     (decimal)diasEngordaCorral);
                                                gananciaDiaria = Math.Round(gananciaDiaria, 2);

                                                //Calculo diasEngorda: (PesoSalida-PesoPromedioReimplante)/GananciaDiaria
                                                var diasEngorda = (int)((tipoGanadoInfo.PesoSalida - pesoReimplantePromedio) /
                                                                        gananciaDiaria);

                                                var loteProyeccion =
                                                    loteProyeccionBL.ObtenerPorLote(loteCorral.Lote);

                                                LoteReimplanteInfo loteReimplante = null;
                                                var numeroReimplante = listaProyeccionOrigen.Max(p => p.NumeroReimplante);


                                                if (loteProyeccion == null)
                                                {
                                                    // Se crea el registro en lote proyeccion
                                                    loteProyeccion = new LoteProyeccionInfo
                                                    {
                                                        LoteID            = loteCorral.Lote.LoteID,      //OK
                                                        OrganizacionID    = organizacion.OrganizacionID, //OK
                                                        Frame             = 0,                           //OK
                                                        GananciaDiaria    = gananciaDiaria,              //OK
                                                        ConsumoBaseHumeda =
                                                            listaProyeccionOrigen.Select(p => p.ConsumoBaseHumeda).Sum() /
                                                            listaProyeccionOrigen.Count(),     // Promedio De los Corrales Origenes
                                                        Conversion =
                                                            listaProyeccionOrigen.Select(p => p.Conversion).Sum() /
                                                            listaProyeccionOrigen.Count(),     // Promedio De los Corrales Origenes
                                                        PesoMaduro =
                                                            listaProyeccionOrigen.Select(p => p.PesoMaduro).Sum() /
                                                            listaProyeccionOrigen.Count(),     // Promedio De los Corrales Origenes
                                                        PesoSacrificio =
                                                            listaProyeccionOrigen.Select(p => p.PesoSacrificio).Sum() /
                                                            listaProyeccionOrigen.Count(), // Promedio De los Corrales Origenes
                                                        DiasEngorda        = diasEngorda,  // OK
                                                        FechaEntradaZilmax =
                                                            ObtenerFechaZilmax(loteCorral.Lote, tipoGanadoInfo,
                                                                               diasEngorda),  //OK
                                                        UsuarioCreacionID = usuario.UsuarioID //OK
                                                    };

                                                    loteProyeccion.LoteProyeccionID =
                                                        loteProyeccionBL.Guardar(loteProyeccion);

                                                    // Fecha Sacrificio = fechaInicioLote + loteProyeccion.DiasEngorda
                                                    DateTime fechaProyectada =
                                                        loteCorral.Lote.FechaInicio.AddDays(loteProyeccion.DiasEngorda);

                                                    DateTime fechaHoy = DateTime.Now;
                                                    TimeSpan ts       = fechaProyectada - fechaHoy;
                                                    // GananciaDiaria*DiasQueFlatanParaReimplante) + PesoReimplante
                                                    int pesoProyectado =
                                                        (int)
                                                        ((loteProyeccion.GananciaDiaria * ts.Days) +
                                                         pesoReimplantePromedio);
                                                    //Se almacena el lote reimplante nuevo
                                                    GuardarNuevoReimplante(numeroReimplante, loteProyeccion, fechaProyectada, usuario, loteCorral, pesoProyectado, pesoOrigenPromedio);
                                                }
                                                else
                                                {
                                                    // Si ya existe el LoteProyeccion Obtener los lotesReimplantes
                                                    List <LoteReimplanteInfo> loteReimplanteInfo =
                                                        loteReimplanteBL.ObtenerListaPorLote(loteCorral.Lote);

                                                    DateTime fechaProyectada =
                                                        loteCorral.Lote.FechaInicio.AddDays(loteProyeccion.DiasEngorda);
                                                    DateTime fechaHoy = DateTime.Now;
                                                    TimeSpan ts       = fechaProyectada - fechaHoy;
                                                    // GananciaDiaria*DiasQueFlatanParaReimplante) + PesoReimplante
                                                    int pesoProyectado =
                                                        (int)
                                                        ((loteProyeccion.GananciaDiaria * ts.Days) +
                                                         pesoReimplantePromedio);

                                                    if (loteReimplanteInfo != null)
                                                    {
                                                        var numeroReimplanteMaximo = loteReimplanteInfo.Max(p => p.NumeroReimplante);
                                                        if (numeroReimplante == 2 && numeroReimplanteMaximo != 3)
                                                        {
                                                            // El peso Origen sea menor a 200 generar el lote reimplante
                                                            // y que los dias engorda sean mayores a 90 dias
                                                            if (pesoOrigenPromedio <= 200 && loteProyeccion.DiasEngorda >= 90)
                                                            {
                                                                // Se crea el registro en lote reimplante
                                                                loteReimplante = new LoteReimplanteInfo
                                                                {
                                                                    LoteProyeccionID  = loteProyeccion.LoteProyeccionID,
                                                                    NumeroReimplante  = 3,
                                                                    FechaProyectada   = fechaProyectada,
                                                                    PesoProyectado    = pesoProyectado,
                                                                    PesoReal          = 0,
                                                                    FechaReal         = new DateTime(1900, 01, 01),
                                                                    UsuarioCreacionID = usuario.UsuarioID
                                                                };
                                                                loteReimplanteBL.Guardar(loteReimplante);
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        //Se almacena el lote reimplante nuevo
                                                        GuardarNuevoReimplante(numeroReimplante, loteProyeccion, fechaProyectada, usuario, loteCorral, pesoProyectado, pesoOrigenPromedio);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    //    scope.Complete();
                                    //}
                                }
                                catch (Exception ex)
                                {
                                    var bitacoraBL = new BitacoraIncidenciasBL();
                                    var bitacora   = new BitacoraErroresInfo
                                    {
                                        AccionesSiapID    = AccionesSIAPEnum.SerProReim,
                                        Mensaje           = ex.Message,
                                        UsuarioCreacionID = usuario.UsuarioID
                                    };
                                    bitacoraBL.GuardarError(bitacora);
                                }
                            }
                        }
                    }
                }
            }
            catch (ExcepcionServicio ex)
            {
                Logger.Error(ex);
                throw;
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw new ExcepcionDesconocida(MethodBase.GetCurrentMethod(), ex);
            }
        }