@epilot/erp-integration-client 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (()=>{"use strict";var e={330:function(e,t,n){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(466));t.default=o.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.0.3","info":{"title":"","version":""},"servers":[{"url":"https://erp-integration-api.sls.epilot.io"}],"paths":{"/v1/erp/tracking/acknowledgement":{"post":{"operationId":"acknowledgeTracking","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/erp/trigger":{"post":{"operationId":"triggerErp","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/events":{"post":{"operationId":"processErpUpdatesEvents","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v2/erp/updates/events":{"post":{"operationId":"processErpUpdatesEventsV2","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v3/erp/updates/events":{"post":{"operationId":"processErpUpdatesEventsV3","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v2/erp/updates/mapping_simulation":{"post":{"operationId":"simulateMappingV2","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/mapping_simulation":{"post":{"operationId":"simulateMapping","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations":{"get":{"operationId":"listIntegrations","responses":{}},"post":{"operationId":"createIntegration","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}":{"get":{"operationId":"getIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/events":{"post":{"operationId":"queryEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/events/replay":{"post":{"operationId":"replayEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/use-cases":{"get":{"operationId":"listUseCases","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"post":{"operationId":"createUseCase","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/use-cases/{useCaseId}":{"get":{"operationId":"getUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/use-cases/{useCaseId}/history":{"get":{"operationId":"listUseCaseHistory","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true},{"name":"cursor","in":"query","required":false}],"responses":{}}},"/v2/integrations":{"get":{"operationId":"listIntegrationsV2","responses":{}},"post":{"operationId":"createIntegrationV2","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v2/integrations/{integrationId}":{"get":{"operationId":"getIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/app-mapping":{"put":{"operationId":"setIntegrationAppMapping","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegrationAppMapping","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/inbound-events":{"post":{"operationId":"queryInboundMonitoringEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/stats":{"post":{"operationId":"getMonitoringStats","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/outbound-status":{"get":{"operationId":"getOutboundStatus","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/monitoring/access-logs":{"post":{"operationId":"queryAccessLogs","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/outbound-events":{"post":{"operationId":"queryOutboundMonitoringEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}}},"components":{"responses":{"BadRequest":{"content":{"application/json":{}}},"NotFound":{"content":{"application/json":{}}},"Unauthorized":{"content":{"application/json":{}}},"InternalServerError":{"content":{"application/json":{}}},"QueryInboundMonitoringEventsResponse":{"content":{"application/json":{}}},"GetMonitoringStatsResponse":{"content":{"application/json":{}}},"QueryAccessLogsResponse":{"content":{"application/json":{}}},"QueryOutboundMonitoringEventsResponse":{"content":{"application/json":{}}},"ReplayEventsResponse":{"content":{"application/json":{}}},"ERPUpdatesResponse":{"content":{"application/json":{}}},"TriggerWebhookResponse":{"content":{"application/json":{}}},"QueryEventsResponse":{"content":{"application/json":{}}}}}}')}},t={},n=function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}(330),r=exports;for(var o in n)r[o]=n[o];n.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})();
1
+ (()=>{"use strict";var e={330:function(e,t,n){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(466));t.default=o.default},466:e=>{e.exports=JSON.parse('{"openapi":"3.0.3","info":{"title":"","version":""},"servers":[{"url":"https://erp-integration-api.sls.epilot.io"}],"paths":{"/v1/erp/tracking/acknowledgement":{"post":{"operationId":"acknowledgeTracking","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v1/erp/trigger":{"post":{"operationId":"triggerErp","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/events":{"post":{"deprecated":true,"operationId":"processErpUpdatesEvents","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v2/erp/updates/events":{"post":{"deprecated":true,"operationId":"processErpUpdatesEventsV2","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v3/erp/updates/events":{"post":{"operationId":"processErpUpdatesEventsV3","requestBody":{"content":{"application/json":{}}},"responses":{}}},"/v2/erp/updates/mapping_simulation":{"post":{"operationId":"simulateMappingV2","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/erp/updates/mapping_simulation":{"post":{"operationId":"simulateMapping","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations":{"get":{"operationId":"listIntegrations","responses":{}},"post":{"operationId":"createIntegration","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}":{"get":{"operationId":"getIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegration","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/events":{"post":{"operationId":"queryEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/events/replay":{"post":{"operationId":"replayEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/use-cases":{"get":{"operationId":"listUseCases","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"post":{"operationId":"createUseCase","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/use-cases/{useCaseId}":{"get":{"operationId":"getUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteUseCase","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/use-cases/{useCaseId}/history":{"get":{"operationId":"listUseCaseHistory","parameters":[{"name":"integrationId","in":"path","required":true},{"name":"useCaseId","in":"path","required":true},{"name":"cursor","in":"query","required":false}],"responses":{}}},"/v2/integrations":{"get":{"operationId":"listIntegrationsV2","responses":{}},"post":{"operationId":"createIntegrationV2","requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v2/integrations/{integrationId}":{"get":{"operationId":"getIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}},"put":{"operationId":"updateIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegrationV2","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/app-mapping":{"put":{"operationId":"setIntegrationAppMapping","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}},"delete":{"operationId":"deleteIntegrationAppMapping","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/inbound-events":{"post":{"operationId":"queryInboundMonitoringEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/stats":{"post":{"operationId":"getMonitoringStats","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/outbound-status":{"get":{"operationId":"getOutboundStatus","parameters":[{"name":"integrationId","in":"path","required":true}],"responses":{}}},"/v1/integrations/{integrationId}/monitoring/access-logs":{"post":{"operationId":"queryAccessLogs","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}},"/v1/integrations/{integrationId}/monitoring/outbound-events":{"post":{"operationId":"queryOutboundMonitoringEvents","parameters":[{"name":"integrationId","in":"path","required":true}],"requestBody":{"required":true,"content":{"application/json":{}}},"responses":{}}}},"components":{"responses":{"BadRequest":{"content":{"application/json":{}}},"NotFound":{"content":{"application/json":{}}},"Unauthorized":{"content":{"application/json":{}}},"InternalServerError":{"content":{"application/json":{}}},"QueryInboundMonitoringEventsResponse":{"content":{"application/json":{}}},"GetMonitoringStatsResponse":{"content":{"application/json":{}}},"QueryAccessLogsResponse":{"content":{"application/json":{}}},"QueryOutboundMonitoringEventsResponse":{"content":{"application/json":{}}},"ReplayEventsResponse":{"content":{"application/json":{}}},"ERPUpdatesResponse":{"content":{"application/json":{}}},"TriggerWebhookResponse":{"content":{"application/json":{}}},"QueryEventsResponse":{"content":{"application/json":{}}}}}}')}},t={},n=function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}(330),r=exports;for(var o in n)r[o]=n[o];n.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})();
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "/v1/erp/updates/events": {
37
37
  "post": {
38
+ "deprecated": true,
38
39
  "operationId": "processErpUpdatesEvents",
39
40
  "requestBody": {
40
41
  "content": {
@@ -46,6 +47,7 @@
46
47
  },
47
48
  "/v2/erp/updates/events": {
48
49
  "post": {
50
+ "deprecated": true,
49
51
  "operationId": "processErpUpdatesEventsV2",
50
52
  "requestBody": {
51
53
  "content": {
package/dist/openapi.d.ts CHANGED
@@ -18,9 +18,9 @@ declare namespace Components {
18
18
  */
19
19
  event_id: string;
20
20
  /**
21
- * Processing status for the event (skipped indicates duplicate deduplication_id)
21
+ * Processing status for the event (skipped indicates duplicate deduplication_id, ignored indicates unconfigured event)
22
22
  */
23
- status: "success" | "error" | "skipped";
23
+ status: "success" | "error" | "skipped" | "ignored";
24
24
  message?: string;
25
25
  }[];
26
26
  }
@@ -516,10 +516,6 @@ declare namespace Components {
516
516
  * Type of event (optional for V3 events)
517
517
  */
518
518
  event_type?: "CREATE" | "UPDATE" | "DELETE" | "TRIGGER";
519
- /**
520
- * Event name (alias for object_type, used in V3+)
521
- */
522
- event_name?: string;
523
519
  /**
524
520
  * Type of object being synced (e.g., 'contract', 'meter')
525
521
  */
@@ -527,11 +523,11 @@ declare namespace Components {
527
523
  /**
528
524
  * Type of sync operation
529
525
  */
530
- sync_type: "entity" | "meter_reading";
526
+ sync_type: "entity" | "meter_reading" | "webhook" | "api_deprecation";
531
527
  /**
532
528
  * Processing status
533
529
  */
534
- status: "success" | "error" | "skipped";
530
+ status: "success" | "error" | "skipped" | "warning";
535
531
  /**
536
532
  * Error code (when status=error)
537
533
  */
@@ -966,6 +962,10 @@ declare namespace Components {
966
962
  * Number of skipped events
967
963
  */
968
964
  skipped_count: number;
965
+ /**
966
+ * Number of warning events
967
+ */
968
+ warning_count?: number;
969
969
  /**
970
970
  * Success rate as percentage (0-100)
971
971
  */
@@ -1419,11 +1419,11 @@ declare namespace Components {
1419
1419
  /**
1420
1420
  * Filter by sync type
1421
1421
  */
1422
- sync_type?: "entity" | "meter_reading";
1422
+ sync_type?: "entity" | "meter_reading" | "webhook" | "api_deprecation";
1423
1423
  /**
1424
1424
  * Filter by processing status
1425
1425
  */
1426
- status?: "success" | "error" | "skipped";
1426
+ status?: "success" | "error" | "skipped" | "warning";
1427
1427
  /**
1428
1428
  * Filter by error category (only applicable when status=error)
1429
1429
  */
@@ -2315,7 +2315,6 @@ declare namespace Paths {
2315
2315
  export type $200 = Components.Responses.ERPUpdatesResponse;
2316
2316
  export type $400 = Components.Responses.BadRequest;
2317
2317
  export type $401 = Components.Responses.Unauthorized;
2318
- export type $422 = Components.Responses.ERPUpdatesResponse;
2319
2318
  export type $500 = Components.Responses.InternalServerError;
2320
2319
  }
2321
2320
  }
@@ -2325,7 +2324,6 @@ declare namespace Paths {
2325
2324
  export type $200 = Components.Responses.ERPUpdatesResponse;
2326
2325
  export type $400 = Components.Responses.BadRequest;
2327
2326
  export type $401 = Components.Responses.Unauthorized;
2328
- export type $422 = Components.Responses.ERPUpdatesResponse;
2329
2327
  export type $500 = Components.Responses.InternalServerError;
2330
2328
  }
2331
2329
  }
@@ -2335,7 +2333,6 @@ declare namespace Paths {
2335
2333
  export type $200 = Components.Responses.ERPUpdatesResponse;
2336
2334
  export type $400 = Components.Responses.BadRequest;
2337
2335
  export type $401 = Components.Responses.Unauthorized;
2338
- export type $422 = Components.Responses.ERPUpdatesResponse;
2339
2336
  export type $500 = Components.Responses.InternalServerError;
2340
2337
  }
2341
2338
  }
package/dist/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.0.3",
3
3
  "info": {
4
4
  "title": "ERP Integration API",
5
- "version": "0.31.0",
5
+ "version": "0.33.0",
6
6
  "description": "API for integrating with ERP systems, handling tracking acknowledgments, triggering ERP processes, and processing ERP updates."
7
7
  },
8
8
  "tags": [
@@ -128,6 +128,7 @@
128
128
  },
129
129
  "/v1/erp/updates/events": {
130
130
  "post": {
131
+ "deprecated": true,
131
132
  "operationId": "processErpUpdatesEvents",
132
133
  "summary": "processErpUpdatesEvents",
133
134
  "description": "Handles updates from ERP systems and tracks them appropriately",
@@ -214,9 +215,6 @@
214
215
  "401": {
215
216
  "$ref": "#/components/responses/Unauthorized"
216
217
  },
217
- "422": {
218
- "$ref": "#/components/responses/ERPUpdatesResponse"
219
- },
220
218
  "500": {
221
219
  "$ref": "#/components/responses/InternalServerError"
222
220
  }
@@ -225,6 +223,7 @@
225
223
  },
226
224
  "/v2/erp/updates/events": {
227
225
  "post": {
226
+ "deprecated": true,
228
227
  "operationId": "processErpUpdatesEventsV2",
229
228
  "summary": "processErpUpdatesEventsV2",
230
229
  "description": "Handles updates from ERP systems using integration_id directly.\nThis is the v2 version that simplifies the API by accepting integration_id\ninstead of app_id and component_id.\n",
@@ -272,9 +271,6 @@
272
271
  "401": {
273
272
  "$ref": "#/components/responses/Unauthorized"
274
273
  },
275
- "422": {
276
- "$ref": "#/components/responses/ERPUpdatesResponse"
277
- },
278
274
  "500": {
279
275
  "$ref": "#/components/responses/InternalServerError"
280
276
  }
@@ -328,9 +324,6 @@
328
324
  "401": {
329
325
  "$ref": "#/components/responses/Unauthorized"
330
326
  },
331
- "422": {
332
- "$ref": "#/components/responses/ERPUpdatesResponse"
333
- },
334
327
  "500": {
335
328
  "$ref": "#/components/responses/InternalServerError"
336
329
  }
@@ -4223,7 +4216,9 @@
4223
4216
  "type": "string",
4224
4217
  "enum": [
4225
4218
  "entity",
4226
- "meter_reading"
4219
+ "meter_reading",
4220
+ "webhook",
4221
+ "api_deprecation"
4227
4222
  ],
4228
4223
  "description": "Filter by sync type"
4229
4224
  },
@@ -4232,7 +4227,8 @@
4232
4227
  "enum": [
4233
4228
  "success",
4234
4229
  "error",
4235
- "skipped"
4230
+ "skipped",
4231
+ "warning"
4236
4232
  ],
4237
4233
  "description": "Filter by processing status"
4238
4234
  },
@@ -4655,6 +4651,10 @@
4655
4651
  "type": "integer",
4656
4652
  "description": "Number of skipped events"
4657
4653
  },
4654
+ "warning_count": {
4655
+ "type": "integer",
4656
+ "description": "Number of warning events"
4657
+ },
4658
4658
  "success_rate": {
4659
4659
  "type": "number",
4660
4660
  "format": "float",
@@ -4769,10 +4769,6 @@
4769
4769
  ],
4770
4770
  "description": "Type of event (optional for V3 events)"
4771
4771
  },
4772
- "event_name": {
4773
- "type": "string",
4774
- "description": "Event name (alias for object_type, used in V3+)"
4775
- },
4776
4772
  "object_type": {
4777
4773
  "type": "string",
4778
4774
  "description": "Type of object being synced (e.g., 'contract', 'meter')"
@@ -4781,7 +4777,9 @@
4781
4777
  "type": "string",
4782
4778
  "enum": [
4783
4779
  "entity",
4784
- "meter_reading"
4780
+ "meter_reading",
4781
+ "webhook",
4782
+ "api_deprecation"
4785
4783
  ],
4786
4784
  "description": "Type of sync operation"
4787
4785
  },
@@ -4790,7 +4788,8 @@
4790
4788
  "enum": [
4791
4789
  "success",
4792
4790
  "error",
4793
- "skipped"
4791
+ "skipped",
4792
+ "warning"
4794
4793
  ],
4795
4794
  "description": "Processing status"
4796
4795
  },
@@ -5044,9 +5043,10 @@
5044
5043
  "enum": [
5045
5044
  "success",
5046
5045
  "error",
5047
- "skipped"
5046
+ "skipped",
5047
+ "ignored"
5048
5048
  ],
5049
- "description": "Processing status for the event (skipped indicates duplicate deduplication_id)"
5049
+ "description": "Processing status for the event (skipped indicates duplicate deduplication_id, ignored indicates unconfigured event)"
5050
5050
  },
5051
5051
  "message": {
5052
5052
  "type": "string"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/erp-integration-client",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "Client library for ePilot ERP Integration API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",