node-autotask 0.11.0 → 0.12.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.
Files changed (41) hide show
  1. package/MCP_TOOL_CATALOG.json +26 -8
  2. package/MCP_TOOL_MANIFEST.md +12 -11
  3. package/N8N_MCP_MANIFEST.json +3 -3
  4. package/N8N_MCP_MANIFEST.md +4 -4
  5. package/README.md +1 -1
  6. package/capabilities.json +1352 -1233
  7. package/dist/capabilities.cjs +2 -2
  8. package/dist/capabilities.js +1 -1
  9. package/dist/{chunk-SXHPUQMB.js → chunk-3WIDDEHP.js} +2 -2
  10. package/dist/{chunk-7L23FDQW.js → chunk-4A6XLQHE.js} +1351 -1232
  11. package/dist/{chunk-YKEX4SK7.cjs → chunk-5N6DYKXO.cjs} +519 -39
  12. package/dist/{chunk-LNRN45XS.js → chunk-GD4JRPYF.js} +498 -18
  13. package/dist/{chunk-T5FLSJOD.cjs → chunk-JKZVCFRY.cjs} +1351 -1232
  14. package/dist/{chunk-CJONZQ7E.js → chunk-MY7ZSXY3.js} +1075 -6
  15. package/dist/{chunk-25ZUKHS4.cjs → chunk-SRJI5XUZ.cjs} +135 -135
  16. package/dist/{chunk-QAX222R6.cjs → chunk-TELBX6HK.cjs} +1462 -393
  17. package/dist/{index-B_xToSpq.d.ts → index-D8I6taEo.d.cts} +200 -2
  18. package/dist/{index-Dv_GSZaN.d.cts → index-uAxAcRol.d.ts} +200 -2
  19. package/dist/index.cjs +19 -19
  20. package/dist/index.d.cts +4 -4
  21. package/dist/index.d.ts +4 -4
  22. package/dist/index.js +4 -4
  23. package/dist/operations/index.cjs +123 -588
  24. package/dist/operations/index.d.cts +4 -4
  25. package/dist/operations/index.d.ts +4 -4
  26. package/dist/operations/index.js +10 -475
  27. package/dist/pool.cjs +8 -8
  28. package/dist/pool.d.cts +2 -2
  29. package/dist/pool.d.ts +2 -2
  30. package/dist/pool.js +4 -4
  31. package/dist/resources/index.cjs +4 -4
  32. package/dist/resources/index.d.cts +2 -2
  33. package/dist/resources/index.d.ts +2 -2
  34. package/dist/resources/index.js +3 -3
  35. package/dist/types/index.d.cts +1 -1
  36. package/dist/types/index.d.ts +1 -1
  37. package/docs/API.md +192 -2
  38. package/docs/N8N-ADAPTER.md +1 -1
  39. package/package.json +1 -1
  40. package/dist/{index-cQ6CRexR.d.cts → index-BXtKN1M5.d.cts} +201 -201
  41. package/dist/{index-cQ6CRexR.d.ts → index-BXtKN1M5.d.ts} +201 -201
@@ -30,13 +30,16 @@
30
30
 
31
31
 
32
32
 
33
- var _chunkYKEX4SK7cjs = require('./chunk-YKEX4SK7.cjs');
34
33
 
35
34
 
36
- var _chunkT5FLSJODcjs = require('./chunk-T5FLSJOD.cjs');
35
+
36
+ var _chunk5N6DYKXOcjs = require('./chunk-5N6DYKXO.cjs');
37
+
38
+
39
+ var _chunkJKZVCFRYcjs = require('./chunk-JKZVCFRY.cjs');
37
40
 
38
41
  // src/resources/appointments.ts
39
- var AppointmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
42
+ var AppointmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
40
43
  constructor(http, pageSize) {
41
44
  super(http, {
42
45
  key: "appointments",
@@ -121,7 +124,7 @@ var AuthenticateResource = class {
121
124
  };
122
125
 
123
126
  // src/resources/billing_codes.ts
124
- var BillingCodesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
127
+ var BillingCodesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
125
128
  constructor(http, pageSize) {
126
129
  super(http, {
127
130
  key: "billing_codes",
@@ -171,7 +174,7 @@ var MAX_LIMIT = 500;
171
174
  function clampWindowLimit(limit) {
172
175
  const n = limit === void 0 ? DEFAULT_LIMIT : Math.trunc(limit);
173
176
  if (!Number.isInteger(n) || n < 1) {
174
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
177
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
175
178
  }
176
179
  return Math.min(n, MAX_LIMIT);
177
180
  }
@@ -217,7 +220,7 @@ function wallParts(tz, ms) {
217
220
  }
218
221
  }
219
222
  if (weekday < 0 || [w.y, w.m, w.d, w.h, w.mi, w.s].some((v) => v === void 0 || Number.isNaN(v))) {
220
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`dateWindow: could not read the wall-clock parts for timezone "${tz}" (the Intl format returned an incomplete or unmapped part)`);
223
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`dateWindow: could not read the wall-clock parts for timezone "${tz}" (the Intl format returned an incomplete or unmapped part)`);
221
224
  }
222
225
  return { y: w.y, m: w.m, d: w.d, h: w.h, mi: w.mi, s: w.s, weekday };
223
226
  }
@@ -244,7 +247,7 @@ function localDayEndMs(y, m, d, tz) {
244
247
  }
245
248
  function validateZone(tz, opName = "dateWindow") {
246
249
  if (typeof tz !== "string" || tz.length === 0) {
247
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
250
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
248
251
  `${opName}: tz must be a non-empty IANA timezone string (got ${JSON.stringify(tz)}; e.g. 'Australia/Sydney' \u2014 omitted tz = UTC)`,
249
252
  { operation: opName }
250
253
  );
@@ -252,7 +255,7 @@ function validateZone(tz, opName = "dateWindow") {
252
255
  try {
253
256
  new Intl.DateTimeFormat("en-US", { timeZone: tz });
254
257
  } catch (e2) {
255
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
258
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
256
259
  `${opName}: tz is not a valid IANA timezone (${JSON.stringify(tz)}; e.g. 'Australia/Sydney' \u2014 omitted tz = UTC)`,
257
260
  { operation: opName }
258
261
  );
@@ -404,13 +407,13 @@ async function dateWindowQuery(http, path, field, kind, limit, operation, now, t
404
407
  body: { MaxRecords: limit, filter },
405
408
  operation
406
409
  });
407
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
410
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
408
411
  }
409
412
  var isoUtc = (ms) => new Date(ms).toISOString().slice(0, 19) + "Z";
410
413
  function customRangeDay(value, label, zone, opName) {
411
414
  const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
412
415
  if (!m) {
413
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
416
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
414
417
  zone === void 0 ? `${opName}: ${label} must be a UTC 'YYYY-MM-DD' date (got ${JSON.stringify(value)})` : `${opName}: ${label} must be a 'YYYY-MM-DD' local calendar day in ${zone} (got ${JSON.stringify(value)})`,
415
418
  { operation: opName }
416
419
  );
@@ -422,7 +425,7 @@ function customRangeDay(value, label, zone, opName) {
422
425
  const real = probe.getUTCFullYear() === y && probe.getUTCMonth() === mo - 1 && probe.getUTCDate() === d;
423
426
  const ms = !real ? NaN : zone === void 0 ? Date.UTC(y, mo - 1, d) : localDayStartMs(y, mo, d, zone);
424
427
  if (!Number.isFinite(ms)) {
425
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
428
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
426
429
  zone === void 0 ? `${opName}: ${label} is not a valid UTC date (${JSON.stringify(value)})` : `${opName}: ${label} is not a valid calendar day in ${zone} (${JSON.stringify(value)})`,
427
430
  { operation: opName }
428
431
  );
@@ -433,7 +436,7 @@ async function customRangeQuery(http, path, field, from, to, limit, operation, z
433
436
  const fromB = customRangeDay(from, "from", zone, operation);
434
437
  const toB = customRangeDay(to, "to", zone, operation);
435
438
  if (fromB.ms > toB.ms) {
436
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
439
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
437
440
  `${operation}: from (${isoUtc(fromB.ms)}) must not be after to (${isoUtc(toB.ms)})`,
438
441
  { operation }
439
442
  );
@@ -450,7 +453,7 @@ async function customRangeQuery(http, path, field, from, to, limit, operation, z
450
453
  body: { MaxRecords: limit, filter },
451
454
  operation
452
455
  });
453
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
456
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
454
457
  }
455
458
 
456
459
  // src/resources/special/billing_items.ts
@@ -483,7 +486,7 @@ async function customRange(_resource, from, to, http, opts) {
483
486
  }
484
487
 
485
488
  // src/resources/billing_items.ts
486
- var BillingItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
489
+ var BillingItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
487
490
  constructor(http, pageSize) {
488
491
  super(http, {
489
492
  key: "billing_items",
@@ -585,7 +588,7 @@ var BillingItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
585
588
  };
586
589
 
587
590
  // src/resources/change_request_links.ts
588
- var ChangeRequestLinksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
591
+ var ChangeRequestLinksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
589
592
  constructor(http, pageSize) {
590
593
  super(http, {
591
594
  key: "change_request_links",
@@ -639,7 +642,7 @@ var ChangeRequestLinksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
639
642
  };
640
643
 
641
644
  // src/resources/checklist_libraries.ts
642
- var ChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
645
+ var ChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
643
646
  constructor(http, pageSize) {
644
647
  super(http, {
645
648
  key: "checklist_libraries",
@@ -713,7 +716,7 @@ var ChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
713
716
  };
714
717
 
715
718
  // src/resources/checklist_library_checklist_items.ts
716
- var ChecklistLibraryChecklistItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
719
+ var ChecklistLibraryChecklistItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
717
720
  constructor(http, pageSize) {
718
721
  super(http, {
719
722
  key: "checklist_library_checklist_items",
@@ -779,7 +782,7 @@ var ChecklistLibraryChecklistItemsResource = class extends _chunkYKEX4SK7cjs.Bas
779
782
  };
780
783
 
781
784
  // src/resources/classification_icons.ts
782
- var ClassificationIconsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
785
+ var ClassificationIconsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
783
786
  constructor(http, pageSize) {
784
787
  super(http, {
785
788
  key: "classification_icons",
@@ -827,7 +830,7 @@ var DEFAULT_LIMIT2 = 25;
827
830
  var MAX_LIMIT2 = 500;
828
831
  function clampLimit(limit) {
829
832
  const n = limit === void 0 ? DEFAULT_LIMIT2 : Math.trunc(limit);
830
- if (!Number.isInteger(n) || n < 1) throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
833
+ if (!Number.isInteger(n) || n < 1) throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
831
834
  return Math.min(n, MAX_LIMIT2);
832
835
  }
833
836
  async function queryCompanies(http, filter, limit) {
@@ -838,7 +841,7 @@ async function queryCompanies(http, filter, limit) {
838
841
  body: { MaxRecords: limit, filter },
839
842
  operation: "companies.searchByDomain"
840
843
  });
841
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
844
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
842
845
  }
843
846
  async function queryContacts(http, filter, limit) {
844
847
  const res = await http.request({
@@ -848,7 +851,7 @@ async function queryContacts(http, filter, limit) {
848
851
  body: { MaxRecords: limit, filter },
849
852
  operation: "companies.searchByDomain"
850
853
  });
851
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
854
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
852
855
  }
853
856
  async function fetchCompanies(http, ids, limit) {
854
857
  const out = [];
@@ -863,7 +866,7 @@ async function fetchCompanies(http, ids, limit) {
863
866
  const item = body && "item" in body ? body.item : null;
864
867
  if (item) out.push(item);
865
868
  } catch (err) {
866
- if (err instanceof _chunkYKEX4SK7cjs.NotFoundError) continue;
869
+ if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) continue;
867
870
  throw err;
868
871
  }
869
872
  }
@@ -871,7 +874,7 @@ async function fetchCompanies(http, ids, limit) {
871
874
  }
872
875
  async function searchByDomain(_resource, domain, opts = {}, http) {
873
876
  const text = domain.trim();
874
- if (text === "") throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("searchByDomain: empty domain");
877
+ if (text === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("searchByDomain: empty domain");
875
878
  const limit = clampLimit(opts.limit);
876
879
  const filter = [{ field: "webAddress", op: "contains", value: text }];
877
880
  const direct = await queryCompanies(http, filter, limit);
@@ -885,7 +888,7 @@ async function searchByIdentity(_resource, identity, opts = {}, http) {
885
888
  const email = _nullishCoalesce(_optionalChain([identity, 'access', _9 => _9.email, 'optionalAccess', _10 => _10.trim, 'call', _11 => _11()]), () => ( ""));
886
889
  const website = _nullishCoalesce(_optionalChain([identity, 'access', _12 => _12.website, 'optionalAccess', _13 => _13.trim, 'call', _14 => _14()]), () => ( ""));
887
890
  if (name === "" && email === "" && website === "") {
888
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("searchByIdentity: at least one of companyName / email / website is required");
891
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("searchByIdentity: at least one of companyName / email / website is required");
889
892
  }
890
893
  const limit = clampLimit(opts.limit);
891
894
  const found = /* @__PURE__ */ new Map();
@@ -912,23 +915,23 @@ async function familyChildPage(http, parentID) {
912
915
  path: "/V1.0/Companies/query",
913
916
  body: {
914
917
  MaxRecords: COMPANIES_FAMILY_CHILD_CAP,
915
- filter: _chunkYKEX4SK7cjs.buildFilter.call(void 0, [{ field: "parentCompanyID", op: "eq", value: parentID }]).filter
918
+ filter: _chunk5N6DYKXOcjs.buildFilter.call(void 0, [{ field: "parentCompanyID", op: "eq", value: parentID }]).filter
916
919
  },
917
920
  operation: "companies.search"
918
921
  });
919
- const { items, pageDetails } = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, "companies.search");
922
+ const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.search");
920
923
  return { rows: items, hasNext: pageDetails.nextPageUrl !== null };
921
924
  }
922
925
  function assertSearchWithDetailOpts(opts) {
923
926
  if (opts === void 0) return;
924
927
  if (typeof opts !== "object" || opts === null || Array.isArray(opts)) {
925
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("companies.searchWithDetail: opts must be an object { limit?: number }", {
928
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("companies.searchWithDetail: opts must be an object { limit?: number }", {
926
929
  operation: "companies.searchWithDetail"
927
930
  });
928
931
  }
929
932
  for (const key of Object.keys(opts)) {
930
933
  if (key !== "limit") {
931
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
934
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
932
935
  `companies.searchWithDetail: unknown opts key "${key}" \u2014 the bag is closed: limit (includeFamily is a companies.search option)`,
933
936
  { operation: "companies.searchWithDetail" }
934
937
  );
@@ -937,32 +940,32 @@ function assertSearchWithDetailOpts(opts) {
937
940
  }
938
941
  async function searchWithFamily(_resource, query, opts = {}, http) {
939
942
  if (opts !== void 0 && (typeof opts !== "object" || opts === null || Array.isArray(opts))) {
940
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("companies.search: opts must be an object { limit?: number, includeFamily?: boolean }");
943
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("companies.search: opts must be an object { limit?: number, includeFamily?: boolean }");
941
944
  }
942
945
  for (const key of Object.keys(_nullishCoalesce(opts, () => ( {})))) {
943
946
  if (!COMPANY_SEARCH_OPT_KEYS.includes(key)) {
944
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
947
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
945
948
  `companies.search: unknown opts key "${key}" \u2014 the bag is closed: ${COMPANY_SEARCH_OPT_KEYS.join(", ")}`,
946
949
  { operation: "companies.search" }
947
950
  );
948
951
  }
949
952
  }
950
953
  if (opts.includeFamily !== void 0 && typeof opts.includeFamily !== "boolean") {
951
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`companies.search: opts.includeFamily must be a boolean (got ${String(opts.includeFamily)})`, {
954
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`companies.search: opts.includeFamily must be a boolean (got ${String(opts.includeFamily)})`, {
952
955
  operation: "companies.search"
953
956
  });
954
957
  }
955
958
  const text = query.trim();
956
- if (text === "") throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("search: empty query", { operation: "companies.search" });
957
- const limit = opts.limit === void 0 ? 25 : _chunkYKEX4SK7cjs.clampPageSize.call(void 0, opts.limit);
959
+ if (text === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("search: empty query", { operation: "companies.search" });
960
+ const limit = opts.limit === void 0 ? 25 : _chunk5N6DYKXOcjs.clampPageSize.call(void 0, opts.limit);
958
961
  const res = await http.request({
959
962
  method: "POST",
960
963
  idempotent: true,
961
964
  path: "/V1.0/Companies/query",
962
- body: { MaxRecords: limit, filter: _chunkYKEX4SK7cjs.buildFilter.call(void 0, [{ field: "companyName", op: "contains", value: text }]).filter },
965
+ body: { MaxRecords: limit, filter: _chunk5N6DYKXOcjs.buildFilter.call(void 0, [{ field: "companyName", op: "contains", value: text }]).filter },
963
966
  operation: "companies.search"
964
967
  });
965
- const hits = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, "companies.search").items;
968
+ const hits = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.search").items;
966
969
  if (opts.includeFamily !== true) return hits;
967
970
  const rows = [];
968
971
  for (const hit of hits) {
@@ -986,7 +989,7 @@ var DEFAULT_COMPANY_TYPE = 1;
986
989
  var DEDUP_NAME_LIMIT = 10;
987
990
  var BLIND_SURFACE_CAVEAT = "dedup only covers companies this API user can enumerate (the unowned surface is blind); a same-name company outside that scope is not detected";
988
991
  var SAFE_COMPANY_CREATE_DEFAULTS = {};
989
- var OwnerResourceRequiredError = class extends _chunkYKEX4SK7cjs.AutotaskError {
992
+ var OwnerResourceRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
990
993
  constructor(message, options = {}) {
991
994
  super(message, {
992
995
  code: "OWNER_RESOURCE_REQUIRED",
@@ -997,13 +1000,13 @@ var OwnerResourceRequiredError = class extends _chunkYKEX4SK7cjs.AutotaskError {
997
1000
  this.name = "OwnerResourceRequiredError";
998
1001
  }
999
1002
  };
1000
- var CompanyResourceInvalidError = class extends _chunkYKEX4SK7cjs.AutotaskError {
1003
+ var CompanyResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1001
1004
  constructor(message, options = {}) {
1002
1005
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
1003
1006
  this.name = "CompanyResourceInvalidError";
1004
1007
  }
1005
1008
  };
1006
- var CompanyCreateFailedError = class extends _chunkYKEX4SK7cjs.AutotaskError {
1009
+ var CompanyCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1007
1010
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
1008
1011
 
1009
1012
  constructor(message, vendorFields, options = {}) {
@@ -1014,18 +1017,18 @@ var CompanyCreateFailedError = class extends _chunkYKEX4SK7cjs.AutotaskError {
1014
1017
  };
1015
1018
  async function upsertByName(resource, companyName, params, opts, http) {
1016
1019
  if (typeof companyName !== "string" || companyName.trim() === "") {
1017
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("upsertByName: companyName is required (a non-empty string)", { operation: OP_UPSERT_NAME });
1020
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("upsertByName: companyName is required (a non-empty string)", { operation: OP_UPSERT_NAME });
1018
1021
  }
1019
1022
  if (typeof _optionalChain([params, 'optionalAccess', _15 => _15.phone]) !== "string" || params.phone.trim() === "") {
1020
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("upsertByName: params.phone is required (a non-empty string \u2014 the ww29 live-required set is { companyName, companyType, phone, ownerResourceID })", { operation: OP_UPSERT_NAME });
1023
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("upsertByName: params.phone is required (a non-empty string \u2014 the ww29 live-required set is { companyName, companyType, phone, ownerResourceID })", { operation: OP_UPSERT_NAME });
1021
1024
  }
1022
1025
  const companyType = _nullishCoalesce(params.companyType, () => ( DEFAULT_COMPANY_TYPE));
1023
1026
  if (typeof companyType !== "number" || !Number.isSafeInteger(companyType) || companyType < 1) {
1024
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`upsertByName: params.companyType must be a positive integer picklist value (got ${String(params.companyType)}; default 1 \u2014 the ww29-proven value)`, { operation: OP_UPSERT_NAME });
1027
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`upsertByName: params.companyType must be a positive integer picklist value (got ${String(params.companyType)}; default 1 \u2014 the ww29-proven value)`, { operation: OP_UPSERT_NAME });
1025
1028
  }
1026
1029
  const owner = params.ownerResourceID;
1027
1030
  if (owner !== void 0 && (typeof owner !== "number" || !Number.isSafeInteger(owner) || owner < 1)) {
1028
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`upsertByName: params.ownerResourceID must be a positive integer (got ${String(owner)})`, { operation: OP_UPSERT_NAME });
1031
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`upsertByName: params.ownerResourceID must be a positive integer (got ${String(owner)})`, { operation: OP_UPSERT_NAME });
1029
1032
  }
1030
1033
  const q = await resource.queryBounded({ filter: [{ field: "companyName", op: "eq", value: companyName }], limit: DEDUP_NAME_LIMIT });
1031
1034
  const caveat = {
@@ -1036,7 +1039,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1036
1039
  const match = q.items[0];
1037
1040
  if (match !== void 0) {
1038
1041
  if (opts.dryRun === true) {
1039
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
1042
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
1040
1043
  {
1041
1044
  operation: OP_UPSERT_NAME,
1042
1045
  method: "POST",
@@ -1071,7 +1074,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1071
1074
  "ownerResourceID is REQUIRED on the apply path (the vendor requires it; the node cannot enumerate candidates \u2014 the resources table is blind to this API user (count/query return 0)): the apply throws the typed OWNER_RESOURCE_REQUIRED if it is still absent"
1072
1075
  );
1073
1076
  }
1074
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
1077
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
1075
1078
  {
1076
1079
  operation: OP_UPSERT_NAME,
1077
1080
  method: "POST",
@@ -1119,8 +1122,8 @@ async function upsertByName(resource, companyName, params, opts, http) {
1119
1122
  sideEffects: ['vendor auto-creates a "Primary Address" location under the new company (UI-only cleanup \u2014 the delete 405 gap, \xA711.5)']
1120
1123
  };
1121
1124
  } catch (err) {
1122
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
1123
- const named = (_nullishCoalesce(_chunkYKEX4SK7cjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
1125
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
1126
+ const named = (_nullishCoalesce(_chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
1124
1127
  const seen = /* @__PURE__ */ new Set();
1125
1128
  const unique = [...named].filter((f) => seen.has(f) ? false : (seen.add(f), true));
1126
1129
  const hasDefault = unique.some((f) => SAFE_COMPANY_CREATE_DEFAULTS[f] !== void 0);
@@ -1134,7 +1137,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1134
1137
  }
1135
1138
  continue;
1136
1139
  }
1137
- const detail = _chunkYKEX4SK7cjs.formatVendorDetail.call(void 0, err.vendorError);
1140
+ const detail = _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError);
1138
1141
  throw new CompanyCreateFailedError(
1139
1142
  `upsertByName: the vendor rejected the company create${unique.length > 0 ? ` naming field(s) ${unique.join(", ")}` : ""} (no proven-safe default \u2014 the ww29 required set is fully filled by the node)${detail ? ` \u2014 ${detail}` : ""}`,
1140
1143
  unique,
@@ -1153,7 +1156,7 @@ var PROFILE_PART_LIMIT = 50;
1153
1156
  function profilePartLimit(value, name) {
1154
1157
  const n = value === void 0 ? PROFILE_PART_LIMIT : Math.trunc(value);
1155
1158
  if (!Number.isInteger(n) || n < 1) {
1156
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`fullProfile: ${name} must be an integer >= 1 (got ${String(value)})`);
1159
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`fullProfile: ${name} must be an integer >= 1 (got ${String(value)})`);
1157
1160
  }
1158
1161
  return n;
1159
1162
  }
@@ -1165,14 +1168,14 @@ async function scopedCompanyQuery(http, path, companyID, limit) {
1165
1168
  body: { MaxRecords: limit, filter: [{ field: "companyID", op: "eq", value: companyID }] },
1166
1169
  operation: "companies.fullProfile"
1167
1170
  });
1168
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
1171
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
1169
1172
  }
1170
1173
  async function fullProfile(resource, id, opts = {}, http) {
1171
1174
  const contactLimit = profilePartLimit(opts.contactLimit, "contactLimit");
1172
1175
  const noteLimit = profilePartLimit(opts.noteLimit, "noteLimit");
1173
1176
  const ticketLimit = profilePartLimit(opts.ticketLimit, "ticketLimit");
1174
1177
  const projectLimit = profilePartLimit(opts.projectLimit, "projectLimit");
1175
- const companyID = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
1178
+ const companyID = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
1176
1179
  const company = await resource.get(companyID);
1177
1180
  const locations = await scopedCompanyQuery(http, "/V1.0/CompanyLocations/query", companyID, PROFILE_PART_LIMIT);
1178
1181
  const contacts = await scopedCompanyQuery(http, "/V1.0/Contacts/query", companyID, contactLimit);
@@ -1189,7 +1192,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1189
1192
  },
1190
1193
  operation: "companies.fullProfile"
1191
1194
  });
1192
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
1195
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
1193
1196
  })();
1194
1197
  let openTickets = {
1195
1198
  items: openRows,
@@ -1198,7 +1201,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1198
1201
  note: OPEN_TICKETS_NOTE
1199
1202
  };
1200
1203
  if (openRows.length === 0) {
1201
- const stamp = _chunkYKEX4SK7cjs.blindStampFor.call(void 0, _optionalChain([_chunkYKEX4SK7cjs.BLIND_SURFACE_STAMPS, 'access', _16 => _16["tickets"], 'optionalAccess', _17 => _17.query]), [
1204
+ const stamp = _chunk5N6DYKXOcjs.blindStampFor.call(void 0, _optionalChain([_chunk5N6DYKXOcjs.BLIND_SURFACE_STAMPS, 'access', _16 => _16["tickets"], 'optionalAccess', _17 => _17.query]), [
1202
1205
  { field: "companyID", op: "eq", value: companyID },
1203
1206
  { field: "status", op: "noteq", value: 5 }
1204
1207
  ]);
@@ -1229,7 +1232,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1229
1232
  }
1230
1233
  };
1231
1234
  if (opts.names === true) {
1232
- const builder = _chunkYKEX4SK7cjs.createNamePlan.call(void 0, _chunkYKEX4SK7cjs.TICKET_LABEL_FIELDS);
1235
+ const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS);
1233
1236
  const c = company;
1234
1237
  builder.addResource(c["ownerResourceID"]);
1235
1238
  builder.addResource(c["createdByResourceID"]);
@@ -1246,20 +1249,20 @@ async function fullProfile(resource, id, opts = {}, http) {
1246
1249
  builder.addResource(r["creatorResourceID"]);
1247
1250
  builder.addFk("contract", r["contractID"]);
1248
1251
  }
1249
- const names = await _chunkYKEX4SK7cjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
1252
+ const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
1250
1253
  const companyRow = { ...company };
1251
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, companyRow, "ownerResourceID", (v) => names.resourceName(v));
1252
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, companyRow, "createdByResourceID", (v) => names.resourceName(v));
1254
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, companyRow, "ownerResourceID", (v) => names.resourceName(v));
1255
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, companyRow, "createdByResourceID", (v) => names.resourceName(v));
1253
1256
  result.company = companyRow;
1254
1257
  result.openTickets = {
1255
1258
  ...openTickets,
1256
1259
  items: openTickets.items.map((row) => {
1257
1260
  const r = { ...row };
1258
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1259
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1260
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "billingCodeID", (v) => names.recordName("billingCode", v));
1261
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "assignedResourceRoleID", (v) => names.recordName("role", v));
1262
- for (const f of _chunkYKEX4SK7cjs.TICKET_LABEL_FIELDS) _chunkYKEX4SK7cjs.addLabelSibling.call(void 0, r, f, names);
1261
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1262
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1263
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "billingCodeID", (v) => names.recordName("billingCode", v));
1264
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "assignedResourceRoleID", (v) => names.recordName("role", v));
1265
+ for (const f of _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS) _chunk5N6DYKXOcjs.addLabelSibling.call(void 0, r, f, names);
1263
1266
  return r;
1264
1267
  })
1265
1268
  };
@@ -1267,9 +1270,9 @@ async function fullProfile(resource, id, opts = {}, http) {
1267
1270
  ...result.projects,
1268
1271
  items: result.projects.items.map((row) => {
1269
1272
  const r = { ...row };
1270
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "projectLeadResourceID", (v) => names.resourceName(v));
1271
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1272
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1273
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "projectLeadResourceID", (v) => names.resourceName(v));
1274
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1275
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1273
1276
  return r;
1274
1277
  })
1275
1278
  };
@@ -1301,7 +1304,7 @@ function isDateYMD(v) {
1301
1304
  }
1302
1305
  function validateUnbilledWorkOptions(companyId, opts) {
1303
1306
  if (opts !== void 0 && (typeof opts !== "object" || opts === null || Array.isArray(opts))) {
1304
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
1307
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
1305
1308
  `unbilledWork: opts must be the options object (got ${Array.isArray(opts) ? "an array" : typeof opts})`,
1306
1309
  { operation: "companies.unbilledWork" }
1307
1310
  );
@@ -1330,7 +1333,7 @@ function validateUnbilledWorkOptions(companyId, opts) {
1330
1333
  try {
1331
1334
  limit = clampLimit(opts.limit);
1332
1335
  } catch (err) {
1333
- problems.push(err instanceof _chunkYKEX4SK7cjs.AutotaskError ? err.message : `limit must be an integer >= 1 (got ${String(opts.limit)})`);
1336
+ problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : `limit must be an integer >= 1 (got ${String(opts.limit)})`);
1334
1337
  limit = 50;
1335
1338
  }
1336
1339
  if (source === "date_range") {
@@ -1345,9 +1348,9 @@ function validateUnbilledWorkOptions(companyId, opts) {
1345
1348
  problems.push('invoiceId is required (the vendor invoice id) when source is "invoice"');
1346
1349
  } else {
1347
1350
  try {
1348
- _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, opts.invoiceId, "opts.invoiceId");
1351
+ _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, opts.invoiceId, "opts.invoiceId");
1349
1352
  } catch (err) {
1350
- problems.push(err instanceof _chunkYKEX4SK7cjs.AutotaskError ? err.message : "invoiceId must be a vendor numeric id");
1353
+ problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "invoiceId must be a vendor numeric id");
1351
1354
  }
1352
1355
  }
1353
1356
  }
@@ -1357,20 +1360,20 @@ function validateUnbilledWorkOptions(companyId, opts) {
1357
1360
  } else {
1358
1361
  opts.ticketIds.forEach((tid, i) => {
1359
1362
  try {
1360
- _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, tid, `opts.ticketIds[${i}]`);
1363
+ _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, tid, `opts.ticketIds[${i}]`);
1361
1364
  } catch (err) {
1362
- problems.push(err instanceof _chunkYKEX4SK7cjs.AutotaskError ? err.message : `ticketIds[${i}] must be a vendor numeric id`);
1365
+ problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : `ticketIds[${i}] must be a vendor numeric id`);
1363
1366
  }
1364
1367
  });
1365
1368
  }
1366
1369
  }
1367
1370
  try {
1368
- _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, companyId, "companyId");
1371
+ _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyId, "companyId");
1369
1372
  } catch (err) {
1370
- problems.push(err instanceof _chunkYKEX4SK7cjs.AutotaskError ? err.message : "companyId must be a vendor numeric id");
1373
+ problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "companyId must be a vendor numeric id");
1371
1374
  }
1372
1375
  if (problems.length > 0) {
1373
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
1376
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
1374
1377
  `unbilledWork: ${problems.length} problem(s) found pre-request (zero wire was issued)
1375
1378
  - ` + problems.join("\n- "),
1376
1379
  { operation: "companies.unbilledWork" }
@@ -1399,7 +1402,7 @@ async function boundedPart(http, path, conditions, limit, includeFields) {
1399
1402
  body,
1400
1403
  operation: "companies.unbilledWork"
1401
1404
  });
1402
- const { items, pageDetails } = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, "companies.unbilledWork");
1405
+ const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.unbilledWork");
1403
1406
  const capped = items.length >= limit;
1404
1407
  return { items, capped, hasMore: capped && pageDetails.nextPageUrl != null };
1405
1408
  }
@@ -1410,7 +1413,7 @@ function capJoinSet(ids, cap) {
1410
1413
  }
1411
1414
  function unbilledWorkPartStatus(key, conditions, items) {
1412
1415
  if (items.length !== 0) return { status: "ok" };
1413
- const stamp = _chunkYKEX4SK7cjs.blindStampFor.call(void 0, _optionalChain([_chunkYKEX4SK7cjs.BLIND_SURFACE_STAMPS, 'access', _18 => _18[key], 'optionalAccess', _19 => _19.query]), conditions);
1416
+ const stamp = _chunk5N6DYKXOcjs.blindStampFor.call(void 0, _optionalChain([_chunk5N6DYKXOcjs.BLIND_SURFACE_STAMPS, 'access', _18 => _18[key], 'optionalAccess', _19 => _19.query]), conditions);
1414
1417
  if (stamp !== void 0) return { status: "blind", blindSurface: stamp, note: stamp.note };
1415
1418
  return {
1416
1419
  status: "ok",
@@ -1419,7 +1422,7 @@ function unbilledWorkPartStatus(key, conditions, items) {
1419
1422
  }
1420
1423
  async function unbilledWork(resource, companyId, opts = {}, http) {
1421
1424
  const v = validateUnbilledWorkOptions(companyId, opts);
1422
- const id = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, companyId, "companyId");
1425
+ const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyId, "companyId");
1423
1426
  const company = await resource.get(id);
1424
1427
  const companyIds = [num(company.id)];
1425
1428
  let parent = null;
@@ -1432,7 +1435,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1432
1435
  parentStatus = "ok";
1433
1436
  companyIds.push(num(parent.id));
1434
1437
  } catch (err) {
1435
- if (err instanceof _chunkYKEX4SK7cjs.NotFoundError) parent = null;
1438
+ if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) parent = null;
1436
1439
  else throw err;
1437
1440
  }
1438
1441
  }
@@ -1464,7 +1467,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1464
1467
  if (v.dateFrom !== void 0) billingConditions.push({ field: "itemDate", op: "gte", value: v.dateFrom });
1465
1468
  if (v.dateTo !== void 0) billingConditions.push({ field: "itemDate", op: "lte", value: v.dateTo });
1466
1469
  }
1467
- const billingFields = _chunkYKEX4SK7cjs.resolveFieldsPreset.call(void 0, "billing_join", "billing_items");
1470
+ const billingFields = _chunk5N6DYKXOcjs.resolveFieldsPreset.call(void 0, "billing_join", "billing_items");
1468
1471
  const billingIncludeFields = [...billingFields, "id", ...v.includeNotes ? ["description"] : []];
1469
1472
  const billingRaw = await boundedPart(http, "/V1.0/BillingItems/query", billingConditions, v.limit, billingIncludeFields);
1470
1473
  const taskCap = capJoinSet(taskIds, UNBILLED_WORK_JOIN_SET_CAP);
@@ -1496,7 +1499,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1496
1499
  let cappedItems = entries;
1497
1500
  let noteCharsTruncated = 0;
1498
1501
  if (v.includeNotes) {
1499
- [cappedItems, noteCharsTruncated] = _chunkYKEX4SK7cjs.truncateNoteChars.call(void 0, entries, v.noteChars, ["summaryNotes"]);
1502
+ [cappedItems, noteCharsTruncated] = _chunk5N6DYKXOcjs.truncateNoteChars.call(void 0, entries, v.noteChars, ["summaryNotes"]);
1500
1503
  }
1501
1504
  const st = unbilledWorkPartStatus("time_entries", timeConditions, entries);
1502
1505
  timePart = {
@@ -1511,8 +1514,8 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1511
1514
  let billingItems = billingRaw.items;
1512
1515
  let billingNoteCharsTruncated = 0;
1513
1516
  if (v.includeNotes) {
1514
- const noteFields = (_nullishCoalesce(_chunkYKEX4SK7cjs.UNTRUSTED_FIELDS_BY_RESOURCE["billing_items"], () => ( []))).filter((f) => billingIncludeFields.includes(f));
1515
- [billingItems, billingNoteCharsTruncated] = _chunkYKEX4SK7cjs.truncateNoteChars.call(void 0, billingRaw.items, v.noteChars, noteFields);
1517
+ const noteFields = (_nullishCoalesce(_chunk5N6DYKXOcjs.UNTRUSTED_FIELDS_BY_RESOURCE["billing_items"], () => ( []))).filter((f) => billingIncludeFields.includes(f));
1518
+ [billingItems, billingNoteCharsTruncated] = _chunk5N6DYKXOcjs.truncateNoteChars.call(void 0, billingRaw.items, v.noteChars, noteFields);
1516
1519
  }
1517
1520
  const billingSt = unbilledWorkPartStatus("billing_items", billingConditions, billingRaw.items);
1518
1521
  const billingItemsPart = {
@@ -1609,7 +1612,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1609
1612
  }
1610
1613
 
1611
1614
  // src/resources/companies.ts
1612
- var CompaniesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1615
+ var CompaniesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1613
1616
  constructor(http, pageSize) {
1614
1617
  super(http, {
1615
1618
  key: "companies",
@@ -1716,7 +1719,7 @@ var CompaniesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1716
1719
  };
1717
1720
 
1718
1721
  // src/resources/company_alerts.ts
1719
- var CompanyAlertsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1722
+ var CompanyAlertsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1720
1723
  constructor(http, pageSize) {
1721
1724
  super(http, {
1722
1725
  key: "company_alerts",
@@ -1782,7 +1785,7 @@ var CompanyAlertsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1782
1785
  };
1783
1786
 
1784
1787
  // src/resources/company_locations.ts
1785
- var CompanyLocationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1788
+ var CompanyLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1786
1789
  constructor(http, pageSize) {
1787
1790
  super(http, {
1788
1791
  key: "company_locations",
@@ -1853,7 +1856,7 @@ var CompanyLocationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1853
1856
  };
1854
1857
 
1855
1858
  // src/resources/company_notes.ts
1856
- var CompanyNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1859
+ var CompanyNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1857
1860
  constructor(http, pageSize) {
1858
1861
  super(http, {
1859
1862
  key: "company_notes",
@@ -1918,7 +1921,7 @@ var CompanyNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1918
1921
  };
1919
1922
 
1920
1923
  // src/resources/company_site_configurations.ts
1921
- var CompanySiteConfigurationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1924
+ var CompanySiteConfigurationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1922
1925
  constructor(http, pageSize) {
1923
1926
  super(http, {
1924
1927
  key: "company_site_configurations",
@@ -1969,7 +1972,7 @@ var CompanySiteConfigurationsResource = class extends _chunkYKEX4SK7cjs.BaseReso
1969
1972
  };
1970
1973
 
1971
1974
  // src/resources/company_webhooks.ts
1972
- var CompanyWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
1975
+ var CompanyWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1973
1976
  constructor(http, pageSize) {
1974
1977
  super(http, {
1975
1978
  key: "company_webhooks",
@@ -2045,7 +2048,7 @@ var CompanyWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2045
2048
  };
2046
2049
 
2047
2050
  // src/resources/configuration_item_billing_product_associations.ts
2048
- var ConfigurationItemBillingProductAssociationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2051
+ var ConfigurationItemBillingProductAssociationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2049
2052
  constructor(http, pageSize) {
2050
2053
  super(http, {
2051
2054
  key: "configuration_item_billing_product_associations",
@@ -2111,7 +2114,7 @@ var ConfigurationItemBillingProductAssociationsResource = class extends _chunkYK
2111
2114
  };
2112
2115
 
2113
2116
  // src/resources/configuration_item_categories.ts
2114
- var ConfigurationItemCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2117
+ var ConfigurationItemCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2115
2118
  constructor(http, pageSize) {
2116
2119
  super(http, {
2117
2120
  key: "configuration_item_categories",
@@ -2178,7 +2181,7 @@ var ConfigurationItemCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseRe
2178
2181
  };
2179
2182
 
2180
2183
  // src/resources/configuration_item_category_udf_associations.ts
2181
- var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2184
+ var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2182
2185
  constructor(http, pageSize) {
2183
2186
  super(http, {
2184
2187
  key: "configuration_item_category_udf_associations",
@@ -2244,7 +2247,7 @@ var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunkYKEX4
2244
2247
  };
2245
2248
 
2246
2249
  // src/resources/configuration_item_dns_records.ts
2247
- var ConfigurationItemDnsRecordsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2250
+ var ConfigurationItemDnsRecordsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2248
2251
  constructor(http, pageSize) {
2249
2252
  super(http, {
2250
2253
  key: "configuration_item_dns_records",
@@ -2293,7 +2296,7 @@ var ConfigurationItemDnsRecordsResource = class extends _chunkYKEX4SK7cjs.BaseRe
2293
2296
  };
2294
2297
 
2295
2298
  // src/resources/configuration_item_notes.ts
2296
- var ConfigurationItemNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2299
+ var ConfigurationItemNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2297
2300
  constructor(http, pageSize) {
2298
2301
  super(http, {
2299
2302
  key: "configuration_item_notes",
@@ -2352,7 +2355,7 @@ var ConfigurationItemNotesResource = class extends _chunkYKEX4SK7cjs.BaseResourc
2352
2355
  };
2353
2356
 
2354
2357
  // src/resources/configuration_item_related_items.ts
2355
- var ConfigurationItemRelatedItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2358
+ var ConfigurationItemRelatedItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2356
2359
  constructor(http, pageSize) {
2357
2360
  super(http, {
2358
2361
  key: "configuration_item_related_items",
@@ -2413,16 +2416,16 @@ async function fetchRecord(http, path, label) {
2413
2416
  const res = await http.request({ method: "GET", path, operation: "configuration_items.moveConfigurationItem" });
2414
2417
  const body = res;
2415
2418
  if (body === null || !("item" in body) || body.item === null || body.item === void 0) {
2416
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
2419
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
2417
2420
  }
2418
2421
  return body.item;
2419
2422
  }
2420
2423
  async function moveConfigurationItem(_resource, sourceId, opts, http) {
2421
- const numericSource = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, sourceId, "sourceId");
2424
+ const numericSource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, sourceId, "sourceId");
2422
2425
  if (_optionalChain([opts, 'optionalAccess', _20 => _20.destinationCompanyId]) === void 0) {
2423
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("moveConfigurationItem: destinationCompanyId is required");
2426
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: destinationCompanyId is required");
2424
2427
  }
2425
- const destId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, opts.destinationCompanyId, "destinationCompanyId");
2428
+ const destId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, opts.destinationCompanyId, "destinationCompanyId");
2426
2429
  const source = await fetchRecord(http, `/V1.0/ConfigurationItems/${numericSource}`, `Configuration item ${numericSource}`);
2427
2430
  await fetchRecord(http, `/V1.0/Companies/${destId}`, `Company ${destId}`);
2428
2431
  const body = { ...source };
@@ -2432,20 +2435,20 @@ async function moveConfigurationItem(_resource, sourceId, opts, http) {
2432
2435
  body.companyID = destId;
2433
2436
  body.isActive = true;
2434
2437
  if (opts.newReferenceTitle !== void 0) {
2435
- if (opts.newReferenceTitle.trim() === "") throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("moveConfigurationItem: newReferenceTitle must be non-empty");
2438
+ if (opts.newReferenceTitle.trim() === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: newReferenceTitle must be non-empty");
2436
2439
  body.referenceTitle = opts.newReferenceTitle.trim();
2437
2440
  }
2438
2441
  if (opts.lastModifiedDate !== void 0) {
2439
2442
  const current = source.lastModifiedDate;
2440
2443
  if (current !== opts.lastModifiedDate) {
2441
- throw new (0, _chunkYKEX4SK7cjs.StaleObjectError)(
2444
+ throw new (0, _chunk5N6DYKXOcjs.StaleObjectError)(
2442
2445
  `moveConfigurationItem: source item ${numericSource} was modified since the snapshot (expected lastModifiedDate ${opts.lastModifiedDate}, current ${_nullishCoalesce(current, () => ( "unknown"))})`,
2443
2446
  { operation: "configuration_items.moveConfigurationItem", resourceIds: [numericSource] }
2444
2447
  );
2445
2448
  }
2446
2449
  }
2447
2450
  if (opts.dryRun === true) {
2448
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
2451
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
2449
2452
  operation: "configuration_items.moveConfigurationItem",
2450
2453
  method: "POST",
2451
2454
  path: "/V1.0/ConfigurationItems",
@@ -2469,7 +2472,7 @@ async function moveConfigurationItem(_resource, sourceId, opts, http) {
2469
2472
  const createdBody = created;
2470
2473
  const newId = createdBody !== null ? _nullishCoalesce(createdBody.itemId, () => ( createdBody.id)) : void 0;
2471
2474
  if (typeof newId !== "number") {
2472
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("moveConfigurationItem: vendor create response has no itemId");
2475
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: vendor create response has no itemId");
2473
2476
  }
2474
2477
  let sourceDeactivated = false;
2475
2478
  if (opts.deactivateSource !== false) {
@@ -2487,7 +2490,7 @@ var PROFILE_PART_LIMIT2 = 50;
2487
2490
  function profilePartLimit2(value, name) {
2488
2491
  const n = value === void 0 ? PROFILE_PART_LIMIT2 : Math.trunc(value);
2489
2492
  if (!Number.isInteger(n) || n < 1) {
2490
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`profile: ${name} must be an integer >= 1 (got ${String(value)})`);
2493
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`profile: ${name} must be an integer >= 1 (got ${String(value)})`);
2491
2494
  }
2492
2495
  return n;
2493
2496
  }
@@ -2503,14 +2506,14 @@ async function contextFetchPart(http, entityPath, referenceId) {
2503
2506
  });
2504
2507
  const body = res;
2505
2508
  if (body === null || !("item" in body)) {
2506
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`context part not found (unexpected envelope shape)`, { resourceIds: [referenceId] });
2509
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`context part not found (unexpected envelope shape)`, { resourceIds: [referenceId] });
2507
2510
  }
2508
2511
  if (body.item === null || body.item === void 0) {
2509
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)("context part not found", { resourceIds: [referenceId] });
2512
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)("context part not found", { resourceIds: [referenceId] });
2510
2513
  }
2511
2514
  return body.item;
2512
2515
  } catch (err) {
2513
- if (err instanceof _chunkYKEX4SK7cjs.NotFoundError) return null;
2516
+ if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) return null;
2514
2517
  throw err;
2515
2518
  }
2516
2519
  }
@@ -2522,7 +2525,7 @@ async function ciScopedQuery(http, path, itemID, limit) {
2522
2525
  body: { MaxRecords: limit, filter: [{ field: "configurationItemID", op: "eq", value: itemID }] },
2523
2526
  operation: "configuration_items.profile"
2524
2527
  });
2525
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
2528
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
2526
2529
  }
2527
2530
  async function profile(resource, id, opts = {}, http) {
2528
2531
  const noteLimit = profilePartLimit2(opts.noteLimit, "noteLimit");
@@ -2534,7 +2537,7 @@ async function profile(resource, id, opts = {}, http) {
2534
2537
  const notes = await ciScopedQuery(http, "/V1.0/ConfigurationItemNotes/query", id, noteLimit);
2535
2538
  const relatedItems = await ciScopedQuery(http, "/V1.0/ConfigurationItemRelatedItems/query", id, relatedLimit);
2536
2539
  const associations = await ciScopedQuery(http, "/V1.0/ConfigurationItemBillingProductAssociations/query", id, PROFILE_PART_LIMIT2);
2537
- const wallQuirk = _optionalChain([_chunkYKEX4SK7cjs.RELATIONSHIP_MAP, 'access', _21 => _21["configuration_items"], 'optionalAccess', _22 => _22.zoneFacts, 'optionalAccess', _23 => _23.quirks, 'optionalAccess', _24 => _24.find, 'call', _25 => _25((q) => q.startsWith("product wall"))]);
2540
+ const wallQuirk = _optionalChain([_chunk5N6DYKXOcjs.RELATIONSHIP_MAP, 'access', _21 => _21["configuration_items"], 'optionalAccess', _22 => _22.zoneFacts, 'optionalAccess', _23 => _23.quirks, 'optionalAccess', _24 => _24.find, 'call', _25 => _25((q) => q.startsWith("product wall"))]);
2538
2541
  const productAssociations = {
2539
2542
  items: associations,
2540
2543
  capped: associations.length >= PROFILE_PART_LIMIT2,
@@ -2558,11 +2561,11 @@ async function profile(resource, id, opts = {}, http) {
2558
2561
  }
2559
2562
  };
2560
2563
  if (opts.names === true) {
2561
- const builder = _chunkYKEX4SK7cjs.createNamePlan.call(void 0, );
2564
+ const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, );
2562
2565
  builder.addFk("contract", root["contractID"]);
2563
- const names = await _chunkYKEX4SK7cjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
2566
+ const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
2564
2567
  const ciRow = { ...ci };
2565
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, ciRow, "contractID", (v) => names.recordName("contract", v));
2568
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ciRow, "contractID", (v) => names.recordName("contract", v));
2566
2569
  result.ci = ciRow;
2567
2570
  result.names = names.section;
2568
2571
  }
@@ -2570,7 +2573,7 @@ async function profile(resource, id, opts = {}, http) {
2570
2573
  }
2571
2574
 
2572
2575
  // src/resources/configuration_items.ts
2573
- var ConfigurationItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2576
+ var ConfigurationItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2574
2577
  constructor(http, pageSize) {
2575
2578
  super(http, {
2576
2579
  key: "configuration_items",
@@ -2659,7 +2662,7 @@ var ConfigurationItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2659
2662
  };
2660
2663
 
2661
2664
  // src/resources/configuration_item_ssl_subject_alternative_names.ts
2662
- var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2665
+ var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2663
2666
  constructor(http, pageSize) {
2664
2667
  super(http, {
2665
2668
  key: "configuration_item_ssl_subject_alternative_names",
@@ -2722,7 +2725,7 @@ var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunkYK
2722
2725
  };
2723
2726
 
2724
2727
  // src/resources/configuration_item_types.ts
2725
- var ConfigurationItemTypesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2728
+ var ConfigurationItemTypesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2726
2729
  constructor(http, pageSize) {
2727
2730
  super(http, {
2728
2731
  key: "configuration_item_types",
@@ -2796,7 +2799,7 @@ var ConfigurationItemTypesResource = class extends _chunkYKEX4SK7cjs.BaseResourc
2796
2799
  };
2797
2800
 
2798
2801
  // src/resources/configuration_item_webhooks.ts
2799
- var ConfigurationItemWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2802
+ var ConfigurationItemWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2800
2803
  constructor(http, pageSize) {
2801
2804
  super(http, {
2802
2805
  key: "configuration_item_webhooks",
@@ -2872,7 +2875,7 @@ var ConfigurationItemWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseReso
2872
2875
  };
2873
2876
 
2874
2877
  // src/resources/contact_group_contacts.ts
2875
- var ContactGroupContactsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2878
+ var ContactGroupContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2876
2879
  constructor(http, pageSize) {
2877
2880
  super(http, {
2878
2881
  key: "contact_group_contacts",
@@ -2926,7 +2929,7 @@ var ContactGroupContactsResource = class extends _chunkYKEX4SK7cjs.BaseResource
2926
2929
  };
2927
2930
 
2928
2931
  // src/resources/contact_groups.ts
2929
- var ContactGroupsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
2932
+ var ContactGroupsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2930
2933
  constructor(http, pageSize) {
2931
2934
  super(http, {
2932
2935
  key: "contact_groups",
@@ -3004,22 +3007,22 @@ async function fetchRecord2(http, path, label) {
3004
3007
  const res = await http.request({ method: "GET", path, operation: "contacts.moveToCompany" });
3005
3008
  const body = res;
3006
3009
  if (body === null || !("item" in body) || body.item === null || body.item === void 0) {
3007
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
3010
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
3008
3011
  }
3009
3012
  return body.item;
3010
3013
  }
3011
3014
  async function moveToCompany(_resource, sourceContactId, destinationCompanyId, opts = {}, http) {
3012
- const sourceId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, sourceContactId, "sourceContactId");
3013
- const destId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, destinationCompanyId, "destinationCompanyId");
3015
+ const sourceId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, sourceContactId, "sourceContactId");
3016
+ const destId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, destinationCompanyId, "destinationCompanyId");
3014
3017
  const source = await fetchRecord2(http, `/V1.0/Contacts/${sourceId}`, `Contact ${sourceId}`);
3015
3018
  const companyID = source.companyID;
3016
3019
  if (typeof companyID !== "number" || companyID < 0) {
3017
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`Contact ${sourceId} has no companyID (cannot scope the source delete)`);
3020
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Contact ${sourceId} has no companyID (cannot scope the source delete)`);
3018
3021
  }
3019
3022
  if (opts.lastModifiedDate !== void 0) {
3020
3023
  const current = source.lastModifiedDate;
3021
3024
  if (current !== opts.lastModifiedDate) {
3022
- throw new (0, _chunkYKEX4SK7cjs.StaleObjectError)(
3025
+ throw new (0, _chunk5N6DYKXOcjs.StaleObjectError)(
3023
3026
  `moveToCompany: source contact ${sourceId} was modified since the snapshot (expected lastModifiedDate ${opts.lastModifiedDate}, current ${typeof current === "string" ? current : "unknown"})`,
3024
3027
  { operation: "contacts.moveToCompany", resourceIds: [sourceId, destId] }
3025
3028
  );
@@ -3041,10 +3044,10 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3041
3044
  },
3042
3045
  operation: "contacts.moveToCompany"
3043
3046
  });
3044
- const items = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
3047
+ const items = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
3045
3048
  const clash = items.find((c) => String(c.id) !== String(sourceId));
3046
3049
  if (clash !== void 0) {
3047
- throw new (0, _chunkYKEX4SK7cjs.ConflictError)(
3050
+ throw new (0, _chunk5N6DYKXOcjs.ConflictError)(
3048
3051
  `Contact email "${email}" already exists under company ${destId} (contact ${String(clash.id)}); aborting the move`,
3049
3052
  { resourceIds: [sourceId, destId] }
3050
3053
  );
@@ -3058,7 +3061,7 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3058
3061
  if (opts.dryRun === true) {
3059
3062
  const warnings = [];
3060
3063
  if (opts.deleteSource === true) warnings.push("the source contact will be deleted after the move");
3061
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
3064
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
3062
3065
  operation: "contacts.moveToCompany",
3063
3066
  method: "POST",
3064
3067
  path: `/V1.0/Companies/${destId}/Contacts`,
@@ -3083,7 +3086,7 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3083
3086
  const createdBody = created;
3084
3087
  const newId = createdBody !== null ? _nullishCoalesce(createdBody.itemId, () => ( createdBody.id)) : void 0;
3085
3088
  if (typeof newId !== "number") {
3086
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("contacts.moveToCompany: vendor create response has no itemId");
3089
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("contacts.moveToCompany: vendor create response has no itemId");
3087
3090
  }
3088
3091
  let sourceDeleted = false;
3089
3092
  if (opts.deleteSource === true) {
@@ -3101,7 +3104,7 @@ var UPSERT_MAX_DISCOVERY_MERGES = 3;
3101
3104
  var EMAIL_SHAPE = /^.+@.+/;
3102
3105
  var SAFE_CONTACT_CREATE_DEFAULTS = {};
3103
3106
  var DEDUP_LIMIT = 10;
3104
- var CompanyNotFoundError = class extends _chunkYKEX4SK7cjs.AutotaskError {
3107
+ var CompanyNotFoundError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3105
3108
  constructor(message, options = {}) {
3106
3109
  super(message, {
3107
3110
  code: "COMPANY_NOT_FOUND",
@@ -3112,7 +3115,7 @@ var CompanyNotFoundError = class extends _chunkYKEX4SK7cjs.AutotaskError {
3112
3115
  this.name = "CompanyNotFoundError";
3113
3116
  }
3114
3117
  };
3115
- var ContactCreateFailedError = class extends _chunkYKEX4SK7cjs.AutotaskError {
3118
+ var ContactCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3116
3119
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
3117
3120
 
3118
3121
  constructor(message, vendorFields, options = {}) {
@@ -3122,25 +3125,25 @@ var ContactCreateFailedError = class extends _chunkYKEX4SK7cjs.AutotaskError {
3122
3125
  }
3123
3126
  };
3124
3127
  async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3125
- const cid = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, companyID, "companyID");
3128
+ const cid = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyID, "companyID");
3126
3129
  if (typeof email !== "string" || !EMAIL_SHAPE.test(email)) {
3127
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
3130
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
3128
3131
  `upsertByEmail: email must be a non-empty string with the @ shape (a non-empty local part + a non-empty domain; got ${JSON.stringify(email)})`,
3129
3132
  { operation: OP_UPSERT_EMAIL }
3130
3133
  );
3131
3134
  }
3132
3135
  if (extra !== void 0) {
3133
3136
  if (extra.isActive !== void 0 && typeof extra.isActive !== "boolean" && extra.isActive !== 0 && extra.isActive !== 1) {
3134
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
3137
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
3135
3138
  `upsertByEmail: extra.isActive must be a boolean (mapped to the zone-correct number 1/0) or a raw 0/1 number (got ${String(extra.isActive)})`,
3136
3139
  { operation: OP_UPSERT_EMAIL }
3137
3140
  );
3138
3141
  }
3139
3142
  if (extra.firstName !== void 0 && (typeof extra.firstName !== "string" || extra.firstName === "")) {
3140
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("upsertByEmail: extra.firstName must be a non-empty string (or omitted \u2014 the node defaults it to the email local-part)", { operation: OP_UPSERT_EMAIL });
3143
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("upsertByEmail: extra.firstName must be a non-empty string (or omitted \u2014 the node defaults it to the email local-part)", { operation: OP_UPSERT_EMAIL });
3141
3144
  }
3142
3145
  if (extra.lastName !== void 0 && typeof extra.lastName !== "string") {
3143
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("upsertByEmail: extra.lastName must be a string (or omitted \u2014 the node defaults it to the non-empty neutral value Unknown)", { operation: OP_UPSERT_EMAIL });
3146
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("upsertByEmail: extra.lastName must be a string (or omitted \u2014 the node defaults it to the non-empty neutral value Unknown)", { operation: OP_UPSERT_EMAIL });
3144
3147
  }
3145
3148
  }
3146
3149
  const parentRes = await http.request({ method: "GET", path: `/V1.0/Companies/${cid}`, operation: OP_UPSERT_EMAIL });
@@ -3161,7 +3164,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3161
3164
  const match = q.items[0];
3162
3165
  if (match !== void 0) {
3163
3166
  if (opts.dryRun === true) {
3164
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
3167
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
3165
3168
  {
3166
3169
  operation: OP_UPSERT_EMAIL,
3167
3170
  method: "POST",
@@ -3191,7 +3194,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3191
3194
  isActive: typeof isActive === "boolean" ? isActive ? 1 : 0 : isActive
3192
3195
  };
3193
3196
  if (opts.dryRun === true) {
3194
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
3197
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
3195
3198
  {
3196
3199
  operation: OP_UPSERT_EMAIL,
3197
3200
  method: "POST",
@@ -3214,8 +3217,8 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3214
3217
  const created = await resource.create(cid, body, {});
3215
3218
  return { id: created.id, created: true };
3216
3219
  } catch (err) {
3217
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
3218
- const named = (_nullishCoalesce(_chunkYKEX4SK7cjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
3220
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
3221
+ const named = (_nullishCoalesce(_chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
3219
3222
  const seen = /* @__PURE__ */ new Set();
3220
3223
  const unique = [...named].filter((f) => seen.has(f) ? false : (seen.add(f), true));
3221
3224
  const hasDefault = unique.some((f) => SAFE_CONTACT_CREATE_DEFAULTS[f] !== void 0);
@@ -3229,7 +3232,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3229
3232
  }
3230
3233
  continue;
3231
3234
  }
3232
- const detail = _chunkYKEX4SK7cjs.formatVendorDetail.call(void 0, err.vendorError);
3235
+ const detail = _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError);
3233
3236
  throw new ContactCreateFailedError(
3234
3237
  `upsertByEmail: the vendor rejected the contact create${unique.length > 0 ? ` naming field(s) ${unique.join(", ")}` : ""} (no proven-safe default \u2014 the required set is fully filled by the node)${detail ? ` \u2014 ${detail}` : ""}`,
3235
3238
  unique,
@@ -3245,7 +3248,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3245
3248
  }
3246
3249
 
3247
3250
  // src/resources/contacts.ts
3248
- var ContactsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3251
+ var ContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3249
3252
  constructor(http, pageSize) {
3250
3253
  super(http, {
3251
3254
  key: "contacts",
@@ -3337,7 +3340,7 @@ var ContactsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3337
3340
  };
3338
3341
 
3339
3342
  // src/resources/contact_webhooks.ts
3340
- var ContactWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3343
+ var ContactWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3341
3344
  constructor(http, pageSize) {
3342
3345
  super(http, {
3343
3346
  key: "contact_webhooks",
@@ -3413,7 +3416,7 @@ var ContactWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3413
3416
  };
3414
3417
 
3415
3418
  // src/resources/contract_billing_rules.ts
3416
- var ContractBillingRulesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3419
+ var ContractBillingRulesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3417
3420
  constructor(http, pageSize) {
3418
3421
  super(http, {
3419
3422
  key: "contract_billing_rules",
@@ -3479,7 +3482,7 @@ var ContractBillingRulesResource = class extends _chunkYKEX4SK7cjs.BaseResource
3479
3482
  };
3480
3483
 
3481
3484
  // src/resources/contract_block_hour_factors.ts
3482
- var ContractBlockHourFactorsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3485
+ var ContractBlockHourFactorsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3483
3486
  constructor(http, pageSize) {
3484
3487
  super(http, {
3485
3488
  key: "contract_block_hour_factors",
@@ -3538,7 +3541,7 @@ var ContractBlockHourFactorsResource = class extends _chunkYKEX4SK7cjs.BaseResou
3538
3541
  };
3539
3542
 
3540
3543
  // src/resources/contract_blocks.ts
3541
- var ContractBlocksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3544
+ var ContractBlocksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3542
3545
  constructor(http, pageSize) {
3543
3546
  super(http, {
3544
3547
  key: "contract_blocks",
@@ -3597,7 +3600,7 @@ var ContractBlocksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3597
3600
  };
3598
3601
 
3599
3602
  // src/resources/contract_charges.ts
3600
- var ContractChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3603
+ var ContractChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3601
3604
  constructor(http, pageSize) {
3602
3605
  super(http, {
3603
3606
  key: "contract_charges",
@@ -3668,7 +3671,7 @@ var ContractChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3668
3671
  };
3669
3672
 
3670
3673
  // src/resources/contract_exclusion_billing_codes.ts
3671
- var ContractExclusionBillingCodesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3674
+ var ContractExclusionBillingCodesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3672
3675
  constructor(http, pageSize) {
3673
3676
  super(http, {
3674
3677
  key: "contract_exclusion_billing_codes",
@@ -3725,7 +3728,7 @@ var ContractExclusionBillingCodesResource = class extends _chunkYKEX4SK7cjs.Base
3725
3728
  };
3726
3729
 
3727
3730
  // src/resources/contract_exclusion_roles.ts
3728
- var ContractExclusionRolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3731
+ var ContractExclusionRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3729
3732
  constructor(http, pageSize) {
3730
3733
  super(http, {
3731
3734
  key: "contract_exclusion_roles",
@@ -3782,7 +3785,7 @@ var ContractExclusionRolesResource = class extends _chunkYKEX4SK7cjs.BaseResourc
3782
3785
  };
3783
3786
 
3784
3787
  // src/resources/contract_exclusion_set_excluded_roles.ts
3785
- var ContractExclusionSetExcludedRolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3788
+ var ContractExclusionSetExcludedRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3786
3789
  constructor(http, pageSize) {
3787
3790
  super(http, {
3788
3791
  key: "contract_exclusion_set_excluded_roles",
@@ -3839,7 +3842,7 @@ var ContractExclusionSetExcludedRolesResource = class extends _chunkYKEX4SK7cjs.
3839
3842
  };
3840
3843
 
3841
3844
  // src/resources/contract_exclusion_set_excluded_work_types.ts
3842
- var ContractExclusionSetExcludedWorkTypesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3845
+ var ContractExclusionSetExcludedWorkTypesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3843
3846
  constructor(http, pageSize) {
3844
3847
  super(http, {
3845
3848
  key: "contract_exclusion_set_excluded_work_types",
@@ -3896,7 +3899,7 @@ var ContractExclusionSetExcludedWorkTypesResource = class extends _chunkYKEX4SK7
3896
3899
  };
3897
3900
 
3898
3901
  // src/resources/contract_exclusion_sets.ts
3899
- var ContractExclusionSetsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3902
+ var ContractExclusionSetsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3900
3903
  constructor(http, pageSize) {
3901
3904
  super(http, {
3902
3905
  key: "contract_exclusion_sets",
@@ -3970,7 +3973,7 @@ var ContractExclusionSetsResource = class extends _chunkYKEX4SK7cjs.BaseResource
3970
3973
  };
3971
3974
 
3972
3975
  // src/resources/contract_milestones.ts
3973
- var ContractMilestonesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
3976
+ var ContractMilestonesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3974
3977
  constructor(http, pageSize) {
3975
3978
  super(http, {
3976
3979
  key: "contract_milestones",
@@ -4029,7 +4032,7 @@ var ContractMilestonesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4029
4032
  };
4030
4033
 
4031
4034
  // src/resources/contract_notes.ts
4032
- var ContractNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4035
+ var ContractNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4033
4036
  constructor(http, pageSize) {
4034
4037
  super(http, {
4035
4038
  key: "contract_notes",
@@ -4088,7 +4091,7 @@ var ContractNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4088
4091
  };
4089
4092
 
4090
4093
  // src/resources/contract_rates.ts
4091
- var ContractRatesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4094
+ var ContractRatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4092
4095
  constructor(http, pageSize) {
4093
4096
  super(http, {
4094
4097
  key: "contract_rates",
@@ -4147,7 +4150,7 @@ var ContractRatesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4147
4150
  };
4148
4151
 
4149
4152
  // src/resources/contract_retainers.ts
4150
- var ContractRetainersResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4153
+ var ContractRetainersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4151
4154
  constructor(http, pageSize) {
4152
4155
  super(http, {
4153
4156
  key: "contract_retainers",
@@ -4206,7 +4209,7 @@ var ContractRetainersResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4206
4209
  };
4207
4210
 
4208
4211
  // src/resources/contract_role_costs.ts
4209
- var ContractRoleCostsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4212
+ var ContractRoleCostsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4210
4213
  constructor(http, pageSize) {
4211
4214
  super(http, {
4212
4215
  key: "contract_role_costs",
@@ -4265,7 +4268,7 @@ var ContractRoleCostsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4265
4268
  };
4266
4269
 
4267
4270
  // src/resources/contract_service_adjustments.ts
4268
- var ContractServiceAdjustmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4271
+ var ContractServiceAdjustmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4269
4272
  constructor(http, pageSize) {
4270
4273
  super(http, {
4271
4274
  key: "contract_service_adjustments",
@@ -4299,7 +4302,7 @@ var ContractServiceAdjustmentsResource = class extends _chunkYKEX4SK7cjs.BaseRes
4299
4302
  };
4300
4303
 
4301
4304
  // src/resources/contract_service_bundle_adjustments.ts
4302
- var ContractServiceBundleAdjustmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4305
+ var ContractServiceBundleAdjustmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4303
4306
  constructor(http, pageSize) {
4304
4307
  super(http, {
4305
4308
  key: "contract_service_bundle_adjustments",
@@ -4333,7 +4336,7 @@ var ContractServiceBundleAdjustmentsResource = class extends _chunkYKEX4SK7cjs.B
4333
4336
  };
4334
4337
 
4335
4338
  // src/resources/contract_service_bundles.ts
4336
- var ContractServiceBundlesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4339
+ var ContractServiceBundlesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4337
4340
  constructor(http, pageSize) {
4338
4341
  super(http, {
4339
4342
  key: "contract_service_bundles",
@@ -4392,7 +4395,7 @@ var ContractServiceBundlesResource = class extends _chunkYKEX4SK7cjs.BaseResourc
4392
4395
  };
4393
4396
 
4394
4397
  // src/resources/contract_service_bundle_units.ts
4395
- var ContractServiceBundleUnitsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4398
+ var ContractServiceBundleUnitsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4396
4399
  constructor(http, pageSize) {
4397
4400
  super(http, {
4398
4401
  key: "contract_service_bundle_units",
@@ -4434,7 +4437,7 @@ var ContractServiceBundleUnitsResource = class extends _chunkYKEX4SK7cjs.BaseRes
4434
4437
  };
4435
4438
 
4436
4439
  // src/resources/contract_services.ts
4437
- var ContractServicesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4440
+ var ContractServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4438
4441
  constructor(http, pageSize) {
4439
4442
  super(http, {
4440
4443
  key: "contract_services",
@@ -4493,7 +4496,7 @@ var ContractServicesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4493
4496
  };
4494
4497
 
4495
4498
  // src/resources/contract_service_units.ts
4496
- var ContractServiceUnitsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4499
+ var ContractServiceUnitsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4497
4500
  constructor(http, pageSize) {
4498
4501
  super(http, {
4499
4502
  key: "contract_service_units",
@@ -4534,8 +4537,1070 @@ var ContractServiceUnitsResource = class extends _chunkYKEX4SK7cjs.BaseResource
4534
4537
  }
4535
4538
  };
4536
4539
 
4540
+ // src/resources/special/contracts.ts
4541
+ var PROFITABILITY_OPT_KEYS = [
4542
+ "dateFrom",
4543
+ "dateTo",
4544
+ "labourCostMethod",
4545
+ "labourRatePerHour",
4546
+ "includeRecurringCosts",
4547
+ "includeUnbilledRevenue",
4548
+ "externalMonthlyCosts",
4549
+ "groupByActivity",
4550
+ "staleAfterDays",
4551
+ "maxTicketsForJoin",
4552
+ "limit"
4553
+ ];
4554
+ var LABOUR_METHOD_SET = [
4555
+ "billing_item_our_cost",
4556
+ "contract_role_cost",
4557
+ "resource_internal_cost",
4558
+ "provided"
4559
+ ];
4560
+ var PROFITABILITY_MAX_WINDOW_MONTHS = 36;
4561
+ var RECURRING_DRIFT_EPSILON = 5e-3;
4562
+ var ESTIMATE_DEVIATION_THRESHOLD_PCT = 10;
4563
+ var CLOSED_STATUS_LABEL_RE = /resolved|completed|cancelled|canceled|closed|deleted/i;
4564
+ var PROFITABILITY_WIRE_BUDGET = 18;
4565
+ var DATE_RE2 = /^\d{4}-\d{2}-\d{2}$/;
4566
+ function num2(v) {
4567
+ return typeof v === "number" && Number.isFinite(v) ? v : 0;
4568
+ }
4569
+ function isDateYMD2(v) {
4570
+ return typeof v === "string" && DATE_RE2.test(v) && !Number.isNaN(Date.parse(v));
4571
+ }
4572
+ function monthsInWindow(dateFrom, dateTo) {
4573
+ const a = `${dateFrom.slice(0, 7)}`;
4574
+ const b = `${dateTo.slice(0, 7)}`;
4575
+ if (a > b) return 0;
4576
+ const ay = Number(a.slice(0, 4));
4577
+ const am = Number(a.slice(5, 7));
4578
+ const by = Number(b.slice(0, 4));
4579
+ const bm = Number(b.slice(5, 7));
4580
+ return (by - ay) * 12 + (bm - am) + 1;
4581
+ }
4582
+ function monthsBetween(dateFrom, dateTo) {
4583
+ const out = [];
4584
+ let y = Number(dateFrom.slice(0, 4));
4585
+ let m = Number(dateFrom.slice(5, 7));
4586
+ const end = dateTo.slice(0, 7);
4587
+ for (; ; ) {
4588
+ const tag = `${y}-${String(m).padStart(2, "0")}`;
4589
+ out.push(tag);
4590
+ if (tag === end) break;
4591
+ m += 1;
4592
+ if (m === 13) {
4593
+ m = 1;
4594
+ y += 1;
4595
+ }
4596
+ if (out.length > 500) break;
4597
+ }
4598
+ return out;
4599
+ }
4600
+ function monthBounds(month, dateFrom, dateTo) {
4601
+ const y = Number(month.slice(0, 4));
4602
+ const m = Number(month.slice(5, 7));
4603
+ const first = `${month}-01`;
4604
+ const lastOfMonth = new Date(Date.UTC(y, m, 0)).getUTCDate();
4605
+ const rawEnd = `${month}-${String(lastOfMonth).padStart(2, "0")}`;
4606
+ return {
4607
+ start: first > dateFrom ? first : dateFrom,
4608
+ end: rawEnd < dateTo ? rawEnd : dateTo
4609
+ };
4610
+ }
4611
+ function dateToDay(v) {
4612
+ if (typeof v !== "string" || v.length < 10) return null;
4613
+ const d = Date.parse(v.slice(0, 10));
4614
+ return Number.isNaN(d) ? null : Math.floor(d / 864e5);
4615
+ }
4616
+ function validateProfitabilityOptions(contractId, opts) {
4617
+ if (opts === void 0 || (typeof opts !== "object" || opts === null || Array.isArray(opts))) {
4618
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
4619
+ `profitability: opts must be the options object (got ${opts === void 0 ? "undefined" : Array.isArray(opts) ? "an array" : typeof opts})`,
4620
+ { operation: "contracts.profitability" }
4621
+ );
4622
+ }
4623
+ const problems = [];
4624
+ for (const key of Object.keys(opts)) {
4625
+ if (!PROFITABILITY_OPT_KEYS.includes(key)) {
4626
+ problems.push(
4627
+ `unknown opts key "${key}" \u2014 the bag is closed: ${PROFITABILITY_OPT_KEYS.join(", ")}`
4628
+ );
4629
+ }
4630
+ }
4631
+ if (!isDateYMD2(opts.dateFrom)) problems.push(`dateFrom is required (YYYY-MM-DD) (got ${String(opts.dateFrom)})`);
4632
+ if (!isDateYMD2(opts.dateTo)) problems.push(`dateTo is required (YYYY-MM-DD) (got ${String(opts.dateTo)})`);
4633
+ if (isDateYMD2(opts.dateFrom) && isDateYMD2(opts.dateTo) && opts.dateTo < opts.dateFrom) {
4634
+ problems.push(`dateTo must be >= dateFrom (got ${opts.dateTo})`);
4635
+ }
4636
+ if (isDateYMD2(opts.dateFrom) && isDateYMD2(opts.dateTo) && opts.dateTo >= opts.dateFrom) {
4637
+ const months = monthsInWindow(opts.dateFrom, opts.dateTo);
4638
+ if (months > PROFITABILITY_MAX_WINDOW_MONTHS) {
4639
+ problems.push(
4640
+ `window must span at most ${PROFITABILITY_MAX_WINDOW_MONTHS} months (the per-month windowing budget stays bounded; got ${months} months)`
4641
+ );
4642
+ }
4643
+ }
4644
+ const method = _nullishCoalesce(opts.labourCostMethod, () => ( "billing_item_our_cost"));
4645
+ if (!LABOUR_METHOD_SET.includes(method)) {
4646
+ problems.push(`labourCostMethod must be one of: ${LABOUR_METHOD_SET.join(", ")} (got ${String(opts.labourCostMethod)})`);
4647
+ }
4648
+ let rate = null;
4649
+ if (opts.labourRatePerHour !== void 0) {
4650
+ if (typeof opts.labourRatePerHour !== "number" || !Number.isFinite(opts.labourRatePerHour) || opts.labourRatePerHour < 0) {
4651
+ problems.push(`labourRatePerHour must be a finite number >= 0 (got ${String(opts.labourRatePerHour)})`);
4652
+ } else {
4653
+ rate = opts.labourRatePerHour;
4654
+ }
4655
+ }
4656
+ if (method === "provided" && rate === null) {
4657
+ problems.push(`labourRatePerHour is required (finite number >= 0) when labourCostMethod is "provided" (got ${String(opts.labourRatePerHour)})`);
4658
+ }
4659
+ for (const key of ["includeRecurringCosts", "includeUnbilledRevenue", "groupByActivity"]) {
4660
+ const v = opts[key];
4661
+ if (v !== void 0 && typeof v !== "boolean") problems.push(`${key} must be a boolean (got ${String(v)})`);
4662
+ }
4663
+ if (opts.externalMonthlyCosts !== void 0) {
4664
+ const emc = opts.externalMonthlyCosts;
4665
+ if (!Array.isArray(emc)) {
4666
+ problems.push("externalMonthlyCosts must be an array of finite numbers >= 0, indexed by month from dateFrom (got a non-array)");
4667
+ } else {
4668
+ const max = isDateYMD2(opts.dateFrom) && isDateYMD2(opts.dateTo) && opts.dateTo >= opts.dateFrom ? monthsInWindow(opts.dateFrom, opts.dateTo) : Infinity;
4669
+ for (let i = 0; i < emc.length; i++) {
4670
+ const v = emc[i];
4671
+ if (typeof v !== "number" || !Number.isFinite(v) || v < 0) {
4672
+ problems.push(`externalMonthlyCosts[${i}] must be a finite number >= 0 (got ${String(v)})`);
4673
+ }
4674
+ }
4675
+ if (emc.length > max) {
4676
+ problems.push(`externalMonthlyCosts must be an array of finite numbers >= 0, indexed by month from dateFrom, with at most ${max} entries (got ${emc.length})`);
4677
+ }
4678
+ }
4679
+ }
4680
+ const stale = _nullishCoalesce(opts.staleAfterDays, () => ( 30));
4681
+ if (!Number.isInteger(stale) || stale < 1) problems.push(`staleAfterDays must be an integer >= 1 (got ${String(opts.staleAfterDays)})`);
4682
+ const mtj = _nullishCoalesce(opts.maxTicketsForJoin, () => ( 500));
4683
+ if (!Number.isInteger(mtj) || mtj < 1 || mtj > 500) {
4684
+ problems.push(`maxTicketsForJoin must be an integer 1..500 (the in-filter cap; got ${String(opts.maxTicketsForJoin)})`);
4685
+ }
4686
+ let limit = 50;
4687
+ if (opts.limit !== void 0) {
4688
+ if (!Number.isInteger(opts.limit) || opts.limit < 1) {
4689
+ problems.push(`limit must be an integer >= 1 (got ${String(opts.limit)})`);
4690
+ } else {
4691
+ limit = Math.min(opts.limit, 500);
4692
+ }
4693
+ }
4694
+ try {
4695
+ _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, contractId, "contractId");
4696
+ } catch (err) {
4697
+ problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "contractId must be a vendor numeric id");
4698
+ }
4699
+ if (problems.length > 0) {
4700
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
4701
+ `profitability: ${problems.length} problem(s) found pre-request (zero wire was issued)
4702
+ - ` + problems.join("\n- "),
4703
+ { operation: "contracts.profitability" }
4704
+ );
4705
+ }
4706
+ return {
4707
+ dateFrom: opts.dateFrom,
4708
+ dateTo: opts.dateTo,
4709
+ method,
4710
+ labourRatePerHour: rate,
4711
+ includeRecurringCosts: _nullishCoalesce(opts.includeRecurringCosts, () => ( true)),
4712
+ includeUnbilledRevenue: _nullishCoalesce(opts.includeUnbilledRevenue, () => ( true)),
4713
+ externalMonthlyCosts: Array.isArray(opts.externalMonthlyCosts) ? [...opts.externalMonthlyCosts] : [],
4714
+ groupByActivity: _nullishCoalesce(opts.groupByActivity, () => ( true)),
4715
+ staleAfterDays: stale,
4716
+ maxTicketsForJoin: mtj,
4717
+ limit
4718
+ };
4719
+ }
4720
+ async function boundedPart2(http, path, conditions, limit, operation, includeFields) {
4721
+ const body = { MaxRecords: limit, filter: conditions };
4722
+ if (includeFields !== void 0) body.IncludeFields = includeFields;
4723
+ const res = await http.request({
4724
+ method: "POST",
4725
+ idempotent: true,
4726
+ path,
4727
+ body,
4728
+ operation
4729
+ });
4730
+ const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, operation);
4731
+ const capped = items.length >= limit;
4732
+ return { items, capped, hasMore: capped && pageDetails.nextPageUrl != null };
4733
+ }
4734
+ function capJoinSet2(ids, cap) {
4735
+ const sorted = [...new Set(ids)].sort((a, b) => a - b);
4736
+ if (sorted.length <= cap) return { ids: sorted, truncated: false, total: sorted.length };
4737
+ return { ids: sorted.slice(0, cap), truncated: true, total: sorted.length };
4738
+ }
4739
+ async function fetchByIdsPart(http, entityPath, ids, fields, operation) {
4740
+ const unique = [...new Set(ids)].sort((a, b) => a - b);
4741
+ const byKey = /* @__PURE__ */ new Map();
4742
+ const misses = [];
4743
+ const notes = [];
4744
+ for (let c = 0; c < unique.length; c += _chunk5N6DYKXOcjs.FETCH_BY_IDS_CHUNK_SIZE) {
4745
+ const chunk = unique.slice(c, c + _chunk5N6DYKXOcjs.FETCH_BY_IDS_CHUNK_SIZE);
4746
+ const chunkKeys = new Set(chunk);
4747
+ try {
4748
+ const body = {
4749
+ MaxRecords: _chunk5N6DYKXOcjs.FETCH_BY_IDS_CHUNK_SIZE,
4750
+ filter: [{ field: "id", op: "in", value: chunk }],
4751
+ IncludeFields: fields
4752
+ };
4753
+ const res = await http.request({ method: "POST", idempotent: true, path: `${entityPath}/query`, body, operation });
4754
+ const { items: rows } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, operation);
4755
+ for (const row of rows) {
4756
+ const k = num2(row.id);
4757
+ if (k > 0 && chunkKeys.has(k)) byKey.set(k, row);
4758
+ }
4759
+ } catch (err) {
4760
+ const code = err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.code : "SERVER_ERROR";
4761
+ for (const k of chunk) {
4762
+ if (!byKey.has(k) && !misses.some((m) => m.id === k)) misses.push({ id: k, code, message: err instanceof Error ? err.message : String(err) });
4763
+ }
4764
+ }
4765
+ }
4766
+ const queryMissed = unique.filter((k) => !byKey.has(k) && !misses.some((m) => m.id === k));
4767
+ for (const k of queryMissed) {
4768
+ try {
4769
+ const res = await http.request({ method: "GET", path: `${entityPath}/${k}`, operation });
4770
+ byKey.set(k, _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, k, operation));
4771
+ } catch (err) {
4772
+ if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) {
4773
+ misses.push({ id: k, code: "NOT_FOUND", message: err.message });
4774
+ } else if (err instanceof _chunk5N6DYKXOcjs.AutotaskError) {
4775
+ misses.push({ id: k, code: err.code, message: err.message });
4776
+ } else {
4777
+ misses.push({ id: k, code: "SERVER_ERROR", message: err instanceof Error ? err.message : String(err) });
4778
+ }
4779
+ }
4780
+ }
4781
+ const items = unique.map((k) => byKey.get(k)).filter((r) => r !== void 0);
4782
+ const gotByQuery = unique.length - queryMissed.length;
4783
+ if (queryMissed.length > 0 && gotByQuery === 0 && byKey.size > 0) {
4784
+ notes.push(
4785
+ `the chunk \`id in\` query returned 0 rows for ${byKey.size} id(s) \u2014 the per-id get fallback resolved them (the list-scoping quirk: get-by-id is the authority)`
4786
+ );
4787
+ }
4788
+ const foundIds = new Set(byKey.keys());
4789
+ if (misses.length > 0) {
4790
+ const byCode = /* @__PURE__ */ new Map();
4791
+ for (const m of misses) byCode.set(m.code, (_nullishCoalesce(byCode.get(m.code), () => ( 0))) + 1);
4792
+ notes.push(`${misses.length} id(s) unreadable: ${[...byCode.entries()].map(([code, n]) => `${n} \xD7 ${code}`).join(", ")} (per-item typed misses \u2014 the rest resolved)`);
4793
+ }
4794
+ return { items, foundIds, misses, notes };
4795
+ }
4796
+ function ladderFrom(ctx) {
4797
+ const rungs = [];
4798
+ const push = (s) => rungs.push(s);
4799
+ switch (ctx.method) {
4800
+ case "billing_item_our_cost":
4801
+ push("billing_item.ourCost");
4802
+ push("contract_role_costs.rate");
4803
+ push("resource.internalCost");
4804
+ break;
4805
+ case "contract_role_cost":
4806
+ push("contract_role_costs.rate");
4807
+ push("resource.internalCost");
4808
+ break;
4809
+ case "resource_internal_cost":
4810
+ push("resource.internalCost");
4811
+ break;
4812
+ case "provided":
4813
+ break;
4814
+ }
4815
+ if (ctx.rate !== null) push("provided");
4816
+ return rungs;
4817
+ }
4818
+ function hoursOf(entry) {
4819
+ const h = entry["hoursWorked"];
4820
+ return typeof h === "number" && Number.isFinite(h) && h > 0 ? h : 0;
4821
+ }
4822
+ function resolveLabour(entry, ctx) {
4823
+ const id = num2(entry["id"]);
4824
+ const hours = hoursOf(entry);
4825
+ for (const rung of ladderFrom(ctx)) {
4826
+ if (rung === "billing_item.ourCost") {
4827
+ const items = _nullishCoalesce(ctx.billedByEntryId.get(id), () => ( []));
4828
+ const costs = items.map((i) => i["ourCost"]).filter((v) => typeof v === "number" && Number.isFinite(v) && v >= 0);
4829
+ if (costs.length > 0) {
4830
+ return {
4831
+ source: "billing_item.ourCost",
4832
+ cost: costs.reduce((a, b) => a + b, 0),
4833
+ rate: null,
4834
+ evidence: { billingItemIds: items.map((i) => num2(i["id"])) }
4835
+ };
4836
+ }
4837
+ continue;
4838
+ }
4839
+ if (rung === "contract_role_costs.rate") {
4840
+ const resId = num2(entry["resourceID"]);
4841
+ const roleId = num2(entry["roleID"]);
4842
+ const row = resId > 0 && roleId > 0 ? _nullishCoalesce(ctx.roleCostByResourceRole.get(`${resId}:${roleId}`), () => ( ctx.roleCostByRole.get(roleId))) : roleId > 0 ? ctx.roleCostByRole.get(roleId) : void 0;
4843
+ const rate = row ? row["rate"] : void 0;
4844
+ if (row !== void 0 && typeof rate === "number" && Number.isFinite(rate) && rate >= 0) {
4845
+ const matched = row !== void 0 && resId > 0 && roleId > 0 && ctx.roleCostByResourceRole.get(`${resId}:${roleId}`) !== void 0 ? "resource+role" : "role";
4846
+ return { source: "contract_role_costs.rate", cost: rate * hours, rate, evidence: { contractRoleCostId: num2(row["id"]), matched } };
4847
+ }
4848
+ continue;
4849
+ }
4850
+ if (rung === "resource.internalCost") {
4851
+ const resId = num2(entry["resourceID"]);
4852
+ const r = resId > 0 ? ctx.resourcesById.get(resId) : void 0;
4853
+ const ic = r ? r["internalCost"] : void 0;
4854
+ if (r !== void 0 && typeof ic === "number" && Number.isFinite(ic) && ic >= 0) {
4855
+ return { source: "resource.internalCost", cost: ic * hours, rate: ic, evidence: { resourceId: resId } };
4856
+ }
4857
+ continue;
4858
+ }
4859
+ if (rung === "provided" && ctx.rate !== null) {
4860
+ return { source: "provided", cost: ctx.rate * hours, rate: ctx.rate, evidence: {} };
4861
+ }
4862
+ }
4863
+ return { source: "missing", cost: null, rate: null, evidence: {} };
4864
+ }
4865
+ async function expandByMonth(http, path, fullWindowCond, limit, operation, fields, dateField, dateFrom, dateTo, wires) {
4866
+ const months = monthsBetween(dateFrom, dateTo);
4867
+ const seen = /* @__PURE__ */ new Set();
4868
+ const all = [];
4869
+ const cappedMonths = [];
4870
+ const fullMonths = [];
4871
+ for (const m of months) {
4872
+ const b = monthBounds(m, dateFrom, dateTo);
4873
+ const cond = [
4874
+ ...fullWindowCond.filter((c) => c.field !== dateField),
4875
+ { field: dateField, op: "gte", value: b.start },
4876
+ { field: dateField, op: "lte", value: b.end }
4877
+ ];
4878
+ const page = await boundedPart2(http, path, cond, limit, operation, fields);
4879
+ wires.issued += 1;
4880
+ for (const row of page.items) {
4881
+ const k = num2(row["id"]);
4882
+ if (seen.has(k)) continue;
4883
+ seen.add(k);
4884
+ all.push(row);
4885
+ }
4886
+ if (page.capped) cappedMonths.push(m);
4887
+ if (page.capped && page.hasMore) fullMonths.push(m);
4888
+ }
4889
+ const partNote = `per-month windowing fired: ${months.length} month read(s) added after the full-window page carried a live cursor (no cursor walk \u2014 the single-page house rule)` + (fullMonths.length > 0 ? ` | month ${fullMonths.join(", ")} hit the limit of ${limit} \u2014 figures cover the returned rows only; widen with a narrower window or higher limit` : "");
4890
+ wires.note = (wires.note ? wires.note + " | " : "") + partNote;
4891
+ return { items: all, capped: cappedMonths.length > 0, hasMore: fullMonths.length > 0, note: partNote, status: "ok" };
4892
+ }
4893
+ function fmtHours(h) {
4894
+ const r = Math.round(h * 100) / 100;
4895
+ return String(r);
4896
+ }
4897
+ function fmtNum(v) {
4898
+ const r = Math.round(v * 100) / 100;
4899
+ return String(r);
4900
+ }
4901
+ function pctOrNa(r) {
4902
+ return r === null ? "n/a" : `${Math.round(r * 1e3) / 10}%`;
4903
+ }
4904
+ function dedupeSortCap(ids, limit) {
4905
+ return [...new Set(ids)].sort((a, b) => Number(a) - Number(b)).slice(0, limit);
4906
+ }
4907
+ async function profitability(resource, contractId, opts, http) {
4908
+ const v = validateProfitabilityOptions(contractId, _nullishCoalesce(opts, () => ( {})));
4909
+ const OP2 = "contracts.profitability";
4910
+ const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, contractId, "contractId");
4911
+ const idNum = typeof id === "number" ? id : Number(id);
4912
+ const wires = { issued: 0, budget: PROFITABILITY_WIRE_BUDGET };
4913
+ const asOf = (/* @__PURE__ */ new Date()).toISOString();
4914
+ const asOfMs = Date.parse(asOf);
4915
+ const skipPart = (note) => ({ items: [], capped: false, hasMore: false, status: "skipped", note });
4916
+ const stampPart = (key, raw, conditions, extraNotes) => {
4917
+ const st = unbilledWorkPartStatus(key, conditions, raw.items);
4918
+ return {
4919
+ items: raw.items,
4920
+ capped: raw.capped,
4921
+ hasMore: raw.hasMore,
4922
+ status: st.status,
4923
+ blindSurface: st.blindSurface,
4924
+ note: [st.note, ..._nullishCoalesce(extraNotes, () => ( []))].filter(Boolean).join(" | ") || void 0,
4925
+ emptyReason: raw.items.length === 0 && st.status === "ok" ? _optionalChain([_chunk5N6DYKXOcjs.EMPTY_REASON_STAMPS, 'access', _29 => _29[key], 'optionalAccess', _30 => _30.query]) : void 0
4926
+ };
4927
+ };
4928
+ const contract = await resource.get(id);
4929
+ wires.issued += 1;
4930
+ const contractRow = contract;
4931
+ const companyID = num2(contractRow["companyID"]);
4932
+ let customer = null;
4933
+ let customerStatus = "skipped";
4934
+ if (companyID > 0) {
4935
+ try {
4936
+ const res = await http.request({
4937
+ method: "GET",
4938
+ path: `/V1.0/Companies/${companyID}`,
4939
+ operation: OP2
4940
+ });
4941
+ const item = _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, companyID, OP2);
4942
+ customer = _nullishCoalesce(item, () => ( null));
4943
+ customerStatus = "ok";
4944
+ } catch (err) {
4945
+ if (!(err instanceof _chunk5N6DYKXOcjs.NotFoundError)) throw err;
4946
+ }
4947
+ wires.issued += 1;
4948
+ }
4949
+ const servicesCond = [{ field: "contractID", op: "eq", value: id }];
4950
+ const servicesRaw = await boundedPart2(http, "/V1.0/ContractServices/query", servicesCond, v.limit, OP2, ["id", "serviceID", "unitPrice", "unitCost", "internalCurrencyUnitPrice", "internalDescription"]);
4951
+ wires.issued += 1;
4952
+ const unitsCond = [{ field: "contractID", op: "eq", value: id }];
4953
+ const unitsRaw = await boundedPart2(http, "/V1.0/ContractServiceUnits/query", unitsCond, v.limit, OP2, ["id", "contractServiceID", "serviceID", "units", "price", "cost", "internalCurrencyPrice", "startDate", "endDate", "approveAndPostDate"]);
4954
+ wires.issued += 1;
4955
+ let chargesPart;
4956
+ let charges = [];
4957
+ let chargesCond = [];
4958
+ if (v.includeRecurringCosts) {
4959
+ chargesCond = [{ field: "contractID", op: "eq", value: id }, { field: "datePurchased", op: "gte", value: v.dateFrom }, { field: "datePurchased", op: "lte", value: v.dateTo }];
4960
+ const raw = await boundedPart2(http, "/V1.0/ContractCharges/query", chargesCond, v.limit, OP2, ["id", "chargeType", "billableAmount", "extendedCost", "unitCost", "unitPrice", "unitQuantity", "datePurchased", "isBilled", "status", "contractServiceID"]);
4961
+ wires.issued += 1;
4962
+ charges = raw.items;
4963
+ chargesPart = stampPart("contract_charges", raw, chargesCond);
4964
+ } else {
4965
+ chargesPart = skipPart("skipped: includeRecurringCosts is false (zero wire)");
4966
+ }
4967
+ const roleCostsCond = [{ field: "contractID", op: "eq", value: id }];
4968
+ const roleCostsRaw = await boundedPart2(http, "/V1.0/ContractRoleCosts/query", roleCostsCond, v.limit, OP2, ["id", "rate", "resourceID", "roleID"]);
4969
+ wires.issued += 1;
4970
+ const ratesCond = [{ field: "contractID", op: "eq", value: id }];
4971
+ const ratesRaw = await boundedPart2(http, "/V1.0/ContractRates/query", ratesCond, v.limit, OP2, ["id", "roleID", "contractHourlyRate", "internalCurrencyContractHourlyRate"]);
4972
+ wires.issued += 1;
4973
+ const billingCond = () => [{ field: "contractID", op: "eq", value: id }, { field: "itemDate", op: "gte", value: v.dateFrom }, { field: "itemDate", op: "lte", value: v.dateTo }];
4974
+ const billingFields = ["id", "invoiceID", "timeEntryID", "ticketID", "ourCost", "quantity", "rate", "extendedPrice", "itemDate", "postedDate", "nonBillable", "billingCodeID", "billingItemType"];
4975
+ const billingFirst = await boundedPart2(http, "/V1.0/BillingItems/query", billingCond(), v.limit, OP2, billingFields);
4976
+ wires.issued += 1;
4977
+ let billingItems;
4978
+ let billingRows = [];
4979
+ if (!billingFirst.hasMore) {
4980
+ const st = unbilledWorkPartStatus("billing_items", billingCond(), billingFirst.items);
4981
+ billingRows = billingFirst.items;
4982
+ billingItems = { items: billingFirst.items, capped: billingFirst.capped, hasMore: false, status: st.status, blindSurface: st.blindSurface, note: st.note, emptyReason: billingFirst.items.length === 0 && st.status === "ok" ? _optionalChain([_chunk5N6DYKXOcjs.EMPTY_REASON_STAMPS, 'access', _31 => _31.billing_items, 'optionalAccess', _32 => _32.query]) : void 0 };
4983
+ } else {
4984
+ const wp = await expandByMonth(http, "/V1.0/BillingItems/query", billingCond(), v.limit, OP2, billingFields, "itemDate", v.dateFrom, v.dateTo, wires);
4985
+ billingRows = wp.items;
4986
+ billingItems = { ...wp, items: wp.items, note: wp.note };
4987
+ }
4988
+ const invoiceIds = [...new Set(billingRows.map((b) => num2(b["invoiceID"])).filter((n) => n > 0))];
4989
+ let invoicesPart;
4990
+ let invoices = [];
4991
+ if (invoiceIds.length === 0) {
4992
+ invoicesPart = skipPart("skipped: the billing part has no invoiceIDs (zero wire)");
4993
+ } else {
4994
+ const capped = capJoinSet2(invoiceIds, _chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS);
4995
+ if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `invoiceJoinTruncated: the join set is capped at ${_chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS} of ${capped.total} invoice ids (the fetch-by-ids cap) \u2014 the figures cover the returned set only`;
4996
+ const fb = await fetchByIdsPart(http, "/V1.0/Invoices", capped.ids, ["id", "invoiceNumber", "invoiceTotal", "paidDate", "isVoided", "dueDate"], OP2);
4997
+ wires.issued += 1;
4998
+ invoices = fb.items;
4999
+ invoicesPart = { items: fb.items, capped: capped.truncated, hasMore: capped.truncated, status: "ok", note: fb.notes.join(" | ") || void 0 };
5000
+ }
5001
+ const timeCond = () => [{ field: "contractID", op: "eq", value: id }, { field: "dateWorked", op: "gte", value: v.dateFrom }, { field: "dateWorked", op: "lte", value: v.dateTo }];
5002
+ const timeFields = ["id", "ticketID", "taskID", "resourceID", "roleID", "hoursWorked", "hoursToBill", "dateWorked", "startDateTime", "endDateTime", "isNonBillable", "timeEntryType", "billingCodeID", "createDateTime"];
5003
+ const timeFirst = await boundedPart2(http, "/V1.0/TimeEntries/query", timeCond(), v.limit, OP2, timeFields);
5004
+ wires.issued += 1;
5005
+ let timeEntries;
5006
+ let entries = [];
5007
+ if (!timeFirst.hasMore) {
5008
+ const st = unbilledWorkPartStatus("time_entries", timeCond(), timeFirst.items);
5009
+ entries = timeFirst.items;
5010
+ timeEntries = { items: timeFirst.items, capped: timeFirst.capped, hasMore: false, status: st.status, blindSurface: st.blindSurface, note: st.note, emptyReason: timeFirst.items.length === 0 && st.status === "ok" ? _optionalChain([_chunk5N6DYKXOcjs.EMPTY_REASON_STAMPS, 'access', _33 => _33.time_entries, 'optionalAccess', _34 => _34.query]) : void 0 };
5011
+ } else {
5012
+ const wp = await expandByMonth(http, "/V1.0/TimeEntries/query", timeCond(), v.limit, OP2, timeFields, "dateWorked", v.dateFrom, v.dateTo, wires);
5013
+ entries = wp.items;
5014
+ timeEntries = { ...wp, items: wp.items, note: wp.note };
5015
+ }
5016
+ const ticketFields = ["id", "ticketNumber", "title", "status", "ticketCategory", "contractID", "createDate", "resolvedDateTime", "completedDate", "lastActivityDate", "dueDateTime"];
5017
+ const ticketsActCond = [{ field: "contractID", op: "eq", value: id }, { field: "createDate", op: "gte", value: v.dateFrom }, { field: "createDate", op: "lte", value: v.dateTo }];
5018
+ const ticketsActRaw = await boundedPart2(http, "/V1.0/Tickets/query", ticketsActCond, v.limit, OP2, ticketFields);
5019
+ wires.issued += 1;
5020
+ let openStatusSet = null;
5021
+ let statusNote;
5022
+ try {
5023
+ const res = await http.request({ method: "GET", path: "/V1.0/Tickets/entityInformation/fields", operation: OP2 });
5024
+ wires.issued += 1;
5025
+ const body = typeof res === "object" && res !== null ? res : {};
5026
+ const fields = Array.isArray(body["fields"]) ? body["fields"] : [];
5027
+ const statusRow = fields.find((f) => f["name"] === "status" && f["isPickList"] === true);
5028
+ const values = statusRow && Array.isArray(statusRow["picklistValues"]) ? statusRow["picklistValues"] : [];
5029
+ if (values.length === 0) {
5030
+ statusNote = "the tickets.status picklist is not exposed to this API user \u2014 the open-status labels are unavailable";
5031
+ } else {
5032
+ const open = values.filter((p) => typeof p["value"] === "string" && !CLOSED_STATUS_LABEL_RE.test(String(_nullishCoalesce(p["label"], () => ( ""))))).map((p) => Number.parseInt(String(p["value"]), 10)).filter((n) => Number.isFinite(n));
5033
+ if (open.length === 0) {
5034
+ statusNote = "every tickets.status picklist label is closed-class \u2014 no open statuses exist in this tenant";
5035
+ } else {
5036
+ openStatusSet = new Set(open);
5037
+ }
5038
+ }
5039
+ } catch (err) {
5040
+ wires.issued += 1;
5041
+ statusNote = `the tickets.status field catalog read failed (${err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.code : "SERVER_ERROR"}: ${err instanceof Error ? err.message : String(err)}) \u2014 the open-status labels are unavailable`;
5042
+ }
5043
+ let ticketsOpenPart;
5044
+ let openTickets = [];
5045
+ if (openStatusSet === null) {
5046
+ ticketsOpenPart = skipPart(`skipped: ${statusNote} (zero wire)`);
5047
+ } else {
5048
+ const openCond = [{ field: "contractID", op: "eq", value: id }, { field: "status", op: "in", value: [...openStatusSet] }];
5049
+ const raw = await boundedPart2(http, "/V1.0/Tickets/query", openCond, v.limit, OP2, ticketFields);
5050
+ wires.issued += 1;
5051
+ openTickets = raw.items;
5052
+ ticketsOpenPart = stampPart("tickets", raw, openCond, ["openStatusHeuristic: true (the open set is the tenant picklist minus the closed-class labels)"]);
5053
+ }
5054
+ const resourceIds = [...new Set(entries.map((t) => num2(t["resourceID"])).filter((n) => n > 0))];
5055
+ let resourcesPart;
5056
+ let resources = [];
5057
+ const resourceMissIds = /* @__PURE__ */ new Set();
5058
+ if (resourceIds.length === 0) {
5059
+ resourcesPart = skipPart("skipped: the time part has no resourceIDs (zero wire)");
5060
+ } else {
5061
+ const capped = capJoinSet2(resourceIds, _chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS);
5062
+ if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `resourceJoinTruncated: the join set is capped at ${_chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS} of ${capped.total} resource ids (the fetch-by-ids cap) \u2014 the figures cover the returned set only`;
5063
+ const fb = await fetchByIdsPart(http, "/V1.0/Resources", capped.ids, ["id", "internalCost", "firstName", "lastName", "isActive", "userType"], OP2);
5064
+ wires.issued += 1;
5065
+ resources = fb.items;
5066
+ for (const m of fb.misses) if (m.code === "NOT_FOUND") resourceMissIds.add(m.id);
5067
+ resourcesPart = { items: fb.items, capped: capped.truncated, hasMore: capped.truncated, status: "ok", note: fb.notes.join(" | ") || void 0 };
5068
+ }
5069
+ const fetchedTickets = /* @__PURE__ */ new Map();
5070
+ for (const t of [...ticketsActRaw.items, ...openTickets]) {
5071
+ const k = num2(t["id"]);
5072
+ if (k > 0 && !fetchedTickets.has(k)) fetchedTickets.set(k, t);
5073
+ }
5074
+ const ticketJoin = capJoinSet2([...fetchedTickets.keys()], v.maxTicketsForJoin);
5075
+ const joinNote = ticketJoin.truncated ? `the ticket join set is capped at ${v.maxTicketsForJoin} of ${ticketJoin.total} ids \u2014 the expenses + the miscoding probe cover the returned join set only` : void 0;
5076
+ let expensesPart;
5077
+ let expenses = [];
5078
+ if (ticketJoin.ids.length === 0) {
5079
+ expensesPart = skipPart("skipped: the contract has no fetched tickets to join against (an empty join set is NOT evidence of no expenses \u2014 zero wire)");
5080
+ } else {
5081
+ const expCond = [{ field: "ticketID", op: "in", value: ticketJoin.ids }, { field: "expenseDate", op: "gte", value: v.dateFrom }, { field: "expenseDate", op: "lte", value: v.dateTo }];
5082
+ const raw = await boundedPart2(http, "/V1.0/ExpenseItems/query", expCond, v.limit, OP2, ["id", "expenseDate", "expenseCategory", "paymentType", "expenseCurrencyExpenseAmount", "internalCurrencyExpenseAmount", "ticketID"]);
5083
+ wires.issued += 1;
5084
+ expenses = raw.items;
5085
+ expensesPart = stampPart("expense_items", raw, expCond, joinNote === void 0 ? void 0 : [joinNote]);
5086
+ }
5087
+ let probePart;
5088
+ let probeRows = [];
5089
+ if (ticketJoin.ids.length === 0) {
5090
+ probePart = skipPart("skipped: the contract has no fetched tickets to probe against (zero wire) \u2014 check 1 (miscoded_time_out) is not evaluable");
5091
+ } else {
5092
+ const probeCond = [
5093
+ { field: "ticketID", op: "in", value: ticketJoin.ids },
5094
+ { op: "or", items: [{ field: "contractID", op: "noteq", value: id }, { field: "contractID", op: "notExist" }] },
5095
+ { field: "dateWorked", op: "gte", value: v.dateFrom },
5096
+ { field: "dateWorked", op: "lte", value: v.dateTo }
5097
+ ];
5098
+ const raw = await boundedPart2(http, "/V1.0/TimeEntries/query", probeCond, v.limit, OP2, ["id", "ticketID", "contractID", "resourceID", "hoursWorked", "dateWorked"]);
5099
+ wires.issued += 1;
5100
+ probeRows = raw.items;
5101
+ probePart = stampPart("time_entries", raw, probeCond, joinNote === void 0 ? void 0 : [joinNote]);
5102
+ }
5103
+ let configurationItemsPart;
5104
+ let cis = [];
5105
+ let ciCond = [];
5106
+ if (!v.includeRecurringCosts) {
5107
+ configurationItemsPart = skipPart("skipped: includeRecurringCosts is false (zero wire)");
5108
+ } else if (companyID <= 0) {
5109
+ configurationItemsPart = skipPart("skipped: the contract carries no companyID \u2014 the CI join has no root (zero wire)");
5110
+ } else {
5111
+ ciCond = [{ field: "companyID", op: "eq", value: companyID }];
5112
+ const raw = await boundedPart2(http, "/V1.0/ConfigurationItems/query", ciCond, v.limit, OP2, ["id", "configurationItemName", "status"]);
5113
+ wires.issued += 1;
5114
+ cis = raw.items;
5115
+ configurationItemsPart = stampPart("configuration_items", raw, ciCond);
5116
+ }
5117
+ let subscriptionsPart;
5118
+ let subscriptions = [];
5119
+ if (cis.length === 0) {
5120
+ subscriptionsPart = skipPart("skipped: the CI join found no configuration items \u2014 the subscriptions part is not evaluable (zero wire)");
5121
+ } else {
5122
+ const ciIds = capJoinSet2(cis.map((c) => num2(c["id"])).filter((n) => n > 0), _chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS);
5123
+ const subCond = [{ field: "configurationItemID", op: "in", value: ciIds.ids }];
5124
+ const raw = await boundedPart2(http, "/V1.0/Subscriptions/query", subCond, v.limit, OP2, ["id", "subscriptionName", "configurationItemID", "periodCost", "periodPrice", "periodType", "effectiveDate", "expirationDate", "status", "totalCost"]);
5125
+ wires.issued += 1;
5126
+ subscriptions = raw.items;
5127
+ subscriptionsPart = stampPart("subscriptions", raw, subCond);
5128
+ }
5129
+ const servicesPart = stampPart("contract_services", servicesRaw, servicesCond);
5130
+ const unitsPart = stampPart("contract_service_units", unitsRaw, unitsCond);
5131
+ const roleCostsPart = stampPart("contract_role_costs", roleCostsRaw, roleCostsCond);
5132
+ const ratesPart = stampPart("contract_rates", ratesRaw, ratesCond);
5133
+ const ticketsActivityPart = stampPart("tickets", ticketsActRaw, ticketsActCond, ticketsActRaw.hasMore ? [`${fetchedTickets.size} ticket(s) returned of possibly more \u2014 the checks cover the returned set only`] : void 0);
5134
+ const billedByEntryId = /* @__PURE__ */ new Map();
5135
+ for (const b of billingRows) {
5136
+ const te = num2(b["timeEntryID"]);
5137
+ if (te <= 0) continue;
5138
+ const arr = _nullishCoalesce(billedByEntryId.get(te), () => ( []));
5139
+ arr.push(b);
5140
+ billedByEntryId.set(te, arr);
5141
+ }
5142
+ const roleCostByResourceRole = /* @__PURE__ */ new Map();
5143
+ const roleCostByRole = /* @__PURE__ */ new Map();
5144
+ for (const rc of roleCostsRaw.items) {
5145
+ const resId = num2(rc["resourceID"]);
5146
+ const roleId = num2(rc["roleID"]);
5147
+ if (resId > 0 && roleId > 0) roleCostByResourceRole.set(`${resId}:${roleId}`, rc);
5148
+ else if (roleId > 0) roleCostByRole.set(roleId, rc);
5149
+ }
5150
+ const resourcesById = new Map(resources.map((r) => [num2(r["id"]), r]));
5151
+ const ladderCtx = { method: v.method, rate: v.labourRatePerHour, billedByEntryId, roleCostByResourceRole, roleCostByRole, resourcesById, resourceMissIds };
5152
+ const entryResolution = /* @__PURE__ */ new Map();
5153
+ for (const e of entries) entryResolution.set(num2(e["id"]), resolveLabour(e, ladderCtx));
5154
+ const activeRungs = ladderFrom(ladderCtx);
5155
+ const sources = {};
5156
+ for (const rung of activeRungs) sources[rung] = { entries: 0, hours: 0, cost: 0 };
5157
+ sources.missing = { entries: 0, hours: 0, cost: 0 };
5158
+ const resolutionNotes = [];
5159
+ if (v.method === "billing_item_our_cost") {
5160
+ const noItems = entries.filter((e) => !billedByEntryId.has(num2(e["id"]))).length;
5161
+ if (noItems > 0) resolutionNotes.push(`${noItems} ${noItems === 1 ? "entry" : "entries"} had no billing item (non-billable or unposted) \u2014 rung 1 not usable`);
5162
+ }
5163
+ for (const resId of [...resourceMissIds].sort((a, b) => a - b)) {
5164
+ const n = entries.filter((e) => num2(e["resourceID"]) === resId).length;
5165
+ resolutionNotes.push(`resource ${resId} unreadable (fetchByIds NOT_FOUND) \u2014 rung 3 unavailable for ${n} ${n === 1 ? "entry" : "entries"}`);
5166
+ }
5167
+ for (const e of entries) {
5168
+ const r = entryResolution.get(num2(e["id"]));
5169
+ const bucket = _nullishCoalesce(sources[r.source], () => ( sources.missing));
5170
+ bucket.entries += 1;
5171
+ bucket.hours += hoursOf(e);
5172
+ bucket.cost += _nullishCoalesce(r.cost, () => ( 0));
5173
+ }
5174
+ const unresolvedHours = sources.missing.hours;
5175
+ if (unresolvedHours > 0) resolutionNotes.push(`${fmtHours(unresolvedHours)} hours unresolved (missing rate) \u2014 total_cost is a lower bound`);
5176
+ const costRateResolution = { method: v.method, sources, unresolvedHours, notes: resolutionNotes };
5177
+ const months = monthsBetween(v.dateFrom, v.dateTo);
5178
+ const monthOf = (date) => typeof date === "string" && DATE_RE2.test(`${date}`.slice(0, 10)) ? date.slice(0, 7) : null;
5179
+ const inMonth = (date, m) => monthOf(date) === m;
5180
+ const unitEffectiveIn = (unit, m) => {
5181
+ const s = monthOf(unit["startDate"]);
5182
+ const e = monthOf(unit["endDate"]);
5183
+ return (s === null || s <= m) && (e === null || e >= m);
5184
+ };
5185
+ const serviceById = new Map(servicesRaw.items.map((s) => [num2(s["id"]), s]));
5186
+ const expectedBasis = servicesRaw.items.length > 0 || unitsRaw.items.length > 0;
5187
+ const expectedIn = (m) => {
5188
+ let total = 0;
5189
+ for (const u of unitsRaw.items) {
5190
+ if (!unitEffectiveIn(u, m)) continue;
5191
+ const svc = serviceById.get(num2(u["contractServiceID"]));
5192
+ if (svc === void 0) continue;
5193
+ total += num2(svc["unitPrice"]) * num2(u["units"]);
5194
+ }
5195
+ return total;
5196
+ };
5197
+ const recurringIn = (m) => {
5198
+ if (!v.includeRecurringCosts) return 0;
5199
+ let total = 0;
5200
+ for (const c of charges) if (inMonth(c["datePurchased"], m)) total += num2(c["billableAmount"]);
5201
+ for (const u of unitsRaw.items) if (unitEffectiveIn(u, m)) total += num2(u["cost"]);
5202
+ return total;
5203
+ };
5204
+ const invoicesById = new Map(invoices.map((i) => [num2(i["id"]), i]));
5205
+ const monthly = [];
5206
+ for (let mi = 0; mi < months.length; mi++) {
5207
+ const m = months[mi];
5208
+ const mBilling = billingRows.filter((b) => inMonth(b["itemDate"], m));
5209
+ let revenueInvoiced = 0;
5210
+ let revenueVoided = 0;
5211
+ const billedItemIds = [];
5212
+ for (const b of mBilling) {
5213
+ const invId = num2(b["invoiceID"]);
5214
+ const inv = invId > 0 ? invoicesById.get(invId) : void 0;
5215
+ if (inv === void 0) continue;
5216
+ if (inv["isVoided"] === true) revenueVoided += num2(b["extendedPrice"]);
5217
+ else {
5218
+ revenueInvoiced += num2(b["extendedPrice"]);
5219
+ billedItemIds.push(num2(b["id"]));
5220
+ }
5221
+ }
5222
+ const expected = v.includeUnbilledRevenue && expectedBasis ? expectedIn(m) : null;
5223
+ const expectedUnbilled = expected === null ? 0 : Math.max(0, expected - revenueInvoiced);
5224
+ const mEntries = entries.filter((e) => inMonth(e["dateWorked"], m));
5225
+ let labourHours = 0;
5226
+ let labourTotal = 0;
5227
+ let unresolved = 0;
5228
+ const rateSources = {};
5229
+ for (const rung of activeRungs) rateSources[rung] = { entries: 0, hours: 0, cost: 0 };
5230
+ rateSources.missing = { entries: 0, hours: 0, cost: 0 };
5231
+ for (const e of mEntries) {
5232
+ const r = entryResolution.get(num2(e["id"]));
5233
+ labourHours += num2(e["hoursWorked"]);
5234
+ const bucket = rateSources[r.source];
5235
+ bucket.entries += 1;
5236
+ bucket.hours += hoursOf(e);
5237
+ bucket.cost += _nullishCoalesce(r.cost, () => ( 0));
5238
+ if (r.source === "missing") unresolved += hoursOf(e);
5239
+ else labourTotal += _nullishCoalesce(r.cost, () => ( 0));
5240
+ }
5241
+ let toolingVendor = subscriptionsPart.status === "skipped" ? null : 0;
5242
+ if (toolingVendor !== null) {
5243
+ for (const s of subscriptions) {
5244
+ const eff = _nullishCoalesce(monthOf(s["effectiveDate"]), () => ( "0000-00"));
5245
+ const exp = _nullishCoalesce(monthOf(s["expirationDate"]), () => ( "9999-99"));
5246
+ if (eff <= m && m <= exp) toolingVendor += num2(s["periodCost"]);
5247
+ }
5248
+ }
5249
+ const callerSupplied = _nullishCoalesce(v.externalMonthlyCosts[mi], () => ( 0));
5250
+ const recurring = recurringIn(m);
5251
+ let expenseCost = 0;
5252
+ for (const x of expenses) if (inMonth(x["expenseDate"], m)) expenseCost += num2(x["expenseCurrencyExpenseAmount"]);
5253
+ const totalCost = labourTotal + (_nullishCoalesce(toolingVendor, () => ( 0))) + callerSupplied + recurring + expenseCost;
5254
+ const profit = revenueInvoiced - totalCost;
5255
+ const margin = revenueInvoiced > 0 ? profit / revenueInvoiced : null;
5256
+ const fixed = totalCost - labourTotal;
5257
+ const resolvedHours = mEntries.filter((e) => entryResolution.get(num2(e["id"])).source !== "missing").reduce((a, e) => a + hoursOf(e), 0);
5258
+ const breakEven = resolvedHours > 0 ? fixed <= 0 ? 0 : fixed / (labourTotal / resolvedHours) : null;
5259
+ monthly.push({
5260
+ month: m,
5261
+ revenue_invoiced: revenueInvoiced,
5262
+ revenue_voided_excluded: revenueVoided,
5263
+ revenue_expected: expected,
5264
+ revenue_expected_unbilled: expectedUnbilled,
5265
+ labour_hours: labourHours,
5266
+ labour_cost: { total: labourTotal, unresolvedHours: unresolved, rateSources },
5267
+ tooling_cost: { vendor: toolingVendor, caller_supplied: callerSupplied },
5268
+ recurring_cost: recurring,
5269
+ expense_cost: expenseCost,
5270
+ total_cost: totalCost,
5271
+ profit,
5272
+ margin,
5273
+ break_even_hours: breakEven
5274
+ });
5275
+ }
5276
+ const warnings = [];
5277
+ warnings.push({
5278
+ code: "miscoded_time_out",
5279
+ count: probeRows.length,
5280
+ sample_ids: dedupeSortCap(probeRows.map((p) => num2(p["id"])), v.limit)
5281
+ });
5282
+ const crossTimeEntries = entries.filter((e) => {
5283
+ const t = num2(e["ticketID"]);
5284
+ if (t <= 0) return false;
5285
+ const ticket = fetchedTickets.get(t);
5286
+ return ticket !== void 0 && num2(ticket["contractID"]) !== idNum;
5287
+ });
5288
+ warnings.push({ code: "cross_contract_ticket_time", count: crossTimeEntries.length, sample_ids: dedupeSortCap(crossTimeEntries.map((e) => num2(e["id"])), v.limit) });
5289
+ const tupleGroups = /* @__PURE__ */ new Map();
5290
+ for (const e of entries) {
5291
+ const key = [String(num2(e["resourceID"])), String(_nullishCoalesce(e["dateWorked"], () => ( ""))), String(num2(e["ticketID"])), String(_nullishCoalesce(e["hoursWorked"], () => ( "")))].join("|");
5292
+ const arr = _nullishCoalesce(tupleGroups.get(key), () => ( []));
5293
+ arr.push(e);
5294
+ tupleGroups.set(key, arr);
5295
+ }
5296
+ const dupAll = [];
5297
+ const dupSample = [];
5298
+ for (const group of tupleGroups.values()) {
5299
+ if (group.length < 2) continue;
5300
+ const sorted = [...group].sort((a, b) => num2(a["id"]) - num2(b["id"]));
5301
+ for (const e of sorted) dupAll.push(num2(e["id"]));
5302
+ for (const e of sorted.slice(1)) dupSample.push(num2(e["id"]));
5303
+ }
5304
+ warnings.push({ code: "duplicate_entries", count: dupAll.length, sample_ids: dedupeSortCap(dupSample, v.limit) });
5305
+ const zeroHours = entries.filter((e) => {
5306
+ const h = e["hoursWorked"];
5307
+ return !(typeof h === "number" && Number.isFinite(h) && h > 0);
5308
+ });
5309
+ warnings.push({ code: "zero_negative_hours", count: zeroHours.length, sample_ids: dedupeSortCap(zeroHours.map((e) => num2(e["id"])), v.limit) });
5310
+ const outPeriod = entries.filter((e) => {
5311
+ const t = num2(e["ticketID"]);
5312
+ if (t <= 0) return false;
5313
+ const ticket = fetchedTickets.get(t);
5314
+ if (ticket === void 0) return false;
5315
+ const dW = dateToDay(e["dateWorked"]);
5316
+ if (dW === null) return false;
5317
+ const created = dateToDay(ticket["createDate"]);
5318
+ if (created !== null && dW < created) return true;
5319
+ const ends = [dateToDay(ticket["resolvedDateTime"]), dateToDay(ticket["completedDate"])].filter((d) => d !== null);
5320
+ if (ends.length > 0 && dW > Math.min(...ends)) return true;
5321
+ return false;
5322
+ });
5323
+ warnings.push({ code: "time_outside_ticket_period", count: outPeriod.length, sample_ids: dedupeSortCap(outPeriod.map((e) => num2(e["id"])), v.limit) });
5324
+ const missingRate = entries.filter((e) => entryResolution.get(num2(e["id"])).source === "missing");
5325
+ warnings.push({ code: "missing_cost_rate", count: missingRate.length, sample_ids: dedupeSortCap(missingRate.map((e) => num2(e["id"])), v.limit) });
5326
+ let driftCount = 0;
5327
+ const driftIds = /* @__PURE__ */ new Set();
5328
+ if (v.includeRecurringCosts) {
5329
+ for (let i = 1; i < months.length; i++) {
5330
+ const r1 = recurringIn(months[i]);
5331
+ const r0 = recurringIn(months[i - 1]);
5332
+ if (r1 <= 0 || r0 <= 0 || Math.abs(r1 - r0) <= RECURRING_DRIFT_EPSILON) continue;
5333
+ driftCount += 1;
5334
+ const mA = months[i - 1];
5335
+ const mB = months[i];
5336
+ for (const c of charges) {
5337
+ const cA = inMonth(c["datePurchased"], mA) ? num2(c["billableAmount"]) : 0;
5338
+ const cB = inMonth(c["datePurchased"], mB) ? num2(c["billableAmount"]) : 0;
5339
+ if (Math.abs(cB - cA) > 0) driftIds.add(num2(c["id"]));
5340
+ }
5341
+ for (const u of unitsRaw.items) {
5342
+ const cA = unitEffectiveIn(u, mA) ? num2(u["cost"]) : 0;
5343
+ const cB = unitEffectiveIn(u, mB) ? num2(u["cost"]) : 0;
5344
+ if (Math.abs(cB - cA) > 0) driftIds.add(num2(u["id"]));
5345
+ }
5346
+ }
5347
+ }
5348
+ warnings.push({ code: "recurring_cost_drift", count: driftCount, sample_ids: dedupeSortCap([...driftIds], v.limit) });
5349
+ let expectedUnbilledCount = 0;
5350
+ const expectedUnbilledSamples = [];
5351
+ if (v.includeUnbilledRevenue) {
5352
+ for (let mi = 0; mi < months.length; mi++) {
5353
+ const m = months[mi];
5354
+ const expected = expectedBasis ? expectedIn(m) : null;
5355
+ if (expected === null) continue;
5356
+ const mBilling = billingRows.filter((b) => inMonth(b["itemDate"], m));
5357
+ let billed = 0;
5358
+ const ids = [];
5359
+ for (const b of mBilling) {
5360
+ const invId = num2(b["invoiceID"]);
5361
+ const inv = invId > 0 ? invoicesById.get(invId) : void 0;
5362
+ if (inv === void 0 || inv["isVoided"] === true) continue;
5363
+ billed += num2(b["extendedPrice"]);
5364
+ ids.push(num2(b["id"]));
5365
+ }
5366
+ if (expected > billed + 5e-3) {
5367
+ expectedUnbilledCount += 1;
5368
+ for (const i of ids) expectedUnbilledSamples.push(i);
5369
+ }
5370
+ }
5371
+ }
5372
+ warnings.push({ code: "expected_unbilled_revenue", count: expectedUnbilledCount, sample_ids: dedupeSortCap(expectedUnbilledSamples, v.limit) });
5373
+ const driftTickets = [...fetchedTickets.values()].filter((t) => num2(t["contractID"]) !== idNum);
5374
+ const unresolvedRefs = entries.filter((e) => num2(e["ticketID"]) > 0 && !fetchedTickets.has(num2(e["ticketID"])));
5375
+ warnings.push({
5376
+ code: "cross_contract_tickets",
5377
+ count: driftTickets.length + unresolvedRefs.length,
5378
+ sample_ids: dedupeSortCap([...driftTickets.map((t) => num2(t["id"])), ...unresolvedRefs.map((e) => num2(e["id"]))], v.limit)
5379
+ });
5380
+ const stale = [];
5381
+ if (openStatusSet !== null) {
5382
+ for (const t of fetchedTickets.values()) {
5383
+ const status = t["status"];
5384
+ if (typeof status !== "number" || !openStatusSet.has(status)) continue;
5385
+ const lastDay = dateToDay(t["lastActivityDate"]);
5386
+ if (lastDay === null) continue;
5387
+ const days = asOfMs / 864e5 - lastDay;
5388
+ if (days > v.staleAfterDays) stale.push(num2(t["id"]));
5389
+ }
5390
+ }
5391
+ warnings.push({ code: "open_stale_tickets", count: stale.length, sample_ids: dedupeSortCap(stale, v.limit) });
5392
+ let estimateCount = 0;
5393
+ const estimateSample = [];
5394
+ let estimateNote;
5395
+ {
5396
+ const actualRevenue = monthly.reduce((a, r) => a + r.revenue_invoiced, 0);
5397
+ const actualCost = monthly.reduce((a, r) => a + r.total_cost, 0);
5398
+ const termStart = dateToDay(contractRow["startDate"]);
5399
+ const termEnd = dateToDay(contractRow["endDate"]);
5400
+ const fromDay = dateToDay(v.dateFrom);
5401
+ const toDay = dateToDay(v.dateTo);
5402
+ if (termStart !== null && termEnd !== null && fromDay !== null && toDay !== null) {
5403
+ const overlapStart = Math.max(termStart, fromDay);
5404
+ const overlapEnd = Math.min(termEnd, toDay);
5405
+ const termDays = termEnd - termStart + 1;
5406
+ const overlapDays = overlapEnd >= overlapStart ? overlapEnd - overlapStart + 1 : 0;
5407
+ if (termDays > 0 && overlapDays > 0) {
5408
+ const frac = overlapDays / termDays;
5409
+ const estRev = num2(contractRow["estimatedRevenue"]);
5410
+ const estCost = num2(contractRow["estimatedCost"]);
5411
+ const devRev = estRev > 0 ? Math.abs(actualRevenue - estRev * frac) / (estRev * frac) : null;
5412
+ const devCost = estCost > 0 ? Math.abs(actualCost - estCost * frac) / (estCost * frac) : null;
5413
+ if (devRev !== null && devRev > ESTIMATE_DEVIATION_THRESHOLD_PCT / 100 || devCost !== null && devCost > ESTIMATE_DEVIATION_THRESHOLD_PCT / 100) {
5414
+ estimateCount = 1;
5415
+ estimateSample.push(idNum);
5416
+ }
5417
+ estimateNote = `estimate vs actual (window-prorated ${overlapDays}/${termDays} days): revenue ${pctOrNa(devRev)} deviation (actual ${fmtNum(actualRevenue)} vs prorated ${fmtNum(estRev * frac)}), cost ${pctOrNa(devCost)} deviation (actual ${fmtNum(actualCost)} vs prorated ${fmtNum(estCost * frac)})`;
5418
+ }
5419
+ }
5420
+ }
5421
+ warnings.push({ code: "estimate_vs_actual", count: estimateCount, sample_ids: estimateSample, ...estimateCount === 1 && estimateNote !== void 0 ? { note: estimateNote } : {} });
5422
+ const entriesByTicket = /* @__PURE__ */ new Map();
5423
+ for (const e of entries) {
5424
+ const t = num2(e["ticketID"]);
5425
+ if (t <= 0) continue;
5426
+ const arr = _nullishCoalesce(entriesByTicket.get(t), () => ( []));
5427
+ arr.push(e);
5428
+ entriesByTicket.set(t, arr);
5429
+ }
5430
+ const expenseByTicket = /* @__PURE__ */ new Map();
5431
+ for (const x of expenses) {
5432
+ const t = num2(x["ticketID"]);
5433
+ if (t <= 0) continue;
5434
+ expenseByTicket.set(t, (_nullishCoalesce(expenseByTicket.get(t), () => ( 0))) + num2(x["expenseCurrencyExpenseAmount"]));
5435
+ }
5436
+ const ticketCost = (t) => {
5437
+ const tid = num2(t["id"]);
5438
+ const es = _nullishCoalesce(entriesByTicket.get(tid), () => ( []));
5439
+ let cost = _nullishCoalesce(expenseByTicket.get(tid), () => ( 0));
5440
+ for (const e of es) cost += _nullishCoalesce(entryResolution.get(num2(e["id"])).cost, () => ( 0));
5441
+ return cost;
5442
+ };
5443
+ const ticketHours = (t) => (_nullishCoalesce(entriesByTicket.get(num2(t["id"])), () => ( []))).reduce((a, e) => a + num2(e["hoursWorked"]), 0);
5444
+ const allTickets = [...fetchedTickets.values()];
5445
+ const activityCategories = [];
5446
+ if (v.groupByActivity) {
5447
+ const byCat = /* @__PURE__ */ new Map();
5448
+ for (const t of allTickets) {
5449
+ const cat = num2(t["ticketCategory"]) > 0 ? num2(t["ticketCategory"]) : null;
5450
+ const arr = _nullishCoalesce(byCat.get(cat), () => ( []));
5451
+ arr.push(t);
5452
+ byCat.set(cat, arr);
5453
+ }
5454
+ for (const [cat, tickets] of byCat) {
5455
+ let entryCount = 0;
5456
+ let hours = 0;
5457
+ let cost = 0;
5458
+ for (const t of tickets) {
5459
+ const es = _nullishCoalesce(entriesByTicket.get(num2(t["id"])), () => ( []));
5460
+ entryCount += es.length;
5461
+ hours += es.reduce((a, e) => a + num2(e["hoursWorked"]), 0);
5462
+ cost += ticketCost(t);
5463
+ }
5464
+ activityCategories.push({
5465
+ ticketCategory: cat,
5466
+ ticketCount: tickets.length,
5467
+ entryCount,
5468
+ hours,
5469
+ cost,
5470
+ sample_ticketNumbers: dedupeSortCap(tickets.map((t) => num2(t["ticketNumber"])).filter((n) => n > 0), v.limit)
5471
+ });
5472
+ }
5473
+ activityCategories.sort((a, b) => b.cost - a.cost || (a.ticketCategory === null ? 1 : b.ticketCategory === null ? -1 : (_nullishCoalesce(a.ticketCategory, () => ( 0))) - (_nullishCoalesce(b.ticketCategory, () => ( 0)))));
5474
+ }
5475
+ const highestCostTickets = allTickets.map((t) => ({
5476
+ ticketId: num2(t["id"]),
5477
+ ticketNumber: num2(t["ticketNumber"]) > 0 ? num2(t["ticketNumber"]) : null,
5478
+ title: typeof t["title"] === "string" ? t["title"] : "",
5479
+ status: typeof t["status"] === "number" ? t["status"] : null,
5480
+ hours: ticketHours(t),
5481
+ cost: ticketCost(t),
5482
+ lastActivityDate: typeof t["lastActivityDate"] === "string" ? t["lastActivityDate"] : null
5483
+ })).sort((a, b) => b.cost - a.cost || a.ticketId - b.ticketId).slice(0, v.limit);
5484
+ const miscoding = /* @__PURE__ */ new Map();
5485
+ const putMiscoding = (e, reason) => {
5486
+ const eid = num2(e["id"]);
5487
+ if (eid <= 0 || miscoding.has(eid)) return;
5488
+ const c = num2(e["contractID"]);
5489
+ miscoding.set(eid, { entryId: eid, reason, ticketId: num2(e["ticketID"]) > 0 ? num2(e["ticketID"]) : null, contractId: c > 0 ? c : null, hours: num2(e["hoursWorked"]) });
5490
+ };
5491
+ for (const p of probeRows) putMiscoding(p, num2(p["contractID"]) > 0 ? "ticket_of_other_contract" : "no_contract_on_entry");
5492
+ for (const e of crossTimeEntries) putMiscoding(e, "ticket_of_other_contract");
5493
+ for (const e of unresolvedRefs) putMiscoding(e, "ticket_not_in_fetched_set");
5494
+ const possibleMiscoding = [...miscoding.values()].sort((a, b) => a.entryId - b.entryId).slice(0, v.limit);
5495
+ const openRenewal = [];
5496
+ if (openStatusSet !== null) {
5497
+ for (const t of allTickets) {
5498
+ const status = t["status"];
5499
+ if (typeof status !== "number" || !openStatusSet.has(status)) continue;
5500
+ const last = t["lastActivityDate"];
5501
+ const lastDay = typeof last === "string" ? (asOfMs - Date.parse(last.slice(0, 10))) / 864e5 : null;
5502
+ const staleDays = lastDay !== null && lastDay > v.staleAfterDays ? Math.floor(lastDay) : null;
5503
+ openRenewal.push({
5504
+ kind: "ticket",
5505
+ id: num2(t["id"]),
5506
+ label: typeof t["title"] === "string" && t["title"] !== "" ? t["title"] : `ticket ${num2(t["ticketNumber"]) > 0 ? num2(t["ticketNumber"]) : num2(t["id"])}`,
5507
+ date: typeof last === "string" ? last.slice(0, 10) : null,
5508
+ detail: staleDays !== null ? `open \u2014 stale ${staleDays} days (last activity)` : "open"
5509
+ });
5510
+ }
5511
+ }
5512
+ for (const s of subscriptions) {
5513
+ openRenewal.push({
5514
+ kind: "subscription",
5515
+ id: num2(s["id"]),
5516
+ label: typeof s["subscriptionName"] === "string" && s["subscriptionName"] !== "" ? s["subscriptionName"] : `subscription ${num2(s["id"])}`,
5517
+ date: typeof s["expirationDate"] === "string" ? s["expirationDate"].slice(0, 10) : null,
5518
+ detail: `periodType: ${typeof s["periodType"] === "string" && s["periodType"] !== "" ? s["periodType"] : "unknown"} (period cost ${fmtNum(num2(s["periodCost"]))})`
5519
+ });
5520
+ }
5521
+ const contractEndDay = dateToDay(contractRow["endDate"]);
5522
+ if (contractEndDay !== null) {
5523
+ openRenewal.push({
5524
+ kind: "contract_end",
5525
+ id: idNum,
5526
+ label: typeof contractRow["contractName"] === "string" && contractRow["contractName"] !== "" ? contractRow["contractName"] : `contract ${idNum}`,
5527
+ date: String(contractRow["endDate"]).slice(0, 10),
5528
+ detail: `the contract ends ${String(contractRow["endDate"]).slice(0, 10)}`
5529
+ });
5530
+ }
5531
+ for (let mi = 0; mi < months.length; mi++) {
5532
+ const m = months[mi];
5533
+ let included = 0;
5534
+ for (const u of unitsRaw.items) if (unitEffectiveIn(u, m)) included += num2(u["units"]);
5535
+ const worked = monthly[mi].labour_hours;
5536
+ if (included === 0 && worked === 0) continue;
5537
+ const left = included - worked;
5538
+ const my = Number(m.slice(0, 4));
5539
+ const mm = Number(m.slice(5, 7));
5540
+ const lastDay = new Date(Date.UTC(my, mm, 0)).getUTCDate();
5541
+ openRenewal.push({
5542
+ kind: "included_hours_burn",
5543
+ id: null,
5544
+ label: `included hours ${m}`,
5545
+ date: `${m}-${String(lastDay).padStart(2, "0")}`,
5546
+ detail: `${fmtHours(worked)} h worked vs ${fmtHours(included)} h included (${left >= 0 ? `${fmtHours(left)} h left` : `${fmtHours(Math.abs(left))} h over`})`
5547
+ });
5548
+ }
5549
+ return {
5550
+ contract,
5551
+ customer,
5552
+ period: { dateFrom: v.dateFrom, dateTo: v.dateTo, months, asOf },
5553
+ currency: {
5554
+ companyCurrencyID: customer && typeof customer["currencyID"] === "number" ? customer["currencyID"] : null,
5555
+ note: "amounts are the vendor LOCAL-currency fields (the customer company currency is the context stamp); the internalCurrency* variants are NOT mixed in (v1 \u2014 a cross-currency tenant needs a follow-up op or bag key)"
5556
+ },
5557
+ monthly,
5558
+ activity_categories: activityCategories,
5559
+ highest_cost_tickets: highestCostTickets,
5560
+ possible_miscoding: possibleMiscoding,
5561
+ open_renewal_items: openRenewal,
5562
+ data_quality_warnings: warnings,
5563
+ costRateResolution,
5564
+ parts: {
5565
+ contract: "ok",
5566
+ customer: customerStatus,
5567
+ contractServices: servicesPart.status,
5568
+ contractServiceUnits: unitsPart.status,
5569
+ contractCharges: chargesPart.status,
5570
+ contractRoleCosts: roleCostsPart.status,
5571
+ contractRates: ratesPart.status,
5572
+ billingItems: billingItems.status,
5573
+ invoices: invoicesPart.status,
5574
+ timeEntries: timeEntries.status,
5575
+ ticketsActivity: ticketsActivityPart.status,
5576
+ ticketsOpen: ticketsOpenPart.status,
5577
+ resources: resourcesPart.status,
5578
+ expenses: expensesPart.status,
5579
+ miscodingProbe: probePart.status,
5580
+ configurationItems: configurationItemsPart.status,
5581
+ subscriptions: subscriptionsPart.status
5582
+ },
5583
+ contractServices: servicesPart,
5584
+ contractServiceUnits: unitsPart,
5585
+ contractCharges: chargesPart,
5586
+ contractRoleCosts: roleCostsPart,
5587
+ contractRates: ratesPart,
5588
+ billingItems,
5589
+ invoices: invoicesPart,
5590
+ timeEntries,
5591
+ ticketsActivity: ticketsActivityPart,
5592
+ ticketsOpen: ticketsOpenPart,
5593
+ resources: resourcesPart,
5594
+ expenses: expensesPart,
5595
+ miscodingProbe: probePart,
5596
+ configurationItems: configurationItemsPart,
5597
+ subscriptions: subscriptionsPart,
5598
+ wires: { issued: wires.issued, budget: wires.budget, note: wires.note }
5599
+ };
5600
+ }
5601
+
4537
5602
  // src/resources/contracts.ts
4538
- var ContractsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5603
+ var ContractsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4539
5604
  constructor(http, pageSize) {
4540
5605
  super(http, {
4541
5606
  key: "contracts",
@@ -4599,10 +5664,14 @@ var ContractsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4599
5664
  async search(query, opts) {
4600
5665
  return this.searchBase(query, opts);
4601
5666
  }
5667
+ /** Node-parity special op (hand-written in src/resources/special/contracts.ts). */
5668
+ profitability(id, opts) {
5669
+ return profitability(this, id, opts, this.http);
5670
+ }
4602
5671
  };
4603
5672
 
4604
5673
  // src/resources/contract_ticket_purchases.ts
4605
- var ContractTicketPurchasesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5674
+ var ContractTicketPurchasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4606
5675
  constructor(http, pageSize) {
4607
5676
  super(http, {
4608
5677
  key: "contract_ticket_purchases",
@@ -4661,7 +5730,7 @@ var ContractTicketPurchasesResource = class extends _chunkYKEX4SK7cjs.BaseResour
4661
5730
  };
4662
5731
 
4663
5732
  // src/resources/countries.ts
4664
- var CountriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5733
+ var CountriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4665
5734
  constructor(http, pageSize) {
4666
5735
  super(http, {
4667
5736
  key: "countries",
@@ -4720,7 +5789,7 @@ var CountriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4720
5789
  };
4721
5790
 
4722
5791
  // src/resources/departments.ts
4723
- var DepartmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5792
+ var DepartmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4724
5793
  constructor(http, pageSize) {
4725
5794
  super(http, {
4726
5795
  key: "departments",
@@ -4787,7 +5856,7 @@ var DepartmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4787
5856
  };
4788
5857
 
4789
5858
  // src/resources/domain_registrars.ts
4790
- var DomainRegistrarsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5859
+ var DomainRegistrarsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4791
5860
  constructor(http, pageSize) {
4792
5861
  super(http, {
4793
5862
  key: "domain_registrars",
@@ -4870,7 +5939,7 @@ var EntityInformationResource = class {
4870
5939
  };
4871
5940
 
4872
5941
  // src/resources/expense_item_attachments.ts
4873
- var ExpenseItemAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5942
+ var ExpenseItemAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4874
5943
  constructor(http, pageSize) {
4875
5944
  super(http, {
4876
5945
  key: "expense_item_attachments",
@@ -4932,7 +6001,7 @@ var ExpenseItemAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResourc
4932
6001
  };
4933
6002
 
4934
6003
  // src/resources/expense_items.ts
4935
- var ExpenseItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6004
+ var ExpenseItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4936
6005
  constructor(http, pageSize) {
4937
6006
  super(http, {
4938
6007
  key: "expense_items",
@@ -4991,7 +6060,7 @@ var ExpenseItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
4991
6060
  };
4992
6061
 
4993
6062
  // src/resources/expense_reports.ts
4994
- var ExpenseReportsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6063
+ var ExpenseReportsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4995
6064
  constructor(http, pageSize) {
4996
6065
  super(http, {
4997
6066
  key: "expense_reports",
@@ -5058,7 +6127,7 @@ var ExpenseReportsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5058
6127
  };
5059
6128
 
5060
6129
  // src/resources/holiday_sets.ts
5061
- var HolidaySetsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6130
+ var HolidaySetsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5062
6131
  constructor(http, pageSize) {
5063
6132
  super(http, {
5064
6133
  key: "holiday_sets",
@@ -5127,7 +6196,7 @@ var HolidaySetsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5127
6196
  };
5128
6197
 
5129
6198
  // src/resources/holidays.ts
5130
- var HolidaysResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6199
+ var HolidaysResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5131
6200
  constructor(http, pageSize) {
5132
6201
  super(http, {
5133
6202
  key: "holidays",
@@ -5199,10 +6268,10 @@ var PATH_SUFFIX = {
5199
6268
  transfer: "StockedItemsTransfer"
5200
6269
  };
5201
6270
  async function stockedItems(_resource, kind, parentId, data, opts = {}, http) {
5202
- const numericParent = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, parentId, "parentId");
6271
+ const numericParent = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, parentId, "parentId");
5203
6272
  const suffix = PATH_SUFFIX[kind];
5204
6273
  if (opts.dryRun === true) {
5205
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
6274
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
5206
6275
  operation: `inventory_products.stockedItems${suffix.slice("StockedItems".length)}`,
5207
6276
  method: "POST",
5208
6277
  path: `/V1.0/InventoryProducts/${numericParent}/${suffix}`,
@@ -5218,11 +6287,11 @@ async function stockedItems(_resource, kind, parentId, data, opts = {}, http) {
5218
6287
  body: data,
5219
6288
  operation: `inventory_products.stockedItems${suffix.slice("StockedItems".length)}`
5220
6289
  });
5221
- return _chunkYKEX4SK7cjs.unwrapOperation.call(void 0, res);
6290
+ return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
5222
6291
  }
5223
6292
 
5224
6293
  // src/resources/inventory_products.ts
5225
- var InventoryProductsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6294
+ var InventoryProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5226
6295
  constructor(http, pageSize) {
5227
6296
  super(http, {
5228
6297
  key: "inventory_products",
@@ -5304,7 +6373,7 @@ var InventoryProductsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5304
6373
 
5305
6374
  // src/resources/special/invoices.ts
5306
6375
  async function markup(_resource, id, format, http) {
5307
- const numericId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
6376
+ const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
5308
6377
  const suffix = format === "html" ? "InvoiceMarkupHtml" : "InvoiceMarkupXml";
5309
6378
  const res = await http.request({
5310
6379
  method: "GET",
@@ -5313,7 +6382,7 @@ async function markup(_resource, id, format, http) {
5313
6382
  });
5314
6383
  const body = res;
5315
6384
  if (body === null || typeof body !== "object" || typeof body.invoiceMarkup !== "string") {
5316
- throw new (0, _chunkYKEX4SK7cjs.AutotaskError)(
6385
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(
5317
6386
  `Expected the InvoiceMarkupResultModel envelope { invoiceMarkup: string } for invoice ${numericId}; got a different shape`,
5318
6387
  { code: "INVALID_RESPONSE", category: "server", resourceIds: [numericId] }
5319
6388
  );
@@ -5321,44 +6390,44 @@ async function markup(_resource, id, format, http) {
5321
6390
  return body.invoiceMarkup;
5322
6391
  }
5323
6392
  async function pdf(_resource, id, http) {
5324
- const numericId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
6393
+ const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
5325
6394
  const res = await http.request({
5326
6395
  method: "GET",
5327
6396
  path: `/V1.0/Invoices/${numericId}/InvoicePdf`,
5328
6397
  operation: "invoices.pdf"
5329
6398
  });
5330
- return _chunkYKEX4SK7cjs.decodeFileData.call(void 0, res);
6399
+ return _chunk5N6DYKXOcjs.decodeFileData.call(void 0, res);
5331
6400
  }
5332
6401
  async function windowQuery2(_resource, kind, http, opts) {
5333
- const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _29 => _29.now]), () => ( /* @__PURE__ */ new Date()));
5334
- const tz = _optionalChain([opts, 'optionalAccess', _30 => _30.tz]) === void 0 ? void 0 : validateZone(opts.tz, `invoices.${kind}`);
6402
+ const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _35 => _35.now]), () => ( /* @__PURE__ */ new Date()));
6403
+ const tz = _optionalChain([opts, 'optionalAccess', _36 => _36.tz]) === void 0 ? void 0 : validateZone(opts.tz, `invoices.${kind}`);
5335
6404
  return dateWindowQuery(
5336
6405
  http,
5337
6406
  "/V1.0/Invoices/query",
5338
6407
  "invoiceDateTime",
5339
6408
  kind,
5340
- clampWindowLimit(_optionalChain([opts, 'optionalAccess', _31 => _31.limit])),
6409
+ clampWindowLimit(_optionalChain([opts, 'optionalAccess', _37 => _37.limit])),
5341
6410
  `invoices.${kind}`,
5342
6411
  now,
5343
6412
  tz
5344
6413
  );
5345
6414
  }
5346
6415
  async function customRange2(_resource, from, to, http, opts) {
5347
- const zone = _optionalChain([opts, 'optionalAccess', _32 => _32.tz]) === void 0 ? void 0 : validateZone(opts.tz, "invoices.customRange");
6416
+ const zone = _optionalChain([opts, 'optionalAccess', _38 => _38.tz]) === void 0 ? void 0 : validateZone(opts.tz, "invoices.customRange");
5348
6417
  return customRangeQuery(
5349
6418
  http,
5350
6419
  "/V1.0/Invoices/query",
5351
6420
  "invoiceDateTime",
5352
6421
  from,
5353
6422
  to,
5354
- clampWindowLimit(_optionalChain([opts, 'optionalAccess', _33 => _33.limit])),
6423
+ clampWindowLimit(_optionalChain([opts, 'optionalAccess', _39 => _39.limit])),
5355
6424
  "invoices.customRange",
5356
6425
  zone
5357
6426
  );
5358
6427
  }
5359
6428
 
5360
6429
  // src/resources/invoices.ts
5361
- var InvoicesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6430
+ var InvoicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5362
6431
  constructor(http, pageSize) {
5363
6432
  super(http, {
5364
6433
  key: "invoices",
@@ -5488,7 +6557,7 @@ var ModulesResource = class {
5488
6557
  };
5489
6558
 
5490
6559
  // src/resources/notification_history.ts
5491
- var NotificationHistoryResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6560
+ var NotificationHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5492
6561
  constructor(http, pageSize) {
5493
6562
  super(http, {
5494
6563
  key: "notification_history",
@@ -5527,7 +6596,7 @@ var NotificationHistoryResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5527
6596
  };
5528
6597
 
5529
6598
  // src/resources/opportunities.ts
5530
- var OpportunitiesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6599
+ var OpportunitiesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5531
6600
  constructor(http, pageSize) {
5532
6601
  super(http, {
5533
6602
  key: "opportunities",
@@ -5589,7 +6658,7 @@ var OpportunitiesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5589
6658
  };
5590
6659
 
5591
6660
  // src/resources/opportunity_attachments.ts
5592
- var OpportunityAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6661
+ var OpportunityAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5593
6662
  constructor(http, pageSize) {
5594
6663
  super(http, {
5595
6664
  key: "opportunity_attachments",
@@ -5651,7 +6720,7 @@ var OpportunityAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResourc
5651
6720
  };
5652
6721
 
5653
6722
  // src/resources/opportunity_categories.ts
5654
- var OpportunityCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6723
+ var OpportunityCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5655
6724
  constructor(http, pageSize) {
5656
6725
  super(http, {
5657
6726
  key: "opportunity_categories",
@@ -5710,7 +6779,7 @@ var OpportunityCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseResource
5710
6779
  };
5711
6780
 
5712
6781
  // src/resources/phases.ts
5713
- var PhasesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6782
+ var PhasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5714
6783
  constructor(http, pageSize) {
5715
6784
  super(http, {
5716
6785
  key: "phases",
@@ -5769,7 +6838,7 @@ var PhasesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5769
6838
  };
5770
6839
 
5771
6840
  // src/resources/products.ts
5772
- var ProductsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6841
+ var ProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5773
6842
  constructor(http, pageSize) {
5774
6843
  super(http, {
5775
6844
  key: "products",
@@ -5836,7 +6905,7 @@ var ProductsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5836
6905
  };
5837
6906
 
5838
6907
  // src/resources/product_vendors.ts
5839
- var ProductVendorsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6908
+ var ProductVendorsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5840
6909
  constructor(http, pageSize) {
5841
6910
  super(http, {
5842
6911
  key: "product_vendors",
@@ -5895,7 +6964,7 @@ var ProductVendorsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5895
6964
  };
5896
6965
 
5897
6966
  // src/resources/project_charges.ts
5898
- var ProjectChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6967
+ var ProjectChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5899
6968
  constructor(http, pageSize) {
5900
6969
  super(http, {
5901
6970
  key: "project_charges",
@@ -5966,7 +7035,7 @@ var ProjectChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
5966
7035
  };
5967
7036
 
5968
7037
  // src/resources/project_notes.ts
5969
- var ProjectNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7038
+ var ProjectNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5970
7039
  constructor(http, pageSize) {
5971
7040
  super(http, {
5972
7041
  key: "project_notes",
@@ -6025,7 +7094,7 @@ var ProjectNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6025
7094
  };
6026
7095
 
6027
7096
  // src/resources/projects.ts
6028
- var ProjectsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7097
+ var ProjectsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6029
7098
  constructor(http, pageSize) {
6030
7099
  super(http, {
6031
7100
  key: "projects",
@@ -6102,13 +7171,13 @@ var ProjectsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6102
7171
  const leadResource = await this.contextFetch("/V1.0/Resources", root["projectLeadResourceID"]);
6103
7172
  const result = { project, company, opportunity, leadResource };
6104
7173
  if (opts.names === true) {
6105
- const builder = _chunkYKEX4SK7cjs.createNamePlan.call(void 0, );
7174
+ const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, );
6106
7175
  builder.addResource(root["creatorResourceID"]);
6107
7176
  builder.addFk("contract", root["contractID"]);
6108
- const names = await _chunkYKEX4SK7cjs.resolveCompositeNames.call(void 0, this.http, builder.plan(), { maxNameReads: opts.maxNameReads });
7177
+ const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, this.http, builder.plan(), { maxNameReads: opts.maxNameReads });
6109
7178
  const row = { ...project };
6110
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "creatorResourceID", (v) => names.resourceName(v));
6111
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
7179
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "creatorResourceID", (v) => names.resourceName(v));
7180
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
6112
7181
  result.project = row;
6113
7182
  result.names = names.section;
6114
7183
  }
@@ -6117,7 +7186,7 @@ var ProjectsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6117
7186
  };
6118
7187
 
6119
7188
  // src/resources/purchase_approvals.ts
6120
- var PurchaseApprovalsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7189
+ var PurchaseApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6121
7190
  constructor(http, pageSize) {
6122
7191
  super(http, {
6123
7192
  key: "purchase_approvals",
@@ -6171,7 +7240,7 @@ var PurchaseApprovalsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6171
7240
  };
6172
7241
 
6173
7242
  // src/resources/purchase_order_item_receiving.ts
6174
- var PurchaseOrderItemReceivingResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7243
+ var PurchaseOrderItemReceivingResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6175
7244
  constructor(http, pageSize) {
6176
7245
  super(http, {
6177
7246
  key: "purchase_order_item_receiving",
@@ -6221,7 +7290,7 @@ var PurchaseOrderItemReceivingResource = class extends _chunkYKEX4SK7cjs.BaseRes
6221
7290
  };
6222
7291
 
6223
7292
  // src/resources/purchase_order_items.ts
6224
- var PurchaseOrderItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7293
+ var PurchaseOrderItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6225
7294
  constructor(http, pageSize) {
6226
7295
  super(http, {
6227
7296
  key: "purchase_order_items",
@@ -6280,7 +7349,7 @@ var PurchaseOrderItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6280
7349
  };
6281
7350
 
6282
7351
  // src/resources/purchase_orders.ts
6283
- var PurchaseOrdersResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7352
+ var PurchaseOrdersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6284
7353
  constructor(http, pageSize) {
6285
7354
  super(http, {
6286
7355
  key: "purchase_orders",
@@ -6342,7 +7411,7 @@ var PurchaseOrdersResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6342
7411
  };
6343
7412
 
6344
7413
  // src/resources/quote_items.ts
6345
- var QuoteItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7414
+ var QuoteItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6346
7415
  constructor(http, pageSize) {
6347
7416
  super(http, {
6348
7417
  key: "quote_items",
@@ -6413,7 +7482,7 @@ var QuoteItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6413
7482
  };
6414
7483
 
6415
7484
  // src/resources/quote_locations.ts
6416
- var QuoteLocationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7485
+ var QuoteLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6417
7486
  constructor(http, pageSize) {
6418
7487
  super(http, {
6419
7488
  key: "quote_locations",
@@ -6478,7 +7547,7 @@ var QuoteLocationsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6478
7547
  };
6479
7548
 
6480
7549
  // src/resources/quotes.ts
6481
- var QuotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7550
+ var QuotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6482
7551
  constructor(http, pageSize) {
6483
7552
  super(http, {
6484
7553
  key: "quotes",
@@ -6545,7 +7614,7 @@ var QuotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6545
7614
  };
6546
7615
 
6547
7616
  // src/resources/quote_templates.ts
6548
- var QuoteTemplatesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7617
+ var QuoteTemplatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6549
7618
  constructor(http, pageSize) {
6550
7619
  super(http, {
6551
7620
  key: "quote_templates",
@@ -6589,7 +7658,7 @@ var QuoteTemplatesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6589
7658
  };
6590
7659
 
6591
7660
  // src/resources/resource_role_queues.ts
6592
- var ResourceRoleQueuesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7661
+ var ResourceRoleQueuesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6593
7662
  constructor(http, pageSize) {
6594
7663
  super(http, {
6595
7664
  key: "resource_role_queues",
@@ -6648,7 +7717,7 @@ var ResourceRoleQueuesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6648
7717
  };
6649
7718
 
6650
7719
  // src/resources/resource_roles.ts
6651
- var ResourceRolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7720
+ var ResourceRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6652
7721
  constructor(http, pageSize) {
6653
7722
  super(http, {
6654
7723
  key: "resource_roles",
@@ -6690,7 +7759,7 @@ var ResourceRolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6690
7759
  };
6691
7760
 
6692
7761
  // src/resources/resource_skills.ts
6693
- var ResourceSkillsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7762
+ var ResourceSkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6694
7763
  constructor(http, pageSize) {
6695
7764
  super(http, {
6696
7765
  key: "resource_skills",
@@ -6744,16 +7813,16 @@ var ResourceSkillsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6744
7813
  var MAX_TRANSFER_IDS = 500;
6745
7814
  function requirePositiveIds(ids, label) {
6746
7815
  if (!Array.isArray(ids) || ids.length === 0) {
6747
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`${label}: at least one positive integer id is required`);
7816
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: at least one positive integer id is required`);
6748
7817
  }
6749
7818
  if (ids.length > MAX_TRANSFER_IDS) {
6750
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`${label}: at most ${MAX_TRANSFER_IDS} ids are accepted (bounded fan-out)`);
7819
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: at most ${MAX_TRANSFER_IDS} ids are accepted (bounded fan-out)`);
6751
7820
  }
6752
7821
  const out = [];
6753
7822
  for (const raw of ids) {
6754
- const id = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, raw, `${label} id`);
7823
+ const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, raw, `${label} id`);
6755
7824
  if (typeof id === "number" && id < 1) {
6756
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`${label}: every id must be a positive integer (got ${String(raw)})`);
7825
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: every id must be a positive integer (got ${String(raw)})`);
6757
7826
  }
6758
7827
  out.push(id);
6759
7828
  }
@@ -6761,7 +7830,7 @@ function requirePositiveIds(ids, label) {
6761
7830
  }
6762
7831
  async function whoAmI(_resource, userName, http) {
6763
7832
  const user = userName.trim();
6764
- if (user === "") throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("whoAmI: the configured UserName is empty");
7833
+ if (user === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("whoAmI: the configured UserName is empty");
6765
7834
  const value = user.includes("@") ? _nullishCoalesce(user.split("@")[0], () => ( "")) : user;
6766
7835
  const res = await http.request({
6767
7836
  method: "POST",
@@ -6770,11 +7839,11 @@ async function whoAmI(_resource, userName, http) {
6770
7839
  body: { MaxRecords: 2, filter: [{ field: "userName", op: "eq", value }] },
6771
7840
  operation: "resources.whoAmI"
6772
7841
  });
6773
- const matches = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
7842
+ const matches = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
6774
7843
  if (matches.length === 0) return null;
6775
7844
  if (matches.length > 1) {
6776
7845
  const ids = matches.map((m) => m.id).filter((id) => typeof id === "number");
6777
- throw new (0, _chunkYKEX4SK7cjs.ResolutionError)(
7846
+ throw new (0, _chunk5N6DYKXOcjs.ResolutionError)(
6778
7847
  `whoAmI: "${value}" is ambiguous (matched ${matches.length} resources)`,
6779
7848
  { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids }
6780
7849
  );
@@ -6783,11 +7852,11 @@ async function whoAmI(_resource, userName, http) {
6783
7852
  }
6784
7853
  async function transferOwnership(_resource, companyIds, destinationResourceId, http, opts) {
6785
7854
  const ids = requirePositiveIds(companyIds, "transferOwnership");
6786
- const destination = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, destinationResourceId, "destinationResourceId");
7855
+ const destination = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, destinationResourceId, "destinationResourceId");
6787
7856
  if (typeof destination === "number" && destination < 1) {
6788
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("transferOwnership: destinationResourceId must be a positive integer");
7857
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("transferOwnership: destinationResourceId must be a positive integer");
6789
7858
  }
6790
- const dryRun = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _34 => _34.dryRun]), () => ( true));
7859
+ const dryRun = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _40 => _40.dryRun]), () => ( true));
6791
7860
  const changes = [];
6792
7861
  const applied = [];
6793
7862
  for (const id of ids) {
@@ -6797,7 +7866,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
6797
7866
  path: `/V1.0/Companies/${id}`,
6798
7867
  operation: "resources.transferOwnership"
6799
7868
  });
6800
- const company = _chunkYKEX4SK7cjs.unwrapItem.call(void 0, res, id);
7869
+ const company = _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, id);
6801
7870
  const current = typeof company.ownerResourceID === "number" ? company.ownerResourceID : null;
6802
7871
  changes.push({ id, fromOwnerResourceID: current, toOwnerResourceID: destination });
6803
7872
  if (!dryRun) {
@@ -6807,11 +7876,11 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
6807
7876
  body: { id, ownerResourceID: destination },
6808
7877
  operation: "resources.transferOwnership"
6809
7878
  });
6810
- _chunkYKEX4SK7cjs.unwrapOperation.call(void 0, update);
7879
+ _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, update);
6811
7880
  applied.push(id);
6812
7881
  }
6813
7882
  } catch (err) {
6814
- if (!dryRun && err instanceof _chunkYKEX4SK7cjs.AutotaskError) {
7883
+ if (!dryRun && err instanceof _chunk5N6DYKXOcjs.AutotaskError) {
6815
7884
  err.resourceIds = [id];
6816
7885
  err.suggestedAction = `Partial transfer: ${applied.length} of ${ids.length} companies were re-owned (ids: ${applied.join(", ") || "none"}); id ${id} failed. Re-run transferOwnership for the remaining ids (from ${id} on).`;
6817
7886
  }
@@ -6821,7 +7890,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
6821
7890
  if (dryRun) {
6822
7891
  const anyChange = changes.some((c) => c.fromOwnerResourceID !== c.toOwnerResourceID);
6823
7892
  return {
6824
- ..._chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
7893
+ ..._chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
6825
7894
  operation: "resources.transferOwnership",
6826
7895
  method: "PUT",
6827
7896
  path: "/V1.0/Companies",
@@ -6845,7 +7914,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
6845
7914
  }
6846
7915
 
6847
7916
  // src/resources/resources.ts
6848
- var ResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7917
+ var ResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6849
7918
 
6850
7919
  constructor(http, clientConfig, pageSize) {
6851
7920
  super(http, {
@@ -6918,7 +7987,7 @@ var ResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
6918
7987
 
6919
7988
  // src/resources/special/resource_time_off_additional.ts
6920
7989
  async function getByResource(_resource, resourceId, http) {
6921
- const numericResource = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, resourceId, "resourceId");
7990
+ const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
6922
7991
  const res = await http.request({
6923
7992
  method: "GET",
6924
7993
  path: `/V1.0/Resources/${numericResource}/TimeOffAdditional`,
@@ -6932,11 +8001,11 @@ async function getByResource(_resource, resourceId, http) {
6932
8001
  if (typeof item === "object" && !Array.isArray(item)) return [item];
6933
8002
  }
6934
8003
  }
6935
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, "resource_time_off_additional.getByResource").items;
8004
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "resource_time_off_additional.getByResource").items;
6936
8005
  }
6937
8006
 
6938
8007
  // src/resources/resource_time_off_additional.ts
6939
- var ResourceTimeOffAdditionalResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8008
+ var ResourceTimeOffAdditionalResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6940
8009
  constructor(http, pageSize) {
6941
8010
  super(http, {
6942
8011
  key: "resource_time_off_additional",
@@ -6975,7 +8044,7 @@ var ResourceTimeOffAdditionalResource = class extends _chunkYKEX4SK7cjs.BaseReso
6975
8044
  };
6976
8045
 
6977
8046
  // src/resources/resource_time_off_approvers.ts
6978
- var ResourceTimeOffApproversResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8047
+ var ResourceTimeOffApproversResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6979
8048
  constructor(http, pageSize) {
6980
8049
  super(http, {
6981
8050
  key: "resource_time_off_approvers",
@@ -7018,29 +8087,29 @@ var ResourceTimeOffApproversResource = class extends _chunkYKEX4SK7cjs.BaseResou
7018
8087
 
7019
8088
  // src/resources/special/resource_time_off_balances.ts
7020
8089
  async function getByResource2(_resource, resourceId, http) {
7021
- const numericResource = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8090
+ const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
7022
8091
  const res = await http.request({
7023
8092
  method: "GET",
7024
8093
  path: `/V1.0/Resources/${numericResource}/TimeOffBalances`,
7025
8094
  operation: "resource_time_off_balances.getByResource"
7026
8095
  });
7027
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, "resource_time_off_balances.getByResource").items;
8096
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "resource_time_off_balances.getByResource").items;
7028
8097
  }
7029
8098
  async function getByYear(_resource, resourceId, year, http) {
7030
- const numericResource = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8099
+ const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
7031
8100
  if (!Number.isSafeInteger(year) || year < 1) {
7032
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("getByYear: year must be a positive integer");
8101
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("getByYear: year must be a positive integer");
7033
8102
  }
7034
8103
  const res = await http.request({
7035
8104
  method: "GET",
7036
8105
  path: `/V1.0/Resources/${numericResource}/TimeOffBalances/${year}`,
7037
8106
  operation: "resource_time_off_balances.getByYear"
7038
8107
  });
7039
- return _chunkYKEX4SK7cjs.unwrapItem.call(void 0, res, year, "resource_time_off_balances.getByYear");
8108
+ return _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, year, "resource_time_off_balances.getByYear");
7040
8109
  }
7041
8110
 
7042
8111
  // src/resources/resource_time_off_balances.ts
7043
- var ResourceTimeOffBalancesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8112
+ var ResourceTimeOffBalancesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7044
8113
  constructor(http, pageSize) {
7045
8114
  super(http, {
7046
8115
  key: "resource_time_off_balances",
@@ -7078,7 +8147,7 @@ var ResourceTimeOffBalancesResource = class extends _chunkYKEX4SK7cjs.BaseResour
7078
8147
  };
7079
8148
 
7080
8149
  // src/resources/roles.ts
7081
- var RolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8150
+ var RolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7082
8151
  constructor(http, pageSize) {
7083
8152
  super(http, {
7084
8153
  key: "roles",
@@ -7145,7 +8214,7 @@ var RolesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7145
8214
  };
7146
8215
 
7147
8216
  // src/resources/service_calls.ts
7148
- var ServiceCallsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8217
+ var ServiceCallsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7149
8218
  constructor(http, pageSize) {
7150
8219
  super(http, {
7151
8220
  key: "service_calls",
@@ -7214,7 +8283,7 @@ var ServiceCallsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7214
8283
  };
7215
8284
 
7216
8285
  // src/resources/service_call_task_resources.ts
7217
- var ServiceCallTaskResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8286
+ var ServiceCallTaskResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7218
8287
  constructor(http, pageSize) {
7219
8288
  super(http, {
7220
8289
  key: "service_call_task_resources",
@@ -7271,7 +8340,7 @@ var ServiceCallTaskResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResou
7271
8340
  };
7272
8341
 
7273
8342
  // src/resources/service_call_tasks.ts
7274
- var ServiceCallTasksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8343
+ var ServiceCallTasksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7275
8344
  constructor(http, pageSize) {
7276
8345
  super(http, {
7277
8346
  key: "service_call_tasks",
@@ -7328,7 +8397,7 @@ var ServiceCallTasksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7328
8397
  };
7329
8398
 
7330
8399
  // src/resources/service_call_ticket_resources.ts
7331
- var ServiceCallTicketResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8400
+ var ServiceCallTicketResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7332
8401
  constructor(http, pageSize) {
7333
8402
  super(http, {
7334
8403
  key: "service_call_ticket_resources",
@@ -7385,7 +8454,7 @@ var ServiceCallTicketResourcesResource = class extends _chunkYKEX4SK7cjs.BaseRes
7385
8454
  };
7386
8455
 
7387
8456
  // src/resources/service_call_tickets.ts
7388
- var ServiceCallTicketsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8457
+ var ServiceCallTicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7389
8458
  constructor(http, pageSize) {
7390
8459
  super(http, {
7391
8460
  key: "service_call_tickets",
@@ -7442,7 +8511,7 @@ var ServiceCallTicketsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7442
8511
  };
7443
8512
 
7444
8513
  // src/resources/service_level_agreement_results.ts
7445
- var ServiceLevelAgreementResultsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8514
+ var ServiceLevelAgreementResultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7446
8515
  constructor(http, pageSize) {
7447
8516
  super(http, {
7448
8517
  key: "service_level_agreement_results",
@@ -7481,7 +8550,7 @@ var ServiceLevelAgreementResultsResource = class extends _chunkYKEX4SK7cjs.BaseR
7481
8550
  };
7482
8551
 
7483
8552
  // src/resources/services.ts
7484
- var ServicesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8553
+ var ServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7485
8554
  constructor(http, pageSize) {
7486
8555
  super(http, {
7487
8556
  key: "services",
@@ -7549,7 +8618,7 @@ var ServicesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7549
8618
  };
7550
8619
 
7551
8620
  // src/resources/skills.ts
7552
- var SkillsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8621
+ var SkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7553
8622
  constructor(http, pageSize) {
7554
8623
  super(http, {
7555
8624
  key: "skills",
@@ -7593,7 +8662,7 @@ var SkillsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7593
8662
  };
7594
8663
 
7595
8664
  // src/resources/subscription_periods.ts
7596
- var SubscriptionPeriodsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8665
+ var SubscriptionPeriodsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7597
8666
  constructor(http, pageSize) {
7598
8667
  super(http, {
7599
8668
  key: "subscription_periods",
@@ -7632,7 +8701,7 @@ var SubscriptionPeriodsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7632
8701
  };
7633
8702
 
7634
8703
  // src/resources/subscriptions.ts
7635
- var SubscriptionsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8704
+ var SubscriptionsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7636
8705
  constructor(http, pageSize) {
7637
8706
  super(http, {
7638
8707
  key: "subscriptions",
@@ -7701,7 +8770,7 @@ var SubscriptionsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7701
8770
  };
7702
8771
 
7703
8772
  // src/resources/survey_results.ts
7704
- var SurveyResultsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8773
+ var SurveyResultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7705
8774
  constructor(http, pageSize) {
7706
8775
  super(http, {
7707
8776
  key: "survey_results",
@@ -7740,7 +8809,7 @@ var SurveyResultsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7740
8809
  };
7741
8810
 
7742
8811
  // src/resources/surveys.ts
7743
- var SurveysResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8812
+ var SurveysResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7744
8813
  constructor(http, pageSize) {
7745
8814
  super(http, {
7746
8815
  key: "surveys",
@@ -7784,7 +8853,7 @@ var SurveysResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7784
8853
  };
7785
8854
 
7786
8855
  // src/resources/tag_aliases.ts
7787
- var TagAliasesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8856
+ var TagAliasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7788
8857
  constructor(http, pageSize) {
7789
8858
  super(http, {
7790
8859
  key: "tag_aliases",
@@ -7841,7 +8910,7 @@ var TagAliasesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7841
8910
  };
7842
8911
 
7843
8912
  // src/resources/tag_groups.ts
7844
- var TagGroupsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8913
+ var TagGroupsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7845
8914
  constructor(http, pageSize) {
7846
8915
  super(http, {
7847
8916
  key: "tag_groups",
@@ -7910,7 +8979,7 @@ var TagGroupsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7910
8979
  };
7911
8980
 
7912
8981
  // src/resources/tags.ts
7913
- var TagsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8982
+ var TagsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7914
8983
  constructor(http, pageSize) {
7915
8984
  super(http, {
7916
8985
  key: "tags",
@@ -7979,7 +9048,7 @@ var TagsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
7979
9048
  };
7980
9049
 
7981
9050
  // src/resources/task_secondary_resources.ts
7982
- var TaskSecondaryResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9051
+ var TaskSecondaryResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7983
9052
  constructor(http, pageSize) {
7984
9053
  super(http, {
7985
9054
  key: "task_secondary_resources",
@@ -8036,7 +9105,7 @@ var TaskSecondaryResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResourc
8036
9105
  };
8037
9106
 
8038
9107
  // src/resources/tasks.ts
8039
- var TasksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9108
+ var TasksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8040
9109
  constructor(http, pageSize) {
8041
9110
  super(http, {
8042
9111
  key: "tasks",
@@ -8124,7 +9193,7 @@ var ThresholdInformationResource = class {
8124
9193
  };
8125
9194
 
8126
9195
  // src/resources/ticket_additional_configuration_items.ts
8127
- var TicketAdditionalConfigurationItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9196
+ var TicketAdditionalConfigurationItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8128
9197
  constructor(http, pageSize) {
8129
9198
  super(http, {
8130
9199
  key: "ticket_additional_configuration_items",
@@ -8181,7 +9250,7 @@ var TicketAdditionalConfigurationItemsResource = class extends _chunkYKEX4SK7cjs
8181
9250
  };
8182
9251
 
8183
9252
  // src/resources/ticket_additional_contacts.ts
8184
- var TicketAdditionalContactsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9253
+ var TicketAdditionalContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8185
9254
  constructor(http, pageSize) {
8186
9255
  super(http, {
8187
9256
  key: "ticket_additional_contacts",
@@ -8238,7 +9307,7 @@ var TicketAdditionalContactsResource = class extends _chunkYKEX4SK7cjs.BaseResou
8238
9307
  };
8239
9308
 
8240
9309
  // src/resources/ticket_attachments.ts
8241
- var TicketAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9310
+ var TicketAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8242
9311
  constructor(http, pageSize) {
8243
9312
  super(http, {
8244
9313
  key: "ticket_attachments",
@@ -8300,7 +9369,7 @@ var TicketAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8300
9369
  };
8301
9370
 
8302
9371
  // src/resources/ticket_categories.ts
8303
- var TicketCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9372
+ var TicketCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8304
9373
  constructor(http, pageSize) {
8305
9374
  super(http, {
8306
9375
  key: "ticket_categories",
@@ -8359,7 +9428,7 @@ var TicketCategoriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8359
9428
  };
8360
9429
 
8361
9430
  // src/resources/ticket_category_field_defaults.ts
8362
- var TicketCategoryFieldDefaultsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9431
+ var TicketCategoryFieldDefaultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8363
9432
  constructor(http, pageSize) {
8364
9433
  super(http, {
8365
9434
  key: "ticket_category_field_defaults",
@@ -8401,7 +9470,7 @@ var TicketCategoryFieldDefaultsResource = class extends _chunkYKEX4SK7cjs.BaseRe
8401
9470
  };
8402
9471
 
8403
9472
  // src/resources/ticket_change_request_approvals.ts
8404
- var TicketChangeRequestApprovalsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9473
+ var TicketChangeRequestApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8405
9474
  constructor(http, pageSize) {
8406
9475
  super(http, {
8407
9476
  key: "ticket_change_request_approvals",
@@ -8458,7 +9527,7 @@ var TicketChangeRequestApprovalsResource = class extends _chunkYKEX4SK7cjs.BaseR
8458
9527
  };
8459
9528
 
8460
9529
  // src/resources/ticket_charges.ts
8461
- var TicketChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9530
+ var TicketChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8462
9531
  constructor(http, pageSize) {
8463
9532
  super(http, {
8464
9533
  key: "ticket_charges",
@@ -8529,7 +9598,7 @@ var TicketChargesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8529
9598
  };
8530
9599
 
8531
9600
  // src/resources/ticket_checklist_items.ts
8532
- var TicketChecklistItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9601
+ var TicketChecklistItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8533
9602
  constructor(http, pageSize) {
8534
9603
  super(http, {
8535
9604
  key: "ticket_checklist_items",
@@ -8595,7 +9664,7 @@ var TicketChecklistItemsResource = class extends _chunkYKEX4SK7cjs.BaseResource
8595
9664
  };
8596
9665
 
8597
9666
  // src/resources/ticket_checklist_libraries.ts
8598
- var TicketChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9667
+ var TicketChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8599
9668
  constructor(http, pageSize) {
8600
9669
  super(http, {
8601
9670
  key: "ticket_checklist_libraries",
@@ -8619,9 +9688,9 @@ var TicketChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResou
8619
9688
  * `dryRun: true` returns the pinned envelope (document existence is unverifiable in the MVP
8620
9689
  * surface — no documents read op — and never issues the POST). */
8621
9690
  async attachToDocument(documentID, data, opts = {}) {
8622
- const n = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, documentID, "documentID");
9691
+ const n = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, documentID, "documentID");
8623
9692
  if (opts.dryRun === true) {
8624
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
9693
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
8625
9694
  operation: "ticket_checklist_libraries.attachToDocument",
8626
9695
  method: "POST",
8627
9696
  path: `/V1.0/Documents/${n}/ChecklistLibraries`,
@@ -8638,7 +9707,7 @@ var TicketChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResou
8638
9707
  body: { ...data },
8639
9708
  operation: "ticket_checklist_libraries.attachToDocument"
8640
9709
  });
8641
- return _chunkYKEX4SK7cjs.unwrapOperation.call(void 0, res);
9710
+ return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
8642
9711
  }
8643
9712
  /** Resolve a TicketChecklistLibrary from a numeric id (or, where the vendor indexes a primary text field,
8644
9713
  * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
@@ -8654,7 +9723,7 @@ var TicketChecklistLibrariesResource = class extends _chunkYKEX4SK7cjs.BaseResou
8654
9723
  };
8655
9724
 
8656
9725
  // src/resources/ticket_history.ts
8657
- var TicketHistoryResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9726
+ var TicketHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8658
9727
  constructor(http, pageSize) {
8659
9728
  super(http, {
8660
9729
  key: "ticket_history",
@@ -8693,7 +9762,7 @@ var TicketHistoryResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8693
9762
  };
8694
9763
 
8695
9764
  // src/resources/ticket_note_attachments.ts
8696
- var TicketNoteAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9765
+ var TicketNoteAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8697
9766
  constructor(http, pageSize) {
8698
9767
  super(http, {
8699
9768
  key: "ticket_note_attachments",
@@ -8755,7 +9824,7 @@ var TicketNoteAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource
8755
9824
  };
8756
9825
 
8757
9826
  // src/resources/ticket_notes.ts
8758
- var TicketNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9827
+ var TicketNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8759
9828
  constructor(http, pageSize) {
8760
9829
  super(http, {
8761
9830
  key: "ticket_notes",
@@ -8814,7 +9883,7 @@ var TicketNotesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8814
9883
  };
8815
9884
 
8816
9885
  // src/resources/ticket_note_webhooks.ts
8817
- var TicketNoteWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9886
+ var TicketNoteWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8818
9887
  constructor(http, pageSize) {
8819
9888
  super(http, {
8820
9889
  key: "ticket_note_webhooks",
@@ -8890,7 +9959,7 @@ var TicketNoteWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
8890
9959
  };
8891
9960
 
8892
9961
  // src/resources/ticket_secondary_resources.ts
8893
- var TicketSecondaryResourcesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9962
+ var TicketSecondaryResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8894
9963
  constructor(http, pageSize) {
8895
9964
  super(http, {
8896
9965
  key: "ticket_secondary_resources",
@@ -8957,9 +10026,9 @@ async function fetchTicket(http, id, operation) {
8957
10026
  });
8958
10027
  const body = res;
8959
10028
  if (body === null || !("item" in body)) {
8960
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`Ticket ${id} not found (unexpected envelope shape)`, { resourceIds: [id] });
10029
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Ticket ${id} not found (unexpected envelope shape)`, { resourceIds: [id] });
8961
10030
  }
8962
- if (body.item === null || body.item === void 0) throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`Ticket ${id} not found`, { resourceIds: [id] });
10031
+ if (body.item === null || body.item === void 0) throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Ticket ${id} not found`, { resourceIds: [id] });
8963
10032
  return body.item;
8964
10033
  }
8965
10034
  async function ticketQueryItems(http, path, filter, maxRecords, operation) {
@@ -8970,29 +10039,29 @@ async function ticketQueryItems(http, path, filter, maxRecords, operation) {
8970
10039
  body: { MaxRecords: maxRecords, filter },
8971
10040
  operation
8972
10041
  });
8973
- return _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res).items;
10042
+ return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
8974
10043
  }
8975
10044
  function isRouteUnavailable(err) {
8976
- return _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) && (err.httpStatus === 404 || err.httpStatus === 500);
10045
+ return _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) && (err.httpStatus === 404 || err.httpStatus === 500);
8977
10046
  }
8978
10047
  function routeFact(route, path, err) {
8979
10048
  return {
8980
10049
  route,
8981
10050
  path,
8982
- httpStatus: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) && typeof err.httpStatus === "number" ? err.httpStatus : null
10051
+ httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) && typeof err.httpStatus === "number" ? err.httpStatus : null
8983
10052
  };
8984
10053
  }
8985
10054
  function childDeclaresQuery(resourceKey) {
8986
- return _chunkT5FLSJODcjs.CAPABILITIES.some(
10055
+ return _chunkJKZVCFRYcjs.CAPABILITIES.some(
8987
10056
  (c) => c.id === `${resourceKey}.query` && (c.status === "implemented" || c.status === "tested")
8988
10057
  );
8989
10058
  }
8990
10059
  function planScopedPath(resourceKey, ticketId) {
8991
10060
  if (!childDeclaresQuery(resourceKey)) return null;
8992
- const entry = _chunkYKEX4SK7cjs.RELATIONSHIP_MAP[resourceKey];
10061
+ const entry = _chunk5N6DYKXOcjs.RELATIONSHIP_MAP[resourceKey];
8993
10062
  const parent = entry === void 0 ? null : entry.parent;
8994
10063
  if (parent === null || parent.resource !== "tickets" || parent.segment === null || parent.field === null) return null;
8995
- const parentPath = _optionalChain([_chunkYKEX4SK7cjs.RELATIONSHIP_MAP, 'access', _35 => _35[parent.resource], 'optionalAccess', _36 => _36.path]);
10064
+ const parentPath = _optionalChain([_chunk5N6DYKXOcjs.RELATIONSHIP_MAP, 'access', _41 => _41[parent.resource], 'optionalAccess', _42 => _42.path]);
8996
10065
  if (parentPath === null || parentPath === void 0) return null;
8997
10066
  return `/V1.0/${parentPath}/${ticketId}/${parent.segment}`;
8998
10067
  }
@@ -9031,14 +10100,14 @@ async function scopedCollectionRead(http, startPath, limit, operation, accept) {
9031
10100
  break;
9032
10101
  }
9033
10102
  const body = await http.request({ method: "GET", path: target, operation });
9034
- const { items: pageItems, pageDetails } = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, body, operation);
10103
+ const { items: pageItems, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, body, operation);
9035
10104
  nextCursor = pageDetails.nextPageUrl;
9036
10105
  pages += 1;
9037
10106
  const window = pageItems.slice(0, Math.max(0, limit - items.length));
9038
10107
  for (const row of window) if (accept(row)) items.push(row);
9039
10108
  if (items.length >= limit) break;
9040
10109
  if (nextCursor === null || pageItems.length === 0) break;
9041
- target = _chunkYKEX4SK7cjs.cursorToPath.call(void 0, http.baseUrl, nextCursor);
10110
+ target = _chunk5N6DYKXOcjs.cursorToPath.call(void 0, http.baseUrl, nextCursor);
9042
10111
  }
9043
10112
  const capped = items.length >= limit || guard && nextCursor !== null;
9044
10113
  return { items, capped };
@@ -9072,7 +10141,7 @@ function truncate(text, limit) {
9072
10141
  }
9073
10142
  async function slaHealthCheck(_resource, id, opts = {}, http) {
9074
10143
  void opts;
9075
- const ticketId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
10144
+ const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
9076
10145
  await fetchTicket(http, ticketId, "tickets.slaHealthCheck");
9077
10146
  const rows = await ticketQueryItems(
9078
10147
  http,
@@ -9083,11 +10152,11 @@ async function slaHealthCheck(_resource, id, opts = {}, http) {
9083
10152
  );
9084
10153
  const slas = rows.map((row) => {
9085
10154
  const bool = (v) => typeof v === "boolean" ? v : null;
9086
- const num2 = (v) => typeof v === "number" ? v : null;
10155
+ const num3 = (v) => typeof v === "number" ? v : null;
9087
10156
  const milestones = [
9088
- { name: "firstResponse", met: bool(row.isFirstResponseMet), elapsedHours: num2(row.firstResponseElapsedHours) },
9089
- { name: "resolution", met: bool(row.isResolutionMet), elapsedHours: num2(row.resolutionElapsedHours) },
9090
- { name: "resolutionPlan", met: bool(row.isResolutionPlanMet), elapsedHours: num2(row.resolutionPlanElapsedHours) }
10157
+ { name: "firstResponse", met: bool(row.isFirstResponseMet), elapsedHours: num3(row.firstResponseElapsedHours) },
10158
+ { name: "resolution", met: bool(row.isResolutionMet), elapsedHours: num3(row.resolutionElapsedHours) },
10159
+ { name: "resolutionPlan", met: bool(row.isResolutionPlanMet), elapsedHours: num3(row.resolutionPlanElapsedHours) }
9091
10160
  ];
9092
10161
  return { id: Number(row.id), name: _nullishCoalesce(row.serviceLevelAgreementName, () => ( null)), milestones };
9093
10162
  });
@@ -9097,9 +10166,9 @@ async function slaHealthCheck(_resource, id, opts = {}, http) {
9097
10166
  async function summary(_resource, id, opts = {}, http) {
9098
10167
  const limit = opts.summaryTextLimit === void 0 ? 500 : Math.trunc(opts.summaryTextLimit);
9099
10168
  if (!Number.isInteger(limit) || limit < 1) {
9100
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`summaryTextLimit must be an integer >= 1 (got ${String(opts.summaryTextLimit)})`);
10169
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`summaryTextLimit must be an integer >= 1 (got ${String(opts.summaryTextLimit)})`);
9101
10170
  }
9102
- const ticketId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
10171
+ const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
9103
10172
  const ticket = await fetchTicket(http, ticketId, "tickets.summary");
9104
10173
  const desc = truncate(ticket.description, limit);
9105
10174
  const now = _nullishCoalesce(opts.now, () => ( /* @__PURE__ */ new Date()));
@@ -9126,13 +10195,13 @@ async function summary(_resource, id, opts = {}, http) {
9126
10195
  }
9127
10196
  async function timeline(_resource, id, opts = {}, http) {
9128
10197
  const limit = opts.limit === void 0 ? 100 : Math.trunc(opts.limit);
9129
- if (!Number.isInteger(limit) || limit < 1) throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(opts.limit)})`);
10198
+ if (!Number.isInteger(limit) || limit < 1) throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(opts.limit)})`);
9130
10199
  const bounded = Math.min(limit, 500);
9131
10200
  const textLimit = opts.textLimit === void 0 ? 500 : Math.trunc(opts.textLimit);
9132
10201
  if (!Number.isInteger(textLimit) || textLimit < 1) {
9133
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`textLimit must be an integer >= 1 (got ${String(opts.textLimit)})`);
10202
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`textLimit must be an integer >= 1 (got ${String(opts.textLimit)})`);
9134
10203
  }
9135
- const ticketId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
10204
+ const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
9136
10205
  await fetchTicket(http, ticketId, "tickets.timeline");
9137
10206
  const dateFilters = (field) => {
9138
10207
  const f = [{ field: "ticketID", op: "eq", value: ticketId }];
@@ -9219,14 +10288,14 @@ function isPositiveInt(v) {
9219
10288
  return typeof v === "number" && Number.isInteger(v) && v > 0;
9220
10289
  }
9221
10290
  function namedVendorFields(err) {
9222
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return [];
9223
- const entries = _nullishCoalesce(_chunkYKEX4SK7cjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []));
10291
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return [];
10292
+ const entries = _nullishCoalesce(_chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []));
9224
10293
  const out = /* @__PURE__ */ new Set();
9225
10294
  for (const e of entries) if (e.field !== void 0) out.add(e.field);
9226
10295
  return [...out];
9227
10296
  }
9228
10297
  function vendorDetailOf(err) {
9229
- return _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? _chunkYKEX4SK7cjs.formatVendorDetail.call(void 0, err.vendorError) : void 0;
10298
+ return _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError) : void 0;
9230
10299
  }
9231
10300
  async function fetchItem(http, path, operation) {
9232
10301
  const res = await http.request({ method: "GET", path, operation });
@@ -9247,8 +10316,8 @@ function operationId(res) {
9247
10316
  return typeof body.itemId === "number" ? body.itemId : typeof body.id === "number" ? body.id : void 0;
9248
10317
  }
9249
10318
  function discoveryMerge(err, body, defaults) {
9250
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
9251
- const entries = _chunkYKEX4SK7cjs.parseVendorErrors.call(void 0, err.vendorError);
10319
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
10320
+ const entries = _chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError);
9252
10321
  if (entries === void 0) return null;
9253
10322
  for (const entry of entries) {
9254
10323
  const field = entry.field;
@@ -9260,7 +10329,7 @@ function discoveryMerge(err, body, defaults) {
9260
10329
  }
9261
10330
  function stepErrorText(code, err) {
9262
10331
  const detail = vendorDetailOf(err);
9263
- const base = _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.message : String(err);
10332
+ const base = _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.message : String(err);
9264
10333
  return detail ? `${code}: ${detail}` : `${code}: ${base}`;
9265
10334
  }
9266
10335
  var DEFAULT_TICKET_PRIORITY = 3;
@@ -9269,7 +10338,7 @@ var DEFAULT_NOTE_TYPE = 1;
9269
10338
  var DEFAULT_PUBLISH = 1;
9270
10339
  var PUBLISH_VALUES = /* @__PURE__ */ new Set([1, 2, 4]);
9271
10340
  var SAFE_TICKET_CREATE_DEFAULTS = {};
9272
- var QueueRequiredError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10341
+ var QueueRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
9273
10342
  constructor(message, options = {}) {
9274
10343
  super(message, {
9275
10344
  code: "QUEUE_REQUIRED",
@@ -9280,13 +10349,13 @@ var QueueRequiredError = class extends _chunkYKEX4SK7cjs.AutotaskError {
9280
10349
  this.name = "QueueRequiredError";
9281
10350
  }
9282
10351
  };
9283
- var TicketResourceInvalidError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10352
+ var TicketResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
9284
10353
  constructor(message, options = {}) {
9285
10354
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
9286
10355
  this.name = "TicketResourceInvalidError";
9287
10356
  }
9288
10357
  };
9289
- var TicketCreateValidationFailedError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10358
+ var TicketCreateValidationFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
9290
10359
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
9291
10360
 
9292
10361
  constructor(message, vendorFields, options = {}) {
@@ -9296,43 +10365,43 @@ var TicketCreateValidationFailedError = class extends _chunkYKEX4SK7cjs.Autotask
9296
10365
  }
9297
10366
  };
9298
10367
  async function openWithNoteAndAssign(resource, params, note, assign, opts, http) {
9299
- const companyID = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, _optionalChain([params, 'optionalAccess', _37 => _37.companyID]), "params.companyID");
9300
- const title = _optionalChain([params, 'optionalAccess', _38 => _38.title]);
10368
+ const companyID = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, _optionalChain([params, 'optionalAccess', _43 => _43.companyID]), "params.companyID");
10369
+ const title = _optionalChain([params, 'optionalAccess', _44 => _44.title]);
9301
10370
  if (typeof title !== "string" || title.trim() === "") {
9302
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("openWithNoteAndAssign: params.title is required (a non-empty string)", { operation: OP_OPEN });
10371
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: params.title is required (a non-empty string)", { operation: OP_OPEN });
9303
10372
  }
9304
10373
  const priority = _nullishCoalesce(params.priority, () => ( DEFAULT_TICKET_PRIORITY));
9305
10374
  const status = _nullishCoalesce(params.status, () => ( DEFAULT_TICKET_STATUS));
9306
10375
  if (!isPositiveInt(priority)) {
9307
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: params.priority must be a positive integer (got ${String(params.priority)})`, { operation: OP_OPEN });
10376
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.priority must be a positive integer (got ${String(params.priority)})`, { operation: OP_OPEN });
9308
10377
  }
9309
10378
  if (!isPositiveInt(status)) {
9310
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: params.status must be a positive integer (got ${String(params.status)})`, { operation: OP_OPEN });
10379
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.status must be a positive integer (got ${String(params.status)})`, { operation: OP_OPEN });
9311
10380
  }
9312
10381
  if (params.queueID !== void 0 && !isPositiveInt(params.queueID)) {
9313
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: params.queueID must be a positive integer (got ${String(params.queueID)})`, { operation: OP_OPEN });
10382
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.queueID must be a positive integer (got ${String(params.queueID)})`, { operation: OP_OPEN });
9314
10383
  }
9315
10384
  if (note !== void 0) {
9316
10385
  if (typeof note.description !== "string" || note.description.trim() === "") {
9317
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("openWithNoteAndAssign: note.description is required (a non-empty string)", { operation: OP_OPEN });
10386
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: note.description is required (a non-empty string)", { operation: OP_OPEN });
9318
10387
  }
9319
10388
  if (typeof note.title !== "string" || note.title.trim() === "") {
9320
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("openWithNoteAndAssign: note.title is required (a non-empty string) \u2014 the ww29 scoped note create 500s without it (S12-A live-verified: Missing Required Field: title; the S11-B proven note body is { title, description, noteType: 1, publish: 1 })", { operation: OP_OPEN });
10389
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: note.title is required (a non-empty string) \u2014 the ww29 scoped note create 500s without it (S12-A live-verified: Missing Required Field: title; the S11-B proven note body is { title, description, noteType: 1, publish: 1 })", { operation: OP_OPEN });
9321
10390
  }
9322
10391
  if (note.noteType !== void 0 && !isPositiveInt(note.noteType)) {
9323
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: note.noteType must be a positive integer (got ${String(note.noteType)})`, { operation: OP_OPEN });
10392
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: note.noteType must be a positive integer (got ${String(note.noteType)})`, { operation: OP_OPEN });
9324
10393
  }
9325
10394
  if (note.publish !== void 0 && !PUBLISH_VALUES.has(note.publish)) {
9326
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: note.publish must be an integer picklist value 1/2/4 (got ${String(note.publish)} \u2014 NOT a boolean)`, { operation: OP_OPEN });
10395
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: note.publish must be an integer picklist value 1/2/4 (got ${String(note.publish)} \u2014 NOT a boolean)`, { operation: OP_OPEN });
9327
10396
  }
9328
10397
  }
9329
- const assignee = assign === void 0 ? void 0 : _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, assign.resourceID, "assign.resourceID");
10398
+ const assignee = assign === void 0 ? void 0 : _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, assign.resourceID, "assign.resourceID");
9330
10399
  if (assign !== void 0 && assignee !== void 0 && (typeof assignee === "number" ? assignee < 1 : false)) {
9331
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`openWithNoteAndAssign: assign.resourceID must be a positive integer (got ${String(assignee)})`, { operation: OP_OPEN });
10400
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: assign.resourceID must be a positive integer (got ${String(assignee)})`, { operation: OP_OPEN });
9332
10401
  }
9333
- const roleID = _optionalChain([assign, 'optionalAccess', _39 => _39.roleID]);
10402
+ const roleID = _optionalChain([assign, 'optionalAccess', _45 => _45.roleID]);
9334
10403
  if (assign !== void 0 && !isPositiveInt(roleID)) {
9335
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("openWithNoteAndAssign: assign.roleID is required (a positive integer) \u2014 the ww29 vendor requires BOTH assignedResourceID and assignedResourceRoleID when assigning a resource (S12-A live-verified: Data violation: When assigning a Resource, you must assign both a assignedResourceID and assignedResourceRoleID)", { operation: OP_OPEN });
10404
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: assign.roleID is required (a positive integer) \u2014 the ww29 vendor requires BOTH assignedResourceID and assignedResourceRoleID when assigning a resource (S12-A live-verified: Data violation: When assigning a Resource, you must assign both a assignedResourceID and assignedResourceRoleID)", { operation: OP_OPEN });
9336
10405
  }
9337
10406
  if (assign !== void 0 && assignee !== void 0) {
9338
10407
  const rid = assignee;
@@ -9367,7 +10436,7 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
9367
10436
  if (assign !== void 0) {
9368
10437
  warnings.push(`the assignment is the v0.6.0 MERGE update (unredacted GET + collection PUT, 2 wire) setting assignedResourceID ${String(assignee)} + assignedResourceRoleID ${String(roleID)} (the vendor requires both \u2014 S12-A live-verified); a failure lands in steps[] as ASSIGN_FAILED (the applied ticketId is still returned).`);
9369
10438
  }
9370
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
10439
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
9371
10440
  {
9372
10441
  operation: OP_OPEN,
9373
10442
  method: "POST",
@@ -9409,8 +10478,8 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
9409
10478
  `openWithNoteAndAssign: the vendor rejected the ticket create naming 'queueID' (the ww29 live-required set is { title, status, priority, companyID, queueID }) and the node never guesses a queue${detail ? ` \u2014 ${detail}` : ""}`,
9410
10479
  {
9411
10480
  operation: OP_OPEN,
9412
- httpStatus: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
9413
- vendorError: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0
10481
+ httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10482
+ vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0
9414
10483
  }
9415
10484
  );
9416
10485
  }
@@ -9425,8 +10494,8 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
9425
10494
  named,
9426
10495
  {
9427
10496
  operation: OP_OPEN,
9428
- httpStatus: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
9429
- vendorError: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10497
+ httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10498
+ vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
9430
10499
  resourceIds: [companyID]
9431
10500
  }
9432
10501
  );
@@ -9448,10 +10517,10 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
9448
10517
  try {
9449
10518
  const current = await fetchItemUnredacted(http, `/V1.0/Tickets/${ticketId}`, OP_OPEN);
9450
10519
  if (current === null) {
9451
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`openWithNoteAndAssign: ticket ${ticketId} vanished between the create and the assign merge read`, { operation: OP_OPEN, resourceIds: [ticketId] });
10520
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`openWithNoteAndAssign: ticket ${ticketId} vanished between the create and the assign merge read`, { operation: OP_OPEN, resourceIds: [ticketId] });
9452
10521
  }
9453
10522
  ticketNumber = typeof current.ticketNumber === "string" ? current.ticketNumber : null;
9454
- const merged = _chunkYKEX4SK7cjs.mergePartialBody.call(void 0, current, { id: ticketId, assignedResourceID: assignee, assignedResourceRoleID: roleID });
10523
+ const merged = _chunk5N6DYKXOcjs.mergePartialBody.call(void 0, current, { id: ticketId, assignedResourceID: assignee, assignedResourceRoleID: roleID });
9455
10524
  merged.id = ticketId;
9456
10525
  await http.request({ method: "PUT", path: "/V1.0/Tickets", body: merged, operation: OP_OPEN });
9457
10526
  assigned = true;
@@ -9472,7 +10541,7 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
9472
10541
  var STATUS_REQUIRED_FIELDS = {
9473
10542
  // <discovery output lands here — e.g. 8: { requiredFields: ['dueDateTime'], safeDefaults: { dueDateTime: '<now>' } }>
9474
10543
  };
9475
- var StatusUnknownError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10544
+ var StatusUnknownError = class extends _chunk5N6DYKXOcjs.AutotaskError {
9476
10545
  /** The live picklist size (the message names it; the values + labels are via operations.fieldCatalog with labels: true). */
9477
10546
 
9478
10547
  constructor(message, options = {}) {
@@ -9486,7 +10555,7 @@ var StatusUnknownError = class extends _chunkYKEX4SK7cjs.AutotaskError {
9486
10555
  this.picklistCount = _nullishCoalesce(options.picklistCount, () => ( 0));
9487
10556
  }
9488
10557
  };
9489
- var StatusFieldsRequiredError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10558
+ var StatusFieldsRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
9490
10559
 
9491
10560
 
9492
10561
 
@@ -9515,26 +10584,26 @@ async function readLiveStatusSet(resource) {
9515
10584
  }
9516
10585
  var GUARD_DEGRADED_WARNING = "the tenant's live status picklist metadata was unavailable (the local guard is degraded for this call \u2014 the W-A4 wall or a metadata failure); the vendor's own validation is the final authority on the status value";
9517
10586
  async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9518
- const ticketId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
10587
+ const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
9519
10588
  if (!isPositiveInt(targetStatus)) {
9520
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`changeStatus: targetStatus must be a positive integer (got ${String(targetStatus)})`, { operation: OP_STATUS });
10589
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`changeStatus: targetStatus must be a positive integer (got ${String(targetStatus)})`, { operation: OP_STATUS });
9521
10590
  }
9522
10591
  let liveStatus = null;
9523
10592
  try {
9524
10593
  const ids = await readLiveStatusSet(resource);
9525
10594
  if (ids.size > 0) liveStatus = ids;
9526
10595
  } catch (err) {
9527
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10596
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
9528
10597
  }
9529
10598
  if (liveStatus !== null && !liveStatus.has(targetStatus)) {
9530
- _optionalChain([http, 'access', _40 => _40.fieldCache, 'optionalAccess', _41 => _41.invalidate, 'call', _42 => _42("tickets")]);
10599
+ _optionalChain([http, 'access', _46 => _46.fieldCache, 'optionalAccess', _47 => _47.invalidate, 'call', _48 => _48("tickets")]);
9531
10600
  let freshStatus = null;
9532
10601
  let reReadFailed = false;
9533
10602
  try {
9534
10603
  const freshIds = await readLiveStatusSet(resource);
9535
10604
  if (freshIds.size > 0) freshStatus = freshIds;
9536
10605
  } catch (err) {
9537
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10606
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
9538
10607
  freshStatus = null;
9539
10608
  reReadFailed = true;
9540
10609
  }
@@ -9551,16 +10620,16 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9551
10620
  }
9552
10621
  const guardDegraded = liveStatus === null;
9553
10622
  if (fields !== void 0 && (typeof fields !== "object" || fields === null || Array.isArray(fields))) {
9554
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("changeStatus: fields must be a plain object of ticket fields (or omitted)", { operation: OP_STATUS });
10623
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("changeStatus: fields must be a plain object of ticket fields (or omitted)", { operation: OP_STATUS });
9555
10624
  }
9556
10625
  const current = await fetchItemUnredacted(http, `/V1.0/Tickets/${ticketId}`, OP_STATUS);
9557
10626
  if (current === null) {
9558
- throw new (0, _chunkYKEX4SK7cjs.NotFoundError)(`changeStatus: ticket ${ticketId} was not found (tickets.get returned item: null)`, { operation: OP_STATUS, resourceIds: [ticketId] });
10627
+ throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`changeStatus: ticket ${ticketId} was not found (tickets.get returned item: null)`, { operation: OP_STATUS, resourceIds: [ticketId] });
9559
10628
  }
9560
10629
  const previousStatus = typeof current.status === "number" ? current.status : null;
9561
10630
  if (previousStatus === targetStatus) {
9562
10631
  if (opts.dryRun === true) {
9563
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
10632
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
9564
10633
  {
9565
10634
  operation: OP_STATUS,
9566
10635
  method: "PUT",
@@ -9593,7 +10662,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9593
10662
  for (const field of mapEntry.requiredFields) {
9594
10663
  if (mergeData[field] !== void 0) continue;
9595
10664
  if (current[field] !== null && current[field] !== void 0) continue;
9596
- const safe = _optionalChain([mapEntry, 'access', _43 => _43.safeDefaults, 'optionalAccess', _44 => _44[field]]);
10665
+ const safe = _optionalChain([mapEntry, 'access', _49 => _49.safeDefaults, 'optionalAccess', _50 => _50[field]]);
9597
10666
  if (safe === void 0) {
9598
10667
  throw new StatusFieldsRequiredError(
9599
10668
  `changeStatus: status ${targetStatus} requires the field '${field}' and the live-discovered map has no proven-safe default for it \u2014 the op is safe-without-the-map (never a blind full update): supply the value in fields and retry`,
@@ -9614,7 +10683,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9614
10683
  if (mapEntry === void 0) {
9615
10684
  warnings.push(`status ${targetStatus} has no entry in the live-discovered required-field map yet \u2014 if the vendor 500 names a required field without a safe default, the apply throws the typed STATUS_FIELDS_REQUIRED (the caller supplies the value; never a blind retry).`);
9616
10685
  }
9617
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
10686
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
9618
10687
  {
9619
10688
  operation: OP_STATUS,
9620
10689
  method: "PUT",
@@ -9632,8 +10701,8 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9632
10701
  { redactPersonalData: http.redactPersonalData }
9633
10702
  );
9634
10703
  }
9635
- const safeDefaults = _nullishCoalesce(_optionalChain([mapEntry, 'optionalAccess', _45 => _45.safeDefaults]), () => ( {}));
9636
- const body = _chunkYKEX4SK7cjs.mergePartialBody.call(void 0, current, mergeData);
10704
+ const safeDefaults = _nullishCoalesce(_optionalChain([mapEntry, 'optionalAccess', _51 => _51.safeDefaults]), () => ( {}));
10705
+ const body = _chunk5N6DYKXOcjs.mergePartialBody.call(void 0, current, mergeData);
9637
10706
  body.id = ticketId;
9638
10707
  let merges = 0;
9639
10708
  for (; ; ) {
@@ -9657,8 +10726,8 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9657
10726
  { vendorFields: named, currentStatus: previousStatus, targetStatus, currentValues },
9658
10727
  {
9659
10728
  operation: OP_STATUS,
9660
- httpStatus: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
9661
- vendorError: _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10729
+ httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10730
+ vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
9662
10731
  resourceIds: [ticketId]
9663
10732
  }
9664
10733
  );
@@ -9668,7 +10737,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9668
10737
  }
9669
10738
  const verify = await fetchItem(http, `/V1.0/Tickets/${ticketId}`, OP_STATUS);
9670
10739
  if (verify === null) {
9671
- throw new (0, _chunkYKEX4SK7cjs.AutotaskError)(`changeStatus: the post-PUT read-back found no ticket ${ticketId} (the PUT 200ed but the record is gone)`, {
10740
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(`changeStatus: the post-PUT read-back found no ticket ${ticketId} (the PUT 200ed but the record is gone)`, {
9672
10741
  code: "INVALID_RESPONSE",
9673
10742
  category: "server",
9674
10743
  operation: OP_STATUS,
@@ -9677,7 +10746,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
9677
10746
  }
9678
10747
  const finalStatus = typeof verify.status === "number" ? verify.status : null;
9679
10748
  if (finalStatus !== targetStatus) {
9680
- throw new (0, _chunkYKEX4SK7cjs.AutotaskError)(
10749
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(
9681
10750
  `changeStatus: the post-PUT read-back shows status ${_nullishCoalesce(finalStatus, () => ( "unknown"))} (the vendor 200ed the PUT but did not apply ${targetStatus} \u2014 the F-A1 lesson: the 200 proves nothing)`,
9682
10751
  {
9683
10752
  code: "INVALID_RESPONSE",
@@ -9695,7 +10764,7 @@ var DEFAULT_PART_LIMIT = 50;
9695
10764
  function partLimit(value, name) {
9696
10765
  const n = value === void 0 ? DEFAULT_PART_LIMIT : Math.trunc(value);
9697
10766
  if (!Number.isInteger(n) || n < 1) {
9698
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`fullContext: ${name} must be an integer >= 1 (got ${String(value)})`);
10767
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`fullContext: ${name} must be an integer >= 1 (got ${String(value)})`);
9699
10768
  }
9700
10769
  return n;
9701
10770
  }
@@ -9711,7 +10780,7 @@ async function fullContext(resource, id, opts = {}, http) {
9711
10780
  const noteLimit = partLimit(opts.noteLimit, "noteLimit");
9712
10781
  const timeEntryLimit = partLimit(opts.timeEntryLimit, "timeEntryLimit");
9713
10782
  const textLimit = partLimit(opts.textLimit, "textLimit");
9714
- const ticketId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
10783
+ const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
9715
10784
  const ctx = await resource.getContext(ticketId);
9716
10785
  const op = "tickets.fullContext";
9717
10786
  const ticketFilter = [{ field: "ticketID", op: "eq", value: ticketId }];
@@ -9765,7 +10834,7 @@ async function fullContext(resource, id, opts = {}, http) {
9765
10834
  result.truncated = result.truncated || part.capped || historyRows.some((h) => h.detailTruncated === true);
9766
10835
  }
9767
10836
  if (opts.names === true) {
9768
- const builder = _chunkYKEX4SK7cjs.createNamePlan.call(void 0, _chunkYKEX4SK7cjs.TICKET_LABEL_FIELDS);
10837
+ const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS);
9769
10838
  const t = ctx.ticket;
9770
10839
  builder.addResource(t["creatorResourceID"]);
9771
10840
  builder.addFk("contract", t["contractID"]);
@@ -9777,20 +10846,20 @@ async function fullContext(resource, id, opts = {}, http) {
9777
10846
  builder.addFk("billingCode", e["billingCodeID"]);
9778
10847
  builder.addFk("contract", e["contractID"]);
9779
10848
  }
9780
- const names = await _chunkYKEX4SK7cjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
10849
+ const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
9781
10850
  const ticketRow = { ...ctx.ticket };
9782
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, ticketRow, "creatorResourceID", (v) => names.resourceName(v));
9783
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, ticketRow, "contractID", (v) => names.recordName("contract", v));
9784
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, ticketRow, "billingCodeID", (v) => names.recordName("billingCode", v));
9785
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, ticketRow, "assignedResourceRoleID", (v) => names.recordName("role", v));
9786
- for (const f of _chunkYKEX4SK7cjs.TICKET_LABEL_FIELDS) _chunkYKEX4SK7cjs.addLabelSibling.call(void 0, ticketRow, f, names);
10851
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ticketRow, "creatorResourceID", (v) => names.resourceName(v));
10852
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ticketRow, "contractID", (v) => names.recordName("contract", v));
10853
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ticketRow, "billingCodeID", (v) => names.recordName("billingCode", v));
10854
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ticketRow, "assignedResourceRoleID", (v) => names.recordName("role", v));
10855
+ for (const f of _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS) _chunk5N6DYKXOcjs.addLabelSibling.call(void 0, ticketRow, f, names);
9787
10856
  result.ticket = ticketRow;
9788
10857
  result.timeEntries.items = entriesPart.items.map((e) => {
9789
10858
  const row = { ...e };
9790
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "resourceID", (v) => names.resourceName(v));
9791
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "roleID", (v) => names.recordName("role", v));
9792
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "billingCodeID", (v) => names.recordName("billingCode", v));
9793
- _chunkYKEX4SK7cjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
10859
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "resourceID", (v) => names.resourceName(v));
10860
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "roleID", (v) => names.recordName("role", v));
10861
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "billingCodeID", (v) => names.recordName("billingCode", v));
10862
+ _chunk5N6DYKXOcjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
9794
10863
  return row;
9795
10864
  });
9796
10865
  result.names = names.section;
@@ -9800,7 +10869,7 @@ async function fullContext(resource, id, opts = {}, http) {
9800
10869
  }
9801
10870
 
9802
10871
  // src/resources/tickets.ts
9803
- var TicketsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
10872
+ var TicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9804
10873
  constructor(http, pageSize) {
9805
10874
  super(http, {
9806
10875
  key: "tickets",
@@ -9906,7 +10975,7 @@ var TicketsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
9906
10975
  };
9907
10976
 
9908
10977
  // src/resources/ticket_webhooks.ts
9909
- var TicketWebhooksResource = class extends _chunkYKEX4SK7cjs.BaseResource {
10978
+ var TicketWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9910
10979
  constructor(http, pageSize) {
9911
10980
  super(http, {
9912
10981
  key: "ticket_webhooks",
@@ -9992,62 +11061,62 @@ async function queryTimeEntries(_resource, filter, limit, operation, http) {
9992
11061
  body: { MaxRecords: limit, filter },
9993
11062
  operation
9994
11063
  });
9995
- const { items, pageDetails } = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res);
11064
+ const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res);
9996
11065
  return { items, hasMore: pageDetails.nextPageUrl != null };
9997
11066
  }
9998
11067
  async function windowQuery3(_resource, kind, http, opts) {
9999
- const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _46 => _46.now]), () => ( /* @__PURE__ */ new Date()));
10000
- const tz = _optionalChain([opts, 'optionalAccess', _47 => _47.tz]) === void 0 ? void 0 : validateZone(opts.tz, `time_entries.${kind}`);
11068
+ const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _52 => _52.now]), () => ( /* @__PURE__ */ new Date()));
11069
+ const tz = _optionalChain([opts, 'optionalAccess', _53 => _53.tz]) === void 0 ? void 0 : validateZone(opts.tz, `time_entries.${kind}`);
10001
11070
  const { from, to } = dateWindowBounds(kind, now, tz);
10002
11071
  const filter = [
10003
11072
  { field: "dateWorked", op: "gte", value: from },
10004
11073
  { field: "dateWorked", op: "lte", value: to }
10005
11074
  ];
10006
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _48 => _48.limit])), `time_entries.${kind}`, http);
11075
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _54 => _54.limit])), `time_entries.${kind}`, http);
10007
11076
  return items;
10008
11077
  }
10009
11078
  async function customRange3(_resource, from, to, http, opts) {
10010
- const zone = _optionalChain([opts, 'optionalAccess', _49 => _49.tz]) === void 0 ? void 0 : validateZone(opts.tz, "time_entries.customRange");
11079
+ const zone = _optionalChain([opts, 'optionalAccess', _55 => _55.tz]) === void 0 ? void 0 : validateZone(opts.tz, "time_entries.customRange");
10011
11080
  const fromB = customRangeDay(from, "from", zone, "customRange");
10012
11081
  const toB = customRangeDay(to, "to", zone, "customRange");
10013
11082
  if (fromB.ms > toB.ms) {
10014
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("customRange: from must not be after to");
11083
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("customRange: from must not be after to");
10015
11084
  }
10016
11085
  const toEndMs = zone === void 0 ? toB.ms + DAY_MS2 - 1 : localDayEndMs(toB.y, toB.mo, toB.d, zone);
10017
11086
  const filter = [
10018
11087
  { field: "dateWorked", op: "gte", value: iso2(fromB.ms) },
10019
11088
  { field: "dateWorked", op: "lte", value: iso2(toEndMs) }
10020
11089
  ];
10021
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _50 => _50.limit])), "time_entries.customRange", http);
11090
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _56 => _56.limit])), "time_entries.customRange", http);
10022
11091
  return items;
10023
11092
  }
10024
11093
  async function postedDateStatusQuery(_resource, mode, http, opts) {
10025
11094
  const filter = [
10026
11095
  { field: "postedDate", op: mode === "posted" ? "exist" : "notExist" }
10027
11096
  ];
10028
- if (_optionalChain([opts, 'optionalAccess', _51 => _51.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
11097
+ if (_optionalChain([opts, 'optionalAccess', _57 => _57.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
10029
11098
  const operation = mode === "posted" ? "time_entries.getPosted" : "time_entries.getUnposted";
10030
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _52 => _52.limit])), operation, http);
11099
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _58 => _58.limit])), operation, http);
10031
11100
  return items;
10032
11101
  }
10033
11102
  async function postedWithin(_resource, from, to, http, opts, opLabel = "time_entries.postedWithin") {
10034
11103
  const OP2 = opLabel;
10035
- const zone = _optionalChain([opts, 'optionalAccess', _53 => _53.tz]) === void 0 ? void 0 : validateZone(opts.tz, OP2);
11104
+ const zone = _optionalChain([opts, 'optionalAccess', _59 => _59.tz]) === void 0 ? void 0 : validateZone(opts.tz, OP2);
10036
11105
  const fromB = customRangeDay(from, "from", zone, OP2);
10037
11106
  const toB = customRangeDay(to, "to", zone, OP2);
10038
11107
  if (fromB.ms > toB.ms) {
10039
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(`${OP2}: from (${iso2(fromB.ms)}) must not be after to (${iso2(toB.ms)})`, { operation: OP2 });
11108
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${OP2}: from (${iso2(fromB.ms)}) must not be after to (${iso2(toB.ms)})`, { operation: OP2 });
10040
11109
  }
10041
11110
  const windowToMs = zone === void 0 ? toB.ms + DAY_MS2 - 1 : localDayEndMs(toB.y, toB.mo, toB.d, zone);
10042
11111
  const filter = [
10043
11112
  { field: "dateWorked", op: "gte", value: iso2(fromB.ms) },
10044
11113
  { field: "dateWorked", op: "lte", value: iso2(windowToMs) }
10045
11114
  ];
10046
- if (_optionalChain([opts, 'optionalAccess', _54 => _54.posted]) === true) filter.push({ field: "postedDate", op: "exist" });
10047
- else if (_optionalChain([opts, 'optionalAccess', _55 => _55.posted]) === false) filter.push({ field: "postedDate", op: "notExist" });
10048
- if (_optionalChain([opts, 'optionalAccess', _56 => _56.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
10049
- if (_optionalChain([opts, 'optionalAccess', _57 => _57.resourceID]) !== void 0) filter.push({ field: "resourceID", op: "eq", value: opts.resourceID });
10050
- const { items, hasMore } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _58 => _58.limit])), OP2, http);
11115
+ if (_optionalChain([opts, 'optionalAccess', _60 => _60.posted]) === true) filter.push({ field: "postedDate", op: "exist" });
11116
+ else if (_optionalChain([opts, 'optionalAccess', _61 => _61.posted]) === false) filter.push({ field: "postedDate", op: "notExist" });
11117
+ if (_optionalChain([opts, 'optionalAccess', _62 => _62.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
11118
+ if (_optionalChain([opts, 'optionalAccess', _63 => _63.resourceID]) !== void 0) filter.push({ field: "resourceID", op: "eq", value: opts.resourceID });
11119
+ const { items, hasMore } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _64 => _64.limit])), OP2, http);
10051
11120
  let postedCount = 0;
10052
11121
  for (const item of items) {
10053
11122
  const postedDate = item.postedDate;
@@ -10103,13 +11172,13 @@ var LINKAGE_OWNED_FIELDS = /* @__PURE__ */ new Set([
10103
11172
  "roleID"
10104
11173
  ]);
10105
11174
  var TIME_WINDOW_FIELDS = /* @__PURE__ */ new Set(["dateWorked", "startDateTime", "endDateTime", "hoursWorked"]);
10106
- var ResourceInvalidError = class extends _chunkYKEX4SK7cjs.AutotaskError {
11175
+ var ResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10107
11176
  constructor(message, options = {}) {
10108
11177
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
10109
11178
  this.name = "ResourceInvalidError";
10110
11179
  }
10111
11180
  };
10112
- var AllocationCodeError = class extends _chunkYKEX4SK7cjs.AutotaskError {
11181
+ var AllocationCodeError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10113
11182
  /** The failure kind (the machine code is `ALLOCATION_CODE_<KIND>`). */
10114
11183
 
10115
11184
  constructor(kind, message, options = {}) {
@@ -10118,7 +11187,7 @@ var AllocationCodeError = class extends _chunkYKEX4SK7cjs.AutotaskError {
10118
11187
  this.kind = kind;
10119
11188
  }
10120
11189
  };
10121
- var NoApplicableAllocationCodeError = class extends _chunkYKEX4SK7cjs.AutotaskError {
11190
+ var NoApplicableAllocationCodeError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10122
11191
  /** The structured blocker details (filters tried + department sets). */
10123
11192
 
10124
11193
  constructor(details, options = {}) {
@@ -10144,7 +11213,7 @@ async function boundedQuery(http, path, filter, totalCap, operation) {
10144
11213
  let pages = 0;
10145
11214
  for (; ; ) {
10146
11215
  if (pages >= PAGE_GUARD) {
10147
- throw new (0, _chunkYKEX4SK7cjs.AutotaskError)(`createForResource: the ${path} walk hit the ${PAGE_GUARD}-page guard`, {
11216
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(`createForResource: the ${path} walk hit the ${PAGE_GUARD}-page guard`, {
10148
11217
  code: "RESOLUTION_TRUNCATED",
10149
11218
  category: "resolution",
10150
11219
  operation,
@@ -10155,11 +11224,11 @@ async function boundedQuery(http, path, filter, totalCap, operation) {
10155
11224
  const res = await http.request({
10156
11225
  method: "POST",
10157
11226
  idempotent: true,
10158
- path: isFirst ? path : _chunkYKEX4SK7cjs.cursorToPath.call(void 0, http.baseUrl, cursor),
11227
+ path: isFirst ? path : _chunk5N6DYKXOcjs.cursorToPath.call(void 0, http.baseUrl, cursor),
10159
11228
  body: { MaxRecords: pageSize, filter },
10160
11229
  operation
10161
11230
  });
10162
- const { items: pageItems, pageDetails } = _chunkYKEX4SK7cjs.unwrapItems.call(void 0, res, operation);
11231
+ const { items: pageItems, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, operation);
10163
11232
  items.push(...pageItems);
10164
11233
  pages += 1;
10165
11234
  if (items.length >= totalCap) break;
@@ -10272,8 +11341,8 @@ function windowDefaults(params) {
10272
11341
  };
10273
11342
  }
10274
11343
  async function createForResource(resource, resourceID, params, opts = {}, http) {
10275
- const rid = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, resourceID, "resourceID");
10276
- const pin = (value, label) => typeof value === "number" ? _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, value, label) : void 0;
11344
+ const rid = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceID, "resourceID");
11345
+ const pin = (value, label) => typeof value === "number" ? _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, value, label) : void 0;
10277
11346
  const pins = {
10278
11347
  code: pin(params.internallAllocationCodeID, "internallAllocationCodeID"),
10279
11348
  ticket: pin(params.ticketID, "ticketID"),
@@ -10282,19 +11351,19 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
10282
11351
  };
10283
11352
  const pinCount = [pins.code, pins.ticket, pins.task].filter((v) => v !== void 0).length;
10284
11353
  if (pinCount > 1) {
10285
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
11354
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
10286
11355
  "createForResource: exactly one linkage pin is honoured (internallAllocationCodeID | ticketID | taskID) \u2014 the vendor gate requires exactly one; pass one pin (or none for the default internal linkage)",
10287
11356
  { operation: OP }
10288
11357
  );
10289
11358
  }
10290
11359
  if (pins.role !== void 0 && pins.code !== void 0) {
10291
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
11360
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
10292
11361
  "createForResource: a pinned roleID is only meaningful with the task/ticket linkage (internallAllocationCodeID pins the internal linkage and owns the code) \u2014 drop one",
10293
11362
  { operation: OP }
10294
11363
  );
10295
11364
  }
10296
11365
  if (params.hoursWorked !== void 0 && (typeof params.hoursWorked !== "number" || !Number.isFinite(params.hoursWorked) || params.hoursWorked <= 0)) {
10297
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)(
11366
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
10298
11367
  `createForResource: hoursWorked must be a positive finite number (got ${String(params.hoursWorked)})`,
10299
11368
  { operation: OP }
10300
11369
  );
@@ -10371,7 +11440,7 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
10371
11440
  if (usedLinkage === "internal" && linkage === "task") {
10372
11441
  warnings.push("the task had zero applicable general allocation codes \u2014 the linkage fell back to internal (the sanctioned fallback; no taskID/roleID in the body).");
10373
11442
  }
10374
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0,
11443
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
10375
11444
  {
10376
11445
  operation: OP,
10377
11446
  method: "POST",
@@ -10410,7 +11479,7 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
10410
11479
  };
10411
11480
  } catch (err) {
10412
11481
  lastError = err;
10413
- const text = _chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) ? `${_nullishCoalesce(_chunkYKEX4SK7cjs.formatVendorDetail.call(void 0, err.vendorError), () => ( ""))} ${err.message}` : "";
11482
+ const text = _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? `${_nullishCoalesce(_chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError), () => ( ""))} ${err.message}` : "";
10414
11483
  const gate3 = ROLE_REJECTION_PATTERN.test(text);
10415
11484
  if (usedLinkage !== "internal" && gate3) {
10416
11485
  if (!taskRoleFetched && usedLinkage === "task" && pins.task !== void 0) {
@@ -10430,14 +11499,14 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
10430
11499
  throw err;
10431
11500
  }
10432
11501
  }
10433
- if (_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, lastError)) {
11502
+ if (_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, lastError)) {
10434
11503
  lastError.suggestedAction = (lastError.suggestedAction ? `${lastError.suggestedAction} ` : "") + `The createForResource attempt budget (${MAX_CREATE_ATTEMPTS} attempts: the role ladder + ${MAX_DISCOVERY_MERGES2} discovery merges) was exhausted \u2014 the vendor oracle rejected every candidate. Re-read the record/fields (operations.fieldCatalog, billing_codes.query with a filter) and retry with an explicit pin.`;
10435
11504
  }
10436
11505
  throw lastError;
10437
11506
  }
10438
11507
  function discoveryField(err, body, defaults) {
10439
- if (!_chunkYKEX4SK7cjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
10440
- const entries = _chunkYKEX4SK7cjs.parseVendorErrors.call(void 0, err.vendorError);
11508
+ if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
11509
+ const entries = _chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError);
10441
11510
  if (entries === void 0) return null;
10442
11511
  for (const entry of entries) {
10443
11512
  const field = entry.field;
@@ -10450,7 +11519,7 @@ function discoveryField(err, body, defaults) {
10450
11519
  }
10451
11520
 
10452
11521
  // src/resources/time_entries.ts
10453
- var TimeEntriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
11522
+ var TimeEntriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10454
11523
  constructor(http, pageSize) {
10455
11524
  super(http, {
10456
11525
  key: "time_entries",
@@ -10587,7 +11656,7 @@ var TimeEntriesResource = class extends _chunkYKEX4SK7cjs.BaseResource {
10587
11656
  };
10588
11657
 
10589
11658
  // src/resources/time_entry_attachments.ts
10590
- var TimeEntryAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
11659
+ var TimeEntryAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10591
11660
  constructor(http, pageSize) {
10592
11661
  super(http, {
10593
11662
  key: "time_entry_attachments",
@@ -10650,9 +11719,9 @@ var TimeEntryAttachmentsResource = class extends _chunkYKEX4SK7cjs.BaseResource
10650
11719
 
10651
11720
  // src/resources/special/time_off_requests.ts
10652
11721
  async function approve(_resource, id, opts = {}, http) {
10653
- const numericId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
11722
+ const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10654
11723
  if (opts.dryRun === true) {
10655
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
11724
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
10656
11725
  operation: "time_off_requests.approve",
10657
11726
  method: "GET",
10658
11727
  path: `/V1.0/TimeOffRequests/${numericId}/Approve`,
@@ -10667,16 +11736,16 @@ async function approve(_resource, id, opts = {}, http) {
10667
11736
  path: `/V1.0/TimeOffRequests/${numericId}/Approve`,
10668
11737
  operation: "time_off_requests.approve"
10669
11738
  });
10670
- return _chunkYKEX4SK7cjs.unwrapOperation.call(void 0, res);
11739
+ return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
10671
11740
  }
10672
11741
  async function reject(_resource, id, reason, opts = {}, http) {
10673
- const numericId = _chunkYKEX4SK7cjs.parseIdentifier.call(void 0, id, "id");
11742
+ const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10674
11743
  const text = reason.trim();
10675
11744
  if (text === "") {
10676
- throw new (0, _chunkYKEX4SK7cjs.AutotaskConfigError)("reject: a non-empty reason is required (vendor TimeOffRequestRejectModel)");
11745
+ throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("reject: a non-empty reason is required (vendor TimeOffRequestRejectModel)");
10677
11746
  }
10678
11747
  if (opts.dryRun === true) {
10679
- return _chunkYKEX4SK7cjs.buildDryRunResult.call(void 0, {
11748
+ return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
10680
11749
  operation: "time_off_requests.reject",
10681
11750
  method: "POST",
10682
11751
  path: `/V1.0/TimeOffRequests/${numericId}/Reject`,
@@ -10693,11 +11762,11 @@ async function reject(_resource, id, reason, opts = {}, http) {
10693
11762
  body: { timeOffRequestID: numericId, reason: text },
10694
11763
  operation: "time_off_requests.reject"
10695
11764
  });
10696
- return _chunkYKEX4SK7cjs.unwrapOperation.call(void 0, res);
11765
+ return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
10697
11766
  }
10698
11767
 
10699
11768
  // src/resources/time_off_requests.ts
10700
- var TimeOffRequestsResource = class extends _chunkYKEX4SK7cjs.BaseResource {
11769
+ var TimeOffRequestsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10701
11770
  constructor(http, pageSize) {
10702
11771
  super(http, {
10703
11772
  key: "time_off_requests",