Backend EDI base.
Proporciona los siguientes modelos:
- EDI Backend, para centralizar la configuración
- EDI Backend Type, para clasificar los backends EDI (ej: UBL, GS1, e-invoice, pick-yours)
- EDI Exchange Type, para definir los tipos de archivo de intercambio
- EDI Exchange Record, para definir un registro intercambiado entre sistemas
También define un mixin que deben heredar los registros que generarán EDIs.
Además, el módulo incluye un mecanismo edi.configuration que permite a los usuarios reaccionar a eventos EDI de forma declarativa, escribiendo pequeños fragmentos de Python asociados a desencadenantes de eventos. Esto puede usarse como una alternativa ligera a los listeners de eventos de componentes: las configuraciones pueden reaccionar globalmente (en cualquier intercambio) o estar limitadas a un partner específico (o cualquier registro relacionado), tipo de intercambio, backend y modelo destino. Consulte CONFIGURE.md para más detalles.
Traducción automática al español (DeepSeek) de la descripción original de OCA, que está en inglés.
auto_awesome Qué hace este módulo
Generado por IA a partir del código · Odoo 19.0Este módulo proporciona la base para intercambiar documentos electrónicos (EDI) con sistemas externos: permite configurar backends, tipos de intercambio y registros de intercambio, y automatizar la generación, el envío, la recepción y el procesamiento de archivos.
Este módulo es la base técnica para el intercambio electrónico de datos en Odoo. No crea documentos de negocio por sí mismo; en su lugar, proporciona las pantallas y las reglas para configurar cómo se intercambian los archivos con sistemas externos.
Lo que los usuarios pueden configurar: - EDI Backends: cada backend representa una conexión/canal, clasificado por un Backend Type (por ejemplo, UBL, GS1 o e-invoice). Un backend puede pertenecer a una compañía y puede archivar o eliminar automáticamente los registros de intercambio antiguos después de un número de días. - Exchange Types: definen el tipo de archivo intercambiado, su dirección (entrante o saliente), el patrón y la extensión del nombre de archivo, si el archivo se genera automáticamente y qué modelos handler realizan cada paso (generate, send, receive, process, check). - Exchange Records: los archivos reales intercambiados, vinculados a un registro de negocio, con un estado, un mensaje de error y un traceback cuando algo falla.
Comportamiento automático: - Los trabajos programados buscan registros salientes que aún necesitan un archivo y los generan/envían, y buscan registros entrantes para recibirlos y procesarlos. - Otros trabajos programados archivan y eliminan los registros de intercambio antiguos según la configuración del backend. - Los errores se registran en el registro de intercambio y pueden desencadenar notificaciones.
Dónde aparece: - Menús y vistas para backends, backend types, exchange types, exchange records y configuraciones. - Se añade un bloque reutilizable de botones a los formularios de los modelos que admiten EDI, para que los usuarios puedan crear un registro de intercambio desde un documento. - Un asistente permite a los usuarios crear un registro de intercambio manualmente cuando no hay ningún backend preconfigurado.
También añade un mecanismo de configuración en el que pequeños fragmentos de código reaccionan a eventos EDI, de forma global o con alcance a un partner, exchange type, backend o modelo, además de disparadores horarios y diarios.
Depende de
Lo necesitan otros módulos
Menús que añade
Modelos y campos (20)
- ir.model · amplía un modelo existenteis_edi_sender, is_edi_checker, is_edi_receiver, is_edi_generator, is_edi_processor, is_edi_input_validator, is_edi_output_validator
- edi.backend · modelo nuevoname, active, company_id (Company), backend_type_id (EDI Backend type), backend_type_code, output_sent_processed_auto, auto_delete_records_after_days (Auto-delete archived records after (days)), auto_archive_records_after_days (Auto-archive records after (days))
- edi.id.mixin · modelo nuevoedi_id (EDI ID)
- edi.backend.type · modelo nuevocode, name
- edi.configuration · modelo nuevoname, active, trigger, type_id (Exchange Type), model_id (Model), is_global (Global Configuration), backend_id, model_name (Model tech name), snippet_do, trigger_id, description, snippet_before_do
- edi.exchange.type · modelo nuevocode, name, active, encoding, rule_ids, direction, backend_id (Backend), quick_exec (Quick execution), ack_type_id (Ack exchange type), partner_ids (Enabled for partners), send_model_id (Sender), check_model_id (Checker), backend_type_id (Backend type), ack_for_type_ids (Ack for exchange type), process_model_id (Processor), receive_model_id (Receiver), exchange_file_ext, generate_model_id (Generator), exchange_record_ids, exchange_record_count (# Exchange Records), advanced_settings_edit (Advanced YAML settings), input_validate_model_id (Input Validator), output_validate_model_id (Output Validator), encoding_in_error_handler (Decoding Error Handler), exchange_filename_pattern, encoding_out_error_handler (Encoding Error Handler), exchange_file_auto_generate, allow_empty_files_on_receive (Allow Empty Files), exchange_filename_sequence_id
- edi.exchange.record · modelo nuevomodel, active, res_id (Record), type_id (Exchange type), direction, parent_id, retryable, backend_id, company_id (Company), identifier, ack_expected, exchanged_on, related_name, exchange_file, exchange_error (Exchange error), ack_exchange_id (ACK exchange), ack_received_on (ACK received on), exchange_filename, edi_exchange_state (Exchange state), related_record_ids (Related records), external_identifier, exchange_file_frozen, related_exchange_ids (Related exchanges), exchange_filechecksum, related_record_exists, exchange_error_traceback (Exchange error traceback)
- edi.oca.handler.noop · modelo nuevo
- edi.oca.handler.send · modelo nuevo
- edi.oca.handler.check · modelo nuevo
- edi.exchange.type.rule · modelo nuevokind, name, model (Model code), active, type_id, model_id, enable_domain (Enable on domain), enable_snippet (Enable on snippet), form_btn_label (Form button label), form_btn_tooltip (Form button tooltip)
- edi.oca.handler.process · modelo nuevo
- edi.oca.handler.receive · modelo nuevo
- edi.oca.handler.generate · modelo nuevo
- edi.configuration.trigger · modelo nuevocode, name, active, model_id, description
- edi.exchange.consumer.mixin · modelo nuevoedi_disable_auto (Disable auto), edi_has_form_config, exchange_record_ids, exchange_record_count, origin_exchange_type_id (EDI origin exchange type), origin_exchange_record_id (EDI origin record), exchange_related_record_ids
- edi.exchange.related.record · modelo nuevomodel, res_id (Record), exchange_record_id
- edi.exchange.record.create.wiz · modelo nuevomodel, res_id, backend_id, backend_type_id, exchange_type_id
- edi.oca.handler.input.validate · modelo nuevo
- edi.oca.handler.output.validate · modelo nuevo
Texto generado por IA (DeepSeek) al leer el código de la versión 19.0 en GitHub; puede contener errores, así que verifícalo en el código antes de decidir. El módulo es muy grande y solo se ha leído una parte del código. Ver el código en GitHub
Disponibilidad por versión
Revisado: 2026-11-03Estado de confirmación: 2 confirmadas, 7 sin información de 9 versiones.
Fuentes · Odoo 18.0
Confirmado el 2026-11-03 en la rama 18.0 de OCA/edi-framework.
terminal Instalación y uso
Documentación de OCA · Odoo 19.0Configuración
Fuente · Odoo 19.0Este módulo tiene como objetivo proporcionar una infraestructura para simplificar el intercambio de documentos entre sistemas que proporcionan una plataforma de configuración. Será heredado por otros módulos con el fin de definir las implementaciones adecuadas de los componentes.
Para definir un nuevo Exchange Record, necesitamos configurar:
- Backend Type
- Exchange Type
- Backend
- Components
Jobs
- Internal User: podría ser un usuario EDI sin siquiera saberlo, desencadenando flujos EDI mediante algunas de sus acciones sobre registros de negocio; no necesita acceso a los trabajos de cola relacionados.
- EDI User: usuario EDI más consciente que a veces podría necesitar depurar cosas un poco más y, por lo tanto, necesita acceso a los trabajos de cola relacionados.
- EDI Manager: acceso completo a la configuración.
Código a ejecutar
Por defecto, EDI Framework utiliza campos en edi.backend para obtener la función correcta a ejecutar. Cada función está relacionada con un modelo donde se define la función específica. Este modelo necesita heredar el handler específico de cada caso.
- receive: modelo
edi.oca.handler.receivecon la función receive. - process: modelo
edi.oca.handler.processcon la función process. - generate: modelo
edi.oca.handler.generatecon la función generate. - send: modelo
edi.oca.handler.sendcon la función send. - check: modelo
edi.oca.handler.checkcon la función check. - validate on inputs: modelo
edi.oca.handler.input.validatecon la función input_validate. - validate on outputs: modelo
edi.oca.handler.output.validatecon la función input_validate.
Puedes ver un ejemplo en los tests fake_models.
Para un comportamiento más complejo, puedes usar el módulo edi_component_oca para usar componentes.
Generación de EDI por el usuario
En el exchange type, podría ser posible definir un conjunto de modelos, un dominio y un fragmento de código. Después de definir estos campos, veremos automáticamente botones en la vista para generar los exchange records. Esta configuración es útil para definir una forma de generación gestionada por el usuario.
Configuración de reglas de exchange type
Los exchange types se pueden configurar aún más con reglas. Puedes usar reglas para:
- hacer que los botones aparezcan automáticamente en los formularios
- definir tu propia lógica personalizada
Ve a un exchange type y ve a la pestaña "Model rules". Ahí puedes añadir una o más reglas, una por modelo. En cada regla puedes definir un dominio o un fragmento para activarla. En el caso del tipo "Form button", si el dominio y/o el fragmento se cumplen, aparecerá un botón de formulario en la parte superior del formulario. Este botón puede ser usado por el usuario final para generar manualmente un exchange. Si hay más de un backend y el exchange type no tiene un backend establecido, aparecerá un asistente pidiendo seleccionar un backend a usar para el exchange.
En el caso del tipo "Custom", tendrás que definir tu propia lógica para hacer algo.
Manejadores de eventos personalizados mediante edi.configuration
El framework puede despachar eventos del ciclo de vida EDI a configuraciones definidas por el usuario, proporcionando una alternativa declarativa a los eventos de componentes. Cada registro edi.configuration vincula un trigger (un código edi.configuration.trigger) a un fragmento (snippet_do) que se ejecuta cada vez que el evento coincidente se dispara en un exchange record.
Los eventos integrados disparados por EDIExchangeRecord incluyen:
on_edi_exchange_done— exchange procesado correctamenteon_edi_exchange_error— exchange finalizado con erroron_edi_exchange_done_ack_received— archivo ACK recibidoon_edi_exchange_done_ack_missing— ACK esperado no recibidoon_edi_exchange_done_ack_received_error— ACK recibido con erroreson_edi_exchange_<action>_complete— finalización de acción genérica (p. ej.generate_complete,send_complete), disparado una vez en el exchange record y una vez en su registro relacionado cuando existe
El fragmento recibe al menos dos variables en su contexto de evaluación:
conf— el registroedi.configurationactualrecord— el objetivo del evento (ya sea el propioedi.exchange.recordo su registro de negocio relacionado)
Además de los extras estándar de edi_exec_snippet_do (operation, edi_action, old_value, vals, ...).
Los triggers también pueden ser disparados por una acción programada en lugar de por un exchange. Añade un edi.configuration.trigger con un código propio, luego una acción programada sobre edi.configuration ejecutando model._cron_run_by_trigger("your_code") en el periodo que necesites. Ningún trigger de este tipo se incluye como datos, ya que los periodos que necesita una base de datos son propios; los datos de demostración tienen uno horario y otro diario para copiar.
Un trigger programado no tiene registro de origen, por lo que sus configuraciones se ejecutan sobre los registros vinculados a ellas, o una vez cuando son globales.
Hay disponibles dos modos de búsqueda complementarios, y se pueden combinar libremente en el mismo flujo.
Configuraciones de eventos globales
Usa este modo cuando quieras que una configuración reaccione a eventos en cualquier registro de negocio que viaje a través de EDI, sin configuración por partner.
Marca Global Configuration (is_global) en el edi.configuration. Cuando se dispara un evento, el framework llama a edi.configuration.edi_get_conf_global(exchange_record, trigger), que selecciona todas las configuraciones globales activas cuyo trigger coincide con el código del evento, filtradas por el exchange record de origen:
- Exchange type (
type_id): debe coincidir con el tipo del exchange record, o dejarse vacío para aplicarse a todos los tipos - Backend (
backend_id): debe coincidir con el backend del exchange record, o dejarse vacío para aplicarse a todos los backends - Model (
model_id/model_name): debe coincidir con el modelo del registro relacionado (p. ej.sale.order,account.move), o dejarse vacío para aplicarse a todos los modelos
Los valores vacíos significan "se aplica a todos". Las configuraciones inactivas y las configuraciones no globales se ignoran. Todas las configuraciones coincidentes se ejecutan en secuencia.
Casos de uso típicos:
- Publicar un mensaje genérico de chatter en cada exchange que finaliza con error
- Enviar una notificación a un sistema externo cada vez que se recibe un ACK para un backend dado
- Registrar información de auditoría adicional para cada exchange de un tipo dado
Configuraciones de eventos específicas de partner (basadas en relación)
Usa este modo cuando la reacción deba depender del partner (o cualquier otro registro relacionado) involucrado en el exchange.
En este caso las configuraciones no se marcan como globales. En su lugar, el registro de negocio expone una relación edi_config_ids (mediante edi.exchange.consumer.mixin._edi_config_field_relation, que por defecto devuelve self.env["edi.configuration"] y se puede sobrescribir, por ejemplo para apuntar a self.partner_id.edi_config_ids). Cuando se dispara un evento sobre el registro de negocio (p. ej. al crear, al escribir, al enviar por email/EDI), el framework llama a edi_confs.edi_get_conf(trigger) sobre esa relación y ejecuta los fragmentos coincidentes.
Comparado con las configuraciones globales:
- El descubrimiento proviene de la propia relación del registro, no de una búsqueda en toda la base de datos; este es el lugar adecuado para modelar reglas del tipo "este partner quiere este comportamiento"
- El filtrado se reduce a
triggery (opcionalmente)backend_id, ya que el recordset ya está acotado por la relación - Se aplica la misma API de
snippet_do, por lo que un fragmento se puede reutilizar tal cual entre configuraciones globales y específicas de partner
Casos de uso típicos:
- Enviar un flujo EDI específico solo para un subconjunto de partners
- Personalizar la generación de documentos por cliente (p. ej. distinta plantilla de email, distinto transporte)
- Alternar entre entrega por EDI y por email según las preferencias del partner
Tras ciertas operaciones o ejecución manual, se generarán registros de Exchange. Estos registros de Exchange pueden ser registros de entrada o registros de salida.
El cambio de estado puede ser ejecutado manualmente por el sistema o ser gestionado mediante ir.cron.
Registros de Exchange de salida
Un registro de salida está destinado a ser utilizado para el intercambio de información desde Odoo hacia otro sistema.
El flujo de un registro de salida debería ser:
- Creación
- Generación de datos
- Validación de datos
- Envío de datos
- Validación de datos procesados correctamente por la otra parte
Registros de Exchange de entrada
Un registro de entrada está destinado a ser utilizado para el intercambio de información desde otro sistema hacia odoo.
El flujo de un registro de entrada debería ser:
- Creación
- Recepción de datos
- Verificación de datos
- Procesamiento de datos
Traducción automática al español (DeepSeek) de la documentación original de OCA; los comandos y el código no se traducen. Sin información verificada en OCA: Instalación.
Las instrucciones de instalación, el paquete de distribución, las dependencias y los pasos de configuración no se muestran porque todavía no se han verificado en la documentación del módulo para ninguna versión.
Datos importados de GitHub: esta ficha refleja la última revisión del catálogo, no una consulta en directo. Verifica siempre en la documentación del módulo y en staging antes de instalar en producción.