-- ============================================================================
-- MIGRACION 007: Crear tabla modelos_planes_pago
-- Fecha: 2026-01-26
-- Descripcion: Tabla para guardar modelos/plantillas de planes de pago
-- ============================================================================
-- IMPORTANTE: Este script es idempotente - puede ejecutarse multiples veces
-- ============================================================================

-- ============================================================================
-- SECCION 0: FUNCION AUXILIAR (si no existe)
-- ============================================================================

CREATE OR REPLACE FUNCTION set_updated_at_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- ============================================================================
-- SECCION 1: CREAR TABLA modelos_planes_pago
-- ============================================================================

CREATE TABLE IF NOT EXISTS modelos_planes_pago (
    -- Identificacion
    id_modelo SERIAL PRIMARY KEY,
    business_id VARCHAR(100) NOT NULL,

    -- Descripcion
    nombre_modelo VARCHAR(100) NOT NULL,
    descripcion TEXT NULL,

    -- Configuracion (JSONB)
    configuracion JSONB NOT NULL DEFAULT '{
        "numero_parcialidades": 12,
        "periodicidad": 4,
        "dia_pago": 15,
        "politica_mora": "mora_siguiente",
        "enganche_tipo": "ninguno",
        "enganche_valor": 0
    }'::jsonb,

    -- Estado y ordenamiento
    es_default BOOLEAN NOT NULL DEFAULT FALSE,
    activo BOOLEAN NOT NULL DEFAULT TRUE,
    orden INTEGER NOT NULL DEFAULT 0,

    -- Sucursal (UNA por modelo)
    sucursal INTEGER NOT NULL,

    -- Auditoria
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    created_by_login_id INTEGER NULL,
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_by_login_id INTEGER NULL,

    -- Soft delete
    soft_delete BOOLEAN NOT NULL DEFAULT FALSE,
    soft_delete_date TIMESTAMPTZ NULL
);

-- ============================================================================
-- SECCION 1.1: INDICES
-- ============================================================================

CREATE INDEX IF NOT EXISTS idx_modelos_pp_business_id
ON modelos_planes_pago USING btree (business_id);

CREATE INDEX IF NOT EXISTS idx_modelos_pp_sucursal
ON modelos_planes_pago USING btree (sucursal);

CREATE INDEX IF NOT EXISTS idx_modelos_pp_activo
ON modelos_planes_pago USING btree (activo)
WHERE soft_delete = FALSE;

CREATE INDEX IF NOT EXISTS idx_modelos_pp_orden
ON modelos_planes_pago USING btree (orden);

-- Indice unico para nombre por negocio+sucursal (solo activos)
CREATE UNIQUE INDEX IF NOT EXISTS idx_modelos_pp_nombre_unico
ON modelos_planes_pago (business_id, sucursal, nombre_modelo)
WHERE soft_delete = FALSE;

-- Indice unico parcial: solo 1 default por sucursal
CREATE UNIQUE INDEX IF NOT EXISTS idx_modelos_pp_default_unico
ON modelos_planes_pago (business_id, sucursal)
WHERE es_default = TRUE AND soft_delete = FALSE;

-- ============================================================================
-- SECCION 1.2: TRIGGER updated_at
-- ============================================================================

DROP TRIGGER IF EXISTS trg_modelos_pp_updated_at ON modelos_planes_pago;

CREATE TRIGGER trg_modelos_pp_updated_at
    BEFORE UPDATE ON modelos_planes_pago
    FOR EACH ROW
    EXECUTE FUNCTION set_updated_at_timestamp();

-- ============================================================================
-- SECCION 1.3: COMENTARIOS
-- ============================================================================

COMMENT ON TABLE modelos_planes_pago IS
'Modelos/plantillas reutilizables para crear planes de pago. Cada modelo pertenece a UNA sucursal.';

COMMENT ON COLUMN modelos_planes_pago.id_modelo IS 'PK autoincremental';
COMMENT ON COLUMN modelos_planes_pago.business_id IS 'ID del negocio (multi-tenancy)';
COMMENT ON COLUMN modelos_planes_pago.nombre_modelo IS 'Nombre del modelo (max 100 chars)';
COMMENT ON COLUMN modelos_planes_pago.descripcion IS 'Descripcion opcional del modelo';
COMMENT ON COLUMN modelos_planes_pago.configuracion IS 'JSONB con: numero_parcialidades(1-36), periodicidad(1-7), dia_pago(1-31), politica_mora, enganche_tipo, enganche_valor';
COMMENT ON COLUMN modelos_planes_pago.es_default IS 'TRUE si es el modelo predeterminado de la sucursal (solo 1 por sucursal)';
COMMENT ON COLUMN modelos_planes_pago.activo IS 'TRUE si el modelo esta disponible para uso';
COMMENT ON COLUMN modelos_planes_pago.orden IS 'Orden de visualizacion (0=primero)';
COMMENT ON COLUMN modelos_planes_pago.sucursal IS 'ID de la sucursal a la que pertenece (INTEGER, no array)';
COMMENT ON COLUMN modelos_planes_pago.created_by_login_id IS 'ID del usuario que creo el modelo';
COMMENT ON COLUMN modelos_planes_pago.updated_by_login_id IS 'ID del ultimo usuario que modifico el modelo';
COMMENT ON COLUMN modelos_planes_pago.soft_delete IS 'TRUE si fue eliminado logicamente';
COMMENT ON COLUMN modelos_planes_pago.soft_delete_date IS 'Fecha de eliminacion logica';

-- ============================================================================
-- FIN DE LA MIGRACION 007
-- ============================================================================
