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.
- package/MCP_TOOL_CATALOG.json +4 -3
- package/MCP_TOOL_MANIFEST.md +5 -5
- package/N8N_MCP_MANIFEST.json +2 -2
- package/N8N_MCP_MANIFEST.md +3 -3
- package/capabilities.json +1238 -1237
- package/dist/capabilities.cjs +2 -2
- package/dist/capabilities.js +1 -1
- package/dist/{chunk-SRJI5XUZ.cjs → chunk-CJA6L6NR.cjs} +135 -135
- package/dist/{chunk-JKZVCFRY.cjs → chunk-CXXNONRP.cjs} +1237 -1236
- package/dist/{chunk-3WIDDEHP.js → chunk-DDZXN6LN.js} +2 -2
- package/dist/{chunk-GD4JRPYF.js → chunk-IKJLIDK3.js} +1 -1
- package/dist/{chunk-5N6DYKXO.cjs → chunk-KB2ANVVR.cjs} +2 -2
- package/dist/{chunk-TELBX6HK.cjs → chunk-MTDCLVQQ.cjs} +797 -603
- package/dist/{chunk-4A6XLQHE.js → chunk-OZD5FQM4.js} +1237 -1236
- package/dist/{chunk-MY7ZSXY3.js → chunk-Y6O5VVQ4.js} +387 -193
- package/dist/{index-D8I6taEo.d.cts → index-DbMKWnEX.d.cts} +96 -35
- package/dist/{index-uAxAcRol.d.ts → index-TuqNq3Ro.d.ts} +96 -35
- package/dist/index.cjs +19 -19
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -4
- package/dist/operations/index.cjs +103 -103
- package/dist/operations/index.d.cts +2 -2
- package/dist/operations/index.d.ts +2 -2
- package/dist/operations/index.js +2 -2
- package/dist/pool.cjs +8 -8
- package/dist/pool.d.cts +1 -1
- package/dist/pool.d.ts +1 -1
- package/dist/pool.js +4 -4
- package/dist/resources/index.cjs +4 -4
- package/dist/resources/index.d.cts +1 -1
- package/dist/resources/index.d.ts +1 -1
- package/dist/resources/index.js +3 -3
- package/docs/API.md +190 -51
- 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
|
|
36
|
+
var _chunkKB2ANVVRcjs = require('./chunk-KB2ANVVR.cjs');
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
var
|
|
39
|
+
var _chunkCXXNONRPcjs = require('./chunk-CXXNONRP.cjs');
|
|
40
40
|
|
|
41
41
|
// src/resources/appointments.ts
|
|
42
|
-
var AppointmentsResource = class extends
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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:
|
|
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 } =
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
960
|
-
const limit = opts.limit === void 0 ? 25 :
|
|
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:
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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 (!
|
|
1126
|
-
const named = (_nullishCoalesce(
|
|
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 =
|
|
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,
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|
1252
|
+
const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
|
|
1253
1253
|
const companyRow = { ...company };
|
|
1254
|
-
|
|
1255
|
-
|
|
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
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
for (const f of
|
|
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
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
1351
|
+
_chunkKB2ANVVRcjs.parseIdentifier.call(void 0, opts.invoiceId, "opts.invoiceId");
|
|
1352
1352
|
} catch (err) {
|
|
1353
|
-
problems.push(err instanceof
|
|
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
|
-
|
|
1363
|
+
_chunkKB2ANVVRcjs.parseIdentifier.call(void 0, tid, `opts.ticketIds[${i}]`);
|
|
1364
1364
|
} catch (err) {
|
|
1365
|
-
problems.push(err instanceof
|
|
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
|
-
|
|
1371
|
+
_chunkKB2ANVVRcjs.parseIdentifier.call(void 0, companyId, "companyId");
|
|
1372
1372
|
} catch (err) {
|
|
1373
|
-
problems.push(err instanceof
|
|
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,
|
|
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 } =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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] =
|
|
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(
|
|
1518
|
-
[billingItems, billingNoteCharsTruncated] =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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 =
|
|
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,
|
|
2426
|
+
throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("moveConfigurationItem: destinationCompanyId is required");
|
|
2427
2427
|
}
|
|
2428
|
-
const destId =
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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([
|
|
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 =
|
|
2564
|
+
const builder = _chunkKB2ANVVRcjs.createNamePlan.call(void 0, );
|
|
2565
2565
|
builder.addFk("contract", root["contractID"]);
|
|
2566
|
-
const names = await
|
|
2566
|
+
const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
|
|
2567
2567
|
const ciRow = { ...ci };
|
|
2568
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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 =
|
|
3016
|
-
const destId =
|
|
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,
|
|
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,
|
|
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 =
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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 =
|
|
3128
|
+
const cid = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, companyID, "companyID");
|
|
3129
3129
|
if (typeof email !== "string" || !EMAIL_SHAPE.test(email)) {
|
|
3130
|
-
throw new (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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 (!
|
|
3221
|
-
const named = (_nullishCoalesce(
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
4605
|
-
const
|
|
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
|
-
|
|
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,
|
|
4619
|
-
`profitability: 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
|
-
|
|
4768
|
+
_chunkKB2ANVVRcjs.parseIdentifier.call(void 0, contractId, "contractId");
|
|
4696
4769
|
} catch (err) {
|
|
4697
|
-
problems.push(err instanceof
|
|
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,
|
|
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 } =
|
|
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 +=
|
|
4745
|
-
const chunk = unique.slice(c, c +
|
|
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:
|
|
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 } =
|
|
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
|
|
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,
|
|
4844
|
+
byKey.set(k, _chunkKB2ANVVRcjs.unwrapItem.call(void 0, res, k, operation));
|
|
4771
4845
|
} catch (err) {
|
|
4772
|
-
if (err instanceof
|
|
4846
|
+
if (err instanceof _chunkKB2ANVVRcjs.NotFoundError) {
|
|
4773
4847
|
misses.push({ id: k, code: "NOT_FOUND", message: err.message });
|
|
4774
|
-
} else if (err instanceof
|
|
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: "
|
|
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,
|
|
4908
|
-
const v = validateProfitabilityOptions(contractId,
|
|
4989
|
+
async function profitability(resource, contractId, opts, rawHttp) {
|
|
4990
|
+
const v = validateProfitabilityOptions(contractId, opts);
|
|
4909
4991
|
const OP2 = "contracts.profitability";
|
|
4910
|
-
const id =
|
|
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([
|
|
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 =
|
|
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
|
|
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
|
|
4951
|
-
|
|
4952
|
-
const
|
|
4953
|
-
const
|
|
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 },
|
|
4960
|
-
const raw = await
|
|
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
|
|
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
|
|
4972
|
-
|
|
4973
|
-
|
|
4974
|
-
|
|
4975
|
-
|
|
4976
|
-
|
|
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
|
|
4985
|
-
|
|
4986
|
-
|
|
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,
|
|
4995
|
-
if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `invoiceJoinTruncated: the join set is capped at ${
|
|
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 =
|
|
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
|
|
5004
|
-
|
|
5005
|
-
|
|
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
|
|
5018
|
-
const
|
|
5019
|
-
|
|
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
|
|
5024
|
-
|
|
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((
|
|
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
|
-
|
|
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
|
|
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,
|
|
5062
|
-
if (capped.truncated) wires.note = (wires.note ? wires.note + " | " : "") + `resourceJoinTruncated: the join set is capped at ${
|
|
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
|
|
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 },
|
|
5082
|
-
const raw = await
|
|
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
|
-
|
|
5096
|
-
{ field: "dateWorked", op: "lte", value: v.dateTo }
|
|
5201
|
+
...windowOn("dateWorked")
|
|
5097
5202
|
];
|
|
5098
|
-
const raw = await
|
|
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: "
|
|
5112
|
-
const raw = await
|
|
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),
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
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
|
|
5181
|
-
|
|
5182
|
-
|
|
5183
|
-
|
|
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 +=
|
|
5201
|
-
for (const u of
|
|
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
|
-
|
|
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
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
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 +=
|
|
5219
|
-
|
|
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 -
|
|
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 +=
|
|
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
|
-
|
|
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
|
-
|
|
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["
|
|
5253
|
-
const totalCost = labourTotal +
|
|
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
|
|
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
|
|
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
|
-
|
|
5263
|
-
|
|
5264
|
-
|
|
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) ?
|
|
5338
|
-
const cB = inMonth(c["datePurchased"], mB) ?
|
|
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
|
|
5342
|
-
const cA =
|
|
5343
|
-
const cB =
|
|
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 (
|
|
5353
|
-
const
|
|
5354
|
-
|
|
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
|
|
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["
|
|
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 +
|
|
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 +
|
|
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
|
|
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"] === "
|
|
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
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
const
|
|
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:
|
|
5544
|
-
label: `
|
|
5545
|
-
date:
|
|
5546
|
-
detail: `${fmtHours(
|
|
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: "
|
|
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
|
-
|
|
5589
|
-
|
|
5590
|
-
|
|
5591
|
-
|
|
5592
|
-
|
|
5593
|
-
|
|
5594
|
-
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5598
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
6484
|
+
return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
|
|
6291
6485
|
}
|
|
6292
6486
|
|
|
6293
6487
|
// src/resources/inventory_products.ts
|
|
6294
|
-
var InventoryProductsResource = class extends
|
|
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 =
|
|
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,
|
|
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 =
|
|
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
|
|
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',
|
|
6403
|
-
const tz = _optionalChain([opts, 'optionalAccess',
|
|
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',
|
|
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',
|
|
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',
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
7371
|
+
const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, this.http, builder.plan(), { maxNameReads: opts.maxNameReads });
|
|
7178
7372
|
const row = { ...project };
|
|
7179
|
-
|
|
7180
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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 =
|
|
8017
|
+
const id = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, raw, `${label} id`);
|
|
7824
8018
|
if (typeof id === "number" && id < 1) {
|
|
7825
|
-
throw new (0,
|
|
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,
|
|
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 =
|
|
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,
|
|
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 =
|
|
8049
|
+
const destination = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, destinationResourceId, "destinationResourceId");
|
|
7856
8050
|
if (typeof destination === "number" && destination < 1) {
|
|
7857
|
-
throw new (0,
|
|
8051
|
+
throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)("transferOwnership: destinationResourceId must be a positive integer");
|
|
7858
8052
|
}
|
|
7859
|
-
const dryRun = _nullishCoalesce(_optionalChain([opts, 'optionalAccess',
|
|
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 =
|
|
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
|
-
|
|
8073
|
+
_chunkKB2ANVVRcjs.unwrapOperation.call(void 0, update);
|
|
7880
8074
|
applied.push(id);
|
|
7881
8075
|
}
|
|
7882
8076
|
} catch (err) {
|
|
7883
|
-
if (!dryRun && err instanceof
|
|
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
|
-
...
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
8293
|
+
const numericResource = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, resourceId, "resourceId");
|
|
8100
8294
|
if (!Number.isSafeInteger(year) || year < 1) {
|
|
8101
|
-
throw new (0,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
9885
|
+
const n = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, documentID, "documentID");
|
|
9692
9886
|
if (opts.dryRun === true) {
|
|
9693
|
-
return
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
10236
|
+
return _chunkKB2ANVVRcjs.unwrapItems.call(void 0, res).items;
|
|
10043
10237
|
}
|
|
10044
10238
|
function isRouteUnavailable(err) {
|
|
10045
|
-
return
|
|
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:
|
|
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
|
|
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 =
|
|
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([
|
|
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 } =
|
|
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 =
|
|
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 =
|
|
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,
|
|
10363
|
+
throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`summaryTextLimit must be an integer >= 1 (got ${String(opts.summaryTextLimit)})`);
|
|
10170
10364
|
}
|
|
10171
|
-
const ticketId =
|
|
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,
|
|
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,
|
|
10396
|
+
throw new (0, _chunkKB2ANVVRcjs.AutotaskConfigError)(`textLimit must be an integer >= 1 (got ${String(opts.textLimit)})`);
|
|
10203
10397
|
}
|
|
10204
|
-
const ticketId =
|
|
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 (!
|
|
10292
|
-
const entries = _nullishCoalesce(
|
|
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
|
|
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 (!
|
|
10320
|
-
const entries =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
10369
|
-
const title = _optionalChain([params, 'optionalAccess',
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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 :
|
|
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,
|
|
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',
|
|
10596
|
+
const roleID = _optionalChain([assign, 'optionalAccess', _56 => _56.roleID]);
|
|
10403
10597
|
if (assign !== void 0 && !isPositiveInt(roleID)) {
|
|
10404
|
-
throw new (0,
|
|
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
|
|
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:
|
|
10482
|
-
vendorError:
|
|
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:
|
|
10498
|
-
vendorError:
|
|
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,
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
10781
|
+
const ticketId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
|
|
10588
10782
|
if (!isPositiveInt(targetStatus)) {
|
|
10589
|
-
throw new (0,
|
|
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 (!
|
|
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',
|
|
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 (!
|
|
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,
|
|
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,
|
|
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
|
|
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',
|
|
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
|
|
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',
|
|
10705
|
-
const body =
|
|
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:
|
|
10730
|
-
vendorError:
|
|
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,
|
|
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,
|
|
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,
|
|
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 =
|
|
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 =
|
|
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
|
|
11043
|
+
const names = await _chunkKB2ANVVRcjs.resolveCompositeNames.call(void 0, http, builder.plan(), { maxNameReads: opts.maxNameReads });
|
|
10850
11044
|
const ticketRow = { ...ctx.ticket };
|
|
10851
|
-
|
|
10852
|
-
|
|
10853
|
-
|
|
10854
|
-
|
|
10855
|
-
for (const f of
|
|
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
|
-
|
|
10860
|
-
|
|
10861
|
-
|
|
10862
|
-
|
|
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
|
|
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
|
|
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 } =
|
|
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',
|
|
11069
|
-
const tz = _optionalChain([opts, 'optionalAccess',
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
11116
|
-
else if (_optionalChain([opts, 'optionalAccess',
|
|
11117
|
-
if (_optionalChain([opts, 'optionalAccess',
|
|
11118
|
-
if (_optionalChain([opts, 'optionalAccess',
|
|
11119
|
-
const { items, hasMore } = await queryTimeEntries(_resource, filter, clampWindowLimit(_optionalChain([opts, 'optionalAccess',
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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 :
|
|
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 } =
|
|
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 =
|
|
11345
|
-
const pin = (value, label) => typeof value === "number" ?
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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 =
|
|
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 (
|
|
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 (!
|
|
11509
|
-
const entries =
|
|
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
|
|
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
|
|
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 =
|
|
11916
|
+
const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
|
|
11723
11917
|
if (opts.dryRun === true) {
|
|
11724
|
-
return
|
|
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
|
|
11933
|
+
return _chunkKB2ANVVRcjs.unwrapOperation.call(void 0, res);
|
|
11740
11934
|
}
|
|
11741
11935
|
async function reject(_resource, id, reason, opts = {}, http) {
|
|
11742
|
-
const numericId =
|
|
11936
|
+
const numericId = _chunkKB2ANVVRcjs.parseIdentifier.call(void 0, id, "id");
|
|
11743
11937
|
const text = reason.trim();
|
|
11744
11938
|
if (text === "") {
|
|
11745
|
-
throw new (0,
|
|
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
|
|
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
|
|
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
|
|
11963
|
+
var TimeOffRequestsResource = class extends _chunkKB2ANVVRcjs.BaseResource {
|
|
11770
11964
|
constructor(http, pageSize) {
|
|
11771
11965
|
super(http, {
|
|
11772
11966
|
key: "time_off_requests",
|