Introducción
A medida que las empresas crecen y se desarrollan, pueden encontrarse con la necesidad de salvaguardar los procesos empresariales dentro de su sistema. Afortunadamente, Acumatica incluye un conjunto completo de aprobaciones nativas que puede configurarse según las necesidades específicas de la empresa.
Para los desarrolladores, la pregunta que surge a continuación es cómo proteger los procesos personalizados que se desarrollan utilizando el Acumatica Framework y desean la misma funcionalidad sin fisuras del sistema integrado de Acumatica.
Este artículo pretende ofrecerle una vía para llevar a cabo esta tarea.
En este caso, revisaremos la página de solicitud de tiempo desarrollada por ASI LLC que permite a los empleados solicitar períodos de tiempo libre y enviar solicitudes para su aprobación. A continuación, las solicitudes de tiempo se revisarán mediante el procesamiento de aprobación integrado de Acumatica y se reflejarán en la tarjeta de tiempo de los empleados en función de la configuración.
Página de configuración
Como es práctica común al extender o crear nuevas funcionalidades dentro del Framework de Acumatica, vamos a crear nuestra propia página de preferencias para manejar las configuraciones para nuestra característica de Solicitud de Tiempo.
La página que se muestra en la siguiente imagen tiene una cuadrícula que enumera las entidades para aprobación y una casilla de verificación que determina si las aprobaciones están habilitadas para las entidades enumeradas en la cuadrícula. También se define un campo de secuencia de numeración que luego será utilizado por la página de ingreso de datos de Solicitud de Tiempo personalizada.
Clases de acceso a datos
AATimeRequestSetup
Esta clase se implementa como clase de acceso a datos de configuración para la clase Solicitud de hora y contiene un único campo utilizado por el proceso de aprobación TimeRequestApproval
GIST: https://gist.github.com/jvanhoesen/db449c52ae593efd0fc22b9b2939fd88
AATimeRequestApproval
La estructura de este CAD imita la de Acumaticas EPSetupApproval en la base de datos y debe utilizar tanto IBqlTable y el IAssignedMap de la base de datos.
GIST: https://gist.github.com/jvanhoesen/72198b26eabe422335f1b31e2e617902
Gráfico
El gráfico para la página de configuración es simple y directo, haciendo referencia a dos clases de acceso a datos y utilizando un único Evento AATimeRequestSetup_FieldUpdated que al activarse actualizará todos los registros correspondientes dentro de la clase AATimeRequestApproval view.
GIST: https://gist.github.com/jvanhoesen/19bb75eab4aca39c1228a86e16c5261a
Página de entrada de datos
La creación de una página de entrada de datos se hace más compleja con la implementación de procesos de aprobación. La interfaz de usuario completa para la funcionalidad de solicitud de tiempo puede verse en la imagen siguiente. Esta página permite la creación de una solicitud de tiempo por parte de un empleado con un desglose de horas detallado de la solicitud. Este documento puede ahora ser retirado y enviado para su aprobación.
GIST: https://gist.github.com/jvanhoesen/793901fada92c37aca0ec16d80c73f
Estas serán las acciones estándar de aprobación y rechazo de Acumatica en el menú desplegable Acciones, que definiremos más adelante en el artículo.
Clase de acceso a datos primarios
La principal Clase de Acceso a Datos que estamos definiendo para nuestras aprobaciones que permiten páginas de entrada de datos personalizadas es AATimeRequest.
GIST: https://gist.github.com/jvanhoesen/b4ef5c93dc67cb8ab1d90852d9715682
Firma
La clase Data-Access debe implementar la interfaz IAssign. Para ello será necesario incluir los campos OwnerID y WorkGroupID en la declaración de la clase.
GIST: https://gist.github.com/jvanhoesen/825585aea3c9217199f81c9d12476ddf
Estado
Deberá definir los siguientes valores de estado para el campo estado de su DAC con las pantallas correspondientes, como se muestra a continuación.
"H" - "En espera"
"P" - "Pendiente de aprobación"
"A" - "Aprobado"
"R" - "Rechazado"
GIST: https://gist.github.com/jvanhoesen/58a2c6105789c632994d51a87fce3b24
Banderas
Necesitaremos declarar dos campos de bits adicionales en nuestra Data-Access-Class para llevar la cuenta de si el registro ha sido aprobado o rechazado por el usuario. Se llamarán Aprobado y Rechazado.
IsApprover
Se trata de un campo no respaldado por la base de datos que se rellena mediante eventos gráficos durante la carga de un registro y determina si el usuario actual es un aprobador válido para la entidad.
Gráfico
El gráfico para nuestra página de entrada de datos se define como AATimeRequestEntry.Aunque es un poco más complejo que nuestra página de configuración, su lógica se utiliza para actualizar los estados en la clase de acceso a datos principal. Esto proporciona una lógica de aprobación adicional, encapsulada en las clases de ayuda de Acumatica.
GIST: https://gist.github.com/jvanhoesen/7c438ef851ef1aac4bfa9af7c9cebf08
Aprobación EPAAutomatización
La creación del gráfico para una página de entrada de datos personalizada con aprobaciones es menos compleja gracias a las clases de ayuda desarrolladas por Acumatica que consolidan la lógica en estructuras fáciles de usar.
Implementaremos el helper EPApprovalAutomation con un nombre de declaración de vista de Aprobación y los siguientes argumentos :
SourceAssign - DAC primario
Aprobado - Campo aprobado por el CAD primario
Rechazado - Campo DAC primario rechazado
Hold - Campo de retención del DAC primario
SetupApproval - SetupApproval DAC
Acciones
Deberá crear dos acciones adicionales como se define a continuación:
Aprobar: actualiza el estado de la entidad a "Aprobado" y marca como verdadero el indicador "Aprobado" en el CAD principal.
Rechazar - Actualiza el estado de la entidad a "Rechazada" y marca como verdadero el indicador "Rechazada" en el DAC primario.
Eventos
Primary_DAC_RowSelecting - Determina si las aprobaciones están habilitadas, si están habilitadas comprueba que el usuario actual es el aprobador establecido y rellena IsApprover en consecuencia.
GIST: https://gist.github.com/jvanhoesen/8461bf6dd782b07f1f7f9713deddc49f
Primary_DAC_RowSelected - Habilita los botones Aprobar / Rechazar cuando una entidad pasa a Pendiente de Aprobación, así como deshabilita los campos de cabecera excepto la casilla de verificación Retener para cuando la entidad está fuera de espera.
GIST: https://gist.github.com/jvanhoesen/a385ca54d3f87a4694728f6c509c9a27
Primary_DAC_FieldUpdated - Establece la entidad como pendiente de aprobación cuando se retira de la espera, o restablece los otros campos de estado cuando un documento se vuelve a poner en espera.
GIST: https://gist.github.com/jvanhoesen/dcf6fe87eb6ae25a214a2657066301a6
EPApproval_RowInserting - Se utiliza para establecer información adicional en el registro de aprobación para el autorizador.
GIST: https://gist.github.com/jvanhoesen/030ee7529c1bd8aa45da04166cfc059a
Esta información adicional también se puede rellenar añadiendo eventos CacheAttached en lugar de RowInserting como se ve a continuación.
GIST: https://gist.github.com/jvanhoesen/14e9fdb4738f956f2b414d54ef27cc6b
Modificación de Acumatica
Extensión del gráfico
Será necesario crear una extensión del gráfico a partir del gráfico de mantenimiento del mapa de aprobaciones de Acumatica EPApprovalMapMaint para permitir que la página de entrada de datos personalizada se muestre en la lista de tipos de entidad, implementada con la página de ejemplo AA306000 que se muestra a continuación.
GIST: https://gist.github.com/jvanhoesen/b3f688911bfd0375ed1dd8bd8b147884
Una vez escrita la extensión y registrada la página en el mapa del sitio de instancias, la entidad personalizada estará disponible en la lista desplegable Tipo de entidad, como se muestra a continuación.
Configuración
Una vez completados todos los pasos anteriores, podrá definir un mapa de aprobaciones para su entidad personalizada y utilizar el proceso de aprobaciones nativo del marco de Acumatica.
Conclusión
Aunque el uso de funciones avanzadas de Acumatica en páginas personalizadas puede ser a veces desalentador, he intentado mostrar lo sencillo que puede ser siguiendo estos sencillos pasos:
- Crear una página de configuración que configure si las aprobaciones están activas para la entidad personalizada.
- Cree una página de entrada de datos que utilice y responda a los flujos de trabajo de aprobación.
- Cree una extensión de la página de asignación de aprobaciones de Acumatica para permitir entidades personalizadas definidas.
Con la metodología que describí para que la implementes, tú también podrás utilizar fácilmente el proceso de aprobación incorporado de Acumatica para las páginas de ingreso de datos personalizados. Esto mejorará en gran medida la protección y la capacidad de auditoría de datos importantes del sistema específicos del cliente, algo imprescindible en cualquier sistema ERP (planificación de recursos empresariales) moderno.
¡Feliz codificación!