A la hora de gestionar pagos en Dynamics 365 Finance and Operations (D365FO), es fundamental validar la información antes de generar los ficheros de pago. Un dato incorrecto o incompleto puede provocar el rechazo del pago por parte del banco, generando problemas en la conciliación y retrasos en las operaciones.
D365FO permite configurar distintas formas de pago con formatos de exportación como ISO20022 o normas nacionales. Sin embargo, algunos bancos añaden controles adicionales que requieren adaptar el sistema para garantizar que los datos críticos estén correctamente informados antes de procesar el pago.
En este artículo veremos cómo implementar validaciones personalizadas en las formas de pago de clientes y proveedores para evitar errores y asegurar la integridad de la información.

¿Cómo funciona el control de pagos en D365FO?
Dynamics 365 Finance and Operations dispone de controles estándar para validar los pagos tanto de clientes como de proveedores. En cada forma de pago, es posible activar verificaciones específicas que se aplican al procesar el diario, asegurando que los datos requeridos estén correctamente informados.


A nivel técnico, la validación ocurre en la línea del diario de pagos. El método checkPaymentFilledOk de la tabla LedgerJournalTrans es el encargado de ejecutar estos controles. Dentro de este método, el sistema distingue si se trata de un pago a clientes o a proveedores y aplica las validaciones correspondientes en función del tipo de transacción.

En cada uno de los métodos específicos para pagos de clientes y pagos de proveedores intervienen objetos diferentes que vamos a estudiar a continuación:
• Pagos de proveedores
En el caso de pagos de proveedores, los controles habilitados por forma de pago se almacenan en la tabla VendPaymMethodVal. Las validaciones parten de la clase abstracta VendPaymentFieldValidator y, en función del valor del enumerado VendPaymentValidate, se instanciará la clase que implemente la validación asociada.



• Pagos de clientes
En este caso, los controles habilitados se vinculan a las formas de pago a través de la tabla CustPaymMethodVal. Además, el proceso es más rudimentario y no se utiliza herencia para desarrollar las validaciones, sino que las comprobaciones se realizan mediante una estructura de control switch en la propia tabla LedgerJournalTrans, dentro del método custPaymentFilledOk.



Control personalizado de pagos de proveedores
Para personalizar el control de pagos de proveedores, vamos a tomar como ejemplo un requisito en el que las transacciones de proveedor marcadas en el diario deben tener siempre informado el número de factura.
El primer paso es extender el enumerado VendPaymentValidate, que vimos en el apartado anterior, añadiendo un nuevo valor que represente esta validación específica.

Una vez creado el nuevo valor en el enumerado, el siguiente paso es desarrollar una implementación de la clase VendPaymentFieldValidator. Esta nueva clase será instanciada automáticamente por VendPaymentFieldValidatorFactory cuando el sistema recorra las validaciones activas para una determinada forma de pago y detecte que nuestro nuevo control está habilitado.
Para ello, debemos decorar la clase e implementar tres métodos clave:
• Constructor: Define la configuración inicial de la validación.
• isValid: Evalúa si la transacción cumple con el requisito establecido.
• getCheckFailedMessage: Devuelve el mensaje de error en caso de que la validación no se cumpla.

Y para muestra, un botón:

Control personalizado de pagos de clientes
El ejemplo para ilustrar el control personalizado de pagos de clientes será el mismo requisito que en el caso anterior. Nuevamente, comenzamos extendiendo el enumerado CustPaymentValidate para añadir la nueva validación.

Como veíamos anteriormente, el control de pagos de clientes es más simple que en el caso del pago de proveedores. Simplemente es necesario suscribirse al delegado custPaymentFilled0kDelegate de la tabla LedgerJournalTrans y controlar qué valor del enumerado se recibe para aplicar una validación u otra.

Otro botón:

Conclusión
Garantizar la correcta validación de los pagos en Dynamics 365 Finance and Operations es clave para evitar errores que puedan generar incidencias con las entidades bancarias. Aunque el sistema estándar ofrece controles básicos para clientes y proveedores, en muchos casos es necesario extender su funcionalidad para cumplir con requisitos específicos.
En este artículo hemos visto cómo funciona el control de pagos en D365FO y cómo personalizarlo para asegurar que las transacciones cumplan con las reglas definidas.
Espero que os haya gustado y os sea útil. ¡Hasta la próxima! ;)