@lilaquadrat/studio 12.2.0 → 13.0.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/lib/src/helpers/shiftPlanAllocation.d.ts +53 -0
- package/lib/src/helpers/shiftPlanAllocation.js +110 -0
- package/lib/src/helpers/shiftPlanAllocation.js.map +1 -0
- package/lib/src/helpers/shiftPlanCoverage.d.ts +2 -0
- package/lib/src/helpers/shiftPlanCoverage.js +4 -0
- package/lib/src/helpers/shiftPlanCoverage.js.map +1 -0
- package/lib/src/helpers/shiftPlanningTime.js +26 -2
- package/lib/src/helpers/shiftPlanningTime.js.map +1 -1
- package/lib/src/helpers/shiftPlanningValidation.d.ts +8 -2
- package/lib/src/helpers/shiftPlanningValidation.js +16 -0
- package/lib/src/helpers/shiftPlanningValidation.js.map +1 -1
- package/lib/src/helpers/structureMatch.js +3 -1
- package/lib/src/helpers/structureMatch.js.map +1 -1
- package/lib/src/interfaces/ListPlanningParticipant.d.ts +17 -0
- package/lib/src/interfaces/ListPlanningParticipant.js +2 -0
- package/lib/src/interfaces/ListPlanningParticipant.js.map +1 -0
- package/lib/src/interfaces/PlanCoveragePreparation.d.ts +17 -0
- package/lib/src/interfaces/PlanCoveragePreparation.js +2 -0
- package/lib/src/interfaces/PlanCoveragePreparation.js.map +1 -0
- package/lib/src/interfaces/PlanningParticipantsResult.d.ts +12 -0
- package/lib/src/interfaces/PlanningParticipantsResult.js +2 -0
- package/lib/src/interfaces/PlanningParticipantsResult.js.map +1 -0
- package/lib/src/interfaces/ShiftAutofillResult.d.ts +6 -0
- package/lib/src/interfaces/ShiftAutofillResult.js +2 -0
- package/lib/src/interfaces/ShiftAutofillResult.js.map +1 -0
- package/lib/src/interfaces/ShiftReportContextOptions.d.ts +9 -0
- package/lib/src/interfaces/ShiftReportContextOptions.js +2 -0
- package/lib/src/interfaces/ShiftReportContextOptions.js.map +1 -0
- package/lib/src/models/lists.model.js +2 -1
- package/lib/src/models/lists.model.js.map +1 -1
- package/lib/src/services/customers.service.d.ts +2 -2
- package/lib/src/services/customers.service.js +2 -2
- package/lib/src/services/customers.service.js.map +1 -1
- package/lib/src/services/listParticipants.service.d.ts +45 -8
- package/lib/src/services/listParticipants.service.js +320 -39
- package/lib/src/services/listParticipants.service.js.map +1 -1
- package/lib/src/services/lists.service.d.ts +2 -0
- package/lib/src/services/lists.service.js +28 -1
- package/lib/src/services/lists.service.js.map +1 -1
- package/lib/src/services/shiftPlanDays.service.d.ts +2 -0
- package/lib/src/services/shiftPlanDays.service.js +12 -0
- package/lib/src/services/shiftPlanDays.service.js.map +1 -1
- package/lib/src/services/shiftPlans.service.d.ts +2 -2
- package/lib/src/services/shiftPlans.service.js +67 -9
- package/lib/src/services/shiftPlans.service.js.map +1 -1
- package/lib/src/services/shifts.service.d.ts +20 -1
- package/lib/src/services/shifts.service.js +180 -26
- package/lib/src/services/shifts.service.js.map +1 -1
- package/lib/tests/listParticipantsPlanning.spec.js +406 -10
- package/lib/tests/listParticipantsPlanning.spec.js.map +1 -1
- package/lib/tests/listsServiceCreateExternalProducts.spec.js +18 -0
- package/lib/tests/listsServiceCreateExternalProducts.spec.js.map +1 -1
- package/lib/tests/shiftPlanCoverage.spec.d.ts +1 -0
- package/lib/tests/shiftPlanCoverage.spec.js +189 -0
- package/lib/tests/shiftPlanCoverage.spec.js.map +1 -0
- package/lib/tests/shiftPlanning.spec.js +430 -38
- package/lib/tests/shiftPlanning.spec.js.map +1 -1
- package/lib/tests/shiftPlanningTime.spec.d.ts +1 -0
- package/lib/tests/shiftPlanningTime.spec.js +90 -0
- package/lib/tests/shiftPlanningTime.spec.js.map +1 -0
- package/lib/tests/shiftPlansList.spec.d.ts +1 -0
- package/lib/tests/shiftPlansList.spec.js +161 -0
- package/lib/tests/shiftPlansList.spec.js.map +1 -0
- package/lib/tests/structureMatch.spec.js +42 -0
- package/lib/tests/structureMatch.spec.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ObjectId, WithId } from 'mongodb';
|
|
2
|
+
import type { Shift, ShiftAssignmentBreak, ShiftCoverage, ShiftReportContext, StructureCondition } from '@lilaquadrat/interfaces';
|
|
3
|
+
export interface ShiftFillCandidate {
|
|
4
|
+
participant: ObjectId;
|
|
5
|
+
customer: ObjectId;
|
|
6
|
+
/** The candidate fulfils the shift's required/forbidden constraints. */
|
|
7
|
+
matching: boolean;
|
|
8
|
+
/** Absolute break times to carry into the assignment; coverage leaves them to the planner. */
|
|
9
|
+
breaks?: ShiftAssignmentBreak[];
|
|
10
|
+
}
|
|
11
|
+
export interface ShiftFillTarget {
|
|
12
|
+
shift: WithId<Shift>;
|
|
13
|
+
conditions: StructureCondition[];
|
|
14
|
+
/** Ranked pool; unfit candidates are last but may still fill a shift as a fallback. */
|
|
15
|
+
candidates: ShiftFillCandidate[];
|
|
16
|
+
}
|
|
17
|
+
export interface ShiftFillPolicy {
|
|
18
|
+
/** Use matching people as the target instead of total staffing headcount. */
|
|
19
|
+
matchingGate: boolean;
|
|
20
|
+
/** Treat break-rule violations as blocking; coverage leaves breaks to the planner. */
|
|
21
|
+
breaksBlocking: boolean;
|
|
22
|
+
/** Stop at the first shift that cannot be filled. */
|
|
23
|
+
stopOnUnfillable: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface ShiftFillResult {
|
|
26
|
+
coverage: ShiftCoverage[];
|
|
27
|
+
fillable: boolean;
|
|
28
|
+
/** False when stop-on-unfillable ended the run before every target was evaluated. */
|
|
29
|
+
complete: boolean;
|
|
30
|
+
/** The targets after allocation; unchanged shifts keep their persisted assignments. */
|
|
31
|
+
shifts: WithId<Shift>[];
|
|
32
|
+
}
|
|
33
|
+
/** Coverage only needs the counts; kept so existing callers and types stay unchanged. */
|
|
34
|
+
export interface CoverageAllocation {
|
|
35
|
+
coverage: ShiftCoverage[];
|
|
36
|
+
fillable: boolean;
|
|
37
|
+
complete: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Fills every target shift greedily in start order, keeping one shared in-memory schedule so a person
|
|
41
|
+
* already used in a colliding shift cannot be picked again. Only the supplied schedules are compared;
|
|
42
|
+
* callers decide the conflict scope (the plan's own shifts or the wider neighbourhood).
|
|
43
|
+
*
|
|
44
|
+
* Rule checks stay local to the candidate's customer: adding an assignment cannot change another
|
|
45
|
+
* person's hours, and shifts without that customer cannot conflict. This keeps the work per candidate
|
|
46
|
+
* proportional to that person's shifts instead of the whole set.
|
|
47
|
+
*
|
|
48
|
+
* The policy decides whether matching people or total headcount is the target, whether break violations block, and
|
|
49
|
+
* whether an unfillable shift ends the run.
|
|
50
|
+
*/
|
|
51
|
+
export declare function allocateShiftFills(schedules: WithId<Shift>[], targets: ShiftFillTarget[], context: Omit<ShiftReportContext, 'schedules'>, policy: ShiftFillPolicy): ShiftFillResult;
|
|
52
|
+
/** Lists retain matching-based coverage; the shifts overview only requires staffing headcount. */
|
|
53
|
+
export declare function allocateShiftCoverage(schedules: WithId<Shift>[], targets: ShiftFillTarget[], context: Omit<ShiftReportContext, 'schedules'>, stopOnUnfillable?: boolean, coverageMode?: 'staffing' | 'matching'): CoverageAllocation;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { reportShift } from './shiftPlanningReports.js';
|
|
2
|
+
import { newScheduleViolations } from './shiftPlanningValidation.js';
|
|
3
|
+
import { structureScore } from './structureMatch.js';
|
|
4
|
+
function evidenceOf(schedules, context, evidence) {
|
|
5
|
+
return schedules.map((shift) => reportShift(shift, context, false, evidence));
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Fills every target shift greedily in start order, keeping one shared in-memory schedule so a person
|
|
9
|
+
* already used in a colliding shift cannot be picked again. Only the supplied schedules are compared;
|
|
10
|
+
* callers decide the conflict scope (the plan's own shifts or the wider neighbourhood).
|
|
11
|
+
*
|
|
12
|
+
* Rule checks stay local to the candidate's customer: adding an assignment cannot change another
|
|
13
|
+
* person's hours, and shifts without that customer cannot conflict. This keeps the work per candidate
|
|
14
|
+
* proportional to that person's shifts instead of the whole set.
|
|
15
|
+
*
|
|
16
|
+
* The policy decides whether matching people or total headcount is the target, whether break violations block, and
|
|
17
|
+
* whether an unfillable shift ends the run.
|
|
18
|
+
*/
|
|
19
|
+
export function allocateShiftFills(schedules, targets, context, policy) {
|
|
20
|
+
const liveById = new Map(schedules.map((shift) => [shift._id.toHexString(), shift]));
|
|
21
|
+
const shiftsByCustomer = new Map();
|
|
22
|
+
const index = (customer, shift) => {
|
|
23
|
+
const hex = customer.toHexString();
|
|
24
|
+
const ids = shiftsByCustomer.get(hex) ?? new Set();
|
|
25
|
+
ids.add(shift.toHexString());
|
|
26
|
+
shiftsByCustomer.set(hex, ids);
|
|
27
|
+
};
|
|
28
|
+
for (const shift of schedules)
|
|
29
|
+
for (const assignment of shift.assignments)
|
|
30
|
+
index(assignment.customer, shift._id);
|
|
31
|
+
const customerSchedules = (customer) => [...(shiftsByCustomer.get(customer.toHexString()) ?? [])]
|
|
32
|
+
.map((id) => liveById.get(id)).filter((shift) => shift !== undefined);
|
|
33
|
+
const baselineByCustomer = new Map();
|
|
34
|
+
const detailsByParticipant = new Map(context.participantDetails.map((entry) => [entry._id.toHexString(), entry]));
|
|
35
|
+
const ordered = [...targets].sort((left, right) => left.shift.start.localeCompare(right.shift.start)
|
|
36
|
+
|| left.shift._id.toHexString().localeCompare(right.shift._id.toHexString()));
|
|
37
|
+
const coverage = [];
|
|
38
|
+
const shifts = [];
|
|
39
|
+
let fillable = true;
|
|
40
|
+
for (const target of ordered) {
|
|
41
|
+
const current = liveById.get(target.shift._id.toHexString()) ?? target.shift;
|
|
42
|
+
const requiredPeople = current.requiredPeople ?? 0;
|
|
43
|
+
const minimumMatching = current.matchingPeople ?? 0;
|
|
44
|
+
const assigned = [...current.assignments];
|
|
45
|
+
const assignedParticipants = new Set(assigned.map((assignment) => assignment.participant.toHexString()));
|
|
46
|
+
const assignedCustomers = new Set(assigned.map((assignment) => assignment.customer.toHexString()));
|
|
47
|
+
let matching = policy.matchingGate ? assigned.filter((assignment) => {
|
|
48
|
+
const detail = detailsByParticipant.get(assignment.participant.toHexString());
|
|
49
|
+
return detail !== undefined && structureScore(target.conditions, detail).state === 'fulfilled';
|
|
50
|
+
}).length : 0;
|
|
51
|
+
for (const candidate of target.candidates) {
|
|
52
|
+
if (policy.matchingGate ? matching >= minimumMatching : assigned.length >= requiredPeople)
|
|
53
|
+
break;
|
|
54
|
+
if (policy.matchingGate && !candidate.matching)
|
|
55
|
+
continue;
|
|
56
|
+
if (assignedParticipants.has(candidate.participant.toHexString()) || assignedCustomers.has(candidate.customer.toHexString()))
|
|
57
|
+
continue;
|
|
58
|
+
const assignment = { participant: candidate.participant, customer: candidate.customer, breaks: candidate.breaks ?? [] };
|
|
59
|
+
const proposed = { ...current, assignments: [...assigned, assignment] };
|
|
60
|
+
const customerHex = candidate.customer.toHexString();
|
|
61
|
+
// A customer's violations only depend on that customer's shifts, so both sides are scoped to them.
|
|
62
|
+
const others = customerSchedules(candidate.customer).filter((shift) => !shift._id.equals(proposed._id));
|
|
63
|
+
let baseline = baselineByCustomer.get(customerHex);
|
|
64
|
+
if (!baseline) {
|
|
65
|
+
baseline = new Map();
|
|
66
|
+
evidenceOf(others, { ...context, schedules: others }, baseline);
|
|
67
|
+
baselineByCustomer.set(customerHex, baseline);
|
|
68
|
+
}
|
|
69
|
+
const candidateSchedules = [...others, proposed];
|
|
70
|
+
const updatedEvidence = new Map();
|
|
71
|
+
const updated = evidenceOf(candidateSchedules, { ...context, schedules: candidateSchedules }, updatedEvidence);
|
|
72
|
+
const violations = newScheduleViolations(proposed, current, updated, baseline, updatedEvidence, !policy.breaksBlocking);
|
|
73
|
+
if (violations.length)
|
|
74
|
+
continue;
|
|
75
|
+
assigned.push(assignment);
|
|
76
|
+
assignedParticipants.add(candidate.participant.toHexString());
|
|
77
|
+
assignedCustomers.add(customerHex);
|
|
78
|
+
if (candidate.matching)
|
|
79
|
+
matching += 1;
|
|
80
|
+
liveById.set(proposed._id.toHexString(), proposed);
|
|
81
|
+
index(candidate.customer, proposed._id);
|
|
82
|
+
baselineByCustomer.delete(customerHex);
|
|
83
|
+
}
|
|
84
|
+
const entry = {
|
|
85
|
+
shift: current._id,
|
|
86
|
+
title: current.title,
|
|
87
|
+
start: current.start,
|
|
88
|
+
end: current.end,
|
|
89
|
+
requiredPeople,
|
|
90
|
+
matchingPeople: minimumMatching,
|
|
91
|
+
assigned: assigned.length,
|
|
92
|
+
...(policy.matchingGate ? { matching } : {}),
|
|
93
|
+
fillable: policy.matchingGate ? matching >= minimumMatching : assigned.length >= requiredPeople,
|
|
94
|
+
};
|
|
95
|
+
coverage.push(entry);
|
|
96
|
+
shifts.push(liveById.get(current._id.toHexString()) ?? current);
|
|
97
|
+
if (!entry.fillable) {
|
|
98
|
+
fillable = false;
|
|
99
|
+
if (policy.stopOnUnfillable)
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { coverage, fillable, complete: coverage.length === targets.length, shifts };
|
|
104
|
+
}
|
|
105
|
+
/** Lists retain matching-based coverage; the shifts overview only requires staffing headcount. */
|
|
106
|
+
export function allocateShiftCoverage(schedules, targets, context, stopOnUnfillable = false, coverageMode = 'matching') {
|
|
107
|
+
const result = allocateShiftFills(schedules, targets, context, { matchingGate: coverageMode === 'matching', breaksBlocking: false, stopOnUnfillable });
|
|
108
|
+
return { coverage: result.coverage, fillable: result.fillable, complete: result.complete };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=shiftPlanAllocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shiftPlanAllocation.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanAllocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// The allocation core moved to shiftPlanAllocation.ts so coverage and autofill share one greedy
|
|
2
|
+
// fill; this module keeps the coverage-facing names for existing imports.
|
|
3
|
+
export { allocateShiftCoverage, allocateShiftFills } from './shiftPlanAllocation.js';
|
|
4
|
+
//# sourceMappingURL=shiftPlanCoverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shiftPlanCoverage.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanCoverage.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,0EAA0E;AAC1E,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import ImmutableError from '../classes/errors/Immutable.error.js';
|
|
2
2
|
export const minuteMilliseconds = 60000;
|
|
3
3
|
export const maximumShiftMilliseconds = 7 * 24 * 60 * minuteMilliseconds;
|
|
4
|
+
// Candidate trials revisit the same instants; bounds keep reuse independent of process lifetime.
|
|
5
|
+
const formatters = new Map();
|
|
6
|
+
const partsByFormatter = new WeakMap();
|
|
7
|
+
const maximumFormatters = 16;
|
|
8
|
+
const maximumLocalParts = 4096;
|
|
4
9
|
export function planningValidation(path, message) {
|
|
5
10
|
throw new ImmutableError('VALIDATION_FAILED', [{
|
|
6
11
|
instancePath: path, schemaPath: '#/shiftPlanning', keyword: 'shiftPlanning', params: {}, message,
|
|
@@ -29,19 +34,38 @@ export function interval(start, end) {
|
|
|
29
34
|
return result;
|
|
30
35
|
}
|
|
31
36
|
export function localFormatter(timeZone) {
|
|
37
|
+
const cached = formatters.get(timeZone);
|
|
38
|
+
if (cached)
|
|
39
|
+
return cached;
|
|
32
40
|
try {
|
|
33
|
-
|
|
41
|
+
const formatter = new Intl.DateTimeFormat('en-GB', {
|
|
34
42
|
timeZone, year: 'numeric', month: '2-digit', day: '2-digit',
|
|
35
43
|
hour: '2-digit', minute: '2-digit', hourCycle: 'h23',
|
|
36
44
|
});
|
|
45
|
+
if (formatters.size >= maximumFormatters)
|
|
46
|
+
formatters.delete(formatters.keys().next().value);
|
|
47
|
+
formatters.set(timeZone, formatter);
|
|
48
|
+
return formatter;
|
|
37
49
|
}
|
|
38
50
|
catch {
|
|
39
51
|
return planningValidation('/timeZone', 'must be a valid IANA time zone');
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
function localParts(formatter, instant) {
|
|
55
|
+
let cache = partsByFormatter.get(formatter);
|
|
56
|
+
if (!cache) {
|
|
57
|
+
cache = new Map();
|
|
58
|
+
partsByFormatter.set(formatter, cache);
|
|
59
|
+
}
|
|
60
|
+
const cached = cache.get(instant);
|
|
61
|
+
if (cached)
|
|
62
|
+
return cached;
|
|
43
63
|
const parts = Object.fromEntries(formatter.formatToParts(instant).map((part) => [part.type, part.value]));
|
|
44
|
-
|
|
64
|
+
const result = { date: `${parts.year.padStart(4, '0')}-${parts.month}-${parts.day}`, clock: `${parts.hour}:${parts.minute}` };
|
|
65
|
+
if (cache.size >= maximumLocalParts)
|
|
66
|
+
cache.delete(cache.keys().next().value);
|
|
67
|
+
cache.set(instant, result);
|
|
68
|
+
return result;
|
|
45
69
|
}
|
|
46
70
|
export function localDate(instant, timeZone) {
|
|
47
71
|
return localParts(localFormatter(timeZone), Date.parse(instant)).date;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shiftPlanningTime.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanningTime.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,MAAM,sCAAsC,CAAC;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IAE9D,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAC7C,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO;SACjG,CAAC,CAAC,CAAC;AAEN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,kBAAkB,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,kBAAkB,CAAC,EAAE,EAAE,yCAAyC,CAAC,CAAC;IACnG,OAAO,UAAU,CAAC;AAEpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IAEzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;IAC/C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;WACpE,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK;QAAE,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AAEf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAW;IAEjD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9E,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK;QAAE,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC;AAEhB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAE7C,IAAI,CAAC;QAEH,
|
|
1
|
+
{"version":3,"file":"shiftPlanningTime.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanningTime.ts"],"names":[],"mappings":"AAIA,OAAO,cAAc,MAAM,sCAAsC,CAAC;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC;AAEzE,iGAAiG;AACjG,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;AAC1D,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAqE,CAAC;AAC1G,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IAE9D,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,CAAC;YAC7C,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO;SACjG,CAAC,CAAC,CAAC;AAEN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,kBAAkB,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,kBAAkB,CAAC,EAAE,EAAE,yCAAyC,CAAC,CAAC;IACnG,OAAO,UAAU,CAAC;AAEpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IAEzC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;IAC/C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;WACpE,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK;QAAE,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AAEf,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAW;IAEjD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9E,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK;QAAE,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClF,OAAO,MAAM,CAAC;AAEhB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAE7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS;YAC3D,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK;SACrD,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,IAAI,iBAAiB;YAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;QAC7F,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IAEnB,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,kBAAkB,CAAC,WAAW,EAAE,gCAAgC,CAAC,CAAC;IAE3E,CAAC;AAEH,CAAC;AAED,SAAS,UAAU,CAAC,SAA8B,EAAE,OAAe;IAEjE,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QAEX,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAEzC,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9H,IAAI,KAAK,CAAC,IAAI,IAAI,iBAAiB;QAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;IAC9E,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAEhB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,QAAgB;IAEzD,OAAO,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAExE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IAEvC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC;IAC9C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAE5C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAuC,EAAE;IAEtE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAEvC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,GAAG;eAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAEpG,kBAAkB,CAAC,WAAW,EAAE,8CAA8C,CAAC,CAAC;QAElF,CAAC;IAEH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAElB,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAEhE,kBAAkB,CAAC,+BAA+B,EAAE,wCAAwC,CAAC,CAAC;QAEhG,CAAC;QACD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAErD,IAAI,WAAW,CAAC,gBAAgB,IAAI,YAAY,IAAI,WAAW,CAAC,wBAAwB,GAAG,aAAa,EAAE,CAAC;gBAEzG,kBAAkB,CAAC,+BAA+B,EAAE,gEAAgE,CAAC,CAAC;YAExH,CAAC;YACD,YAAY,GAAG,WAAW,CAAC,gBAAgB,CAAC;YAC5C,aAAa,GAAG,WAAW,CAAC,wBAAwB,CAAC;QAEvD,CAAC;IAEH,CAAC;AAEH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAwC,EACxC,SAAuC;IAGvC,qHAAqH;IACrH,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,6BAA6B;WAC5E,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3F,uEAAuE;IACvE,IAAI,CAAC;QAEH,cAAc,CAAC,MAAM,CAAC,CAAC;IAEzB,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,IAAI,CAAC;IAEd,CAAC;IACD,+DAA+D;IAC/D,OAAO,EAAE,GAAG,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,KAAK,IAAI,EAAyB,CAAC;AAEtG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAmC,EAAE,UAA2B;IAE9F,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAE7C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,KAAK,GAAG,WAAW,IAAI,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAEjE,kBAAkB,CAAC,qBAAqB,EAAE,8DAA8D,CAAC,CAAC;QAE5G,CAAC;QACD,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;QAC7B,OAAO,UAAU,CAAC;IAEpB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,CAAC;AAEnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmC,EAAE,UAA2B;IAE3F,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACnD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,CAAC;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,QAAQ,CAAC;AAElB,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,UAA2B,EAAE,QAAgB,EAAE,MAA2B;IAE3H,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAqB;QACpC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;QACnF,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,kBAAkB,EAAE,CAAC,CAAC;KAC5I,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;QAE3D,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,4FAA4F;QAC5F,OAAO,MAAM,GAAG,GAAG,EAAE,CAAC;YAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC;YAC/F,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG;gBAC3C,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG;gBAC3D,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;YAC9D,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC;YACvG,MAAM,GAAG,IAAI,CAAC;QAEhB,CAAC;IAEH,CAAC;IACD,OAAO,WAAW,CAAC;AAErB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,UAA2B,EAAE,QAAgB;IAErF,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;QAE3D,sFAAsF;QACtF,KAAK,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAE7E,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAElD,CAAC;IACD,OAAO,MAAM,CAAC;AAEhB,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,mBAAmB,CAAC,KAAY,EAAE,UAA2B,EAAE,QAAgB;IAE7F,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;QAE3D,KAAK,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;YAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC;QAEnF,CAAC;IAEH,CAAC;IACD,OAAO,MAAM,CAAC;AAEhB,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,UAA2B,EAAE,MAA2B;IAEnG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAEtC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC;QACtE,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,kBAAkB,CAAC;QACxF,SAAS,IAAI,QAAQ,CAAC;QACtB,IAAI,QAAQ,IAAI,YAAY,CAAC,6BAA6B,EAAE,CAAC;YAE3D,gBAAgB,IAAI,QAAQ,CAAC;YAC7B,UAAU,GAAG,CAAC,CAAC;QAEjB,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEjC,CAAC;IACD,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC;IACpH,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAClG,OAAO,iBAAiB,GAAG,YAAY,CAAC,4BAA4B;WAC/D,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,gBAAgB,IAAI,gBAAgB,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAEvI,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Filter } from 'mongodb';
|
|
2
|
-
import type { ShiftAssignment, ShiftAssignmentBreak, ShiftPlanningPage, ShiftPlanningViolation } from '@lilaquadrat/interfaces';
|
|
1
|
+
import { Filter, WithId } from 'mongodb';
|
|
2
|
+
import type { Shift, ShiftAssignment, ShiftAssignmentBreak, ShiftPlanningPage, ShiftPlanningViolation, ShiftResponse } from '@lilaquadrat/interfaces';
|
|
3
3
|
export declare const planningLimit = 30;
|
|
4
4
|
export declare function assertUniquePlanningIds(values: string[], path: string): void;
|
|
5
5
|
export declare function equalBreaks(left: ShiftAssignmentBreak[], right: ShiftAssignmentBreak[]): boolean;
|
|
@@ -8,6 +8,12 @@ export declare function equalAssignment(left: ShiftAssignment, right: ShiftAssig
|
|
|
8
8
|
export declare function equalAssignmentSets(left: ShiftAssignment[], right: ShiftAssignment[]): boolean;
|
|
9
9
|
/** These identity fields are fixed enums/hex IDs; severity and object property order are deliberately excluded. */
|
|
10
10
|
export declare function violationIdentity(violation: ShiftPlanningViolation): string;
|
|
11
|
+
/**
|
|
12
|
+
* Violations a proposed assignment adds or worsens. Persisted severities are the baseline, so existing
|
|
13
|
+
* attention items need not block a safe addition; only the candidate's own changed customers count as
|
|
14
|
+
* new. Break rules can be ignored while their times are still unknown and get planned later.
|
|
15
|
+
*/
|
|
16
|
+
export declare function newScheduleViolations(candidate: WithId<Shift>, previous: WithId<Shift> | undefined, updated: ShiftResponse[], baseline: Map<string, number>, updatedEvidence: Map<string, number>, ignoreBreaks?: boolean): ShiftPlanningViolation[];
|
|
11
17
|
export declare function planningIntervalFilter<T extends {
|
|
12
18
|
start: string;
|
|
13
19
|
end: string;
|
|
@@ -25,6 +25,22 @@ export function equalAssignmentSets(left, right) {
|
|
|
25
25
|
export function violationIdentity(violation) {
|
|
26
26
|
return [violation.customer, violation.shift, violation.rule, violation.relatedShift ?? '', violation.absence ?? ''].join(':');
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Violations a proposed assignment adds or worsens. Persisted severities are the baseline, so existing
|
|
30
|
+
* attention items need not block a safe addition; only the candidate's own changed customers count as
|
|
31
|
+
* new. Break rules can be ignored while their times are still unknown and get planned later.
|
|
32
|
+
*/
|
|
33
|
+
export function newScheduleViolations(candidate, previous, updated, baseline, updatedEvidence, ignoreBreaks = false) {
|
|
34
|
+
const changedCustomers = new Set(candidate.assignments.filter((assignment) => !previous || previous.start !== candidate.start || previous.end !== candidate.end
|
|
35
|
+
|| !previous.assignments.some((existing) => equalAssignment(existing, assignment))).map((assignment) => assignment.customer.toHexString()));
|
|
36
|
+
return updated.flatMap((report) => report.violations.filter((violation) => {
|
|
37
|
+
if (ignoreBreaks && violation.rule === 'breaks')
|
|
38
|
+
return false;
|
|
39
|
+
const identity = violationIdentity(violation);
|
|
40
|
+
return (report._id.equals(candidate._id) && changedCustomers.has(violation.customer))
|
|
41
|
+
|| (updatedEvidence.get(identity) ?? 0) > (baseline.get(identity) ?? 0);
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
28
44
|
export function planningIntervalFilter(filters) {
|
|
29
45
|
const result = {};
|
|
30
46
|
if (filters.from)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shiftPlanningValidation.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanningValidation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shiftPlanningValidation.js","sourceRoot":"","sources":["../../../src/helpers/shiftPlanningValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,7 +55,9 @@ export function structureScore(conditions, participant) {
|
|
|
55
55
|
: answers[structure.id] !== undefined ? answers[structure.id] : userAnswers?.[structure.id];
|
|
56
56
|
const met = structure?.type === 'number' && condition.operator !== undefined && typeof condition.value === 'number'
|
|
57
57
|
? numberMet(condition.operator, answer, condition.value)
|
|
58
|
-
: condition.value !== undefined
|
|
58
|
+
: condition.value !== undefined
|
|
59
|
+
? answer === condition.value || (structure?.type === 'select' && Array.isArray(answer) && answer.includes(condition.value))
|
|
60
|
+
: Boolean(answer);
|
|
59
61
|
if (met)
|
|
60
62
|
matched += 1;
|
|
61
63
|
if (condition.constraint === 'required' && !met)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structureMatch.js","sourceRoot":"","sources":["../../../src/helpers/structureMatch.ts"],"names":[],"mappings":"AAOA,SAAS,aAAa,CAAC,WAAgC;IAErD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC5D,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEvE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAE7B,KAAK,MAAM,SAAS,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YAErC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS;gBAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;QAExF,CAAC;IAEH,CAAC;IAED,OAAO,WAAW,CAAC;AAErB,CAAC;AAED,wGAAwG;AACxG,MAAM,SAAS,GAAG,CAAC,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,mDAAmD;AACnD,MAAM,YAAY,GAA4C;IAC5D,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;CACvE,CAAC;AAEF,gGAAgG;AAChG,SAAS,SAAS,CAAC,QAAoC,EAAE,MAAe,EAAE,KAAa;IAErF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAE5B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,IAAI,KAAK,CAAC;IAC7C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,IAAI,KAAK,CAAC;IAE7C,OAAO,IAAI,KAAK,KAAK,CAAC;AAExB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,UAA4C,EAAE,WAAgC;IAE3G,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,WAAsC,CAAC;IACvD,MAAM,WAAW,GAAG,WAAW,CAAC,IAA2C,CAAC;IAC5E,MAAM,KAAK,GAAG,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC;IAEtC,IAAI,KAAK,GAAwB,WAAW,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QAEzC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS;YACpC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,GAAG,GAAG,SAAS,EAAE,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;YACjH,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"structureMatch.js","sourceRoot":"","sources":["../../../src/helpers/structureMatch.ts"],"names":[],"mappings":"AAOA,SAAS,aAAa,CAAC,WAAgC;IAErD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC5D,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEvE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAE7B,KAAK,MAAM,SAAS,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YAErC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS;gBAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;QAExF,CAAC;IAEH,CAAC;IAED,OAAO,WAAW,CAAC;AAErB,CAAC;AAED,wGAAwG;AACxG,MAAM,SAAS,GAAG,CAAC,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,mDAAmD;AACnD,MAAM,YAAY,GAA4C;IAC5D,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;CACvE,CAAC;AAEF,gGAAgG;AAChG,SAAS,SAAS,CAAC,QAAoC,EAAE,MAAe,EAAE,KAAa;IAErF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAE5B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAErC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,IAAI,KAAK,CAAC;IAC7C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,GAAG,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,IAAI,KAAK,CAAC;IAE7C,OAAO,IAAI,KAAK,KAAK,CAAC;AAExB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,UAA4C,EAAE,WAAgC;IAE3G,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,WAAsC,CAAC;IACvD,MAAM,WAAW,GAAG,WAAW,CAAC,IAA2C,CAAC;IAC5E,MAAM,KAAK,GAAG,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC;IAEtC,IAAI,KAAK,GAAwB,WAAW,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QAEzC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,SAAS,KAAK,SAAS;YACpC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,GAAG,GAAG,SAAS,EAAE,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;YACjH,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS;gBAC7B,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC3H,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEtB,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC;QAEtB,IAAI,SAAS,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,GAAG;YAAE,KAAK,GAAG,OAAO,CAAC;aAC5D,IAAI,SAAS,CAAC,UAAU,KAAK,WAAW,IAAI,GAAG;YAAE,KAAK,GAAG,OAAO,CAAC;QAEtE,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG;YAAE,KAAK,IAAI,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEnF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAE3F,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ListParticipantMatch, ListParticipants } from '@lilaquadrat/interfaces';
|
|
2
|
+
import type { ObjectId } from 'mongodb';
|
|
3
|
+
export interface ListPlanningParticipant {
|
|
4
|
+
_id: ObjectId;
|
|
5
|
+
category?: string;
|
|
6
|
+
state: ListParticipants['state'];
|
|
7
|
+
match: ListParticipantMatch & {
|
|
8
|
+
/** Relative to the full filtered pool; tied-only pools share stage 4. */
|
|
9
|
+
normalizedScore: 1 | 2 | 3 | 4;
|
|
10
|
+
};
|
|
11
|
+
user?: {
|
|
12
|
+
_id: ObjectId;
|
|
13
|
+
id?: string;
|
|
14
|
+
name: string;
|
|
15
|
+
email?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListPlanningParticipant.js","sourceRoot":"","sources":["../../../src/interfaces/ListPlanningParticipant.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ObjectId, WithId } from 'mongodb';
|
|
2
|
+
import type { Shift, ShiftPlan, ShiftPlanningSettings, Structure } from '@lilaquadrat/interfaces';
|
|
3
|
+
import type { CoverageTarget } from '../helpers/shiftPlanCoverage.js';
|
|
4
|
+
/**
|
|
5
|
+
* Everything a plan coverage run needs after the shared reads. Candidate pools are already ranked
|
|
6
|
+
* and the ids are the people that must be resolved for reporting, so callers only add the schedule.
|
|
7
|
+
*/
|
|
8
|
+
export interface PlanCoveragePreparation {
|
|
9
|
+
plan: WithId<ShiftPlan>;
|
|
10
|
+
shifts: WithId<Shift>[];
|
|
11
|
+
targets: CoverageTarget[];
|
|
12
|
+
participantIds: ObjectId[];
|
|
13
|
+
customerIds: ObjectId[];
|
|
14
|
+
settings: ShiftPlanningSettings | null;
|
|
15
|
+
listStructures: WithId<Structure>[];
|
|
16
|
+
customerStructures: WithId<Structure>[];
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanCoveragePreparation.js","sourceRoot":"","sources":["../../../src/interfaces/PlanCoveragePreparation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ShiftScopeCoverage } from '@lilaquadrat/interfaces';
|
|
2
|
+
import type { ListPlanningParticipant } from './ListPlanningParticipant.js';
|
|
3
|
+
/**
|
|
4
|
+
* Candidate page for a shift or work area, or coverage for a day or plan. `data` is empty when
|
|
5
|
+
* `coverage` is present.
|
|
6
|
+
*/
|
|
7
|
+
export interface PlanningParticipantsResult {
|
|
8
|
+
all: number;
|
|
9
|
+
count: number;
|
|
10
|
+
data: ListPlanningParticipant[];
|
|
11
|
+
coverage?: ShiftScopeCoverage;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanningParticipantsResult.js","sourceRoot":"","sources":["../../../src/interfaces/PlanningParticipantsResult.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShiftAutofillResult.js","sourceRoot":"","sources":["../../../src/interfaces/ShiftAutofillResult.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ObjectId, WithId } from 'mongodb';
|
|
2
|
+
import type { Shift } from '@lilaquadrat/interfaces';
|
|
3
|
+
import type { PlanCoveragePreparation } from './PlanCoveragePreparation.js';
|
|
4
|
+
export interface ShiftReportContextOptions {
|
|
5
|
+
replacement?: WithId<Shift>;
|
|
6
|
+
plan?: ObjectId;
|
|
7
|
+
schedules?: WithId<Shift>[];
|
|
8
|
+
preparation?: PlanCoveragePreparation;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShiftReportContextOptions.js","sourceRoot":"","sources":["../../../src/interfaces/ShiftReportContextOptions.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Modelv2 from '../classes/modelv2.class.js';
|
|
2
2
|
const model = new Modelv2('lists', 'lists');
|
|
3
|
-
model.removeWhenEmpty = ['start', 'end', 'description', 'participants', 'content', 'emails', 'location'];
|
|
3
|
+
model.removeWhenEmpty = ['start', 'end', 'description', 'participants', 'content', 'emails', 'location', 'shiftPlan'];
|
|
4
4
|
model.immutable = ['mode'];
|
|
5
5
|
model.addIndex({
|
|
6
6
|
key: {
|
|
@@ -20,6 +20,7 @@ const baseProperties = {
|
|
|
20
20
|
state: { enum: ['open', 'closed', 'waiting'] },
|
|
21
21
|
start: { type: 'string', format: 'date-time' },
|
|
22
22
|
end: { type: 'string', format: 'date-time' },
|
|
23
|
+
shiftPlan: { type: 'object' },
|
|
23
24
|
};
|
|
24
25
|
// Common email schema
|
|
25
26
|
const emailsSchema = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists.model.js","sourceRoot":"","sources":["../../../src/models/lists.model.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,6BAA6B,CAAC;AAElD,MAAM,KAAK,GAAG,IAAI,OAAO,CAAkE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE7G,KAAK,CAAC,eAAe,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"lists.model.js","sourceRoot":"","sources":["../../../src/models/lists.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { ObjectId, UnorderedBulkOperation, UpdateResult, WithId } from 'mongodb';
|
|
1
|
+
import { FindOptions, ObjectId, UnorderedBulkOperation, UpdateResult, WithId } from 'mongodb';
|
|
2
2
|
import Immutable from '../Immutable.class.js';
|
|
3
3
|
import { CustomerPerson, CustomerCompany, CustomersModelActions, CustomerPersonWithEmail, CreateResult, UserAppWithOptions, BasicData, Options, Customers, History, CustomerImportResult, ObjectIdString, MemberProfileUpdate } from '@lilaquadrat/interfaces';
|
|
4
4
|
import { Location } from '@lilaquadrat/interfaces';
|
|
5
5
|
import { ValidateFunction } from 'ajv';
|
|
6
6
|
export declare class CustomersService extends Immutable<CustomerPerson | CustomerCompany> {
|
|
7
7
|
model: import("../classes/modelv2.class.js").default<Customers, CustomersModelActions>;
|
|
8
|
-
peopleForPlanning(customers: ObjectId[], company: string): Promise<(CustomerPerson & {
|
|
8
|
+
peopleForPlanning(customers: ObjectId[], company: string, projection?: FindOptions['projection']): Promise<(CustomerPerson & {
|
|
9
9
|
_id: ObjectId;
|
|
10
10
|
})[]>;
|
|
11
11
|
/** Account, app and project must belong to the same membership entry, not three separate array elements. */
|
|
@@ -24,8 +24,8 @@ export class CustomersService extends Immutable {
|
|
|
24
24
|
super(...arguments);
|
|
25
25
|
this.model = CustomersModel;
|
|
26
26
|
}
|
|
27
|
-
peopleForPlanning(customers, company) {
|
|
28
|
-
return this.model.db.find({ _id: { $in: customers }, company, type: 'person' }).toArray();
|
|
27
|
+
peopleForPlanning(customers, company, projection) {
|
|
28
|
+
return this.model.db.find({ _id: { $in: customers }, company, type: 'person' }, { projection }).toArray();
|
|
29
29
|
}
|
|
30
30
|
/** Account, app and project must belong to the same membership entry, not three separate array elements. */
|
|
31
31
|
memberForPlanning(customer, options) {
|