@machinemetrics/mm-erp-sdk 0.2.0-beta.2 → 0.3.0-beta.0

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 (361) hide show
  1. package/README.md +5 -0
  2. package/dist/index.d.ts +42 -43
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +48 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/knexfile.d.ts.map +1 -1
  7. package/dist/knexfile.js +19 -0
  8. package/dist/knexfile.js.map +1 -0
  9. package/dist/migrations/20241015162631_create_cache_table.d.ts +4 -0
  10. package/dist/migrations/20241015162631_create_cache_table.d.ts.map +1 -0
  11. package/dist/migrations/20241015162631_create_cache_table.js +11 -15
  12. package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
  13. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +4 -0
  14. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +1 -0
  15. package/dist/migrations/20241015162632_create_sdk_cache_table.js +11 -15
  16. package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
  17. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +4 -0
  18. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +1 -0
  19. package/dist/migrations/20250103162631_create_record_tracking_table.js +14 -15
  20. package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
  21. package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
  22. package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
  23. package/dist/services/caching-service/batch-cache-manager.js +84 -0
  24. package/dist/services/caching-service/batch-cache-manager.js.map +1 -0
  25. package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
  26. package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
  27. package/dist/services/caching-service/hashed-cache-manager.js +223 -0
  28. package/dist/services/caching-service/hashed-cache-manager.js.map +1 -0
  29. package/dist/services/caching-service/index.d.ts +1 -1
  30. package/dist/services/caching-service/index.d.ts.map +1 -1
  31. package/dist/services/caching-service/index.js +2 -0
  32. package/dist/services/caching-service/index.js.map +1 -0
  33. package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
  34. package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
  35. package/dist/services/caching-service/record-tracking-manager.js +28 -0
  36. package/dist/services/caching-service/record-tracking-manager.js.map +1 -0
  37. package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
  38. package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
  39. package/dist/services/data-sync-service/configuration-manager.js +163 -0
  40. package/dist/services/data-sync-service/configuration-manager.js.map +1 -0
  41. package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
  42. package/dist/services/data-sync-service/data-sync-service.js +95 -0
  43. package/dist/services/data-sync-service/data-sync-service.js.map +1 -0
  44. package/dist/services/data-sync-service/index.d.ts +3 -3
  45. package/dist/services/data-sync-service/index.d.ts.map +1 -1
  46. package/dist/services/data-sync-service/index.js +10 -0
  47. package/dist/services/data-sync-service/index.js.map +1 -0
  48. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts.map +1 -1
  49. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +42 -40
  50. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
  51. package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
  52. package/dist/services/data-sync-service/jobs/from-erp.js +50 -37
  53. package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
  54. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts.map +1 -1
  55. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +38 -36
  56. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
  57. package/dist/services/data-sync-service/jobs/run-migrations.d.ts.map +1 -1
  58. package/dist/services/data-sync-service/jobs/run-migrations.js +24 -22
  59. package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
  60. package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
  61. package/dist/services/data-sync-service/jobs/to-erp.js +49 -49
  62. package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
  63. package/dist/services/erp-api-services/errors.d.ts +1 -1
  64. package/dist/services/erp-api-services/errors.d.ts.map +1 -1
  65. package/dist/services/erp-api-services/errors.js +83 -0
  66. package/dist/services/erp-api-services/errors.js.map +1 -0
  67. package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
  68. package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
  69. package/dist/services/erp-api-services/graphql/graphql-service.js +102 -0
  70. package/dist/services/erp-api-services/graphql/graphql-service.js.map +1 -0
  71. package/dist/services/erp-api-services/graphql/types.js +6 -0
  72. package/dist/services/erp-api-services/graphql/types.js.map +1 -0
  73. package/dist/services/erp-api-services/index.d.ts +8 -8
  74. package/dist/services/erp-api-services/index.d.ts.map +1 -1
  75. package/dist/services/erp-api-services/index.js +13 -0
  76. package/dist/services/erp-api-services/index.js.map +1 -0
  77. package/dist/services/erp-api-services/oauth-client.js +41 -0
  78. package/dist/services/erp-api-services/oauth-client.js.map +1 -0
  79. package/dist/services/erp-api-services/rest/get-query-params.js +23 -0
  80. package/dist/services/erp-api-services/rest/get-query-params.js.map +1 -0
  81. package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
  82. package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
  83. package/dist/services/erp-api-services/rest/rest-api-service.js +163 -0
  84. package/dist/services/erp-api-services/rest/rest-api-service.js.map +1 -0
  85. package/dist/services/erp-api-services/types.d.ts +2 -2
  86. package/dist/services/erp-api-services/types.d.ts.map +1 -1
  87. package/dist/services/erp-api-services/types.js +2 -0
  88. package/dist/services/erp-api-services/types.js.map +1 -0
  89. package/dist/services/mm-api-service/index.d.ts +6 -13
  90. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  91. package/dist/services/mm-api-service/index.js +15 -0
  92. package/dist/services/mm-api-service/index.js.map +1 -0
  93. package/dist/services/mm-api-service/mm-api-service.d.ts +7 -13
  94. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  95. package/dist/services/mm-api-service/mm-api-service.js +519 -0
  96. package/dist/services/mm-api-service/mm-api-service.js.map +1 -0
  97. package/dist/services/mm-api-service/token-mgr.js +113 -0
  98. package/dist/services/mm-api-service/token-mgr.js.map +1 -0
  99. package/dist/services/mm-api-service/types/checkpoint.js +2 -0
  100. package/dist/services/mm-api-service/types/checkpoint.js.map +1 -0
  101. package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
  102. package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
  103. package/dist/services/mm-api-service/types/entity-transformer.js +186 -0
  104. package/dist/services/mm-api-service/types/entity-transformer.js.map +1 -0
  105. package/dist/services/mm-api-service/types/mm-response-interfaces.js +34 -0
  106. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +1 -0
  107. package/dist/services/mm-api-service/types/receive-types.d.ts +0 -3
  108. package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
  109. package/dist/services/mm-api-service/types/receive-types.js +55 -0
  110. package/dist/services/mm-api-service/types/receive-types.js.map +1 -0
  111. package/dist/services/mm-api-service/types/send-types.js +337 -0
  112. package/dist/services/mm-api-service/types/send-types.js.map +1 -0
  113. package/dist/services/psql-erp-service/configuration.js +2 -0
  114. package/dist/services/psql-erp-service/configuration.js.map +1 -0
  115. package/dist/services/psql-erp-service/index.d.ts +3 -3
  116. package/dist/services/psql-erp-service/index.d.ts.map +1 -1
  117. package/dist/services/psql-erp-service/index.js +10 -0
  118. package/dist/services/psql-erp-service/index.js.map +1 -0
  119. package/dist/services/psql-erp-service/internal/types/psql-types.js +5 -0
  120. package/dist/services/psql-erp-service/internal/types/psql-types.js.map +1 -0
  121. package/dist/services/psql-erp-service/psql-helpers.js +99 -0
  122. package/dist/services/psql-erp-service/psql-helpers.js.map +1 -0
  123. package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
  124. package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
  125. package/dist/services/psql-erp-service/psql-service.js +187 -0
  126. package/dist/services/psql-erp-service/psql-service.js.map +1 -0
  127. package/dist/services/reporting-service/index.d.ts +1 -1
  128. package/dist/services/reporting-service/index.d.ts.map +1 -1
  129. package/dist/services/reporting-service/index.js +5 -0
  130. package/dist/services/reporting-service/index.js.map +1 -0
  131. package/dist/services/reporting-service/logger.d.ts.map +1 -1
  132. package/dist/services/reporting-service/logger.js +221 -0
  133. package/dist/services/reporting-service/logger.js.map +1 -0
  134. package/dist/services/sql-server-erp-service/configuration.js +2 -0
  135. package/dist/services/sql-server-erp-service/configuration.js.map +1 -0
  136. package/dist/services/sql-server-erp-service/index.d.ts +3 -3
  137. package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
  138. package/dist/services/sql-server-erp-service/index.js +11 -0
  139. package/dist/services/sql-server-erp-service/index.js.map +1 -0
  140. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
  141. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
  142. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +50 -0
  143. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +1 -0
  144. package/dist/services/sql-server-erp-service/internal/sql-server-config.js +40 -0
  145. package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +1 -0
  146. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +36 -0
  147. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +1 -0
  148. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +2 -0
  149. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +1 -0
  150. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
  151. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
  152. package/dist/services/sql-server-erp-service/sql-server-helpers.js +66 -0
  153. package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +1 -0
  154. package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
  155. package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
  156. package/dist/services/sql-server-erp-service/sql-server-service.js +154 -0
  157. package/dist/services/sql-server-erp-service/sql-server-service.js.map +1 -0
  158. package/dist/services/sql-server-erp-service/types/sql-input-param.js +2 -0
  159. package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +1 -0
  160. package/dist/services/sqlite-service/index.d.ts +1 -1
  161. package/dist/services/sqlite-service/index.d.ts.map +1 -1
  162. package/dist/services/sqlite-service/index.js +2 -0
  163. package/dist/services/sqlite-service/index.js.map +1 -0
  164. package/dist/services/sqlite-service/sqlite-coordinator.js +60 -0
  165. package/dist/services/sqlite-service/sqlite-coordinator.js.map +1 -0
  166. package/dist/types/erp-connector.d.ts +9 -2
  167. package/dist/types/erp-connector.d.ts.map +1 -1
  168. package/dist/types/erp-connector.js +2 -0
  169. package/dist/types/erp-connector.js.map +1 -0
  170. package/dist/types/erp-types.js +13 -0
  171. package/dist/types/erp-types.js.map +1 -0
  172. package/dist/types/flattened-work-order.d.ts +99 -0
  173. package/dist/types/flattened-work-order.d.ts.map +1 -0
  174. package/dist/types/flattened-work-order.js +2 -0
  175. package/dist/types/flattened-work-order.js.map +1 -0
  176. package/dist/types/index.d.ts +3 -2
  177. package/dist/types/index.d.ts.map +1 -1
  178. package/dist/types/index.js +6 -0
  179. package/dist/types/index.js.map +1 -0
  180. package/dist/utils/application-initializer.js +55 -0
  181. package/dist/utils/application-initializer.js.map +1 -0
  182. package/dist/utils/cleanup-numbers.js +6 -0
  183. package/dist/utils/cleanup-numbers.js.map +1 -0
  184. package/dist/utils/connector-factory.d.ts +1 -1
  185. package/dist/utils/connector-factory.d.ts.map +1 -1
  186. package/dist/utils/connector-factory.js +34 -0
  187. package/dist/utils/connector-factory.js.map +1 -0
  188. package/dist/utils/connector-log/log-deduper.d.ts +1 -1
  189. package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
  190. package/dist/utils/connector-log/log-deduper.js +240 -0
  191. package/dist/utils/connector-log/log-deduper.js.map +1 -0
  192. package/dist/utils/connector-log/mm-connector-logger-example.d.ts +1 -0
  193. package/dist/utils/connector-log/mm-connector-logger-example.js +88 -0
  194. package/dist/utils/connector-log/mm-connector-logger-example.js.map +1 -0
  195. package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
  196. package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
  197. package/dist/utils/connector-log/mm-connector-logger.js +151 -0
  198. package/dist/utils/connector-log/mm-connector-logger.js.map +1 -0
  199. package/dist/utils/data-transformation.js +38 -0
  200. package/dist/utils/data-transformation.js.map +1 -0
  201. package/dist/utils/env.d.ts +8 -0
  202. package/dist/utils/env.d.ts.map +1 -0
  203. package/dist/utils/env.js +58 -0
  204. package/dist/utils/env.js.map +1 -0
  205. package/dist/utils/erp-timezone-utils.d.ts +20 -0
  206. package/dist/utils/erp-timezone-utils.d.ts.map +1 -0
  207. package/dist/utils/erp-timezone-utils.js +75 -0
  208. package/dist/utils/erp-timezone-utils.js.map +1 -0
  209. package/dist/utils/erp-type-from-entity.d.ts +1 -1
  210. package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
  211. package/dist/utils/erp-type-from-entity.js +6 -0
  212. package/dist/utils/erp-type-from-entity.js.map +1 -0
  213. package/dist/utils/error-utils.js +21 -0
  214. package/dist/utils/error-utils.js.map +1 -0
  215. package/dist/utils/http-client.js +189 -0
  216. package/dist/utils/http-client.js.map +1 -0
  217. package/dist/utils/index.d.ts +34 -38
  218. package/dist/utils/index.d.ts.map +1 -1
  219. package/dist/utils/index.js +66 -0
  220. package/dist/utils/index.js.map +1 -0
  221. package/dist/utils/local-data-store/database-lock.js +68 -0
  222. package/dist/utils/local-data-store/database-lock.js.map +1 -0
  223. package/dist/utils/local-data-store/jobs-shared-data.d.ts +2 -0
  224. package/dist/utils/local-data-store/jobs-shared-data.d.ts.map +1 -1
  225. package/dist/utils/local-data-store/jobs-shared-data.js +118 -0
  226. package/dist/utils/local-data-store/jobs-shared-data.js.map +1 -0
  227. package/dist/utils/mm-labor-ticket-helpers.d.ts +4 -5
  228. package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
  229. package/dist/utils/mm-labor-ticket-helpers.js +28 -0
  230. package/dist/utils/mm-labor-ticket-helpers.js.map +1 -0
  231. package/dist/utils/removeExtraneousFields.d.ts +1 -1
  232. package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
  233. package/dist/utils/removeExtraneousFields.js +16 -0
  234. package/dist/utils/removeExtraneousFields.js.map +1 -0
  235. package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
  236. package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
  237. package/dist/utils/removeIdFieldFromPayload.js +16 -0
  238. package/dist/utils/removeIdFieldFromPayload.js.map +1 -0
  239. package/dist/utils/resource-group.d.ts +1 -1
  240. package/dist/utils/resource-group.d.ts.map +1 -1
  241. package/dist/utils/resource-group.js +59 -0
  242. package/dist/utils/resource-group.js.map +1 -0
  243. package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
  244. package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
  245. package/dist/utils/standard-process-drivers/error-processor.js +262 -0
  246. package/dist/utils/standard-process-drivers/error-processor.js.map +1 -0
  247. package/dist/utils/standard-process-drivers/index.d.ts +3 -3
  248. package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
  249. package/dist/utils/standard-process-drivers/index.js +4 -0
  250. package/dist/utils/standard-process-drivers/index.js.map +1 -0
  251. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +16 -1
  252. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  253. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +299 -0
  254. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +1 -0
  255. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +11 -5
  256. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  257. package/dist/utils/standard-process-drivers/mm-entity-processor.js +174 -0
  258. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +1 -0
  259. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +12 -6
  260. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  261. package/dist/utils/standard-process-drivers/standard-process-drivers.js +333 -0
  262. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +1 -0
  263. package/dist/utils/time-utils.d.ts.map +1 -1
  264. package/dist/utils/time-utils.js +103 -0
  265. package/dist/utils/time-utils.js.map +1 -0
  266. package/dist/utils/timezone.js +105 -0
  267. package/dist/utils/timezone.js.map +1 -0
  268. package/dist/utils/trimObjectValues.js +11 -0
  269. package/dist/utils/trimObjectValues.js.map +1 -0
  270. package/dist/utils/uniqueRows.js +35 -0
  271. package/dist/utils/uniqueRows.js.map +1 -0
  272. package/package.json +8 -10
  273. package/src/index.ts +42 -45
  274. package/src/knexfile.ts +1 -0
  275. package/src/services/caching-service/batch-cache-manager.ts +2 -2
  276. package/src/services/caching-service/hashed-cache-manager.ts +5 -5
  277. package/src/services/caching-service/index.ts +1 -1
  278. package/src/services/caching-service/record-tracking-manager.ts +2 -2
  279. package/src/services/data-sync-service/configuration-manager.ts +52 -39
  280. package/src/services/data-sync-service/data-sync-service.ts +10 -19
  281. package/src/services/data-sync-service/index.ts +3 -3
  282. package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +5 -4
  283. package/src/services/data-sync-service/jobs/from-erp.ts +12 -6
  284. package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +4 -3
  285. package/src/services/data-sync-service/jobs/run-migrations.ts +4 -3
  286. package/src/services/data-sync-service/jobs/to-erp.ts +5 -14
  287. package/src/services/erp-api-services/errors.ts +3 -3
  288. package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
  289. package/src/services/erp-api-services/index.ts +8 -8
  290. package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
  291. package/src/services/erp-api-services/types.ts +2 -2
  292. package/src/services/mm-api-service/index.ts +6 -14
  293. package/src/services/mm-api-service/mm-api-service.ts +13 -30
  294. package/src/services/mm-api-service/token-mgr.ts +4 -4
  295. package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
  296. package/src/services/mm-api-service/types/receive-types.ts +0 -1
  297. package/src/services/psql-erp-service/index.ts +3 -3
  298. package/src/services/psql-erp-service/psql-service.ts +4 -4
  299. package/src/services/reporting-service/index.ts +1 -1
  300. package/src/services/reporting-service/logger.ts +116 -81
  301. package/src/services/sql-server-erp-service/index.ts +3 -3
  302. package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
  303. package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
  304. package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
  305. package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
  306. package/src/services/sqlite-service/index.ts +1 -1
  307. package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
  308. package/src/types/erp-connector.ts +9 -2
  309. package/src/types/flattened-work-order.ts +108 -0
  310. package/src/types/index.ts +10 -2
  311. package/src/utils/application-initializer.ts +5 -5
  312. package/src/utils/connector-factory.ts +2 -2
  313. package/src/utils/connector-log/log-deduper.ts +2 -2
  314. package/src/utils/connector-log/mm-connector-logger.ts +3 -3
  315. package/src/utils/env.ts +75 -0
  316. package/src/utils/erp-timezone-utils.ts +99 -0
  317. package/src/utils/erp-type-from-entity.ts +1 -1
  318. package/src/utils/http-client.ts +5 -4
  319. package/src/utils/index.ts +38 -39
  320. package/src/utils/local-data-store/database-lock.ts +1 -1
  321. package/src/utils/local-data-store/jobs-shared-data.ts +2 -0
  322. package/src/utils/mm-labor-ticket-helpers.ts +12 -9
  323. package/src/utils/removeExtraneousFields.ts +1 -1
  324. package/src/utils/removeIdFieldFromPayload.ts +1 -1
  325. package/src/utils/resource-group.ts +2 -2
  326. package/src/utils/standard-process-drivers/error-processor.ts +5 -5
  327. package/src/utils/standard-process-drivers/index.ts +3 -3
  328. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +225 -69
  329. package/src/utils/standard-process-drivers/mm-entity-processor.ts +14 -8
  330. package/src/utils/standard-process-drivers/standard-process-drivers.ts +39 -25
  331. package/src/utils/time-utils.ts +14 -3
  332. package/src/utils/timezone.ts +2 -2
  333. package/dist/config-CvA-mFWF.js +0 -418
  334. package/dist/config-CvA-mFWF.js.map +0 -1
  335. package/dist/connector-factory-BPm2GVVF.js +0 -30
  336. package/dist/connector-factory-BPm2GVVF.js.map +0 -1
  337. package/dist/hashed-cache-manager-B15NN8hK.js +0 -322
  338. package/dist/hashed-cache-manager-B15NN8hK.js.map +0 -1
  339. package/dist/index-D8qO1NyK.js +0 -192
  340. package/dist/index-D8qO1NyK.js.map +0 -1
  341. package/dist/knexfile-Bng2Ru9c.js +0 -20
  342. package/dist/knexfile-Bng2Ru9c.js.map +0 -1
  343. package/dist/logger-BWw0_z9q.js +0 -17557
  344. package/dist/logger-BWw0_z9q.js.map +0 -1
  345. package/dist/mm-erp-sdk.js +0 -4978
  346. package/dist/mm-erp-sdk.js.map +0 -1
  347. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +0 -30
  348. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +0 -1
  349. package/dist/services/mm-api-service/company-info.d.ts +0 -13
  350. package/dist/services/mm-api-service/company-info.d.ts.map +0 -1
  351. package/dist/services/nats-service/nats-service.d.ts +0 -114
  352. package/dist/services/nats-service/nats-service.d.ts.map +0 -1
  353. package/dist/services/nats-service/test-nats-subscriber.d.ts +0 -6
  354. package/dist/services/nats-service/test-nats-subscriber.d.ts.map +0 -1
  355. package/dist/utils/error-formatter.d.ts +0 -19
  356. package/dist/utils/error-formatter.d.ts.map +0 -1
  357. package/src/services/data-sync-service/nats-labor-ticket-listener.ts +0 -341
  358. package/src/services/mm-api-service/company-info.ts +0 -87
  359. package/src/services/nats-service/nats-service.ts +0 -351
  360. package/src/services/nats-service/test-nats-subscriber.ts +0 -96
  361. package/src/utils/error-formatter.ts +0 -205
@@ -1,30 +0,0 @@
1
- /**
2
- * Manages NATS-based real-time labor ticket processing
3
- */
4
- export declare class NatsLaborTicketListener {
5
- private connector;
6
- private natsService?;
7
- constructor(connector: any);
8
- /**
9
- * Start listening for labor ticket events via NATS
10
- */
11
- start(): Promise<void>;
12
- /**
13
- * Register health check handler - responds immediately to let Dashboard know connector is online
14
- */
15
- private registerHealthCheckHandler;
16
- /**
17
- * Register labor ticket processing handler
18
- */
19
- private registerLaborTicketHandler;
20
- /**
21
- * Process labor ticket in ERP and then create MM entities with ERP ID attached
22
- */
23
- private processLaborTicket;
24
- /**
25
- * Update checkpoint to prevent to-erp polling job from reprocessing this ticket
26
- * Only updates if the new timestamp is later than the current checkpoint (prevents moving backwards)
27
- */
28
- private updateCheckpoint;
29
- }
30
- //# sourceMappingURL=nats-labor-ticket-listener.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nats-labor-ticket-listener.d.ts","sourceRoot":"","sources":["../../../src/services/data-sync-service/nats-labor-ticket-listener.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,SAAS,EAAE,GAAG;IAI1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAoBlC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA8GlC;;OAEG;YACW,kBAAkB;IA6FhC;;;OAGG;YACW,gBAAgB;CAyC/B"}
@@ -1,13 +0,0 @@
1
- export interface CompanyInfo {
2
- timezone: string;
3
- locationRef: string;
4
- companyId: string;
5
- }
6
- /**
7
- * Fetches company information from /accounts/current endpoint
8
- * Results are cached to avoid repeated API calls
9
- * @returns Promise<CompanyInfo> Company information including timezone, locationRef, and companyId
10
- * @throws Error if unable to fetch company information
11
- */
12
- export declare const getCompanyInfo: () => Promise<CompanyInfo>;
13
- //# sourceMappingURL=company-info.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"company-info.d.ts","sourceRoot":"","sources":["../../../src/services/mm-api-service/company-info.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,WAAW,CA8D1D,CAAC"}
@@ -1,114 +0,0 @@
1
- /**
2
- * NATS Service - Central connection and subscription management
3
- * Allows connectors to register handlers for different NATS subjects
4
- */
5
- export interface NatsMessageHandler {
6
- /**
7
- * Handler function for NATS messages
8
- * - Return a value to reply (if msg has reply subject)
9
- * - Return void/undefined for pub-sub (no reply)
10
- */
11
- handle: (data: any, subject: string) => Promise<any | void>;
12
- }
13
- export interface NatsHandlerRegistration {
14
- /**
15
- * Subject pattern to subscribe to (supports wildcards: *, >)
16
- * Examples:
17
- * - "mm.14.epic01.labor-ticket.*" (single level wildcard)
18
- * - "mm.14.epic01.erp.>" (multi-level wildcard)
19
- */
20
- subject: string;
21
- /**
22
- * Handler for this subject
23
- */
24
- handler: NatsMessageHandler;
25
- /**
26
- * Optional description for logging/debugging
27
- */
28
- description?: string;
29
- }
30
- export interface NatsServiceConfig {
31
- /**
32
- * NATS server URLs
33
- */
34
- servers: string | string[];
35
- /**
36
- * Connection name (for monitoring)
37
- */
38
- name: string;
39
- /**
40
- * Location reference (for subject namespacing)
41
- */
42
- locationRef: string;
43
- /**
44
- * ERP type (epicor, infor, etc.)
45
- */
46
- erpType: string;
47
- /**
48
- * Enable/disable NATS
49
- */
50
- enabled: boolean;
51
- /**
52
- * Auto-reconnect settings
53
- */
54
- reconnect?: boolean;
55
- maxReconnectAttempts?: number;
56
- reconnectTimeWait?: number;
57
- }
58
- export declare class NatsService {
59
- private connection;
60
- private subscriptions;
61
- private config;
62
- private handlers;
63
- private statusPublishTimer;
64
- constructor(config: NatsServiceConfig);
65
- /**
66
- * Register a handler for a specific subject pattern
67
- */
68
- registerHandler(registration: NatsHandlerRegistration): void;
69
- /**
70
- * Connect to NATS and start all registered handlers
71
- */
72
- connect(): Promise<void>;
73
- /**
74
- * Start a single handler (subscribe to its subject)
75
- */
76
- private startHandler;
77
- /**
78
- * Publish a message to a subject (for pub/sub)
79
- */
80
- publish(subject: string, data: any): Promise<void>;
81
- /**
82
- * Send a request and wait for reply (for request-reply)
83
- */
84
- request(subject: string, data: any, timeoutMs?: number): Promise<any>;
85
- /**
86
- * Check if connected to NATS
87
- */
88
- isConnected(): boolean;
89
- /**
90
- * Start automatic status publishing (every 30 seconds)
91
- */
92
- private startStatusPublishing;
93
- /**
94
- * Publish connector status
95
- */
96
- private publishStatus;
97
- /**
98
- * Monitor connection status
99
- */
100
- private monitorConnection;
101
- /**
102
- * Setup graceful shutdown
103
- */
104
- private setupShutdown;
105
- /**
106
- * Disconnect from NATS
107
- */
108
- disconnect(): Promise<void>;
109
- /**
110
- * Get the location reference
111
- */
112
- getLocationRef(): string;
113
- }
114
- //# sourceMappingURL=nats-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nats-service.d.ts","sourceRoot":"","sources":["../../../src/services/nats-service/nats-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,kBAAkB,CAAC;IAE5B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,kBAAkB,CAA+B;gBAE7C,MAAM,EAAE,iBAAiB;IAIrC;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,uBAAuB,GAAG,IAAI;IAQ5D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C9B;;OAEG;YACW,YAAY;IA+D1B;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAWxD;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAqBlF;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;YACW,aAAa;IAoB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Simple proof-of-concept NATS subscriber
3
- * Subscribes to mm.14.> and replies with "hello world"
4
- */
5
- export {};
6
- //# sourceMappingURL=test-nats-subscriber.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-nats-subscriber.d.ts","sourceRoot":"","sources":["../../../src/services/nats-service/test-nats-subscriber.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Error formatter utility for standardizing error messages across connectors
3
- * Extracts human-readable messages from various error types (axios, custom errors, etc.)
4
- */
5
- export interface FormattedError {
6
- message: string;
7
- code: string;
8
- httpStatus?: number;
9
- metadata?: Record<string, any>;
10
- }
11
- /**
12
- * Extract meaningful error message from various error types
13
- */
14
- export declare function formatError(error: any): FormattedError;
15
- /**
16
- * Format error for logging (shorter, cleaner version)
17
- */
18
- export declare function formatErrorForLogging(error: any): string;
19
- //# sourceMappingURL=error-formatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/error-formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,cAAc,CA6CtD;AAkID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAUxD"}
@@ -1,341 +0,0 @@
1
- import logger from "../reporting-service/logger";
2
- import { formatError } from "../../utils/error-formatter";
3
- import { NatsService } from "../nats-service/nats-service";
4
- import { MMReceiveLaborTicket, MMApiClient, getCompanyInfo } from "../mm-api-service";
5
- import { SQLiteCoordinator } from "../sqlite-service";
6
-
7
- /**
8
- * Manages NATS-based real-time labor ticket processing
9
- */
10
- export class NatsLaborTicketListener {
11
- private connector: any;
12
- private natsService?: NatsService;
13
-
14
- constructor(connector: any) {
15
- this.connector = connector;
16
- }
17
-
18
- /**
19
- * Start listening for labor ticket events via NATS
20
- */
21
- async start(): Promise<void> {
22
- try {
23
- // Fetch company info from MM API (includes locationRef)
24
- const companyInfo = await getCompanyInfo();
25
- const erpType = this.connector.type || "unknown";
26
-
27
- logger.info("Starting NATS listener for labor tickets", {
28
- locationRef: companyInfo.locationRef,
29
- companyId: companyInfo.companyId,
30
- erpType,
31
- servers: process.env.NATS_SERVERS || "nats://localhost:4222",
32
- });
33
-
34
- this.natsService = new NatsService({
35
- servers: process.env.NATS_SERVERS || "nats://localhost:4222",
36
- name: `${erpType}-connector`,
37
- locationRef: companyInfo.locationRef,
38
- erpType,
39
- enabled: true,
40
- reconnect: true,
41
- maxReconnectAttempts: -1,
42
- reconnectTimeWait: 2000,
43
- });
44
-
45
- // Register health check handler
46
- this.registerHealthCheckHandler(companyInfo.locationRef, erpType);
47
-
48
- // Register labor ticket handler
49
- this.registerLaborTicketHandler(companyInfo.locationRef, erpType);
50
-
51
- // Connect to NATS
52
- await this.natsService.connect();
53
-
54
- logger.info("NATS listener started successfully", {
55
- subject: `mm.14.${companyInfo.locationRef}.labor-ticket.*`,
56
- });
57
- } catch (error) {
58
- logger.error("Failed to start NATS listener", { error });
59
- // Don't throw - allow REST polling to continue
60
- }
61
- }
62
-
63
- /**
64
- * Register health check handler - responds immediately to let Dashboard know connector is online
65
- */
66
- private registerHealthCheckHandler(locationRef: string, erpType: string): void {
67
- if (!this.natsService) return;
68
-
69
- this.natsService.registerHandler({
70
- subject: `mm.14.${locationRef}.erp.health`,
71
- description: "Health check - responds immediately to indicate connector is online",
72
- handler: {
73
- handle: async () => {
74
- logger.debug("Health check received, sending pong");
75
- return {
76
- status: "online",
77
- timestamp: new Date().toISOString(),
78
- locationRef,
79
- erpType,
80
- };
81
- },
82
- },
83
- });
84
- }
85
-
86
- /**
87
- * Register labor ticket processing handler
88
- */
89
- private registerLaborTicketHandler(locationRef: string, erpType: string): void {
90
- if (!this.natsService) return;
91
-
92
- this.natsService.registerHandler({
93
- subject: `mm.14.${locationRef}.labor-ticket.*`,
94
- description: "Process labor tickets in real-time from NATS",
95
- handler: {
96
- handle: async ({ data }: any, subject: string) => {
97
- const action = subject.split(".").pop();
98
- const { actionPayload } = data;
99
- const startTime = Date.now();
100
- const { laborTicketRef } = actionPayload;
101
-
102
- logger.info("Received labor ticket via NATS", {
103
- action,
104
- requestId: data.requestId,
105
- laborTicketRef,
106
- });
107
-
108
- // Use the same lock as to-erp job to prevent concurrent processing
109
- return await SQLiteCoordinator.executeWithLock("to-erp", async () => {
110
- try {
111
- let laborTicketData;
112
-
113
- if (laborTicketRef) {
114
- // Fetch the full labor ticket data using the laborTicketRef
115
- const mmApiClient = new MMApiClient();
116
- const laborTicket = await mmApiClient.fetchLaborTicketByRef(laborTicketRef);
117
-
118
- logger.info("Fetched labor ticket data from MM API", {
119
- laborTicketRef,
120
- laborTicketId: laborTicket.laborTicketId,
121
- });
122
-
123
- // Merge changed fields from actionPayload to ensure we process the actual changes
124
- laborTicketData = {
125
- ...laborTicket,
126
- ...actionPayload,
127
- };
128
- } else {
129
- // No laborTicketRef provided, use the actionPayload directly
130
- logger.info("No laborTicketRef provided, using actionPayload directly", {
131
- requestId: data.requestId,
132
- });
133
-
134
- laborTicketData = actionPayload;
135
- }
136
-
137
- const mergedLaborTicket = new MMReceiveLaborTicket(laborTicketData);
138
-
139
- // Process labor ticket: ERP operation first, then create MM entities with ERP ID
140
- const result = await this.processLaborTicket(
141
- mergedLaborTicket,
142
- action || "unknown"
143
- );
144
-
145
- // Update checkpoint to prevent to-erp polling job from reprocessing this ticket
146
- await this.updateCheckpoint(erpType, result);
147
-
148
- // Return response with full labor ticket data for immediate frontend state update
149
- return {
150
- status: "success",
151
- requestId: data.requestId,
152
- action,
153
- timestamp: new Date().toISOString(),
154
- processingTimeMs: Date.now() - startTime,
155
- laborTicketRef: result.laborTicketRef,
156
- laborTicket: result.laborTicket,
157
- };
158
- } catch (error) {
159
- // Check if error was already formatted in inner catch block
160
- const formattedError = (error as any)?._formatted || formatError(error);
161
-
162
- // Debug logging
163
- logger.debug("Error details", {
164
- hasFormatted: !!(error as any)?._formatted,
165
- isAxiosError: (error as any)?.isAxiosError,
166
- errorMessage: (error as any)?.message,
167
- responseStatus: (error as any)?.response?.status,
168
- responseData: (error as any)?.response?.data,
169
- });
170
-
171
- logger.error("Error handling labor ticket from NATS", {
172
- error: formattedError.message,
173
- code: formattedError.code,
174
- requestId: data.requestId,
175
- laborTicketRef,
176
- });
177
-
178
- return {
179
- status: "error",
180
- requestId: data.requestId,
181
- action,
182
- timestamp: new Date().toISOString(),
183
- processingTimeMs: Date.now() - startTime,
184
- error: {
185
- message: formattedError.message,
186
- code: formattedError.code,
187
- httpStatus: formattedError.httpStatus,
188
- metadata: formattedError.metadata,
189
- laborTicketRef,
190
- },
191
- };
192
- }
193
- });
194
- },
195
- },
196
- });
197
- }
198
-
199
- /**
200
- * Process labor ticket in ERP and then create MM entities with ERP ID attached
201
- */
202
- private async processLaborTicket(
203
- laborTicket: MMReceiveLaborTicket,
204
- action: string
205
- ): Promise<{ laborTicketRef: string; laborTicket: any }> {
206
- const { MMEntityProcessor } = await import("../../utils/standard-process-drivers/mm-entity-processor");
207
- const { ERPObjType } = await import("../../types/erp-types");
208
- const { MMSendLaborTicket } = await import("../mm-api-service");
209
-
210
- logger.info("Processing labor ticket: ERP first, then MM creation", {
211
- laborTicketRef: laborTicket.laborTicketRef,
212
- action,
213
- hasLaborTicketId: !!laborTicket.laborTicketId,
214
- });
215
-
216
- try {
217
- let erpResult;
218
-
219
- if (action === "create" || !laborTicket.laborTicketId) {
220
- // Create new labor ticket in ERP
221
- erpResult = await this.connector.createLaborTicketInERP(laborTicket);
222
- logger.info("Successfully created labor ticket in ERP", {
223
- laborTicketRef: laborTicket.laborTicketRef,
224
- erpUid: erpResult.erpUid,
225
- });
226
- } else {
227
- // Update existing labor ticket in ERP
228
- erpResult = { laborTicket: await this.connector.updateLaborTicketInERP(laborTicket) };
229
- logger.info("Successfully updated labor ticket in ERP", {
230
- laborTicketRef: laborTicket.laborTicketRef,
231
- });
232
- }
233
-
234
- // Now update MM entities with ERP ID attached
235
- const laborTicketForMM = { ...laborTicket };
236
- if (erpResult.erpUid) {
237
- laborTicketForMM.laborTicketId = erpResult.erpUid;
238
-
239
- // If this was a create (no initial laborTicketId) with a laborTicketRef,
240
- // patch the existing orphaned MM record with the new ERP ID first
241
- if (!laborTicket.laborTicketId && laborTicketForMM.laborTicketRef) {
242
- const mmApiClient = new MMApiClient();
243
- await mmApiClient.updateLaborTicketIdByRef(
244
- laborTicketForMM.laborTicketRef,
245
- erpResult.erpUid
246
- );
247
-
248
- logger.info("Patched existing MM labor ticket with new ERP ID", {
249
- laborTicketRef: laborTicketForMM.laborTicketRef,
250
- laborTicketId: erpResult.erpUid,
251
- });
252
- }
253
- }
254
-
255
- // Set state based on clockOut before writing to MM
256
- laborTicketForMM.state = laborTicketForMM.clockOut ? "CLOSED" : "OPEN";
257
-
258
- // Write all fields to MM (this updates the existing record now that it has laborTicketId)
259
- const mmLaborTicket = MMSendLaborTicket.fromPlainObject(laborTicketForMM as any);
260
-
261
- const mmResult = await MMEntityProcessor.writeEntities(
262
- ERPObjType.LABOR_TICKETS,
263
- [mmLaborTicket],
264
- null // No caching for real-time operations
265
- );
266
-
267
- logger.info("Successfully updated MM entities after ERP operation", {
268
- laborTicketRef: laborTicketForMM.laborTicketRef,
269
- laborTicketId: laborTicketForMM.laborTicketId,
270
- entitiesCreated: mmResult.upsertedEntities,
271
- });
272
-
273
- return {
274
- laborTicketRef: laborTicketForMM.laborTicketRef!,
275
- laborTicket: laborTicketForMM,
276
- };
277
- } catch (error) {
278
- // Format error to preserve meaningful message
279
- const formattedError = formatError(error);
280
-
281
- logger.error("Failed to process labor ticket with MM creation", {
282
- laborTicketRef: laborTicket.laborTicketRef,
283
- action,
284
- error: formattedError.message,
285
- code: formattedError.code,
286
- });
287
-
288
- // Create enhanced error to propagate
289
- const enhancedError: any = error;
290
- enhancedError._formatted = formattedError;
291
- throw enhancedError;
292
- }
293
- }
294
-
295
- /**
296
- * Update checkpoint to prevent to-erp polling job from reprocessing this ticket
297
- * Only updates if the new timestamp is later than the current checkpoint (prevents moving backwards)
298
- */
299
- private async updateCheckpoint(
300
- erpType: string,
301
- result: { laborTicketRef: string; laborTicket: any }
302
- ): Promise<void> {
303
- const mmApiClient = new MMApiClient();
304
- const currentCheckpoint = await mmApiClient.getCheckpoint({
305
- system: erpType,
306
- table: "labor_tickets",
307
- checkpointType: "export",
308
- checkpointValue: {
309
- timestamp: "",
310
- },
311
- });
312
-
313
- const currentTimestamp = (currentCheckpoint as any)?.timestamp;
314
- const newTimestamp = result.laborTicket.updatedAt || new Date().toISOString();
315
-
316
- // Only update checkpoint if new timestamp is later than current (prevents moving backwards)
317
- if (!currentTimestamp || new Date(newTimestamp) > new Date(currentTimestamp)) {
318
- await mmApiClient.saveCheckpoint({
319
- system: erpType,
320
- table: "labor_tickets",
321
- checkpointType: "export",
322
- checkpointValue: {
323
- timestamp: newTimestamp,
324
- },
325
- });
326
-
327
- logger.debug("Updated export checkpoint after NATS processing", {
328
- laborTicketRef: result.laborTicketRef,
329
- previousCheckpoint: currentTimestamp,
330
- newCheckpoint: newTimestamp,
331
- });
332
- } else {
333
- logger.debug("Skipped checkpoint update (timestamp not newer)", {
334
- laborTicketRef: result.laborTicketRef,
335
- currentCheckpoint: currentTimestamp,
336
- ticketTimestamp: newTimestamp,
337
- });
338
- }
339
- }
340
- }
341
-
@@ -1,87 +0,0 @@
1
- import { CoreConfiguration } from "../data-sync-service/configuration-manager";
2
- import { HTTPClientFactory } from "../../utils/http-client";
3
- import { logger } from "../reporting-service";
4
-
5
- // Cache for company info to avoid repeated API calls
6
- let companyInfoCache: {
7
- timezone: string;
8
- locationRef: string;
9
- companyId: string;
10
- } | null = null;
11
-
12
- export interface CompanyInfo {
13
- timezone: string;
14
- locationRef: string;
15
- companyId: string;
16
- }
17
-
18
- /**
19
- * Fetches company information from /accounts/current endpoint
20
- * Results are cached to avoid repeated API calls
21
- * @returns Promise<CompanyInfo> Company information including timezone, locationRef, and companyId
22
- * @throws Error if unable to fetch company information
23
- */
24
- export const getCompanyInfo = async (): Promise<CompanyInfo> => {
25
- // Return cached value if available
26
- if (companyInfoCache) {
27
- return companyInfoCache;
28
- }
29
-
30
- try {
31
- // Get the configuration
32
- const config = CoreConfiguration.inst();
33
- const apiUrl = config.mmApiBaseUrl;
34
- const authToken = config.mmApiAuthToken;
35
-
36
- if (!apiUrl || !authToken) {
37
- throw new Error("Missing required configuration for company info fetch");
38
- }
39
-
40
- // Create HTTP client
41
- const client = HTTPClientFactory.getInstance({
42
- baseUrl: apiUrl,
43
- retryAttempts: config.mmApiRetryAttempts,
44
- });
45
-
46
- // Fetch user/company information from the API
47
- const response = await client.request<{
48
- company: {
49
- timezone: string;
50
- id: string;
51
- };
52
- locationRef: number;
53
- }>({
54
- url: "/accounts/current?includeLocation=true",
55
- method: "GET",
56
- headers: {
57
- Authorization: `Bearer ${authToken}`,
58
- },
59
- });
60
-
61
- const userInfo = response.data;
62
- if (!userInfo?.company) {
63
- throw new Error("Unable to retrieve company information from API");
64
- }
65
-
66
- // Debug: Log what we actually got from the API
67
- logger.info("Fetched company info from /accounts/current", {
68
- locationRef: userInfo.locationRef,
69
- companyId: userInfo.company.id,
70
- timezone: userInfo.company.timezone,
71
- });
72
-
73
- // Cache and return company info - locationRef is at top level, not in company
74
- companyInfoCache = {
75
- timezone: userInfo.company.timezone,
76
- locationRef: String(userInfo.locationRef), // Convert number to string
77
- companyId: userInfo.company.id,
78
- };
79
-
80
- return companyInfoCache;
81
- } catch (error) {
82
- throw new Error(
83
- `Failed to get company info: ${error instanceof Error ? error.message : "Unknown error"}`
84
- );
85
- }
86
- };
87
-