node-autotask 0.12.0 → 0.13.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 (35) hide show
  1. package/MCP_TOOL_CATALOG.json +4 -3
  2. package/MCP_TOOL_MANIFEST.md +5 -5
  3. package/N8N_MCP_MANIFEST.json +2 -2
  4. package/N8N_MCP_MANIFEST.md +3 -3
  5. package/capabilities.json +1238 -1237
  6. package/dist/capabilities.cjs +2 -2
  7. package/dist/capabilities.js +1 -1
  8. package/dist/{chunk-SRJI5XUZ.cjs → chunk-CJA6L6NR.cjs} +135 -135
  9. package/dist/{chunk-JKZVCFRY.cjs → chunk-CXXNONRP.cjs} +1237 -1236
  10. package/dist/{chunk-3WIDDEHP.js → chunk-DDZXN6LN.js} +2 -2
  11. package/dist/{chunk-GD4JRPYF.js → chunk-IKJLIDK3.js} +1 -1
  12. package/dist/{chunk-5N6DYKXO.cjs → chunk-KB2ANVVR.cjs} +2 -2
  13. package/dist/{chunk-TELBX6HK.cjs → chunk-MTDCLVQQ.cjs} +797 -603
  14. package/dist/{chunk-4A6XLQHE.js → chunk-OZD5FQM4.js} +1237 -1236
  15. package/dist/{chunk-MY7ZSXY3.js → chunk-Y6O5VVQ4.js} +387 -193
  16. package/dist/{index-D8I6taEo.d.cts → index-DbMKWnEX.d.cts} +96 -35
  17. package/dist/{index-uAxAcRol.d.ts → index-TuqNq3Ro.d.ts} +96 -35
  18. package/dist/index.cjs +19 -19
  19. package/dist/index.d.cts +2 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +4 -4
  22. package/dist/operations/index.cjs +103 -103
  23. package/dist/operations/index.d.cts +2 -2
  24. package/dist/operations/index.d.ts +2 -2
  25. package/dist/operations/index.js +2 -2
  26. package/dist/pool.cjs +8 -8
  27. package/dist/pool.d.cts +1 -1
  28. package/dist/pool.d.ts +1 -1
  29. package/dist/pool.js +4 -4
  30. package/dist/resources/index.cjs +4 -4
  31. package/dist/resources/index.d.cts +1 -1
  32. package/dist/resources/index.d.ts +1 -1
  33. package/dist/resources/index.js +3 -3
  34. package/docs/API.md +190 -51
  35. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } async function _asyncOptionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = await fn(value); } else if (op === 'call' || op === 'optionalCall') { value = await fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
4
 
@@ -33,13 +33,13 @@
33
33
 
34
34
 
35
35
 
36
- var _chunk5N6DYKXOcjs = require('./chunk-5N6DYKXO.cjs');
36
+ var _chunkKB2ANVVRcjs = require('./chunk-KB2ANVVR.cjs');
37
37
 
38
38
 
39
- var _chunkJKZVCFRYcjs = require('./chunk-JKZVCFRY.cjs');
39
+ var _chunkCXXNONRPcjs = require('./chunk-CXXNONRP.cjs');
40
40
 
41
41
  // src/resources/appointments.ts
42
- var AppointmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
42
+ var AppointmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
43
43
  constructor(http, pageSize) {
44
44
  super(http, {
45
45
  key: "appointments",
@@ -124,7 +124,7 @@ var AuthenticateResource = class {
124
124
  };
125
125
 
126
126
  // src/resources/billing_codes.ts
127
- var BillingCodesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
127
+ var BillingCodesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
128
128
  constructor(http, pageSize) {
129
129
  super(http, {
130
130
  key: "billing_codes",
@@ -174,7 +174,7 @@ var MAX_LIMIT = 500;
174
174
  function clampWindowLimit(limit) {
175
175
  const n = limit === void 0 ? DEFAULT_LIMIT : Math.trunc(limit);
176
176
  if (!Number.isInteger(n) || n < 1) {
177
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
177
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
178
178
  }
179
179
  return Math.min(n, MAX_LIMIT);
180
180
  }
@@ -220,7 +220,7 @@ function wallParts(tz, ms) {
220
220
  }
221
221
  }
222
222
  if (weekday < 0 || [w.y, w.m, w.d, w.h, w.mi, w.s].some((v) => v === void 0 || Number.isNaN(v))) {
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)`);
223
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`dateWindow: could not read the wall-clock parts for timezone "${tz}" (the Intl format returned an incomplete or unmapped part)`);
224
224
  }
225
225
  return { y: w.y, m: w.m, d: w.d, h: w.h, mi: w.mi, s: w.s, weekday };
226
226
  }
@@ -247,7 +247,7 @@ function localDayEndMs(y, m, d, tz) {
247
247
  }
248
248
  function validateZone(tz, opName = "dateWindow") {
249
249
  if (typeof tz !== "string" || tz.length === 0) {
250
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
250
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
251
251
  `${opName}: tz must be a non-empty IANA timezone string (got ${JSON.stringify(tz)}; e.g. 'Australia/Sydney' \u2014 omitted tz = UTC)`,
252
252
  { operation: opName }
253
253
  );
@@ -255,7 +255,7 @@ function validateZone(tz, opName = "dateWindow") {
255
255
  try {
256
256
  new Intl.DateTimeFormat("en-US", { timeZone: tz });
257
257
  } catch (e2) {
258
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
258
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
259
259
  `${opName}: tz is not a valid IANA timezone (${JSON.stringify(tz)}; e.g. 'Australia/Sydney' \u2014 omitted tz = UTC)`,
260
260
  { operation: opName }
261
261
  );
@@ -407,13 +407,13 @@ async function dateWindowQuery(http, path, field, kind, limit, operation, now, t
407
407
  body: { MaxRecords: limit, filter },
408
408
  operation
409
409
  });
410
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
410
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
411
411
  }
412
412
  var isoUtc = (ms) => new Date(ms).toISOString().slice(0, 19) + "Z";
413
413
  function customRangeDay(value, label, zone, opName) {
414
414
  const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
415
415
  if (!m) {
416
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
416
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
417
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)})`,
418
418
  { operation: opName }
419
419
  );
@@ -425,7 +425,7 @@ function customRangeDay(value, label, zone, opName) {
425
425
  const real = probe.getUTCFullYear() === y && probe.getUTCMonth() === mo - 1 && probe.getUTCDate() === d;
426
426
  const ms = !real ? NaN : zone === void 0 ? Date.UTC(y, mo - 1, d) : localDayStartMs(y, mo, d, zone);
427
427
  if (!Number.isFinite(ms)) {
428
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
428
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
429
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)})`,
430
430
  { operation: opName }
431
431
  );
@@ -436,7 +436,7 @@ async function customRangeQuery(http, path, field, from, to, limit, operation, z
436
436
  const fromB = customRangeDay(from, "from", zone, operation);
437
437
  const toB = customRangeDay(to, "to", zone, operation);
438
438
  if (fromB.ms > toB.ms) {
439
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
439
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
440
440
  `${operation}: from (${isoUtc(fromB.ms)}) must not be after to (${isoUtc(toB.ms)})`,
441
441
  { operation }
442
442
  );
@@ -453,7 +453,7 @@ async function customRangeQuery(http, path, field, from, to, limit, operation, z
453
453
  body: { MaxRecords: limit, filter },
454
454
  operation
455
455
  });
456
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
456
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
457
457
  }
458
458
 
459
459
  // src/resources/special/billing_items.ts
@@ -486,7 +486,7 @@ async function customRange(_resource, from, to, http, opts) {
486
486
  }
487
487
 
488
488
  // src/resources/billing_items.ts
489
- var BillingItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
489
+ var BillingItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
490
490
  constructor(http, pageSize) {
491
491
  super(http, {
492
492
  key: "billing_items",
@@ -588,7 +588,7 @@ var BillingItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
588
588
  };
589
589
 
590
590
  // src/resources/change_request_links.ts
591
- var ChangeRequestLinksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
591
+ var ChangeRequestLinksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
592
592
  constructor(http, pageSize) {
593
593
  super(http, {
594
594
  key: "change_request_links",
@@ -642,7 +642,7 @@ var ChangeRequestLinksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
642
642
  };
643
643
 
644
644
  // src/resources/checklist_libraries.ts
645
- var ChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
645
+ var ChecklistLibrariesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
646
646
  constructor(http, pageSize) {
647
647
  super(http, {
648
648
  key: "checklist_libraries",
@@ -716,7 +716,7 @@ var ChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
716
716
  };
717
717
 
718
718
  // src/resources/checklist_library_checklist_items.ts
719
- var ChecklistLibraryChecklistItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
719
+ var ChecklistLibraryChecklistItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
720
720
  constructor(http, pageSize) {
721
721
  super(http, {
722
722
  key: "checklist_library_checklist_items",
@@ -782,7 +782,7 @@ var ChecklistLibraryChecklistItemsResource = class extends _chunk5N6DYKXOcjs.Bas
782
782
  };
783
783
 
784
784
  // src/resources/classification_icons.ts
785
- var ClassificationIconsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
785
+ var ClassificationIconsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
786
786
  constructor(http, pageSize) {
787
787
  super(http, {
788
788
  key: "classification_icons",
@@ -830,7 +830,7 @@ var DEFAULT_LIMIT2 = 25;
830
830
  var MAX_LIMIT2 = 500;
831
831
  function clampLimit(limit) {
832
832
  const n = limit === void 0 ? DEFAULT_LIMIT2 : Math.trunc(limit);
833
- if (!Number.isInteger(n) || n < 1) throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
833
+ if (!Number.isInteger(n) || n < 1) throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(limit)})`);
834
834
  return Math.min(n, MAX_LIMIT2);
835
835
  }
836
836
  async function queryCompanies(http, filter, limit) {
@@ -841,7 +841,7 @@ async function queryCompanies(http, filter, limit) {
841
841
  body: { MaxRecords: limit, filter },
842
842
  operation: "companies.searchByDomain"
843
843
  });
844
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
844
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
845
845
  }
846
846
  async function queryContacts(http, filter, limit) {
847
847
  const res = await http.request({
@@ -851,7 +851,7 @@ async function queryContacts(http, filter, limit) {
851
851
  body: { MaxRecords: limit, filter },
852
852
  operation: "companies.searchByDomain"
853
853
  });
854
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
854
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
855
855
  }
856
856
  async function fetchCompanies(http, ids, limit) {
857
857
  const out = [];
@@ -866,7 +866,7 @@ async function fetchCompanies(http, ids, limit) {
866
866
  const item = body && "item" in body ? body.item : null;
867
867
  if (item) out.push(item);
868
868
  } catch (err) {
869
- if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) continue;
869
+ if (err instanceof _chunkKB2ANVVRcjs.NotFoundError) continue;
870
870
  throw err;
871
871
  }
872
872
  }
@@ -874,7 +874,7 @@ async function fetchCompanies(http, ids, limit) {
874
874
  }
875
875
  async function searchByDomain(_resource, domain, opts = {}, http) {
876
876
  const text = domain.trim();
877
- if (text === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("searchByDomain: empty domain");
877
+ if (text === "") throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("searchByDomain: empty domain");
878
878
  const limit = clampLimit(opts.limit);
879
879
  const filter = [{ field: "webAddress", op: "contains", value: text }];
880
880
  const direct = await queryCompanies(http, filter, limit);
@@ -888,7 +888,7 @@ async function searchByIdentity(_resource, identity, opts = {}, http) {
888
888
  const email = _nullishCoalesce(_optionalChain([identity, 'access', _9 => _9.email, 'optionalAccess', _10 => _10.trim, 'call', _11 => _11()]), () => ( ""));
889
889
  const website = _nullishCoalesce(_optionalChain([identity, 'access', _12 => _12.website, 'optionalAccess', _13 => _13.trim, 'call', _14 => _14()]), () => ( ""));
890
890
  if (name === "" && email === "" && website === "") {
891
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("searchByIdentity: at least one of companyName / email / website is required");
891
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("searchByIdentity: at least one of companyName / email / website is required");
892
892
  }
893
893
  const limit = clampLimit(opts.limit);
894
894
  const found = /* @__PURE__ */ new Map();
@@ -915,23 +915,23 @@ async function familyChildPage(http, parentID) {
915
915
  path: "/V1.0/Companies/query",
916
916
  body: {
917
917
  MaxRecords: COMPANIES_FAMILY_CHILD_CAP,
918
- filter: _chunk5N6DYKXOcjs.buildFilter.call(void 0, [{ field: "parentCompanyID", op: "eq", value: parentID }]).filter
918
+ filter: _chunkKB2ANVVRcjs.buildFilter.call(void 0, [{ field: "parentCompanyID", op: "eq", value: parentID }]).filter
919
919
  },
920
920
  operation: "companies.search"
921
921
  });
922
- const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.search");
922
+ const { items, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, "companies.search");
923
923
  return { rows: items, hasNext: pageDetails.nextPageUrl !== null };
924
924
  }
925
925
  function assertSearchWithDetailOpts(opts) {
926
926
  if (opts === void 0) return;
927
927
  if (typeof opts !== "object" || opts === null || Array.isArray(opts)) {
928
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("companies.searchWithDetail: opts must be an object { limit?: number }", {
928
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("companies.searchWithDetail: opts must be an object { limit?: number }", {
929
929
  operation: "companies.searchWithDetail"
930
930
  });
931
931
  }
932
932
  for (const key of Object.keys(opts)) {
933
933
  if (key !== "limit") {
934
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
934
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
935
935
  `companies.searchWithDetail: unknown opts key "${key}" \u2014 the bag is closed: limit (includeFamily is a companies.search option)`,
936
936
  { operation: "companies.searchWithDetail" }
937
937
  );
@@ -940,32 +940,32 @@ function assertSearchWithDetailOpts(opts) {
940
940
  }
941
941
  async function searchWithFamily(_resource, query, opts = {}, http) {
942
942
  if (opts !== void 0 && (typeof opts !== "object" || opts === null || Array.isArray(opts))) {
943
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("companies.search: opts must be an object { limit?: number, includeFamily?: boolean }");
943
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("companies.search: opts must be an object { limit?: number, includeFamily?: boolean }");
944
944
  }
945
945
  for (const key of Object.keys(_nullishCoalesce(opts, () => ( {})))) {
946
946
  if (!COMPANY_SEARCH_OPT_KEYS.includes(key)) {
947
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
947
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
948
948
  `companies.search: unknown opts key "${key}" \u2014 the bag is closed: ${COMPANY_SEARCH_OPT_KEYS.join(", ")}`,
949
949
  { operation: "companies.search" }
950
950
  );
951
951
  }
952
952
  }
953
953
  if (opts.includeFamily !== void 0 && typeof opts.includeFamily !== "boolean") {
954
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`companies.search: opts.includeFamily must be a boolean (got ${String(opts.includeFamily)})`, {
954
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`companies.search: opts.includeFamily must be a boolean (got ${String(opts.includeFamily)})`, {
955
955
  operation: "companies.search"
956
956
  });
957
957
  }
958
958
  const text = query.trim();
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);
959
+ if (text === "") throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("search: empty query", { operation: "companies.search" });
960
+ const limit = opts.limit === void 0 ? 25 : _chunkKB2ANVVRcjs.clampPageSize.call(void 0, opts.limit);
961
961
  const res = await http.request({
962
962
  method: "POST",
963
963
  idempotent: true,
964
964
  path: "/V1.0/Companies/query",
965
- body: { MaxRecords: limit, filter: _chunk5N6DYKXOcjs.buildFilter.call(void 0, [{ field: "companyName", op: "contains", value: text }]).filter },
965
+ body: { MaxRecords: limit, filter: _chunkKB2ANVVRcjs.buildFilter.call(void 0, [{ field: "companyName", op: "contains", value: text }]).filter },
966
966
  operation: "companies.search"
967
967
  });
968
- const hits = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.search").items;
968
+ const hits = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, "companies.search").items;
969
969
  if (opts.includeFamily !== true) return hits;
970
970
  const rows = [];
971
971
  for (const hit of hits) {
@@ -989,7 +989,7 @@ var DEFAULT_COMPANY_TYPE = 1;
989
989
  var DEDUP_NAME_LIMIT = 10;
990
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";
991
991
  var SAFE_COMPANY_CREATE_DEFAULTS = {};
992
- var OwnerResourceRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
992
+ var OwnerResourceRequiredError = class extends _chunkKB2ANVVRcjs.AutotaskError {
993
993
  constructor(message, options = {}) {
994
994
  super(message, {
995
995
  code: "OWNER_RESOURCE_REQUIRED",
@@ -1000,13 +1000,13 @@ var OwnerResourceRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1000
1000
  this.name = "OwnerResourceRequiredError";
1001
1001
  }
1002
1002
  };
1003
- var CompanyResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1003
+ var CompanyResourceInvalidError = class extends _chunkKB2ANVVRcjs.AutotaskError {
1004
1004
  constructor(message, options = {}) {
1005
1005
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
1006
1006
  this.name = "CompanyResourceInvalidError";
1007
1007
  }
1008
1008
  };
1009
- var CompanyCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1009
+ var CompanyCreateFailedError = class extends _chunkKB2ANVVRcjs.AutotaskError {
1010
1010
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
1011
1011
 
1012
1012
  constructor(message, vendorFields, options = {}) {
@@ -1017,18 +1017,18 @@ var CompanyCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
1017
1017
  };
1018
1018
  async function upsertByName(resource, companyName, params, opts, http) {
1019
1019
  if (typeof companyName !== "string" || companyName.trim() === "") {
1020
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("upsertByName: companyName is required (a non-empty string)", { operation: OP_UPSERT_NAME });
1020
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("upsertByName: companyName is required (a non-empty string)", { operation: OP_UPSERT_NAME });
1021
1021
  }
1022
1022
  if (typeof _optionalChain([params, 'optionalAccess', _15 => _15.phone]) !== "string" || params.phone.trim() === "") {
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 });
1023
+ throw new (0, _chunkKB2ANVVRcjs.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 });
1024
1024
  }
1025
1025
  const companyType = _nullishCoalesce(params.companyType, () => ( DEFAULT_COMPANY_TYPE));
1026
1026
  if (typeof companyType !== "number" || !Number.isSafeInteger(companyType) || companyType < 1) {
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 });
1027
+ throw new (0, _chunkKB2ANVVRcjs.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 });
1028
1028
  }
1029
1029
  const owner = params.ownerResourceID;
1030
1030
  if (owner !== void 0 && (typeof owner !== "number" || !Number.isSafeInteger(owner) || owner < 1)) {
1031
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`upsertByName: params.ownerResourceID must be a positive integer (got ${String(owner)})`, { operation: OP_UPSERT_NAME });
1031
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`upsertByName: params.ownerResourceID must be a positive integer (got ${String(owner)})`, { operation: OP_UPSERT_NAME });
1032
1032
  }
1033
1033
  const q = await resource.queryBounded({ filter: [{ field: "companyName", op: "eq", value: companyName }], limit: DEDUP_NAME_LIMIT });
1034
1034
  const caveat = {
@@ -1039,7 +1039,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1039
1039
  const match = q.items[0];
1040
1040
  if (match !== void 0) {
1041
1041
  if (opts.dryRun === true) {
1042
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
1042
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
1043
1043
  {
1044
1044
  operation: OP_UPSERT_NAME,
1045
1045
  method: "POST",
@@ -1074,7 +1074,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1074
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"
1075
1075
  );
1076
1076
  }
1077
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
1077
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
1078
1078
  {
1079
1079
  operation: OP_UPSERT_NAME,
1080
1080
  method: "POST",
@@ -1122,8 +1122,8 @@ async function upsertByName(resource, companyName, params, opts, http) {
1122
1122
  sideEffects: ['vendor auto-creates a "Primary Address" location under the new company (UI-only cleanup \u2014 the delete 405 gap, \xA711.5)']
1123
1123
  };
1124
1124
  } catch (err) {
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);
1125
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
1126
+ const named = (_nullishCoalesce(_chunkKB2ANVVRcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
1127
1127
  const seen = /* @__PURE__ */ new Set();
1128
1128
  const unique = [...named].filter((f) => seen.has(f) ? false : (seen.add(f), true));
1129
1129
  const hasDefault = unique.some((f) => SAFE_COMPANY_CREATE_DEFAULTS[f] !== void 0);
@@ -1137,7 +1137,7 @@ async function upsertByName(resource, companyName, params, opts, http) {
1137
1137
  }
1138
1138
  continue;
1139
1139
  }
1140
- const detail = _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError);
1140
+ const detail = _chunkKB2ANVVRcjs.formatVendorDetail.call(void 0, err.vendorError);
1141
1141
  throw new CompanyCreateFailedError(
1142
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}` : ""}`,
1143
1143
  unique,
@@ -1156,7 +1156,7 @@ var PROFILE_PART_LIMIT = 50;
1156
1156
  function profilePartLimit(value, name) {
1157
1157
  const n = value === void 0 ? PROFILE_PART_LIMIT : Math.trunc(value);
1158
1158
  if (!Number.isInteger(n) || n < 1) {
1159
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`fullProfile: ${name} must be an integer >= 1 (got ${String(value)})`);
1159
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`fullProfile: ${name} must be an integer >= 1 (got ${String(value)})`);
1160
1160
  }
1161
1161
  return n;
1162
1162
  }
@@ -1168,14 +1168,14 @@ async function scopedCompanyQuery(http, path, companyID, limit) {
1168
1168
  body: { MaxRecords: limit, filter: [{ field: "companyID", op: "eq", value: companyID }] },
1169
1169
  operation: "companies.fullProfile"
1170
1170
  });
1171
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
1171
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
1172
1172
  }
1173
1173
  async function fullProfile(resource, id, opts = {}, http) {
1174
1174
  const contactLimit = profilePartLimit(opts.contactLimit, "contactLimit");
1175
1175
  const noteLimit = profilePartLimit(opts.noteLimit, "noteLimit");
1176
1176
  const ticketLimit = profilePartLimit(opts.ticketLimit, "ticketLimit");
1177
1177
  const projectLimit = profilePartLimit(opts.projectLimit, "projectLimit");
1178
- const companyID = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
1178
+ const companyID = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
1179
1179
  const company = await resource.get(companyID);
1180
1180
  const locations = await scopedCompanyQuery(http, "/V1.0/CompanyLocations/query", companyID, PROFILE_PART_LIMIT);
1181
1181
  const contacts = await scopedCompanyQuery(http, "/V1.0/Contacts/query", companyID, contactLimit);
@@ -1192,7 +1192,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1192
1192
  },
1193
1193
  operation: "companies.fullProfile"
1194
1194
  });
1195
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
1195
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
1196
1196
  })();
1197
1197
  let openTickets = {
1198
1198
  items: openRows,
@@ -1201,7 +1201,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1201
1201
  note: OPEN_TICKETS_NOTE
1202
1202
  };
1203
1203
  if (openRows.length === 0) {
1204
- const stamp = _chunk5N6DYKXOcjs.blindStampFor.call(void 0, _optionalChain([_chunk5N6DYKXOcjs.BLIND_SURFACE_STAMPS, 'access', _16 => _16["tickets"], 'optionalAccess', _17 => _17.query]), [
1204
+ const stamp = _chunkKB2ANVVRcjs.blindStampFor.call(void 0, _optionalChain([_chunkKB2ANVVRcjs.BLIND_SURFACE_STAMPS, 'access', _16 => _16["tickets"], 'optionalAccess', _17 => _17.query]), [
1205
1205
  { field: "companyID", op: "eq", value: companyID },
1206
1206
  { field: "status", op: "noteq", value: 5 }
1207
1207
  ]);
@@ -1232,7 +1232,7 @@ async function fullProfile(resource, id, opts = {}, http) {
1232
1232
  }
1233
1233
  };
1234
1234
  if (opts.names === true) {
1235
- const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS);
1235
+ const builder = _chunkKB2ANVVRcjs.createNamePlan.call(void 0, _chunkKB2ANVVRcjs.TICKET_LABEL_FIELDS);
1236
1236
  const c = company;
1237
1237
  builder.addResource(c["ownerResourceID"]);
1238
1238
  builder.addResource(c["createdByResourceID"]);
@@ -1249,20 +1249,20 @@ async function fullProfile(resource, id, opts = {}, http) {
1249
1249
  builder.addResource(r["creatorResourceID"]);
1250
1250
  builder.addFk("contract", r["contractID"]);
1251
1251
  }
1252
- const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
1252
+ const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
1253
1253
  const companyRow = { ...company };
1254
- _chunk5N6DYKXOcjs.addNameSibling.call(void 0, companyRow, "ownerResourceID", (v) => names.resourceName(v));
1255
- _chunk5N6DYKXOcjs.addNameSibling.call(void 0, companyRow, "createdByResourceID", (v) => names.resourceName(v));
1254
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, companyRow, "ownerResourceID", (v) => names.resourceName(v));
1255
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, companyRow, "createdByResourceID", (v) => names.resourceName(v));
1256
1256
  result.company = companyRow;
1257
1257
  result.openTickets = {
1258
1258
  ...openTickets,
1259
1259
  items: openTickets.items.map((row) => {
1260
1260
  const r = { ...row };
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);
1261
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1262
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1263
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "billingCodeID", (v) => names.recordName("billingCode", v));
1264
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "assignedResourceRoleID", (v) => names.recordName("role", v));
1265
+ for (const f of _chunkKB2ANVVRcjs.TICKET_LABEL_FIELDS) _chunkKB2ANVVRcjs.addLabelSibling.call(void 0, r, f, names);
1266
1266
  return r;
1267
1267
  })
1268
1268
  };
@@ -1270,9 +1270,9 @@ async function fullProfile(resource, id, opts = {}, http) {
1270
1270
  ...result.projects,
1271
1271
  items: result.projects.items.map((row) => {
1272
1272
  const r = { ...row };
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
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "projectLeadResourceID", (v) => names.resourceName(v));
1274
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "creatorResourceID", (v) => names.resourceName(v));
1275
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, r, "contractID", (v) => names.recordName("contract", v));
1276
1276
  return r;
1277
1277
  })
1278
1278
  };
@@ -1304,7 +1304,7 @@ function isDateYMD(v) {
1304
1304
  }
1305
1305
  function validateUnbilledWorkOptions(companyId, opts) {
1306
1306
  if (opts !== void 0 && (typeof opts !== "object" || opts === null || Array.isArray(opts))) {
1307
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
1307
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
1308
1308
  `unbilledWork: opts must be the options object (got ${Array.isArray(opts) ? "an array" : typeof opts})`,
1309
1309
  { operation: "companies.unbilledWork" }
1310
1310
  );
@@ -1333,7 +1333,7 @@ function validateUnbilledWorkOptions(companyId, opts) {
1333
1333
  try {
1334
1334
  limit = clampLimit(opts.limit);
1335
1335
  } catch (err) {
1336
- problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : `limit must be an integer >= 1 (got ${String(opts.limit)})`);
1336
+ problems.push(err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.message : `limit must be an integer >= 1 (got ${String(opts.limit)})`);
1337
1337
  limit = 50;
1338
1338
  }
1339
1339
  if (source === "date_range") {
@@ -1348,9 +1348,9 @@ function validateUnbilledWorkOptions(companyId, opts) {
1348
1348
  problems.push('invoiceId is required (the vendor invoice id) when source is "invoice"');
1349
1349
  } else {
1350
1350
  try {
1351
- _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, opts.invoiceId, "opts.invoiceId");
1351
+ _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, opts.invoiceId, "opts.invoiceId");
1352
1352
  } catch (err) {
1353
- problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "invoiceId must be a vendor numeric id");
1353
+ problems.push(err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.message : "invoiceId must be a vendor numeric id");
1354
1354
  }
1355
1355
  }
1356
1356
  }
@@ -1360,20 +1360,20 @@ function validateUnbilledWorkOptions(companyId, opts) {
1360
1360
  } else {
1361
1361
  opts.ticketIds.forEach((tid, i) => {
1362
1362
  try {
1363
- _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, tid, `opts.ticketIds[${i}]`);
1363
+ _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, tid, `opts.ticketIds[${i}]`);
1364
1364
  } catch (err) {
1365
- problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : `ticketIds[${i}] must be a vendor numeric id`);
1365
+ problems.push(err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.message : `ticketIds[${i}] must be a vendor numeric id`);
1366
1366
  }
1367
1367
  });
1368
1368
  }
1369
1369
  }
1370
1370
  try {
1371
- _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyId, "companyId");
1371
+ _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, companyId, "companyId");
1372
1372
  } catch (err) {
1373
- problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "companyId must be a vendor numeric id");
1373
+ problems.push(err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.message : "companyId must be a vendor numeric id");
1374
1374
  }
1375
1375
  if (problems.length > 0) {
1376
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
1376
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
1377
1377
  `unbilledWork: ${problems.length} problem(s) found pre-request (zero wire was issued)
1378
1378
  - ` + problems.join("\n- "),
1379
1379
  { operation: "companies.unbilledWork" }
@@ -1402,7 +1402,7 @@ async function boundedPart(http, path, conditions, limit, includeFields) {
1402
1402
  body,
1403
1403
  operation: "companies.unbilledWork"
1404
1404
  });
1405
- const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "companies.unbilledWork");
1405
+ const { items, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, "companies.unbilledWork");
1406
1406
  const capped = items.length >= limit;
1407
1407
  return { items, capped, hasMore: capped && pageDetails.nextPageUrl != null };
1408
1408
  }
@@ -1413,7 +1413,7 @@ function capJoinSet(ids, cap) {
1413
1413
  }
1414
1414
  function unbilledWorkPartStatus(key, conditions, items) {
1415
1415
  if (items.length !== 0) return { status: "ok" };
1416
- const stamp = _chunk5N6DYKXOcjs.blindStampFor.call(void 0, _optionalChain([_chunk5N6DYKXOcjs.BLIND_SURFACE_STAMPS, 'access', _18 => _18[key], 'optionalAccess', _19 => _19.query]), conditions);
1416
+ const stamp = _chunkKB2ANVVRcjs.blindStampFor.call(void 0, _optionalChain([_chunkKB2ANVVRcjs.BLIND_SURFACE_STAMPS, 'access', _18 => _18[key], 'optionalAccess', _19 => _19.query]), conditions);
1417
1417
  if (stamp !== void 0) return { status: "blind", blindSurface: stamp, note: stamp.note };
1418
1418
  return {
1419
1419
  status: "ok",
@@ -1422,7 +1422,7 @@ function unbilledWorkPartStatus(key, conditions, items) {
1422
1422
  }
1423
1423
  async function unbilledWork(resource, companyId, opts = {}, http) {
1424
1424
  const v = validateUnbilledWorkOptions(companyId, opts);
1425
- const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyId, "companyId");
1425
+ const id = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, companyId, "companyId");
1426
1426
  const company = await resource.get(id);
1427
1427
  const companyIds = [num(company.id)];
1428
1428
  let parent = null;
@@ -1435,7 +1435,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1435
1435
  parentStatus = "ok";
1436
1436
  companyIds.push(num(parent.id));
1437
1437
  } catch (err) {
1438
- if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) parent = null;
1438
+ if (err instanceof _chunkKB2ANVVRcjs.NotFoundError) parent = null;
1439
1439
  else throw err;
1440
1440
  }
1441
1441
  }
@@ -1467,7 +1467,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1467
1467
  if (v.dateFrom !== void 0) billingConditions.push({ field: "itemDate", op: "gte", value: v.dateFrom });
1468
1468
  if (v.dateTo !== void 0) billingConditions.push({ field: "itemDate", op: "lte", value: v.dateTo });
1469
1469
  }
1470
- const billingFields = _chunk5N6DYKXOcjs.resolveFieldsPreset.call(void 0, "billing_join", "billing_items");
1470
+ const billingFields = _chunkKB2ANVVRcjs.resolveFieldsPreset.call(void 0, "billing_join", "billing_items");
1471
1471
  const billingIncludeFields = [...billingFields, "id", ...v.includeNotes ? ["description"] : []];
1472
1472
  const billingRaw = await boundedPart(http, "/V1.0/BillingItems/query", billingConditions, v.limit, billingIncludeFields);
1473
1473
  const taskCap = capJoinSet(taskIds, UNBILLED_WORK_JOIN_SET_CAP);
@@ -1499,7 +1499,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1499
1499
  let cappedItems = entries;
1500
1500
  let noteCharsTruncated = 0;
1501
1501
  if (v.includeNotes) {
1502
- [cappedItems, noteCharsTruncated] = _chunk5N6DYKXOcjs.truncateNoteChars.call(void 0, entries, v.noteChars, ["summaryNotes"]);
1502
+ [cappedItems, noteCharsTruncated] = _chunkKB2ANVVRcjs.truncateNoteChars.call(void 0, entries, v.noteChars, ["summaryNotes"]);
1503
1503
  }
1504
1504
  const st = unbilledWorkPartStatus("time_entries", timeConditions, entries);
1505
1505
  timePart = {
@@ -1514,8 +1514,8 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1514
1514
  let billingItems = billingRaw.items;
1515
1515
  let billingNoteCharsTruncated = 0;
1516
1516
  if (v.includeNotes) {
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);
1517
+ const noteFields = (_nullishCoalesce(_chunkKB2ANVVRcjs.UNTRUSTED_FIELDS_BY_RESOURCE["billing_items"], () => ( []))).filter((f) => billingIncludeFields.includes(f));
1518
+ [billingItems, billingNoteCharsTruncated] = _chunkKB2ANVVRcjs.truncateNoteChars.call(void 0, billingRaw.items, v.noteChars, noteFields);
1519
1519
  }
1520
1520
  const billingSt = unbilledWorkPartStatus("billing_items", billingConditions, billingRaw.items);
1521
1521
  const billingItemsPart = {
@@ -1612,7 +1612,7 @@ async function unbilledWork(resource, companyId, opts = {}, http) {
1612
1612
  }
1613
1613
 
1614
1614
  // src/resources/companies.ts
1615
- var CompaniesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1615
+ var CompaniesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1616
1616
  constructor(http, pageSize) {
1617
1617
  super(http, {
1618
1618
  key: "companies",
@@ -1719,7 +1719,7 @@ var CompaniesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1719
1719
  };
1720
1720
 
1721
1721
  // src/resources/company_alerts.ts
1722
- var CompanyAlertsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1722
+ var CompanyAlertsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1723
1723
  constructor(http, pageSize) {
1724
1724
  super(http, {
1725
1725
  key: "company_alerts",
@@ -1785,7 +1785,7 @@ var CompanyAlertsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1785
1785
  };
1786
1786
 
1787
1787
  // src/resources/company_locations.ts
1788
- var CompanyLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1788
+ var CompanyLocationsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1789
1789
  constructor(http, pageSize) {
1790
1790
  super(http, {
1791
1791
  key: "company_locations",
@@ -1856,7 +1856,7 @@ var CompanyLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1856
1856
  };
1857
1857
 
1858
1858
  // src/resources/company_notes.ts
1859
- var CompanyNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1859
+ var CompanyNotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1860
1860
  constructor(http, pageSize) {
1861
1861
  super(http, {
1862
1862
  key: "company_notes",
@@ -1921,7 +1921,7 @@ var CompanyNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1921
1921
  };
1922
1922
 
1923
1923
  // src/resources/company_site_configurations.ts
1924
- var CompanySiteConfigurationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1924
+ var CompanySiteConfigurationsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1925
1925
  constructor(http, pageSize) {
1926
1926
  super(http, {
1927
1927
  key: "company_site_configurations",
@@ -1972,7 +1972,7 @@ var CompanySiteConfigurationsResource = class extends _chunk5N6DYKXOcjs.BaseReso
1972
1972
  };
1973
1973
 
1974
1974
  // src/resources/company_webhooks.ts
1975
- var CompanyWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
1975
+ var CompanyWebhooksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
1976
1976
  constructor(http, pageSize) {
1977
1977
  super(http, {
1978
1978
  key: "company_webhooks",
@@ -2048,7 +2048,7 @@ var CompanyWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2048
2048
  };
2049
2049
 
2050
2050
  // src/resources/configuration_item_billing_product_associations.ts
2051
- var ConfigurationItemBillingProductAssociationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2051
+ var ConfigurationItemBillingProductAssociationsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2052
2052
  constructor(http, pageSize) {
2053
2053
  super(http, {
2054
2054
  key: "configuration_item_billing_product_associations",
@@ -2114,7 +2114,7 @@ var ConfigurationItemBillingProductAssociationsResource = class extends _chunk5N
2114
2114
  };
2115
2115
 
2116
2116
  // src/resources/configuration_item_categories.ts
2117
- var ConfigurationItemCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2117
+ var ConfigurationItemCategoriesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2118
2118
  constructor(http, pageSize) {
2119
2119
  super(http, {
2120
2120
  key: "configuration_item_categories",
@@ -2181,7 +2181,7 @@ var ConfigurationItemCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseRe
2181
2181
  };
2182
2182
 
2183
2183
  // src/resources/configuration_item_category_udf_associations.ts
2184
- var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2184
+ var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2185
2185
  constructor(http, pageSize) {
2186
2186
  super(http, {
2187
2187
  key: "configuration_item_category_udf_associations",
@@ -2247,7 +2247,7 @@ var ConfigurationItemCategoryUdfAssociationsResource = class extends _chunk5N6DY
2247
2247
  };
2248
2248
 
2249
2249
  // src/resources/configuration_item_dns_records.ts
2250
- var ConfigurationItemDnsRecordsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2250
+ var ConfigurationItemDnsRecordsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2251
2251
  constructor(http, pageSize) {
2252
2252
  super(http, {
2253
2253
  key: "configuration_item_dns_records",
@@ -2296,7 +2296,7 @@ var ConfigurationItemDnsRecordsResource = class extends _chunk5N6DYKXOcjs.BaseRe
2296
2296
  };
2297
2297
 
2298
2298
  // src/resources/configuration_item_notes.ts
2299
- var ConfigurationItemNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2299
+ var ConfigurationItemNotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2300
2300
  constructor(http, pageSize) {
2301
2301
  super(http, {
2302
2302
  key: "configuration_item_notes",
@@ -2355,7 +2355,7 @@ var ConfigurationItemNotesResource = class extends _chunk5N6DYKXOcjs.BaseResourc
2355
2355
  };
2356
2356
 
2357
2357
  // src/resources/configuration_item_related_items.ts
2358
- var ConfigurationItemRelatedItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2358
+ var ConfigurationItemRelatedItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2359
2359
  constructor(http, pageSize) {
2360
2360
  super(http, {
2361
2361
  key: "configuration_item_related_items",
@@ -2416,16 +2416,16 @@ async function fetchRecord(http, path, label) {
2416
2416
  const res = await http.request({ method: "GET", path, operation: "configuration_items.moveConfigurationItem" });
2417
2417
  const body = res;
2418
2418
  if (body === null || !("item" in body) || body.item === null || body.item === void 0) {
2419
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
2419
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
2420
2420
  }
2421
2421
  return body.item;
2422
2422
  }
2423
2423
  async function moveConfigurationItem(_resource, sourceId, opts, http) {
2424
- const numericSource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, sourceId, "sourceId");
2424
+ const numericSource = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, sourceId, "sourceId");
2425
2425
  if (_optionalChain([opts, 'optionalAccess', _20 => _20.destinationCompanyId]) === void 0) {
2426
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: destinationCompanyId is required");
2426
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("moveConfigurationItem: destinationCompanyId is required");
2427
2427
  }
2428
- const destId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, opts.destinationCompanyId, "destinationCompanyId");
2428
+ const destId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, opts.destinationCompanyId, "destinationCompanyId");
2429
2429
  const source = await fetchRecord(http, `/V1.0/ConfigurationItems/${numericSource}`, `Configuration item ${numericSource}`);
2430
2430
  await fetchRecord(http, `/V1.0/Companies/${destId}`, `Company ${destId}`);
2431
2431
  const body = { ...source };
@@ -2435,20 +2435,20 @@ async function moveConfigurationItem(_resource, sourceId, opts, http) {
2435
2435
  body.companyID = destId;
2436
2436
  body.isActive = true;
2437
2437
  if (opts.newReferenceTitle !== void 0) {
2438
- if (opts.newReferenceTitle.trim() === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: newReferenceTitle must be non-empty");
2438
+ if (opts.newReferenceTitle.trim() === "") throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("moveConfigurationItem: newReferenceTitle must be non-empty");
2439
2439
  body.referenceTitle = opts.newReferenceTitle.trim();
2440
2440
  }
2441
2441
  if (opts.lastModifiedDate !== void 0) {
2442
2442
  const current = source.lastModifiedDate;
2443
2443
  if (current !== opts.lastModifiedDate) {
2444
- throw new (0, _chunk5N6DYKXOcjs.StaleObjectError)(
2444
+ throw new (0, _chunkKB2ANVVRcjs.StaleObjectError)(
2445
2445
  `moveConfigurationItem: source item ${numericSource} was modified since the snapshot (expected lastModifiedDate ${opts.lastModifiedDate}, current ${_nullishCoalesce(current, () => ( "unknown"))})`,
2446
2446
  { operation: "configuration_items.moveConfigurationItem", resourceIds: [numericSource] }
2447
2447
  );
2448
2448
  }
2449
2449
  }
2450
2450
  if (opts.dryRun === true) {
2451
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
2451
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
2452
2452
  operation: "configuration_items.moveConfigurationItem",
2453
2453
  method: "POST",
2454
2454
  path: "/V1.0/ConfigurationItems",
@@ -2472,7 +2472,7 @@ async function moveConfigurationItem(_resource, sourceId, opts, http) {
2472
2472
  const createdBody = created;
2473
2473
  const newId = createdBody !== null ? _nullishCoalesce(createdBody.itemId, () => ( createdBody.id)) : void 0;
2474
2474
  if (typeof newId !== "number") {
2475
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("moveConfigurationItem: vendor create response has no itemId");
2475
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("moveConfigurationItem: vendor create response has no itemId");
2476
2476
  }
2477
2477
  let sourceDeactivated = false;
2478
2478
  if (opts.deactivateSource !== false) {
@@ -2490,7 +2490,7 @@ var PROFILE_PART_LIMIT2 = 50;
2490
2490
  function profilePartLimit2(value, name) {
2491
2491
  const n = value === void 0 ? PROFILE_PART_LIMIT2 : Math.trunc(value);
2492
2492
  if (!Number.isInteger(n) || n < 1) {
2493
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`profile: ${name} must be an integer >= 1 (got ${String(value)})`);
2493
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`profile: ${name} must be an integer >= 1 (got ${String(value)})`);
2494
2494
  }
2495
2495
  return n;
2496
2496
  }
@@ -2506,14 +2506,14 @@ async function contextFetchPart(http, entityPath, referenceId) {
2506
2506
  });
2507
2507
  const body = res;
2508
2508
  if (body === null || !("item" in body)) {
2509
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`context part not found (unexpected envelope shape)`, { resourceIds: [referenceId] });
2509
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`context part not found (unexpected envelope shape)`, { resourceIds: [referenceId] });
2510
2510
  }
2511
2511
  if (body.item === null || body.item === void 0) {
2512
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)("context part not found", { resourceIds: [referenceId] });
2512
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)("context part not found", { resourceIds: [referenceId] });
2513
2513
  }
2514
2514
  return body.item;
2515
2515
  } catch (err) {
2516
- if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) return null;
2516
+ if (err instanceof _chunkKB2ANVVRcjs.NotFoundError) return null;
2517
2517
  throw err;
2518
2518
  }
2519
2519
  }
@@ -2525,7 +2525,7 @@ async function ciScopedQuery(http, path, itemID, limit) {
2525
2525
  body: { MaxRecords: limit, filter: [{ field: "configurationItemID", op: "eq", value: itemID }] },
2526
2526
  operation: "configuration_items.profile"
2527
2527
  });
2528
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
2528
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
2529
2529
  }
2530
2530
  async function profile(resource, id, opts = {}, http) {
2531
2531
  const noteLimit = profilePartLimit2(opts.noteLimit, "noteLimit");
@@ -2537,7 +2537,7 @@ async function profile(resource, id, opts = {}, http) {
2537
2537
  const notes = await ciScopedQuery(http, "/V1.0/ConfigurationItemNotes/query", id, noteLimit);
2538
2538
  const relatedItems = await ciScopedQuery(http, "/V1.0/ConfigurationItemRelatedItems/query", id, relatedLimit);
2539
2539
  const associations = await ciScopedQuery(http, "/V1.0/ConfigurationItemBillingProductAssociations/query", id, PROFILE_PART_LIMIT2);
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"))]);
2540
+ const wallQuirk = _optionalChain([_chunkKB2ANVVRcjs.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"))]);
2541
2541
  const productAssociations = {
2542
2542
  items: associations,
2543
2543
  capped: associations.length >= PROFILE_PART_LIMIT2,
@@ -2561,11 +2561,11 @@ async function profile(resource, id, opts = {}, http) {
2561
2561
  }
2562
2562
  };
2563
2563
  if (opts.names === true) {
2564
- const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, );
2564
+ const builder = _chunkKB2ANVVRcjs.createNamePlan.call(void 0, );
2565
2565
  builder.addFk("contract", root["contractID"]);
2566
- const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
2566
+ const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
2567
2567
  const ciRow = { ...ci };
2568
- _chunk5N6DYKXOcjs.addNameSibling.call(void 0, ciRow, "contractID", (v) => names.recordName("contract", v));
2568
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, ciRow, "contractID", (v) => names.recordName("contract", v));
2569
2569
  result.ci = ciRow;
2570
2570
  result.names = names.section;
2571
2571
  }
@@ -2573,7 +2573,7 @@ async function profile(resource, id, opts = {}, http) {
2573
2573
  }
2574
2574
 
2575
2575
  // src/resources/configuration_items.ts
2576
- var ConfigurationItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2576
+ var ConfigurationItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2577
2577
  constructor(http, pageSize) {
2578
2578
  super(http, {
2579
2579
  key: "configuration_items",
@@ -2662,7 +2662,7 @@ var ConfigurationItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2662
2662
  };
2663
2663
 
2664
2664
  // src/resources/configuration_item_ssl_subject_alternative_names.ts
2665
- var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2665
+ var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2666
2666
  constructor(http, pageSize) {
2667
2667
  super(http, {
2668
2668
  key: "configuration_item_ssl_subject_alternative_names",
@@ -2725,7 +2725,7 @@ var ConfigurationItemSslSubjectAlternativeNamesResource = class extends _chunk5N
2725
2725
  };
2726
2726
 
2727
2727
  // src/resources/configuration_item_types.ts
2728
- var ConfigurationItemTypesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2728
+ var ConfigurationItemTypesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2729
2729
  constructor(http, pageSize) {
2730
2730
  super(http, {
2731
2731
  key: "configuration_item_types",
@@ -2799,7 +2799,7 @@ var ConfigurationItemTypesResource = class extends _chunk5N6DYKXOcjs.BaseResourc
2799
2799
  };
2800
2800
 
2801
2801
  // src/resources/configuration_item_webhooks.ts
2802
- var ConfigurationItemWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2802
+ var ConfigurationItemWebhooksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2803
2803
  constructor(http, pageSize) {
2804
2804
  super(http, {
2805
2805
  key: "configuration_item_webhooks",
@@ -2875,7 +2875,7 @@ var ConfigurationItemWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseReso
2875
2875
  };
2876
2876
 
2877
2877
  // src/resources/contact_group_contacts.ts
2878
- var ContactGroupContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2878
+ var ContactGroupContactsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2879
2879
  constructor(http, pageSize) {
2880
2880
  super(http, {
2881
2881
  key: "contact_group_contacts",
@@ -2929,7 +2929,7 @@ var ContactGroupContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource
2929
2929
  };
2930
2930
 
2931
2931
  // src/resources/contact_groups.ts
2932
- var ContactGroupsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
2932
+ var ContactGroupsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
2933
2933
  constructor(http, pageSize) {
2934
2934
  super(http, {
2935
2935
  key: "contact_groups",
@@ -3007,22 +3007,22 @@ async function fetchRecord2(http, path, label) {
3007
3007
  const res = await http.request({ method: "GET", path, operation: "contacts.moveToCompany" });
3008
3008
  const body = res;
3009
3009
  if (body === null || !("item" in body) || body.item === null || body.item === void 0) {
3010
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
3010
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`${label} not found`, { code: "NOT_FOUND", category: "not_found" });
3011
3011
  }
3012
3012
  return body.item;
3013
3013
  }
3014
3014
  async function moveToCompany(_resource, sourceContactId, destinationCompanyId, opts = {}, http) {
3015
- const sourceId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, sourceContactId, "sourceContactId");
3016
- const destId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, destinationCompanyId, "destinationCompanyId");
3015
+ const sourceId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, sourceContactId, "sourceContactId");
3016
+ const destId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, destinationCompanyId, "destinationCompanyId");
3017
3017
  const source = await fetchRecord2(http, `/V1.0/Contacts/${sourceId}`, `Contact ${sourceId}`);
3018
3018
  const companyID = source.companyID;
3019
3019
  if (typeof companyID !== "number" || companyID < 0) {
3020
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Contact ${sourceId} has no companyID (cannot scope the source delete)`);
3020
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`Contact ${sourceId} has no companyID (cannot scope the source delete)`);
3021
3021
  }
3022
3022
  if (opts.lastModifiedDate !== void 0) {
3023
3023
  const current = source.lastModifiedDate;
3024
3024
  if (current !== opts.lastModifiedDate) {
3025
- throw new (0, _chunk5N6DYKXOcjs.StaleObjectError)(
3025
+ throw new (0, _chunkKB2ANVVRcjs.StaleObjectError)(
3026
3026
  `moveToCompany: source contact ${sourceId} was modified since the snapshot (expected lastModifiedDate ${opts.lastModifiedDate}, current ${typeof current === "string" ? current : "unknown"})`,
3027
3027
  { operation: "contacts.moveToCompany", resourceIds: [sourceId, destId] }
3028
3028
  );
@@ -3044,10 +3044,10 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3044
3044
  },
3045
3045
  operation: "contacts.moveToCompany"
3046
3046
  });
3047
- const items = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
3047
+ const items = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
3048
3048
  const clash = items.find((c) => String(c.id) !== String(sourceId));
3049
3049
  if (clash !== void 0) {
3050
- throw new (0, _chunk5N6DYKXOcjs.ConflictError)(
3050
+ throw new (0, _chunkKB2ANVVRcjs.ConflictError)(
3051
3051
  `Contact email "${email}" already exists under company ${destId} (contact ${String(clash.id)}); aborting the move`,
3052
3052
  { resourceIds: [sourceId, destId] }
3053
3053
  );
@@ -3061,7 +3061,7 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3061
3061
  if (opts.dryRun === true) {
3062
3062
  const warnings = [];
3063
3063
  if (opts.deleteSource === true) warnings.push("the source contact will be deleted after the move");
3064
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
3064
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
3065
3065
  operation: "contacts.moveToCompany",
3066
3066
  method: "POST",
3067
3067
  path: `/V1.0/Companies/${destId}/Contacts`,
@@ -3086,7 +3086,7 @@ async function moveToCompany(_resource, sourceContactId, destinationCompanyId, o
3086
3086
  const createdBody = created;
3087
3087
  const newId = createdBody !== null ? _nullishCoalesce(createdBody.itemId, () => ( createdBody.id)) : void 0;
3088
3088
  if (typeof newId !== "number") {
3089
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("contacts.moveToCompany: vendor create response has no itemId");
3089
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("contacts.moveToCompany: vendor create response has no itemId");
3090
3090
  }
3091
3091
  let sourceDeleted = false;
3092
3092
  if (opts.deleteSource === true) {
@@ -3104,7 +3104,7 @@ var UPSERT_MAX_DISCOVERY_MERGES = 3;
3104
3104
  var EMAIL_SHAPE = /^.+@.+/;
3105
3105
  var SAFE_CONTACT_CREATE_DEFAULTS = {};
3106
3106
  var DEDUP_LIMIT = 10;
3107
- var CompanyNotFoundError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3107
+ var CompanyNotFoundError = class extends _chunkKB2ANVVRcjs.AutotaskError {
3108
3108
  constructor(message, options = {}) {
3109
3109
  super(message, {
3110
3110
  code: "COMPANY_NOT_FOUND",
@@ -3115,7 +3115,7 @@ var CompanyNotFoundError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3115
3115
  this.name = "CompanyNotFoundError";
3116
3116
  }
3117
3117
  };
3118
- var ContactCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3118
+ var ContactCreateFailedError = class extends _chunkKB2ANVVRcjs.AutotaskError {
3119
3119
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
3120
3120
 
3121
3121
  constructor(message, vendorFields, options = {}) {
@@ -3125,25 +3125,25 @@ var ContactCreateFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
3125
3125
  }
3126
3126
  };
3127
3127
  async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3128
- const cid = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, companyID, "companyID");
3128
+ const cid = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, companyID, "companyID");
3129
3129
  if (typeof email !== "string" || !EMAIL_SHAPE.test(email)) {
3130
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
3130
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
3131
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)})`,
3132
3132
  { operation: OP_UPSERT_EMAIL }
3133
3133
  );
3134
3134
  }
3135
3135
  if (extra !== void 0) {
3136
3136
  if (extra.isActive !== void 0 && typeof extra.isActive !== "boolean" && extra.isActive !== 0 && extra.isActive !== 1) {
3137
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
3137
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
3138
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)})`,
3139
3139
  { operation: OP_UPSERT_EMAIL }
3140
3140
  );
3141
3141
  }
3142
3142
  if (extra.firstName !== void 0 && (typeof extra.firstName !== "string" || extra.firstName === "")) {
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 });
3143
+ throw new (0, _chunkKB2ANVVRcjs.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 });
3144
3144
  }
3145
3145
  if (extra.lastName !== void 0 && typeof extra.lastName !== "string") {
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 });
3146
+ throw new (0, _chunkKB2ANVVRcjs.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 });
3147
3147
  }
3148
3148
  }
3149
3149
  const parentRes = await http.request({ method: "GET", path: `/V1.0/Companies/${cid}`, operation: OP_UPSERT_EMAIL });
@@ -3164,7 +3164,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3164
3164
  const match = q.items[0];
3165
3165
  if (match !== void 0) {
3166
3166
  if (opts.dryRun === true) {
3167
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
3167
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
3168
3168
  {
3169
3169
  operation: OP_UPSERT_EMAIL,
3170
3170
  method: "POST",
@@ -3194,7 +3194,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3194
3194
  isActive: typeof isActive === "boolean" ? isActive ? 1 : 0 : isActive
3195
3195
  };
3196
3196
  if (opts.dryRun === true) {
3197
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
3197
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
3198
3198
  {
3199
3199
  operation: OP_UPSERT_EMAIL,
3200
3200
  method: "POST",
@@ -3217,8 +3217,8 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3217
3217
  const created = await resource.create(cid, body, {});
3218
3218
  return { id: created.id, created: true };
3219
3219
  } catch (err) {
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);
3220
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) throw err;
3221
+ const named = (_nullishCoalesce(_chunkKB2ANVVRcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []))).map((e) => e.field).filter((f) => f !== void 0);
3222
3222
  const seen = /* @__PURE__ */ new Set();
3223
3223
  const unique = [...named].filter((f) => seen.has(f) ? false : (seen.add(f), true));
3224
3224
  const hasDefault = unique.some((f) => SAFE_CONTACT_CREATE_DEFAULTS[f] !== void 0);
@@ -3232,7 +3232,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3232
3232
  }
3233
3233
  continue;
3234
3234
  }
3235
- const detail = _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError);
3235
+ const detail = _chunkKB2ANVVRcjs.formatVendorDetail.call(void 0, err.vendorError);
3236
3236
  throw new ContactCreateFailedError(
3237
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}` : ""}`,
3238
3238
  unique,
@@ -3248,7 +3248,7 @@ async function upsertByEmail(resource, companyID, email, extra, opts, http) {
3248
3248
  }
3249
3249
 
3250
3250
  // src/resources/contacts.ts
3251
- var ContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3251
+ var ContactsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3252
3252
  constructor(http, pageSize) {
3253
3253
  super(http, {
3254
3254
  key: "contacts",
@@ -3340,7 +3340,7 @@ var ContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3340
3340
  };
3341
3341
 
3342
3342
  // src/resources/contact_webhooks.ts
3343
- var ContactWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3343
+ var ContactWebhooksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3344
3344
  constructor(http, pageSize) {
3345
3345
  super(http, {
3346
3346
  key: "contact_webhooks",
@@ -3416,7 +3416,7 @@ var ContactWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3416
3416
  };
3417
3417
 
3418
3418
  // src/resources/contract_billing_rules.ts
3419
- var ContractBillingRulesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3419
+ var ContractBillingRulesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3420
3420
  constructor(http, pageSize) {
3421
3421
  super(http, {
3422
3422
  key: "contract_billing_rules",
@@ -3482,7 +3482,7 @@ var ContractBillingRulesResource = class extends _chunk5N6DYKXOcjs.BaseResource
3482
3482
  };
3483
3483
 
3484
3484
  // src/resources/contract_block_hour_factors.ts
3485
- var ContractBlockHourFactorsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3485
+ var ContractBlockHourFactorsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3486
3486
  constructor(http, pageSize) {
3487
3487
  super(http, {
3488
3488
  key: "contract_block_hour_factors",
@@ -3541,7 +3541,7 @@ var ContractBlockHourFactorsResource = class extends _chunk5N6DYKXOcjs.BaseResou
3541
3541
  };
3542
3542
 
3543
3543
  // src/resources/contract_blocks.ts
3544
- var ContractBlocksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3544
+ var ContractBlocksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3545
3545
  constructor(http, pageSize) {
3546
3546
  super(http, {
3547
3547
  key: "contract_blocks",
@@ -3600,7 +3600,7 @@ var ContractBlocksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3600
3600
  };
3601
3601
 
3602
3602
  // src/resources/contract_charges.ts
3603
- var ContractChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3603
+ var ContractChargesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3604
3604
  constructor(http, pageSize) {
3605
3605
  super(http, {
3606
3606
  key: "contract_charges",
@@ -3671,7 +3671,7 @@ var ContractChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3671
3671
  };
3672
3672
 
3673
3673
  // src/resources/contract_exclusion_billing_codes.ts
3674
- var ContractExclusionBillingCodesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3674
+ var ContractExclusionBillingCodesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3675
3675
  constructor(http, pageSize) {
3676
3676
  super(http, {
3677
3677
  key: "contract_exclusion_billing_codes",
@@ -3728,7 +3728,7 @@ var ContractExclusionBillingCodesResource = class extends _chunk5N6DYKXOcjs.Base
3728
3728
  };
3729
3729
 
3730
3730
  // src/resources/contract_exclusion_roles.ts
3731
- var ContractExclusionRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3731
+ var ContractExclusionRolesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3732
3732
  constructor(http, pageSize) {
3733
3733
  super(http, {
3734
3734
  key: "contract_exclusion_roles",
@@ -3785,7 +3785,7 @@ var ContractExclusionRolesResource = class extends _chunk5N6DYKXOcjs.BaseResourc
3785
3785
  };
3786
3786
 
3787
3787
  // src/resources/contract_exclusion_set_excluded_roles.ts
3788
- var ContractExclusionSetExcludedRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3788
+ var ContractExclusionSetExcludedRolesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3789
3789
  constructor(http, pageSize) {
3790
3790
  super(http, {
3791
3791
  key: "contract_exclusion_set_excluded_roles",
@@ -3842,7 +3842,7 @@ var ContractExclusionSetExcludedRolesResource = class extends _chunk5N6DYKXOcjs.
3842
3842
  };
3843
3843
 
3844
3844
  // src/resources/contract_exclusion_set_excluded_work_types.ts
3845
- var ContractExclusionSetExcludedWorkTypesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3845
+ var ContractExclusionSetExcludedWorkTypesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3846
3846
  constructor(http, pageSize) {
3847
3847
  super(http, {
3848
3848
  key: "contract_exclusion_set_excluded_work_types",
@@ -3899,7 +3899,7 @@ var ContractExclusionSetExcludedWorkTypesResource = class extends _chunk5N6DYKXO
3899
3899
  };
3900
3900
 
3901
3901
  // src/resources/contract_exclusion_sets.ts
3902
- var ContractExclusionSetsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3902
+ var ContractExclusionSetsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3903
3903
  constructor(http, pageSize) {
3904
3904
  super(http, {
3905
3905
  key: "contract_exclusion_sets",
@@ -3973,7 +3973,7 @@ var ContractExclusionSetsResource = class extends _chunk5N6DYKXOcjs.BaseResource
3973
3973
  };
3974
3974
 
3975
3975
  // src/resources/contract_milestones.ts
3976
- var ContractMilestonesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
3976
+ var ContractMilestonesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
3977
3977
  constructor(http, pageSize) {
3978
3978
  super(http, {
3979
3979
  key: "contract_milestones",
@@ -4032,7 +4032,7 @@ var ContractMilestonesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4032
4032
  };
4033
4033
 
4034
4034
  // src/resources/contract_notes.ts
4035
- var ContractNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4035
+ var ContractNotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4036
4036
  constructor(http, pageSize) {
4037
4037
  super(http, {
4038
4038
  key: "contract_notes",
@@ -4091,7 +4091,7 @@ var ContractNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4091
4091
  };
4092
4092
 
4093
4093
  // src/resources/contract_rates.ts
4094
- var ContractRatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4094
+ var ContractRatesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4095
4095
  constructor(http, pageSize) {
4096
4096
  super(http, {
4097
4097
  key: "contract_rates",
@@ -4150,7 +4150,7 @@ var ContractRatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4150
4150
  };
4151
4151
 
4152
4152
  // src/resources/contract_retainers.ts
4153
- var ContractRetainersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4153
+ var ContractRetainersResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4154
4154
  constructor(http, pageSize) {
4155
4155
  super(http, {
4156
4156
  key: "contract_retainers",
@@ -4209,7 +4209,7 @@ var ContractRetainersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4209
4209
  };
4210
4210
 
4211
4211
  // src/resources/contract_role_costs.ts
4212
- var ContractRoleCostsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4212
+ var ContractRoleCostsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4213
4213
  constructor(http, pageSize) {
4214
4214
  super(http, {
4215
4215
  key: "contract_role_costs",
@@ -4268,7 +4268,7 @@ var ContractRoleCostsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4268
4268
  };
4269
4269
 
4270
4270
  // src/resources/contract_service_adjustments.ts
4271
- var ContractServiceAdjustmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4271
+ var ContractServiceAdjustmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4272
4272
  constructor(http, pageSize) {
4273
4273
  super(http, {
4274
4274
  key: "contract_service_adjustments",
@@ -4302,7 +4302,7 @@ var ContractServiceAdjustmentsResource = class extends _chunk5N6DYKXOcjs.BaseRes
4302
4302
  };
4303
4303
 
4304
4304
  // src/resources/contract_service_bundle_adjustments.ts
4305
- var ContractServiceBundleAdjustmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4305
+ var ContractServiceBundleAdjustmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4306
4306
  constructor(http, pageSize) {
4307
4307
  super(http, {
4308
4308
  key: "contract_service_bundle_adjustments",
@@ -4336,7 +4336,7 @@ var ContractServiceBundleAdjustmentsResource = class extends _chunk5N6DYKXOcjs.B
4336
4336
  };
4337
4337
 
4338
4338
  // src/resources/contract_service_bundles.ts
4339
- var ContractServiceBundlesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4339
+ var ContractServiceBundlesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4340
4340
  constructor(http, pageSize) {
4341
4341
  super(http, {
4342
4342
  key: "contract_service_bundles",
@@ -4395,7 +4395,7 @@ var ContractServiceBundlesResource = class extends _chunk5N6DYKXOcjs.BaseResourc
4395
4395
  };
4396
4396
 
4397
4397
  // src/resources/contract_service_bundle_units.ts
4398
- var ContractServiceBundleUnitsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4398
+ var ContractServiceBundleUnitsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4399
4399
  constructor(http, pageSize) {
4400
4400
  super(http, {
4401
4401
  key: "contract_service_bundle_units",
@@ -4437,7 +4437,7 @@ var ContractServiceBundleUnitsResource = class extends _chunk5N6DYKXOcjs.BaseRes
4437
4437
  };
4438
4438
 
4439
4439
  // src/resources/contract_services.ts
4440
- var ContractServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4440
+ var ContractServicesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4441
4441
  constructor(http, pageSize) {
4442
4442
  super(http, {
4443
4443
  key: "contract_services",
@@ -4496,7 +4496,7 @@ var ContractServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4496
4496
  };
4497
4497
 
4498
4498
  // src/resources/contract_service_units.ts
4499
- var ContractServiceUnitsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
4499
+ var ContractServiceUnitsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
4500
4500
  constructor(http, pageSize) {
4501
4501
  super(http, {
4502
4502
  key: "contract_service_units",
@@ -4549,7 +4549,8 @@ var PROFITABILITY_OPT_KEYS = [
4549
4549
  "groupByActivity",
4550
4550
  "staleAfterDays",
4551
4551
  "maxTicketsForJoin",
4552
- "limit"
4552
+ "limit",
4553
+ "includeRows"
4553
4554
  ];
4554
4555
  var LABOUR_METHOD_SET = [
4555
4556
  "billing_item_our_cost",
@@ -4561,7 +4562,15 @@ var PROFITABILITY_MAX_WINDOW_MONTHS = 36;
4561
4562
  var RECURRING_DRIFT_EPSILON = 5e-3;
4562
4563
  var ESTIMATE_DEVIATION_THRESHOLD_PCT = 10;
4563
4564
  var CLOSED_STATUS_LABEL_RE = /resolved|completed|cancelled|canceled|closed|deleted/i;
4564
- var PROFITABILITY_WIRE_BUDGET = 18;
4565
+ var PROFITABILITY_WIRE_BUDGET = 21;
4566
+ var BLOCK_HOURS_LABEL_RE = /block\s*hours?/i;
4567
+ var TIME_AND_MATERIALS_LABEL_RE = /time.*materials?/i;
4568
+ var NOT_ACTIVE_LABEL_RE = /cancel|inactive/i;
4569
+ var SUBSCRIPTION_NOT_ACTIVE_STATUS_IDS = /* @__PURE__ */ new Set([2, 3]);
4570
+ var PERIOD_TYPE_MONTHLY_FACTOR = { 2: 1, 3: 1 / 3, 4: 1 / 6, 5: 1 / 12 };
4571
+ var PERIOD_TYPE_ONE_TIME = 1;
4572
+ var SERVICE_LINE_FKS = ["contractServiceID", "contractServiceBundleID", "contractServicePeriodID", "contractServiceBundlePeriodID", "contractServiceAdjustmentID", "contractServiceBundleAdjustmentID"];
4573
+ var CHARGE_LINE_FKS = ["contractChargeID", "ticketChargeID", "projectChargeID"];
4565
4574
  var DATE_RE2 = /^\d{4}-\d{2}-\d{2}$/;
4566
4575
  function num2(v) {
4567
4576
  return typeof v === "number" && Number.isFinite(v) ? v : 0;
@@ -4597,17 +4606,81 @@ function monthsBetween(dateFrom, dateTo) {
4597
4606
  }
4598
4607
  return out;
4599
4608
  }
4609
+ function dayAfter(date) {
4610
+ return new Date(Date.parse(date) + 864e5).toISOString().slice(0, 10);
4611
+ }
4600
4612
  function monthBounds(month, dateFrom, dateTo) {
4601
4613
  const y = Number(month.slice(0, 4));
4602
4614
  const m = Number(month.slice(5, 7));
4603
4615
  const first = `${month}-01`;
4604
- const lastOfMonth = new Date(Date.UTC(y, m, 0)).getUTCDate();
4605
- const rawEnd = `${month}-${String(lastOfMonth).padStart(2, "0")}`;
4616
+ const nextFirst = new Date(Date.UTC(y, m, 1)).toISOString().slice(0, 10);
4617
+ const toExcl = dayAfter(dateTo);
4606
4618
  return {
4607
4619
  start: first > dateFrom ? first : dateFrom,
4608
- end: rawEnd < dateTo ? rawEnd : dateTo
4620
+ endExclusive: nextFirst < toExcl ? nextFirst : toExcl
4609
4621
  };
4610
4622
  }
4623
+ function chargeCost(charge) {
4624
+ const ext = charge["extendedCost"];
4625
+ const fromUnits = num2(charge["unitCost"]) * num2(charge["unitQuantity"]);
4626
+ if (typeof ext === "number" && Number.isFinite(ext) && !(ext === 0 && fromUnits !== 0)) return ext;
4627
+ return fromUnits;
4628
+ }
4629
+ function isOneTimePeriod(periodType, label) {
4630
+ return label !== void 0 ? /one[\s-]*time/i.test(label) : periodType === PERIOD_TYPE_ONE_TIME;
4631
+ }
4632
+ function periodMonthlyFactor(periodType, label) {
4633
+ if (label !== void 0) {
4634
+ if (/semi/i.test(label)) return 1 / 6;
4635
+ if (/quarter/i.test(label)) return 1 / 3;
4636
+ if (/annual|year/i.test(label)) return 1 / 12;
4637
+ if (/month/i.test(label)) return 1;
4638
+ return null;
4639
+ }
4640
+ return typeof periodType === "number" ? _nullishCoalesce(PERIOD_TYPE_MONTHLY_FACTOR[periodType], () => ( null)) : null;
4641
+ }
4642
+ var BILLING_ITEM_TYPE_KIND = {
4643
+ 1: "labour",
4644
+ 2: "labour",
4645
+ 3: "charges",
4646
+ 4: "expenses",
4647
+ 5: "other",
4648
+ 6: "recurring",
4649
+ 7: "charges",
4650
+ 8: "other"
4651
+ };
4652
+ function billingLineType(item) {
4653
+ const byType = BILLING_ITEM_TYPE_KIND[num2(item["billingItemType"])];
4654
+ if (byType !== void 0) return byType;
4655
+ if (num2(item["timeEntryID"]) > 0) return "labour";
4656
+ if (num2(item["expenseItemID"]) > 0) return "expenses";
4657
+ if (CHARGE_LINE_FKS.some((k) => num2(item[k]) > 0)) return "charges";
4658
+ if (SERVICE_LINE_FKS.some((k) => num2(item[k]) > 0)) return "recurring";
4659
+ return "other";
4660
+ }
4661
+ function internalAmount(row, internalKey, localKey) {
4662
+ const v = row[internalKey];
4663
+ return typeof v === "number" && Number.isFinite(v) ? v : num2(row[localKey]);
4664
+ }
4665
+ function cents(v) {
4666
+ return v === null ? null : Math.round(v * 100) / 100;
4667
+ }
4668
+ async function readPicklists(http, entityPath, operation) {
4669
+ const res = await http.request({ method: "GET", path: `${entityPath}/entityInformation/fields`, operation });
4670
+ const body = typeof res === "object" && res !== null ? res : {};
4671
+ const fields = Array.isArray(body["fields"]) ? body["fields"] : [];
4672
+ const out = /* @__PURE__ */ new Map();
4673
+ for (const f of fields) {
4674
+ if (f["isPickList"] !== true || typeof f["name"] !== "string" || !Array.isArray(f["picklistValues"])) continue;
4675
+ const values = /* @__PURE__ */ new Map();
4676
+ for (const p of f["picklistValues"]) {
4677
+ const id = typeof p["value"] === "string" ? Number.parseInt(p["value"], 10) : Number.NaN;
4678
+ if (Number.isFinite(id)) values.set(id, String(_nullishCoalesce(p["label"], () => ( ""))));
4679
+ }
4680
+ out.set(f["name"], values);
4681
+ }
4682
+ return out;
4683
+ }
4611
4684
  function dateToDay(v) {
4612
4685
  if (typeof v !== "string" || v.length < 10) return null;
4613
4686
  const d = Date.parse(v.slice(0, 10));
@@ -4615,8 +4688,8 @@ function dateToDay(v) {
4615
4688
  }
4616
4689
  function validateProfitabilityOptions(contractId, opts) {
4617
4690
  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})`,
4691
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
4692
+ `profitability: opts is required \u2014 the options object with dateFrom and dateTo (YYYY-MM-DD) (got ${opts === void 0 ? "undefined" : Array.isArray(opts) ? "an array" : typeof opts})`,
4620
4693
  { operation: "contracts.profitability" }
4621
4694
  );
4622
4695
  }
@@ -4656,7 +4729,7 @@ function validateProfitabilityOptions(contractId, opts) {
4656
4729
  if (method === "provided" && rate === null) {
4657
4730
  problems.push(`labourRatePerHour is required (finite number >= 0) when labourCostMethod is "provided" (got ${String(opts.labourRatePerHour)})`);
4658
4731
  }
4659
- for (const key of ["includeRecurringCosts", "includeUnbilledRevenue", "groupByActivity"]) {
4732
+ for (const key of ["includeRecurringCosts", "includeUnbilledRevenue", "groupByActivity", "includeRows"]) {
4660
4733
  const v = opts[key];
4661
4734
  if (v !== void 0 && typeof v !== "boolean") problems.push(`${key} must be a boolean (got ${String(v)})`);
4662
4735
  }
@@ -4692,12 +4765,12 @@ function validateProfitabilityOptions(contractId, opts) {
4692
4765
  }
4693
4766
  }
4694
4767
  try {
4695
- _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, contractId, "contractId");
4768
+ _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, contractId, "contractId");
4696
4769
  } catch (err) {
4697
- problems.push(err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.message : "contractId must be a vendor numeric id");
4770
+ problems.push(err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.message : "contractId must be a vendor numeric id");
4698
4771
  }
4699
4772
  if (problems.length > 0) {
4700
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
4773
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
4701
4774
  `profitability: ${problems.length} problem(s) found pre-request (zero wire was issued)
4702
4775
  - ` + problems.join("\n- "),
4703
4776
  { operation: "contracts.profitability" }
@@ -4714,7 +4787,8 @@ function validateProfitabilityOptions(contractId, opts) {
4714
4787
  groupByActivity: _nullishCoalesce(opts.groupByActivity, () => ( true)),
4715
4788
  staleAfterDays: stale,
4716
4789
  maxTicketsForJoin: mtj,
4717
- limit
4790
+ limit,
4791
+ includeRows: _nullishCoalesce(opts.includeRows, () => ( false))
4718
4792
  };
4719
4793
  }
4720
4794
  async function boundedPart2(http, path, conditions, limit, operation, includeFields) {
@@ -4727,7 +4801,7 @@ async function boundedPart2(http, path, conditions, limit, operation, includeFie
4727
4801
  body,
4728
4802
  operation
4729
4803
  });
4730
- const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, operation);
4804
+ const { items, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, operation);
4731
4805
  const capped = items.length >= limit;
4732
4806
  return { items, capped, hasMore: capped && pageDetails.nextPageUrl != null };
4733
4807
  }
@@ -4741,23 +4815,23 @@ async function fetchByIdsPart(http, entityPath, ids, fields, operation) {
4741
4815
  const byKey = /* @__PURE__ */ new Map();
4742
4816
  const misses = [];
4743
4817
  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);
4818
+ for (let c = 0; c < unique.length; c += _chunkKB2ANVVRcjs.FETCH_BY_IDS_CHUNK_SIZE) {
4819
+ const chunk = unique.slice(c, c + _chunkKB2ANVVRcjs.FETCH_BY_IDS_CHUNK_SIZE);
4746
4820
  const chunkKeys = new Set(chunk);
4747
4821
  try {
4748
4822
  const body = {
4749
- MaxRecords: _chunk5N6DYKXOcjs.FETCH_BY_IDS_CHUNK_SIZE,
4823
+ MaxRecords: _chunkKB2ANVVRcjs.FETCH_BY_IDS_CHUNK_SIZE,
4750
4824
  filter: [{ field: "id", op: "in", value: chunk }],
4751
4825
  IncludeFields: fields
4752
4826
  };
4753
4827
  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);
4828
+ const { items: rows } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, operation);
4755
4829
  for (const row of rows) {
4756
4830
  const k = num2(row.id);
4757
4831
  if (k > 0 && chunkKeys.has(k)) byKey.set(k, row);
4758
4832
  }
4759
4833
  } catch (err) {
4760
- const code = err instanceof _chunk5N6DYKXOcjs.AutotaskError ? err.code : "SERVER_ERROR";
4834
+ const code = err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.code : "SERVER_ERROR";
4761
4835
  for (const k of chunk) {
4762
4836
  if (!byKey.has(k) && !misses.some((m) => m.id === k)) misses.push({ id: k, code, message: err instanceof Error ? err.message : String(err) });
4763
4837
  }
@@ -4767,11 +4841,11 @@ async function fetchByIdsPart(http, entityPath, ids, fields, operation) {
4767
4841
  for (const k of queryMissed) {
4768
4842
  try {
4769
4843
  const res = await http.request({ method: "GET", path: `${entityPath}/${k}`, operation });
4770
- byKey.set(k, _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, k, operation));
4844
+ byKey.set(k, _chunkKB2ANVVRcjs.unwrapItem.call(void 0, res, k, operation));
4771
4845
  } catch (err) {
4772
- if (err instanceof _chunk5N6DYKXOcjs.NotFoundError) {
4846
+ if (err instanceof _chunkKB2ANVVRcjs.NotFoundError) {
4773
4847
  misses.push({ id: k, code: "NOT_FOUND", message: err.message });
4774
- } else if (err instanceof _chunk5N6DYKXOcjs.AutotaskError) {
4848
+ } else if (err instanceof _chunkKB2ANVVRcjs.AutotaskError) {
4775
4849
  misses.push({ id: k, code: err.code, message: err.message });
4776
4850
  } else {
4777
4851
  misses.push({ id: k, code: "SERVER_ERROR", message: err instanceof Error ? err.message : String(err) });
@@ -4873,7 +4947,7 @@ async function expandByMonth(http, path, fullWindowCond, limit, operation, field
4873
4947
  const cond = [
4874
4948
  ...fullWindowCond.filter((c) => c.field !== dateField),
4875
4949
  { field: dateField, op: "gte", value: b.start },
4876
- { field: dateField, op: "lte", value: b.end }
4950
+ { field: dateField, op: "lt", value: b.endExclusive }
4877
4951
  ];
4878
4952
  const page = await boundedPart2(http, path, cond, limit, operation, fields);
4879
4953
  wires.issued += 1;
@@ -4888,7 +4962,15 @@ async function expandByMonth(http, path, fullWindowCond, limit, operation, field
4888
4962
  }
4889
4963
  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
4964
  wires.note = (wires.note ? wires.note + " | " : "") + partNote;
4891
- return { items: all, capped: cappedMonths.length > 0, hasMore: fullMonths.length > 0, note: partNote, status: "ok" };
4965
+ return { items: all, capped: cappedMonths.length > 0, hasMore: fullMonths.length > 0, note: partNote, status: "ok", truncatedMonths: fullMonths };
4966
+ }
4967
+ async function degradable(read) {
4968
+ try {
4969
+ return await read();
4970
+ } catch (err) {
4971
+ if (!(err instanceof _chunkKB2ANVVRcjs.AutotaskError)) throw err;
4972
+ return { items: [], capped: false, hasMore: false, absent: err.code, absentMessage: err.message };
4973
+ }
4892
4974
  }
4893
4975
  function fmtHours(h) {
4894
4976
  const r = Math.round(h * 100) / 100;
@@ -4904,16 +4986,29 @@ function pctOrNa(r) {
4904
4986
  function dedupeSortCap(ids, limit) {
4905
4987
  return [...new Set(ids)].sort((a, b) => Number(a) - Number(b)).slice(0, limit);
4906
4988
  }
4907
- async function profitability(resource, contractId, opts, http) {
4908
- const v = validateProfitabilityOptions(contractId, _nullishCoalesce(opts, () => ( {})));
4989
+ async function profitability(resource, contractId, opts, rawHttp) {
4990
+ const v = validateProfitabilityOptions(contractId, opts);
4909
4991
  const OP2 = "contracts.profitability";
4910
- const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, contractId, "contractId");
4992
+ const id = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, contractId, "contractId");
4911
4993
  const idNum = typeof id === "number" ? id : Number(id);
4912
- const wires = { issued: 0, budget: PROFITABILITY_WIRE_BUDGET };
4994
+ const wires = { issued: 0, requests: 0, budget: PROFITABILITY_WIRE_BUDGET };
4913
4995
  const asOf = (/* @__PURE__ */ new Date()).toISOString();
4914
4996
  const asOfMs = Date.parse(asOf);
4997
+ const toExcl = dayAfter(v.dateTo);
4998
+ const windowOn = (field) => [{ field, op: "gte", value: v.dateFrom }, { field, op: "lt", value: toExcl }];
4999
+ const http = { request: (o) => {
5000
+ wires.requests += 1;
5001
+ return rawHttp.request(o);
5002
+ } };
5003
+ const readPart = (path, conditions, fields) => {
5004
+ wires.issued += 1;
5005
+ return degradable(() => boundedPart2(http, path, conditions, v.limit, OP2, fields));
5006
+ };
4915
5007
  const skipPart = (note) => ({ items: [], capped: false, hasMore: false, status: "skipped", note });
4916
5008
  const stampPart = (key, raw, conditions, extraNotes) => {
5009
+ if (raw.absent !== void 0) {
5010
+ return { items: [], capped: false, hasMore: false, status: "absent", absent: raw.absent, note: `absent: the read failed (${raw.absent}: ${_nullishCoalesce(raw.absentMessage, () => ( ""))}) \u2014 the monthly figures it feeds carry it in coverage_gaps` };
5011
+ }
4917
5012
  const st = unbilledWorkPartStatus(key, conditions, raw.items);
4918
5013
  return {
4919
5014
  items: raw.items,
@@ -4922,15 +5017,29 @@ async function profitability(resource, contractId, opts, http) {
4922
5017
  status: st.status,
4923
5018
  blindSurface: st.blindSurface,
4924
5019
  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
5020
+ emptyReason: raw.items.length === 0 && st.status === "ok" ? _optionalChain([_chunkKB2ANVVRcjs.EMPTY_REASON_STAMPS, 'access', _29 => _29[key], 'optionalAccess', _30 => _30.query]) : void 0
4926
5021
  };
4927
5022
  };
5023
+ const truncatedMonths = {};
5024
+ const windowedPart = async (name, key, path, cond, fields, dateField) => {
5025
+ const first = await readPart(path, cond, fields);
5026
+ if (first.absent !== void 0 || !first.hasMore) return { part: stampPart(key, first, cond), rows: first.items };
5027
+ const wp = await degradable(() => expandByMonth(http, path, cond, v.limit, OP2, fields, dateField, v.dateFrom, v.dateTo, wires));
5028
+ if (!("truncatedMonths" in wp)) return { part: stampPart(key, wp, cond), rows: [] };
5029
+ const { truncatedMonths: tm, ...part } = wp;
5030
+ truncatedMonths[name] = tm;
5031
+ return { part, rows: wp.items };
5032
+ };
5033
+ const contractCached = _optionalChain([rawHttp, 'access', _31 => _31.readCache, 'optionalAccess', _32 => _32.get, 'call', _33 => _33(`/V1.0/Contracts/${id}`)]) !== void 0;
4928
5034
  const contract = await resource.get(id);
4929
5035
  wires.issued += 1;
5036
+ if (!contractCached) wires.requests += 1;
4930
5037
  const contractRow = contract;
4931
5038
  const companyID = num2(contractRow["companyID"]);
5039
+ const contractType = num2(contractRow["contractType"]);
4932
5040
  let customer = null;
4933
5041
  let customerStatus = "skipped";
5042
+ let customerAbsent;
4934
5043
  if (companyID > 0) {
4935
5044
  try {
4936
5045
  const res = await http.request({
@@ -4938,98 +5047,97 @@ async function profitability(resource, contractId, opts, http) {
4938
5047
  path: `/V1.0/Companies/${companyID}`,
4939
5048
  operation: OP2
4940
5049
  });
4941
- const item = _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, companyID, OP2);
5050
+ const item = _chunkKB2ANVVRcjs.unwrapItem.call(void 0, res, companyID, OP2);
4942
5051
  customer = _nullishCoalesce(item, () => ( null));
4943
5052
  customerStatus = "ok";
4944
5053
  } catch (err) {
4945
- if (!(err instanceof _chunk5N6DYKXOcjs.NotFoundError)) throw err;
5054
+ if (!(err instanceof _chunkKB2ANVVRcjs.AutotaskError)) throw err;
5055
+ if (!(err instanceof _chunkKB2ANVVRcjs.NotFoundError)) {
5056
+ customerStatus = "absent";
5057
+ customerAbsent = err.code;
5058
+ }
4946
5059
  }
4947
5060
  wires.issued += 1;
4948
5061
  }
5062
+ let contractTypeLabel = null;
5063
+ if (contractType > 0) {
5064
+ wires.issued += 1;
5065
+ try {
5066
+ contractTypeLabel = await _asyncNullishCoalesce(await _asyncOptionalChain([(await readPicklists(http, "/V1.0/Contracts", OP2)), 'access', async _34 => _34.get, 'call', async _35 => _35("contractType"), 'optionalAccess', async _36 => _36.get, 'call', async _37 => _37(contractType)]), async () => ( null));
5067
+ } catch (err) {
5068
+ if (!(err instanceof _chunkKB2ANVVRcjs.AutotaskError)) throw err;
5069
+ }
5070
+ }
5071
+ const contractTypeKnown = contractTypeLabel !== null;
5072
+ const isBlockHours = contractTypeKnown && BLOCK_HOURS_LABEL_RE.test(contractTypeLabel);
5073
+ const isTimeAndMaterials = contractTypeKnown && TIME_AND_MATERIALS_LABEL_RE.test(contractTypeLabel);
4949
5074
  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;
5075
+ const servicesRaw = await readPart("/V1.0/ContractServices/query", servicesCond, ["id", "serviceID", "unitPrice", "unitCost", "internalCurrencyUnitPrice", "internalDescription"]);
5076
+ const unitsCond = [{ field: "contractID", op: "eq", value: id }, ...windowOn("startDate")];
5077
+ const units = await windowedPart("contractServiceUnits", "contract_service_units", "/V1.0/ContractServiceUnits/query", unitsCond, ["id", "contractServiceID", "serviceID", "units", "price", "cost", "internalCurrencyPrice", "startDate", "endDate", "approveAndPostDate"], "startDate");
5078
+ const unitRows = units.rows;
4955
5079
  let chargesPart;
4956
5080
  let charges = [];
4957
5081
  let chargesCond = [];
4958
5082
  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;
5083
+ chargesCond = [{ field: "contractID", op: "eq", value: id }, ...windowOn("datePurchased")];
5084
+ const raw = await readPart("/V1.0/ContractCharges/query", chargesCond, ["id", "chargeType", "billableAmount", "extendedCost", "unitCost", "unitPrice", "unitQuantity", "datePurchased", "isBilled", "status", "contractServiceID"]);
4962
5085
  charges = raw.items;
4963
5086
  chargesPart = stampPart("contract_charges", raw, chargesCond);
4964
5087
  } else {
4965
5088
  chargesPart = skipPart("skipped: includeRecurringCosts is false (zero wire)");
4966
5089
  }
4967
5090
  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;
5091
+ const roleCostsRaw = await readPart("/V1.0/ContractRoleCosts/query", roleCostsCond, ["id", "rate", "resourceID", "roleID"]);
4970
5092
  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 };
5093
+ const ratesRaw = await readPart("/V1.0/ContractRates/query", ratesCond, ["id", "roleID", "contractHourlyRate", "internalCurrencyContractHourlyRate"]);
5094
+ let blocksPart;
5095
+ if (!isBlockHours) {
5096
+ blocksPart = skipPart(
5097
+ contractTypeKnown ? `skipped: not a Block Hours contract (contractType ${contractType} "${contractTypeLabel}") \u2014 included hours apply to hour blocks only (zero wire)` : `skipped: the contract type is unknown (contractType ${contractType || "absent"}; label unresolved) \u2014 included hours are not evaluable (zero wire)`
5098
+ );
4983
5099
  } 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
- }
5100
+ const blocksCond = [{ field: "contractID", op: "eq", value: id }];
5101
+ const raw = await readPart("/V1.0/ContractBlocks/query", blocksCond, ["id", "datePurchased", "startDate", "endDate", "hours", "hoursApproved", "status", "isPaid"]);
5102
+ blocksPart = stampPart("contract_blocks", raw, blocksCond);
5103
+ }
5104
+ const billingCond = [{ field: "contractID", op: "eq", value: id }, ...windowOn("itemDate")];
5105
+ const billingFields = ["id", "invoiceID", "timeEntryID", "ticketID", "ourCost", "quantity", "rate", "extendedPrice", "internalCurrencyExtendedPrice", "itemDate", "postedDate", "nonBillable", "billingCodeID", "billingItemType", "expenseItemID", ...SERVICE_LINE_FKS, ...CHARGE_LINE_FKS];
5106
+ const billing = await windowedPart("billingItems", "billing_items", "/V1.0/BillingItems/query", billingCond, billingFields, "itemDate");
5107
+ const billingItems = billing.part;
5108
+ const billingRows = billing.rows;
4988
5109
  const invoiceIds = [...new Set(billingRows.map((b) => num2(b["invoiceID"])).filter((n) => n > 0))];
4989
5110
  let invoicesPart;
4990
5111
  let invoices = [];
4991
5112
  if (invoiceIds.length === 0) {
4992
5113
  invoicesPart = skipPart("skipped: the billing part has no invoiceIDs (zero wire)");
4993
5114
  } 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`;
5115
+ const capped = capJoinSet2(invoiceIds, _chunkKB2ANVVRcjs.FETCH_BY_IDS_MAX_ITEMS);
5116
+ if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `invoiceJoinTruncated: the join set is capped at ${_chunkKB2ANVVRcjs.FETCH_BY_IDS_MAX_ITEMS} of ${capped.total} invoice ids (the fetch-by-ids cap) \u2014 the figures cover the returned set only`;
4996
5117
  const fb = await fetchByIdsPart(http, "/V1.0/Invoices", capped.ids, ["id", "invoiceNumber", "invoiceTotal", "paidDate", "isVoided", "dueDate"], OP2);
4997
5118
  wires.issued += 1;
4998
5119
  invoices = fb.items;
4999
5120
  invoicesPart = { items: fb.items, capped: capped.truncated, hasMore: capped.truncated, status: "ok", note: fb.notes.join(" | ") || void 0 };
5000
5121
  }
5001
- const timeCond = () => [{ field: "contractID", op: "eq", value: id }, { field: "dateWorked", op: "gte", value: v.dateFrom }, { field: "dateWorked", op: "lte", value: v.dateTo }];
5122
+ const timeCond = [{ field: "contractID", op: "eq", value: id }, ...windowOn("dateWorked")];
5002
5123
  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
- }
5124
+ const time = await windowedPart("timeEntries", "time_entries", "/V1.0/TimeEntries/query", timeCond, timeFields, "dateWorked");
5125
+ const timeEntries = time.part;
5126
+ const entries = time.rows;
5016
5127
  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;
5128
+ const createdInWindow = [{ field: "contractID", op: "eq", value: id }, ...windowOn("createDate")];
5129
+ const refTicketIds = capJoinSet2(entries.map((e) => num2(e["ticketID"])).filter((n) => n > 0), v.maxTicketsForJoin);
5130
+ const ticketsActCond = refTicketIds.ids.length === 0 ? createdInWindow : [{ op: "or", items: [{ op: "and", items: createdInWindow }, { field: "id", op: "in", value: refTicketIds.ids }] }];
5131
+ const ticketsActRaw = await readPart("/V1.0/Tickets/query", ticketsActCond, ticketFields);
5020
5132
  let openStatusSet = null;
5021
5133
  let statusNote;
5134
+ wires.issued += 1;
5022
5135
  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) {
5136
+ const values = (await readPicklists(http, "/V1.0/Tickets", OP2)).get("status");
5137
+ if (values === void 0 || values.size === 0) {
5030
5138
  statusNote = "the tickets.status picklist is not exposed to this API user \u2014 the open-status labels are unavailable";
5031
5139
  } 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));
5140
+ const open = [...values].filter(([, label]) => !CLOSED_STATUS_LABEL_RE.test(label)).map(([v2]) => v2);
5033
5141
  if (open.length === 0) {
5034
5142
  statusNote = "every tickets.status picklist label is closed-class \u2014 no open statuses exist in this tenant";
5035
5143
  } else {
@@ -5037,8 +5145,7 @@ async function profitability(resource, contractId, opts, http) {
5037
5145
  }
5038
5146
  }
5039
5147
  } 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`;
5148
+ statusNote = `the tickets.status field catalog read failed (${err instanceof _chunkKB2ANVVRcjs.AutotaskError ? err.code : "SERVER_ERROR"}: ${err instanceof Error ? err.message : String(err)}) \u2014 the open-status labels are unavailable`;
5042
5149
  }
5043
5150
  let ticketsOpenPart;
5044
5151
  let openTickets = [];
@@ -5046,8 +5153,7 @@ async function profitability(resource, contractId, opts, http) {
5046
5153
  ticketsOpenPart = skipPart(`skipped: ${statusNote} (zero wire)`);
5047
5154
  } else {
5048
5155
  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;
5156
+ const raw = await readPart("/V1.0/Tickets/query", openCond, ticketFields);
5051
5157
  openTickets = raw.items;
5052
5158
  ticketsOpenPart = stampPart("tickets", raw, openCond, ["openStatusHeuristic: true (the open set is the tenant picklist minus the closed-class labels)"]);
5053
5159
  }
@@ -5058,8 +5164,8 @@ async function profitability(resource, contractId, opts, http) {
5058
5164
  if (resourceIds.length === 0) {
5059
5165
  resourcesPart = skipPart("skipped: the time part has no resourceIDs (zero wire)");
5060
5166
  } 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`;
5167
+ const capped = capJoinSet2(resourceIds, _chunkKB2ANVVRcjs.FETCH_BY_IDS_MAX_ITEMS);
5168
+ if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `resourceJoinTruncated: the join set is capped at ${_chunkKB2ANVVRcjs.FETCH_BY_IDS_MAX_ITEMS} of ${capped.total} resource ids (the fetch-by-ids cap) \u2014 the figures cover the returned set only`;
5063
5169
  const fb = await fetchByIdsPart(http, "/V1.0/Resources", capped.ids, ["id", "internalCost", "firstName", "lastName", "isActive", "userType"], OP2);
5064
5170
  wires.issued += 1;
5065
5171
  resources = fb.items;
@@ -5071,16 +5177,16 @@ async function profitability(resource, contractId, opts, http) {
5071
5177
  const k = num2(t["id"]);
5072
5178
  if (k > 0 && !fetchedTickets.has(k)) fetchedTickets.set(k, t);
5073
5179
  }
5074
- const ticketJoin = capJoinSet2([...fetchedTickets.keys()], v.maxTicketsForJoin);
5180
+ const contractTickets = [...fetchedTickets.values()].filter((t) => num2(t["contractID"]) === idNum);
5181
+ const ticketJoin = capJoinSet2(contractTickets.map((t) => num2(t["id"])), v.maxTicketsForJoin);
5075
5182
  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
5183
  let expensesPart;
5077
5184
  let expenses = [];
5078
5185
  if (ticketJoin.ids.length === 0) {
5079
5186
  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
5187
  } 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;
5188
+ const expCond = [{ field: "ticketID", op: "in", value: ticketJoin.ids }, ...windowOn("expenseDate")];
5189
+ const raw = await readPart("/V1.0/ExpenseItems/query", expCond, ["id", "expenseDate", "expenseCategory", "paymentType", "expenseCurrencyExpenseAmount", "internalCurrencyExpenseAmount", "ticketID"]);
5084
5190
  expenses = raw.items;
5085
5191
  expensesPart = stampPart("expense_items", raw, expCond, joinNote === void 0 ? void 0 : [joinNote]);
5086
5192
  }
@@ -5092,45 +5198,69 @@ async function profitability(resource, contractId, opts, http) {
5092
5198
  const probeCond = [
5093
5199
  { field: "ticketID", op: "in", value: ticketJoin.ids },
5094
5200
  { 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 }
5201
+ ...windowOn("dateWorked")
5097
5202
  ];
5098
- const raw = await boundedPart2(http, "/V1.0/TimeEntries/query", probeCond, v.limit, OP2, ["id", "ticketID", "contractID", "resourceID", "hoursWorked", "dateWorked"]);
5099
- wires.issued += 1;
5203
+ const raw = await readPart("/V1.0/TimeEntries/query", probeCond, ["id", "ticketID", "contractID", "resourceID", "hoursWorked", "dateWorked"]);
5100
5204
  probeRows = raw.items;
5101
5205
  probePart = stampPart("time_entries", raw, probeCond, joinNote === void 0 ? void 0 : [joinNote]);
5102
5206
  }
5103
5207
  let configurationItemsPart;
5104
5208
  let cis = [];
5105
- let ciCond = [];
5106
5209
  if (!v.includeRecurringCosts) {
5107
5210
  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
5211
  } 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;
5212
+ const ciCond = [{ field: "contractID", op: "eq", value: id }];
5213
+ const raw = await readPart("/V1.0/ConfigurationItems/query", ciCond, ["id", "configurationItemName", "status", "contractID"]);
5114
5214
  cis = raw.items;
5115
5215
  configurationItemsPart = stampPart("configuration_items", raw, ciCond);
5116
5216
  }
5117
5217
  let subscriptionsPart;
5118
5218
  let subscriptions = [];
5219
+ const subFactor = /* @__PURE__ */ new Map();
5220
+ const oneTimeSubs = /* @__PURE__ */ new Set();
5221
+ const cancelledSubs = /* @__PURE__ */ new Set();
5119
5222
  if (cis.length === 0) {
5120
5223
  subscriptionsPart = skipPart("skipped: the CI join found no configuration items \u2014 the subscriptions part is not evaluable (zero wire)");
5121
5224
  } else {
5122
- const ciIds = capJoinSet2(cis.map((c) => num2(c["id"])).filter((n) => n > 0), _chunk5N6DYKXOcjs.FETCH_BY_IDS_MAX_ITEMS);
5225
+ const ciIds = capJoinSet2(cis.map((c) => num2(c["id"])).filter((n) => n > 0), _chunkKB2ANVVRcjs.FETCH_BY_IDS_MAX_ITEMS);
5123
5226
  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;
5227
+ const raw = await readPart("/V1.0/Subscriptions/query", subCond, ["id", "subscriptionName", "configurationItemID", "periodCost", "periodPrice", "periodType", "effectiveDate", "expirationDate", "status", "totalCost"]);
5126
5228
  subscriptions = raw.items;
5127
- subscriptionsPart = stampPart("subscriptions", raw, subCond);
5229
+ let labels = null;
5230
+ if (subscriptions.length > 0) {
5231
+ wires.issued += 1;
5232
+ try {
5233
+ labels = await readPicklists(http, "/V1.0/Subscriptions", OP2);
5234
+ } catch (err) {
5235
+ if (!(err instanceof _chunkKB2ANVVRcjs.AutotaskError)) throw err;
5236
+ }
5237
+ }
5238
+ for (const x of subscriptions) {
5239
+ const sid = num2(x["id"]);
5240
+ const periodLabel = _optionalChain([labels, 'optionalAccess', _38 => _38.get, 'call', _39 => _39("periodType"), 'optionalAccess', _40 => _40.get, 'call', _41 => _41(num2(x["periodType"]))]);
5241
+ subFactor.set(sid, periodMonthlyFactor(x["periodType"], periodLabel));
5242
+ if (isOneTimePeriod(x["periodType"], periodLabel)) oneTimeSubs.add(sid);
5243
+ const statusLabel = _optionalChain([labels, 'optionalAccess', _42 => _42.get, 'call', _43 => _43("status"), 'optionalAccess', _44 => _44.get, 'call', _45 => _45(num2(x["status"]))]);
5244
+ const notActive = statusLabel !== void 0 ? NOT_ACTIVE_LABEL_RE.test(statusLabel) : labels === null && SUBSCRIPTION_NOT_ACTIVE_STATUS_IDS.has(num2(x["status"]));
5245
+ if (notActive) cancelledSubs.add(sid);
5246
+ }
5247
+ const unknownPeriods = [...new Set(subscriptions.filter((x) => subFactor.get(num2(x["id"])) === null && !oneTimeSubs.has(num2(x["id"]))).map((x) => String(_nullishCoalesce(x["periodType"], () => ( "absent")))))];
5248
+ subscriptionsPart = stampPart("subscriptions", raw, subCond, [
5249
+ "scope: the subscriptions on the CIs this contract covers \u2014 periodCost prorated to a month by periodType into tooling_cost.vendor, REPORTED but NOT folded into total_cost/profit/margin (subscriptions bill outside the contract)",
5250
+ ...subscriptions.length > 0 && labels === null ? ["the Subscriptions field catalog read failed \u2014 the verified id maps apply (periodType 1 One-Time, 2 Monthly, 3 Quarterly, 4 Semi-Annual, 5 Yearly; status 2 Cancelled / 3 Inactive excluded)"] : [],
5251
+ ...cancelledSubs.size > 0 ? [`${cancelledSubs.size} not-active (cancelled/inactive) subscription(s) excluded from tooling_cost.vendor`] : [],
5252
+ ...oneTimeSubs.size > 0 ? [`${oneTimeSubs.size} one-time subscription(s): periodCost booked whole in the effectiveDate month, never prorated`] : [],
5253
+ ...unknownPeriods.length > 0 ? [`unrecognised periodType ${unknownPeriods.join(", ")} \u2014 those subscriptions are excluded from tooling_cost.vendor (not prorated)`] : []
5254
+ ]);
5128
5255
  }
5129
5256
  const servicesPart = stampPart("contract_services", servicesRaw, servicesCond);
5130
- const unitsPart = stampPart("contract_service_units", unitsRaw, unitsCond);
5257
+ const unitsPart = units.part;
5131
5258
  const roleCostsPart = stampPart("contract_role_costs", roleCostsRaw, roleCostsCond);
5132
5259
  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);
5260
+ const ticketsActivityPart = stampPart("tickets", ticketsActRaw, ticketsActCond, [
5261
+ ...ticketsActRaw.hasMore ? [`${fetchedTickets.size} ticket(s) returned of possibly more \u2014 the checks cover the returned set only`] : [],
5262
+ ...refTicketIds.truncated ? [`the time-referenced ticket ids are capped at ${v.maxTicketsForJoin} of ${refTicketIds.total} \u2014 the rest read as ticket_not_in_fetched_set`] : []
5263
+ ]);
5134
5264
  const billedByEntryId = /* @__PURE__ */ new Map();
5135
5265
  for (const b of billingRows) {
5136
5266
  const te = num2(b["timeEntryID"]);
@@ -5171,56 +5301,92 @@ async function profitability(resource, contractId, opts, http) {
5171
5301
  bucket.hours += hoursOf(e);
5172
5302
  bucket.cost += _nullishCoalesce(r.cost, () => ( 0));
5173
5303
  }
5304
+ for (const b of Object.values(sources)) b.cost = cents(b.cost);
5174
5305
  const unresolvedHours = sources.missing.hours;
5175
5306
  if (unresolvedHours > 0) resolutionNotes.push(`${fmtHours(unresolvedHours)} hours unresolved (missing rate) \u2014 total_cost is a lower bound`);
5176
5307
  const costRateResolution = { method: v.method, sources, unresolvedHours, notes: resolutionNotes };
5177
5308
  const months = monthsBetween(v.dateFrom, v.dateTo);
5178
5309
  const monthOf = (date) => typeof date === "string" && DATE_RE2.test(`${date}`.slice(0, 10)) ? date.slice(0, 7) : null;
5179
5310
  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
- };
5311
+ const unitIn = (unit, m) => inMonth(unit["startDate"], m);
5312
+ const lineRevenue = (b) => internalAmount(b, "internalCurrencyExtendedPrice", "extendedPrice");
5313
+ const expectedBasis = unitsPart.status !== "absent" && (servicesRaw.items.length > 0 || unitRows.length > 0);
5314
+ const expectedIn = (m) => unitRows.filter((u) => unitIn(u, m)).reduce((a, u) => a + internalAmount(u, "internalCurrencyPrice", "price"), 0);
5197
5315
  const recurringIn = (m) => {
5198
5316
  if (!v.includeRecurringCosts) return 0;
5199
5317
  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"]);
5318
+ for (const c of charges) if (inMonth(c["datePurchased"], m)) total += chargeCost(c);
5319
+ for (const u of unitRows) if (unitIn(u, m)) total += num2(u["cost"]);
5202
5320
  return total;
5203
5321
  };
5204
5322
  const invoicesById = new Map(invoices.map((i) => [num2(i["id"]), i]));
5323
+ const billedServiceIn = (m) => {
5324
+ let billed = 0;
5325
+ const ids = [];
5326
+ for (const b of billingRows) {
5327
+ if (!inMonth(b["itemDate"], m) || billingLineType(b) !== "recurring") continue;
5328
+ const invId = num2(b["invoiceID"]);
5329
+ const inv = invId > 0 ? invoicesById.get(invId) : void 0;
5330
+ if (inv === void 0 || inv["isVoided"] === true) continue;
5331
+ billed += lineRevenue(b);
5332
+ ids.push(num2(b["id"]));
5333
+ }
5334
+ return { billed, ids };
5335
+ };
5336
+ const contractRateByRole = /* @__PURE__ */ new Map();
5337
+ for (const r of ratesRaw.items) {
5338
+ const rate = typeof r["internalCurrencyContractHourlyRate"] === "number" ? r["internalCurrencyContractHourlyRate"] : r["contractHourlyRate"];
5339
+ if (num2(r["roleID"]) > 0 && typeof rate === "number" && Number.isFinite(rate)) contractRateByRole.set(num2(r["roleID"]), rate);
5340
+ }
5341
+ const monthlyParts = [
5342
+ ["contractServiceUnits", unitsPart],
5343
+ ["contractCharges", chargesPart],
5344
+ ["contractRoleCosts", roleCostsPart],
5345
+ ["billingItems", billingItems],
5346
+ ["timeEntries", timeEntries],
5347
+ ["expenses", expensesPart],
5348
+ ["subscriptions", subscriptionsPart]
5349
+ ];
5350
+ const coverageGaps = (m) => {
5351
+ const gaps = [];
5352
+ for (const [name, p] of monthlyParts) {
5353
+ if (p.status === "absent") gaps.push(`${name}: absent (${p.absent})`);
5354
+ else if (truncatedMonths[name] !== void 0) {
5355
+ if (truncatedMonths[name].includes(m)) gaps.push(`${name}: truncated at limit ${v.limit}`);
5356
+ } else if (p.hasMore) gaps.push(`${name}: capped at limit ${v.limit}`);
5357
+ }
5358
+ return gaps;
5359
+ };
5205
5360
  const monthly = [];
5206
5361
  for (let mi = 0; mi < months.length; mi++) {
5207
5362
  const m = months[mi];
5208
5363
  const mBilling = billingRows.filter((b) => inMonth(b["itemDate"], m));
5209
5364
  let revenueInvoiced = 0;
5210
5365
  let revenueVoided = 0;
5211
- const billedItemIds = [];
5366
+ let postedUninvoiced = 0;
5367
+ const byType = { recurring: 0, labour: 0, charges: 0, expenses: 0, other: 0 };
5368
+ let unresolvedInvoice = 0;
5369
+ let unresolvedLines = 0;
5212
5370
  for (const b of mBilling) {
5213
5371
  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"]);
5372
+ if (invId <= 0) {
5373
+ postedUninvoiced += lineRevenue(b);
5374
+ continue;
5375
+ }
5376
+ const inv = invoicesById.get(invId);
5377
+ if (inv === void 0) {
5378
+ unresolvedInvoice += lineRevenue(b);
5379
+ unresolvedLines += 1;
5380
+ continue;
5381
+ }
5382
+ if (inv["isVoided"] === true) revenueVoided += lineRevenue(b);
5217
5383
  else {
5218
- revenueInvoiced += num2(b["extendedPrice"]);
5219
- billedItemIds.push(num2(b["id"]));
5384
+ revenueInvoiced += lineRevenue(b);
5385
+ byType[billingLineType(b)] += lineRevenue(b);
5220
5386
  }
5221
5387
  }
5222
5388
  const expected = v.includeUnbilledRevenue && expectedBasis ? expectedIn(m) : null;
5223
- const expectedUnbilled = expected === null ? 0 : Math.max(0, expected - revenueInvoiced);
5389
+ const expectedUnbilled = expected === null ? 0 : Math.max(0, expected - billedServiceIn(m).billed);
5224
5390
  const mEntries = entries.filter((e) => inMonth(e["dateWorked"], m));
5225
5391
  let labourHours = 0;
5226
5392
  let labourTotal = 0;
@@ -5230,7 +5396,7 @@ async function profitability(resource, contractId, opts, http) {
5230
5396
  rateSources.missing = { entries: 0, hours: 0, cost: 0 };
5231
5397
  for (const e of mEntries) {
5232
5398
  const r = entryResolution.get(num2(e["id"]));
5233
- labourHours += num2(e["hoursWorked"]);
5399
+ labourHours += hoursOf(e);
5234
5400
  const bucket = rateSources[r.source];
5235
5401
  bucket.entries += 1;
5236
5402
  bucket.hours += hoursOf(e);
@@ -5238,39 +5404,71 @@ async function profitability(resource, contractId, opts, http) {
5238
5404
  if (r.source === "missing") unresolved += hoursOf(e);
5239
5405
  else labourTotal += _nullishCoalesce(r.cost, () => ( 0));
5240
5406
  }
5241
- let toolingVendor = subscriptionsPart.status === "skipped" ? null : 0;
5407
+ const unposted = mEntries.filter((e) => e["isNonBillable"] !== true && !billedByEntryId.has(num2(e["id"])));
5408
+ const hoursMissing = unposted.some((e) => typeof e["hoursToBill"] !== "number" || !Number.isFinite(e["hoursToBill"]));
5409
+ const hoursPart = hoursMissing ? { entries: unposted.length, hours: null, hoursAbsent: "HOURS_TO_BILL_MISSING" } : { entries: unposted.length, hours: unposted.reduce((a, e) => a + Math.max(0, num2(e["hoursToBill"])), 0) };
5410
+ let unpostedTime;
5411
+ if (!contractTypeKnown) {
5412
+ unpostedTime = { ...hoursPart, value: null, absent: "CONTRACT_TYPE_UNKNOWN" };
5413
+ } else if (!isTimeAndMaterials) {
5414
+ unpostedTime = { ...hoursPart, value: null, absent: "NOT_TIME_AND_MATERIALS_CONTRACT" };
5415
+ } else if (unposted.some((e) => !contractRateByRole.has(num2(e["roleID"])))) {
5416
+ unpostedTime = { ...hoursPart, value: null, absent: "NO_CONTRACT_RATE" };
5417
+ } else if (hoursMissing) {
5418
+ unpostedTime = { ...hoursPart, value: null, absent: "HOURS_TO_BILL_MISSING" };
5419
+ } else {
5420
+ const value = unposted.reduce((a, e) => a + Math.max(0, num2(e["hoursToBill"])) * contractRateByRole.get(num2(e["roleID"])), 0);
5421
+ unpostedTime = { ...hoursPart, value };
5422
+ }
5423
+ let toolingVendor = subscriptionsPart.status === "skipped" || subscriptionsPart.status === "absent" ? null : 0;
5242
5424
  if (toolingVendor !== null) {
5243
5425
  for (const s of subscriptions) {
5244
5426
  const eff = _nullishCoalesce(monthOf(s["effectiveDate"]), () => ( "0000-00"));
5245
5427
  const exp = _nullishCoalesce(monthOf(s["expirationDate"]), () => ( "9999-99"));
5246
- if (eff <= m && m <= exp) toolingVendor += num2(s["periodCost"]);
5428
+ const sid = num2(s["id"]);
5429
+ if (cancelledSubs.has(sid)) continue;
5430
+ if (oneTimeSubs.has(sid)) {
5431
+ if (eff === m) toolingVendor += num2(s["periodCost"]);
5432
+ continue;
5433
+ }
5434
+ const factor = _nullishCoalesce(subFactor.get(sid), () => ( null));
5435
+ if (factor !== null && eff <= m && m <= exp) toolingVendor += num2(s["periodCost"]) * factor;
5247
5436
  }
5248
5437
  }
5249
5438
  const callerSupplied = _nullishCoalesce(v.externalMonthlyCosts[mi], () => ( 0));
5250
5439
  const recurring = recurringIn(m);
5251
5440
  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;
5441
+ for (const x of expenses) if (inMonth(x["expenseDate"], m)) expenseCost += num2(x["internalCurrencyExpenseAmount"]);
5442
+ const totalCost = labourTotal + callerSupplied + recurring + expenseCost;
5254
5443
  const profit = revenueInvoiced - totalCost;
5255
5444
  const margin = revenueInvoiced > 0 ? profit / revenueInvoiced : null;
5256
- const fixed = totalCost - labourTotal;
5445
+ const nonLabour = totalCost - labourTotal;
5257
5446
  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;
5447
+ const avgRate = resolvedHours > 0 ? labourTotal / resolvedHours : 0;
5448
+ const breakEven = avgRate > 0 ? Math.max(0, (revenueInvoiced - nonLabour) / avgRate) : null;
5449
+ for (const b of Object.values(rateSources)) b.cost = cents(b.cost);
5450
+ const gaps = coverageGaps(m);
5451
+ if (unresolvedLines > 0) gaps.push(`invoices: ${unresolvedLines} line(s) on unresolved invoices`);
5259
5452
  monthly.push({
5260
5453
  month: m,
5261
- revenue_invoiced: revenueInvoiced,
5262
- revenue_voided_excluded: revenueVoided,
5263
- revenue_expected: expected,
5264
- revenue_expected_unbilled: expectedUnbilled,
5454
+ revenue_invoiced: cents(revenueInvoiced),
5455
+ revenue_by_type: { recurring: cents(byType.recurring), labour: cents(byType.labour), charges: cents(byType.charges), expenses: cents(byType.expenses), other: cents(byType.other) },
5456
+ revenue_voided_excluded: cents(revenueVoided),
5457
+ revenue_posted_uninvoiced: cents(postedUninvoiced),
5458
+ revenue_unresolved_invoice: cents(unresolvedInvoice),
5459
+ revenue_expected: cents(expected),
5460
+ revenue_expected_unbilled: cents(expectedUnbilled),
5461
+ unposted_time: { ...unpostedTime, value: cents(unpostedTime.value) },
5265
5462
  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,
5463
+ labour_cost: { total: cents(labourTotal), unresolvedHours: unresolved, rateSources },
5464
+ tooling_cost: { vendor: cents(toolingVendor), caller_supplied: cents(callerSupplied) },
5465
+ recurring_cost: cents(recurring),
5466
+ expense_cost: cents(expenseCost),
5467
+ total_cost: cents(totalCost),
5468
+ profit: cents(profit),
5272
5469
  margin,
5273
- break_even_hours: breakEven
5470
+ break_even_hours: breakEven,
5471
+ coverage_gaps: gaps
5274
5472
  });
5275
5473
  }
5276
5474
  const warnings = [];
@@ -5334,13 +5532,13 @@ async function profitability(resource, contractId, opts, http) {
5334
5532
  const mA = months[i - 1];
5335
5533
  const mB = months[i];
5336
5534
  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;
5535
+ const cA = inMonth(c["datePurchased"], mA) ? chargeCost(c) : 0;
5536
+ const cB = inMonth(c["datePurchased"], mB) ? chargeCost(c) : 0;
5339
5537
  if (Math.abs(cB - cA) > 0) driftIds.add(num2(c["id"]));
5340
5538
  }
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;
5539
+ for (const u of unitRows) {
5540
+ const cA = unitIn(u, mA) ? num2(u["cost"]) : 0;
5541
+ const cB = unitIn(u, mB) ? num2(u["cost"]) : 0;
5344
5542
  if (Math.abs(cB - cA) > 0) driftIds.add(num2(u["id"]));
5345
5543
  }
5346
5544
  }
@@ -5348,22 +5546,10 @@ async function profitability(resource, contractId, opts, http) {
5348
5546
  warnings.push({ code: "recurring_cost_drift", count: driftCount, sample_ids: dedupeSortCap([...driftIds], v.limit) });
5349
5547
  let expectedUnbilledCount = 0;
5350
5548
  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) {
5549
+ if (v.includeUnbilledRevenue && expectedBasis) {
5550
+ for (const m of months) {
5551
+ const { billed, ids } = billedServiceIn(m);
5552
+ if (expectedIn(m) > billed + 5e-3) {
5367
5553
  expectedUnbilledCount += 1;
5368
5554
  for (const i of ids) expectedUnbilledSamples.push(i);
5369
5555
  }
@@ -5379,7 +5565,7 @@ async function profitability(resource, contractId, opts, http) {
5379
5565
  });
5380
5566
  const stale = [];
5381
5567
  if (openStatusSet !== null) {
5382
- for (const t of fetchedTickets.values()) {
5568
+ for (const t of contractTickets) {
5383
5569
  const status = t["status"];
5384
5570
  if (typeof status !== "number" || !openStatusSet.has(status)) continue;
5385
5571
  const lastDay = dateToDay(t["lastActivityDate"]);
@@ -5431,7 +5617,7 @@ async function profitability(resource, contractId, opts, http) {
5431
5617
  for (const x of expenses) {
5432
5618
  const t = num2(x["ticketID"]);
5433
5619
  if (t <= 0) continue;
5434
- expenseByTicket.set(t, (_nullishCoalesce(expenseByTicket.get(t), () => ( 0))) + num2(x["expenseCurrencyExpenseAmount"]));
5620
+ expenseByTicket.set(t, (_nullishCoalesce(expenseByTicket.get(t), () => ( 0))) + num2(x["internalCurrencyExpenseAmount"]));
5435
5621
  }
5436
5622
  const ticketCost = (t) => {
5437
5623
  const tid = num2(t["id"]);
@@ -5440,7 +5626,7 @@ async function profitability(resource, contractId, opts, http) {
5440
5626
  for (const e of es) cost += _nullishCoalesce(entryResolution.get(num2(e["id"])).cost, () => ( 0));
5441
5627
  return cost;
5442
5628
  };
5443
- const ticketHours = (t) => (_nullishCoalesce(entriesByTicket.get(num2(t["id"])), () => ( []))).reduce((a, e) => a + num2(e["hoursWorked"]), 0);
5629
+ const ticketHours = (t) => (_nullishCoalesce(entriesByTicket.get(num2(t["id"])), () => ( []))).reduce((a, e) => a + hoursOf(e), 0);
5444
5630
  const allTickets = [...fetchedTickets.values()];
5445
5631
  const activityCategories = [];
5446
5632
  if (v.groupByActivity) {
@@ -5458,7 +5644,7 @@ async function profitability(resource, contractId, opts, http) {
5458
5644
  for (const t of tickets) {
5459
5645
  const es = _nullishCoalesce(entriesByTicket.get(num2(t["id"])), () => ( []));
5460
5646
  entryCount += es.length;
5461
- hours += es.reduce((a, e) => a + num2(e["hoursWorked"]), 0);
5647
+ hours += es.reduce((a, e) => a + hoursOf(e), 0);
5462
5648
  cost += ticketCost(t);
5463
5649
  }
5464
5650
  activityCategories.push({
@@ -5466,7 +5652,7 @@ async function profitability(resource, contractId, opts, http) {
5466
5652
  ticketCount: tickets.length,
5467
5653
  entryCount,
5468
5654
  hours,
5469
- cost,
5655
+ cost: cents(cost),
5470
5656
  sample_ticketNumbers: dedupeSortCap(tickets.map((t) => num2(t["ticketNumber"])).filter((n) => n > 0), v.limit)
5471
5657
  });
5472
5658
  }
@@ -5478,7 +5664,7 @@ async function profitability(resource, contractId, opts, http) {
5478
5664
  title: typeof t["title"] === "string" ? t["title"] : "",
5479
5665
  status: typeof t["status"] === "number" ? t["status"] : null,
5480
5666
  hours: ticketHours(t),
5481
- cost: ticketCost(t),
5667
+ cost: cents(ticketCost(t)),
5482
5668
  lastActivityDate: typeof t["lastActivityDate"] === "string" ? t["lastActivityDate"] : null
5483
5669
  })).sort((a, b) => b.cost - a.cost || a.ticketId - b.ticketId).slice(0, v.limit);
5484
5670
  const miscoding = /* @__PURE__ */ new Map();
@@ -5494,7 +5680,7 @@ async function profitability(resource, contractId, opts, http) {
5494
5680
  const possibleMiscoding = [...miscoding.values()].sort((a, b) => a.entryId - b.entryId).slice(0, v.limit);
5495
5681
  const openRenewal = [];
5496
5682
  if (openStatusSet !== null) {
5497
- for (const t of allTickets) {
5683
+ for (const t of contractTickets) {
5498
5684
  const status = t["status"];
5499
5685
  if (typeof status !== "number" || !openStatusSet.has(status)) continue;
5500
5686
  const last = t["lastActivityDate"];
@@ -5515,7 +5701,7 @@ async function profitability(resource, contractId, opts, http) {
5515
5701
  id: num2(s["id"]),
5516
5702
  label: typeof s["subscriptionName"] === "string" && s["subscriptionName"] !== "" ? s["subscriptionName"] : `subscription ${num2(s["id"])}`,
5517
5703
  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"]))})`
5704
+ detail: `periodType: ${typeof s["periodType"] === "number" ? s["periodType"] : "unknown"} (period cost ${fmtNum(num2(s["periodCost"]))}${cancelledSubs.has(num2(s["id"])) ? " \u2014 not active, not in tooling_cost.vendor" : oneTimeSubs.has(num2(s["id"])) ? " \u2014 one-time, booked in its effective month" : subFactor.get(num2(s["id"])) == null ? " \u2014 unrecognised period, not in tooling_cost.vendor" : `, ${fmtNum(num2(s["periodCost"]) * subFactor.get(num2(s["id"])))}/month`})`
5519
5705
  });
5520
5706
  }
5521
5707
  const contractEndDay = dateToDay(contractRow["endDate"]);
@@ -5528,31 +5714,37 @@ async function profitability(resource, contractId, opts, http) {
5528
5714
  detail: `the contract ends ${String(contractRow["endDate"]).slice(0, 10)}`
5529
5715
  });
5530
5716
  }
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();
5717
+ const blocks = blocksPart.items;
5718
+ for (const b of blocks) {
5719
+ const purchased = num2(b["hours"]);
5720
+ const approved = num2(b["hoursApproved"]);
5721
+ const left = purchased - approved;
5541
5722
  openRenewal.push({
5542
5723
  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`})`
5724
+ id: num2(b["id"]),
5725
+ label: `hour block ${num2(b["id"])}`,
5726
+ date: typeof b["endDate"] === "string" ? b["endDate"].slice(0, 10) : null,
5727
+ detail: `${fmtHours(approved)} h approved of ${fmtHours(purchased)} h purchased (${left >= 0 ? `${fmtHours(left)} h left` : `${fmtHours(Math.abs(left))} h over`})`
5547
5728
  });
5548
5729
  }
5730
+ const purchasedHours = blocks.reduce((a, b) => a + num2(b["hours"]), 0);
5731
+ const approvedHours = blocks.reduce((a, b) => a + num2(b["hoursApproved"]), 0);
5732
+ const includedHours = !contractTypeKnown ? { value: null, absent: "CONTRACT_TYPE_UNKNOWN" } : !isBlockHours ? { value: null, absent: "NOT_BLOCK_HOURS_CONTRACT" } : blocksPart.status === "absent" ? { value: null, absent: blocksPart.absent } : { value: { purchased: purchasedHours, approved: approvedHours, remaining: purchasedHours - approvedHours } };
5733
+ const rows = (part) => {
5734
+ if (v.includeRows) return part;
5735
+ const { items, ...stamps } = part;
5736
+ return { ...stamps, rows_fetched: items.length };
5737
+ };
5549
5738
  return {
5550
5739
  contract,
5551
5740
  customer,
5741
+ ...customerAbsent !== void 0 ? { customerAbsent } : {},
5742
+ contract_type: contractTypeKnown ? { id: contractType, label: contractTypeLabel } : { id: contractType > 0 ? contractType : null, label: null, absent: "CONTRACT_TYPE_UNKNOWN" },
5743
+ included_hours: includedHours,
5552
5744
  period: { dateFrom: v.dateFrom, dateTo: v.dateTo, months, asOf },
5553
5745
  currency: {
5554
5746
  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)"
5747
+ note: "single-currency P&L in the INTERNAL currency: revenue is billing items internalCurrencyExtendedPrice and service units internalCurrencyPrice (each falling back to the local field when absent), unposted value the internalCurrencyContractHourlyRate; costs are internal (ourCost/role cost/internalCost, charge extendedCost, unit cost, internalCurrencyExpenseAmount). companyCurrencyID is the customer context stamp only"
5556
5748
  },
5557
5749
  monthly,
5558
5750
  activity_categories: activityCategories,
@@ -5569,6 +5761,7 @@ async function profitability(resource, contractId, opts, http) {
5569
5761
  contractCharges: chargesPart.status,
5570
5762
  contractRoleCosts: roleCostsPart.status,
5571
5763
  contractRates: ratesPart.status,
5764
+ contractBlocks: blocksPart.status,
5572
5765
  billingItems: billingItems.status,
5573
5766
  invoices: invoicesPart.status,
5574
5767
  timeEntries: timeEntries.status,
@@ -5580,27 +5773,28 @@ async function profitability(resource, contractId, opts, http) {
5580
5773
  configurationItems: configurationItemsPart.status,
5581
5774
  subscriptions: subscriptionsPart.status
5582
5775
  },
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 }
5776
+ contractServices: rows(servicesPart),
5777
+ contractServiceUnits: rows(unitsPart),
5778
+ contractCharges: rows(chargesPart),
5779
+ contractRoleCosts: rows(roleCostsPart),
5780
+ contractRates: rows(ratesPart),
5781
+ contractBlocks: rows(blocksPart),
5782
+ billingItems: rows(billingItems),
5783
+ invoices: rows(invoicesPart),
5784
+ timeEntries: rows(timeEntries),
5785
+ ticketsActivity: rows(ticketsActivityPart),
5786
+ ticketsOpen: rows(ticketsOpenPart),
5787
+ resources: rows(resourcesPart),
5788
+ expenses: rows(expensesPart),
5789
+ miscodingProbe: rows(probePart),
5790
+ configurationItems: rows(configurationItemsPart),
5791
+ subscriptions: rows(subscriptionsPart),
5792
+ wires: { issued: wires.issued, requests: wires.requests, budget: wires.budget, note: wires.note }
5599
5793
  };
5600
5794
  }
5601
5795
 
5602
5796
  // src/resources/contracts.ts
5603
- var ContractsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5797
+ var ContractsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5604
5798
  constructor(http, pageSize) {
5605
5799
  super(http, {
5606
5800
  key: "contracts",
@@ -5671,7 +5865,7 @@ var ContractsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5671
5865
  };
5672
5866
 
5673
5867
  // src/resources/contract_ticket_purchases.ts
5674
- var ContractTicketPurchasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5868
+ var ContractTicketPurchasesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5675
5869
  constructor(http, pageSize) {
5676
5870
  super(http, {
5677
5871
  key: "contract_ticket_purchases",
@@ -5730,7 +5924,7 @@ var ContractTicketPurchasesResource = class extends _chunk5N6DYKXOcjs.BaseResour
5730
5924
  };
5731
5925
 
5732
5926
  // src/resources/countries.ts
5733
- var CountriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5927
+ var CountriesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5734
5928
  constructor(http, pageSize) {
5735
5929
  super(http, {
5736
5930
  key: "countries",
@@ -5789,7 +5983,7 @@ var CountriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5789
5983
  };
5790
5984
 
5791
5985
  // src/resources/departments.ts
5792
- var DepartmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5986
+ var DepartmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5793
5987
  constructor(http, pageSize) {
5794
5988
  super(http, {
5795
5989
  key: "departments",
@@ -5856,7 +6050,7 @@ var DepartmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
5856
6050
  };
5857
6051
 
5858
6052
  // src/resources/domain_registrars.ts
5859
- var DomainRegistrarsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6053
+ var DomainRegistrarsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5860
6054
  constructor(http, pageSize) {
5861
6055
  super(http, {
5862
6056
  key: "domain_registrars",
@@ -5939,7 +6133,7 @@ var EntityInformationResource = class {
5939
6133
  };
5940
6134
 
5941
6135
  // src/resources/expense_item_attachments.ts
5942
- var ExpenseItemAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6136
+ var ExpenseItemAttachmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
5943
6137
  constructor(http, pageSize) {
5944
6138
  super(http, {
5945
6139
  key: "expense_item_attachments",
@@ -6001,7 +6195,7 @@ var ExpenseItemAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResourc
6001
6195
  };
6002
6196
 
6003
6197
  // src/resources/expense_items.ts
6004
- var ExpenseItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6198
+ var ExpenseItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6005
6199
  constructor(http, pageSize) {
6006
6200
  super(http, {
6007
6201
  key: "expense_items",
@@ -6060,7 +6254,7 @@ var ExpenseItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6060
6254
  };
6061
6255
 
6062
6256
  // src/resources/expense_reports.ts
6063
- var ExpenseReportsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6257
+ var ExpenseReportsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6064
6258
  constructor(http, pageSize) {
6065
6259
  super(http, {
6066
6260
  key: "expense_reports",
@@ -6127,7 +6321,7 @@ var ExpenseReportsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6127
6321
  };
6128
6322
 
6129
6323
  // src/resources/holiday_sets.ts
6130
- var HolidaySetsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6324
+ var HolidaySetsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6131
6325
  constructor(http, pageSize) {
6132
6326
  super(http, {
6133
6327
  key: "holiday_sets",
@@ -6196,7 +6390,7 @@ var HolidaySetsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6196
6390
  };
6197
6391
 
6198
6392
  // src/resources/holidays.ts
6199
- var HolidaysResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6393
+ var HolidaysResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6200
6394
  constructor(http, pageSize) {
6201
6395
  super(http, {
6202
6396
  key: "holidays",
@@ -6268,10 +6462,10 @@ var PATH_SUFFIX = {
6268
6462
  transfer: "StockedItemsTransfer"
6269
6463
  };
6270
6464
  async function stockedItems(_resource, kind, parentId, data, opts = {}, http) {
6271
- const numericParent = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, parentId, "parentId");
6465
+ const numericParent = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, parentId, "parentId");
6272
6466
  const suffix = PATH_SUFFIX[kind];
6273
6467
  if (opts.dryRun === true) {
6274
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
6468
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
6275
6469
  operation: `inventory_products.stockedItems${suffix.slice("StockedItems".length)}`,
6276
6470
  method: "POST",
6277
6471
  path: `/V1.0/InventoryProducts/${numericParent}/${suffix}`,
@@ -6287,11 +6481,11 @@ async function stockedItems(_resource, kind, parentId, data, opts = {}, http) {
6287
6481
  body: data,
6288
6482
  operation: `inventory_products.stockedItems${suffix.slice("StockedItems".length)}`
6289
6483
  });
6290
- return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
6484
+ return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
6291
6485
  }
6292
6486
 
6293
6487
  // src/resources/inventory_products.ts
6294
- var InventoryProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6488
+ var InventoryProductsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6295
6489
  constructor(http, pageSize) {
6296
6490
  super(http, {
6297
6491
  key: "inventory_products",
@@ -6373,7 +6567,7 @@ var InventoryProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6373
6567
 
6374
6568
  // src/resources/special/invoices.ts
6375
6569
  async function markup(_resource, id, format, http) {
6376
- const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
6570
+ const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
6377
6571
  const suffix = format === "html" ? "InvoiceMarkupHtml" : "InvoiceMarkupXml";
6378
6572
  const res = await http.request({
6379
6573
  method: "GET",
@@ -6382,7 +6576,7 @@ async function markup(_resource, id, format, http) {
6382
6576
  });
6383
6577
  const body = res;
6384
6578
  if (body === null || typeof body !== "object" || typeof body.invoiceMarkup !== "string") {
6385
- throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(
6579
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskError)(
6386
6580
  `Expected the InvoiceMarkupResultModel envelope { invoiceMarkup: string } for invoice ${numericId}; got a different shape`,
6387
6581
  { code: "INVALID_RESPONSE", category: "server", resourceIds: [numericId] }
6388
6582
  );
@@ -6390,44 +6584,44 @@ async function markup(_resource, id, format, http) {
6390
6584
  return body.invoiceMarkup;
6391
6585
  }
6392
6586
  async function pdf(_resource, id, http) {
6393
- const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
6587
+ const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
6394
6588
  const res = await http.request({
6395
6589
  method: "GET",
6396
6590
  path: `/V1.0/Invoices/${numericId}/InvoicePdf`,
6397
6591
  operation: "invoices.pdf"
6398
6592
  });
6399
- return _chunk5N6DYKXOcjs.decodeFileData.call(void 0, res);
6593
+ return _chunkKB2ANVVRcjs.decodeFileData.call(void 0, res);
6400
6594
  }
6401
6595
  async function windowQuery2(_resource, kind, http, opts) {
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}`);
6596
+ const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _46 => _46.now]), () => ( /* @__PURE__ */ new Date()));
6597
+ const tz = _optionalChain([opts, 'optionalAccess', _47 => _47.tz]) === void 0 ? void 0 : validateZone(opts.tz, `invoices.${kind}`);
6404
6598
  return dateWindowQuery(
6405
6599
  http,
6406
6600
  "/V1.0/Invoices/query",
6407
6601
  "invoiceDateTime",
6408
6602
  kind,
6409
- clampWindowLimit(_optionalChain([opts, 'optionalAccess', _37 => _37.limit])),
6603
+ clampWindowLimit(_optionalChain([opts, 'optionalAccess', _48 => _48.limit])),
6410
6604
  `invoices.${kind}`,
6411
6605
  now,
6412
6606
  tz
6413
6607
  );
6414
6608
  }
6415
6609
  async function customRange2(_resource, from, to, http, opts) {
6416
- const zone = _optionalChain([opts, 'optionalAccess', _38 => _38.tz]) === void 0 ? void 0 : validateZone(opts.tz, "invoices.customRange");
6610
+ const zone = _optionalChain([opts, 'optionalAccess', _49 => _49.tz]) === void 0 ? void 0 : validateZone(opts.tz, "invoices.customRange");
6417
6611
  return customRangeQuery(
6418
6612
  http,
6419
6613
  "/V1.0/Invoices/query",
6420
6614
  "invoiceDateTime",
6421
6615
  from,
6422
6616
  to,
6423
- clampWindowLimit(_optionalChain([opts, 'optionalAccess', _39 => _39.limit])),
6617
+ clampWindowLimit(_optionalChain([opts, 'optionalAccess', _50 => _50.limit])),
6424
6618
  "invoices.customRange",
6425
6619
  zone
6426
6620
  );
6427
6621
  }
6428
6622
 
6429
6623
  // src/resources/invoices.ts
6430
- var InvoicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6624
+ var InvoicesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6431
6625
  constructor(http, pageSize) {
6432
6626
  super(http, {
6433
6627
  key: "invoices",
@@ -6557,7 +6751,7 @@ var ModulesResource = class {
6557
6751
  };
6558
6752
 
6559
6753
  // src/resources/notification_history.ts
6560
- var NotificationHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6754
+ var NotificationHistoryResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6561
6755
  constructor(http, pageSize) {
6562
6756
  super(http, {
6563
6757
  key: "notification_history",
@@ -6596,7 +6790,7 @@ var NotificationHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6596
6790
  };
6597
6791
 
6598
6792
  // src/resources/opportunities.ts
6599
- var OpportunitiesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6793
+ var OpportunitiesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6600
6794
  constructor(http, pageSize) {
6601
6795
  super(http, {
6602
6796
  key: "opportunities",
@@ -6658,7 +6852,7 @@ var OpportunitiesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6658
6852
  };
6659
6853
 
6660
6854
  // src/resources/opportunity_attachments.ts
6661
- var OpportunityAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6855
+ var OpportunityAttachmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6662
6856
  constructor(http, pageSize) {
6663
6857
  super(http, {
6664
6858
  key: "opportunity_attachments",
@@ -6720,7 +6914,7 @@ var OpportunityAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResourc
6720
6914
  };
6721
6915
 
6722
6916
  // src/resources/opportunity_categories.ts
6723
- var OpportunityCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6917
+ var OpportunityCategoriesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6724
6918
  constructor(http, pageSize) {
6725
6919
  super(http, {
6726
6920
  key: "opportunity_categories",
@@ -6779,7 +6973,7 @@ var OpportunityCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource
6779
6973
  };
6780
6974
 
6781
6975
  // src/resources/phases.ts
6782
- var PhasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6976
+ var PhasesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6783
6977
  constructor(http, pageSize) {
6784
6978
  super(http, {
6785
6979
  key: "phases",
@@ -6838,7 +7032,7 @@ var PhasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6838
7032
  };
6839
7033
 
6840
7034
  // src/resources/products.ts
6841
- var ProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7035
+ var ProductsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6842
7036
  constructor(http, pageSize) {
6843
7037
  super(http, {
6844
7038
  key: "products",
@@ -6905,7 +7099,7 @@ var ProductsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6905
7099
  };
6906
7100
 
6907
7101
  // src/resources/product_vendors.ts
6908
- var ProductVendorsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7102
+ var ProductVendorsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6909
7103
  constructor(http, pageSize) {
6910
7104
  super(http, {
6911
7105
  key: "product_vendors",
@@ -6964,7 +7158,7 @@ var ProductVendorsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
6964
7158
  };
6965
7159
 
6966
7160
  // src/resources/project_charges.ts
6967
- var ProjectChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7161
+ var ProjectChargesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
6968
7162
  constructor(http, pageSize) {
6969
7163
  super(http, {
6970
7164
  key: "project_charges",
@@ -7035,7 +7229,7 @@ var ProjectChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7035
7229
  };
7036
7230
 
7037
7231
  // src/resources/project_notes.ts
7038
- var ProjectNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7232
+ var ProjectNotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7039
7233
  constructor(http, pageSize) {
7040
7234
  super(http, {
7041
7235
  key: "project_notes",
@@ -7094,7 +7288,7 @@ var ProjectNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7094
7288
  };
7095
7289
 
7096
7290
  // src/resources/projects.ts
7097
- var ProjectsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7291
+ var ProjectsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7098
7292
  constructor(http, pageSize) {
7099
7293
  super(http, {
7100
7294
  key: "projects",
@@ -7171,13 +7365,13 @@ var ProjectsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7171
7365
  const leadResource = await this.contextFetch("/V1.0/Resources", root["projectLeadResourceID"]);
7172
7366
  const result = { project, company, opportunity, leadResource };
7173
7367
  if (opts.names === true) {
7174
- const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, );
7368
+ const builder = _chunkKB2ANVVRcjs.createNamePlan.call(void 0, );
7175
7369
  builder.addResource(root["creatorResourceID"]);
7176
7370
  builder.addFk("contract", root["contractID"]);
7177
- const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, this.http, builder.plan(), { maxNameReads: opts.maxNameReads });
7371
+ const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, this.http, builder.plan(), { maxNameReads: opts.maxNameReads });
7178
7372
  const row = { ...project };
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));
7373
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "creatorResourceID", (v) => names.resourceName(v));
7374
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
7181
7375
  result.project = row;
7182
7376
  result.names = names.section;
7183
7377
  }
@@ -7186,7 +7380,7 @@ var ProjectsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7186
7380
  };
7187
7381
 
7188
7382
  // src/resources/purchase_approvals.ts
7189
- var PurchaseApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7383
+ var PurchaseApprovalsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7190
7384
  constructor(http, pageSize) {
7191
7385
  super(http, {
7192
7386
  key: "purchase_approvals",
@@ -7240,7 +7434,7 @@ var PurchaseApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7240
7434
  };
7241
7435
 
7242
7436
  // src/resources/purchase_order_item_receiving.ts
7243
- var PurchaseOrderItemReceivingResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7437
+ var PurchaseOrderItemReceivingResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7244
7438
  constructor(http, pageSize) {
7245
7439
  super(http, {
7246
7440
  key: "purchase_order_item_receiving",
@@ -7290,7 +7484,7 @@ var PurchaseOrderItemReceivingResource = class extends _chunk5N6DYKXOcjs.BaseRes
7290
7484
  };
7291
7485
 
7292
7486
  // src/resources/purchase_order_items.ts
7293
- var PurchaseOrderItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7487
+ var PurchaseOrderItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7294
7488
  constructor(http, pageSize) {
7295
7489
  super(http, {
7296
7490
  key: "purchase_order_items",
@@ -7349,7 +7543,7 @@ var PurchaseOrderItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7349
7543
  };
7350
7544
 
7351
7545
  // src/resources/purchase_orders.ts
7352
- var PurchaseOrdersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7546
+ var PurchaseOrdersResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7353
7547
  constructor(http, pageSize) {
7354
7548
  super(http, {
7355
7549
  key: "purchase_orders",
@@ -7411,7 +7605,7 @@ var PurchaseOrdersResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7411
7605
  };
7412
7606
 
7413
7607
  // src/resources/quote_items.ts
7414
- var QuoteItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7608
+ var QuoteItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7415
7609
  constructor(http, pageSize) {
7416
7610
  super(http, {
7417
7611
  key: "quote_items",
@@ -7482,7 +7676,7 @@ var QuoteItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7482
7676
  };
7483
7677
 
7484
7678
  // src/resources/quote_locations.ts
7485
- var QuoteLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7679
+ var QuoteLocationsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7486
7680
  constructor(http, pageSize) {
7487
7681
  super(http, {
7488
7682
  key: "quote_locations",
@@ -7547,7 +7741,7 @@ var QuoteLocationsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7547
7741
  };
7548
7742
 
7549
7743
  // src/resources/quotes.ts
7550
- var QuotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7744
+ var QuotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7551
7745
  constructor(http, pageSize) {
7552
7746
  super(http, {
7553
7747
  key: "quotes",
@@ -7614,7 +7808,7 @@ var QuotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7614
7808
  };
7615
7809
 
7616
7810
  // src/resources/quote_templates.ts
7617
- var QuoteTemplatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7811
+ var QuoteTemplatesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7618
7812
  constructor(http, pageSize) {
7619
7813
  super(http, {
7620
7814
  key: "quote_templates",
@@ -7658,7 +7852,7 @@ var QuoteTemplatesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7658
7852
  };
7659
7853
 
7660
7854
  // src/resources/resource_role_queues.ts
7661
- var ResourceRoleQueuesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7855
+ var ResourceRoleQueuesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7662
7856
  constructor(http, pageSize) {
7663
7857
  super(http, {
7664
7858
  key: "resource_role_queues",
@@ -7717,7 +7911,7 @@ var ResourceRoleQueuesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7717
7911
  };
7718
7912
 
7719
7913
  // src/resources/resource_roles.ts
7720
- var ResourceRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7914
+ var ResourceRolesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7721
7915
  constructor(http, pageSize) {
7722
7916
  super(http, {
7723
7917
  key: "resource_roles",
@@ -7759,7 +7953,7 @@ var ResourceRolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7759
7953
  };
7760
7954
 
7761
7955
  // src/resources/resource_skills.ts
7762
- var ResourceSkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7956
+ var ResourceSkillsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7763
7957
  constructor(http, pageSize) {
7764
7958
  super(http, {
7765
7959
  key: "resource_skills",
@@ -7813,16 +8007,16 @@ var ResourceSkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7813
8007
  var MAX_TRANSFER_IDS = 500;
7814
8008
  function requirePositiveIds(ids, label) {
7815
8009
  if (!Array.isArray(ids) || ids.length === 0) {
7816
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: at least one positive integer id is required`);
8010
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`${label}: at least one positive integer id is required`);
7817
8011
  }
7818
8012
  if (ids.length > MAX_TRANSFER_IDS) {
7819
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: at most ${MAX_TRANSFER_IDS} ids are accepted (bounded fan-out)`);
8013
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`${label}: at most ${MAX_TRANSFER_IDS} ids are accepted (bounded fan-out)`);
7820
8014
  }
7821
8015
  const out = [];
7822
8016
  for (const raw of ids) {
7823
- const id = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, raw, `${label} id`);
8017
+ const id = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, raw, `${label} id`);
7824
8018
  if (typeof id === "number" && id < 1) {
7825
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${label}: every id must be a positive integer (got ${String(raw)})`);
8019
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`${label}: every id must be a positive integer (got ${String(raw)})`);
7826
8020
  }
7827
8021
  out.push(id);
7828
8022
  }
@@ -7830,7 +8024,7 @@ function requirePositiveIds(ids, label) {
7830
8024
  }
7831
8025
  async function whoAmI(_resource, userName, http) {
7832
8026
  const user = userName.trim();
7833
- if (user === "") throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("whoAmI: the configured UserName is empty");
8027
+ if (user === "") throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("whoAmI: the configured UserName is empty");
7834
8028
  const value = user.includes("@") ? _nullishCoalesce(user.split("@")[0], () => ( "")) : user;
7835
8029
  const res = await http.request({
7836
8030
  method: "POST",
@@ -7839,11 +8033,11 @@ async function whoAmI(_resource, userName, http) {
7839
8033
  body: { MaxRecords: 2, filter: [{ field: "userName", op: "eq", value }] },
7840
8034
  operation: "resources.whoAmI"
7841
8035
  });
7842
- const matches = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
8036
+ const matches = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
7843
8037
  if (matches.length === 0) return null;
7844
8038
  if (matches.length > 1) {
7845
8039
  const ids = matches.map((m) => m.id).filter((id) => typeof id === "number");
7846
- throw new (0, _chunk5N6DYKXOcjs.ResolutionError)(
8040
+ throw new (0, _chunkKB2ANVVRcjs.ResolutionError)(
7847
8041
  `whoAmI: "${value}" is ambiguous (matched ${matches.length} resources)`,
7848
8042
  { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids }
7849
8043
  );
@@ -7852,11 +8046,11 @@ async function whoAmI(_resource, userName, http) {
7852
8046
  }
7853
8047
  async function transferOwnership(_resource, companyIds, destinationResourceId, http, opts) {
7854
8048
  const ids = requirePositiveIds(companyIds, "transferOwnership");
7855
- const destination = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, destinationResourceId, "destinationResourceId");
8049
+ const destination = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, destinationResourceId, "destinationResourceId");
7856
8050
  if (typeof destination === "number" && destination < 1) {
7857
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("transferOwnership: destinationResourceId must be a positive integer");
8051
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("transferOwnership: destinationResourceId must be a positive integer");
7858
8052
  }
7859
- const dryRun = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _40 => _40.dryRun]), () => ( true));
8053
+ const dryRun = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _51 => _51.dryRun]), () => ( true));
7860
8054
  const changes = [];
7861
8055
  const applied = [];
7862
8056
  for (const id of ids) {
@@ -7866,7 +8060,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
7866
8060
  path: `/V1.0/Companies/${id}`,
7867
8061
  operation: "resources.transferOwnership"
7868
8062
  });
7869
- const company = _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, id);
8063
+ const company = _chunkKB2ANVVRcjs.unwrapItem.call(void 0, res, id);
7870
8064
  const current = typeof company.ownerResourceID === "number" ? company.ownerResourceID : null;
7871
8065
  changes.push({ id, fromOwnerResourceID: current, toOwnerResourceID: destination });
7872
8066
  if (!dryRun) {
@@ -7876,11 +8070,11 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
7876
8070
  body: { id, ownerResourceID: destination },
7877
8071
  operation: "resources.transferOwnership"
7878
8072
  });
7879
- _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, update);
8073
+ _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, update);
7880
8074
  applied.push(id);
7881
8075
  }
7882
8076
  } catch (err) {
7883
- if (!dryRun && err instanceof _chunk5N6DYKXOcjs.AutotaskError) {
8077
+ if (!dryRun && err instanceof _chunkKB2ANVVRcjs.AutotaskError) {
7884
8078
  err.resourceIds = [id];
7885
8079
  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).`;
7886
8080
  }
@@ -7890,7 +8084,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
7890
8084
  if (dryRun) {
7891
8085
  const anyChange = changes.some((c) => c.fromOwnerResourceID !== c.toOwnerResourceID);
7892
8086
  return {
7893
- ..._chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
8087
+ ..._chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
7894
8088
  operation: "resources.transferOwnership",
7895
8089
  method: "PUT",
7896
8090
  path: "/V1.0/Companies",
@@ -7914,7 +8108,7 @@ async function transferOwnership(_resource, companyIds, destinationResourceId, h
7914
8108
  }
7915
8109
 
7916
8110
  // src/resources/resources.ts
7917
- var ResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8111
+ var ResourcesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
7918
8112
 
7919
8113
  constructor(http, clientConfig, pageSize) {
7920
8114
  super(http, {
@@ -7987,7 +8181,7 @@ var ResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
7987
8181
 
7988
8182
  // src/resources/special/resource_time_off_additional.ts
7989
8183
  async function getByResource(_resource, resourceId, http) {
7990
- const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8184
+ const numericResource = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
7991
8185
  const res = await http.request({
7992
8186
  method: "GET",
7993
8187
  path: `/V1.0/Resources/${numericResource}/TimeOffAdditional`,
@@ -8001,11 +8195,11 @@ async function getByResource(_resource, resourceId, http) {
8001
8195
  if (typeof item === "object" && !Array.isArray(item)) return [item];
8002
8196
  }
8003
8197
  }
8004
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "resource_time_off_additional.getByResource").items;
8198
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, "resource_time_off_additional.getByResource").items;
8005
8199
  }
8006
8200
 
8007
8201
  // src/resources/resource_time_off_additional.ts
8008
- var ResourceTimeOffAdditionalResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8202
+ var ResourceTimeOffAdditionalResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8009
8203
  constructor(http, pageSize) {
8010
8204
  super(http, {
8011
8205
  key: "resource_time_off_additional",
@@ -8044,7 +8238,7 @@ var ResourceTimeOffAdditionalResource = class extends _chunk5N6DYKXOcjs.BaseReso
8044
8238
  };
8045
8239
 
8046
8240
  // src/resources/resource_time_off_approvers.ts
8047
- var ResourceTimeOffApproversResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8241
+ var ResourceTimeOffApproversResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8048
8242
  constructor(http, pageSize) {
8049
8243
  super(http, {
8050
8244
  key: "resource_time_off_approvers",
@@ -8087,29 +8281,29 @@ var ResourceTimeOffApproversResource = class extends _chunk5N6DYKXOcjs.BaseResou
8087
8281
 
8088
8282
  // src/resources/special/resource_time_off_balances.ts
8089
8283
  async function getByResource2(_resource, resourceId, http) {
8090
- const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8284
+ const numericResource = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8091
8285
  const res = await http.request({
8092
8286
  method: "GET",
8093
8287
  path: `/V1.0/Resources/${numericResource}/TimeOffBalances`,
8094
8288
  operation: "resource_time_off_balances.getByResource"
8095
8289
  });
8096
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, "resource_time_off_balances.getByResource").items;
8290
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, "resource_time_off_balances.getByResource").items;
8097
8291
  }
8098
8292
  async function getByYear(_resource, resourceId, year, http) {
8099
- const numericResource = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8293
+ const numericResource = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
8100
8294
  if (!Number.isSafeInteger(year) || year < 1) {
8101
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("getByYear: year must be a positive integer");
8295
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("getByYear: year must be a positive integer");
8102
8296
  }
8103
8297
  const res = await http.request({
8104
8298
  method: "GET",
8105
8299
  path: `/V1.0/Resources/${numericResource}/TimeOffBalances/${year}`,
8106
8300
  operation: "resource_time_off_balances.getByYear"
8107
8301
  });
8108
- return _chunk5N6DYKXOcjs.unwrapItem.call(void 0, res, year, "resource_time_off_balances.getByYear");
8302
+ return _chunkKB2ANVVRcjs.unwrapItem.call(void 0, res, year, "resource_time_off_balances.getByYear");
8109
8303
  }
8110
8304
 
8111
8305
  // src/resources/resource_time_off_balances.ts
8112
- var ResourceTimeOffBalancesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8306
+ var ResourceTimeOffBalancesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8113
8307
  constructor(http, pageSize) {
8114
8308
  super(http, {
8115
8309
  key: "resource_time_off_balances",
@@ -8147,7 +8341,7 @@ var ResourceTimeOffBalancesResource = class extends _chunk5N6DYKXOcjs.BaseResour
8147
8341
  };
8148
8342
 
8149
8343
  // src/resources/roles.ts
8150
- var RolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8344
+ var RolesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8151
8345
  constructor(http, pageSize) {
8152
8346
  super(http, {
8153
8347
  key: "roles",
@@ -8214,7 +8408,7 @@ var RolesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8214
8408
  };
8215
8409
 
8216
8410
  // src/resources/service_calls.ts
8217
- var ServiceCallsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8411
+ var ServiceCallsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8218
8412
  constructor(http, pageSize) {
8219
8413
  super(http, {
8220
8414
  key: "service_calls",
@@ -8283,7 +8477,7 @@ var ServiceCallsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8283
8477
  };
8284
8478
 
8285
8479
  // src/resources/service_call_task_resources.ts
8286
- var ServiceCallTaskResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8480
+ var ServiceCallTaskResourcesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8287
8481
  constructor(http, pageSize) {
8288
8482
  super(http, {
8289
8483
  key: "service_call_task_resources",
@@ -8340,7 +8534,7 @@ var ServiceCallTaskResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResou
8340
8534
  };
8341
8535
 
8342
8536
  // src/resources/service_call_tasks.ts
8343
- var ServiceCallTasksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8537
+ var ServiceCallTasksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8344
8538
  constructor(http, pageSize) {
8345
8539
  super(http, {
8346
8540
  key: "service_call_tasks",
@@ -8397,7 +8591,7 @@ var ServiceCallTasksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8397
8591
  };
8398
8592
 
8399
8593
  // src/resources/service_call_ticket_resources.ts
8400
- var ServiceCallTicketResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8594
+ var ServiceCallTicketResourcesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8401
8595
  constructor(http, pageSize) {
8402
8596
  super(http, {
8403
8597
  key: "service_call_ticket_resources",
@@ -8454,7 +8648,7 @@ var ServiceCallTicketResourcesResource = class extends _chunk5N6DYKXOcjs.BaseRes
8454
8648
  };
8455
8649
 
8456
8650
  // src/resources/service_call_tickets.ts
8457
- var ServiceCallTicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8651
+ var ServiceCallTicketsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8458
8652
  constructor(http, pageSize) {
8459
8653
  super(http, {
8460
8654
  key: "service_call_tickets",
@@ -8511,7 +8705,7 @@ var ServiceCallTicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8511
8705
  };
8512
8706
 
8513
8707
  // src/resources/service_level_agreement_results.ts
8514
- var ServiceLevelAgreementResultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8708
+ var ServiceLevelAgreementResultsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8515
8709
  constructor(http, pageSize) {
8516
8710
  super(http, {
8517
8711
  key: "service_level_agreement_results",
@@ -8550,7 +8744,7 @@ var ServiceLevelAgreementResultsResource = class extends _chunk5N6DYKXOcjs.BaseR
8550
8744
  };
8551
8745
 
8552
8746
  // src/resources/services.ts
8553
- var ServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8747
+ var ServicesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8554
8748
  constructor(http, pageSize) {
8555
8749
  super(http, {
8556
8750
  key: "services",
@@ -8618,7 +8812,7 @@ var ServicesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8618
8812
  };
8619
8813
 
8620
8814
  // src/resources/skills.ts
8621
- var SkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8815
+ var SkillsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8622
8816
  constructor(http, pageSize) {
8623
8817
  super(http, {
8624
8818
  key: "skills",
@@ -8662,7 +8856,7 @@ var SkillsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8662
8856
  };
8663
8857
 
8664
8858
  // src/resources/subscription_periods.ts
8665
- var SubscriptionPeriodsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8859
+ var SubscriptionPeriodsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8666
8860
  constructor(http, pageSize) {
8667
8861
  super(http, {
8668
8862
  key: "subscription_periods",
@@ -8701,7 +8895,7 @@ var SubscriptionPeriodsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8701
8895
  };
8702
8896
 
8703
8897
  // src/resources/subscriptions.ts
8704
- var SubscriptionsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8898
+ var SubscriptionsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8705
8899
  constructor(http, pageSize) {
8706
8900
  super(http, {
8707
8901
  key: "subscriptions",
@@ -8770,7 +8964,7 @@ var SubscriptionsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8770
8964
  };
8771
8965
 
8772
8966
  // src/resources/survey_results.ts
8773
- var SurveyResultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8967
+ var SurveyResultsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8774
8968
  constructor(http, pageSize) {
8775
8969
  super(http, {
8776
8970
  key: "survey_results",
@@ -8809,7 +9003,7 @@ var SurveyResultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8809
9003
  };
8810
9004
 
8811
9005
  // src/resources/surveys.ts
8812
- var SurveysResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9006
+ var SurveysResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8813
9007
  constructor(http, pageSize) {
8814
9008
  super(http, {
8815
9009
  key: "surveys",
@@ -8853,7 +9047,7 @@ var SurveysResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8853
9047
  };
8854
9048
 
8855
9049
  // src/resources/tag_aliases.ts
8856
- var TagAliasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9050
+ var TagAliasesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8857
9051
  constructor(http, pageSize) {
8858
9052
  super(http, {
8859
9053
  key: "tag_aliases",
@@ -8910,7 +9104,7 @@ var TagAliasesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8910
9104
  };
8911
9105
 
8912
9106
  // src/resources/tag_groups.ts
8913
- var TagGroupsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9107
+ var TagGroupsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8914
9108
  constructor(http, pageSize) {
8915
9109
  super(http, {
8916
9110
  key: "tag_groups",
@@ -8979,7 +9173,7 @@ var TagGroupsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
8979
9173
  };
8980
9174
 
8981
9175
  // src/resources/tags.ts
8982
- var TagsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9176
+ var TagsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
8983
9177
  constructor(http, pageSize) {
8984
9178
  super(http, {
8985
9179
  key: "tags",
@@ -9048,7 +9242,7 @@ var TagsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9048
9242
  };
9049
9243
 
9050
9244
  // src/resources/task_secondary_resources.ts
9051
- var TaskSecondaryResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9245
+ var TaskSecondaryResourcesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9052
9246
  constructor(http, pageSize) {
9053
9247
  super(http, {
9054
9248
  key: "task_secondary_resources",
@@ -9105,7 +9299,7 @@ var TaskSecondaryResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResourc
9105
9299
  };
9106
9300
 
9107
9301
  // src/resources/tasks.ts
9108
- var TasksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9302
+ var TasksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9109
9303
  constructor(http, pageSize) {
9110
9304
  super(http, {
9111
9305
  key: "tasks",
@@ -9193,7 +9387,7 @@ var ThresholdInformationResource = class {
9193
9387
  };
9194
9388
 
9195
9389
  // src/resources/ticket_additional_configuration_items.ts
9196
- var TicketAdditionalConfigurationItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9390
+ var TicketAdditionalConfigurationItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9197
9391
  constructor(http, pageSize) {
9198
9392
  super(http, {
9199
9393
  key: "ticket_additional_configuration_items",
@@ -9250,7 +9444,7 @@ var TicketAdditionalConfigurationItemsResource = class extends _chunk5N6DYKXOcjs
9250
9444
  };
9251
9445
 
9252
9446
  // src/resources/ticket_additional_contacts.ts
9253
- var TicketAdditionalContactsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9447
+ var TicketAdditionalContactsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9254
9448
  constructor(http, pageSize) {
9255
9449
  super(http, {
9256
9450
  key: "ticket_additional_contacts",
@@ -9307,7 +9501,7 @@ var TicketAdditionalContactsResource = class extends _chunk5N6DYKXOcjs.BaseResou
9307
9501
  };
9308
9502
 
9309
9503
  // src/resources/ticket_attachments.ts
9310
- var TicketAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9504
+ var TicketAttachmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9311
9505
  constructor(http, pageSize) {
9312
9506
  super(http, {
9313
9507
  key: "ticket_attachments",
@@ -9369,7 +9563,7 @@ var TicketAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9369
9563
  };
9370
9564
 
9371
9565
  // src/resources/ticket_categories.ts
9372
- var TicketCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9566
+ var TicketCategoriesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9373
9567
  constructor(http, pageSize) {
9374
9568
  super(http, {
9375
9569
  key: "ticket_categories",
@@ -9428,7 +9622,7 @@ var TicketCategoriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9428
9622
  };
9429
9623
 
9430
9624
  // src/resources/ticket_category_field_defaults.ts
9431
- var TicketCategoryFieldDefaultsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9625
+ var TicketCategoryFieldDefaultsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9432
9626
  constructor(http, pageSize) {
9433
9627
  super(http, {
9434
9628
  key: "ticket_category_field_defaults",
@@ -9470,7 +9664,7 @@ var TicketCategoryFieldDefaultsResource = class extends _chunk5N6DYKXOcjs.BaseRe
9470
9664
  };
9471
9665
 
9472
9666
  // src/resources/ticket_change_request_approvals.ts
9473
- var TicketChangeRequestApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9667
+ var TicketChangeRequestApprovalsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9474
9668
  constructor(http, pageSize) {
9475
9669
  super(http, {
9476
9670
  key: "ticket_change_request_approvals",
@@ -9527,7 +9721,7 @@ var TicketChangeRequestApprovalsResource = class extends _chunk5N6DYKXOcjs.BaseR
9527
9721
  };
9528
9722
 
9529
9723
  // src/resources/ticket_charges.ts
9530
- var TicketChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9724
+ var TicketChargesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9531
9725
  constructor(http, pageSize) {
9532
9726
  super(http, {
9533
9727
  key: "ticket_charges",
@@ -9598,7 +9792,7 @@ var TicketChargesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9598
9792
  };
9599
9793
 
9600
9794
  // src/resources/ticket_checklist_items.ts
9601
- var TicketChecklistItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9795
+ var TicketChecklistItemsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9602
9796
  constructor(http, pageSize) {
9603
9797
  super(http, {
9604
9798
  key: "ticket_checklist_items",
@@ -9664,7 +9858,7 @@ var TicketChecklistItemsResource = class extends _chunk5N6DYKXOcjs.BaseResource
9664
9858
  };
9665
9859
 
9666
9860
  // src/resources/ticket_checklist_libraries.ts
9667
- var TicketChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9861
+ var TicketChecklistLibrariesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9668
9862
  constructor(http, pageSize) {
9669
9863
  super(http, {
9670
9864
  key: "ticket_checklist_libraries",
@@ -9688,9 +9882,9 @@ var TicketChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResou
9688
9882
  * `dryRun: true` returns the pinned envelope (document existence is unverifiable in the MVP
9689
9883
  * surface — no documents read op — and never issues the POST). */
9690
9884
  async attachToDocument(documentID, data, opts = {}) {
9691
- const n = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, documentID, "documentID");
9885
+ const n = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, documentID, "documentID");
9692
9886
  if (opts.dryRun === true) {
9693
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
9887
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
9694
9888
  operation: "ticket_checklist_libraries.attachToDocument",
9695
9889
  method: "POST",
9696
9890
  path: `/V1.0/Documents/${n}/ChecklistLibraries`,
@@ -9707,7 +9901,7 @@ var TicketChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResou
9707
9901
  body: { ...data },
9708
9902
  operation: "ticket_checklist_libraries.attachToDocument"
9709
9903
  });
9710
- return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
9904
+ return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
9711
9905
  }
9712
9906
  /** Resolve a TicketChecklistLibrary from a numeric id (or, where the vendor indexes a primary text field,
9713
9907
  * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
@@ -9723,7 +9917,7 @@ var TicketChecklistLibrariesResource = class extends _chunk5N6DYKXOcjs.BaseResou
9723
9917
  };
9724
9918
 
9725
9919
  // src/resources/ticket_history.ts
9726
- var TicketHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9920
+ var TicketHistoryResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9727
9921
  constructor(http, pageSize) {
9728
9922
  super(http, {
9729
9923
  key: "ticket_history",
@@ -9762,7 +9956,7 @@ var TicketHistoryResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9762
9956
  };
9763
9957
 
9764
9958
  // src/resources/ticket_note_attachments.ts
9765
- var TicketNoteAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9959
+ var TicketNoteAttachmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9766
9960
  constructor(http, pageSize) {
9767
9961
  super(http, {
9768
9962
  key: "ticket_note_attachments",
@@ -9824,7 +10018,7 @@ var TicketNoteAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource
9824
10018
  };
9825
10019
 
9826
10020
  // src/resources/ticket_notes.ts
9827
- var TicketNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10021
+ var TicketNotesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9828
10022
  constructor(http, pageSize) {
9829
10023
  super(http, {
9830
10024
  key: "ticket_notes",
@@ -9883,7 +10077,7 @@ var TicketNotesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9883
10077
  };
9884
10078
 
9885
10079
  // src/resources/ticket_note_webhooks.ts
9886
- var TicketNoteWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10080
+ var TicketNoteWebhooksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9887
10081
  constructor(http, pageSize) {
9888
10082
  super(http, {
9889
10083
  key: "ticket_note_webhooks",
@@ -9959,7 +10153,7 @@ var TicketNoteWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
9959
10153
  };
9960
10154
 
9961
10155
  // src/resources/ticket_secondary_resources.ts
9962
- var TicketSecondaryResourcesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10156
+ var TicketSecondaryResourcesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
9963
10157
  constructor(http, pageSize) {
9964
10158
  super(http, {
9965
10159
  key: "ticket_secondary_resources",
@@ -10026,9 +10220,9 @@ async function fetchTicket(http, id, operation) {
10026
10220
  });
10027
10221
  const body = res;
10028
10222
  if (body === null || !("item" in body)) {
10029
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Ticket ${id} not found (unexpected envelope shape)`, { resourceIds: [id] });
10223
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`Ticket ${id} not found (unexpected envelope shape)`, { resourceIds: [id] });
10030
10224
  }
10031
- if (body.item === null || body.item === void 0) throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`Ticket ${id} not found`, { resourceIds: [id] });
10225
+ if (body.item === null || body.item === void 0) throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`Ticket ${id} not found`, { resourceIds: [id] });
10032
10226
  return body.item;
10033
10227
  }
10034
10228
  async function ticketQueryItems(http, path, filter, maxRecords, operation) {
@@ -10039,29 +10233,29 @@ async function ticketQueryItems(http, path, filter, maxRecords, operation) {
10039
10233
  body: { MaxRecords: maxRecords, filter },
10040
10234
  operation
10041
10235
  });
10042
- return _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res).items;
10236
+ return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
10043
10237
  }
10044
10238
  function isRouteUnavailable(err) {
10045
- return _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) && (err.httpStatus === 404 || err.httpStatus === 500);
10239
+ return _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) && (err.httpStatus === 404 || err.httpStatus === 500);
10046
10240
  }
10047
10241
  function routeFact(route, path, err) {
10048
10242
  return {
10049
10243
  route,
10050
10244
  path,
10051
- httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) && typeof err.httpStatus === "number" ? err.httpStatus : null
10245
+ httpStatus: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) && typeof err.httpStatus === "number" ? err.httpStatus : null
10052
10246
  };
10053
10247
  }
10054
10248
  function childDeclaresQuery(resourceKey) {
10055
- return _chunkJKZVCFRYcjs.CAPABILITIES.some(
10249
+ return _chunkCXXNONRPcjs.CAPABILITIES.some(
10056
10250
  (c) => c.id === `${resourceKey}.query` && (c.status === "implemented" || c.status === "tested")
10057
10251
  );
10058
10252
  }
10059
10253
  function planScopedPath(resourceKey, ticketId) {
10060
10254
  if (!childDeclaresQuery(resourceKey)) return null;
10061
- const entry = _chunk5N6DYKXOcjs.RELATIONSHIP_MAP[resourceKey];
10255
+ const entry = _chunkKB2ANVVRcjs.RELATIONSHIP_MAP[resourceKey];
10062
10256
  const parent = entry === void 0 ? null : entry.parent;
10063
10257
  if (parent === null || parent.resource !== "tickets" || parent.segment === null || parent.field === null) return null;
10064
- const parentPath = _optionalChain([_chunk5N6DYKXOcjs.RELATIONSHIP_MAP, 'access', _41 => _41[parent.resource], 'optionalAccess', _42 => _42.path]);
10258
+ const parentPath = _optionalChain([_chunkKB2ANVVRcjs.RELATIONSHIP_MAP, 'access', _52 => _52[parent.resource], 'optionalAccess', _53 => _53.path]);
10065
10259
  if (parentPath === null || parentPath === void 0) return null;
10066
10260
  return `/V1.0/${parentPath}/${ticketId}/${parent.segment}`;
10067
10261
  }
@@ -10100,14 +10294,14 @@ async function scopedCollectionRead(http, startPath, limit, operation, accept) {
10100
10294
  break;
10101
10295
  }
10102
10296
  const body = await http.request({ method: "GET", path: target, operation });
10103
- const { items: pageItems, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, body, operation);
10297
+ const { items: pageItems, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, body, operation);
10104
10298
  nextCursor = pageDetails.nextPageUrl;
10105
10299
  pages += 1;
10106
10300
  const window = pageItems.slice(0, Math.max(0, limit - items.length));
10107
10301
  for (const row of window) if (accept(row)) items.push(row);
10108
10302
  if (items.length >= limit) break;
10109
10303
  if (nextCursor === null || pageItems.length === 0) break;
10110
- target = _chunk5N6DYKXOcjs.cursorToPath.call(void 0, http.baseUrl, nextCursor);
10304
+ target = _chunkKB2ANVVRcjs.cursorToPath.call(void 0, http.baseUrl, nextCursor);
10111
10305
  }
10112
10306
  const capped = items.length >= limit || guard && nextCursor !== null;
10113
10307
  return { items, capped };
@@ -10141,7 +10335,7 @@ function truncate(text, limit) {
10141
10335
  }
10142
10336
  async function slaHealthCheck(_resource, id, opts = {}, http) {
10143
10337
  void opts;
10144
- const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10338
+ const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
10145
10339
  await fetchTicket(http, ticketId, "tickets.slaHealthCheck");
10146
10340
  const rows = await ticketQueryItems(
10147
10341
  http,
@@ -10166,9 +10360,9 @@ async function slaHealthCheck(_resource, id, opts = {}, http) {
10166
10360
  async function summary(_resource, id, opts = {}, http) {
10167
10361
  const limit = opts.summaryTextLimit === void 0 ? 500 : Math.trunc(opts.summaryTextLimit);
10168
10362
  if (!Number.isInteger(limit) || limit < 1) {
10169
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`summaryTextLimit must be an integer >= 1 (got ${String(opts.summaryTextLimit)})`);
10363
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`summaryTextLimit must be an integer >= 1 (got ${String(opts.summaryTextLimit)})`);
10170
10364
  }
10171
- const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10365
+ const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
10172
10366
  const ticket = await fetchTicket(http, ticketId, "tickets.summary");
10173
10367
  const desc = truncate(ticket.description, limit);
10174
10368
  const now = _nullishCoalesce(opts.now, () => ( /* @__PURE__ */ new Date()));
@@ -10195,13 +10389,13 @@ async function summary(_resource, id, opts = {}, http) {
10195
10389
  }
10196
10390
  async function timeline(_resource, id, opts = {}, http) {
10197
10391
  const limit = opts.limit === void 0 ? 100 : Math.trunc(opts.limit);
10198
- if (!Number.isInteger(limit) || limit < 1) throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(opts.limit)})`);
10392
+ if (!Number.isInteger(limit) || limit < 1) throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`limit must be an integer >= 1 (got ${String(opts.limit)})`);
10199
10393
  const bounded = Math.min(limit, 500);
10200
10394
  const textLimit = opts.textLimit === void 0 ? 500 : Math.trunc(opts.textLimit);
10201
10395
  if (!Number.isInteger(textLimit) || textLimit < 1) {
10202
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`textLimit must be an integer >= 1 (got ${String(opts.textLimit)})`);
10396
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`textLimit must be an integer >= 1 (got ${String(opts.textLimit)})`);
10203
10397
  }
10204
- const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10398
+ const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
10205
10399
  await fetchTicket(http, ticketId, "tickets.timeline");
10206
10400
  const dateFilters = (field) => {
10207
10401
  const f = [{ field: "ticketID", op: "eq", value: ticketId }];
@@ -10288,14 +10482,14 @@ function isPositiveInt(v) {
10288
10482
  return typeof v === "number" && Number.isInteger(v) && v > 0;
10289
10483
  }
10290
10484
  function namedVendorFields(err) {
10291
- if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return [];
10292
- const entries = _nullishCoalesce(_chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []));
10485
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return [];
10486
+ const entries = _nullishCoalesce(_chunkKB2ANVVRcjs.parseVendorErrors.call(void 0, err.vendorError), () => ( []));
10293
10487
  const out = /* @__PURE__ */ new Set();
10294
10488
  for (const e of entries) if (e.field !== void 0) out.add(e.field);
10295
10489
  return [...out];
10296
10490
  }
10297
10491
  function vendorDetailOf(err) {
10298
- return _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? _chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError) : void 0;
10492
+ return _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? _chunkKB2ANVVRcjs.formatVendorDetail.call(void 0, err.vendorError) : void 0;
10299
10493
  }
10300
10494
  async function fetchItem(http, path, operation) {
10301
10495
  const res = await http.request({ method: "GET", path, operation });
@@ -10316,8 +10510,8 @@ function operationId(res) {
10316
10510
  return typeof body.itemId === "number" ? body.itemId : typeof body.id === "number" ? body.id : void 0;
10317
10511
  }
10318
10512
  function discoveryMerge(err, body, defaults) {
10319
- if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
10320
- const entries = _chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError);
10513
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
10514
+ const entries = _chunkKB2ANVVRcjs.parseVendorErrors.call(void 0, err.vendorError);
10321
10515
  if (entries === void 0) return null;
10322
10516
  for (const entry of entries) {
10323
10517
  const field = entry.field;
@@ -10329,7 +10523,7 @@ function discoveryMerge(err, body, defaults) {
10329
10523
  }
10330
10524
  function stepErrorText(code, err) {
10331
10525
  const detail = vendorDetailOf(err);
10332
- const base = _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.message : String(err);
10526
+ const base = _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.message : String(err);
10333
10527
  return detail ? `${code}: ${detail}` : `${code}: ${base}`;
10334
10528
  }
10335
10529
  var DEFAULT_TICKET_PRIORITY = 3;
@@ -10338,7 +10532,7 @@ var DEFAULT_NOTE_TYPE = 1;
10338
10532
  var DEFAULT_PUBLISH = 1;
10339
10533
  var PUBLISH_VALUES = /* @__PURE__ */ new Set([1, 2, 4]);
10340
10534
  var SAFE_TICKET_CREATE_DEFAULTS = {};
10341
- var QueueRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10535
+ var QueueRequiredError = class extends _chunkKB2ANVVRcjs.AutotaskError {
10342
10536
  constructor(message, options = {}) {
10343
10537
  super(message, {
10344
10538
  code: "QUEUE_REQUIRED",
@@ -10349,13 +10543,13 @@ var QueueRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10349
10543
  this.name = "QueueRequiredError";
10350
10544
  }
10351
10545
  };
10352
- var TicketResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10546
+ var TicketResourceInvalidError = class extends _chunkKB2ANVVRcjs.AutotaskError {
10353
10547
  constructor(message, options = {}) {
10354
10548
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
10355
10549
  this.name = "TicketResourceInvalidError";
10356
10550
  }
10357
10551
  };
10358
- var TicketCreateValidationFailedError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10552
+ var TicketCreateValidationFailedError = class extends _chunkKB2ANVVRcjs.AutotaskError {
10359
10553
  /** The vendor-named fields (empty when the 500 body named nothing parseable). */
10360
10554
 
10361
10555
  constructor(message, vendorFields, options = {}) {
@@ -10365,43 +10559,43 @@ var TicketCreateValidationFailedError = class extends _chunk5N6DYKXOcjs.Autotask
10365
10559
  }
10366
10560
  };
10367
10561
  async function openWithNoteAndAssign(resource, params, note, assign, opts, http) {
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]);
10562
+ const companyID = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, _optionalChain([params, 'optionalAccess', _54 => _54.companyID]), "params.companyID");
10563
+ const title = _optionalChain([params, 'optionalAccess', _55 => _55.title]);
10370
10564
  if (typeof title !== "string" || title.trim() === "") {
10371
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: params.title is required (a non-empty string)", { operation: OP_OPEN });
10565
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("openWithNoteAndAssign: params.title is required (a non-empty string)", { operation: OP_OPEN });
10372
10566
  }
10373
10567
  const priority = _nullishCoalesce(params.priority, () => ( DEFAULT_TICKET_PRIORITY));
10374
10568
  const status = _nullishCoalesce(params.status, () => ( DEFAULT_TICKET_STATUS));
10375
10569
  if (!isPositiveInt(priority)) {
10376
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.priority must be a positive integer (got ${String(params.priority)})`, { operation: OP_OPEN });
10570
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.priority must be a positive integer (got ${String(params.priority)})`, { operation: OP_OPEN });
10377
10571
  }
10378
10572
  if (!isPositiveInt(status)) {
10379
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.status must be a positive integer (got ${String(params.status)})`, { operation: OP_OPEN });
10573
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.status must be a positive integer (got ${String(params.status)})`, { operation: OP_OPEN });
10380
10574
  }
10381
10575
  if (params.queueID !== void 0 && !isPositiveInt(params.queueID)) {
10382
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.queueID must be a positive integer (got ${String(params.queueID)})`, { operation: OP_OPEN });
10576
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: params.queueID must be a positive integer (got ${String(params.queueID)})`, { operation: OP_OPEN });
10383
10577
  }
10384
10578
  if (note !== void 0) {
10385
10579
  if (typeof note.description !== "string" || note.description.trim() === "") {
10386
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("openWithNoteAndAssign: note.description is required (a non-empty string)", { operation: OP_OPEN });
10580
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("openWithNoteAndAssign: note.description is required (a non-empty string)", { operation: OP_OPEN });
10387
10581
  }
10388
10582
  if (typeof note.title !== "string" || note.title.trim() === "") {
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 });
10583
+ throw new (0, _chunkKB2ANVVRcjs.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 });
10390
10584
  }
10391
10585
  if (note.noteType !== void 0 && !isPositiveInt(note.noteType)) {
10392
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: note.noteType must be a positive integer (got ${String(note.noteType)})`, { operation: OP_OPEN });
10586
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: note.noteType must be a positive integer (got ${String(note.noteType)})`, { operation: OP_OPEN });
10393
10587
  }
10394
10588
  if (note.publish !== void 0 && !PUBLISH_VALUES.has(note.publish)) {
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 });
10589
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: note.publish must be an integer picklist value 1/2/4 (got ${String(note.publish)} \u2014 NOT a boolean)`, { operation: OP_OPEN });
10396
10590
  }
10397
10591
  }
10398
- const assignee = assign === void 0 ? void 0 : _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, assign.resourceID, "assign.resourceID");
10592
+ const assignee = assign === void 0 ? void 0 : _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, assign.resourceID, "assign.resourceID");
10399
10593
  if (assign !== void 0 && assignee !== void 0 && (typeof assignee === "number" ? assignee < 1 : false)) {
10400
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`openWithNoteAndAssign: assign.resourceID must be a positive integer (got ${String(assignee)})`, { operation: OP_OPEN });
10594
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`openWithNoteAndAssign: assign.resourceID must be a positive integer (got ${String(assignee)})`, { operation: OP_OPEN });
10401
10595
  }
10402
- const roleID = _optionalChain([assign, 'optionalAccess', _45 => _45.roleID]);
10596
+ const roleID = _optionalChain([assign, 'optionalAccess', _56 => _56.roleID]);
10403
10597
  if (assign !== void 0 && !isPositiveInt(roleID)) {
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 });
10598
+ throw new (0, _chunkKB2ANVVRcjs.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 });
10405
10599
  }
10406
10600
  if (assign !== void 0 && assignee !== void 0) {
10407
10601
  const rid = assignee;
@@ -10436,7 +10630,7 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
10436
10630
  if (assign !== void 0) {
10437
10631
  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).`);
10438
10632
  }
10439
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
10633
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
10440
10634
  {
10441
10635
  operation: OP_OPEN,
10442
10636
  method: "POST",
@@ -10478,8 +10672,8 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
10478
10672
  `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}` : ""}`,
10479
10673
  {
10480
10674
  operation: OP_OPEN,
10481
- httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10482
- vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0
10675
+ httpStatus: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10676
+ vendorError: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0
10483
10677
  }
10484
10678
  );
10485
10679
  }
@@ -10494,8 +10688,8 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
10494
10688
  named,
10495
10689
  {
10496
10690
  operation: OP_OPEN,
10497
- httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10498
- vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10691
+ httpStatus: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10692
+ vendorError: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10499
10693
  resourceIds: [companyID]
10500
10694
  }
10501
10695
  );
@@ -10517,10 +10711,10 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
10517
10711
  try {
10518
10712
  const current = await fetchItemUnredacted(http, `/V1.0/Tickets/${ticketId}`, OP_OPEN);
10519
10713
  if (current === null) {
10520
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`openWithNoteAndAssign: ticket ${ticketId} vanished between the create and the assign merge read`, { operation: OP_OPEN, resourceIds: [ticketId] });
10714
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`openWithNoteAndAssign: ticket ${ticketId} vanished between the create and the assign merge read`, { operation: OP_OPEN, resourceIds: [ticketId] });
10521
10715
  }
10522
10716
  ticketNumber = typeof current.ticketNumber === "string" ? current.ticketNumber : null;
10523
- const merged = _chunk5N6DYKXOcjs.mergePartialBody.call(void 0, current, { id: ticketId, assignedResourceID: assignee, assignedResourceRoleID: roleID });
10717
+ const merged = _chunkKB2ANVVRcjs.mergePartialBody.call(void 0, current, { id: ticketId, assignedResourceID: assignee, assignedResourceRoleID: roleID });
10524
10718
  merged.id = ticketId;
10525
10719
  await http.request({ method: "PUT", path: "/V1.0/Tickets", body: merged, operation: OP_OPEN });
10526
10720
  assigned = true;
@@ -10541,7 +10735,7 @@ async function openWithNoteAndAssign(resource, params, note, assign, opts, http)
10541
10735
  var STATUS_REQUIRED_FIELDS = {
10542
10736
  // <discovery output lands here — e.g. 8: { requiredFields: ['dueDateTime'], safeDefaults: { dueDateTime: '<now>' } }>
10543
10737
  };
10544
- var StatusUnknownError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10738
+ var StatusUnknownError = class extends _chunkKB2ANVVRcjs.AutotaskError {
10545
10739
  /** The live picklist size (the message names it; the values + labels are via operations.fieldCatalog with labels: true). */
10546
10740
 
10547
10741
  constructor(message, options = {}) {
@@ -10555,7 +10749,7 @@ var StatusUnknownError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10555
10749
  this.picklistCount = _nullishCoalesce(options.picklistCount, () => ( 0));
10556
10750
  }
10557
10751
  };
10558
- var StatusFieldsRequiredError = class extends _chunk5N6DYKXOcjs.AutotaskError {
10752
+ var StatusFieldsRequiredError = class extends _chunkKB2ANVVRcjs.AutotaskError {
10559
10753
 
10560
10754
 
10561
10755
 
@@ -10584,26 +10778,26 @@ async function readLiveStatusSet(resource) {
10584
10778
  }
10585
10779
  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";
10586
10780
  async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10587
- const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10781
+ const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
10588
10782
  if (!isPositiveInt(targetStatus)) {
10589
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`changeStatus: targetStatus must be a positive integer (got ${String(targetStatus)})`, { operation: OP_STATUS });
10783
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`changeStatus: targetStatus must be a positive integer (got ${String(targetStatus)})`, { operation: OP_STATUS });
10590
10784
  }
10591
10785
  let liveStatus = null;
10592
10786
  try {
10593
10787
  const ids = await readLiveStatusSet(resource);
10594
10788
  if (ids.size > 0) liveStatus = ids;
10595
10789
  } catch (err) {
10596
- if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10790
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10597
10791
  }
10598
10792
  if (liveStatus !== null && !liveStatus.has(targetStatus)) {
10599
- _optionalChain([http, 'access', _46 => _46.fieldCache, 'optionalAccess', _47 => _47.invalidate, 'call', _48 => _48("tickets")]);
10793
+ _optionalChain([http, 'access', _57 => _57.fieldCache, 'optionalAccess', _58 => _58.invalidate, 'call', _59 => _59("tickets")]);
10600
10794
  let freshStatus = null;
10601
10795
  let reReadFailed = false;
10602
10796
  try {
10603
10797
  const freshIds = await readLiveStatusSet(resource);
10604
10798
  if (freshIds.size > 0) freshStatus = freshIds;
10605
10799
  } catch (err) {
10606
- if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10800
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.code === "ABORTED") throw err;
10607
10801
  freshStatus = null;
10608
10802
  reReadFailed = true;
10609
10803
  }
@@ -10620,16 +10814,16 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10620
10814
  }
10621
10815
  const guardDegraded = liveStatus === null;
10622
10816
  if (fields !== void 0 && (typeof fields !== "object" || fields === null || Array.isArray(fields))) {
10623
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("changeStatus: fields must be a plain object of ticket fields (or omitted)", { operation: OP_STATUS });
10817
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("changeStatus: fields must be a plain object of ticket fields (or omitted)", { operation: OP_STATUS });
10624
10818
  }
10625
10819
  const current = await fetchItemUnredacted(http, `/V1.0/Tickets/${ticketId}`, OP_STATUS);
10626
10820
  if (current === null) {
10627
- throw new (0, _chunk5N6DYKXOcjs.NotFoundError)(`changeStatus: ticket ${ticketId} was not found (tickets.get returned item: null)`, { operation: OP_STATUS, resourceIds: [ticketId] });
10821
+ throw new (0, _chunkKB2ANVVRcjs.NotFoundError)(`changeStatus: ticket ${ticketId} was not found (tickets.get returned item: null)`, { operation: OP_STATUS, resourceIds: [ticketId] });
10628
10822
  }
10629
10823
  const previousStatus = typeof current.status === "number" ? current.status : null;
10630
10824
  if (previousStatus === targetStatus) {
10631
10825
  if (opts.dryRun === true) {
10632
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
10826
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
10633
10827
  {
10634
10828
  operation: OP_STATUS,
10635
10829
  method: "PUT",
@@ -10662,7 +10856,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10662
10856
  for (const field of mapEntry.requiredFields) {
10663
10857
  if (mergeData[field] !== void 0) continue;
10664
10858
  if (current[field] !== null && current[field] !== void 0) continue;
10665
- const safe = _optionalChain([mapEntry, 'access', _49 => _49.safeDefaults, 'optionalAccess', _50 => _50[field]]);
10859
+ const safe = _optionalChain([mapEntry, 'access', _60 => _60.safeDefaults, 'optionalAccess', _61 => _61[field]]);
10666
10860
  if (safe === void 0) {
10667
10861
  throw new StatusFieldsRequiredError(
10668
10862
  `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`,
@@ -10683,7 +10877,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10683
10877
  if (mapEntry === void 0) {
10684
10878
  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).`);
10685
10879
  }
10686
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
10880
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
10687
10881
  {
10688
10882
  operation: OP_STATUS,
10689
10883
  method: "PUT",
@@ -10701,8 +10895,8 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10701
10895
  { redactPersonalData: http.redactPersonalData }
10702
10896
  );
10703
10897
  }
10704
- const safeDefaults = _nullishCoalesce(_optionalChain([mapEntry, 'optionalAccess', _51 => _51.safeDefaults]), () => ( {}));
10705
- const body = _chunk5N6DYKXOcjs.mergePartialBody.call(void 0, current, mergeData);
10898
+ const safeDefaults = _nullishCoalesce(_optionalChain([mapEntry, 'optionalAccess', _62 => _62.safeDefaults]), () => ( {}));
10899
+ const body = _chunkKB2ANVVRcjs.mergePartialBody.call(void 0, current, mergeData);
10706
10900
  body.id = ticketId;
10707
10901
  let merges = 0;
10708
10902
  for (; ; ) {
@@ -10726,8 +10920,8 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10726
10920
  { vendorFields: named, currentStatus: previousStatus, targetStatus, currentValues },
10727
10921
  {
10728
10922
  operation: OP_STATUS,
10729
- httpStatus: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10730
- vendorError: _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10923
+ httpStatus: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.httpStatus : void 0,
10924
+ vendorError: _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? err.vendorError : void 0,
10731
10925
  resourceIds: [ticketId]
10732
10926
  }
10733
10927
  );
@@ -10737,7 +10931,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10737
10931
  }
10738
10932
  const verify = await fetchItem(http, `/V1.0/Tickets/${ticketId}`, OP_STATUS);
10739
10933
  if (verify === null) {
10740
- throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(`changeStatus: the post-PUT read-back found no ticket ${ticketId} (the PUT 200ed but the record is gone)`, {
10934
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskError)(`changeStatus: the post-PUT read-back found no ticket ${ticketId} (the PUT 200ed but the record is gone)`, {
10741
10935
  code: "INVALID_RESPONSE",
10742
10936
  category: "server",
10743
10937
  operation: OP_STATUS,
@@ -10746,7 +10940,7 @@ async function changeStatus(resource, id, targetStatus, fields, opts, http) {
10746
10940
  }
10747
10941
  const finalStatus = typeof verify.status === "number" ? verify.status : null;
10748
10942
  if (finalStatus !== targetStatus) {
10749
- throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(
10943
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskError)(
10750
10944
  `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)`,
10751
10945
  {
10752
10946
  code: "INVALID_RESPONSE",
@@ -10764,7 +10958,7 @@ var DEFAULT_PART_LIMIT = 50;
10764
10958
  function partLimit(value, name) {
10765
10959
  const n = value === void 0 ? DEFAULT_PART_LIMIT : Math.trunc(value);
10766
10960
  if (!Number.isInteger(n) || n < 1) {
10767
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`fullContext: ${name} must be an integer >= 1 (got ${String(value)})`);
10961
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`fullContext: ${name} must be an integer >= 1 (got ${String(value)})`);
10768
10962
  }
10769
10963
  return n;
10770
10964
  }
@@ -10780,7 +10974,7 @@ async function fullContext(resource, id, opts = {}, http) {
10780
10974
  const noteLimit = partLimit(opts.noteLimit, "noteLimit");
10781
10975
  const timeEntryLimit = partLimit(opts.timeEntryLimit, "timeEntryLimit");
10782
10976
  const textLimit = partLimit(opts.textLimit, "textLimit");
10783
- const ticketId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
10977
+ const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
10784
10978
  const ctx = await resource.getContext(ticketId);
10785
10979
  const op = "tickets.fullContext";
10786
10980
  const ticketFilter = [{ field: "ticketID", op: "eq", value: ticketId }];
@@ -10834,7 +11028,7 @@ async function fullContext(resource, id, opts = {}, http) {
10834
11028
  result.truncated = result.truncated || part.capped || historyRows.some((h) => h.detailTruncated === true);
10835
11029
  }
10836
11030
  if (opts.names === true) {
10837
- const builder = _chunk5N6DYKXOcjs.createNamePlan.call(void 0, _chunk5N6DYKXOcjs.TICKET_LABEL_FIELDS);
11031
+ const builder = _chunkKB2ANVVRcjs.createNamePlan.call(void 0, _chunkKB2ANVVRcjs.TICKET_LABEL_FIELDS);
10838
11032
  const t = ctx.ticket;
10839
11033
  builder.addResource(t["creatorResourceID"]);
10840
11034
  builder.addFk("contract", t["contractID"]);
@@ -10846,20 +11040,20 @@ async function fullContext(resource, id, opts = {}, http) {
10846
11040
  builder.addFk("billingCode", e["billingCodeID"]);
10847
11041
  builder.addFk("contract", e["contractID"]);
10848
11042
  }
10849
- const names = await _chunk5N6DYKXOcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
11043
+ const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
10850
11044
  const ticketRow = { ...ctx.ticket };
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);
11045
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, ticketRow, "creatorResourceID", (v) => names.resourceName(v));
11046
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, ticketRow, "contractID", (v) => names.recordName("contract", v));
11047
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, ticketRow, "billingCodeID", (v) => names.recordName("billingCode", v));
11048
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, ticketRow, "assignedResourceRoleID", (v) => names.recordName("role", v));
11049
+ for (const f of _chunkKB2ANVVRcjs.TICKET_LABEL_FIELDS) _chunkKB2ANVVRcjs.addLabelSibling.call(void 0, ticketRow, f, names);
10856
11050
  result.ticket = ticketRow;
10857
11051
  result.timeEntries.items = entriesPart.items.map((e) => {
10858
11052
  const row = { ...e };
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));
11053
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "resourceID", (v) => names.resourceName(v));
11054
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "roleID", (v) => names.recordName("role", v));
11055
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "billingCodeID", (v) => names.recordName("billingCode", v));
11056
+ _chunkKB2ANVVRcjs.addNameSibling.call(void 0, row, "contractID", (v) => names.recordName("contract", v));
10863
11057
  return row;
10864
11058
  });
10865
11059
  result.names = names.section;
@@ -10869,7 +11063,7 @@ async function fullContext(resource, id, opts = {}, http) {
10869
11063
  }
10870
11064
 
10871
11065
  // src/resources/tickets.ts
10872
- var TicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11066
+ var TicketsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
10873
11067
  constructor(http, pageSize) {
10874
11068
  super(http, {
10875
11069
  key: "tickets",
@@ -10975,7 +11169,7 @@ var TicketsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
10975
11169
  };
10976
11170
 
10977
11171
  // src/resources/ticket_webhooks.ts
10978
- var TicketWebhooksResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11172
+ var TicketWebhooksResource = class extends _chunkKB2ANVVRcjs.BaseResource {
10979
11173
  constructor(http, pageSize) {
10980
11174
  super(http, {
10981
11175
  key: "ticket_webhooks",
@@ -11061,62 +11255,62 @@ async function queryTimeEntries(_resource, filter, limit, operation, http) {
11061
11255
  body: { MaxRecords: limit, filter },
11062
11256
  operation
11063
11257
  });
11064
- const { items, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res);
11258
+ const { items, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res);
11065
11259
  return { items, hasMore: pageDetails.nextPageUrl != null };
11066
11260
  }
11067
11261
  async function windowQuery3(_resource, kind, http, opts) {
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}`);
11262
+ const now = _nullishCoalesce(_optionalChain([opts, 'optionalAccess', _63 => _63.now]), () => ( /* @__PURE__ */ new Date()));
11263
+ const tz = _optionalChain([opts, 'optionalAccess', _64 => _64.tz]) === void 0 ? void 0 : validateZone(opts.tz, `time_entries.${kind}`);
11070
11264
  const { from, to } = dateWindowBounds(kind, now, tz);
11071
11265
  const filter = [
11072
11266
  { field: "dateWorked", op: "gte", value: from },
11073
11267
  { field: "dateWorked", op: "lte", value: to }
11074
11268
  ];
11075
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _54 => _54.limit])), `time_entries.${kind}`, http);
11269
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _65 => _65.limit])), `time_entries.${kind}`, http);
11076
11270
  return items;
11077
11271
  }
11078
11272
  async function customRange3(_resource, from, to, http, opts) {
11079
- const zone = _optionalChain([opts, 'optionalAccess', _55 => _55.tz]) === void 0 ? void 0 : validateZone(opts.tz, "time_entries.customRange");
11273
+ const zone = _optionalChain([opts, 'optionalAccess', _66 => _66.tz]) === void 0 ? void 0 : validateZone(opts.tz, "time_entries.customRange");
11080
11274
  const fromB = customRangeDay(from, "from", zone, "customRange");
11081
11275
  const toB = customRangeDay(to, "to", zone, "customRange");
11082
11276
  if (fromB.ms > toB.ms) {
11083
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("customRange: from must not be after to");
11277
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("customRange: from must not be after to");
11084
11278
  }
11085
11279
  const toEndMs = zone === void 0 ? toB.ms + DAY_MS2 - 1 : localDayEndMs(toB.y, toB.mo, toB.d, zone);
11086
11280
  const filter = [
11087
11281
  { field: "dateWorked", op: "gte", value: iso2(fromB.ms) },
11088
11282
  { field: "dateWorked", op: "lte", value: iso2(toEndMs) }
11089
11283
  ];
11090
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _56 => _56.limit])), "time_entries.customRange", http);
11284
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _67 => _67.limit])), "time_entries.customRange", http);
11091
11285
  return items;
11092
11286
  }
11093
11287
  async function postedDateStatusQuery(_resource, mode, http, opts) {
11094
11288
  const filter = [
11095
11289
  { field: "postedDate", op: mode === "posted" ? "exist" : "notExist" }
11096
11290
  ];
11097
- if (_optionalChain([opts, 'optionalAccess', _57 => _57.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
11291
+ if (_optionalChain([opts, 'optionalAccess', _68 => _68.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
11098
11292
  const operation = mode === "posted" ? "time_entries.getPosted" : "time_entries.getUnposted";
11099
- const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _58 => _58.limit])), operation, http);
11293
+ const { items } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _69 => _69.limit])), operation, http);
11100
11294
  return items;
11101
11295
  }
11102
11296
  async function postedWithin(_resource, from, to, http, opts, opLabel = "time_entries.postedWithin") {
11103
11297
  const OP2 = opLabel;
11104
- const zone = _optionalChain([opts, 'optionalAccess', _59 => _59.tz]) === void 0 ? void 0 : validateZone(opts.tz, OP2);
11298
+ const zone = _optionalChain([opts, 'optionalAccess', _70 => _70.tz]) === void 0 ? void 0 : validateZone(opts.tz, OP2);
11105
11299
  const fromB = customRangeDay(from, "from", zone, OP2);
11106
11300
  const toB = customRangeDay(to, "to", zone, OP2);
11107
11301
  if (fromB.ms > toB.ms) {
11108
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(`${OP2}: from (${iso2(fromB.ms)}) must not be after to (${iso2(toB.ms)})`, { operation: OP2 });
11302
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`${OP2}: from (${iso2(fromB.ms)}) must not be after to (${iso2(toB.ms)})`, { operation: OP2 });
11109
11303
  }
11110
11304
  const windowToMs = zone === void 0 ? toB.ms + DAY_MS2 - 1 : localDayEndMs(toB.y, toB.mo, toB.d, zone);
11111
11305
  const filter = [
11112
11306
  { field: "dateWorked", op: "gte", value: iso2(fromB.ms) },
11113
11307
  { field: "dateWorked", op: "lte", value: iso2(windowToMs) }
11114
11308
  ];
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);
11309
+ if (_optionalChain([opts, 'optionalAccess', _71 => _71.posted]) === true) filter.push({ field: "postedDate", op: "exist" });
11310
+ else if (_optionalChain([opts, 'optionalAccess', _72 => _72.posted]) === false) filter.push({ field: "postedDate", op: "notExist" });
11311
+ if (_optionalChain([opts, 'optionalAccess', _73 => _73.ticketID]) !== void 0) filter.push({ field: "ticketID", op: "eq", value: opts.ticketID });
11312
+ if (_optionalChain([opts, 'optionalAccess', _74 => _74.resourceID]) !== void 0) filter.push({ field: "resourceID", op: "eq", value: opts.resourceID });
11313
+ const { items, hasMore } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess', _75 => _75.limit])), OP2, http);
11120
11314
  let postedCount = 0;
11121
11315
  for (const item of items) {
11122
11316
  const postedDate = item.postedDate;
@@ -11172,13 +11366,13 @@ var LINKAGE_OWNED_FIELDS = /* @__PURE__ */ new Set([
11172
11366
  "roleID"
11173
11367
  ]);
11174
11368
  var TIME_WINDOW_FIELDS = /* @__PURE__ */ new Set(["dateWorked", "startDateTime", "endDateTime", "hoursWorked"]);
11175
- var ResourceInvalidError = class extends _chunk5N6DYKXOcjs.AutotaskError {
11369
+ var ResourceInvalidError = class extends _chunkKB2ANVVRcjs.AutotaskError {
11176
11370
  constructor(message, options = {}) {
11177
11371
  super(message, { code: "RESOURCE_INVALID", category: "validation", ...options });
11178
11372
  this.name = "ResourceInvalidError";
11179
11373
  }
11180
11374
  };
11181
- var AllocationCodeError = class extends _chunk5N6DYKXOcjs.AutotaskError {
11375
+ var AllocationCodeError = class extends _chunkKB2ANVVRcjs.AutotaskError {
11182
11376
  /** The failure kind (the machine code is `ALLOCATION_CODE_<KIND>`). */
11183
11377
 
11184
11378
  constructor(kind, message, options = {}) {
@@ -11187,7 +11381,7 @@ var AllocationCodeError = class extends _chunk5N6DYKXOcjs.AutotaskError {
11187
11381
  this.kind = kind;
11188
11382
  }
11189
11383
  };
11190
- var NoApplicableAllocationCodeError = class extends _chunk5N6DYKXOcjs.AutotaskError {
11384
+ var NoApplicableAllocationCodeError = class extends _chunkKB2ANVVRcjs.AutotaskError {
11191
11385
  /** The structured blocker details (filters tried + department sets). */
11192
11386
 
11193
11387
  constructor(details, options = {}) {
@@ -11213,7 +11407,7 @@ async function boundedQuery(http, path, filter, totalCap, operation) {
11213
11407
  let pages = 0;
11214
11408
  for (; ; ) {
11215
11409
  if (pages >= PAGE_GUARD) {
11216
- throw new (0, _chunk5N6DYKXOcjs.AutotaskError)(`createForResource: the ${path} walk hit the ${PAGE_GUARD}-page guard`, {
11410
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskError)(`createForResource: the ${path} walk hit the ${PAGE_GUARD}-page guard`, {
11217
11411
  code: "RESOLUTION_TRUNCATED",
11218
11412
  category: "resolution",
11219
11413
  operation,
@@ -11224,11 +11418,11 @@ async function boundedQuery(http, path, filter, totalCap, operation) {
11224
11418
  const res = await http.request({
11225
11419
  method: "POST",
11226
11420
  idempotent: true,
11227
- path: isFirst ? path : _chunk5N6DYKXOcjs.cursorToPath.call(void 0, http.baseUrl, cursor),
11421
+ path: isFirst ? path : _chunkKB2ANVVRcjs.cursorToPath.call(void 0, http.baseUrl, cursor),
11228
11422
  body: { MaxRecords: pageSize, filter },
11229
11423
  operation
11230
11424
  });
11231
- const { items: pageItems, pageDetails } = _chunk5N6DYKXOcjs.unwrapItems.call(void 0, res, operation);
11425
+ const { items: pageItems, pageDetails } = _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res, operation);
11232
11426
  items.push(...pageItems);
11233
11427
  pages += 1;
11234
11428
  if (items.length >= totalCap) break;
@@ -11341,8 +11535,8 @@ function windowDefaults(params) {
11341
11535
  };
11342
11536
  }
11343
11537
  async function createForResource(resource, resourceID, params, opts = {}, http) {
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;
11538
+ const rid = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, resourceID, "resourceID");
11539
+ const pin = (value, label) => typeof value === "number" ? _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, value, label) : void 0;
11346
11540
  const pins = {
11347
11541
  code: pin(params.internallAllocationCodeID, "internallAllocationCodeID"),
11348
11542
  ticket: pin(params.ticketID, "ticketID"),
@@ -11351,19 +11545,19 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
11351
11545
  };
11352
11546
  const pinCount = [pins.code, pins.ticket, pins.task].filter((v) => v !== void 0).length;
11353
11547
  if (pinCount > 1) {
11354
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
11548
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
11355
11549
  "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)",
11356
11550
  { operation: OP }
11357
11551
  );
11358
11552
  }
11359
11553
  if (pins.role !== void 0 && pins.code !== void 0) {
11360
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
11554
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
11361
11555
  "createForResource: a pinned roleID is only meaningful with the task/ticket linkage (internallAllocationCodeID pins the internal linkage and owns the code) \u2014 drop one",
11362
11556
  { operation: OP }
11363
11557
  );
11364
11558
  }
11365
11559
  if (params.hoursWorked !== void 0 && (typeof params.hoursWorked !== "number" || !Number.isFinite(params.hoursWorked) || params.hoursWorked <= 0)) {
11366
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)(
11560
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(
11367
11561
  `createForResource: hoursWorked must be a positive finite number (got ${String(params.hoursWorked)})`,
11368
11562
  { operation: OP }
11369
11563
  );
@@ -11440,7 +11634,7 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
11440
11634
  if (usedLinkage === "internal" && linkage === "task") {
11441
11635
  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).");
11442
11636
  }
11443
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0,
11637
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0,
11444
11638
  {
11445
11639
  operation: OP,
11446
11640
  method: "POST",
@@ -11479,7 +11673,7 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
11479
11673
  };
11480
11674
  } catch (err) {
11481
11675
  lastError = err;
11482
- const text = _chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) ? `${_nullishCoalesce(_chunk5N6DYKXOcjs.formatVendorDetail.call(void 0, err.vendorError), () => ( ""))} ${err.message}` : "";
11676
+ const text = _chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) ? `${_nullishCoalesce(_chunkKB2ANVVRcjs.formatVendorDetail.call(void 0, err.vendorError), () => ( ""))} ${err.message}` : "";
11483
11677
  const gate3 = ROLE_REJECTION_PATTERN.test(text);
11484
11678
  if (usedLinkage !== "internal" && gate3) {
11485
11679
  if (!taskRoleFetched && usedLinkage === "task" && pins.task !== void 0) {
@@ -11499,14 +11693,14 @@ async function createForResource(resource, resourceID, params, opts = {}, http)
11499
11693
  throw err;
11500
11694
  }
11501
11695
  }
11502
- if (_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, lastError)) {
11696
+ if (_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, lastError)) {
11503
11697
  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.`;
11504
11698
  }
11505
11699
  throw lastError;
11506
11700
  }
11507
11701
  function discoveryField(err, body, defaults) {
11508
- if (!_chunk5N6DYKXOcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
11509
- const entries = _chunk5N6DYKXOcjs.parseVendorErrors.call(void 0, err.vendorError);
11702
+ if (!_chunkKB2ANVVRcjs.isAutotaskError.call(void 0, err) || err.vendorError === void 0) return null;
11703
+ const entries = _chunkKB2ANVVRcjs.parseVendorErrors.call(void 0, err.vendorError);
11510
11704
  if (entries === void 0) return null;
11511
11705
  for (const entry of entries) {
11512
11706
  const field = entry.field;
@@ -11519,7 +11713,7 @@ function discoveryField(err, body, defaults) {
11519
11713
  }
11520
11714
 
11521
11715
  // src/resources/time_entries.ts
11522
- var TimeEntriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11716
+ var TimeEntriesResource = class extends _chunkKB2ANVVRcjs.BaseResource {
11523
11717
  constructor(http, pageSize) {
11524
11718
  super(http, {
11525
11719
  key: "time_entries",
@@ -11656,7 +11850,7 @@ var TimeEntriesResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11656
11850
  };
11657
11851
 
11658
11852
  // src/resources/time_entry_attachments.ts
11659
- var TimeEntryAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11853
+ var TimeEntryAttachmentsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
11660
11854
  constructor(http, pageSize) {
11661
11855
  super(http, {
11662
11856
  key: "time_entry_attachments",
@@ -11719,9 +11913,9 @@ var TimeEntryAttachmentsResource = class extends _chunk5N6DYKXOcjs.BaseResource
11719
11913
 
11720
11914
  // src/resources/special/time_off_requests.ts
11721
11915
  async function approve(_resource, id, opts = {}, http) {
11722
- const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
11916
+ const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
11723
11917
  if (opts.dryRun === true) {
11724
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
11918
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
11725
11919
  operation: "time_off_requests.approve",
11726
11920
  method: "GET",
11727
11921
  path: `/V1.0/TimeOffRequests/${numericId}/Approve`,
@@ -11736,16 +11930,16 @@ async function approve(_resource, id, opts = {}, http) {
11736
11930
  path: `/V1.0/TimeOffRequests/${numericId}/Approve`,
11737
11931
  operation: "time_off_requests.approve"
11738
11932
  });
11739
- return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
11933
+ return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
11740
11934
  }
11741
11935
  async function reject(_resource, id, reason, opts = {}, http) {
11742
- const numericId = _chunk5N6DYKXOcjs.parseIdentifier.call(void 0, id, "id");
11936
+ const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
11743
11937
  const text = reason.trim();
11744
11938
  if (text === "") {
11745
- throw new (0, _chunk5N6DYKXOcjs.AutotaskConfigError)("reject: a non-empty reason is required (vendor TimeOffRequestRejectModel)");
11939
+ throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("reject: a non-empty reason is required (vendor TimeOffRequestRejectModel)");
11746
11940
  }
11747
11941
  if (opts.dryRun === true) {
11748
- return _chunk5N6DYKXOcjs.buildDryRunResult.call(void 0, {
11942
+ return _chunkKB2ANVVRcjs.buildDryRunResult.call(void 0, {
11749
11943
  operation: "time_off_requests.reject",
11750
11944
  method: "POST",
11751
11945
  path: `/V1.0/TimeOffRequests/${numericId}/Reject`,
@@ -11762,11 +11956,11 @@ async function reject(_resource, id, reason, opts = {}, http) {
11762
11956
  body: { timeOffRequestID: numericId, reason: text },
11763
11957
  operation: "time_off_requests.reject"
11764
11958
  });
11765
- return _chunk5N6DYKXOcjs.unwrapOperation.call(void 0, res);
11959
+ return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
11766
11960
  }
11767
11961
 
11768
11962
  // src/resources/time_off_requests.ts
11769
- var TimeOffRequestsResource = class extends _chunk5N6DYKXOcjs.BaseResource {
11963
+ var TimeOffRequestsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
11770
11964
  constructor(http, pageSize) {
11771
11965
  super(http, {
11772
11966
  key: "time_off_requests",