Accueil Blog Intégration du client REST API avec le module de fabrication d'Acumatica

Intégration du client REST API avec le module de fabrication d'Acumatica

Le cas d'utilisation de cet article est de créer un processus d'intégration unique qui peut créer des transactions d'inventaire, telles que des ajustements d'inventaire, et des transactions de fabrication, telles que l'entrée de main-d'œuvre, même si ces deux types de transactions sont définis dans des points de terminaison différents.
Diane Cawley | 13 décembre 2022

Intégration du client REST API avec le module de fabrication d'Acumatica

Introduction

La plupart des intégrations avec Acumatica qui utilisent l'API REST utilisent les modules financiers et de distribution standard, et donc le point de terminaison DEFAULT. Dans cet article, j'aimerais discuter de l'utilisation du client Acumatica REST API pour C# et des différentes transactions qui peuvent être traitées en utilisant le point de terminaison MANUFACTURING.

Dans cet article, le code sera un projet C# qui fait référence à Acumatica.RESTClient.dll. La version d'Acumatica utilisée dans le code est la version 2022 R2.

Intégration des modules de fabrication

Lors de l'intégration d'une application tierce avec le module de fabrication, plusieurs transactions sont fréquemment nécessaires :

  • Questions matérielles
  • Déplacer l'entrée
  • Entrée sur le marché du travail

Le cas d'utilisation de cet article est de créer un processus d'intégration unique qui peut créer des transactions d'inventaire, telles que des ajustements d'inventaire, et des transactions de fabrication, telles que l'entrée de main-d'œuvre, même si ces deux types de transactions sont définis dans des points de terminaison différents.

Pour commencer, vous pouvez télécharger le dépôt GitHub correspondant à ce lien:

Ce dépôt GitHub contient des informations intéressantes, notamment un exemple d'application console. Le fichier readme.md contient également une explication rapide du contenu de ce dépôt.

J'ai créé une solution Visual Studio et installé les paquets NuGet suivants :

  • JsonSubTypes (>= 1.8.0)
  • Newtonsoft.Json (>= 13.0.1)
  • RestSharp (>= 107.1.1)
  • System.Text.Json (>= 6.0.1)

Ensuite, j'ai installé les 3 packages NuGet d'Acumatica spécifiquement nécessaires à l'intégration d'Acumatica. J'ai choisi les versions les plus récentes dans tous les cas.

Intégration du client REST API avec le module de fabrication d'Acumatica

Une fois que ces paquets sont en place, l'étape suivante consiste à ajouter les déclarations "using". Notez que je veux inclure les références Acumatica.Default....et Acumatica.Manufacturing....car j'ai besoin que les deux points de terminaison soient disponibles.

GIST

Dans les sessions de formation de l'Université Acumatica, I310, I320 et I330, les exemples sont tous montrés en utilisant des appels Postman. Bien que cela fonctionne, cela prend du temps et n'est pas très élégant de configurer les commandes REST et de les exécuter strictement avec des appels HTTPS. Étant donné que les espaces de noms Api et Model sont utilisés dans notre solution, nous pouvons tirer parti de la sérialisation et rendre le code beaucoup plus lisible.

Notre première tâche consiste à créer puis à valider une transaction d'ajustement des stocks. L'appel de Postman pour créer la transaction est un PUT de base et ressemble à ceci :

Intégration du client REST API avec le module de fabrication d'Acumatica

Cependant, en utilisant le RESTClient, nous pouvons utiliser les modèles associés au point de terminaison DEFAULT, qui dans ce cas est le point de terminaison InventoryAdjusment et le modèle InventoryAdjustmentDetail.

Pour se connecter, nous instancions l'authApi, puis nous demandons un AccessToken en utilisant l'identifiant et le secret du client de l' application connectée, ainsi qu'un identifiant et un mot de passe valides.

GIST

Si nous regardons le fichier journal des requêtes, qui est généré par le client RESTC, nous pouvons voir qu'après la création du jeton, la commande PUT est configurée pour correspondre à ce que nous avons vu dans Postman, et l'action de libération est exécutée en tant que commande POST. Notez que l'URL de la commande a été automatiquement générée à l'adresse DEFAULT appropriée. Ceci est dû à l'utilisation de l InventoryAdjustmentApi .

Demande

Méthode : Mettre

URL : ceci

Body: {"Date":{"value":"2022-12-22T00:00:00"},"Details":[{"InventoryID":{"value":"AALEGO500"},"LocationID":{"value":"R1S1"},"LotSerialNbr":{"value":""},"Qty":{"value":7.000000},"ReasonCode":{"value":"INADJUST"},"UOM":{"value":"EA             "},"WarehouseID":{"value":"WHOLESALE"}}],"Hold":{"value":false}}

--------------

Réponse

Code d'état : OK

Content: {"id":"1e0607b7-7a86-ed11-8688-020017045e71","rowNumber":1,"note":{"value":""},"Date":{"value":"2022-12-22T00:00:00+00:00"},"Details":[],"Hold":{"value":false},"ReferenceNbr":{"value":"000159"},"custom":{},"_links":{"self":"/AcumaticaDB2022R2/entity/Default/22.200.001/InventoryAdjustment/1e0607b7-7a86-ed11-8688-020017045e71","files:put":"/AcumaticaDB2022R2/entity/Default/22.200.001/files/PX.Objects.IN.INAdjustmentEntry/adjustment/1e0607b7-7a86-ed11-8688-020017045e71/{filename}"}}

--------------

Demande

Méthode : Poste

Body: {"entity":{"Date":{"value":"2022-12-21T17:00:00-07:00"},"Details":[],"Hold":{"value":false},"ReferenceNbr":{"value":"000159"},"note":{"value":""},"id":"1e0607b7-7a86-ed11-8688-020017045e71","rowNumber":1,"custom":{}}}

--------------

Réponse

Code d'état : Accepté

Contenu :

--------------

Nous voulons maintenant créer une transaction de travail de fabrication, basée sur les données de la base de données tierce. Dans cet exemple, nous créons les objets LaborEntry et LaborEntryDetail, avec les champs de données appropriés. Ensuite, nous enregistrons la transaction à l'aide d'une commande PUT et nous la libérons à l'aide d'une commande POST.

En utilisant le même objet de configuration que lors de la connexion initiale, et donc le même jeton que dans l'exemple de l'ajustement des stocks, le code est le suivant. Remarquez qu'il y a deux différences intéressantes : (1) le temps de travail doit être formaté en HH:MM (ou DD:HH:MM si plus de 24 heures) ; et (2) cet exemple inclut également le remplissage d'un attribut de l'ordre de fabrication appelé MACHINE.

GIST

Voici le journal des requêtes associé à la transaction ci-dessus (moins le POST). Voyez comment l'URL est configurée pour regarder le point de terminaison MANUFACTURING au lieu de DEFAULT, comme c'était le cas avec l'ajustement de l'inventaire. Cela n'a pas nécessité de code spécifique dans l'application principale elle-même. Le RESTClient s'est chargé de ce détail.

Demande

Méthode : Mettre

URL : https://acu.savantwmscloud.com/

Body: {"Date":{"value":"2022-12-27T00:00:00"},"Description":{"value":"Labor"}, "Details":[{"EmployeeID":{"value":"EP00000002"},"LaborTime":{"value":"00:05"},"LaborType":{"value":"Direct"},"Location":{"value":"1"},"LotSerialNbr":{"value":""},"OperationNbr":{"value":"0010"},"OrderType":{"value":"RO"},"ProductionNbr":{"value":"AM000002"},"Quantity":{"value":1.0},"Shift":{"value":"0001"},"Warehouse":{"value":"WHOLESALE"}}],"Hold":{"value":true}}

--------------

Réponse

Code d'état : OK

Content: {"id":"ca4b97c9-7b86-ed11-8688-020017045e71","rowNumber":1,"note":null,"BatchNbr":{"value":"AMB000040"},"Date":{"value":"2022-12-27T00:00:00+00:00"},"Description":{"value":"Labor"}, "Details":[],"Hold":{"value":true},"custom":{},"_links":{"self":"/AcumaticaDB2022R2/entity/MANUFACTURING/21.200.001/LaborEntry/ca4b97c9-7b86-ed11-8688-020017045e71","files:put":"/AcumaticaDB2022R2/entity/MANUFACTURING/21.200.001/files/PX.Objects.AM.LaborEntry/batch/ca4b97c9-7b86-ed11-8688-020017045e71/{filename}"}}

--------------

Demande

Méthode : Mettre

URL : https://acu.savantwmscloud.com/

Body: {"BatchNbr":{"value":"AMB000040"},"Date":{"value":"2022-12-26T17:00:00-07:00"},"Description":{"value":"Labor"},"Details":[],"Hold":{"value":false},"id":"ca4b97c9-7b86-ed11-8688-020017045e71","rowNumber":1,"custom":{}}

--------------

Réponse

Code d'état : OK

Content: {"id":"ca4b97c9-7b86-ed11-8688-020017045e71","rowNumber":1,"note":null,"BatchNbr":{"value":"AMB000040"},"Date":{"value":"2022-12-27T00:00:00+00:00"},"Description":{"value":"Labor"},"Hold":{"value":false},"custom":{},"_links":{"self":"/AcumaticaDB2022R2/entity/MANUFACTURING/21.200.001/LaborEntry/ca4b97c9-7b86-ed11-8688-020017045e71","files:put":"/AcumaticaDB2022R2/entity/MANUFACTURING/21.200.001/files/PX.Objects.AM.LaborEntry/batch/ca4b97c9-7b86-ed11-8688-020017045e71/{filename}"}}

--------------

Conclusion

L'utilisation de RESTClient dans votre code d'intégration peut éliminer beaucoup d'efforts manuels dans le formatage des appels à l'API REST, et en utilisant les modèles pour les points de terminaison DEFAULT ou MANUFACTURING, il y a moins de place pour l'erreur parce que les types de données et les champs sont déjà définis. Il est facile d'utiliser plusieurs définitions de points de terminaison dans un seul ensemble de code, et le client RESTC triera l'URL et le corps appropriés pour les appels à l'API REST sans qu'il soit nécessaire de demander plusieurs jetons. L'utilisation d'un seul jeton réduira le nombre de sessions de connexion simultanées et le nombre total d'appels API à Acumatica. Ceci est également important en raison des restrictions de licence d'Acumatica.

Bon codage !

Articles connexes

Auteur du blog

Diane Cawley est cofondatrice et architecte en chef de Savant Software, qui fournit des solutions pour la chaîne d'approvisionnement depuis 1995. Elle est titulaire d'une licence en informatique et d'un MBA de l'Arizona State University. Elle dirige les équipes de développement et de mise en œuvre et est responsable de l'évolution continue du produit ainsi que de son intégration avec des systèmes ERP tels qu'Acumatica. Diane est MVP Acumatica depuis 2018. Elle a participé à tous les Hackathon annuels à ce jour. Elle travaille avec le cadre Acumatica en se concentrant sur les API depuis la version 5.1 et a développé plusieurs intégrations complexes entre le WMS de Savant et Acumatica. En dehors du travail, Diane et son mari aiment voyager à travers le monde et apprendre de nouvelles choses en participant à diverses rencontres - en particulier celles liées à l'IoT et à la robotique.

Recevez les mises à jour du blog dans votre boîte de réception.