diff --git a/supabase/migrations/20260317202431_rules_criterios_evaluacion.sql b/supabase/migrations/20260317202431_rules_criterios_evaluacion.sql new file mode 100644 index 0000000..2205e65 --- /dev/null +++ b/supabase/migrations/20260317202431_rules_criterios_evaluacion.sql @@ -0,0 +1,77 @@ +alter table "public"."asignaturas" add constraint "asignaturas_criterios_porcentaje_max_100" CHECK ((public.suma_porcentajes(criterios_de_evaluacion) <= (100)::numeric)) not valid; + +alter table "public"."asignaturas" validate constraint "asignaturas_criterios_porcentaje_max_100"; + +set check_function_bodies = off; + +CREATE OR REPLACE FUNCTION public.suma_porcentajes(jsonb) + RETURNS numeric + LANGUAGE plpgsql + IMMUTABLE +AS $function$ +declare + total numeric; +begin + select coalesce(sum((elem->>'porcentaje')::numeric),0) + into total + from jsonb_array_elements($1) elem; + + return total; +end; +$function$ +; + +CREATE OR REPLACE FUNCTION public.validar_prerrequisito_asignatura() + RETURNS trigger + LANGUAGE plpgsql +AS $function$ +declare + v_plan uuid; + v_ciclo integer; +begin + + if new.prerrequisito_asignatura_id is null then + return new; + end if; + + select + plan_estudio_id, + numero_ciclo + into + v_plan, + v_ciclo + from public.asignaturas + where id = new.prerrequisito_asignatura_id; + + if not found then + raise exception + 'La asignatura prerrequisito no existe'; + end if; + + if v_plan <> new.plan_estudio_id then + raise exception + 'El prerrequisito debe pertenecer al mismo plan de estudio'; + end if; + + if new.numero_ciclo is null then + raise exception + 'La asignatura debe tener numero_ciclo definido'; + end if; + + if v_ciclo is null then + raise exception + 'El prerrequisito debe tener numero_ciclo definido'; + end if; + + if v_ciclo >= new.numero_ciclo then + raise exception + 'El prerrequisito debe pertenecer a un ciclo menor'; + end if; + + return new; + +end; +$function$ +; + +