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