trading-platform-database/ddl/schemas/education/functions/04-generate_certificate.sql

48 lines
1.6 KiB
PL/PgSQL

-- =====================================================
-- FUNCTION: education.generate_certificate_number()
-- =====================================================
-- Proyecto: OrbiQuant IA (Trading Platform)
-- Módulo: OQI-002 - Education
-- Especificación: ET-EDU-001-database.md
-- Descripción: Genera automáticamente el número de certificado y código de verificación
-- =====================================================
CREATE OR REPLACE FUNCTION education.generate_certificate_number()
RETURNS TRIGGER AS $$
DECLARE
v_year INTEGER;
v_sequence INTEGER;
BEGIN
v_year := EXTRACT(YEAR FROM NOW());
-- Obtener siguiente número de secuencia para el año
SELECT COALESCE(MAX(
CAST(SUBSTRING(certificate_number FROM 14) AS INTEGER)
), 0) + 1
INTO v_sequence
FROM education.certificates
WHERE certificate_number LIKE 'OQI-CERT-' || v_year || '-%';
-- Generar número de certificado: OQI-CERT-2025-00001
NEW.certificate_number := FORMAT('OQI-CERT-%s-%s',
v_year,
LPAD(v_sequence::TEXT, 5, '0')
);
-- Generar código de verificación único
NEW.verification_code := UPPER(
SUBSTRING(MD5(RANDOM()::TEXT || NOW()::TEXT) FROM 1 FOR 16)
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
COMMENT ON FUNCTION education.generate_certificate_number() IS 'Genera número de certificado y código de verificación automáticamente';
-- Trigger para generar número de certificado
CREATE TRIGGER generate_certificate_number_trigger
BEFORE INSERT ON education.certificates
FOR EACH ROW
EXECUTE FUNCTION education.generate_certificate_number();