Agrego carpeta del source sql de la Base de Datos
This commit is contained in:
@@ -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;
|
||||
$$;
|
||||
Reference in New Issue
Block a user