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.
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.
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 :
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.
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.
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 !