Inicio Blog Integración mediante el cliente API REST con el módulo de fabricación de Acumatica

Integración mediante el cliente API REST con el módulo de fabricación de Acumatica

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.
Diane Cawley | 13 de diciembre de 2022

Integración mediante el cliente API REST con el módulo de fabricación de Acumatica

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.

Integración mediante el cliente API REST con el módulo de fabricación de Acumatica

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.

GIST

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:

Integración mediante el cliente API REST con el módulo de fabricación de Acumatica

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.

GIST

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.

GIST

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!

Entradas relacionadas

Autor del blog

Diane Cawley es cofundadora y arquitecta jefe de Savant Software, que ofrece soluciones para la cadena de suministro desde 1995. Es licenciada en Informática y MBA por la Universidad Estatal de Arizona. Dirige los equipos de desarrollo e implantación y es responsable de la evolución continua del producto, así como de su integración con sistemas ERP como Acumatica. Diane es MVP de Acumatica desde 2018. Ha participado en todos los Hackathon anuales hasta la fecha. Ella ha estado trabajando con el marco de Acumatica con una concentración en API desde la versión 5.1 y ha desarrollado varias integraciones complejas entre WMS de Savant y Acumatica. Fuera del trabajo, Diane y su marido disfrutan viajando por el mundo y aprendiendo cosas nuevas asistiendo a varios encuentros, especialmente los relacionados con IoT y robótica.

Reciba las actualizaciones del blog en su bandeja de entrada.