SII - Cómo personalizar
Visión general del código
La exportación de datos a la AEAT, utilizando iDynamics SII, se compone de dos partes diferenciadas:
- La generación de un registro de datos a enviar, en la tabla 7141861 de documentos.
- El envío de dichos registros a la AEAT, sea de manera directa, o a través de un ejecutable externo.
En principio, el punto 2 no es susceptible de ser personalizado, ya que el formato y la información que se envía al SII depende de lo definido por la AEAT. El punto 1, sin embargo, puede necesitar de personalizaciones, si un cliente trabaja con múltiples tipos de facturas o abonos (iDynamics SII sólo permite configurar un tipo para cada caso), si la facturación del cliente está personalizada o, en general, si se quiere modificar la información enviada a la AEAT.
Personalización de los datos a enviar a la AEAT
Para simplificar la personalización del primer punto, hemos creado varios eventos (métodos en NAV2015 y anteriores) que se capturan en la Codeunit 7141863 IDP SII Customization Events. Esta codeunit se entrega con el objetivo de servir como referencia en NAV2016/NAV2017, o de ser directamente personalizada (versiones NAV2015 y anteriores), y contiene de serie varios métodos (vacíos) que se ejecutan durante el proceso de generación de registros en la cola de documentos. El objetivo es que la personalización de iDynamics SII en cada cliente no requiera tocar ningún otro objeto, simplificando así la actualización cuando publiquemos nuevas versiones.
OnAfterAddDocument
OnAfterAddDocument(VAR SiiDocument : Record "IDPSII Document")
Este evento/método se ejecuta cada vez que se crea un registro de alta en la cola de documentos a enviar al SII.
Recibe como parámetro el registro, con todos los datos ya cálculados. A partir de ese momento, vuestro código puede realizar todos los cambios necesarios al registro, incluyendo la posibilidad generar nuevos registros y/o eliminar el creado por el estándar, si fuera necesario (lo más fácil, no obstante, es modificar el existente).
OnAfterAddDocumentFromPosted
OnAfterAddDocumentFromPosted(VAR SiiDocument : Record "IDPSII Document")
Este evento/método se ejecuta cada vez que se crea un registro de modificación en la cola de documentos a enviar al SII. Se diferencia del anterior en que el primero se ejecuta cuando se crean nuevos registros desde los movimientos de contabilidad, y este se ejecuta cuando alguien entra en el histórico de envíos y pulsa el botón de "Enviar modificación".
Recibe como parámetro el registro, con los datos originales del envío, pero configurado para enviar una solicitud de modificación.
OnBeforeLoadDocuments
OnBeforeLoadDocuments()
Este evento/método se ejecuta antes de comenzar la carga de registros en la cola de documentos a enviar al SII (al pulsar el botón de Cargar documentos, o al ejecutar la Codeunit creada para la cola de proyectos).
OnAfterLoadDocuments
OnAfterLoadDocuments()
Este evento/método se ejecuta al finalizar la carga de registros en la cola de documentos a enviar al SII (al pulsar el botón de Cargar documentos, o al ejecutar la Codeunit creada para la cola de proyectos).
OnAfterValidateDocument
OnAfterValidateDocument(VAR SiiDocument : Record "IDPSII Document")
Este evento/método se llama tras realizar las comprobaciones que lanza iDynamics SII para verificar si faltan datos que requieran dejar el documento en estado "A revisar". Aunque se podrían añadir validaciones personalizadas en el evento OnAfterAddDocumentFromPosted, este evento en particular se ejecuta, además de al añadir un documento a la cola, cada vez que se pulsa el botón de Establecer estado a Enviar.
La manera recomendada de proceder, si se desea dejar un documento en estado "A revisar" porque no cumple alguna condición, es asignar el estado "A revisar", indicar un código de error interno que permite identificar el problema, y añadir un mensaje de error que informe al usuario de qué acciones debe realizar para solucionarlo. Ej.
IF Condicion THEN BEGIN
SiiDocument.Status := Status::"To Review";
SiiDocument."Error Code" := 'ERR0001';
SiiDocument."Error Message" := 'Los documentos de tipo X requieren que la descripción contenga...';
END;
OnDocumentResponseFromDirect
OnDocumentResponseFromDirect(VAR SiiDocument : Record "IDPSII Document")
Este evento se produce una vez enviado un registro a la AEAT, usando conexión directa, con el campo Status actualizado, indicando si ha sido enviado con éxito, si ha sido "Aceptado con errores", o si se ha producido un error.
OnDocumentResponseFromExportText
OnDocumentResponseFromExportText(VAR SiiDocument : Record "IDPSII Document")
Este evento se produce una vez enviado un registro a la AEAT, usando la conexión mediante ejecutable, con el campo Status actualizado, indicando si ha sido enviado con éxito, si ha sido "Aceptado con errores", o si se ha producido un error.
OnBeforeUpdateAmounts
OnBeforeUpdateAmounts(VAR SiiDocument : Record "IDPSII Document";VAR Handled : Boolean)
Este evento se produce justo antes de calcular los importes de un documento, tanto en el momento de cargar datos en la cola, como al pulsar el botón de "Actualizar importes", dentro del mismo.
En caso de asignarse la variable Handled a VERDADERO, se considerará que la personalización ha realizado dicho cálculo, y la aplicación no realizará el cálculo estandar.
OnAfterUpdateAmounts
OnAfterUpdateAmounts(VAR SiiDocument : Record "IDPSII Document")
Se ejecuta una vez se han calculado los importes del documento, tanto en el momento de cargar datos en la cola, como al pulsar el botón de "Actualizar importes", dentro del mismo.
Personalización del informe de carga de datos
En principio, usando los eventos incluidos en la aplicación, debería ser suficiente para realizar la mayoría de personalizaciones que pueda requerir un cliente. Sin embargo, dado el nivel de personalizaciones que se pueden llegar a realizar en NAV, podemos encontrarnos con clientes donde el funcionamiento de la tabla de movimientos contables ha sido totalmente alterado, o donde se quiere personalizar el informe para aplicar criterios de filtros que enlacen distintas tablas del ERP.
Por ello, desde la versión 1.10 de iDynamics SII, toda la lógica de la creación de registros en la cola de documentos ha sido trasladada a una nueva codeunit (7141865), y el informe de carga predeterminado (7141860) contiene únicamente la lógica de recorrido de datos y llamadas a la nueva codeunit. De esta manera, duplicando el informe (7141860 ó 7141866) como punto de partida, y usando los nuevos campos de configuración de informes disponibles en la pantalla de configuración de iDynamics SII, podéis personalizar la manera en la que se recorren los datos, o los filtros que se muestran al pulsar el botón de carga con filtro.
Insistimos: la manera más sencilla y práctica de personalizar es usando los eventos pero, para los casos en que esto no sea suficiente, la personalización de informes os da la flexibilidad para modificar la lógica completa de carga, si fuera necesario, sin modificar los objetos de la aplicación (y facilitando así la actualización a nuevas versiones).
Como añadido a este apartado, mencionar que iDynamics SII incluye dos informes que recorren los movimientos de clientes y proveedores sin pasar por los movimientos contables. Estos informes están destinados a clientes que tengan descuadrada la numeración de movimientos (algo que desgraciadamente hemos detectado que no es extraño). Si fuera el caso, podéis modificar la configuración de informes para apuntar a ellos (7141867 y 7141868) en lugar de a los informes predeterminados (7141860 y 7141866).
Recomendaciones
Si estáis programando en NAV2016 o NAV2017, ¡utilizad eventos! En lugar de introducir el código directamente en la Codeunit 7141863, cread una Codeunit en el rango de personalizaciones del cliente y añadid ahí el código. Si no habéis trabajado nunca con eventos podéis mirar las propiedades de los métodos de dicha Codeunit para ver cómo se configuran.
Si estáis programando en NAV2015 o anteriores, no tendréis más remedio que meter código en dicha Codeunit. Aún así, y para simplificar actualizaciones (siempre es posible que añadamos nuevos eventos o parámetros en el futuro), nuestra recomendación es que creéis una Codeunit en el rango del cliente con vuestro código, y en la Codeunit 7141863 únicamente incluyáis la declaración de vuestra Codeunit y las llamadas a vuestro método.
En caso de duda sobre el uso de cualquiera de los campos de los registros de la cola de documentos (tabla 7141861), hemos añadido descripciones a los que podrían generar más dudas. Entrad desde el entorno de desarrollo a la tabla, y mostrad la columna de "Description", para obtener más información.
En cualquiera de los dos eventos, de alta o modificación, podéis obtener el documento de origen del registro (la factura o abono del que procede) usando los campos Document Type, Rectif. Type, e *Invoice No.". El primero nos dice el tipo de documento de origen, el segundo (si tiene valor), nos indica que se trata de un abono de compra o venta (si el tipo es factura de venta o compra), y el tercero almacena el código del documento de origen.
No debería ser necesario saber mucho más a la hora de personalizar (obviamente podríais querer agregar nuevas opciones de configuración, etc., pero al final todas acabarán utilizándose en el método de la Codeunit 7141863). No obstante, no dudéis en realizarnos consultas a través del canal del SII, estamos abiertos a añadir mejoras para facilitar la personalización del código, y agradecemos vuestros comentarios para mejorar la documentación.
Enlace recomendado: ejemplos de personalizaciones