[FIX] l10n_uy_ux: enhance EDI sending process with pre-checks and error handling#390
[FIX] l10n_uy_ux: enhance EDI sending process with pre-checks and error handling#390jue-adhoc wants to merge 1 commit intoingadhoc:18.0from
Conversation
There was a problem hiding this comment.
Pull request overview
Este PR ajusta el flujo de envío EDI para Uruguay para evitar que los errores de pre-chequeos disparen raise (problemático en procesos automáticos) y, en su lugar, registrar el error en el documento EDI / chatter para que se visualice como banner.
Changes:
- Se agrega un override de
_l10n_uy_edi_send()que corre pre-checks y, si fallan, crea/setea unl10n_uy_edi.documenten estadoerrorsin continuar el envío a DGI. - Se elimina el
ValidationErroren_post()y se postea un mensaje de error en el chatter con formato HTML.
d3565fc to
90a4429
Compare
90a4429 to
a62a0fa
Compare
| Si obtenemos alguno, no continuamos con el envío a DGI y en cambio creamos el XML con el error.""" | ||
| moves_to_send = self | ||
| for move in self: | ||
| move.l10n_uy_edi_document_id.filtered(lambda doc: doc.state == "error").unlink() |
There was a problem hiding this comment.
En este punto el .unlink() sobre documentos en estado error probablemente no elimina nada: en l10n_uy_ux/models/l10n_uy_edi_document.py el unlink() está sobreescrito para preservar documentos con message/l10n_uy_edi_error, por lo que acá quedarían documentos huérfanos. Alternativas: eliminar esta línea si se quiere preservar historial, o permitir el borrado explícito vía context (p.ej. allow_unlink_error_docs) y respetarlo en el override de unlink().
| move.l10n_uy_edi_document_id.filtered(lambda doc: doc.state == "error").unlink() | |
| move.l10n_uy_edi_document_id.filtered(lambda doc: doc.state == "error").with_context( | |
| allow_unlink_error_docs=True | |
| ).unlink() |
| edi_doc.message = self.env._("Errors occurred while evaluating the document: \n") + "\n *".join( | ||
| pre_checks_errors |
There was a problem hiding this comment.
La construcción del mensaje arma el listado de errores con "\n *".join(...), lo que deja el primer error sin viñeta (queda pegado al header) y sin espacio consistente. Para que el formato sea estable, conviene prefijar el listado con \n * y luego hacer el join con el mismo separador.
| edi_doc.message = self.env._("Errors occurred while evaluating the document: \n") + "\n *".join( | |
| pre_checks_errors | |
| edi_doc.message = ( | |
| self.env._("Errors occurred while evaluating the document: \n") | |
| + "\n * " | |
| + "\n * ".join(pre_checks_errors) |
| error_msg = Markup("<font style='color:Tomato;'><strong>ERROR:</strong></font> <i>{}</i>").format( | ||
| f"{msg}: {move.l10n_uy_edi_error}" | ||
| ) | ||
| move.message_post(body=error_msg, body_is_html=True) |
There was a problem hiding this comment.
El banner agrega el literal "ERROR:" hardcodeado en inglés y en HTML. Si esto es visible al usuario, debería ser traducible (p.ej. usando _()/env._()) para no mezclar idiomas en el chatter/banner.
| def _l10n_uy_edi_send(self): | ||
| """Antes de enviar a DGI, corremos los chequeos previos para atrapar algunos errores conocidos y de fácil configuración. | ||
| Si obtenemos alguno, no continuamos con el envío a DGI y en cambio creamos el XML con el error.""" | ||
| moves_to_send = self | ||
| for move in self: | ||
| move.l10n_uy_edi_document_id.filtered(lambda doc: doc.state == "error").unlink() | ||
| edi_doc = self.env["l10n_uy_edi.document"].create( | ||
| { | ||
| "move_id": move.id, | ||
| "uuid": self.env["l10n_uy_edi.document"]._get_uuid(move), | ||
| } | ||
| ) | ||
| move.l10n_uy_edi_document_id = edi_doc | ||
| if pre_checks_errors := move._l10n_uy_edi_check_move(): | ||
| edi_doc.message = self.env._("Errors occurred while evaluating the document: \n") + "\n *".join( | ||
| pre_checks_errors | ||
| ) | ||
| edi_doc.state = "error" | ||
| moves_to_send -= move | ||
|
|
||
| super(AccountMove, moves_to_send)._l10n_uy_edi_send() |
There was a problem hiding this comment.
Este cambio modifica el flujo de posteo/envío: ya no se levanta ValidationError en pre-checks y en su lugar se crea un l10n_uy_edi.document en state='error' y se revierte a borrador. Hay tests en l10n_uy_ux/tests, pero no hay cobertura para este nuevo comportamiento; estaría bueno agregar un test que fuerce un error de _l10n_uy_edi_check_move() y verifique que no se raisea excepción, que se crea el documento EDI con mensaje y que el move queda fuera de res.
| #. module: l10n_uy_ux | ||
| #. odoo-python | ||
| #: code:addons/l10n_uy_ux/models/account_move.py:0 | ||
| #, python-format | ||
| msgid "Errors occurred while evaluating the document: \n" | ||
| msgstr "Errores ocurridos al evaluar el documento: \n" | ||
|
|
There was a problem hiding this comment.
Se agregó la traducción solo en es_419.po, pero el mismo msgid no está presente en l10n_uy_ux/i18n/es.po. Si están manteniendo ambos catálogos, convendría exportar/actualizar también es.po (aunque sea con msgstr vacío) para que no quede desincronizado.
|
@roboadhoc r+ |
…or handling closes #390 Signed-off-by: Pablo Montenegro - pam (#l10n) <pam@adhoc.com.ar>

Realizamos estos cambios para no levantar un raise con el error, que puede dar problemas en procesos automáticos de facturación. De esta manera, en lugar del pop-up veremos el banner tal como sucedía anteriormente con el wizard de Send & Print.
