Files
RS_System/RS_system/sql_colaboraciones.sql
2026-02-01 14:28:17 -06:00

104 lines
4.8 KiB
SQL

-- =============================================
-- Script SQL: Módulo de Colaboraciones Económicas
-- Descripción: Crea las tablas para gestionar colaboraciones mensuales
-- Autor: Sistema
-- Fecha: 2026-02-01
-- =============================================
-- Tabla 1: Tipos de Colaboración (configurable)
CREATE TABLE IF NOT EXISTS public.tipos_colaboracion
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
nombre character varying(100) COLLATE pg_catalog."default" NOT NULL,
descripcion text COLLATE pg_catalog."default",
monto_sugerido decimal(10, 2) NOT NULL DEFAULT 0,
activo boolean NOT NULL DEFAULT true,
orden integer NOT NULL DEFAULT 0,
creado_en timestamp with time zone NOT NULL DEFAULT now(),
actualizado_en timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT pk_tipos_colaboracion PRIMARY KEY (id)
);
COMMENT ON TABLE public.tipos_colaboracion IS 'Catálogo de tipos de colaboración (Transporte, Limpieza, etc.)';
COMMENT ON COLUMN public.tipos_colaboracion.nombre IS 'Nombre del tipo de colaboración';
COMMENT ON COLUMN public.tipos_colaboracion.monto_sugerido IS 'Cuota sugerida mensual';
COMMENT ON COLUMN public.tipos_colaboracion.orden IS 'Orden de presentación en UI';
-- Datos iniciales
INSERT INTO public.tipos_colaboracion (nombre, descripcion, monto_sugerido, orden)
VALUES
('Transporte', 'Colaboración mensual para transporte', 1.00, 1),
('Limpieza', 'Colaboración mensual para limpieza', 1.00, 2)
ON CONFLICT DO NOTHING;
-- =============================================
-- Tabla 2: Colaboraciones (cabecera de transacción)
CREATE TABLE IF NOT EXISTS public.colaboraciones
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
miembro_id bigint NOT NULL,
fecha_registro timestamp with time zone NOT NULL DEFAULT now(),
monto_total decimal(10, 2) NOT NULL,
observaciones text COLLATE pg_catalog."default",
registrado_por character varying(100) COLLATE pg_catalog."default",
creado_en timestamp with time zone NOT NULL DEFAULT now(),
actualizado_en timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT pk_colaboraciones PRIMARY KEY (id),
CONSTRAINT fk_colaboraciones_miembro FOREIGN KEY (miembro_id)
REFERENCES public.miembros (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE RESTRICT
);
COMMENT ON TABLE public.colaboraciones IS 'Registro de transacciones de colaboración';
COMMENT ON COLUMN public.colaboraciones.miembro_id IS 'Miembro que realizó el pago';
COMMENT ON COLUMN public.colaboraciones.monto_total IS 'Monto total de la transacción';
COMMENT ON COLUMN public.colaboraciones.registrado_por IS 'Usuario que registró el pago';
-- Índices para optimizar búsquedas
CREATE INDEX IF NOT EXISTS idx_colaboraciones_miembro ON public.colaboraciones(miembro_id);
CREATE INDEX IF NOT EXISTS idx_colaboraciones_fecha ON public.colaboraciones(fecha_registro);
-- =============================================
-- Tabla 3: Detalle de Colaboraciones (desglose mensual)
CREATE TABLE IF NOT EXISTS public.detalle_colaboraciones
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
colaboracion_id bigint NOT NULL,
tipo_colaboracion_id bigint NOT NULL,
mes integer NOT NULL,
anio integer NOT NULL,
monto decimal(10, 2) NOT NULL,
creado_en timestamp with time zone NOT NULL DEFAULT now(),
CONSTRAINT pk_detalle_colaboraciones PRIMARY KEY (id),
CONSTRAINT fk_detalle_colaboracion FOREIGN KEY (colaboracion_id)
REFERENCES public.colaboraciones (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE,
CONSTRAINT fk_detalle_tipo FOREIGN KEY (tipo_colaboracion_id)
REFERENCES public.tipos_colaboracion (id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE RESTRICT,
CONSTRAINT chk_mes_valido CHECK (mes >= 1 AND mes <= 12),
CONSTRAINT chk_anio_valido CHECK (anio >= 2000 AND anio <= 2100)
);
COMMENT ON TABLE public.detalle_colaboraciones IS 'Desglose mensual de cada colaboración';
COMMENT ON COLUMN public.detalle_colaboraciones.mes IS 'Mes cubierto (1-12)';
COMMENT ON COLUMN public.detalle_colaboraciones.anio IS 'Año cubierto';
COMMENT ON COLUMN public.detalle_colaboraciones.monto IS 'Monto para este mes/tipo específico';
-- Índices para reportes y búsquedas
CREATE INDEX IF NOT EXISTS idx_detalle_tipo ON public.detalle_colaboraciones(tipo_colaboracion_id);
CREATE INDEX IF NOT EXISTS idx_detalle_periodo ON public.detalle_colaboraciones(anio, mes);
-- Índice único para evitar duplicados (mismo mes/año/tipo en misma colaboración)
CREATE UNIQUE INDEX IF NOT EXISTS idx_detalle_unico
ON public.detalle_colaboraciones(colaboracion_id, tipo_colaboracion_id, mes, anio);
-- =============================================
-- FIN DEL SCRIPT
-- =============================================