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

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 +0 -5
  2. package/dist/config-CvA-mFWF.js +418 -0
  3. package/dist/config-CvA-mFWF.js.map +1 -0
  4. package/dist/connector-factory-BPm2GVVF.js +30 -0
  5. package/dist/connector-factory-BPm2GVVF.js.map +1 -0
  6. package/dist/hashed-cache-manager-B15NN8hK.js +322 -0
  7. package/dist/hashed-cache-manager-B15NN8hK.js.map +1 -0
  8. package/dist/index-D8qO1NyK.js +192 -0
  9. package/dist/index-D8qO1NyK.js.map +1 -0
  10. package/dist/index.d.ts +43 -42
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/knexfile-Bng2Ru9c.js +20 -0
  13. package/dist/knexfile-Bng2Ru9c.js.map +1 -0
  14. package/dist/knexfile.d.ts.map +1 -1
  15. package/dist/logger-BWw0_z9q.js +17557 -0
  16. package/dist/logger-BWw0_z9q.js.map +1 -0
  17. package/dist/migrations/20241015162631_create_cache_table.js +15 -11
  18. package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
  19. package/dist/migrations/20241015162632_create_sdk_cache_table.js +15 -11
  20. package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
  21. package/dist/migrations/20250103162631_create_record_tracking_table.js +15 -14
  22. package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
  23. package/dist/mm-erp-sdk.js +4978 -0
  24. package/dist/mm-erp-sdk.js.map +1 -0
  25. package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
  26. package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
  27. package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
  28. package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
  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/record-tracking-manager.d.ts +1 -1
  32. package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
  33. package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
  34. package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
  35. package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
  36. package/dist/services/data-sync-service/index.d.ts +3 -3
  37. package/dist/services/data-sync-service/index.d.ts.map +1 -1
  38. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts.map +1 -1
  39. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -42
  40. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
  41. package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
  42. package/dist/services/data-sync-service/jobs/from-erp.js +37 -50
  43. package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
  44. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts.map +1 -1
  45. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +36 -38
  46. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
  47. package/dist/services/data-sync-service/jobs/run-migrations.d.ts.map +1 -1
  48. package/dist/services/data-sync-service/jobs/run-migrations.js +22 -24
  49. package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
  50. package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
  51. package/dist/services/data-sync-service/jobs/to-erp.js +46 -50
  52. package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
  53. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +30 -0
  54. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +1 -0
  55. package/dist/services/erp-api-services/errors.d.ts +1 -1
  56. package/dist/services/erp-api-services/errors.d.ts.map +1 -1
  57. package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
  58. package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
  59. package/dist/services/erp-api-services/index.d.ts +8 -8
  60. package/dist/services/erp-api-services/index.d.ts.map +1 -1
  61. package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
  62. package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
  63. package/dist/services/erp-api-services/types.d.ts +2 -2
  64. package/dist/services/erp-api-services/types.d.ts.map +1 -1
  65. package/dist/services/mm-api-service/company-info.d.ts +13 -0
  66. package/dist/services/mm-api-service/company-info.d.ts.map +1 -0
  67. package/dist/services/mm-api-service/index.d.ts +13 -6
  68. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  69. package/dist/services/mm-api-service/mm-api-service.d.ts +13 -7
  70. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  71. package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
  72. package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
  73. package/dist/services/mm-api-service/types/receive-types.d.ts +3 -0
  74. package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
  75. package/dist/services/nats-service/nats-service.d.ts +114 -0
  76. package/dist/services/nats-service/nats-service.d.ts.map +1 -0
  77. package/dist/services/nats-service/test-nats-subscriber.d.ts +6 -0
  78. package/dist/services/nats-service/test-nats-subscriber.d.ts.map +1 -0
  79. package/dist/services/psql-erp-service/index.d.ts +3 -3
  80. package/dist/services/psql-erp-service/index.d.ts.map +1 -1
  81. package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
  82. package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
  83. package/dist/services/reporting-service/index.d.ts +1 -1
  84. package/dist/services/reporting-service/index.d.ts.map +1 -1
  85. package/dist/services/reporting-service/logger.d.ts.map +1 -1
  86. package/dist/services/sql-server-erp-service/index.d.ts +3 -3
  87. package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
  88. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
  89. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
  90. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
  91. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
  92. package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
  93. package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
  94. package/dist/services/sqlite-service/index.d.ts +1 -1
  95. package/dist/services/sqlite-service/index.d.ts.map +1 -1
  96. package/dist/types/erp-connector.d.ts +2 -9
  97. package/dist/types/erp-connector.d.ts.map +1 -1
  98. package/dist/types/index.d.ts +2 -3
  99. package/dist/types/index.d.ts.map +1 -1
  100. package/dist/utils/connector-factory.d.ts +1 -1
  101. package/dist/utils/connector-factory.d.ts.map +1 -1
  102. package/dist/utils/connector-log/log-deduper.d.ts +1 -1
  103. package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
  104. package/dist/utils/connector-log/mm-connector-logger-example.d.ts +0 -1
  105. package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
  106. package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
  107. package/dist/utils/erp-type-from-entity.d.ts +1 -1
  108. package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
  109. package/dist/utils/error-formatter.d.ts +19 -0
  110. package/dist/utils/error-formatter.d.ts.map +1 -0
  111. package/dist/utils/index.d.ts +38 -34
  112. package/dist/utils/index.d.ts.map +1 -1
  113. package/dist/utils/local-data-store/jobs-shared-data.d.ts +0 -2
  114. package/dist/utils/local-data-store/jobs-shared-data.d.ts.map +1 -1
  115. package/dist/utils/mm-labor-ticket-helpers.d.ts +5 -4
  116. package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
  117. package/dist/utils/removeExtraneousFields.d.ts +1 -1
  118. package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
  119. package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
  120. package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
  121. package/dist/utils/resource-group.d.ts +1 -1
  122. package/dist/utils/resource-group.d.ts.map +1 -1
  123. package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
  124. package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
  125. package/dist/utils/standard-process-drivers/index.d.ts +3 -3
  126. package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
  127. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
  128. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  129. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +5 -11
  130. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  131. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +6 -12
  132. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  133. package/dist/utils/time-utils.d.ts.map +1 -1
  134. package/package.json +10 -8
  135. package/src/index.ts +45 -42
  136. package/src/knexfile.ts +0 -1
  137. package/src/services/caching-service/batch-cache-manager.ts +2 -2
  138. package/src/services/caching-service/hashed-cache-manager.ts +5 -5
  139. package/src/services/caching-service/index.ts +1 -1
  140. package/src/services/caching-service/record-tracking-manager.ts +2 -2
  141. package/src/services/data-sync-service/configuration-manager.ts +39 -52
  142. package/src/services/data-sync-service/data-sync-service.ts +19 -10
  143. package/src/services/data-sync-service/index.ts +3 -3
  144. package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +4 -5
  145. package/src/services/data-sync-service/jobs/from-erp.ts +6 -12
  146. package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +3 -4
  147. package/src/services/data-sync-service/jobs/run-migrations.ts +3 -4
  148. package/src/services/data-sync-service/jobs/to-erp.ts +8 -5
  149. package/src/services/data-sync-service/nats-labor-ticket-listener.ts +341 -0
  150. package/src/services/erp-api-services/errors.ts +3 -3
  151. package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
  152. package/src/services/erp-api-services/index.ts +8 -8
  153. package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
  154. package/src/services/erp-api-services/types.ts +2 -2
  155. package/src/services/mm-api-service/company-info.ts +87 -0
  156. package/src/services/mm-api-service/index.ts +14 -6
  157. package/src/services/mm-api-service/mm-api-service.ts +30 -13
  158. package/src/services/mm-api-service/token-mgr.ts +4 -4
  159. package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
  160. package/src/services/mm-api-service/types/receive-types.ts +1 -0
  161. package/src/services/nats-service/nats-service.ts +351 -0
  162. package/src/services/nats-service/test-nats-subscriber.ts +96 -0
  163. package/src/services/psql-erp-service/index.ts +3 -3
  164. package/src/services/psql-erp-service/psql-service.ts +4 -4
  165. package/src/services/reporting-service/index.ts +1 -1
  166. package/src/services/reporting-service/logger.ts +81 -116
  167. package/src/services/sql-server-erp-service/index.ts +3 -3
  168. package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
  169. package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
  170. package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
  171. package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
  172. package/src/services/sqlite-service/index.ts +1 -1
  173. package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
  174. package/src/types/erp-connector.ts +2 -9
  175. package/src/types/index.ts +2 -10
  176. package/src/utils/application-initializer.ts +5 -5
  177. package/src/utils/connector-factory.ts +2 -2
  178. package/src/utils/connector-log/log-deduper.ts +2 -2
  179. package/src/utils/connector-log/mm-connector-logger.ts +3 -3
  180. package/src/utils/erp-type-from-entity.ts +1 -1
  181. package/src/utils/error-formatter.ts +205 -0
  182. package/src/utils/http-client.ts +3 -2
  183. package/src/utils/index.ts +39 -38
  184. package/src/utils/local-data-store/database-lock.ts +1 -1
  185. package/src/utils/local-data-store/jobs-shared-data.ts +0 -2
  186. package/src/utils/mm-labor-ticket-helpers.ts +9 -12
  187. package/src/utils/removeExtraneousFields.ts +1 -1
  188. package/src/utils/removeIdFieldFromPayload.ts +1 -1
  189. package/src/utils/resource-group.ts +2 -2
  190. package/src/utils/standard-process-drivers/error-processor.ts +5 -5
  191. package/src/utils/standard-process-drivers/index.ts +3 -3
  192. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +11 -16
  193. package/src/utils/standard-process-drivers/mm-entity-processor.ts +8 -14
  194. package/src/utils/standard-process-drivers/standard-process-drivers.ts +25 -39
  195. package/src/utils/time-utils.ts +3 -14
  196. package/src/utils/timezone.ts +2 -2
  197. package/dist/index.js +0 -48
  198. package/dist/index.js.map +0 -1
  199. package/dist/knexfile.js +0 -19
  200. package/dist/knexfile.js.map +0 -1
  201. package/dist/migrations/20241015162631_create_cache_table.d.ts +0 -4
  202. package/dist/migrations/20241015162631_create_cache_table.d.ts.map +0 -1
  203. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +0 -4
  204. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +0 -1
  205. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +0 -4
  206. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +0 -1
  207. package/dist/services/caching-service/batch-cache-manager.js +0 -84
  208. package/dist/services/caching-service/batch-cache-manager.js.map +0 -1
  209. package/dist/services/caching-service/hashed-cache-manager.js +0 -223
  210. package/dist/services/caching-service/hashed-cache-manager.js.map +0 -1
  211. package/dist/services/caching-service/index.js +0 -2
  212. package/dist/services/caching-service/index.js.map +0 -1
  213. package/dist/services/caching-service/record-tracking-manager.js +0 -28
  214. package/dist/services/caching-service/record-tracking-manager.js.map +0 -1
  215. package/dist/services/data-sync-service/configuration-manager.js +0 -163
  216. package/dist/services/data-sync-service/configuration-manager.js.map +0 -1
  217. package/dist/services/data-sync-service/data-sync-service.js +0 -95
  218. package/dist/services/data-sync-service/data-sync-service.js.map +0 -1
  219. package/dist/services/data-sync-service/index.js +0 -10
  220. package/dist/services/data-sync-service/index.js.map +0 -1
  221. package/dist/services/erp-api-services/errors.js +0 -83
  222. package/dist/services/erp-api-services/errors.js.map +0 -1
  223. package/dist/services/erp-api-services/graphql/graphql-service.js +0 -102
  224. package/dist/services/erp-api-services/graphql/graphql-service.js.map +0 -1
  225. package/dist/services/erp-api-services/graphql/types.js +0 -6
  226. package/dist/services/erp-api-services/graphql/types.js.map +0 -1
  227. package/dist/services/erp-api-services/index.js +0 -13
  228. package/dist/services/erp-api-services/index.js.map +0 -1
  229. package/dist/services/erp-api-services/oauth-client.js +0 -41
  230. package/dist/services/erp-api-services/oauth-client.js.map +0 -1
  231. package/dist/services/erp-api-services/rest/get-query-params.js +0 -23
  232. package/dist/services/erp-api-services/rest/get-query-params.js.map +0 -1
  233. package/dist/services/erp-api-services/rest/rest-api-service.js +0 -163
  234. package/dist/services/erp-api-services/rest/rest-api-service.js.map +0 -1
  235. package/dist/services/erp-api-services/types.js +0 -2
  236. package/dist/services/erp-api-services/types.js.map +0 -1
  237. package/dist/services/mm-api-service/index.js +0 -15
  238. package/dist/services/mm-api-service/index.js.map +0 -1
  239. package/dist/services/mm-api-service/mm-api-service.js +0 -519
  240. package/dist/services/mm-api-service/mm-api-service.js.map +0 -1
  241. package/dist/services/mm-api-service/token-mgr.js +0 -113
  242. package/dist/services/mm-api-service/token-mgr.js.map +0 -1
  243. package/dist/services/mm-api-service/types/checkpoint.js +0 -2
  244. package/dist/services/mm-api-service/types/checkpoint.js.map +0 -1
  245. package/dist/services/mm-api-service/types/entity-transformer.js +0 -186
  246. package/dist/services/mm-api-service/types/entity-transformer.js.map +0 -1
  247. package/dist/services/mm-api-service/types/mm-response-interfaces.js +0 -34
  248. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +0 -1
  249. package/dist/services/mm-api-service/types/receive-types.js +0 -55
  250. package/dist/services/mm-api-service/types/receive-types.js.map +0 -1
  251. package/dist/services/mm-api-service/types/send-types.js +0 -337
  252. package/dist/services/mm-api-service/types/send-types.js.map +0 -1
  253. package/dist/services/psql-erp-service/configuration.js +0 -2
  254. package/dist/services/psql-erp-service/configuration.js.map +0 -1
  255. package/dist/services/psql-erp-service/index.js +0 -10
  256. package/dist/services/psql-erp-service/index.js.map +0 -1
  257. package/dist/services/psql-erp-service/internal/types/psql-types.js +0 -5
  258. package/dist/services/psql-erp-service/internal/types/psql-types.js.map +0 -1
  259. package/dist/services/psql-erp-service/psql-helpers.js +0 -99
  260. package/dist/services/psql-erp-service/psql-helpers.js.map +0 -1
  261. package/dist/services/psql-erp-service/psql-service.js +0 -187
  262. package/dist/services/psql-erp-service/psql-service.js.map +0 -1
  263. package/dist/services/reporting-service/index.js +0 -5
  264. package/dist/services/reporting-service/index.js.map +0 -1
  265. package/dist/services/reporting-service/logger.js +0 -221
  266. package/dist/services/reporting-service/logger.js.map +0 -1
  267. package/dist/services/sql-server-erp-service/configuration.js +0 -2
  268. package/dist/services/sql-server-erp-service/configuration.js.map +0 -1
  269. package/dist/services/sql-server-erp-service/index.js +0 -11
  270. package/dist/services/sql-server-erp-service/index.js.map +0 -1
  271. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +0 -50
  272. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +0 -1
  273. package/dist/services/sql-server-erp-service/internal/sql-server-config.js +0 -40
  274. package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +0 -1
  275. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +0 -36
  276. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +0 -1
  277. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +0 -2
  278. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +0 -1
  279. package/dist/services/sql-server-erp-service/sql-server-helpers.js +0 -66
  280. package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +0 -1
  281. package/dist/services/sql-server-erp-service/sql-server-service.js +0 -154
  282. package/dist/services/sql-server-erp-service/sql-server-service.js.map +0 -1
  283. package/dist/services/sql-server-erp-service/types/sql-input-param.js +0 -2
  284. package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +0 -1
  285. package/dist/services/sqlite-service/index.js +0 -2
  286. package/dist/services/sqlite-service/index.js.map +0 -1
  287. package/dist/services/sqlite-service/sqlite-coordinator.js +0 -60
  288. package/dist/services/sqlite-service/sqlite-coordinator.js.map +0 -1
  289. package/dist/types/erp-connector.js +0 -2
  290. package/dist/types/erp-connector.js.map +0 -1
  291. package/dist/types/erp-types.js +0 -13
  292. package/dist/types/erp-types.js.map +0 -1
  293. package/dist/types/flattened-work-order.d.ts +0 -99
  294. package/dist/types/flattened-work-order.d.ts.map +0 -1
  295. package/dist/types/flattened-work-order.js +0 -2
  296. package/dist/types/flattened-work-order.js.map +0 -1
  297. package/dist/types/index.js +0 -6
  298. package/dist/types/index.js.map +0 -1
  299. package/dist/utils/application-initializer.js +0 -55
  300. package/dist/utils/application-initializer.js.map +0 -1
  301. package/dist/utils/cleanup-numbers.js +0 -6
  302. package/dist/utils/cleanup-numbers.js.map +0 -1
  303. package/dist/utils/connector-factory.js +0 -34
  304. package/dist/utils/connector-factory.js.map +0 -1
  305. package/dist/utils/connector-log/log-deduper.js +0 -240
  306. package/dist/utils/connector-log/log-deduper.js.map +0 -1
  307. package/dist/utils/connector-log/mm-connector-logger-example.js +0 -88
  308. package/dist/utils/connector-log/mm-connector-logger-example.js.map +0 -1
  309. package/dist/utils/connector-log/mm-connector-logger.js +0 -151
  310. package/dist/utils/connector-log/mm-connector-logger.js.map +0 -1
  311. package/dist/utils/data-transformation.js +0 -38
  312. package/dist/utils/data-transformation.js.map +0 -1
  313. package/dist/utils/env.d.ts +0 -8
  314. package/dist/utils/env.d.ts.map +0 -1
  315. package/dist/utils/env.js +0 -58
  316. package/dist/utils/env.js.map +0 -1
  317. package/dist/utils/erp-timezone-utils.d.ts +0 -20
  318. package/dist/utils/erp-timezone-utils.d.ts.map +0 -1
  319. package/dist/utils/erp-timezone-utils.js +0 -75
  320. package/dist/utils/erp-timezone-utils.js.map +0 -1
  321. package/dist/utils/erp-type-from-entity.js +0 -6
  322. package/dist/utils/erp-type-from-entity.js.map +0 -1
  323. package/dist/utils/error-utils.js +0 -21
  324. package/dist/utils/error-utils.js.map +0 -1
  325. package/dist/utils/http-client.js +0 -186
  326. package/dist/utils/http-client.js.map +0 -1
  327. package/dist/utils/index.js +0 -66
  328. package/dist/utils/index.js.map +0 -1
  329. package/dist/utils/local-data-store/database-lock.js +0 -68
  330. package/dist/utils/local-data-store/database-lock.js.map +0 -1
  331. package/dist/utils/local-data-store/jobs-shared-data.js +0 -118
  332. package/dist/utils/local-data-store/jobs-shared-data.js.map +0 -1
  333. package/dist/utils/mm-labor-ticket-helpers.js +0 -28
  334. package/dist/utils/mm-labor-ticket-helpers.js.map +0 -1
  335. package/dist/utils/removeExtraneousFields.js +0 -16
  336. package/dist/utils/removeExtraneousFields.js.map +0 -1
  337. package/dist/utils/removeIdFieldFromPayload.js +0 -16
  338. package/dist/utils/removeIdFieldFromPayload.js.map +0 -1
  339. package/dist/utils/resource-group.js +0 -59
  340. package/dist/utils/resource-group.js.map +0 -1
  341. package/dist/utils/standard-process-drivers/error-processor.js +0 -262
  342. package/dist/utils/standard-process-drivers/error-processor.js.map +0 -1
  343. package/dist/utils/standard-process-drivers/index.js +0 -4
  344. package/dist/utils/standard-process-drivers/index.js.map +0 -1
  345. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +0 -173
  346. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +0 -1
  347. package/dist/utils/standard-process-drivers/mm-entity-processor.js +0 -174
  348. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +0 -1
  349. package/dist/utils/standard-process-drivers/standard-process-drivers.js +0 -333
  350. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +0 -1
  351. package/dist/utils/time-utils.js +0 -103
  352. package/dist/utils/time-utils.js.map +0 -1
  353. package/dist/utils/timezone.js +0 -105
  354. package/dist/utils/timezone.js.map +0 -1
  355. package/dist/utils/trimObjectValues.js +0 -11
  356. package/dist/utils/trimObjectValues.js.map +0 -1
  357. package/dist/utils/uniqueRows.js +0 -35
  358. package/dist/utils/uniqueRows.js.map +0 -1
  359. package/src/types/flattened-work-order.ts +0 -108
  360. package/src/utils/env.ts +0 -75
  361. package/src/utils/erp-timezone-utils.ts +0 -99
@@ -1,37 +1,8 @@
1
1
  import { createLogger, format, transports } from "winston";
2
2
  import DailyRotateFile from "winston-daily-rotate-file";
3
3
  import path from "path";
4
- import { getEnvString } from "../../utils/env.js"; // Utility function to get environment variables with default values and validation
5
4
 
6
5
  const logDirectory = "logs";
7
- const initialLogLevel = getEnvString("LOG_LEVEL", "info");
8
- const initialNodeEnv = getEnvString("NODE_ENV", "development");
9
-
10
- const LOGGER_ERROR_PREFIX = "[mm-erp-sdk logger]";
11
-
12
- const serializeLoggerError = (error: unknown): string => {
13
- if (error instanceof Error) {
14
- return error.stack ?? error.message;
15
- }
16
- if (typeof error === "string") {
17
- return error;
18
- }
19
- try {
20
- return JSON.stringify(error);
21
- } catch {
22
- return String(error);
23
- }
24
- };
25
-
26
- const handleLoggerError = (error: unknown) => {
27
- const serialized = serializeLoggerError(error);
28
- try {
29
- // eslint-disable-next-line no-console
30
- console.error(`${LOGGER_ERROR_PREFIX} transport error: ${serialized}`);
31
- } catch {
32
- /* ignore failures when reporting logger errors */
33
- }
34
- };
35
6
 
36
7
  const MSG_MAX_LEN = 60;
37
8
  const MSG_MAX_CHARS = 2048;
@@ -52,8 +23,45 @@ const truncateString = (str: string): string => {
52
23
  return result;
53
24
  };
54
25
 
26
+ /**
27
+ * Safe JSON serializer that handles circular references and extracts meaningful error data
28
+ */
29
+ const safeStringify = (obj: any, indent: number = 2): string => {
30
+ const seen = new WeakSet();
31
+
32
+ return JSON.stringify(
33
+ obj,
34
+ (key, value) => {
35
+ // Handle Error objects specially
36
+ if (value instanceof Error) {
37
+ return {
38
+ message: value.message,
39
+ name: value.name,
40
+ stack: value.stack,
41
+ ...(value.constructor.name === 'HTTPError' || value.constructor.name === 'AxiosError' ? {
42
+ status: (value as any).status,
43
+ code: (value as any).code,
44
+ data: (value as any).data,
45
+ } : {}),
46
+ };
47
+ }
48
+
49
+ // Handle circular references
50
+ if (typeof value === "object" && value !== null) {
51
+ if (seen.has(value)) {
52
+ return "[Circular]";
53
+ }
54
+ seen.add(value);
55
+ }
56
+
57
+ return value;
58
+ },
59
+ indent
60
+ );
61
+ };
62
+
55
63
  const baseFormat = format.printf(({ timestamp, level, message, ...rest }) => {
56
- let restString = JSON.stringify(rest, undefined, 2);
64
+ let restString = safeStringify(rest, 2);
57
65
  restString = restString === "{}" ? "" : restString;
58
66
 
59
67
  let formattedMessage: string;
@@ -89,31 +97,25 @@ const logFormat = format.combine(
89
97
  baseFormat
90
98
  );
91
99
 
92
- const createConsoleTransport = () => {
93
- const consoleTransport = new transports.Console({
94
- format: format.combine(
95
- format.timestamp(),
96
- format.splat(),
97
- baseFormat,
98
- format.colorize({ all: true })
99
- ),
100
- });
101
- consoleTransport.on("error", handleLoggerError);
102
- return consoleTransport;
103
- };
104
-
105
100
  // Create a basic logger with default configuration
106
101
  const logger = createLogger({
107
- level: initialLogLevel,
102
+ level: process.env.LOG_LEVEL || "info",
108
103
  format: logFormat,
109
- transports: [createConsoleTransport()],
104
+ transports: [
105
+ new transports.Console({
106
+ format: format.combine(
107
+ format.timestamp(),
108
+ format.splat(),
109
+ baseFormat,
110
+ format.colorize({ all: true })
111
+ ),
112
+ }),
113
+ ],
110
114
  });
111
115
 
112
- logger.on("error", handleLoggerError);
113
-
114
116
  // Helper function to create a file transport with shared configuration
115
117
  const createFileTransport = (): DailyRotateFile => {
116
- const transport = new DailyRotateFile({
118
+ return new DailyRotateFile({
117
119
  filename: path.join(logDirectory, "%DATE%.log"),
118
120
  datePattern: "YYYY-MM-DD",
119
121
  zippedArchive: true,
@@ -121,8 +123,6 @@ const createFileTransport = (): DailyRotateFile => {
121
123
  maxFiles: "14d",
122
124
  format: logFormat,
123
125
  });
124
- transport.on("error", handleLoggerError);
125
- return transport;
126
126
  };
127
127
 
128
128
  // Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
@@ -136,76 +136,35 @@ function attachRotateMitigation(
136
136
  if (isRefreshing) return;
137
137
  isRefreshing = true;
138
138
  let removalTimer: NodeJS.Timeout | null = null;
139
- let next: DailyRotateFile | null = null;
140
139
 
141
- const cleanupRefresh = () => {
140
+ // Create replacement first to avoid any logging gap
141
+ const next = createFileTransport();
142
+ // When the new file is created, remove the old transport
143
+ next.on("new", () => {
142
144
  if (removalTimer) {
143
145
  clearTimeout(removalTimer);
144
146
  removalTimer = null;
145
147
  }
148
+ try {
149
+ logger.remove(transport);
150
+ } catch {}
146
151
  isRefreshing = false;
147
- };
148
-
149
- try {
150
- // Create replacement first to avoid any logging gap
151
- next = createFileTransport();
152
- // When the new file is created, remove the old transport
153
- next.on("new", () => {
154
- if (removalTimer) {
155
- clearTimeout(removalTimer);
156
- removalTimer = null;
157
- }
158
- try {
159
- logger.remove(transport);
160
- } catch (error) {
161
- handleLoggerError(error);
162
- }
163
- cleanupRefresh();
164
- });
165
- attachRotateMitigation(next, opts);
152
+ });
153
+ attachRotateMitigation(next, opts);
154
+ logger.add(next);
155
+
156
+ // Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
157
+ const REMOVAL_GRACE_MS = 30000;
158
+ removalTimer = setTimeout(() => {
166
159
  try {
167
- logger.add(next);
168
- } catch (error) {
169
- handleLoggerError(error);
170
- cleanupRefresh();
171
- try {
172
- logger.remove(next);
173
- } catch {}
174
- try {
175
- if (typeof next.close === "function") {
176
- next.close();
177
- }
178
- } catch {}
179
- return;
180
- }
160
+ logger.remove(transport);
161
+ } catch {}
162
+ isRefreshing = false;
163
+ removalTimer = null;
164
+ }, REMOVAL_GRACE_MS);
181
165
 
182
- // Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
183
- const REMOVAL_GRACE_MS = 30000;
184
- removalTimer = setTimeout(() => {
185
- try {
186
- logger.remove(transport);
187
- } catch (error) {
188
- handleLoggerError(error);
189
- }
190
- cleanupRefresh();
191
- }, REMOVAL_GRACE_MS);
192
-
193
- // Keep console and other transports intact; do not silence or clear
194
- logger.level = logLevel;
195
- } catch (error) {
196
- cleanupRefresh();
197
- handleLoggerError(error);
198
- if (next) {
199
- try {
200
- logger.remove(next);
201
- } catch {}
202
- try {
203
- if (typeof next.close === "function") {
204
- next.close();
205
- }
206
- } catch {}
207
- }
208
- }
166
+ // Keep console and other transports intact; do not silence or clear
167
+ logger.level = logLevel;
209
168
  });
210
169
  }
211
170
 
@@ -235,16 +194,22 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
235
194
 
236
195
  // Add console transport in non-production environments
237
196
  if (nodeEnv !== "production") {
238
- logger.add(createConsoleTransport());
197
+ logger.add(
198
+ new transports.Console({
199
+ format: format.combine(
200
+ format.timestamp(),
201
+ format.splat(),
202
+ baseFormat,
203
+ format.colorize({ all: true })
204
+ ),
205
+ })
206
+ );
239
207
  }
240
208
 
241
209
  // Set the log level
242
210
  logger.level = logLevel;
243
211
  };
244
212
 
245
- // Ensure file logging is configured as soon as the module loads
246
- configureLogger(initialLogLevel, initialNodeEnv);
247
-
248
213
  // Add fatal method for Graceful compatibility
249
214
  (logger as any).fatal = (err: any, meta?: any) => logger.error(err, meta);
250
215
 
@@ -1,6 +1,6 @@
1
- import { SqlServerService } from "./sql-server-service.js";
2
- import { SqlServerHelper } from "./sql-server-helpers.js";
3
- import { SQLInput } from "./types/sql-input-param.js";
1
+ import { SqlServerService } from "./sql-server-service";
2
+ import { SqlServerHelper } from "./sql-server-helpers";
3
+ import { SQLInput } from "./types/sql-input-param";
4
4
 
5
5
  /**
6
6
  * A class to manage interactions with SQL Server
@@ -1,6 +1,6 @@
1
1
  import sql from "mssql";
2
- import { SQLInput } from "../types/sql-input-param.js";
3
- import { SQLTransactionOperation } from "./sql-transaction-manager.js";
2
+ import { SQLInput } from "../types/sql-input-param";
3
+ import { SQLTransactionOperation } from "./sql-transaction-manager";
4
4
 
5
5
  /**
6
6
  * Insert a new labor ticket into the database.
@@ -1,5 +1,5 @@
1
1
  import sql from "mssql";
2
- import logger from "../../reporting-service/logger.js";
2
+ import logger from "../../reporting-service/logger";
3
3
 
4
4
  export interface SQLTransactionConfig {
5
5
  isolationLevel?: sql.IIsolationLevel;
@@ -1,12 +1,12 @@
1
- import { SQLTransactionManager } from "./internal/sql-transaction-manager.js";
1
+ import { SQLTransactionManager } from "./internal/sql-transaction-manager";
2
2
  import {
3
3
  SQLLaborTicketInsertOperation,
4
4
  SQLLaborTicketUpdateOperation,
5
- } from "./internal/sql-labor-ticket-operations.js";
6
- import { MMReceiveLaborTicket } from "../mm-api-service/types/receive-types.js";
7
- import { SqlServerService } from "./sql-server-service.js";
8
- import logger from "../reporting-service/logger.js";
9
- import { SQLInput } from "./types/sql-input-param.js";
5
+ } from "./internal/sql-labor-ticket-operations";
6
+ import { MMReceiveLaborTicket } from "../mm-api-service/types/receive-types";
7
+ import { SqlServerService } from "./sql-server-service";
8
+ import logger from "../reporting-service/logger";
9
+ import { SQLInput } from "./types/sql-input-param";
10
10
 
11
11
  export class SqlServerHelper {
12
12
  /**
@@ -1,8 +1,8 @@
1
1
  import sql, { ConnectionPool, IRecordSet } from "mssql";
2
- import { SQLServerConfigSchema } from "./internal/sql-server-config.js";
3
- import logger from "../reporting-service/logger.js";
4
- import { ERPResponse } from "../../types/erp-types.js";
5
- import { SQLServerConfiguration } from "./configuration.js";
2
+ import { SQLServerConfigSchema } from "./internal/sql-server-config";
3
+ import logger from "../reporting-service/logger";
4
+ import { ERPResponse } from "../../types/erp-types";
5
+ import { SQLServerConfiguration } from "./configuration";
6
6
 
7
7
  type PagingParams = {
8
8
  limit?: number;
@@ -1 +1 @@
1
- export { SQLiteCoordinator } from "./sqlite-coordinator.js";
1
+ export { SQLiteCoordinator } from "./sqlite-coordinator";
@@ -2,8 +2,8 @@ import {
2
2
  acquireDatabaseLock,
3
3
  releaseDatabaseLock,
4
4
  getDatabaseLock,
5
- } from "../../utils/local-data-store/database-lock.js";
6
- import { logger } from "../reporting-service/index.js";
5
+ } from "../../utils/local-data-store/database-lock";
6
+ import { logger } from "../reporting-service";
7
7
 
8
8
  export class SQLiteCoordinator {
9
9
  private static readonly LOCK_TIMEOUT_MS = 30_000; // 30 seconds
@@ -1,4 +1,4 @@
1
- import { MMReceiveLaborTicket } from "../services/mm-api-service/types/receive-types.js";
1
+ import { MMReceiveLaborTicket } from "../services/mm-api-service/types/receive-types";
2
2
 
3
3
  /**
4
4
  * Interface for ERP connectors.
@@ -14,10 +14,6 @@ export interface IERPConnector {
14
14
 
15
15
  /**
16
16
  * Sync data from the ERP system to MM.
17
- * Timezone expectations:
18
- * - When sending ERP data to MachineMetrics (e.g., via StandardProcessDrivers or MMEntityProcessor),
19
- * connectors MUST convert all datetime fields to ISO-8601 UTC strings (trailing `Z` or explicit offset)
20
- * before invoking SDK helpers. The SDK validates/forwards these values but does not apply timezone shifts.
21
17
  */
22
18
  syncFromERP(): Promise<void>;
23
19
  syncFromERPCompleted(): Promise<void>;
@@ -35,16 +31,13 @@ export interface IERPConnector {
35
31
  retryFailedLaborTicketsCompleted(): Promise<void>;
36
32
 
37
33
  /**
38
- * Start the connector. Typically a connector should delegate control to the data-sync-service via runDataSyncService().
34
+ * Start the connector. Typically a connector should delegate control to the data-sync-service.
39
35
  */
40
36
  startUp(): Promise<void>;
41
37
  }
42
38
 
43
39
  /**
44
40
  * Interface for standard process methods that call ERP connectors back to create or update labor tickets.
45
- *
46
- * Timestamp fields on `MMReceiveLaborTicket` objects have already been converted by the SDKfrom MM's
47
- * UTC API responses into the ERP's local timezone, based on the company's timezone setting.
48
41
  */
49
42
  export interface IERPLaborTicketHandler {
50
43
  createLaborTicketInERP(
@@ -3,18 +3,10 @@
3
3
  * This file re-exports all type definitions that are part of the public API.
4
4
  */
5
5
 
6
- export type { IERPConnector } from "./erp-connector.js";
6
+ export type { IERPConnector } from "./erp-connector";
7
7
  export type {
8
8
  ERPObjType,
9
9
  ERPPagination,
10
10
  ERPResponse,
11
11
  ERPObject,
12
- } from "./erp-types.js";
13
- export type {
14
- FlattenedWorkOrderRow,
15
- FlattenedWorkOrderRowBase,
16
- FlattenedWorkOrderPartFields,
17
- FlattenedWorkOrderPartOperationFields,
18
- FlattenedWorkOrderFields,
19
- FlattenedWorkOrderOperationFields,
20
- } from "./flattened-work-order.js";
12
+ } from "./erp-types";
@@ -1,9 +1,9 @@
1
- import logger from "../services/reporting-service/logger.js";
2
- import { CoreConfiguration } from "../services/data-sync-service/configuration-manager.js";
3
- import { SQLiteCoordinator } from "../services/sqlite-service/index.js";
4
- import { getTimezoneOffsetAndPersist } from "./time-utils.js";
1
+ import logger from "../services/reporting-service/logger";
2
+ import { CoreConfiguration } from "../services/data-sync-service/configuration-manager";
3
+ import { SQLiteCoordinator } from "../services/sqlite-service";
4
+ import { getTimezoneOffsetAndPersist } from "./time-utils";
5
5
  import knex from "knex";
6
- import config from "../knexfile.js";
6
+ import config from "../knexfile";
7
7
 
8
8
  /**
9
9
  * Utility class to handle application initialization tasks
@@ -1,5 +1,5 @@
1
- import { IERPConnector } from "../types/erp-connector.js";
2
- import logger from "../services/reporting-service/logger.js";
1
+ import { IERPConnector } from "../types/erp-connector";
2
+ import logger from "../services/reporting-service/logger";
3
3
  import { pathToFileURL } from "url";
4
4
 
5
5
  /**
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
- import logger from '../../services/reporting-service/logger.js';
4
- import type { LogEntry, LogLevelString } from './mm-connector-logger.js';
3
+ import logger from '../../services/reporting-service/logger';
4
+ import type { LogEntry, LogLevelString } from './mm-connector-logger';
5
5
 
6
6
  /**
7
7
  * Implement a custom LogDeduper or use the provided FileLogDeduper
@@ -1,6 +1,6 @@
1
- import { MMApiClient } from '../../services/mm-api-service/mm-api-service.js';
2
- import logger from '../../services/reporting-service/logger.js';
3
- import type { LogDeduper } from './log-deduper.js';
1
+ import { MMApiClient } from '../../services/mm-api-service/mm-api-service';
2
+ import logger from '../../services/reporting-service/logger';
3
+ import type { LogDeduper } from './log-deduper';
4
4
 
5
5
  export type LogLevelString = 'info' | 'warn' | 'error';
6
6
 
@@ -1,4 +1,4 @@
1
- import { ERPObjType } from "../types/erp-types.js";
1
+ import { ERPObjType } from "../types/erp-types";
2
2
 
3
3
  export function getERPAPITypeFromEntity(
4
4
  entity: string,
@@ -0,0 +1,205 @@
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
+
6
+ export interface FormattedError {
7
+ message: string;
8
+ code: string;
9
+ httpStatus?: number;
10
+ metadata?: Record<string, any>;
11
+ }
12
+
13
+ /**
14
+ * Extract meaningful error message from various error types
15
+ */
16
+ export function formatError(error: any): FormattedError {
17
+ if (!error) {
18
+ return {
19
+ message: 'Unknown error occurred',
20
+ code: 'UNKNOWN_ERROR',
21
+ };
22
+ }
23
+
24
+ // Handle axios errors FIRST (before checking for FormattedError)
25
+ // because axios errors also have message and code properties
26
+ if (error.isAxiosError || error.name === 'AxiosError') {
27
+ return formatAxiosError(error);
28
+ }
29
+
30
+ // If it's already a FormattedError, return as-is
31
+ // Check for httpStatus or metadata to distinguish from axios errors
32
+ if (error.message && error.code && typeof error.message === 'string' && typeof error.code === 'string' && !error.config) {
33
+ return error as FormattedError;
34
+ }
35
+
36
+ // Handle standard Error objects
37
+ if (error instanceof Error) {
38
+ return {
39
+ message: error.message || 'An error occurred',
40
+ code: 'ERROR',
41
+ metadata: {
42
+ name: error.name,
43
+ },
44
+ };
45
+ }
46
+
47
+ // Handle string errors
48
+ if (typeof error === 'string') {
49
+ return {
50
+ message: error,
51
+ code: 'ERROR',
52
+ };
53
+ }
54
+
55
+ // Last resort: try to extract any useful info
56
+ const message = error.message || error.toString?.() || 'Unknown error occurred';
57
+ return {
58
+ message: typeof message === 'string' ? message : JSON.stringify(message),
59
+ code: error.code || 'UNKNOWN_ERROR',
60
+ };
61
+ }
62
+
63
+ /**
64
+ * Format axios-specific errors with detailed context
65
+ */
66
+ function formatAxiosError(error: any): FormattedError {
67
+ const httpStatus = error.response?.status;
68
+ const method = error.config?.method?.toUpperCase();
69
+ const url = error.config?.url;
70
+
71
+ // First check if connector already extracted the message
72
+ let message = error._extractedMessage;
73
+
74
+ // If not, try to extract from response data
75
+ if (!message) {
76
+ const extractedMessage = extractErrorMessage(error.response?.data);
77
+ message = extractedMessage || error.response?.statusText || error.message || 'Request failed';
78
+ }
79
+
80
+ // Determine error code based on status
81
+ const code = categorizeHttpError(httpStatus);
82
+
83
+ const metadata: Record<string, any> = {
84
+ method,
85
+ url,
86
+ };
87
+
88
+ // Add additional context for specific error types
89
+ if (httpStatus === 401 || httpStatus === 403) {
90
+ metadata.hint = 'Check authentication credentials';
91
+ } else if (httpStatus === 404) {
92
+ metadata.hint = 'Resource not found - check endpoint URL';
93
+ } else if (httpStatus && httpStatus >= 500) {
94
+ metadata.hint = 'ERP system may be temporarily unavailable';
95
+ }
96
+
97
+ return {
98
+ message,
99
+ code,
100
+ httpStatus,
101
+ metadata,
102
+ };
103
+ }
104
+
105
+ /**
106
+ * Extract meaningful error message from response data
107
+ * Handles various ERP-specific response formats
108
+ */
109
+ function extractErrorMessage(data: any): string | null {
110
+ if (!data) return null;
111
+
112
+ // Common error message fields across different ERPs
113
+ const possibleFields = [
114
+ 'ErrorMessage', // Epicor
115
+ 'error.message', // Common REST format
116
+ 'error', // Simple format
117
+ 'Message', // .NET style
118
+ 'message', // JavaScript style
119
+ 'errorMessage', // Camel case
120
+ 'error_message', // Snake case
121
+ 'errors[0].message', // Array of errors
122
+ 'title', // Problem details format
123
+ 'detail', // Problem details format
124
+ ];
125
+
126
+ for (const field of possibleFields) {
127
+ const value = getNestedValue(data, field);
128
+ if (value && typeof value === 'string') {
129
+ return value;
130
+ }
131
+ }
132
+
133
+ // If data is a string, return it
134
+ if (typeof data === 'string') {
135
+ // Try to parse as JSON first
136
+ try {
137
+ const parsed = JSON.parse(data);
138
+ return extractErrorMessage(parsed);
139
+ } catch {
140
+ return data;
141
+ }
142
+ }
143
+
144
+ return null;
145
+ }
146
+
147
+ /**
148
+ * Get nested value from object using dot notation
149
+ */
150
+ function getNestedValue(obj: any, path: string): any {
151
+ const parts = path.split('.');
152
+ let current = obj;
153
+
154
+ for (const part of parts) {
155
+ // Handle array notation like 'errors[0]'
156
+ const arrayMatch = part.match(/(\w+)\[(\d+)\]/);
157
+ if (arrayMatch) {
158
+ const [, key, index] = arrayMatch;
159
+ current = current?.[key]?.[parseInt(index, 10)];
160
+ } else {
161
+ current = current?.[part];
162
+ }
163
+
164
+ if (current === undefined || current === null) {
165
+ return null;
166
+ }
167
+ }
168
+
169
+ return current;
170
+ }
171
+
172
+ /**
173
+ * Categorize HTTP errors into standard codes
174
+ */
175
+ function categorizeHttpError(status?: number): string {
176
+ if (!status) return 'NETWORK_ERROR';
177
+
178
+ if (status === 400) return 'VALIDATION_ERROR';
179
+ if (status === 401) return 'AUTHENTICATION_ERROR';
180
+ if (status === 403) return 'AUTHORIZATION_ERROR';
181
+ if (status === 404) return 'NOT_FOUND';
182
+ if (status === 409) return 'CONFLICT';
183
+ if (status === 422) return 'VALIDATION_ERROR';
184
+ if (status === 429) return 'RATE_LIMIT';
185
+ if (status >= 500) return 'ERP_SERVER_ERROR';
186
+ if (status >= 400) return 'CLIENT_ERROR';
187
+
188
+ return 'HTTP_ERROR';
189
+ }
190
+
191
+ /**
192
+ * Format error for logging (shorter, cleaner version)
193
+ */
194
+ export function formatErrorForLogging(error: any): string {
195
+ const formatted = formatError(error);
196
+
197
+ let message = `[${formatted.code}] ${formatted.message}`;
198
+
199
+ if (formatted.httpStatus) {
200
+ message = `[${formatted.httpStatus}] ${message}`;
201
+ }
202
+
203
+ return message;
204
+ }
205
+
@@ -1,5 +1,5 @@
1
1
  import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios";
2
- import logger from "../services/reporting-service/logger.js";
2
+ import logger from "../services/reporting-service/logger";
3
3
 
4
4
  export class HTTPError extends Error {
5
5
  constructor(
@@ -64,9 +64,10 @@ class AxiosClient implements HTTPClient {
64
64
  * It can be convenient to set `baseURL` for an instance of axios to pass relative URLs to methods of that instance.
65
65
  */
66
66
  constructor(baseUrl: string, retryAttempts: number) {
67
+ const timeout = parseInt(process.env.MM_API_TIMEOUT || "30000");
67
68
  this.client = axios.create({
68
69
  baseURL: baseUrl,
69
- timeout: 30000,
70
+ timeout: timeout,
70
71
  headers: {
71
72
  "Content-Type": "application/json",
72
73
  },