¿CÓMO CREAR UN DISPARADOR PL/PGSQL PARA GESTIONAR OPERACIONES DE ODOO 19?
PostgreSQL es importante para el rendimiento, la coherencia transaccional y la integridad de los datos de Odoo 19. Si bien la mayoría de los requisitos de lógica empresarial los cumple el ORM de Odoo, la automatización a nivel de base de datos es necesaria en algunas situaciones del mundo real, en particular cuando se manejan procesos masivos, integraciones o flujos de trabajo que son críticos para el rendimiento. Los disparadores (triggers) PL/pgSQL son útiles en esta situación.
Puede utilizar disparadores PL/pgSQL para ejecutar automáticamente una lógica personalizada en respuesta a eventos de la base de datos como acciones INSERT, UPDATE o DELETE. Pueden manejar lógica complicada que de otro modo necesitaría código repetitivo a nivel de aplicación, auditar cambios, sincronizar tablas relacionadas y ayudar a hacer cumplir las reglas de datos cuando se usan adecuadamente. Los disparadores son muy útiles para mejorar los informes, integrar sistemas heredados y proteger datos operativos y contables importantes en los proyectos Odoo 19.
En este blog veremos cómo crear y utilizar disparadores PL/pgSQL para administrar de manera eficiente las actividades de Odoo 19. Descubrirás cuándo tienen sentido y cómo funcionan con el ORM de Odoo, y las mejores formas de mantener su implementación eficiente.
Ejemplo Práctico: Auditoría de cambios de correo electrónico
Las direcciones de correo electrónico en Contactos son esenciales para la facturación, las alertas y el acceso al portal en Odoo 19. Este ejemplo mantiene la lógica del disparador simple y segura al registrar cambios justo cuando se modifica el campo email de un partner.
Paso 1: Crear una tabla de registro (Log) Esta tabla se utiliza para realizar un seguimiento de las actualizaciones de correo electrónico realizadas a los registros de clientes o proveedores en Odoo.
SQL
CREATE TABLE partner_email_change_log (
id SERIAL PRIMARY KEY,
partner_id INTEGER,
old_email VARCHAR,
new_email VARCHAR,
changed_on TIMESTAMP DEFAULT now()
);
Cuando se modifica el correo electrónico de un socio, la tabla guardará el ID del socio, el correo electrónico anterior, el nuevo correo electrónico y el momento exacto en que se produjo el cambio.
Paso 2: Crear la función del disparador Esta función se llamará automáticamente cada vez que se actualice un registro y verificará si la dirección de correo electrónico ha cambiado.
SQL
CREATE OR REPLACE FUNCTION log_partner_email_change()
RETURNS TRIGGER AS $$
BEGIN
-- Registrar solo si cambia el valor del correo electrónico
IF NEW.email IS DISTINCT FROM OLD.email THEN
INSERT INTO partner_email_change_log (
partner_id,
old_email,
new_email
)
VALUES (
NEW.id,
OLD.email,
NEW.email
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Si se identifica un cambio (NEW.email es distinto de OLD.email), la función registra los datos en la tabla de auditoría, permitiendo que la actualización original de Odoo continúe normalmente.
Paso 3: Conectar el disparador a res_partner Este paso agrega el disparador a la tabla res_partner (el modelo de Contactos), haciendo que se ejecute automáticamente después de cada actualización.
SQL
CREATE TRIGGER trg_partner_email_change AFTER UPDATE ON res_partner FOR EACH ROW EXECUTE FUNCTION log_partner_email_change();
Cuando se edita un registro de socio desde la interfaz de Odoo, el disparador ejecuta la función en segundo plano sin interferir con la experiencia del usuario.
Consulta de Verificación Una vez implementado el disparador, cualquier cambio realizado desde la interfaz o mediante importaciones masivas quedará registrado. Para examinar el historial de cambios, puede ejecutar la siguiente consulta SQL directamente en la base de datos para ver el nombre del contacto, los correos antiguos y nuevos, y la fecha del cambio:
SQL
SELECT
p.name,
l.old_email,
l.new_email,
l.changed_on
FROM partner_email_change_log l
JOIN res_partner p ON p.id = l.partner_id
ORDER BY l.changed_on DESC;
Conclusión
Al trabajar con Odoo 19, los disparadores PL/pgSQL pueden ser una herramienta útil, especialmente para tareas como auditoría, coherencia de datos o comprobaciones de seguridad que requieren control estricto a nivel de base de datos. Incluso un disparador básico puede monitorear automáticamente los cambios sin tocar el código Python del núcleo, garantizando integridad independientemente de cómo se accedan a los datos.