Introduction
Au fur et à mesure de leur croissance et de leur développement, les entreprises peuvent éprouver le besoin de protéger les processus commerciaux au sein de leur système. Heureusement, Acumatica est livré avec une suite d'approbation complète native qui peut être configurée en fonction des 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 d Acumatica Framework et qui souhaitent bénéficier de la même fonctionnalité transparente que le système intégré d'Acumatica.
Cet article a pour but de vous fournir une marche à suivre 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 temps libre et de les soumettre pour approbation. Les demandes de temps seront ensuite examinées par le processus d'approbation intégré d'Acumatica et reflétées sur la carte de temps des employés en fonction de la configuration.
Page de configuration
Comme c'est souvent le cas lors de l'extension ou de la création de nouvelles fonctionnalités au sein d'Acumatica Framework, nous allons créer notre propre page de préférences pour gérer les configurations de notre fonctionnalité de demande de temps.
La page présentée dans l'image ci-dessous comporte une grille listant les entités à approuver et une case à cocher déterminant si les approbations sont activées pour les entités listées dans la grille. Un champ de séquence de numérotation est également défini, qui sera utilisé ultérieurement par la page de saisie des données de la demande de temps personnalisée.
Classes d'accès aux données
AATimeRequestSetup
Cette classe est mise en œuvre en tant que classe d'accès aux données d'installation pour la fonction Demande de temps elle contient un seul champ utilisé par le processus d'approbation TimeRequestApproval
GIST : https://gist.github.com/jvanhoesen/db449c52ae593efd0fc22b9b2939fd88
AATimeRequestApproval
La structure de ce DAC imite celle d'Acumaticas. EPSetupApproval d'Acumatic dans la base de données et devrait utiliser à la fois les tables IBqlTable et l'élément IAssignedMap et l'interface IAssignedMap.
GIST: https://gist.github.com/jvanhoesen/72198b26eabe422335f1b31e2e617902
Graphique
Le graphique de la page d'installation est simple et direct, et fait référence à deux classes d'accès aux données (Data-Access-Classes). classes d'accès aux données et utilisant un seul événement AATimeRequestSetup_FieldUpdated qui, lorsqu'il est déclenché, met à jour tous les enregistrements correspondants dans le champ AATRequestApproval de la vue AATRequestApproval.
GIST: https://gist.github.com/jvanhoesen/19bb75eab4aca39c1228a86e16c5261a
Page de saisie des données
La création d'une page de saisie de données est rendue plus complexe par la mise en œuvre de processus d'approbation. L'image ci-dessous montre l'interface utilisateur complétée pour la fonctionnalité de demande de temps. Cette page permet la création d'une demande de temps par un employé avec une répartition détaillée des heures de la demande. Ce document peut maintenant être mis en attente et soumis pour approbation.
GIST : https://gist.github.com/jvanhoesen/793901fada92c37aca0ec16d80c73f
Il s'agira des actions standard d'approbation et de rejet d' Acumatica dans le menu déroulant 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 classe Data-Access doit implémenter l'interface IAssign. Pour ce faire, il faut inclure les champs OwnerID et WorkGroupID dans la déclaration de la classe.
GIST: https://gist.github.com/jvanhoesen/825585aea3c9217199f81c9d12476ddf
Statut
Vous devez définir les valeurs d'état suivantes pour le paramètre statut 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 dans notre classe d'accès aux données pour savoir si l'enregistrement a été approuvé ou rejeté par l'utilisateur. Ces champs s'appelleront Approuvé et Rejeté.
IsApprover
Il s'agit d'un champ non sauvegardé dans la base de données qui est alimenté par des événements graphiques lors du chargement d'un enregistrement et qui détermine si l'utilisateur actuel est un approbateur valide pour l'entité.
Graphique
Le graphique de notre page de saisie des données est défini comme AATimeRequestEntry.Bien qu'il soit un peu plus complexe que notre page de configuration, sa logique est utilisée pour mettre à jour les statuts de la classe principale Data-Access. Cela fournit une logique d'approbation supplémentaire, encapsulée dans les classes d'aide Acumatica.
GIST : https://gist.github.com/jvanhoesen/7c438ef851ef1aac4bfa9af7c9cebf08
Automatisation de l'approbation de l'EPA
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 dans des structures faciles à utiliser.
Nous allons mettre en œuvre l'aide EPApprovalAutomation avec une déclaration de vue nommée Approbation et les arguments suivants :
SourceAssign - DAC primaire
Approuvé - Champ d'approbation du CED primaire
Rejeté - Champ de rejet du CED primaire
Hold - Champ de maintien du CNA primaire
SetupApproval - SetupApproval DAC
Actions
Vous devrez créer deux actions supplémentaires telles que définies ci-dessous :
Approuver - Met à jour le statut de l'entité à "Approuvé" et marque le drapeau "Approuvé" sur le CED principal comme vrai.
Rejeter - Met à jour le statut de l'entité sur "Rejeté" et marque l'indicateur "Rejeté" sur le CED principal comme vrai.
Evénements
Primary_DAC_RowSelecting - Détermine si les approbations sont activées, si c'est le cas, vérifie que l'utilisateur actuel est l'approbateur défini et remplit les champs suivants IsApprover en conséquence.
GIST : https://gist.github.com/jvanhoesen/8461bf6dd782b07f1f7f9713deddc49f
Primary_DAC_RowSelected - Active les boutons Approuver / Rejeter lorsqu'une entité passe en Approbation en attente ainsi que la désactivation des champs d'en-tête, à l'exception de la case à cocher Mise en attente lorsque l'entité n'est plus en attente.
GIST : https://gist.github.com/jvanhoesen/a385ca54d3f87a4694728f6c509c9a27
Primary_DAC_FieldUpdated - Définit l'entité comme étant en attente d'approbation lorsqu'elle est mise en attente, ou réinitialise les autres champs de statut lorsqu'un document est remis en attente.
GIST : https://gist.github.com/jvanhoesen/dcf6fe87eb6ae25a214a2657066301a6
EPApproval_RowInserting - Utilisé pour définir des informations supplémentaires sur l'enregistrement d'approbation pour l'approbateur.
GIST : https://gist.github.com/jvanhoesen/030ee7529c1bd8aa45da04166cfc059a
Ces informations supplémentaires peuvent également être fournies en ajoutant des événements CacheAttached au lieu de RowInserting, comme indiqué ci-dessous.
GIST : https://gist.github.com/jvanhoesen/14e9fdb4738f956f2b414d54ef27cc6b
Modification d'Acumatica
Extension du 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 d'apparaître dans la liste des types d'entités, mise en œuvre avec la page d'exemple AA306000 présentée ci-dessous.
GIST : https://gist.github.com/jvanhoesen/b3f688911bfd0375ed1dd8bd8b147884
Une fois que l'extension a été écrite et que la page est enregistrée dans le plan du site de l'instance, l'entité personnalisée devient disponible dans la liste déroulante Type d'entité, comme indiqué ci-dessous.
Configuration
Une fois que toutes les étapes ci-dessus ont été complétées, vous serez en mesure de définir une carte d'approbation pour votre entité personnalisée et d'utiliser le processus d'approbation propre au cadre Acumatica.
Conclusion
Bien que l'utilisation des fonctionnalités avancées d'Acumatica dans les pages personnalisées puisse parfois être décourageante, j'ai essayé de montrer à quel point cela peut être simple en suivant ces étapes simples :
- Créez une page de configuration qui détermine si les approbations sont actives pour l'entité personnalisée.
- Créer une page de saisie de données qui utilise et répond aux flux de travail d'approbation.
- Créer une extension de la page de correspondance d'approbation Acumatica pour permettre la définition d'entités personnalisées.
Grâce à la méthodologie que je vous ai présentée, vous pourrez vous aussi 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 protection et la capacité d'audit des données importantes du système spécifique du client - un must pour tout système ERP (Enterprise Resource Planning, ou Planification des ressources de l'entreprise) moderne.
Bon codage !