Introducción
La mayoría de las integraciones con Acumatica que utilizan la API REST utilizan los módulos financieros y de distribución estándar y, por lo tanto, el punto final DEFAULT. En este artículo, me gustaría hablar sobre el uso del cliente de la API REST de Acumatica para C# y las diversas transacciones que se pueden procesar utilizando el punto final MANUFACTURING.
En este artículo, el código será un proyecto C# que hace referencia a Acumatica.RESTClient.dll. La versión de Acumatica utilizada en el código corresponde a la versión 2022 R2.
Integración de módulos de fabricación
Al integrar una aplicación de terceros con el módulo de fabricación, hay varias transacciones que se necesitan con frecuencia:
- Cuestiones materiales
- Mover entrada
- Entrada laboral
El caso de uso para este artículo es crear un único proceso de integración que pueda crear transacciones de inventario, como ajustes de inventario, y transacciones de fabricación, como entrada de mano de obra, aunque estos dos tipos de transacciones se definan en diferentes puntos finales.
Para empezar, puede descargar primero el repositorio de GitHub relacionado en este enlace:
Hay alguna información interesante en este repositorio de GitHub, incluyendo un ejemplo de Aplicación de Consola. El archivo readme.md contiene una explicación rápida de los contenidos de este repositorio también.
He creado una solución de Visual Studio y he instalado los siguientes paquetes NuGet:
- JsonSubTypes (>= 1.8.0)
- Newtonsoft.Json (>= 13.0.1)
- RestSharp (>= 107.1.1)
- System.Text.Json (>= 6.0.1)
A continuación, instalé los 3 paquetes NuGet de Acumatica necesarios específicamente para la integración de Acumatica. Elegí las versiones más recientes en todos los casos.
Una vez que estos paquetes están en su lugar, el siguiente paso es añadir las declaraciones "using". Ten en cuenta que quiero incluir las referencias Acumatica.Default....y Acumatica.Manufacturing...., ya que necesito que ambos endpoints estén disponibles.
En las sesiones de formación de Acumatica University, I310, I320 e I330, todos los ejemplos se muestran utilizando llamadas Postman. Si bien esto funciona, lleva mucho tiempo y no es muy elegante configurar los comandos REST y ejecutarlos estrictamente con llamadas HTTPS. Dado que en nuestra solución se utilizan los espacios de nombres Endpoint Api y Model, podemos aprovechar la serialización y hacer el código mucho más legible.
Nuestra primera tarea es crear y luego liberar una transacción de Ajuste de Inventario. La llamada de Postman para crear la transacción es un PUT básico y tiene el siguiente aspecto:
Sin embargo, al utilizar el RESTClient, podemos utilizar los Modelos asociados con el endpoint DEFAULT; que en este caso es el endpoint InventoryAdjusment y el modelo InventoryAdjustmentDetail.
Para iniciar sesión, instanciamos la authApi, luego solicitamos un AccessToken utilizando el ClientID y Secret de la aplicación conectada, junto con un ID de usuario y contraseña válidos.
Si nos fijamos en el archivo de registro de solicitudes, que es generado por el RESTClient, podemos ver que después de que se crea el token, el comando PUT se configura para que coincida con lo que estábamos viendo en Postman, y la acción de liberación se ejecuta como un comando POST. Observe que la URL del comando se generó automáticamente con la dirección de endpoint DEFAULT apropiada. Esto se debe a la InventoryAdjustmentApi .
Solicitar
Método: Poner
URL: this
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}}
--------------
Respuesta
Código de estado: 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}"}}
--------------
Solicitar
Método 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":{}}}
--------------
Respuesta
Código de estado: Aceptado
Contenido:
--------------
Así que ahora, queremos crear una transacción de Mano de Obra de Manufactura, basada en datos de la base de datos de terceros. En este ejemplo, creamos los objetos LaborEntry y LaborEntryDetail, con los campos de datos apropiados. Luego guardamos la transacción usando un comando PUT y la liberamos usando POST.
Utilizando el mismo objeto de configuración del login inicial, y por tanto el mismo token que en el ejemplo de Ajuste de Inventario, el código es el siguiente. Note que hay dos diferencias interesantes (1) el Tiempo de Trabajo debe ser formateado a HH:MM (o DD:HH:MM si es más de 24 horas); y (2) este ejemplo también incluye rellenar un atributo en la Orden de Producción llamado MÁQUINA.
Aquí está el Registro de Solicitudes asociado para la transacción anterior (menos el POST). Vea cómo la URL está configurada para buscar en el endpoint de MANUFACTURING en lugar de en el DEFAULT, que era el caso con el Ajuste de Inventario. Esto no requirió ningún código específico dentro de la propia aplicación principal. El RESTClient se encargó de este detalle.
Solicitar
Método: Poner
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}}
--------------
Respuesta
Código de estado: 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}"}}
--------------
Solicitar
Método: Poner
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":{}}
--------------
Respuesta
Código de estado: 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}"}}
--------------
Conclusión
El uso de RESTClient en su código de integración puede eliminar mucho esfuerzo manual a la hora de dar formato a las llamadas a la API REST, y al utilizar los modelos para los puntos finales DEFAULT o MANUFACTURING, hay menos margen de error porque los tipos de datos y los campos ya están definidos. Es fácil utilizar varias definiciones de puntos finales en un conjunto de código, y RESTClient ordenará la URL y el cuerpo adecuados para las llamadas a la API REST sin necesidad de solicitar varios tokens. El uso de un único token reducirá el número de sesiones de inicio de sesión simultáneas y reducirá el número total de llamadas de API a Acumatica. Esto también es importante debido a las restricciones de licencia de Acumatica.
¡Feliz codificación!