コード例 #1
0
        public void ProbarAsignacionSolapadaFin()
        {
            AsignacionFormulariosController controller = new AsignacionFormulariosController();

            DateTime inicio = DateTime.ParseExact("10/06/2019", "dd/MM/yyyy", CultureInfo.InvariantCulture);
            DateTime fin    = DateTime.ParseExact("15/06/2019", "dd/MM/yyyy", CultureInfo.InvariantCulture);

            FechasSolapadasInfo fechas = controller.VerificarFechasSolapadas("00000001", 2019, 2, 1, inicio, fin);

            Assert.IsNotNull(fechas.FechaFinNueva);
        }
        public JsonResult Asignar(string codigoFormulario, string codigoUASeleccionada, string codigoCarreraEnfasisSeleccionada, string grupoSeleccionado, string correoProfesorSeleccionado, string fechaInicioSeleccionado, string fechaFinSeleccionado, bool extenderPeriodo, bool enviarCorreos)
        {
            if (!permissionManager.IsAuthorized(Permission.CREAR_FORMULARIO))
            {
                TempData["alertmessage"] = "No tiene permisos para acceder a esta página.";
                return(Json(new { error = false, tipoError = 5 }));
            }
            // Parámetros que se enviaran al procedimiento almacenado
            string              codigoCarrera   = null;
            string              codigoEnfasis   = null;
            string              siglaCursoGrupo = null;
            Nullable <byte>     numeroGrupo     = null;
            Nullable <byte>     semestreGrupo   = null;
            Nullable <int>      anno            = null;
            Nullable <DateTime> fechaInicio     = null;
            Nullable <DateTime> fechaFin        = null;

            // Sino se seleccionan datos, existe un error
            if (codigoUASeleccionada == "null" && codigoCarreraEnfasisSeleccionada == "null" && grupoSeleccionado == "null" && correoProfesorSeleccionado == "null" || (String.IsNullOrEmpty(fechaInicioSeleccionado) && String.IsNullOrEmpty(fechaFinSeleccionado)))
            {
                return(Json(new { error = false, tipoError = 1 }));
            }

            if (fechaInicioSeleccionado.Length > 0 && fechaFinSeleccionado.Length > 0)
            {
                fechaInicio = DateTime.ParseExact(fechaInicioSeleccionado, "yyyy-mm-dd", CultureInfo.InvariantCulture);
                fechaFin    = DateTime.ParseExact(fechaFinSeleccionado, "yyyy-mm-dd", CultureInfo.InvariantCulture);
            }
            else
            {
                return(Json(new { error = false, tipoError = 2 }));
            }

            if (DateTime.Compare((DateTime)fechaInicio, (DateTime)fechaFin) > 0)
            {
                return(Json(new { error = false, tipoError = 3 }));
            }

            // Parsea los strings
            DividirCarreraEnfasis(ref codigoCarreraEnfasisSeleccionada, ref codigoCarrera, ref codigoEnfasis);
            DividirGrupo(ref grupoSeleccionado, ref siglaCursoGrupo, ref numeroGrupo, ref semestreGrupo, ref anno);
            // Conviertes las cadenas "null" en nul
            convertNullStringToNull(ref correoProfesorSeleccionado);
            convertNullStringToNull(ref codigoUASeleccionada);

            // Hace el llamado al procedimiento almacenado que devuelve una tabla con todos los grupos necesarios
            var grupos = db.ObtenerGruposAsociados(codigoUASeleccionada, codigoCarrera, codigoEnfasis, siglaCursoGrupo, numeroGrupo, semestreGrupo, anno, correoProfesorSeleccionado);
            List <ObtenerGruposAsociados_Result> gruposAsociadosLista = null;

            // Se convierte la tabla a lista
            try
            {
                gruposAsociadosLista = grupos.ToList();
                // Si no existen grupos asociados, pues no se pudo asignar
                if (gruposAsociadosLista.Count <= 0)
                {
                    return(Json(new { error = false, tipoError = 4 }));
                }
            }
            catch
            {
                return(Json(new { error = false, tipoError = 4 }));
            }

            List <FechasSolapadasInfo> fechasJson = new List <FechasSolapadasInfo>();
            bool haySolapamiento = false;

            foreach (var grupo in grupos)
            {
                FechasSolapadasInfo fechas = VerificarFechasSolapadas(codigoFormulario,
                                                                      grupo.Anno,
                                                                      grupo.Semestre,
                                                                      grupo.NumGrupo,
                                                                      (DateTime)fechaInicio,
                                                                      (DateTime)fechaFin);

                // Si no se solapa, el metodo devuelve null
                if (fechas != null)
                {
                    fechas.PeriodoOriginal.FCodigo   = codigoFormulario;
                    fechas.PeriodoOriginal.CSigla    = grupo.SiglaCurso;
                    fechas.PeriodoOriginal.GAnno     = grupo.Anno;
                    fechas.PeriodoOriginal.GSemestre = grupo.Semestre;
                    fechas.PeriodoOriginal.GNumero   = grupo.NumGrupo;

                    // Si las fechas son diferentes, es porque alguna se solapa.
                    if (fechas.FechaInicioNueva != null || fechas.FechaFinNueva != null)
                    {
                        fechasJson.Add(fechas);
                        haySolapamiento = true;
                    }
                }
            }

            string originalInicio = FormularioAsignado.FormatearFecha((DateTime)fechaInicio);
            string originalFin    = FormularioAsignado.FormatearFecha((DateTime)fechaFin);

            if (haySolapamiento && !extenderPeriodo)
            {
                originalInicio = FormularioAsignado.FormatearFecha(fechasJson.FirstOrDefault().PeriodoOriginal.FechaInicio);
                originalFin    = FormularioAsignado.FormatearFecha(fechasJson.FirstOrDefault().PeriodoOriginal.FechaFin);

                return(Json(new { error = false, tipoError = 6, inicio = originalInicio, fin = originalFin }));
            }

            // Itera por los grupos obtenidos, asignandoles el formulario
            for (int index = 0; index < gruposAsociadosLista.Count; ++index)
            {
                var grupoActual = gruposAsociadosLista[index];
                // Procedimiento que almacena en las relaciones Activa_Por, Activa_Por_Periodo
                db.AsignarFormulario(codigoFormulario, grupoActual.SiglaCurso, grupoActual.NumGrupo, grupoActual.Anno, grupoActual.Semestre, fechaInicio, fechaFin);
            }

            if (haySolapamiento)
            {
                FechasSolapadasInfo fecha = fechasJson.FirstOrDefault();
                if (fecha.FechaInicioNueva != null)
                {
                    originalInicio = FormularioAsignado.FormatearFecha((DateTime)fechaInicio);
                }
                else
                {
                    originalInicio = FormularioAsignado.FormatearFecha(fecha.PeriodoOriginal.FechaInicio);
                }

                if (fecha.FechaFinNueva != null)
                {
                    originalFin = FormularioAsignado.FormatearFecha((DateTime)fechaFin);
                }
                else
                {
                    originalFin = FormularioAsignado.FormatearFecha(fecha.PeriodoOriginal.FechaFin);
                }
            }

            if (enviarCorreos)
            {
                var estudiantes = db.ObtenerEstudiantesAsociados(codigoUASeleccionada, codigoCarrera, codigoEnfasis, siglaCursoGrupo, numeroGrupo, semestreGrupo, anno, correoProfesorSeleccionado);
                List <ObtenerEstudiantesAsociados_Result> estudiantesAsociadosLista = null;
                // Se convierte la tabla a lista
                try
                {
                    estudiantesAsociadosLista = estudiantes.ToList();
                    // Si no existen grupos asociados, pues no se pudo asignar
                    if (estudiantesAsociadosLista.Count <= 0)
                    {
                        return(Json(new { error = false, tipoError = 4 }));
                    }
                }
                catch
                {
                    return(Json(new { error = false, tipoError = 4 }));
                }

                EnviarCorreoSobreAsignaciónCuestionario(estudiantesAsociadosLista, db.Formulario.Find(codigoFormulario));
            }

            return(Json(new { error = true, inicio = originalInicio, fin = originalFin }));
        }
        public FechasSolapadasInfo VerificarFechasSolapadas(string FCodigo,
                                                            int GAnno,
                                                            byte GSemestre,
                                                            byte GNumero,
                                                            DateTime fechaInicio,
                                                            DateTime fechaFin)
        {
            // Verificar si se solapa la fecha de inicio del form
            var inicioSolapada = from p in db.Periodo_activa_por
                                 where p.FCodigo == FCodigo &&
                                 p.GAnno == GAnno &&
                                 p.GSemestre == GSemestre &&
                                 p.GNumero == GNumero &&
                                 (fechaInicio <= p.FechaInicio && p.FechaInicio <= fechaFin)
                                 select p.FechaInicio;

            // Verificar si se solapa la fecha de fin del form
            var finSolapada = from p in db.Periodo_activa_por
                              where p.FCodigo == FCodigo &&
                              p.GAnno == GAnno &&
                              p.GSemestre == GSemestre &&
                              p.GNumero == GNumero &&
                              (fechaInicio <= p.FechaFin && p.FechaFin <= fechaFin)
                              select p.FechaFin;


            FechasSolapadasInfo fechas   = new FechasSolapadasInfo();
            Periodo_activa_por  original = new Periodo_activa_por();

            if (!inicioSolapada.Any() && !finSolapada.Any())
            {
                return(null);
            }

            // Si la fecha se solapa
            if (inicioSolapada.Any())
            {
                // Guardo la original
                original.FechaInicio = inicioSolapada.FirstOrDefault();
                // Guardo la nueva
                fechas.FechaInicioNueva = fechaInicio;

                if (!finSolapada.Any())
                {
                    original.FechaFin = (from p in db.Periodo_activa_por
                                         where p.FCodigo == FCodigo &&
                                         p.GAnno == GAnno &&
                                         p.GSemestre == GSemestre &&
                                         p.GNumero == GNumero &&
                                         p.FechaInicio == original.FechaInicio
                                         select p.FechaFin).FirstOrDefault();
                }
            }

            // Si la fecha se solapa
            if (finSolapada.Any())
            {
                // Guardo la original
                original.FechaFin = finSolapada.FirstOrDefault();
                // Guardo la nueva
                fechas.FechaFinNueva = fechaFin;

                if (!inicioSolapada.Any())
                {
                    original.FechaInicio = (from p in db.Periodo_activa_por
                                            where p.FCodigo == FCodigo &&
                                            p.GAnno == GAnno &&
                                            p.GSemestre == GSemestre &&
                                            p.GNumero == GNumero &&
                                            p.FechaFin == original.FechaFin
                                            select p.FechaInicio).FirstOrDefault();
                }
            }

            fechas.PeriodoOriginal = original;

            return(fechas);
        }