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