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); }