@machinemetrics/mm-erp-sdk 0.1.9-beta.2 → 0.1.9-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/dist/index.d.ts +42 -42
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +48 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/knexfile.d.ts.map +1 -1
  6. package/dist/knexfile.js +19 -0
  7. package/dist/knexfile.js.map +1 -0
  8. package/dist/migrations/20241015162631_create_cache_table.d.ts +4 -0
  9. package/dist/migrations/20241015162631_create_cache_table.d.ts.map +1 -0
  10. package/dist/migrations/20241015162631_create_cache_table.js +11 -15
  11. package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
  12. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +4 -0
  13. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +1 -0
  14. package/dist/migrations/20241015162632_create_sdk_cache_table.js +11 -15
  15. package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
  16. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +4 -0
  17. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +1 -0
  18. package/dist/migrations/20250103162631_create_record_tracking_table.js +14 -15
  19. package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
  20. package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
  21. package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
  22. package/dist/services/caching-service/batch-cache-manager.js +84 -0
  23. package/dist/services/caching-service/batch-cache-manager.js.map +1 -0
  24. package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
  25. package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
  26. package/dist/services/caching-service/hashed-cache-manager.js +223 -0
  27. package/dist/services/caching-service/hashed-cache-manager.js.map +1 -0
  28. package/dist/services/caching-service/index.d.ts +1 -1
  29. package/dist/services/caching-service/index.d.ts.map +1 -1
  30. package/dist/services/caching-service/index.js +2 -0
  31. package/dist/services/caching-service/index.js.map +1 -0
  32. package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
  33. package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
  34. package/dist/services/caching-service/record-tracking-manager.js +28 -0
  35. package/dist/services/caching-service/record-tracking-manager.js.map +1 -0
  36. package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
  37. package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
  38. package/dist/services/data-sync-service/configuration-manager.js +163 -0
  39. package/dist/services/data-sync-service/configuration-manager.js.map +1 -0
  40. package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
  41. package/dist/services/data-sync-service/data-sync-service.js +95 -0
  42. package/dist/services/data-sync-service/data-sync-service.js.map +1 -0
  43. package/dist/services/data-sync-service/index.d.ts +3 -3
  44. package/dist/services/data-sync-service/index.d.ts.map +1 -1
  45. package/dist/services/data-sync-service/index.js +10 -0
  46. package/dist/services/data-sync-service/index.js.map +1 -0
  47. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -39
  48. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
  49. package/dist/services/data-sync-service/jobs/from-erp.js +48 -43
  50. package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
  51. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +36 -35
  52. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
  53. package/dist/services/data-sync-service/jobs/run-migrations.js +22 -21
  54. package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
  55. package/dist/services/data-sync-service/jobs/to-erp.js +48 -42
  56. package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
  57. package/dist/services/erp-api-services/errors.d.ts +1 -1
  58. package/dist/services/erp-api-services/errors.d.ts.map +1 -1
  59. package/dist/services/erp-api-services/errors.js +83 -0
  60. package/dist/services/erp-api-services/errors.js.map +1 -0
  61. package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
  62. package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
  63. package/dist/services/erp-api-services/graphql/graphql-service.js +102 -0
  64. package/dist/services/erp-api-services/graphql/graphql-service.js.map +1 -0
  65. package/dist/services/erp-api-services/graphql/types.js +6 -0
  66. package/dist/services/erp-api-services/graphql/types.js.map +1 -0
  67. package/dist/services/erp-api-services/index.d.ts +8 -8
  68. package/dist/services/erp-api-services/index.d.ts.map +1 -1
  69. package/dist/services/erp-api-services/index.js +13 -0
  70. package/dist/services/erp-api-services/index.js.map +1 -0
  71. package/dist/services/erp-api-services/oauth-client.js +41 -0
  72. package/dist/services/erp-api-services/oauth-client.js.map +1 -0
  73. package/dist/services/erp-api-services/rest/get-query-params.js +23 -0
  74. package/dist/services/erp-api-services/rest/get-query-params.js.map +1 -0
  75. package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
  76. package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
  77. package/dist/services/erp-api-services/rest/rest-api-service.js +163 -0
  78. package/dist/services/erp-api-services/rest/rest-api-service.js.map +1 -0
  79. package/dist/services/erp-api-services/types.d.ts +2 -2
  80. package/dist/services/erp-api-services/types.d.ts.map +1 -1
  81. package/dist/services/erp-api-services/types.js +2 -0
  82. package/dist/services/erp-api-services/types.js.map +1 -0
  83. package/dist/services/mm-api-service/index.d.ts +6 -6
  84. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  85. package/dist/services/mm-api-service/index.js +15 -0
  86. package/dist/services/mm-api-service/index.js.map +1 -0
  87. package/dist/services/mm-api-service/mm-api-service.d.ts +7 -7
  88. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  89. package/dist/services/mm-api-service/mm-api-service.js +519 -0
  90. package/dist/services/mm-api-service/mm-api-service.js.map +1 -0
  91. package/dist/services/mm-api-service/token-mgr.js +113 -0
  92. package/dist/services/mm-api-service/token-mgr.js.map +1 -0
  93. package/dist/services/mm-api-service/types/checkpoint.js +2 -0
  94. package/dist/services/mm-api-service/types/checkpoint.js.map +1 -0
  95. package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
  96. package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
  97. package/dist/services/mm-api-service/types/entity-transformer.js +186 -0
  98. package/dist/services/mm-api-service/types/entity-transformer.js.map +1 -0
  99. package/dist/services/mm-api-service/types/mm-response-interfaces.js +34 -0
  100. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +1 -0
  101. package/dist/services/mm-api-service/types/receive-types.js +55 -0
  102. package/dist/services/mm-api-service/types/receive-types.js.map +1 -0
  103. package/dist/services/mm-api-service/types/send-types.js +337 -0
  104. package/dist/services/mm-api-service/types/send-types.js.map +1 -0
  105. package/dist/services/psql-erp-service/configuration.js +2 -0
  106. package/dist/services/psql-erp-service/configuration.js.map +1 -0
  107. package/dist/services/psql-erp-service/index.d.ts +3 -3
  108. package/dist/services/psql-erp-service/index.d.ts.map +1 -1
  109. package/dist/services/psql-erp-service/index.js +10 -0
  110. package/dist/services/psql-erp-service/index.js.map +1 -0
  111. package/dist/services/psql-erp-service/internal/types/psql-types.js +5 -0
  112. package/dist/services/psql-erp-service/internal/types/psql-types.js.map +1 -0
  113. package/dist/services/psql-erp-service/psql-helpers.js +99 -0
  114. package/dist/services/psql-erp-service/psql-helpers.js.map +1 -0
  115. package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
  116. package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
  117. package/dist/services/psql-erp-service/psql-service.js +187 -0
  118. package/dist/services/psql-erp-service/psql-service.js.map +1 -0
  119. package/dist/services/reporting-service/index.d.ts +1 -1
  120. package/dist/services/reporting-service/index.d.ts.map +1 -1
  121. package/dist/services/reporting-service/index.js +5 -0
  122. package/dist/services/reporting-service/index.js.map +1 -0
  123. package/dist/services/reporting-service/logger.js +217 -0
  124. package/dist/services/reporting-service/logger.js.map +1 -0
  125. package/dist/services/sql-server-erp-service/configuration.js +2 -0
  126. package/dist/services/sql-server-erp-service/configuration.js.map +1 -0
  127. package/dist/services/sql-server-erp-service/index.d.ts +3 -3
  128. package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
  129. package/dist/services/sql-server-erp-service/index.js +11 -0
  130. package/dist/services/sql-server-erp-service/index.js.map +1 -0
  131. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
  132. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
  133. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +50 -0
  134. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +1 -0
  135. package/dist/services/sql-server-erp-service/internal/sql-server-config.js +40 -0
  136. package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +1 -0
  137. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +36 -0
  138. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +1 -0
  139. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +2 -0
  140. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +1 -0
  141. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
  142. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
  143. package/dist/services/sql-server-erp-service/sql-server-helpers.js +66 -0
  144. package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +1 -0
  145. package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
  146. package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
  147. package/dist/services/sql-server-erp-service/sql-server-service.js +154 -0
  148. package/dist/services/sql-server-erp-service/sql-server-service.js.map +1 -0
  149. package/dist/services/sql-server-erp-service/types/sql-input-param.js +2 -0
  150. package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +1 -0
  151. package/dist/services/sqlite-service/index.d.ts +1 -1
  152. package/dist/services/sqlite-service/index.d.ts.map +1 -1
  153. package/dist/services/sqlite-service/index.js +2 -0
  154. package/dist/services/sqlite-service/index.js.map +1 -0
  155. package/dist/services/sqlite-service/sqlite-coordinator.js +60 -0
  156. package/dist/services/sqlite-service/sqlite-coordinator.js.map +1 -0
  157. package/dist/types/erp-connector.d.ts +1 -1
  158. package/dist/types/erp-connector.d.ts.map +1 -1
  159. package/dist/types/erp-connector.js +2 -0
  160. package/dist/types/erp-connector.js.map +1 -0
  161. package/dist/types/erp-types.js +13 -0
  162. package/dist/types/erp-types.js.map +1 -0
  163. package/dist/types/index.d.ts +2 -2
  164. package/dist/types/index.d.ts.map +1 -1
  165. package/dist/types/index.js +6 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/utils/application-initializer.js +55 -0
  168. package/dist/utils/application-initializer.js.map +1 -0
  169. package/dist/utils/cleanup-numbers.js +6 -0
  170. package/dist/utils/cleanup-numbers.js.map +1 -0
  171. package/dist/utils/connector-factory.d.ts +1 -1
  172. package/dist/utils/connector-factory.d.ts.map +1 -1
  173. package/dist/utils/connector-factory.js +34 -0
  174. package/dist/utils/connector-factory.js.map +1 -0
  175. package/dist/utils/connector-log/log-deduper.d.ts +1 -1
  176. package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
  177. package/dist/utils/connector-log/log-deduper.js +240 -0
  178. package/dist/utils/connector-log/log-deduper.js.map +1 -0
  179. package/dist/utils/connector-log/mm-connector-logger-example.d.ts +1 -0
  180. package/dist/utils/connector-log/mm-connector-logger-example.js +88 -0
  181. package/dist/utils/connector-log/mm-connector-logger-example.js.map +1 -0
  182. package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
  183. package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
  184. package/dist/utils/connector-log/mm-connector-logger.js +151 -0
  185. package/dist/utils/connector-log/mm-connector-logger.js.map +1 -0
  186. package/dist/utils/data-transformation.js +38 -0
  187. package/dist/utils/data-transformation.js.map +1 -0
  188. package/dist/utils/erp-type-from-entity.d.ts +1 -1
  189. package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
  190. package/dist/utils/erp-type-from-entity.js +6 -0
  191. package/dist/utils/erp-type-from-entity.js.map +1 -0
  192. package/dist/utils/error-utils.js +21 -0
  193. package/dist/utils/error-utils.js.map +1 -0
  194. package/dist/utils/http-client.js +186 -0
  195. package/dist/utils/http-client.js.map +1 -0
  196. package/dist/utils/index.d.ts +33 -33
  197. package/dist/utils/index.d.ts.map +1 -1
  198. package/dist/utils/index.js +65 -0
  199. package/dist/utils/index.js.map +1 -0
  200. package/dist/utils/local-data-store/database-lock.js +68 -0
  201. package/dist/utils/local-data-store/database-lock.js.map +1 -0
  202. package/dist/utils/local-data-store/jobs-shared-data.js +116 -0
  203. package/dist/utils/local-data-store/jobs-shared-data.js.map +1 -0
  204. package/dist/utils/mm-labor-ticket-helpers.d.ts +1 -1
  205. package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
  206. package/dist/utils/mm-labor-ticket-helpers.js +23 -0
  207. package/dist/utils/mm-labor-ticket-helpers.js.map +1 -0
  208. package/dist/utils/removeExtraneousFields.d.ts +1 -1
  209. package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
  210. package/dist/utils/removeExtraneousFields.js +16 -0
  211. package/dist/utils/removeExtraneousFields.js.map +1 -0
  212. package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
  213. package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
  214. package/dist/utils/removeIdFieldFromPayload.js +16 -0
  215. package/dist/utils/removeIdFieldFromPayload.js.map +1 -0
  216. package/dist/utils/resource-group.d.ts +1 -1
  217. package/dist/utils/resource-group.d.ts.map +1 -1
  218. package/dist/utils/resource-group.js +59 -0
  219. package/dist/utils/resource-group.js.map +1 -0
  220. package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
  221. package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
  222. package/dist/utils/standard-process-drivers/error-processor.js +262 -0
  223. package/dist/utils/standard-process-drivers/error-processor.js.map +1 -0
  224. package/dist/utils/standard-process-drivers/index.d.ts +3 -3
  225. package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
  226. package/dist/utils/standard-process-drivers/index.js +4 -0
  227. package/dist/utils/standard-process-drivers/index.js.map +1 -0
  228. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
  229. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  230. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +164 -0
  231. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +1 -0
  232. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +4 -4
  233. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  234. package/dist/utils/standard-process-drivers/mm-entity-processor.js +168 -0
  235. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +1 -0
  236. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +4 -4
  237. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  238. package/dist/utils/standard-process-drivers/standard-process-drivers.js +324 -0
  239. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +1 -0
  240. package/dist/utils/time-utils.js +96 -0
  241. package/dist/utils/time-utils.js.map +1 -0
  242. package/dist/utils/timezone.js +105 -0
  243. package/dist/utils/timezone.js.map +1 -0
  244. package/dist/utils/trimObjectValues.js +11 -0
  245. package/dist/utils/trimObjectValues.js.map +1 -0
  246. package/dist/utils/uniqueRows.js +35 -0
  247. package/dist/utils/uniqueRows.js.map +1 -0
  248. package/package.json +5 -6
  249. package/src/index.ts +42 -42
  250. package/src/knexfile.ts +1 -0
  251. package/src/services/caching-service/batch-cache-manager.ts +2 -2
  252. package/src/services/caching-service/hashed-cache-manager.ts +5 -5
  253. package/src/services/caching-service/index.ts +1 -1
  254. package/src/services/caching-service/record-tracking-manager.ts +2 -2
  255. package/src/services/data-sync-service/configuration-manager.ts +2 -2
  256. package/src/services/data-sync-service/data-sync-service.ts +9 -3
  257. package/src/services/data-sync-service/index.ts +3 -3
  258. package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +3 -3
  259. package/src/services/data-sync-service/jobs/from-erp.ts +3 -3
  260. package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +2 -2
  261. package/src/services/data-sync-service/jobs/run-migrations.ts +2 -2
  262. package/src/services/data-sync-service/jobs/to-erp.ts +2 -2
  263. package/src/services/erp-api-services/errors.ts +3 -3
  264. package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
  265. package/src/services/erp-api-services/index.ts +8 -8
  266. package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
  267. package/src/services/erp-api-services/types.ts +2 -2
  268. package/src/services/mm-api-service/index.ts +6 -6
  269. package/src/services/mm-api-service/mm-api-service.ts +10 -10
  270. package/src/services/mm-api-service/token-mgr.ts +4 -4
  271. package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
  272. package/src/services/psql-erp-service/index.ts +3 -3
  273. package/src/services/psql-erp-service/psql-service.ts +4 -4
  274. package/src/services/reporting-service/index.ts +1 -1
  275. package/src/services/sql-server-erp-service/index.ts +3 -3
  276. package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
  277. package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
  278. package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
  279. package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
  280. package/src/services/sqlite-service/index.ts +1 -1
  281. package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
  282. package/src/types/erp-connector.ts +1 -1
  283. package/src/types/index.ts +2 -2
  284. package/src/utils/application-initializer.ts +5 -5
  285. package/src/utils/connector-factory.ts +2 -2
  286. package/src/utils/connector-log/log-deduper.ts +2 -2
  287. package/src/utils/connector-log/mm-connector-logger.ts +3 -3
  288. package/src/utils/erp-type-from-entity.ts +1 -1
  289. package/src/utils/http-client.ts +1 -1
  290. package/src/utils/index.ts +33 -33
  291. package/src/utils/local-data-store/database-lock.ts +1 -1
  292. package/src/utils/mm-labor-ticket-helpers.ts +2 -2
  293. package/src/utils/removeExtraneousFields.ts +1 -1
  294. package/src/utils/removeIdFieldFromPayload.ts +1 -1
  295. package/src/utils/resource-group.ts +2 -2
  296. package/src/utils/standard-process-drivers/error-processor.ts +5 -5
  297. package/src/utils/standard-process-drivers/index.ts +3 -3
  298. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +6 -6
  299. package/src/utils/standard-process-drivers/mm-entity-processor.ts +7 -7
  300. package/src/utils/standard-process-drivers/standard-process-drivers.ts +6 -6
  301. package/src/utils/time-utils.ts +3 -3
  302. package/src/utils/timezone.ts +2 -2
  303. package/dist/config-Bax6Ofp5.js +0 -418
  304. package/dist/config-Bax6Ofp5.js.map +0 -1
  305. package/dist/connector-factory-BaMIlES8.js +0 -30
  306. package/dist/connector-factory-BaMIlES8.js.map +0 -1
  307. package/dist/hashed-cache-manager-C1u9jQgY.js +0 -322
  308. package/dist/hashed-cache-manager-C1u9jQgY.js.map +0 -1
  309. package/dist/index-BkVlW0ZW.js +0 -192
  310. package/dist/index-BkVlW0ZW.js.map +0 -1
  311. package/dist/knexfile-Bng2Ru9c.js +0 -20
  312. package/dist/knexfile-Bng2Ru9c.js.map +0 -1
  313. package/dist/logger-DW5fyhVS.js +0 -17593
  314. package/dist/logger-DW5fyhVS.js.map +0 -1
  315. package/dist/mm-erp-sdk.js +0 -4266
  316. package/dist/mm-erp-sdk.js.map +0 -1
@@ -0,0 +1,168 @@
1
+ import { ERPObjType } from "../../types/erp-types.js";
2
+ import { MMApiClient } from "../../services/mm-api-service/mm-api-service.js";
3
+ import { MMBatchValidationError, } from "./standard-process-drivers.js";
4
+ import { ErrorProcessor } from "./error-processor.js";
5
+ /**
6
+ * Handles processing of entities to the MachineMetrics API
7
+ */
8
+ export class MMEntityProcessor {
9
+ /**
10
+ * Writes entities to MM API with deduplication and caching
11
+ */
12
+ static async writeEntities(entityType, mmRecords, batchCacheManager) {
13
+ const { toProcess, result } = await this._prepareAndDedupe(entityType, mmRecords, batchCacheManager);
14
+ if (toProcess.length === 0) {
15
+ result.message =
16
+ "All records were deduplicated locally - no records sent to MM API";
17
+ return result;
18
+ }
19
+ let mmApiResponse;
20
+ try {
21
+ mmApiResponse = await this._sendToAPI(entityType, toProcess);
22
+ }
23
+ catch (exception) {
24
+ this._handleException(exception, entityType, result);
25
+ }
26
+ return await this._handleResponse(mmApiResponse, entityType, toProcess, result, batchCacheManager);
27
+ }
28
+ // ============================================================================
29
+ // PRIVATE HELPER METHODS
30
+ // ============================================================================
31
+ /**
32
+ * Deduplicates records against cache
33
+ * Returns the records to process and the result object
34
+ * If the batchCacheManager is provided, the records are deduplicated against the cache
35
+ * If the batchCacheManager is not provided, the records are not deduplicated
36
+ */
37
+ static async _prepareAndDedupe(entityType, mmRecords, batchCacheManager) {
38
+ let toProcess = [];
39
+ const result = {
40
+ message: "",
41
+ upsertedEntities: 0,
42
+ localDedupeCount: 0,
43
+ apiDedupeCount: 0,
44
+ };
45
+ if (batchCacheManager) {
46
+ const { nonDuplicates, duplicates } = (await batchCacheManager.dedupeBatch(entityType, mmRecords));
47
+ toProcess = nonDuplicates;
48
+ result.localDedupeCount = duplicates.length;
49
+ }
50
+ else {
51
+ toProcess = mmRecords;
52
+ }
53
+ return { toProcess, result };
54
+ }
55
+ /**
56
+ * Sends records to MM API
57
+ */
58
+ static async _sendToAPI(entityType, toProcess) {
59
+ const mmApiClient = new MMApiClient();
60
+ switch (entityType) {
61
+ case ERPObjType.PERSONS:
62
+ return await mmApiClient.sendPersonsToMM(toProcess);
63
+ case ERPObjType.RESOURCES:
64
+ return await mmApiClient.sendResourcesToMM(toProcess);
65
+ case ERPObjType.PARTS:
66
+ return await mmApiClient.sendPartsToMM(toProcess);
67
+ case ERPObjType.PART_OPERATION:
68
+ return await mmApiClient.sendPartOperationsToMM(toProcess);
69
+ case ERPObjType.WORK_ORDERS:
70
+ return await mmApiClient.sendWorkOrdersToMM(toProcess);
71
+ case ERPObjType.WORK_ORDER_OPERATIONS:
72
+ return await mmApiClient.sendWorkOrderOperationsToMM(toProcess);
73
+ case ERPObjType.LABOR_TICKETS:
74
+ return await mmApiClient.sendLaborTicketsToMM(toProcess);
75
+ case ERPObjType.REASONS:
76
+ return await mmApiClient.sendReasonsToMM(toProcess);
77
+ default:
78
+ throw new Error(`Unknown entity type: ${entityType}`);
79
+ }
80
+ }
81
+ /**
82
+ * Handles exceptions from API calls, converting structured 500 errors to MMBatchValidationError
83
+ * @throws MMBatchValidationError for structured 500 errors
84
+ * @throws The original exception for all other errors
85
+ */
86
+ static _handleException(exception, entityType, result) {
87
+ // Handle structured 500 errors that may be appropriate for partial failure
88
+ const structuredCompleteErrorSet = ErrorProcessor.extractErrorDetailsFrom500Exception(exception, entityType);
89
+ if (structuredCompleteErrorSet) {
90
+ const ex = exception;
91
+ const data = ex?.data;
92
+ const errorMessage = typeof data?.error === "string"
93
+ ? data.error
94
+ : "All entities failed to import";
95
+ throw new MMBatchValidationError({
96
+ message: errorMessage,
97
+ upsertedEntities: 0,
98
+ localDedupeCount: result.localDedupeCount,
99
+ apiDedupeCount: 0,
100
+ errorCount: structuredCompleteErrorSet.errorCount,
101
+ httpStatus: exception.status,
102
+ batchErrors: structuredCompleteErrorSet.batchErrors,
103
+ });
104
+ }
105
+ // For all other exceptions, re-throw as-is
106
+ throw exception;
107
+ }
108
+ /**
109
+ * Handles the MM API response based on HTTP status code, caching successful records
110
+ * and throwing exceptions for partial failures
111
+ *
112
+ * @returns The final result for success cases
113
+ * @throws MMBatchValidationError for partial success cases
114
+ * @throws Error for unknown status codes
115
+ */
116
+ static async _handleResponse(mmApiResponse, entityType, toProcess, result, batchCacheManager) {
117
+ if (mmApiResponse.httpStatus === 200) {
118
+ // Complete success - cache all records
119
+ if (batchCacheManager) {
120
+ await batchCacheManager.storeBatch(entityType, toProcess);
121
+ }
122
+ if (entityType === ERPObjType.LABOR_TICKETS) {
123
+ const success = mmApiResponse;
124
+ result.message = success.message || "Entities processed successfully";
125
+ result.upsertedEntities =
126
+ (success.updated || 0) + (success.inserted || 0);
127
+ }
128
+ else {
129
+ const success = mmApiResponse;
130
+ result.message = success.message || "Entities processed successfully";
131
+ result.upsertedEntities = success.affectedRows || 0;
132
+ }
133
+ result.apiDedupeCount = toProcess.length - result.upsertedEntities;
134
+ return result;
135
+ }
136
+ else if (mmApiResponse.httpStatus === 207) {
137
+ // Partial success - cache only successful records before throwing exception
138
+ const partialResponse = mmApiResponse;
139
+ const { errorCount, batchErrors } = ErrorProcessor.extractErrorDetails(partialResponse, entityType);
140
+ if (batchCacheManager) {
141
+ await ErrorProcessor.cacheSuccessfulRecordsOnPartialFailure(entityType, toProcess, batchErrors, batchCacheManager);
142
+ }
143
+ let upsertedEntities = 0;
144
+ if (entityType === ERPObjType.LABOR_TICKETS) {
145
+ const partial = partialResponse;
146
+ upsertedEntities =
147
+ (partial.data.updated || 0) + (partial.data.inserted || 0);
148
+ }
149
+ else {
150
+ const partial = partialResponse;
151
+ upsertedEntities = partial.data.affectedRows || 0;
152
+ }
153
+ throw new MMBatchValidationError({
154
+ message: partialResponse.message || "Entities processed with partial failures",
155
+ upsertedEntities: upsertedEntities,
156
+ localDedupeCount: result.localDedupeCount,
157
+ apiDedupeCount: toProcess.length - upsertedEntities - errorCount,
158
+ errorCount: errorCount,
159
+ httpStatus: mmApiResponse.httpStatus,
160
+ batchErrors: batchErrors,
161
+ });
162
+ }
163
+ else {
164
+ throw new Error(`writeEntitiesToMM: Unknown HTTP status code: ${mmApiResponse.httpStatus}. An exception was expected.`);
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=mm-entity-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mm-entity-processor.js","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/mm-entity-processor.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { ERPObjType } from "../../types/erp-types";
2
- import { IERPLaborTicketHandler } from "../../types/erp-connector";
3
- import { BatchCacheManager } from "../../services/caching-service/batch-cache-manager";
4
- import { IToRESTApiObject, MMSendWorkOrderBatch } from "../../services/mm-api-service";
1
+ import { ERPObjType } from "../../types/erp-types.js";
2
+ import { IERPLaborTicketHandler } from "../../types/erp-connector.js";
3
+ import { BatchCacheManager } from "../../services/caching-service/batch-cache-manager.js";
4
+ import { IToRESTApiObject, MMSendWorkOrderBatch } from "../../services/mm-api-service/index.js";
5
5
  /**
6
6
  * The result of writing entities to the MachineMetrics API on complete success.
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"standard-process-drivers.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/standard-process-drivers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oDAAoD,CAAC;AACvF,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAKrB,MAAM,+BAA+B,CAAC;AAIvC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,WAAW,EAAE,KAAK,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;KACtC,CAAC,CAAC;gBAES,OAAO,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,KAAK,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;SACtC,CAAC,CAAC;KACJ;CAUF;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC;;;;;;;;OAQG;WACU,qBAAqB,CAChC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;OAMG;WACU,uBAAuB,CAClC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwEG;WACU,iBAAiB,CAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC,uBAAuB,CAAC;IAQnC;;;;;;;;;;;;;;;OAeG;WACU,uBAAuB,CAClC,cAAc,EAAE,oBAAoB,EACpC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC;QACT,KAAK,EAAE,uBAAuB,CAAC;QAC/B,cAAc,EAAE,uBAAuB,CAAC;QACxC,UAAU,EAAE,uBAAuB,CAAC;QACpC,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C,CAAC;IAuCF;;;;;;;;;;;;;;OAcG;WACU,+BAA+B,CAC1C,aAAa,EAAE,GAAG,EAAE,EACpB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC;QACT,KAAK,EAAE,uBAAuB,CAAC;QAC/B,cAAc,EAAE,uBAAuB,CAAC;QACxC,UAAU,EAAE,uBAAuB,CAAC;QACpC,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C,CAAC;CAkMH"}
1
+ {"version":3,"file":"standard-process-drivers.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/standard-process-drivers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAC1F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EAKrB,MAAM,wCAAwC,CAAC;AAIhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IACzC,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,WAAW,EAAE,KAAK,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;KACtC,CAAC,CAAC;gBAES,OAAO,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,KAAK,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;SACtC,CAAC,CAAC;KACJ;CAUF;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC;;;;;;;;OAQG;WACU,qBAAqB,CAChC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;OAMG;WACU,uBAAuB,CAClC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwEG;WACU,iBAAiB,CAC5B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC,uBAAuB,CAAC;IAQnC;;;;;;;;;;;;;;;OAeG;WACU,uBAAuB,CAClC,cAAc,EAAE,oBAAoB,EACpC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC;QACT,KAAK,EAAE,uBAAuB,CAAC;QAC/B,cAAc,EAAE,uBAAuB,CAAC;QACxC,UAAU,EAAE,uBAAuB,CAAC;QACpC,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C,CAAC;IAuCF;;;;;;;;;;;;;;OAcG;WACU,+BAA+B,CAC1C,aAAa,EAAE,GAAG,EAAE,EACpB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAC1C,OAAO,CAAC;QACT,KAAK,EAAE,uBAAuB,CAAC;QAC/B,cAAc,EAAE,uBAAuB,CAAC;QACxC,UAAU,EAAE,uBAAuB,CAAC;QACpC,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C,CAAC;CAkMH"}
@@ -0,0 +1,324 @@
1
+ import { ERPObjType } from "../../types/erp-types.js";
2
+ import { MMSendPart, MMSendPartOperation, MMSendWorkOrder, MMSendWorkOrderOperation, } from "../../services/mm-api-service/index.js";
3
+ import { LaborTicketERPSynchronizer } from "./labor-ticket-erp-synchronizer.js";
4
+ import { MMEntityProcessor } from "./mm-entity-processor.js";
5
+ export class MMBatchValidationError extends Error {
6
+ upsertedEntities;
7
+ localDedupeCount;
8
+ apiDedupeCount;
9
+ errorCount;
10
+ httpStatus;
11
+ batchErrors;
12
+ constructor(options) {
13
+ super(options.message);
14
+ this.name = "MMBatchValidationError";
15
+ this.upsertedEntities = options.upsertedEntities;
16
+ this.localDedupeCount = options.localDedupeCount;
17
+ this.apiDedupeCount = options.apiDedupeCount;
18
+ this.errorCount = options.errorCount;
19
+ this.httpStatus = options.httpStatus;
20
+ this.batchErrors = options.batchErrors;
21
+ }
22
+ }
23
+ /**
24
+ * A collection of standardized process drivers that orchestrate various synchronization
25
+ * and integration processes between systems. Use of these drivers is optional,
26
+ * and useful as a reference implementation for how to implement the various processes.
27
+ */
28
+ export class StandardProcessDrivers {
29
+ /**
30
+ * Synchronizes updated labor tickets from MachineMetrics to an ERP system:
31
+ *
32
+ * Initializes a checkpoint that tracks the last time labor tickets were synced,
33
+ * fetches labor tickets from MM and converts them to the company timezone,
34
+ * creates or updates the labor ticket in the ERP via connector-specific implementations,
35
+ * updates the labor ticket id in MM on newly created labor tickets,
36
+ * and saves the checkpoint
37
+ */
38
+ static async syncLaborTicketsToERP(connectorType, connector) {
39
+ return LaborTicketERPSynchronizer.syncToERP(connectorType, connector);
40
+ }
41
+ /**
42
+ * Retries labor tickets that have failed to be created or updated in the ERP during the sync:
43
+ *
44
+ * Fetches failed labor tickets from MM, processes them, and updates the labor ticket id in MM.
45
+ * If the labor ticket is successfully created or updated, it is added to the list of successful labor ticket ids,
46
+ * which are then deleted from the list of failed labor ticket ids.
47
+ */
48
+ static async retryFailedLaborTickets(connectorType, connector) {
49
+ return LaborTicketERPSynchronizer.retryFailed(connectorType, connector);
50
+ }
51
+ /**
52
+ * Writes a batch of records to MM for a specific entity type by:
53
+ * 1. Deduplicating against cached records (localDedupeCount)
54
+ * 2. Sending non-duplicate records to the MM API (apiDedupeCount)
55
+ * 3. Storing successful records in cache
56
+ *
57
+ * An example usage pattern including comprehensive error handling:
58
+ * ```
59
+ * try {
60
+ * const result = await StandardProcessDrivers.writeEntitiesToMM(
61
+ * 'WorkOrders',
62
+ * workOrderRecords,
63
+ * batchCacheManager
64
+ * );
65
+ *
66
+ * // HTTP 200 - Complete success
67
+ * console.log(`✅ Success: ${result.message}`);
68
+ * console.log(`📊 Metrics: ${result.upsertedEntities} upserted, ${result.localDedupeCount} locally deduplicated, ${result.apiDedupeCount} API deduplicated`);
69
+ *
70
+ * } catch (error) {
71
+ * if (error instanceof MMBatchValidationError) {
72
+ * // HTTP 207 - Partial success with some batches failing due to validation errors
73
+ * // HTTP 500 - A specific type representing complete failure due to validation issues;
74
+ * // other 500 types represent failure due to other issues and are not converted to MMBatchValidationError
75
+ * // Note: Each batch error contains ALL entities from the failing batch, not necessarily just the failed ones
76
+ *
77
+ * console.log(`⚠️ Batch processing completed with errors (HTTP ${error.httpStatus})`);
78
+ * console.log(`📊 Metrics: ${error.upsertedEntities} upserted, ${error.localDedupeCount} locally deduplicated, ${error.apiDedupeCount} API deduplicated`);
79
+ * console.log(`❌ Error count: ${error.errorCount}`);
80
+ *
81
+ * // Process specific batch errors for retry or logging
82
+ * error.batchErrors.forEach((batchError, index) => {
83
+ * console.log(`Batch ${index + 1} error: ${batchError.message}`);
84
+ * console.log(`All entities in failing batch:`, batchError.affectedEntities);
85
+ *
86
+ * // Example: Queue entire failing batch for retry (contains both successful and failed entities)
87
+ * await queueForRetry(batchError.affectedEntities);
88
+ * });
89
+ *
90
+ * // Decide whether to continue or halt based on httpStatus
91
+ * if (error.httpStatus === 207) {
92
+ * // Partial success - some batches processed successfully, others failed
93
+ * console.log('⚠️ Continuing with partial success');
94
+ * } else if (error.httpStatus === 500) {
95
+ * // Complete failure - all batches failed due to validation issues
96
+ * console.log('🛑 Complete failure - no records processed');
97
+ * throw error; // Re-throw if complete failure should halt the process
98
+ * }
99
+ *
100
+ * } else {
101
+ * // Other underlying errors (network issues, authentication, etc.)
102
+ * console.error('🚨 Unexpected error during MM API call:', error);
103
+ *
104
+ * // Example: Check for specific error types
105
+ * if (error.message?.includes('authentication')) {
106
+ * console.error('🔐 Authentication issue - check MM API credentials');
107
+ * } else if (error.message?.includes('network') || error.code === 'ECONNREFUSED') {
108
+ * console.error('🌐 Network connectivity issue - check MM API endpoint');
109
+ * }
110
+ *
111
+ * throw error; // Re-throw for upstream handling
112
+ * }
113
+ * }
114
+ * ```
115
+ *
116
+ * @param entityType The type of entity being processed
117
+ * @param mmRecords The records to process
118
+ * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired
119
+ *
120
+ * @returns WriteEntitiesToMMResult on complete success (HTTP 200)
121
+ * @throws MMBatchValidationError on partial success (HTTP 207) or complete failure (HTTP 500) with structured error details
122
+ * @throws Error on other underlying issues (network, authentication, etc.)
123
+ */
124
+ static async writeEntitiesToMM(entityType, mmRecords, batchCacheManager) {
125
+ return MMEntityProcessor.writeEntities(entityType, mmRecords, batchCacheManager);
126
+ }
127
+ /**
128
+ * Writes a batch of Work Order related entities to MM maintaining referential integrity by:
129
+ * 1. Processing parts first (base entities)
130
+ * 2. Processing part operations (depends on parts)
131
+ * 3. Processing work orders (depends on parts)
132
+ * 4. Processing work order operations (depends on work orders and part operations)
133
+ *
134
+ * This ensures all foreign key constraints are satisfied and prevents referential integrity errors.
135
+ *
136
+ * @param workOrderBatch The batch containing all related entities
137
+ * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired
138
+ *
139
+ * @returns Combined results from all entity processing
140
+ * @throws MMBatchValidationError on partial success or complete failure with structured error details
141
+ * @throws Error on other underlying issues (network, authentication, etc.)
142
+ */
143
+ static async writeWorkOrderBatchToMM(workOrderBatch, batchCacheManager) {
144
+ // Process entities in order to maintain referential integrity
145
+ // 1. Parts first (no dependencies)
146
+ const partsResult = await MMEntityProcessor.writeEntities(ERPObjType.PARTS, workOrderBatch.parts, batchCacheManager);
147
+ // 2. Part Operations (depends on parts)
148
+ const partOperationsResult = await MMEntityProcessor.writeEntities(ERPObjType.PART_OPERATION, workOrderBatch.partOperations, batchCacheManager);
149
+ // 3. Work Orders (depends on parts)
150
+ const workOrdersResult = await MMEntityProcessor.writeEntities(ERPObjType.WORK_ORDERS, workOrderBatch.workOrders, batchCacheManager);
151
+ // 4. Work Order Operations (depends on work orders and part operations)
152
+ const workOrderOperationsResult = await MMEntityProcessor.writeEntities(ERPObjType.WORK_ORDER_OPERATIONS, workOrderBatch.workOrderOperations, batchCacheManager);
153
+ return {
154
+ parts: partsResult,
155
+ partOperations: partOperationsResult,
156
+ workOrders: workOrdersResult,
157
+ workOrderOperations: workOrderOperationsResult,
158
+ };
159
+ }
160
+ /**
161
+ * Processes flattened work order data and syncs it to MM maintaining referential integrity.
162
+ *
163
+ * This method expects flattened data where each row contains both work order and operation information
164
+ * with camelCase field names matching the GraphQL schema. It will automatically extract and deduplicate
165
+ * parts, part operations, work orders, and work order operations, then process them in the correct order
166
+ * to maintain referential integrity.
167
+ *
168
+ * @param flattenedData Array of flattened rows containing both work order and operation data (camelCase fields)
169
+ * @param batchCacheManager The batch cache manager instance; pass in null if caching is not desired
170
+ *
171
+ * @returns Combined results from all entity processing with detailed logging information
172
+ * @throws MMBatchValidationError on partial success or complete failure with structured error details
173
+ * @throws Error on other underlying issues (network, authentication, etc.)
174
+ */
175
+ static async syncWorkOrderBatchFromFlattened(flattenedData, batchCacheManager) {
176
+ if (!flattenedData || flattenedData.length === 0) {
177
+ throw new Error("No flattened work order data provided");
178
+ }
179
+ // Process the flattened data - each row contains both work order and operation info
180
+ const uniqueParts = new Map();
181
+ const uniquePartOperations = new Map();
182
+ const uniqueWorkOrders = new Map();
183
+ const workOrderOperations = [];
184
+ // Process each flattened row to extract entities
185
+ for (const row of flattenedData) {
186
+ // Extract unique parts
187
+ const partKey = `${row.partNumber}|${row.partRevision}|${row.method}`;
188
+ if (!uniqueParts.has(partKey)) {
189
+ uniqueParts.set(partKey, {
190
+ partNumber: row.partNumber, // → partNumber
191
+ partRevision: row.partRevision, // → partRevision
192
+ method: row.method, // → method
193
+ });
194
+ }
195
+ // Extract unique part operations
196
+ const partOpKey = `${row.partNumber}|${row.partRevision}|${row.method}|${row.sequenceNumber}`;
197
+ if (!uniquePartOperations.has(partOpKey)) {
198
+ uniquePartOperations.set(partOpKey, {
199
+ partNumber: row.partNumber, // → partNumber
200
+ partRevision: row.partRevision, // → partRevision
201
+ method: row.method, // → method
202
+ sequenceNumber: row.sequenceNumber, // → sequenceNumber
203
+ resourceId: row.resourceId, // → resourceId
204
+ cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs
205
+ setupTimeMs: row.setupTimeMs, // → setupTimeMs
206
+ description: row.operationDescription || "", // → description
207
+ quantityPerPart: row.quantityPerPart || 1, // → quantityPerPart
208
+ });
209
+ }
210
+ // Extract unique work orders
211
+ const workOrderKey = row.workOrderId;
212
+ if (!uniqueWorkOrders.has(workOrderKey)) {
213
+ uniqueWorkOrders.set(workOrderKey, {
214
+ workOrderId: row.workOrderId, // → workOrderId
215
+ lot: row.lot, // → lot
216
+ split: row.split, // → split
217
+ sub: row.sub, // → sub
218
+ status: row.status, // → status
219
+ dueDate: row.dueDate, // → dueDate
220
+ description: row.description, // → description
221
+ scheduledStartDate: row.scheduledStartDate, // → scheduledStartDate
222
+ scheduledEndDate: row.scheduledEndDate, // → scheduledEndDate
223
+ closedDate: row.closedDate, // → closedDate
224
+ quantityRequired: row.quantityRequired, // → quantityRequired
225
+ partNumber: row.partNumber, // → partNumber
226
+ partRevision: row.partRevision, // → partRevision
227
+ method: row.method, // → method
228
+ });
229
+ }
230
+ // Add each work order operation (these are not deduplicated since each operation is unique)
231
+ workOrderOperations.push({
232
+ workOrderId: row.workOrderId, // → workOrderId
233
+ lot: row.lot, // → lot
234
+ split: row.split, // → split
235
+ sub: row.sub, // → sub
236
+ sequenceNumber: row.sequenceNumber, // → sequenceNumber
237
+ resourceId: row.resourceId, // → resourceId
238
+ startQuantity: row.startQuantity, // → startQuantity
239
+ finishQuantity: row.finishQuantity, // → finishQuantity
240
+ expectedRejectRate: row.expectedRejectRate, // → expectedRejectRate
241
+ scheduledStartDate: row.opScheduledStartDate, // → scheduledStartDate
242
+ scheduledFinishDate: row.opScheduledFinishDate, // → scheduledFinishDate
243
+ closedDate: row.opClosedDate, // → closedDate
244
+ cycleTimeMs: row.cycleTimeMs, // → cycleTimeMs
245
+ setupTimeMs: row.setupTimeMs, // → setupTimeMs
246
+ productionburdenRateHourly: row.productionburdenRateHourly, // → productionburdenRateHourly
247
+ setupburdenRatehourly: row.setupburdenRatehourly, // → setupburdenRatehourly
248
+ operationType: row.operationType, // → operationType
249
+ quantityPerPart: row.quantityPerPart, // → quantityPerPart
250
+ status: row.opStatus || row.status, // → status
251
+ });
252
+ }
253
+ // Transform all the data directly to MM entities
254
+ const parts = Array.from(uniqueParts.values()).map((item) => new MMSendPart(item.partNumber || "", // partNumber
255
+ item.partRevision || "", // partRevision
256
+ item.method || "Standard" // method
257
+ ));
258
+ const partOperations = Array.from(uniquePartOperations.values()).map((item) => new MMSendPartOperation(item.partNumber || "", // partNumber
259
+ item.partRevision || "", // partRevision
260
+ item.method || "Standard", // method
261
+ item.sequenceNumber?.toString() || "", // sequenceNumber
262
+ item.resourceId?.toString() || "", // resourceId
263
+ item.cycleTimeMs || 0, // cycleTimeMs
264
+ item.setupTimeMs || 0, // setupTimeMs
265
+ item.description || "", // description
266
+ item.quantityPerPart || 1 // quantityPerPart
267
+ ));
268
+ const transformedWorkOrders = Array.from(uniqueWorkOrders.values()).map((item) => new MMSendWorkOrder(item.workOrderId?.toString() || "", // workOrderId
269
+ item.lot || "", // lot
270
+ item.split || "", // split
271
+ item.sub || "", // sub
272
+ item.status || "Open", // status
273
+ item.dueDate ? new Date(item.dueDate).toISOString() : null, // dueDate
274
+ item.description || "", // description
275
+ item.scheduledStartDate
276
+ ? new Date(item.scheduledStartDate).toISOString()
277
+ : null, // scheduledStartDate
278
+ item.scheduledEndDate
279
+ ? new Date(item.scheduledEndDate).toISOString()
280
+ : null, // scheduledEndDate
281
+ item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate
282
+ item.quantityRequired || 0, // quantityRequired
283
+ item.partNumber || "", // partNumber
284
+ item.partRevision || "", // partRevision
285
+ item.method || "Standard" // method
286
+ ));
287
+ const transformedWorkOrderOperations = workOrderOperations.map((item) => new MMSendWorkOrderOperation(item.workOrderId?.toString() || "", // workOrderId
288
+ item.lot || "", // lot
289
+ item.split || "", // split
290
+ item.sub || "", // sub
291
+ item.sequenceNumber?.toString() || "", // sequenceNumber
292
+ item.resourceId?.toString() || "", // resourceId
293
+ item.startQuantity || 0, // startQuantity
294
+ item.finishQuantity || 0, // finishQuantity
295
+ item.expectedRejectRate || 0, // expectedRejectRate
296
+ item.scheduledStartDate
297
+ ? new Date(item.scheduledStartDate).toISOString()
298
+ : null, // scheduledStartDate
299
+ item.scheduledFinishDate
300
+ ? new Date(item.scheduledFinishDate).toISOString()
301
+ : null, // scheduledFinishDate
302
+ item.closedDate ? new Date(item.closedDate).toISOString() : null, // closedDate
303
+ item.cycleTimeMs || 0, // cycleTimeMs
304
+ item.setupTimeMs || 0, // setupTimeMs
305
+ parseFloat(item.productionburdenRateHourly || "0"), // productionburdenRateHourly
306
+ parseFloat(item.setupburdenRatehourly || "0"), // setupburdenRatehourly
307
+ item.operationType || "Production", // operationType
308
+ item.quantityPerPart || 1, // quantityPerPart
309
+ item.status || "Open" // status
310
+ ));
311
+ // Send each entity type individually in the correct order for referential integrity
312
+ const partsResult = await MMEntityProcessor.writeEntities(ERPObjType.PARTS, parts, batchCacheManager);
313
+ const partOperationsResult = await MMEntityProcessor.writeEntities(ERPObjType.PART_OPERATION, partOperations, batchCacheManager);
314
+ const workOrdersResult = await MMEntityProcessor.writeEntities(ERPObjType.WORK_ORDERS, transformedWorkOrders, batchCacheManager);
315
+ const workOrderOperationsResult = await MMEntityProcessor.writeEntities(ERPObjType.WORK_ORDER_OPERATIONS, transformedWorkOrderOperations, batchCacheManager);
316
+ return {
317
+ parts: partsResult,
318
+ partOperations: partOperationsResult,
319
+ workOrders: workOrdersResult,
320
+ workOrderOperations: workOrderOperationsResult,
321
+ };
322
+ }
323
+ }
324
+ //# sourceMappingURL=standard-process-drivers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-process-drivers.js","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/standard-process-drivers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import logger from "../services/reporting-service/logger.js";
2
+ import { setTimezoneOffsetInCache, setTimezoneNameInCache, } from "./local-data-store/jobs-shared-data.js";
3
+ import { convertToLocalTime, formatDateWithTZOffset, getTimezoneOffset, } from "./timezone.js";
4
+ /**
5
+ * Calculates the difference in hours between two timestamps
6
+ * @param startTime ISO timestamp string
7
+ * @param endTime ISO timestamp string
8
+ * @param timezoneOffset timezone offset in hours
9
+ * @returns number representing hours difference, rounded to 3 decimal places
10
+ */
11
+ export function calculateTimeDifferenceInHours(startTime, endTime, timezoneOffset) {
12
+ if (!startTime || !endTime)
13
+ return 0;
14
+ const localStartTime = convertToLocalTime(startTime, timezoneOffset);
15
+ const localEndTime = convertToLocalTime(endTime, timezoneOffset);
16
+ if (!localStartTime || !localEndTime)
17
+ return 0;
18
+ // Get hours, minutes, seconds from the Date objects
19
+ const startHours = localStartTime.getHours();
20
+ const startMinutes = localStartTime.getMinutes();
21
+ const startSeconds = localStartTime.getSeconds();
22
+ const endHours = localEndTime.getHours();
23
+ const endMinutes = localEndTime.getMinutes();
24
+ const endSeconds = localEndTime.getSeconds();
25
+ // Calculate total seconds for each time
26
+ const startTotalSeconds = startHours * 3600 + startMinutes * 60 + startSeconds;
27
+ const endTotalSeconds = endHours * 3600 + endMinutes * 60 + endSeconds;
28
+ if (endTotalSeconds > startTotalSeconds) {
29
+ return Number(((endTotalSeconds - startTotalSeconds) / 3600).toFixed(3));
30
+ }
31
+ return 0;
32
+ }
33
+ export const getSecondsOfDay = (timestamp) => {
34
+ if (!timestamp)
35
+ return null;
36
+ const time = new Date(timestamp);
37
+ const utcHours = time.getUTCHours();
38
+ const utcMinutes = time.getUTCMinutes();
39
+ const utcSeconds = time.getUTCSeconds();
40
+ return (utcHours * 3600 + utcMinutes * 60 + utcSeconds).toString();
41
+ };
42
+ /**
43
+ * Apply timezone offsets to specified datetime fields in an object
44
+ * @param item The object to transform
45
+ * @param fields The fields to apply timezone offset to
46
+ * @param timezoneOffset The timezone offset to apply
47
+ * @returns The transformed object
48
+ */
49
+ export const applyTimezoneOffsetsToFields = (item, fields, timezoneOffset) => {
50
+ const transformed = { ...item };
51
+ fields.forEach((field) => {
52
+ if (transformed[field] && transformed[field].trim()) {
53
+ const formattedDate = formatDateWithTZOffset(transformed[field], timezoneOffset);
54
+ transformed[field] = formattedDate || "";
55
+ }
56
+ else {
57
+ transformed[field] = "";
58
+ }
59
+ });
60
+ return transformed;
61
+ };
62
+ /**
63
+ * Gets the timezone offset and timezone name for the company and sets them in the cache
64
+ * The cached offset can be acquired from getCachedTimezoneOffset() in "./local-data-store/jobs-shared-data"
65
+ * The cached timezone name can be acquired from getCachedTimezoneName() in "./local-data-store/jobs-shared-data"
66
+ *
67
+ * @param params.maxRetries Maximum number of retry attempts
68
+ * @param params.retryIntervalMs Time to wait between retries in milliseconds
69
+ */
70
+ export const getTimezoneOffsetAndPersist = async (params = {
71
+ maxRetries: 36000, // Retry for 10 hours before giving up.
72
+ retryIntervalMs: 10_000,
73
+ }) => {
74
+ let success = false;
75
+ let retries = 0;
76
+ logger.info("Acquiring the timezone offset and timezone name from MachineMetrics and storing in cache");
77
+ while (!success && retries < params.maxRetries) {
78
+ try {
79
+ const { offset, timezone } = await getTimezoneOffset();
80
+ logger.info(`Timezone offset: ${offset} hours, timezone: ${timezone}`);
81
+ setTimezoneOffsetInCache(offset);
82
+ setTimezoneNameInCache(timezone);
83
+ success = true;
84
+ }
85
+ catch (error) {
86
+ logger.error("Error getting timezone offset:", error);
87
+ logger.info(`Retrying in ${params.retryIntervalMs / 1000} seconds...`);
88
+ await new Promise((resolve) => setTimeout(resolve, params.retryIntervalMs));
89
+ retries++;
90
+ }
91
+ }
92
+ if (!success) {
93
+ throw new Error(`Failed to get the timezone offset after ${params.maxRetries} retries`);
94
+ }
95
+ };
96
+ //# sourceMappingURL=time-utils.js.map