public ProgramarMantenimientosPRE(IProgramarMantenimientosVIS vista)
 {
     try
     {
         this.vista       = vista;
         this.controlador = new CitaMantenimientoBR();
         dctx             = FacadeBR.ObtenerConexion();
     }
     catch (Exception ex)
     {
         throw new Exception(nombreClase + ".ProgramarMantenimientosPRE: " + ex.Message);
     }
 }
 /// <summary>
 /// Constructor de la clase en uco
 /// </summary>
 /// <param name="vistaCita">Crea una instancia para la Interfaz IReprogramarCitaMantenimientoVIS</param>
 /// <param name="vistaUCDatosCita">Crea una instancia para la Interfaz IucDatosCitaMantenimientoVIS</param>
 public ReprogramarCitaMantenimientoPRE(IReprogramarCitaMantenimientoVIS vistaCita, IucDatosCitaMantenimientoVIS vistaUCDatosCita)
 {
     try
     {
         this.vistaCita        = vistaCita;
         this.vistaUCDatosCita = vistaUCDatosCita;
         this.presentadorDatos = new ucDatosCitaMantenimientoPRE(vistaUCDatosCita);
         controlador           = new CitaMantenimientoBR();
         dctx = FacadeBR.ObtenerConexion();
     }
     catch (Exception ex)
     {
         throw new Exception(nombreClase + "ReprogramarCitaMantenimientoPRE: " + ex.Message);
     }
 }
        /// <summary>
        /// Determina de acuerdo a la capacidad del taller si el limite ya se ha superado
        /// </summary>
        /// <param name="fecha"></param>
        /// <returns></returns>
        public bool LimiteTallerSuperado(DateTime?fecha)
        {
            var tipoMantto   = (ETipoMantenimiento)Enum.Parse(typeof(ETipoMantenimiento), this.vista.TipoMantenimiento);
            var fechaInicial = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day);
            var fechaFinal   = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, 23, 59, 59);

            do
            {
                if (fechaInicial.DayOfWeek != DayOfWeek.Monday)
                {
                    fechaInicial = fechaInicial.AddDays(-1);
                }
            } while (fechaInicial.DayOfWeek != DayOfWeek.Monday);
            do
            {
                if (fechaFinal.DayOfWeek != DayOfWeek.Sunday)
                {
                    fechaFinal = fechaFinal.AddDays(1);
                }
            } while (fechaFinal.DayOfWeek != DayOfWeek.Sunday);

            decimal tiempoPorDia = FacadeBR.ConsultarTiempoDisponibleTaller(dctx, this.vista.TallerID, this.vista.SucursalID, this.vista.UnidadOperativaID, fechaInicial, fechaFinal, fecha.Value.DayOfWeek == DayOfWeek.Saturday);

            CitaMantenimientoBR citaMantenimientoBR = new CitaMantenimientoBR();
            var citas = new List <CitaMantenimientoBO>();

            citas.AddRange(citaMantenimientoBR.ConsultarPorRangoFechas(dctx, new CitaMantenimientoBOF()
            {
                FechaInicio = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day),
                FechaFin    = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, 23, 59, 59),
                Estatus     = EEstatusCita.CALENDARIZADA
            }));
            citas.AddRange(citaMantenimientoBR.ConsultarPorRangoFechas(dctx, new CitaMantenimientoBOF()
            {
                FechaInicio = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day),
                FechaFin    = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, 23, 59, 59),
                Estatus     = EEstatusCita.RECALENDARIZADA
            }));
            citas.AddRange(citaMantenimientoBR.ConsultarPorRangoFechas(dctx, new CitaMantenimientoBOF()
            {
                FechaInicio = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day),
                FechaFin    = new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, 23, 59, 59),
                Estatus     = EEstatusCita.INICIADA
            }));

            UnidadBR unidadBR = new UnidadBR();
            ConsultarMantenimientoProgramadoBR mantenimientoProgramadoBR = new ConsultarMantenimientoProgramadoBR();

            decimal tiempoConsumido = 0;

            foreach (var cita in citas.Where(x => (x.MantenimientoProgramado as MantenimientoProgramadoUnidadBO).Unidad.UnidadID != this.vista.UnidadID).ToList())
            {
                var manttoProgramado = mantenimientoProgramadoBR.Consultar(dctx, new MantenimientoProgramadoUnidadBO()
                {
                    MantenimientoProgramadoID = cita.MantenimientoProgramado.MantenimientoProgramadoID
                }).FirstOrDefault();
                (manttoProgramado as MantenimientoProgramadoUnidadBO).Unidad = unidadBR.Consultar(dctx, new Equipos.BO.UnidadBO()
                {
                    EquipoID = (manttoProgramado as MantenimientoProgramadoUnidadBO).EquipoID
                }).FirstOrDefault();
                var equiposAliados = unidadBR.ConsultarEquipoAliado(dctx, (manttoProgramado as MantenimientoProgramadoUnidadBO).Unidad, false);
                List <MantenimientoProgramadoEquipoAliadoBO> manttoEquiposAliados = new List <MantenimientoProgramadoEquipoAliadoBO>();
                foreach (var equipoAliado in equiposAliados)
                {
                    var manttoEA = mantenimientoProgramadoBR.Consultar(dctx, new MantenimientoProgramadoEquipoAliadoBO()
                    {
                        EquipoID = equipoAliado.EquipoID, Activo = true, EstatusMantenimientoProgramado = EEstatusMantenimientoProgramado.PROGRAMADO
                    }).FirstOrDefault();
                    if (manttoEA != null)
                    {
                        manttoEquiposAliados.Add(manttoEA as MantenimientoProgramadoEquipoAliadoBO);
                    }
                }

                var tiempoMantto = this.ObtenerTiempoMantenimiento(manttoProgramado as MantenimientoProgramadoUnidadBO, manttoEquiposAliados);

                tiempoConsumido = tiempoConsumido + tiempoMantto != null ? tiempoMantto.Value : 0;
            }

            BPMO.SDNI.Equipos.BO.UnidadBO unidad;

            if (citas.Any(x => (x.MantenimientoProgramado as MantenimientoProgramadoUnidadBO).Unidad.UnidadID == this.vista.UnidadID))
            {
                var cita = citas.FirstOrDefault(x => (x.MantenimientoProgramado as MantenimientoProgramadoUnidadBO).Unidad.UnidadID == this.vista.UnidadID);
                unidad = (cita.MantenimientoProgramado as MantenimientoProgramadoUnidadBO).Unidad;
            }
            else
            {
                unidad = unidadBR.Consultar(dctx, new BPMO.SDNI.Equipos.BO.UnidadBO()
                {
                    UnidadID = this.vista.UnidadID
                }).FirstOrDefault();
            }

            decimal?tiempo = 0;
            var     configuracionPosicionTrabajo = new ConfiguracionPosicionTrabajoBO()
            {
                ConfiguracionModeloMotorizacion = new ConfiguracionModeloMotorizacionBO()
                {
                    Modelo = unidad.Modelo
                },
                DescriptorTrabajo = new DescriptorTrabajoBO
                {
                    Nombre = tipoMantto.ToString()
                }
            };

            var configPosicion = FacadeBR.ConsultarConfiguracionPosicionTrabajoDetalle(dctx, configuracionPosicionTrabajo);

            configPosicion.ForEach(x => { tiempo = tiempo + x.TiempoSRT; });

            return(tiempo + tiempoConsumido > tiempoPorDia);
        }