104 lines
4.8 KiB
SQL
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
|
|
-- =============================================
|