Merge branch 'main' into issue/225-mejoras-en-el-diseo

This commit is contained in:
2026-03-27 11:13:20 -06:00
4 changed files with 288 additions and 14 deletions
+46
View File
@@ -591,3 +591,49 @@ export async function bibliografia_delete(id: string) {
if (error) throw error
return id
}
export async function checkPrerrequisitoConflicts(
asignaturaId: string,
nuevoCiclo: number,
): Promise<Array<string>> {
const supabase = supabaseBrowser()
// CORRECCIÓN 1: Agregamos 'id' al select
// CORRECCIÓN 2: Quitamos espacios en el .or()
const { data, error } = await supabase
.from('asignaturas')
.select('id, nombre, numero_ciclo, prerrequisito_asignatura_id')
.or(`prerrequisito_asignatura_id.eq.${asignaturaId},id.eq.${asignaturaId}`)
if (error) throw error
// CORRECCIÓN 3: 'data' ahora está disponible porque lo desestructuramos arriba
if (!data) return []
const conflictos: Array<string> = []
data.forEach((asig) => {
// Caso 1: Materias que tienen a esta como prerrequisito (Hijas)
// "Si yo me muevo al ciclo 5, y mi hija está en el 4, se rompe la regla"
if (asig.prerrequisito_asignatura_id === asignaturaId) {
if (asig.numero_ciclo !== null && asig.numero_ciclo <= nuevoCiclo) {
conflictos.push(asig.nombre)
}
}
// Caso 2: El prerrequisito de la materia que estoy moviendo (Padre)
// "Si yo me muevo al ciclo 2, y mi padre está en el 3, se rompe la regla"
if (asig.id === asignaturaId && asig.prerrequisito_asignatura_id) {
const padre = data.find((p) => p.id === asig.prerrequisito_asignatura_id)
if (
padre &&
padre.numero_ciclo !== null &&
padre.numero_ciclo >= nuevoCiclo
) {
conflictos.push(padre.nombre)
}
}
})
return conflictos
}
+33
View File
@@ -1,4 +1,5 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { useState } from 'react'
import {
ai_generate_subject,
@@ -6,6 +7,7 @@ import {
bibliografia_delete,
bibliografia_insert,
bibliografia_update,
checkPrerrequisitoConflicts,
lineas_insert,
lineas_update,
subjects_bibliografia_list,
@@ -317,3 +319,34 @@ export function useDeleteBibliografia(asignaturaId: string) {
},
})
}
export function useAsignaturaConflictos() {
const [isValidating, setIsValidating] = useState(false)
const validarCambioCiclo = async (
asignaturaId: string,
nuevoCiclo: number,
) => {
setIsValidating(true)
try {
const nombresConflictivos = await checkPrerrequisitoConflicts(
asignaturaId,
nuevoCiclo,
)
if (nombresConflictivos.length > 0) {
const mensaje = `Si mueves esta materia al ciclo ${nuevoCiclo}, se perderá la seriación con:\n\n• ${nombresConflictivos.join('\n• ')}\n\n¿Deseas continuar?`
return confirm(mensaje) // Puedes usar un Modal de Shadcn aquí en lugar de confirm
}
return true // Sin conflictos
} catch (error) {
console.error(error)
return false
} finally {
setIsValidating(false)
}
}
return { validarCambioCiclo, isValidating }
}