Agrego carpeta del source sql de la Base de Datos

This commit is contained in:
Pablo
2026-08-22 19:10:49 -03:00
parent 11e36bd6c2
commit 88d724fbcf
94 changed files with 7820 additions and 0 deletions
@@ -0,0 +1,89 @@
-- ============================================================================
-- internal.cerrar_actividad
-- ============================================================================
-- PROPÓSITO
-- Trigger function: cuando una actividad pasa de activo=true a activo=false,
-- limpia el estado derivado: rescata reservas vivas como reservas huérfanas,
-- borra los turnos futuros y cierra las plantillas horarias asociadas.
--
-- El trigger que la invoca (trg_desactivar_actividad, AFTER UPDATE OF activo
-- ON actividades, WHEN OLD.activo = TRUE AND NEW.activo = FALSE) NO se
-- versiona en este archivo. Vive como parte del DDL (por ahora en
-- shift_functions/utility_functions.sql).
--
-- PARÁMETROS
-- Implícitos del trigger (OLD.id, OLD.nombre, NEW).
--
-- AUTORIZACIÓN
-- No aplica (trigger function).
--
-- ERRORES (RAISE EXCEPTION)
-- Ninguno propio.
--
-- RETORNA
-- trigger (la fila NEW).
--
-- EFECTOS SECUNDARIOS
-- - INSERT en reservas_huerfanas para cada reserva activa sobre un turno
-- futuro de la actividad desactivada.
-- - DELETE de turnos futuros de la actividad.
-- - DELETE de plantillas horarias (horario_actividad) cuya vigencia
-- empieza hoy o en el futuro.
-- - UPDATE de plantillas horarias vigentes: cierra su vigencia ayer
-- (valido_hasta = CURRENT_DATE - 1).
-- - Las plantillas históricas (ya vencidas) no se tocan.
-- ============================================================================
CREATE OR REPLACE FUNCTION internal.cerrar_actividad()
RETURNS TRIGGER
LANGUAGE plpgsql
SET search_path = public
SET timezone = 'America/Argentina/Buenos_Aires'
AS $$
BEGIN
-- El trigger se filtra con WHEN, así que cuando entra acá ya sabemos que
-- la actividad pasó de activo=true a activo=false.
------------------------------------------------------------
-- 1. Rescatar reservas activas sobre turnos futuros
------------------------------------------------------------
INSERT INTO reservas_huerfanas
(cliente_id, actividad_nombre, fecha_original, hora_inicio_original)
SELECT r.cliente_id, OLD.nombre, t.fecha, t.hora_inicio
FROM reservas r
JOIN turnos t ON r.turno_id = t.id
WHERE t.actividad_id = OLD.id
AND t.fecha >= CURRENT_DATE
AND r.cancelada = false;
------------------------------------------------------------
-- 2. Borrar turnos futuros (los pasados quedan para histórico/reportes)
------------------------------------------------------------
DELETE FROM turnos
WHERE actividad_id = OLD.id
AND fecha >= CURRENT_DATE;
------------------------------------------------------------
-- 3. Limpiar plantillas según su posición temporal
------------------------------------------------------------
-- 3.A Plantillas que empiezan hoy o en el futuro: borrarlas.
-- Si la cerráramos en CURRENT_DATE-1 quedaría un intervalo vacío
-- o invertido (valido_desde > valido_hasta).
DELETE FROM horario_actividad
WHERE actividad_id = OLD.id
AND valido_desde >= CURRENT_DATE;
-- 3.B Plantillas que ya están rigiendo (valido_desde en el pasado y
-- vigencia abierta o futura): cerrarlas en CURRENT_DATE - 1.
UPDATE horario_actividad
SET valido_hasta = CURRENT_DATE - 1
WHERE actividad_id = OLD.id
AND valido_desde < CURRENT_DATE
AND (valido_hasta IS NULL OR valido_hasta >= CURRENT_DATE);
-- 3.C Plantillas históricas (valido_hasta < CURRENT_DATE): NO se tocan.
RETURN NEW;
END;
$$;