48 lines
1.6 KiB
PL/PgSQL
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();
|