@machinemetrics/mm-erp-sdk 0.9.4 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +54 -43
  2. package/dist/index.d.ts +4 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/services/mm-api-service/index.d.ts +3 -3
  7. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  8. package/dist/services/mm-api-service/index.js +1 -1
  9. package/dist/services/mm-api-service/index.js.map +1 -1
  10. package/dist/services/mm-api-service/mes-machine-settings.d.ts +46 -0
  11. package/dist/services/mm-api-service/mes-machine-settings.d.ts.map +1 -0
  12. package/dist/services/mm-api-service/mes-machine-settings.js +124 -0
  13. package/dist/services/mm-api-service/mes-machine-settings.js.map +1 -0
  14. package/dist/services/mm-api-service/mm-api-service.d.ts +28 -13
  15. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  16. package/dist/services/mm-api-service/mm-api-service.js +43 -47
  17. package/dist/services/mm-api-service/mm-api-service.js.map +1 -1
  18. package/dist/services/mm-api-service/types/mm-response-interfaces.d.ts +4 -16
  19. package/dist/services/mm-api-service/types/mm-response-interfaces.d.ts.map +1 -1
  20. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +1 -1
  21. package/dist/services/mm-api-service/types/receive-types.d.ts +19 -0
  22. package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
  23. package/dist/services/mm-api-service/types/receive-types.js +22 -2
  24. package/dist/services/mm-api-service/types/receive-types.js.map +1 -1
  25. package/dist/types/erp-connector.d.ts +8 -2
  26. package/dist/types/erp-connector.d.ts.map +1 -1
  27. package/dist/utils/index.d.ts +3 -0
  28. package/dist/utils/index.d.ts.map +1 -1
  29. package/dist/utils/index.js +2 -0
  30. package/dist/utils/index.js.map +1 -1
  31. package/dist/utils/labor-import-from-erp.d.ts +68 -0
  32. package/dist/utils/labor-import-from-erp.d.ts.map +1 -0
  33. package/dist/utils/labor-import-from-erp.js +194 -0
  34. package/dist/utils/labor-import-from-erp.js.map +1 -0
  35. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +4 -2
  36. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  37. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +17 -15
  38. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +1 -1
  39. package/dist/utils/standard-process-drivers/labor-ticket-normalization.d.ts +6 -0
  40. package/dist/utils/standard-process-drivers/labor-ticket-normalization.d.ts.map +1 -1
  41. package/dist/utils/standard-process-drivers/labor-ticket-normalization.js +12 -0
  42. package/dist/utils/standard-process-drivers/labor-ticket-normalization.js.map +1 -1
  43. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +11 -1
  44. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  45. package/dist/utils/standard-process-drivers/mm-entity-processor.js +42 -4
  46. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +1 -1
  47. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +22 -2
  48. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  49. package/dist/utils/standard-process-drivers/standard-process-drivers.js +84 -0
  50. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +1 -1
  51. package/dist/utils/standard-process-drivers/timesheet-erp-synchronizer.d.ts +12 -0
  52. package/dist/utils/standard-process-drivers/timesheet-erp-synchronizer.d.ts.map +1 -0
  53. package/dist/utils/standard-process-drivers/timesheet-erp-synchronizer.js +79 -0
  54. package/dist/utils/standard-process-drivers/timesheet-erp-synchronizer.js.map +1 -0
  55. package/package.json +9 -3
  56. package/src/index.ts +22 -1
  57. package/src/services/mm-api-service/index.ts +5 -3
  58. package/src/services/mm-api-service/mes-machine-settings.test.ts +174 -0
  59. package/src/services/mm-api-service/mes-machine-settings.ts +169 -0
  60. package/src/services/mm-api-service/mm-api-service.ts +58 -60
  61. package/src/services/mm-api-service/types/mm-response-interfaces.ts +4 -17
  62. package/src/services/mm-api-service/types/receive-types.ts +22 -3
  63. package/src/types/erp-connector.ts +12 -2
  64. package/src/utils/index.ts +19 -0
  65. package/src/utils/labor-import-from-erp.test.ts +116 -0
  66. package/src/utils/labor-import-from-erp.ts +310 -0
  67. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +20 -14
  68. package/src/utils/standard-process-drivers/labor-ticket-normalization.ts +15 -0
  69. package/src/utils/standard-process-drivers/mm-entity-processor.ts +61 -8
  70. package/src/utils/standard-process-drivers/standard-process-drivers.ts +134 -1
  71. package/src/utils/standard-process-drivers/timesheet-erp-synchronizer.ts +102 -0
  72. package/dist/utils/resource-group.d.ts +0 -11
  73. package/dist/utils/resource-group.d.ts.map +0 -1
  74. package/dist/utils/resource-group.js +0 -71
  75. package/dist/utils/resource-group.js.map +0 -1
  76. package/src/utils/resource-group.ts +0 -105
@@ -1,8 +1,9 @@
1
1
  import { ERPObjType } from "../../types/erp-types.js";
2
- import { IERPLaborTicketHandler } from "../../types/erp-connector.js";
2
+ import { IERPLaborTicketHandler, IERPTimesheetHandler } from "../../types/erp-connector.js";
3
3
  import type { FlattenedWorkOrderRow } from "../../types/flattened-work-order.js";
4
4
  import { BatchCacheManager } from "../../services/caching-service/batch-cache-manager.js";
5
- import { IToRESTApiObject, MMSendWorkOrderBatch } from "../../services/mm-api-service/index.js";
5
+ import { IToRESTApiObject, MMSendWorkOrderBatch, MMSendLaborTicket } from "../../services/mm-api-service/index.js";
6
+ import { type FilterLaborTicketsForMmImportOptions, type FilterLaborTicketsForMmImportResult } from "../labor-import-from-erp.js";
6
7
  /**
7
8
  * The result of writing entities to the MachineMetrics API on complete success.
8
9
  */
@@ -53,6 +54,11 @@ export declare class StandardProcessDrivers {
53
54
  static syncLaborTicketsToERP(connectorType: string, connector: IERPLaborTicketHandler, options?: {
54
55
  onlyClosed?: boolean;
55
56
  }): Promise<void>;
57
+ /**
58
+ * Synchronizes timesheet rows (employee clock in/out) from MachineMetrics to an ERP system.
59
+ * Run after {@link syncLaborTicketsToERP} in the same job so labor is written/closed before clock-out.
60
+ */
61
+ static syncTimesheetsToERP(connectorType: string, handler: IERPTimesheetHandler): Promise<void>;
56
62
  /**
57
63
  * Retries labor tickets that have failed to be created or updated in the ERP during the sync:
58
64
  *
@@ -61,6 +67,20 @@ export declare class StandardProcessDrivers {
61
67
  * which are then deleted from the list of failed labor ticket ids.
62
68
  */
63
69
  static retryFailedLaborTickets(connectorType: string, connector: IERPLaborTicketHandler): Promise<void>;
70
+ /**
71
+ * Filters ERP-mapped labor tickets for MM FK/import rules, then writes them via {@link writeEntitiesToMM}.
72
+ */
73
+ static writeLaborTicketsToMmFromErpImport(tickets: MMSendLaborTicket[], filterOptions: FilterLaborTicketsForMmImportOptions, batchCacheManager?: BatchCacheManager | null, writeOptions?: {
74
+ connectorType?: string;
75
+ }): Promise<WriteEntitiesToMMResult & {
76
+ filter: FilterLaborTicketsForMmImportResult;
77
+ }>;
78
+ /**
79
+ * Best-effort advance of the {@code labor_tickets / export} checkpoint past the just-finished
80
+ * import window. Failures here are logged and swallowed — the to-erp ledger/signature dedupe
81
+ * is the real correctness guarantee; this is a belt-and-suspenders skip-window optimization.
82
+ */
83
+ static advanceLaborTicketsExportCheckpoint(connectorType: string, timestampIso: string): Promise<void>;
64
84
  /**
65
85
  * Writes a batch of records to MM for a specific entity type by:
66
86
  * 1. Deduplicating against cached records (localDedupeCount)
@@ -1 +1 @@
1
- {"version":3,"file":"standard-process-drivers.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/standard-process-drivers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standard-process-drivers.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/standard-process-drivers.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,11 @@ import { ERPObjType } from "../../types/erp-types.js";
2
2
  import { BatchCacheManager } from "../../services/caching-service/batch-cache-manager.js";
3
3
  import { MMSendPart, MMSendPartOperation, MMSendWorkOrder, MMSendWorkOrderOperation, } from "../../services/mm-api-service/index.js";
4
4
  import { LaborTicketERPSynchronizer } from "./labor-ticket-erp-synchronizer.js";
5
+ import { TimesheetERPSynchronizer } from "./timesheet-erp-synchronizer.js";
5
6
  import { MMEntityProcessor } from "./mm-entity-processor.js";
7
+ import { filterLaborTicketsForMmImport, } from "../labor-import-from-erp.js";
8
+ import { MMApiClient } from "../../services/mm-api-service/mm-api-service.js";
9
+ import { sdkLogger as logger } from "../../services/reporting-service/logger.js";
6
10
  export class MMBatchValidationError extends Error {
7
11
  upsertedEntities;
8
12
  localDedupeCount;
@@ -39,6 +43,13 @@ export class StandardProcessDrivers {
39
43
  static async syncLaborTicketsToERP(connectorType, connector, options) {
40
44
  return LaborTicketERPSynchronizer.syncToERP(connectorType, connector, options);
41
45
  }
46
+ /**
47
+ * Synchronizes timesheet rows (employee clock in/out) from MachineMetrics to an ERP system.
48
+ * Run after {@link syncLaborTicketsToERP} in the same job so labor is written/closed before clock-out.
49
+ */
50
+ static async syncTimesheetsToERP(connectorType, handler) {
51
+ return TimesheetERPSynchronizer.syncToERP(connectorType, handler);
52
+ }
42
53
  /**
43
54
  * Retries labor tickets that have failed to be created or updated in the ERP during the sync:
44
55
  *
@@ -49,6 +60,79 @@ export class StandardProcessDrivers {
49
60
  static async retryFailedLaborTickets(connectorType, connector) {
50
61
  return LaborTicketERPSynchronizer.retryFailed(connectorType, connector);
51
62
  }
63
+ /**
64
+ * Filters ERP-mapped labor tickets for MM FK/import rules, then writes them via {@link writeEntitiesToMM}.
65
+ */
66
+ static async writeLaborTicketsToMmFromErpImport(tickets, filterOptions, batchCacheManager, writeOptions) {
67
+ const filter = await filterLaborTicketsForMmImport(tickets, filterOptions);
68
+ if (filter.accepted.length === 0) {
69
+ return {
70
+ message: "No labor tickets passed FK/import filters",
71
+ upsertedEntities: 0,
72
+ localDedupeCount: 0,
73
+ apiDedupeCount: 0,
74
+ filter,
75
+ };
76
+ }
77
+ // Pre-write the labor sync ledger BEFORE the MM POST. The post-write marker in
78
+ // _handleResponse is kept as a safety net but cannot be relied on if the POST hangs
79
+ // or the worker dies. Pre-marking guarantees the next to-erp cycle sees these tickets.
80
+ if (writeOptions?.connectorType) {
81
+ await MMEntityProcessor.markLaborTicketsInLedger(filter.accepted, writeOptions.connectorType, "labor-ledger-mark:pre-write");
82
+ }
83
+ else {
84
+ logger.warn("writeLaborTicketsToMmFromErpImport: no connectorType provided; skipping labor sync ledger pre-marking. The next to-erp cycle will reprocess these tickets.");
85
+ }
86
+ logger.info("writeLaborTicketsToMmFromErpImport: sending accepted labor tickets to MM API", { count: filter.accepted.length });
87
+ const write = await this.writeEntitiesToMM(ERPObjType.LABOR_TICKETS, filter.accepted, batchCacheManager, writeOptions);
88
+ // Capture "now" right after the MM POST returns. Anything MM updated as a side-effect
89
+ // of our writes carries an updatedAt <= this instant, so advancing the labor_tickets
90
+ // export checkpoint to it lets the next to-erp cycle skip the tickets we just wrote
91
+ // (the dedupe-by-signature path can drift due to MM-side normalization). Real-time
92
+ // edits to those tickets in MM still arrive via NATS, so the skipped polling window
93
+ // is acceptable.
94
+ const checkpointAfterWriteIso = new Date().toISOString();
95
+ logger.info("writeLaborTicketsToMmFromErpImport: MM API write finished", {
96
+ upsertedEntities: write.upsertedEntities,
97
+ localDedupeCount: write.localDedupeCount,
98
+ apiDedupeCount: write.apiDedupeCount,
99
+ });
100
+ if (writeOptions?.connectorType) {
101
+ await this.advanceLaborTicketsExportCheckpoint(writeOptions.connectorType, checkpointAfterWriteIso);
102
+ }
103
+ else {
104
+ logger.warn("writeLaborTicketsToMmFromErpImport: no connectorType provided; skipping labor_tickets export-checkpoint advance. The next to-erp cycle will still see these tickets in its updates feed.");
105
+ }
106
+ return { ...write, filter };
107
+ }
108
+ /**
109
+ * Best-effort advance of the {@code labor_tickets / export} checkpoint past the just-finished
110
+ * import window. Failures here are logged and swallowed — the to-erp ledger/signature dedupe
111
+ * is the real correctness guarantee; this is a belt-and-suspenders skip-window optimization.
112
+ */
113
+ static async advanceLaborTicketsExportCheckpoint(connectorType, timestampIso) {
114
+ const mmApiClient = new MMApiClient();
115
+ try {
116
+ await mmApiClient.saveCheckpoint({
117
+ system: connectorType,
118
+ table: "labor_tickets",
119
+ checkpointType: "export",
120
+ checkpointValue: { timestamp: timestampIso },
121
+ });
122
+ logger.info("advanceLaborTicketsExportCheckpoint: labor_tickets export checkpoint advanced", { connectorType, checkpointTimestamp: timestampIso });
123
+ }
124
+ catch (error) {
125
+ logger.warn("advanceLaborTicketsExportCheckpoint: failed to advance labor_tickets export checkpoint; to-erp will fall back to ledger/signature dedupe", { connectorType, checkpointTimestamp: timestampIso, error });
126
+ }
127
+ finally {
128
+ try {
129
+ await mmApiClient.destroy();
130
+ }
131
+ catch (destroyError) {
132
+ logger.warn("advanceLaborTicketsExportCheckpoint: failed to destroy MMApiClient", { error: destroyError });
133
+ }
134
+ }
135
+ }
52
136
  /**
53
137
  * Writes a batch of records to MM for a specific entity type by:
54
138
  * 1. Deduplicating against cached records (localDedupeCount)
@@ -1 +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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"}
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,12 @@
1
+ import type { IERPTimesheetHandler } from "../../types/erp-connector.js";
2
+ /**
3
+ * Synchronizes timesheet rows (clock in/out) from MachineMetrics to an ERP system.
4
+ * Simpler than labor tickets: no local ledger; bounded multi-pass retry like legacy epicor-integration.
5
+ *
6
+ * Callers should run labor ticket sync to completion before invoking this, so shop-floor labor
7
+ * is written/closed before employee-level clock-out.
8
+ */
9
+ export declare class TimesheetERPSynchronizer {
10
+ static syncToERP(connectorType: string, handler: IERPTimesheetHandler): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=timesheet-erp-synchronizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timesheet-erp-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/timesheet-erp-synchronizer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAKzE;;;;;;GAMG;AACH,qBAAa,wBAAwB;WACtB,SAAS,CACpB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC;CAkFjB"}
@@ -0,0 +1,79 @@
1
+ import { sdkLogger as logger } from "../../services/reporting-service/logger.js";
2
+ import { MMApiClient } from "../../services/mm-api-service/mm-api-service.js";
3
+ import { summarizeError } from "../error-utils.js";
4
+ const MAX_PASSES = 10;
5
+ /**
6
+ * Synchronizes timesheet rows (clock in/out) from MachineMetrics to an ERP system.
7
+ * Simpler than labor tickets: no local ledger; bounded multi-pass retry like legacy epicor-integration.
8
+ *
9
+ * Callers should run labor ticket sync to completion before invoking this, so shop-floor labor
10
+ * is written/closed before employee-level clock-out.
11
+ */
12
+ export class TimesheetERPSynchronizer {
13
+ static async syncToERP(connectorType, handler) {
14
+ const mmApiClient = new MMApiClient();
15
+ try {
16
+ await mmApiClient.initializeCheckpoint({
17
+ system: connectorType,
18
+ table: "timesheets",
19
+ checkpointType: "export",
20
+ checkpointValue: {
21
+ timestamp: new Date().toISOString(),
22
+ },
23
+ });
24
+ let timesheetSyncTime = new Date().toISOString();
25
+ const processedTimesheets = [];
26
+ const failedTimesheets = [];
27
+ let attempt = 0;
28
+ const fetchPending = async () => {
29
+ const rows = await mmApiClient.fetchTimesheetUpdates({
30
+ system: connectorType,
31
+ checkpointType: "export",
32
+ });
33
+ return [...rows].sort((a, b) => Number(a.timesheetRef) - Number(b.timesheetRef));
34
+ };
35
+ let timesheetsPendingUpdate = await fetchPending();
36
+ while (timesheetsPendingUpdate.length > 0) {
37
+ attempt += 1;
38
+ if (attempt > MAX_PASSES) {
39
+ logger.warn(`syncTimesheetsToERP: Stopping after ${MAX_PASSES} passes; remaining pending=${timesheetsPendingUpdate.length}`);
40
+ break;
41
+ }
42
+ for (const timesheet of timesheetsPendingUpdate) {
43
+ try {
44
+ await handler.processTimesheetInERP(timesheet);
45
+ processedTimesheets.push(timesheet);
46
+ }
47
+ catch (error) {
48
+ logger.error("syncTimesheetsToERP: Failed to process timesheet", {
49
+ timesheetRef: timesheet.timesheetRef,
50
+ error: summarizeError(error),
51
+ });
52
+ failedTimesheets.push(timesheet);
53
+ }
54
+ }
55
+ timesheetSyncTime = new Date().toISOString();
56
+ const allPendingTimesheets = await fetchPending();
57
+ const allAttemptedTimesheets = [...processedTimesheets, ...failedTimesheets];
58
+ timesheetsPendingUpdate = allPendingTimesheets.filter((ts) => !allAttemptedTimesheets.some((attempted) => String(attempted.timesheetRef) === String(ts.timesheetRef)));
59
+ }
60
+ await mmApiClient.saveCheckpoint({
61
+ system: connectorType,
62
+ table: "timesheets",
63
+ checkpointType: "export",
64
+ checkpointValue: {
65
+ timestamp: timesheetSyncTime,
66
+ },
67
+ });
68
+ logger.info("syncTimesheetsToERP: Completed", {
69
+ processed: processedTimesheets.length,
70
+ failed: failedTimesheets.length,
71
+ checkpointTimestamp: timesheetSyncTime,
72
+ });
73
+ }
74
+ finally {
75
+ await mmApiClient.destroy();
76
+ }
77
+ }
78
+ }
79
+ //# sourceMappingURL=timesheet-erp-synchronizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timesheet-erp-synchronizer.js","sourceRoot":"","sources":["../../../src/utils/standard-process-drivers/timesheet-erp-synchronizer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,25 @@
1
1
  {
2
2
  "name": "@machinemetrics/mm-erp-sdk",
3
3
  "description": "A library for syncing data between MachineMetrics and ERP systems",
4
- "version": "0.9.4",
4
+ "version": "0.9.5",
5
5
  "license": "MIT",
6
6
  "author": "machinemetrics",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
9
  "source": "src/index.ts",
10
10
  "type": "module",
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
11
14
  "engines": {
12
15
  "node": ">=20"
13
16
  },
14
17
  "scripts": {
15
18
  "build": "tsc --project tsconfig.build.json",
16
19
  "start": "tsc --project tsconfig.build.json --watch",
17
- "type-check": "tsc --noEmit"
20
+ "type-check": "tsc --noEmit",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
18
23
  },
19
24
  "dependencies": {
20
25
  "@azure/msal-node": "^2.12.0",
@@ -46,7 +51,8 @@
46
51
  "@types/node": "^20.0.0",
47
52
  "@types/xxhashjs": "^0.2.4",
48
53
  "prettier": "^3.6.2",
49
- "typescript": "^5.8.3"
54
+ "typescript": "^5.8.3",
55
+ "vitest": "^3.0.5"
50
56
  },
51
57
  "files": [
52
58
  "dist",
package/src/index.ts CHANGED
@@ -4,7 +4,10 @@
4
4
  */
5
5
 
6
6
  // Core interfaces and types
7
- export type { IERPConnector } from "./types/erp-connector.js";
7
+ export type {
8
+ IERPConnector,
9
+ IERPTimesheetHandler,
10
+ } from "./types/erp-connector.js";
8
11
  export { ERPObjType } from "./types/erp-types.js";
9
12
  export type { ERPPagination, ERPResponse, ERPObject } from "./types/erp-types.js";
10
13
 
@@ -27,6 +30,7 @@ export type { ERPApiConfig } from "./services/erp-api-services/types.js";
27
30
  export { MMApiClient } from "./services/mm-api-service/index.js";
28
31
  export { MMReceiveLaborTicket } from "./services/mm-api-service/index.js";
29
32
  export { MMReceiveWorkOrder } from "./services/mm-api-service/index.js";
33
+ export { MMReceiveTimesheet } from "./services/mm-api-service/index.js";
30
34
  export type {
31
35
  MMReceiveLaborTicketReason,
32
36
  MMReceiveLaborTicketWorkOrderOperation,
@@ -114,6 +118,23 @@ export {
114
118
  export type { WriteEntitiesToMMResult } from "./utils/index.js";
115
119
  export { MMBatchValidationError } from "./utils/index.js";
116
120
 
121
+ export {
122
+ getMesLaborImportResourceIds,
123
+ getMappedOperatorErpIdsForImport,
124
+ normalizeLaborTicketWorkOrderOpKey,
125
+ buildSyncedWorkOrderOperationKeySet,
126
+ resolveSyncedWorkOrderOperationKeysForLaborImport,
127
+ filterLaborTicketsForMmImport,
128
+ collectMesSchedulableErpResourceIds,
129
+ fetchMesSchedulableErpResourceIds,
130
+ } from "./utils/index.js";
131
+ export type {
132
+ MesMachineSettingRow,
133
+ SyncedWorkOrderOperationRow,
134
+ FilterLaborTicketsForMmImportOptions,
135
+ FilterLaborTicketsForMmImportResult,
136
+ } from "./utils/labor-import-from-erp.js";
137
+
117
138
  // API services
118
139
  export type { APIResponse } from "./services/erp-api-services/types.js";
119
140
  export { RestAPIService } from "./services/erp-api-services/rest/rest-api-service.js";
@@ -24,7 +24,6 @@ import type {
24
24
  MM207LaborTicketResponse,
25
25
  MM500NonLaborTicketException,
26
26
  MM500LaborTicketException,
27
- MMGraphQLResourceResponse,
28
27
  MMGraphQLWorkOrderResponse,
29
28
  MMMachineGroupsResponse,
30
29
  MMMappedErpResourceRow,
@@ -63,7 +62,6 @@ export type {
63
62
  MM207LaborTicketResponse,
64
63
  MM500NonLaborTicketException,
65
64
  MM500LaborTicketException,
66
- MMGraphQLResourceResponse,
67
65
  MMGraphQLWorkOrderResponse,
68
66
  MMMachineGroupsResponse,
69
67
  MMMappedErpResourceRow,
@@ -72,7 +70,11 @@ export type {
72
70
  /**
73
71
  * Types related to entities received from the MM API
74
72
  */
75
- export { MMReceiveLaborTicket, MMReceiveWorkOrder } from "./types/receive-types.js";
73
+ export {
74
+ MMReceiveLaborTicket,
75
+ MMReceiveWorkOrder,
76
+ MMReceiveTimesheet,
77
+ } from "./types/receive-types.js";
76
78
  export type {
77
79
  MMReceiveLaborTicketReason,
78
80
  MMReceiveLaborTicketWorkOrderOperation,
@@ -0,0 +1,174 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ collectMesSchedulableErpResourceIds,
4
+ mapMesMachineSettingsToMappedErpResourceRows,
5
+ } from "./mes-machine-settings.js";
6
+ import type { MesMachineSettingRow } from "./mes-machine-settings.js";
7
+
8
+ describe("mapMesMachineSettingsToMappedErpResourceRows", () => {
9
+ it("maps rows with machineRef and laborResourceId", () => {
10
+ const rows: MesMachineSettingRow[] = [
11
+ {
12
+ machineRef: 10,
13
+ laborResourceId: "RES-A",
14
+ name: "Cell 1",
15
+ type: "manual",
16
+ machineGroupId: "grp-1",
17
+ isResourceGroup: false,
18
+ },
19
+ ];
20
+ expect(mapMesMachineSettingsToMappedErpResourceRows(rows)).toEqual([
21
+ {
22
+ machineRef: 10,
23
+ resourceId: "RES-A",
24
+ name: "Cell 1",
25
+ type: "manual",
26
+ machineGroupId: "grp-1",
27
+ isResourceGroup: false,
28
+ },
29
+ ]);
30
+ });
31
+
32
+ it("parses numeric string machineRef", () => {
33
+ expect(
34
+ mapMesMachineSettingsToMappedErpResourceRows([
35
+ { machineRef: "42", laborResourceId: "x" },
36
+ ])
37
+ ).toEqual([
38
+ {
39
+ machineRef: 42,
40
+ resourceId: "x",
41
+ name: null,
42
+ type: null,
43
+ machineGroupId: null,
44
+ isResourceGroup: false,
45
+ },
46
+ ]);
47
+ });
48
+
49
+ it("trims laborResourceId and rejects blank", () => {
50
+ expect(
51
+ mapMesMachineSettingsToMappedErpResourceRows([
52
+ { machineRef: 1, laborResourceId: " id " },
53
+ ])
54
+ ).toEqual([
55
+ expect.objectContaining({ resourceId: "id", machineRef: 1 }),
56
+ ]);
57
+
58
+ expect(
59
+ mapMesMachineSettingsToMappedErpResourceRows([
60
+ { machineRef: 1, laborResourceId: "" },
61
+ ])
62
+ ).toHaveLength(0);
63
+
64
+ expect(
65
+ mapMesMachineSettingsToMappedErpResourceRows([
66
+ { machineRef: 1, laborResourceId: " " },
67
+ ])
68
+ ).toHaveLength(0);
69
+ });
70
+
71
+ it("excludes rows without finite machineRef", () => {
72
+ expect(
73
+ mapMesMachineSettingsToMappedErpResourceRows([
74
+ { laborResourceId: "a" },
75
+ { machineRef: NaN, laborResourceId: "a" },
76
+ { machineRef: null, laborResourceId: "a" },
77
+ ])
78
+ ).toHaveLength(0);
79
+ });
80
+
81
+ it("excludes rows without laborResourceId", () => {
82
+ expect(
83
+ mapMesMachineSettingsToMappedErpResourceRows([
84
+ { machineRef: 1 },
85
+ { machineRef: 1, laborResourceId: null },
86
+ ])
87
+ ).toHaveLength(0);
88
+ });
89
+
90
+ it("defaults optional group and name when absent", () => {
91
+ expect(
92
+ mapMesMachineSettingsToMappedErpResourceRows([
93
+ { machineRef: 2, laborResourceId: "Z" },
94
+ ])
95
+ ).toEqual([
96
+ {
97
+ machineRef: 2,
98
+ resourceId: "Z",
99
+ isResourceGroup: false,
100
+ machineGroupId: null,
101
+ name: null,
102
+ type: null,
103
+ },
104
+ ]);
105
+ });
106
+
107
+ it("supports isResourceGroup true", () => {
108
+ expect(
109
+ mapMesMachineSettingsToMappedErpResourceRows([
110
+ { machineRef: 1, laborResourceId: "G", isResourceGroup: true },
111
+ ])
112
+ ).toEqual([
113
+ expect.objectContaining({ isResourceGroup: true, resourceId: "G" }),
114
+ ]);
115
+ });
116
+ });
117
+
118
+ describe("collectMesSchedulableErpResourceIds", () => {
119
+ it("includes laborResourceId only when set", () => {
120
+ expect(
121
+ collectMesSchedulableErpResourceIds([
122
+ { laborResourceId: "LAB-1" },
123
+ { laborResourceId: null },
124
+ ])
125
+ ).toEqual(["LAB-1"]);
126
+ });
127
+
128
+ it("includes scheduledAs entries", () => {
129
+ expect(
130
+ collectMesSchedulableErpResourceIds([
131
+ {
132
+ scheduledAs: [" S1 ", "S2", null, 99],
133
+ },
134
+ ])
135
+ ).toEqual(["S1", "S2", "99"]);
136
+ });
137
+
138
+ it("merges laborResourceId and scheduledAs across rows", () => {
139
+ expect(
140
+ collectMesSchedulableErpResourceIds([
141
+ { laborResourceId: "A", scheduledAs: ["B"] },
142
+ { scheduledAs: ["C"] },
143
+ { laborResourceId: "D" },
144
+ ])
145
+ ).toEqual(["A", "B", "C", "D"]);
146
+ });
147
+
148
+ it("dedupes case-insensitively and keeps first-seen casing", () => {
149
+ expect(
150
+ collectMesSchedulableErpResourceIds([
151
+ { laborResourceId: "Res1", scheduledAs: ["res1", "RES1"] },
152
+ { laborResourceId: "rEs1" },
153
+ ])
154
+ ).toEqual(["Res1"]);
155
+ });
156
+
157
+ it("ignores null, empty scheduledAs, and non-array scheduledAs", () => {
158
+ expect(
159
+ collectMesSchedulableErpResourceIds([
160
+ { laborResourceId: "", scheduledAs: null },
161
+ { scheduledAs: undefined as unknown as null },
162
+ { scheduledAs: "not-an-array" as unknown as string[] },
163
+ ])
164
+ ).toEqual([]);
165
+ });
166
+
167
+ it("skips blank scheduledAs elements", () => {
168
+ expect(
169
+ collectMesSchedulableErpResourceIds([
170
+ { scheduledAs: ["x", " ", ""] },
171
+ ])
172
+ ).toEqual(["x"]);
173
+ });
174
+ });