Introduction
Au fur et à mesure que les entreprises grandissent et se développent, elles peuvent trouver le besoin de protéger les processus d’affaires au sein de leur système. Heureusement, Acumatica est livré avec une suite d’approbation complète native qui peut être configurée pour répondre aux besoins spécifiques d’une entreprise.
Pour les développeurs, la question qui se pose ensuite est de savoir comment protéger les processus personnalisés qui sont développés à l’aide du cadre Acumatica et qui veulent la même fonctionnalité transparente du système intégré d’Acumatica.
Cet article vise à vous fournir un chemin pour accomplir cette tâche.
Dans ce cas, nous examinerons la page de demande de temps développée par ASI LLC qui permet aux employés de demander des périodes de congé et de soumettre des demandes d’approbation. Les demandes de temps seront ensuite examinées selon le traitement d’approbation intégré d’Acumatica et réfléchiront sur la carte de temps des employés en fonction de la configuration.
Page d’installation
Comme c’est la pratique courante lors de l’extension ou de la création de nouvelles fonctionnalités dans le cadre Acumatica, nous allons créer notre propre page de préférences pour gérer les configurations de notre fonction de demande de temps .
La page affichée dans l’image ci-dessous a une grille répertoriant les entités pour l’approbation et une case à cocher déterminant si les approbations sont activées pour les entités répertoriées dans la grille. Un champ de séquence de numérotation est également défini qui sera ensuite utilisé par la page de saisie de données de demande de temps personnalisée.
Classes d’accès aux données
AATimeRequestSetup
Cette classe est en cours d’implémentation en tant que data-access-class d’installation pour la fonctionnalité de demande de temps ; elle contient un champ unique utilisé par le processus d’approbation TimeRequestApproval
GIST : https://gist.github.com/jvanhoesen/db449c52ae593efd0fc22b9b2939fd88
AATimeRequestApproval
La structure de cette DAC imite la table Acumaticas EPSetupApproval dans la base de données et doit utiliser à la fois IBqlTable et l’interface IAssignedMap .
GIST : https://gist.github.com/jvanhoesen/72198b26eabe422335f1b31e2e617902
Graphique
Le graphique de la page de configuration est simple et direct, référençant deux classes d’accès aux données et utilisant un seul événement AATimeRequestSetup_FieldUpdated qui, lorsqu’il est déclenché, mettra à jour tous les enregistrements correspondants dans la vue AATimeRequestApproval.
GIST: https://gist.github.com/jvanhoesen/19bb75eab4aca39c1228a86e16c5261a
Page de saisie de données
La création d’une page de saisie des données est rendue plus complexe avec la mise en œuvre des processus d’approbation. L’interface utilisateur terminée pour la fonctionnalité de demande de temps peut être vue dans l’image ci-dessous. Cette page permet la création d’une demande de temps par un employé avec une ventilation détaillée de l’heure de la demande. Ce document peut maintenant être mis en attente et soumis à l’approbation.
GIST : https://gist.github.com/jvanhoesen/793901fada92c37aca0ec16d80c73f
Ce sera la norme Acumatica approuver et rejeter les actions sous la liste déroulante Actions , que nous définirons plus loin dans l’article.
Classe d’accès aux données primaires
La principale classe d’accès aux données que nous définissons pour nos approbations qui permettent des pages de saisie de données personnalisées est AATimeRequest.
GIST: https://gist.github.com/jvanhoesen/b4ef5c93dc67cb8ab1d90852d9715682
IAssign
La Data-Access-Class doit implémenter l’interface IAssign . Cela nécessitera d’inclure les champs OwnerID et WorkGroupID dans la déclaration de classe.
GIST : https://gist.github.com/jvanhoesen/825585aea3c9217199f81c9d12476ddf
État d’avancement
Vous devrez définir les valeurs d’état suivantes pour le champ d’état de votre DAC avec les affichages correspondants comme indiqué ci-dessous.
« H » – « En attente »
« P » – « En attente d’approbation »
« A » – « Approuvé »
« R » – « Rejeté »
GIST : https://gist.github.com/jvanhoesen/58a2c6105789c632994d51a87fce3b24
Drapeaux
Nous devrons déclarer deux champs de bits supplémentaires sur notre Data-Access-Class pour savoir si l’enregistrement a été approuvé ou rejeté par l’utilisateur. Ceux-ci nommeront Approuvé et Rejeté.
IsApprover
Il s’agit d’un champ sauvegardé non-DB qui est renseigné via des événements graphiques lors du chargement d’un enregistrement et détermine si l’utilisateur actuel est un approbateur valide pour l’entité.
Graphique
Le graphique de notre page de saisie de données est défini comme AATimeRequestEntry. Bienqu’il soit un peu plus complexe que notre page de configuration, sa logique est utilisée pour mettre à jour les statuts sur la classe d’accès aux données principale. Cela fournit une logique d’approbation supplémentaire, encapsulée dans les classes d’aide Acumatica.
GIST : https://gist.github.com/jvanhoesen/7c438ef851ef1aac4bfa9af7c9cebf08
EPApprovalAutomation
La création du graphique pour une page de saisie de données personnalisée avec approbations est rendue moins complexe grâce aux classes d’aide développées par Acumatica qui consolident la logique en structures faciles à utiliser.
Nous allons mettre en œuvre l’aide EPApprovalAutomation avec une vue nom de déclaration d’approbation et les arguments suivants :
SourceAssign – DAC principal
Approuvé – Champ principal approuvé par le CMV
Rejeté – Champ rejeté de la DAC principale
Attente – Champ d’attente DAC principal
SetupApproval – DAC SetupApproval
Mesures à prendre
Vous devrez créer deux actions supplémentaires comme défini ci-dessous :
Approuver – Met à jour l’état de l’entité sur « Approuvé » et marque l’indicateur « Approuvé » sur le DAC principal comme vrai.
Rejeter – Met à jour l’état de l’entité sur « Rejeté » et marque l’indicateur « Rejeté » sur le DAC principal comme vrai.
Evénements
Primary_DAC_RowSelecting – Déterminez si les approbations sont activées, si elles sont activées, vérifiez que l’utilisateur actuel est l’approbateur d’ensemble et remplit IsApprover en conséquence.
GIST : https://gist.github.com/jvanhoesen/8461bf6dd782b07f1f7f9713deddc49f
Primary_DAC_RowSelected - Active les boutons Approuver / Rejeter lorsqu’une entité passe à l’approbation en attente ainsi que la désactivation des champs d’en-tête, à l’exception de la case à cocher Conserver lorsque l’entité est en attente.
GIST: https://gist.github.com/jvanhoesen/a385ca54d3f87a4694728f6c509c9a27
Primary_DAC_FieldUpdated – Définit l’entité en attente d’approbation lorsqu’elle est mise en attente ou réinitialise les autres champs d’état lorsqu’un document est remis en attente.
GIST: https://gist.github.com/jvanhoesen/dcf6fe87eb6ae25a214a2657066301a6
EPApproval_RowInserting – Utilisé pour définir des renseignements supplémentaires dans le dossier d’approbation de l’approbateur.
GIST: https://gist.github.com/jvanhoesen/030ee7529c1bd8aa45da04166cfc059a
Ces informations supplémentaires peuvent également être renseignées en ajoutant des événements CacheAttached à la place de RowInserting comme vu ci-dessous.
GIST: https://gist.github.com/jvanhoesen/14e9fdb4738f956f2b414d54ef27cc6b
Modification d’Acumatica
Extension de graphique
Une extension de graphique devra être créée à partir du graphique de maintenance de la carte d’approbation Acumatica EPApprovalMapMaint pour permettre à la page de saisie de données personnalisée de s’afficher sur la liste des types d’entités, implémentée avec l’exemple de page AA306000 ci-dessous.
GIST: https://gist.github.com/jvanhoesen/b3f688911bfd0375ed1dd8bd8b147884
Une fois l’extension écrite et la page inscrite dans le sitemap des instances, l’entité personnalisée devient désormais disponible dans la liste déroulante Type d’entité , comme vous le voir ci-dessous.
Configuration
Une fois toutes les étapes ci-dessus terminées, vous pourrez définir une carte d’approbation pour votre entité personnalisée et utiliser le processus d’approbation natif du framework Acumatica.
Conclusion
Bien que l’utilisation de fonctionnalités avancées d’Acumatica dans les pages personnalisées puisse parfois être intimidante, j’ai essayé de montrer à quel point cela peut être simple en suivant ces étapes simples:
- Créez une page d’installation qui configure si les approbations sont actives pour l’entité personnalisée.
- Créez une page de saisie de données qui utilise et répond aux workflows d’approbation.
- Créez une extension de la page de mappage d’approbation Acumatica pour autoriser les entités personnalisées définies.
Avec la méthodologie que j’ai décrite pour que vous puissiez la mettre en œuvre, vous serez également en mesure d’utiliser facilement le processus d’approbation intégré d’Acumatica pour les pages de saisie de données personnalisées. Cela améliorera considérablement la capacité de protection et d’audit des données système spécifiques aux clients importants - un must dans tout système ERP (Enterprise Resource Planning) moderne.
Bon codage!