@machinemetrics/mm-erp-sdk 0.2.0-beta.0 → 0.2.0-beta.2
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.
- package/README.md +0 -5
- package/dist/config-CvA-mFWF.js +418 -0
- package/dist/config-CvA-mFWF.js.map +1 -0
- package/dist/connector-factory-BPm2GVVF.js +30 -0
- package/dist/connector-factory-BPm2GVVF.js.map +1 -0
- package/dist/hashed-cache-manager-B15NN8hK.js +322 -0
- package/dist/hashed-cache-manager-B15NN8hK.js.map +1 -0
- package/dist/index-D8qO1NyK.js +192 -0
- package/dist/index-D8qO1NyK.js.map +1 -0
- package/dist/index.d.ts +43 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/knexfile-Bng2Ru9c.js +20 -0
- package/dist/knexfile-Bng2Ru9c.js.map +1 -0
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/logger-BWw0_z9q.js +17557 -0
- package/dist/logger-BWw0_z9q.js.map +1 -0
- package/dist/migrations/20241015162631_create_cache_table.js +15 -11
- package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
- package/dist/migrations/20241015162632_create_sdk_cache_table.js +15 -11
- package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
- package/dist/migrations/20250103162631_create_record_tracking_table.js +15 -14
- package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
- package/dist/mm-erp-sdk.js +4978 -0
- package/dist/mm-erp-sdk.js.map +1 -0
- package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
- package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
- package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
- package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
- package/dist/services/caching-service/index.d.ts +1 -1
- package/dist/services/caching-service/index.d.ts.map +1 -1
- package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
- package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
- package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
- package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
- package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
- package/dist/services/data-sync-service/index.d.ts +3 -3
- package/dist/services/data-sync-service/index.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -42
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.js +37 -50
- package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +36 -38
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.js +22 -24
- package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.js +49 -49
- package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +30 -0
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +1 -0
- package/dist/services/erp-api-services/errors.d.ts +1 -1
- package/dist/services/erp-api-services/errors.d.ts.map +1 -1
- package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
- package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
- package/dist/services/erp-api-services/index.d.ts +8 -8
- package/dist/services/erp-api-services/index.d.ts.map +1 -1
- package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
- package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
- package/dist/services/erp-api-services/types.d.ts +2 -2
- package/dist/services/erp-api-services/types.d.ts.map +1 -1
- package/dist/services/mm-api-service/company-info.d.ts +13 -0
- package/dist/services/mm-api-service/company-info.d.ts.map +1 -0
- package/dist/services/mm-api-service/index.d.ts +13 -6
- package/dist/services/mm-api-service/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/mm-api-service.d.ts +13 -7
- package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
- package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
- package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
- package/dist/services/mm-api-service/types/receive-types.d.ts +3 -0
- package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
- package/dist/services/nats-service/nats-service.d.ts +114 -0
- package/dist/services/nats-service/nats-service.d.ts.map +1 -0
- package/dist/services/nats-service/test-nats-subscriber.d.ts +6 -0
- package/dist/services/nats-service/test-nats-subscriber.d.ts.map +1 -0
- package/dist/services/psql-erp-service/index.d.ts +3 -3
- package/dist/services/psql-erp-service/index.d.ts.map +1 -1
- package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
- package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
- package/dist/services/reporting-service/index.d.ts +1 -1
- package/dist/services/reporting-service/index.d.ts.map +1 -1
- package/dist/services/reporting-service/logger.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/index.d.ts +3 -3
- package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
- package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
- package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
- package/dist/services/sqlite-service/index.d.ts +1 -1
- package/dist/services/sqlite-service/index.d.ts.map +1 -1
- package/dist/types/erp-connector.d.ts +2 -9
- package/dist/types/erp-connector.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/connector-factory.d.ts +1 -1
- package/dist/utils/connector-factory.d.ts.map +1 -1
- package/dist/utils/connector-log/log-deduper.d.ts +1 -1
- package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
- package/dist/utils/connector-log/mm-connector-logger-example.d.ts +0 -1
- package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
- package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
- package/dist/utils/erp-type-from-entity.d.ts +1 -1
- package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
- package/dist/utils/error-formatter.d.ts +19 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/index.d.ts +38 -34
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/local-data-store/jobs-shared-data.d.ts +0 -2
- package/dist/utils/local-data-store/jobs-shared-data.d.ts.map +1 -1
- package/dist/utils/mm-labor-ticket-helpers.d.ts +5 -4
- package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
- package/dist/utils/removeExtraneousFields.d.ts +1 -1
- package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
- package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
- package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
- package/dist/utils/resource-group.d.ts +1 -1
- package/dist/utils/resource-group.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
- package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/index.d.ts +3 -3
- package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +5 -11
- package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +6 -12
- package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
- package/dist/utils/time-utils.d.ts.map +1 -1
- package/package.json +10 -8
- package/src/index.ts +45 -42
- package/src/knexfile.ts +0 -1
- package/src/services/caching-service/batch-cache-manager.ts +2 -2
- package/src/services/caching-service/hashed-cache-manager.ts +5 -5
- package/src/services/caching-service/index.ts +1 -1
- package/src/services/caching-service/record-tracking-manager.ts +2 -2
- package/src/services/data-sync-service/configuration-manager.ts +39 -52
- package/src/services/data-sync-service/data-sync-service.ts +19 -10
- package/src/services/data-sync-service/index.ts +3 -3
- package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +4 -5
- package/src/services/data-sync-service/jobs/from-erp.ts +6 -12
- package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +3 -4
- package/src/services/data-sync-service/jobs/run-migrations.ts +3 -4
- package/src/services/data-sync-service/jobs/to-erp.ts +14 -5
- package/src/services/data-sync-service/nats-labor-ticket-listener.ts +341 -0
- package/src/services/erp-api-services/errors.ts +3 -3
- package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
- package/src/services/erp-api-services/index.ts +8 -8
- package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
- package/src/services/erp-api-services/types.ts +2 -2
- package/src/services/mm-api-service/company-info.ts +87 -0
- package/src/services/mm-api-service/index.ts +14 -6
- package/src/services/mm-api-service/mm-api-service.ts +30 -13
- package/src/services/mm-api-service/token-mgr.ts +4 -4
- package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
- package/src/services/mm-api-service/types/receive-types.ts +1 -0
- package/src/services/nats-service/nats-service.ts +351 -0
- package/src/services/nats-service/test-nats-subscriber.ts +96 -0
- package/src/services/psql-erp-service/index.ts +3 -3
- package/src/services/psql-erp-service/psql-service.ts +4 -4
- package/src/services/reporting-service/index.ts +1 -1
- package/src/services/reporting-service/logger.ts +81 -116
- package/src/services/sql-server-erp-service/index.ts +3 -3
- package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
- package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
- package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
- package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
- package/src/services/sqlite-service/index.ts +1 -1
- package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
- package/src/types/erp-connector.ts +2 -9
- package/src/types/index.ts +2 -10
- package/src/utils/application-initializer.ts +5 -5
- package/src/utils/connector-factory.ts +2 -2
- package/src/utils/connector-log/log-deduper.ts +2 -2
- package/src/utils/connector-log/mm-connector-logger.ts +3 -3
- package/src/utils/erp-type-from-entity.ts +1 -1
- package/src/utils/error-formatter.ts +205 -0
- package/src/utils/http-client.ts +3 -2
- package/src/utils/index.ts +39 -38
- package/src/utils/local-data-store/database-lock.ts +1 -1
- package/src/utils/local-data-store/jobs-shared-data.ts +0 -2
- package/src/utils/mm-labor-ticket-helpers.ts +9 -12
- package/src/utils/removeExtraneousFields.ts +1 -1
- package/src/utils/removeIdFieldFromPayload.ts +1 -1
- package/src/utils/resource-group.ts +2 -2
- package/src/utils/standard-process-drivers/error-processor.ts +5 -5
- package/src/utils/standard-process-drivers/index.ts +3 -3
- package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +12 -16
- package/src/utils/standard-process-drivers/mm-entity-processor.ts +8 -14
- package/src/utils/standard-process-drivers/standard-process-drivers.ts +25 -39
- package/src/utils/time-utils.ts +3 -14
- package/src/utils/timezone.ts +2 -2
- package/dist/index.js +0 -48
- package/dist/index.js.map +0 -1
- package/dist/knexfile.js +0 -19
- package/dist/knexfile.js.map +0 -1
- package/dist/migrations/20241015162631_create_cache_table.d.ts +0 -4
- package/dist/migrations/20241015162631_create_cache_table.d.ts.map +0 -1
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +0 -4
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +0 -1
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +0 -4
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +0 -1
- package/dist/services/caching-service/batch-cache-manager.js +0 -84
- package/dist/services/caching-service/batch-cache-manager.js.map +0 -1
- package/dist/services/caching-service/hashed-cache-manager.js +0 -223
- package/dist/services/caching-service/hashed-cache-manager.js.map +0 -1
- package/dist/services/caching-service/index.js +0 -2
- package/dist/services/caching-service/index.js.map +0 -1
- package/dist/services/caching-service/record-tracking-manager.js +0 -28
- package/dist/services/caching-service/record-tracking-manager.js.map +0 -1
- package/dist/services/data-sync-service/configuration-manager.js +0 -163
- package/dist/services/data-sync-service/configuration-manager.js.map +0 -1
- package/dist/services/data-sync-service/data-sync-service.js +0 -95
- package/dist/services/data-sync-service/data-sync-service.js.map +0 -1
- package/dist/services/data-sync-service/index.js +0 -10
- package/dist/services/data-sync-service/index.js.map +0 -1
- package/dist/services/erp-api-services/errors.js +0 -83
- package/dist/services/erp-api-services/errors.js.map +0 -1
- package/dist/services/erp-api-services/graphql/graphql-service.js +0 -102
- package/dist/services/erp-api-services/graphql/graphql-service.js.map +0 -1
- package/dist/services/erp-api-services/graphql/types.js +0 -6
- package/dist/services/erp-api-services/graphql/types.js.map +0 -1
- package/dist/services/erp-api-services/index.js +0 -13
- package/dist/services/erp-api-services/index.js.map +0 -1
- package/dist/services/erp-api-services/oauth-client.js +0 -41
- package/dist/services/erp-api-services/oauth-client.js.map +0 -1
- package/dist/services/erp-api-services/rest/get-query-params.js +0 -23
- package/dist/services/erp-api-services/rest/get-query-params.js.map +0 -1
- package/dist/services/erp-api-services/rest/rest-api-service.js +0 -163
- package/dist/services/erp-api-services/rest/rest-api-service.js.map +0 -1
- package/dist/services/erp-api-services/types.js +0 -2
- package/dist/services/erp-api-services/types.js.map +0 -1
- package/dist/services/mm-api-service/index.js +0 -15
- package/dist/services/mm-api-service/index.js.map +0 -1
- package/dist/services/mm-api-service/mm-api-service.js +0 -519
- package/dist/services/mm-api-service/mm-api-service.js.map +0 -1
- package/dist/services/mm-api-service/token-mgr.js +0 -113
- package/dist/services/mm-api-service/token-mgr.js.map +0 -1
- package/dist/services/mm-api-service/types/checkpoint.js +0 -2
- package/dist/services/mm-api-service/types/checkpoint.js.map +0 -1
- package/dist/services/mm-api-service/types/entity-transformer.js +0 -186
- package/dist/services/mm-api-service/types/entity-transformer.js.map +0 -1
- package/dist/services/mm-api-service/types/mm-response-interfaces.js +0 -34
- package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +0 -1
- package/dist/services/mm-api-service/types/receive-types.js +0 -55
- package/dist/services/mm-api-service/types/receive-types.js.map +0 -1
- package/dist/services/mm-api-service/types/send-types.js +0 -337
- package/dist/services/mm-api-service/types/send-types.js.map +0 -1
- package/dist/services/psql-erp-service/configuration.js +0 -2
- package/dist/services/psql-erp-service/configuration.js.map +0 -1
- package/dist/services/psql-erp-service/index.js +0 -10
- package/dist/services/psql-erp-service/index.js.map +0 -1
- package/dist/services/psql-erp-service/internal/types/psql-types.js +0 -5
- package/dist/services/psql-erp-service/internal/types/psql-types.js.map +0 -1
- package/dist/services/psql-erp-service/psql-helpers.js +0 -99
- package/dist/services/psql-erp-service/psql-helpers.js.map +0 -1
- package/dist/services/psql-erp-service/psql-service.js +0 -187
- package/dist/services/psql-erp-service/psql-service.js.map +0 -1
- package/dist/services/reporting-service/index.js +0 -5
- package/dist/services/reporting-service/index.js.map +0 -1
- package/dist/services/reporting-service/logger.js +0 -221
- package/dist/services/reporting-service/logger.js.map +0 -1
- package/dist/services/sql-server-erp-service/configuration.js +0 -2
- package/dist/services/sql-server-erp-service/configuration.js.map +0 -1
- package/dist/services/sql-server-erp-service/index.js +0 -11
- package/dist/services/sql-server-erp-service/index.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +0 -50
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js +0 -40
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +0 -36
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +0 -2
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +0 -1
- package/dist/services/sql-server-erp-service/sql-server-helpers.js +0 -66
- package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +0 -1
- package/dist/services/sql-server-erp-service/sql-server-service.js +0 -154
- package/dist/services/sql-server-erp-service/sql-server-service.js.map +0 -1
- package/dist/services/sql-server-erp-service/types/sql-input-param.js +0 -2
- package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +0 -1
- package/dist/services/sqlite-service/index.js +0 -2
- package/dist/services/sqlite-service/index.js.map +0 -1
- package/dist/services/sqlite-service/sqlite-coordinator.js +0 -60
- package/dist/services/sqlite-service/sqlite-coordinator.js.map +0 -1
- package/dist/types/erp-connector.js +0 -2
- package/dist/types/erp-connector.js.map +0 -1
- package/dist/types/erp-types.js +0 -13
- package/dist/types/erp-types.js.map +0 -1
- package/dist/types/flattened-work-order.d.ts +0 -99
- package/dist/types/flattened-work-order.d.ts.map +0 -1
- package/dist/types/flattened-work-order.js +0 -2
- package/dist/types/flattened-work-order.js.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/utils/application-initializer.js +0 -55
- package/dist/utils/application-initializer.js.map +0 -1
- package/dist/utils/cleanup-numbers.js +0 -6
- package/dist/utils/cleanup-numbers.js.map +0 -1
- package/dist/utils/connector-factory.js +0 -34
- package/dist/utils/connector-factory.js.map +0 -1
- package/dist/utils/connector-log/log-deduper.js +0 -240
- package/dist/utils/connector-log/log-deduper.js.map +0 -1
- package/dist/utils/connector-log/mm-connector-logger-example.js +0 -88
- package/dist/utils/connector-log/mm-connector-logger-example.js.map +0 -1
- package/dist/utils/connector-log/mm-connector-logger.js +0 -151
- package/dist/utils/connector-log/mm-connector-logger.js.map +0 -1
- package/dist/utils/data-transformation.js +0 -38
- package/dist/utils/data-transformation.js.map +0 -1
- package/dist/utils/env.d.ts +0 -8
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -58
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/erp-timezone-utils.d.ts +0 -20
- package/dist/utils/erp-timezone-utils.d.ts.map +0 -1
- package/dist/utils/erp-timezone-utils.js +0 -75
- package/dist/utils/erp-timezone-utils.js.map +0 -1
- package/dist/utils/erp-type-from-entity.js +0 -6
- package/dist/utils/erp-type-from-entity.js.map +0 -1
- package/dist/utils/error-utils.js +0 -21
- package/dist/utils/error-utils.js.map +0 -1
- package/dist/utils/http-client.js +0 -186
- package/dist/utils/http-client.js.map +0 -1
- package/dist/utils/index.js +0 -66
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/local-data-store/database-lock.js +0 -68
- package/dist/utils/local-data-store/database-lock.js.map +0 -1
- package/dist/utils/local-data-store/jobs-shared-data.js +0 -118
- package/dist/utils/local-data-store/jobs-shared-data.js.map +0 -1
- package/dist/utils/mm-labor-ticket-helpers.js +0 -28
- package/dist/utils/mm-labor-ticket-helpers.js.map +0 -1
- package/dist/utils/removeExtraneousFields.js +0 -16
- package/dist/utils/removeExtraneousFields.js.map +0 -1
- package/dist/utils/removeIdFieldFromPayload.js +0 -16
- package/dist/utils/removeIdFieldFromPayload.js.map +0 -1
- package/dist/utils/resource-group.js +0 -59
- package/dist/utils/resource-group.js.map +0 -1
- package/dist/utils/standard-process-drivers/error-processor.js +0 -262
- package/dist/utils/standard-process-drivers/error-processor.js.map +0 -1
- package/dist/utils/standard-process-drivers/index.js +0 -4
- package/dist/utils/standard-process-drivers/index.js.map +0 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +0 -173
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +0 -1
- package/dist/utils/standard-process-drivers/mm-entity-processor.js +0 -174
- package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +0 -1
- package/dist/utils/standard-process-drivers/standard-process-drivers.js +0 -333
- package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +0 -1
- package/dist/utils/time-utils.js +0 -103
- package/dist/utils/time-utils.js.map +0 -1
- package/dist/utils/timezone.js +0 -105
- package/dist/utils/timezone.js.map +0 -1
- package/dist/utils/trimObjectValues.js +0 -11
- package/dist/utils/trimObjectValues.js.map +0 -1
- package/dist/utils/uniqueRows.js +0 -35
- package/dist/utils/uniqueRows.js.map +0 -1
- package/src/types/flattened-work-order.ts +0 -108
- package/src/utils/env.ts +0 -75
- package/src/utils/erp-timezone-utils.ts +0 -99
|
@@ -0,0 +1,341 @@
|
|
|
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,7 +1,7 @@
|
|
|
1
1
|
import { AxiosError } from "axios";
|
|
2
|
-
import logger from "../reporting-service/logger
|
|
3
|
-
import { GraphQLServerError } from "./graphql/types
|
|
4
|
-
import { HTTPError } from "../../utils/http-client
|
|
2
|
+
import logger from "../reporting-service/logger";
|
|
3
|
+
import { GraphQLServerError } from "./graphql/types";
|
|
4
|
+
import { HTTPError } from "../../utils/http-client";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Represents GraphQL specific errors (validation, missing fields, etc.)
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
HTTPClient,
|
|
3
3
|
HTTPClientFactory,
|
|
4
4
|
HTTPResponse,
|
|
5
|
-
} from "../../../utils/http-client
|
|
6
|
-
import { GraphQLResponse } from "./types
|
|
7
|
-
import { ErrorHandler } from "../errors
|
|
8
|
-
import { APIResponse } from "../types
|
|
9
|
-
import { ERPApiConfig } from "../types
|
|
5
|
+
} from "../../../utils/http-client";
|
|
6
|
+
import { GraphQLResponse } from "./types";
|
|
7
|
+
import { ErrorHandler } from "../errors";
|
|
8
|
+
import { APIResponse } from "../types";
|
|
9
|
+
import { ERPApiConfig } from "../types";
|
|
10
10
|
|
|
11
11
|
const DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries
|
|
12
12
|
|
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// REST API Service
|
|
7
|
-
export { RestAPIService } from "./rest/rest-api-service
|
|
8
|
-
export type { QueryParams } from "./rest/get-query-params
|
|
7
|
+
export { RestAPIService } from "./rest/rest-api-service";
|
|
8
|
+
export type { QueryParams } from "./rest/get-query-params";
|
|
9
9
|
|
|
10
10
|
// GraphQL Service
|
|
11
|
-
export { GraphQLService } from "./graphql/graphql-service
|
|
12
|
-
export type { GraphQLServerError } from './graphql/types
|
|
11
|
+
export { GraphQLService } from "./graphql/graphql-service";
|
|
12
|
+
export type { GraphQLServerError } from './graphql/types';
|
|
13
13
|
|
|
14
14
|
// OAuth Client
|
|
15
|
-
export { OAuthClient } from './oauth-client
|
|
16
|
-
export type { OAuthConfig } from './oauth-client
|
|
15
|
+
export { OAuthClient } from './oauth-client';
|
|
16
|
+
export type { OAuthConfig } from './oauth-client';
|
|
17
17
|
|
|
18
18
|
// API Response
|
|
19
|
-
export type { APIResponse } from './types
|
|
19
|
+
export type { APIResponse } from './types';
|
|
20
20
|
|
|
21
21
|
// Error classes
|
|
22
|
-
export { ErrorHandler, GraphQLError } from './errors
|
|
22
|
+
export { ErrorHandler, GraphQLError } from './errors';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { HTTPClient, HTTPClientFactory } from "../../../utils/http-client
|
|
1
|
+
import { HTTPClient, HTTPClientFactory } from "../../../utils/http-client";
|
|
2
2
|
import {
|
|
3
3
|
QueryParams,
|
|
4
4
|
buildLogicalCondition,
|
|
5
5
|
Pagination,
|
|
6
|
-
} from "./get-query-params
|
|
7
|
-
import { ErrorHandler } from "../errors
|
|
8
|
-
import { APIResponse, ERPApiConfig } from "../types
|
|
6
|
+
} from "./get-query-params";
|
|
7
|
+
import { ErrorHandler } from "../errors";
|
|
8
|
+
import { APIResponse, ERPApiConfig } from "../types";
|
|
9
9
|
|
|
10
10
|
const DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries
|
|
11
11
|
const DEFAULT_PAGINATION_LIMIT = 100; // Reasonable default for most APIs
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Pagination } from "./rest/get-query-params
|
|
2
|
-
import { GraphQLServerError } from "./graphql/types
|
|
1
|
+
import { Pagination } from "./rest/get-query-params";
|
|
2
|
+
import { GraphQLServerError } from "./graphql/types";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Configuration for making API requests to an ERP system.
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { MMApiClient } from "./mm-api-service
|
|
1
|
+
import { MMApiClient } from "./mm-api-service";
|
|
2
2
|
import type {
|
|
3
3
|
MMReceiveLaborTicket,
|
|
4
4
|
MMReceiveLaborTicketReason,
|
|
5
5
|
MMReceiveLaborTicketWorkOrderOperation,
|
|
6
|
-
} from "./types/receive-types
|
|
6
|
+
} from "./types/receive-types";
|
|
7
7
|
import {
|
|
8
8
|
MMSendPerson,
|
|
9
9
|
MMSendResource,
|
|
@@ -14,8 +14,8 @@ import {
|
|
|
14
14
|
MMSendReason,
|
|
15
15
|
MMSendLaborTicket,
|
|
16
16
|
MMSendWorkOrderBatch,
|
|
17
|
-
} from "./types/send-types
|
|
18
|
-
import type { IToRESTApiObject } from "./types/send-types
|
|
17
|
+
} from "./types/send-types";
|
|
18
|
+
import type { IToRESTApiObject } from "./types/send-types";
|
|
19
19
|
import type {
|
|
20
20
|
MMApiBaseResponse,
|
|
21
21
|
MM200NonLaborTicketResponse,
|
|
@@ -26,7 +26,9 @@ import type {
|
|
|
26
26
|
MM500LaborTicketException,
|
|
27
27
|
MMGraphQLResourceResponse,
|
|
28
28
|
MMMachineGroupsResponse,
|
|
29
|
-
} from "./types/mm-response-interfaces
|
|
29
|
+
} from "./types/mm-response-interfaces";
|
|
30
|
+
import { getCompanyInfo } from "./company-info";
|
|
31
|
+
import type { CompanyInfo } from "./company-info";
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
34
|
* A class to manage interactions with the MM API
|
|
@@ -52,7 +54,7 @@ export type {
|
|
|
52
54
|
/**
|
|
53
55
|
* Types related of labor tickets received from the MM API
|
|
54
56
|
*/
|
|
55
|
-
export { MMReceiveLaborTicket } from "./types/receive-types
|
|
57
|
+
export { MMReceiveLaborTicket } from "./types/receive-types";
|
|
56
58
|
export type {
|
|
57
59
|
MMReceiveLaborTicketReason,
|
|
58
60
|
MMReceiveLaborTicketWorkOrderOperation,
|
|
@@ -81,3 +83,9 @@ export {
|
|
|
81
83
|
* Batch interfaces for sending multiple related entities
|
|
82
84
|
*/
|
|
83
85
|
export type { MMSendWorkOrderBatch };
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Company information utilities
|
|
89
|
+
*/
|
|
90
|
+
export { getCompanyInfo };
|
|
91
|
+
export type { CompanyInfo };
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import logger from "../reporting-service/logger
|
|
2
|
-
import { ERPObjType } from "../../types/erp-types
|
|
3
|
-
import { MMReceiveLaborTicket } from "./types/receive-types
|
|
4
|
-
import { MMTokenManager } from "./token-mgr
|
|
5
|
-
import * as MM_SEND_TYPES from "./types/send-types
|
|
1
|
+
import logger from "../reporting-service/logger";
|
|
2
|
+
import { ERPObjType } from "../../types/erp-types";
|
|
3
|
+
import { MMReceiveLaborTicket } from "./types/receive-types";
|
|
4
|
+
import { MMTokenManager } from "./token-mgr";
|
|
5
|
+
import * as MM_SEND_TYPES from "./types/send-types";
|
|
6
6
|
import {
|
|
7
7
|
HTTPClient,
|
|
8
8
|
HTTPMethod,
|
|
9
9
|
HTTPRequestConfig,
|
|
10
10
|
HTTPClientFactory,
|
|
11
|
-
} from "../../utils/http-client
|
|
12
|
-
import { Checkpoint } from "./types/checkpoint
|
|
13
|
-
import { CoreConfiguration } from "../data-sync-service/configuration-manager
|
|
14
|
-
import { ErrorHandler } from "../erp-api-services/errors
|
|
11
|
+
} from "../../utils/http-client";
|
|
12
|
+
import { Checkpoint } from "./types/checkpoint";
|
|
13
|
+
import { CoreConfiguration } from "../data-sync-service/configuration-manager";
|
|
14
|
+
import { ErrorHandler } from "../erp-api-services/errors";
|
|
15
15
|
import {
|
|
16
16
|
MMApiBaseResponse,
|
|
17
17
|
MMGraphQLResourceResponse,
|
|
18
18
|
MMMachineGroupsResponse,
|
|
19
|
-
} from "./types/mm-response-interfaces
|
|
19
|
+
} from "./types/mm-response-interfaces";
|
|
20
20
|
|
|
21
21
|
const MAPPING = "MAPPING";
|
|
22
22
|
const CHECKPOINTS = "CHECKPOINTS";
|
|
@@ -80,9 +80,12 @@ export class MMApiClient {
|
|
|
80
80
|
return typeof err === "object" && err !== null && "status" in err;
|
|
81
81
|
};
|
|
82
82
|
|
|
83
|
-
// Check if this looks like an auth error -
|
|
83
|
+
// Check if this looks like an auth error - retry on auth status codes or JWT expiration errors
|
|
84
84
|
const isAuthError =
|
|
85
|
-
hasStatus(error) && (error.status === 401 || error.status === 403)
|
|
85
|
+
hasStatus(error) && (error.status === 401 || error.status === 403) ||
|
|
86
|
+
(hasStatus(error) && error.status === 500 &&
|
|
87
|
+
typeof (error as any).data?.error === 'string' &&
|
|
88
|
+
(error as any).data.error.includes('JWT'));
|
|
86
89
|
|
|
87
90
|
if (isAuthError && !options.token) {
|
|
88
91
|
// Only retry if we used cached token
|
|
@@ -506,6 +509,20 @@ export class MMApiClient {
|
|
|
506
509
|
return updates.data.map((ticket) => new MMReceiveLaborTicket(ticket));
|
|
507
510
|
}
|
|
508
511
|
|
|
512
|
+
/**
|
|
513
|
+
* Fetch a single labor ticket by reference from the MM API
|
|
514
|
+
* @param laborTicketRef The labor ticket reference to fetch
|
|
515
|
+
* @returns Promise with the labor ticket data
|
|
516
|
+
*/
|
|
517
|
+
async fetchLaborTicketByRef(
|
|
518
|
+
laborTicketRef: string
|
|
519
|
+
): Promise<MMReceiveLaborTicket> {
|
|
520
|
+
const response = (await this.getData(
|
|
521
|
+
`${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/${laborTicketRef}`
|
|
522
|
+
)) as { data: MMReceiveLaborTicket };
|
|
523
|
+
return new MMReceiveLaborTicket(response.data);
|
|
524
|
+
}
|
|
525
|
+
|
|
509
526
|
/**
|
|
510
527
|
* Fetch a checkpoint for a specific system, table, and checkpoint type
|
|
511
528
|
* @param checkpoint The checkpoint to fetch
|
|
@@ -551,7 +568,7 @@ export class MMApiClient {
|
|
|
551
568
|
logger.info("saveCheckpoint:", { saveCheckpoint });
|
|
552
569
|
} else {
|
|
553
570
|
logger.info("Existing checkpoint found:", {
|
|
554
|
-
|
|
571
|
+
timestamp: checkpointResponse.timestamp,
|
|
555
572
|
});
|
|
556
573
|
}
|
|
557
574
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getCachedMMToken,
|
|
3
3
|
setCachedMMToken,
|
|
4
|
-
} from "../../utils/local-data-store/jobs-shared-data
|
|
5
|
-
import { HTTPClient, HTTPClientFactory } from "../../utils/http-client
|
|
6
|
-
import { CoreConfiguration } from "../data-sync-service/configuration-manager
|
|
7
|
-
import { logger } from "../reporting-service
|
|
4
|
+
} from "../../utils/local-data-store/jobs-shared-data";
|
|
5
|
+
import { HTTPClient, HTTPClientFactory } from "../../utils/http-client";
|
|
6
|
+
import { CoreConfiguration } from "../data-sync-service/configuration-manager";
|
|
7
|
+
import { logger } from "../reporting-service";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Manages the MM API token with caching and expiration checking
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ERPObjType } from "../../../types/erp-types
|
|
2
|
-
import { IToRESTApiObject } from "
|
|
1
|
+
import { ERPObjType } from "../../../types/erp-types";
|
|
2
|
+
import { IToRESTApiObject } from "..";
|
|
3
3
|
import {
|
|
4
4
|
MMSendPerson,
|
|
5
5
|
MMSendResource,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
MMSendWorkOrderOperation,
|
|
10
10
|
MMSendLaborTicket,
|
|
11
11
|
MMSendReason,
|
|
12
|
-
} from "
|
|
12
|
+
} from "..";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Utility class for transforming entities to/from non-typed and typed objects
|