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, je voudrais discuter de l’utilisation du client API REST Acumatica pour C # et des différentes transactions qui peuvent être traitées à l’aide du point de terminaison MANUFACTURING.
Dans cet article, le code sera un projet C # qui fait référence à l’Acumatica.RESTClient.dll. La version Acumatica utilisée dans le code est pour la version 2022 R2.
Intégration du module de fabrication
Lors de l’intégration d’une application tierce au module de fabrication, plusieurs transactions sont souvent nécessaires :
- Questions importantes
- Déplacer l’entrée
- Entrée dans la main-d’œuvre
Le cas d’utilisation de cet article consiste à créer un processus d’intégration unique qui peut créer des transactions d’inventaire, telles que des ajustements de stock et des transactions de fabrication, telles que la saisie 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 d’abord télécharger le référentiel GitHub connexe à ce lien:
Il y a quelques informations intéressantes dans ce référentiel GitHub, y compris un exemple d’application console. Le fichier readme.md contient également une explication rapide du contenu de ce référentiel.
J’ai créé une solution Visual Studio et installé les packages 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 paquets Acumatica NuGet 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 packages sont en place, l’étape suivante consiste à ajouter les instructions « en utilisant ». Notez que je veux inclure à la fois l’Acumatica.Default.... et Acumatica.Manufacturing.... références 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 à l’aide d’appels postiers. Bien que cela fonctionne, il est long et peu é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 du point de terminaison 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 à publier une transaction d’ajustement de stock. L’appel du facteur pour créer la transaction est un PUT de base et ressemble à ceci:
Toutefois, à l’aide de RESTClient, nous pouvons utiliser les modèles associés au point de terminaison DEFAULT ; qui dans ce cas est l’InventoryAdjusment et le InventoryAdjustmentDetail.
Pour nous connecter, nous instancions l’authApi, puis demandons un AccessToken à l’aide de l’id client et du secret de l’application connectée, ainsi qu’un nom d’utilisateur et un mot de passe valides.
Si nous regardons le fichier journal des demandes, qui est généré par RESTClient, nous pouvons voir qu’après la création du jeton, la commande PUT est configurée pour correspondre à ce que nous voyions dans Postman, et l’action release 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 de point de terminaison DEFAULT appropriée. Cela est dû à l’objet 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: Post
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 :
—————————————–
Alors maintenant, nous voulons créer une transaction de main-d’œuvre manufacturière, 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 la libérons à l’aide du POST.
En utilisant le même objet de configuration de la connexion initiale, et donc le même jeton que dans l’exemple d’ajustement d’inventaire, le code est ci-dessous. Notez qu’il y a deux différences intéressantes: (1) le temps de travail doit être formaté en HH: MM (ou JJ: HH: MM si plus de 24 heures); et (2) cet exemple inclut également le remplissage d’un attribut sur l’ordre de fabrication appelé MACHINE.
Voici le journal des demandes associé pour la transaction ci-dessus (moins le POST). Voyez comment l’URL est configurée pour regarder le point de terminaison DE FABRICATION au lieu du PAR DÉFAUT, ce qui était le cas avec l’ajustement de stock. Cela ne nécessitait aucun code spécifique dans l’application principale elle-même. Le RESTClient s’est occupé 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 la mise en forme des appels d’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 car les types de données et les champs sont déjà définis. Il est facile d’utiliser plusieurs définitions de point de terminaison dans un ensemble de code, et le RESTClient triera l’URL et le corps appropriés pour les appels d’API REST sans avoir besoin de demander plusieurs jetons. L’utilisation d’un seul jeton réduira le nombre de sessions de connexion simultanées et réduira le nombre total d’appels d’API à Acumatica. Ceci est également important en raison des restrictions de licence Acumatica.
Bon codage!