@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
|
|
1
|
+
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, jest } from '@jest/globals';
|
|
2
2
|
import mongodb from 'mongo-mock';
|
|
3
3
|
import { ObjectId } from 'mongodb';
|
|
4
4
|
import Models from '../src/classes/models.class.js';
|
|
@@ -6,9 +6,19 @@ import ListParticipantsModel from '../src/models/listsParticipants.model.js';
|
|
|
6
6
|
import ListsModel from '../src/models/lists.model.js';
|
|
7
7
|
import CustomersModel from '../src/models/customers.model.js';
|
|
8
8
|
import StructureModel from '../src/models/structure.model.js';
|
|
9
|
+
import ShiftModel from '../src/models/shift.model.js';
|
|
10
|
+
import ShiftPlanModel from '../src/models/shiftPlan.model.js';
|
|
11
|
+
import SettingsModel from '../src/models/shiftPlanningSettings.model.js';
|
|
12
|
+
import AbsenceModel from '../src/models/employeeAbsence.model.js';
|
|
13
|
+
import AreaModel from '../src/models/workAreas.model.js';
|
|
9
14
|
import listParticipantsService from '../src/services/listParticipants.service.js';
|
|
15
|
+
import CustomersService from '../src/services/customers.service.js';
|
|
16
|
+
import StructureService from '../src/services/structures.service.js';
|
|
10
17
|
const options = { user: 'studio-account', app: 'editor-app', company: 'company', project: 'project' };
|
|
18
|
+
const planningOptions = { ...options, skip: 0, limit: 20, sort: { _id: 1 } };
|
|
11
19
|
const listId = new ObjectId();
|
|
20
|
+
const shiftId = new ObjectId();
|
|
21
|
+
const workAreaId = new ObjectId();
|
|
12
22
|
const categoryId = new ObjectId();
|
|
13
23
|
const otherCategoryId = new ObjectId();
|
|
14
24
|
const listStructureId = new ObjectId();
|
|
@@ -22,6 +32,15 @@ const conditions = () => [
|
|
|
22
32
|
{ structure: listStructureId.toString(), constraint: 'required', value: 'yes' },
|
|
23
33
|
{ structure: customerStructureId.toString(), grade: 'positive' },
|
|
24
34
|
];
|
|
35
|
+
const policy = () => ({
|
|
36
|
+
daytime: { start: '06:00', end: '22:00' }, nighttime: { start: '22:00', end: '06:00' },
|
|
37
|
+
maximumConsecutiveWorkingDays: { enabled: false, days: 6 },
|
|
38
|
+
maximumDailyWorkMinutes: { enabled: false, minutes: 480 },
|
|
39
|
+
minimumRest: { enabled: false, minutes: 660 },
|
|
40
|
+
breaks: { enabled: false, maximumContinuousWorkMinutes: 360, minimumQualifyingBreakMinutes: 15,
|
|
41
|
+
requirements: [{ afterWorkMinutes: 360, minimumTotalBreakMinutes: 30 }] },
|
|
42
|
+
absenceEnforcement: false,
|
|
43
|
+
});
|
|
25
44
|
const participant = (id, user, state, category, answer = {}) => ({ _id: id, list: listId, user, company: options.company, project: options.project, state, category, agreements: [], ...answer });
|
|
26
45
|
describe('planning participant candidates', () => {
|
|
27
46
|
let client;
|
|
@@ -33,10 +52,15 @@ describe('planning participant candidates', () => {
|
|
|
33
52
|
models.register('lists', ListsModel);
|
|
34
53
|
models.register('customers', CustomersModel);
|
|
35
54
|
models.register('structures', StructureModel);
|
|
55
|
+
models.register('shifts', ShiftModel);
|
|
56
|
+
models.register('workAreas', AreaModel);
|
|
57
|
+
models.register('shiftPlans', ShiftPlanModel);
|
|
58
|
+
models.register('shiftPlanningSettings', SettingsModel);
|
|
59
|
+
models.register('employeeAbsences', AbsenceModel);
|
|
36
60
|
await Promise.all(models.injectDatabaseConnection(client, undefined, true));
|
|
37
61
|
});
|
|
38
62
|
beforeEach(async () => {
|
|
39
|
-
for (const collection of [ListParticipantsModel.db, ListsModel.db, CustomersModel.db, StructureModel.db]) {
|
|
63
|
+
for (const collection of [ListParticipantsModel.db, ListsModel.db, CustomersModel.db, StructureModel.db, ShiftModel.db, AreaModel.db, ShiftPlanModel.db, SettingsModel.db, AbsenceModel.db]) {
|
|
40
64
|
while (await collection.countDocuments({}))
|
|
41
65
|
await collection.deleteOne({});
|
|
42
66
|
}
|
|
@@ -44,6 +68,9 @@ describe('planning participant candidates', () => {
|
|
|
44
68
|
categories: [{ _id: categoryId, id: 'housekeeping', name: 'Housekeeping' }, { _id: otherCategoryId, id: 'events', name: 'Events' }] });
|
|
45
69
|
await StructureModel.db.insertOne({ _id: listStructureId, id: 's-string-1', model: 'listsParticipants', company: options.company, project: options.project, type: 'string', question: 'Driver license' });
|
|
46
70
|
await StructureModel.db.insertOne({ _id: customerStructureId, id: 's-string-9', model: 'customers', company: options.company, type: 'string', question: 'Tier' });
|
|
71
|
+
await AreaModel.db.insertOne({ _id: workAreaId, company: options.company, project: options.project, name: 'Housekeeping' });
|
|
72
|
+
// Conditions live on the shift; the service resolves them from here instead of the request.
|
|
73
|
+
await ShiftModel.db.insertOne({ _id: shiftId, company: options.company, project: options.project, area: workAreaId, structures: conditions(), assignments: [] });
|
|
47
74
|
await CustomersModel.db.insertOne({ _id: firstCustomerId, id: 'c1', company: options.company, type: 'person', name: 'Ada', prename: 'Lovelace', email: 'ada@example.org', 's-string-9': 'gold' });
|
|
48
75
|
await CustomersModel.db.insertOne({ _id: secondCustomerId, id: 'c2', company: options.company, type: 'person', name: 'Ben', prename: '', email: 'ben@example.org' });
|
|
49
76
|
await ListParticipantsModel.db.insertOne(participant(firstParticipantId, firstCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }));
|
|
@@ -53,31 +80,400 @@ describe('planning participant candidates', () => {
|
|
|
53
80
|
afterAll(async () => {
|
|
54
81
|
await client.close();
|
|
55
82
|
});
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
jest.restoreAllMocks();
|
|
85
|
+
});
|
|
56
86
|
it('scores each candidate and orders the whole set best-first', async () => {
|
|
57
|
-
const result = await listParticipantsService.planningParticipants(listId,
|
|
87
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...options, skip: 0, limit: 20 });
|
|
58
88
|
expect(result.all).toBe(2);
|
|
59
89
|
expect(result.data.map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString(), secondParticipantId.toString()]);
|
|
60
|
-
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, matched: 2, total: 2 });
|
|
90
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
61
91
|
expect(result.data[0].user?.name).toBe('Ada, Lovelace');
|
|
62
|
-
expect(result.data[1].match).toEqual({ state: 'unfit', score: 0, matched: 0, total: 2 });
|
|
92
|
+
expect(result.data[1].match).toEqual({ state: 'unfit', score: 0, normalizedScore: 1, matched: 0, total: 2 });
|
|
63
93
|
});
|
|
64
94
|
it('ranks across pages rather than within one page', async () => {
|
|
65
|
-
const firstPage = await listParticipantsService.planningParticipants(listId,
|
|
66
|
-
const secondPage = await listParticipantsService.planningParticipants(listId,
|
|
95
|
+
const firstPage = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...options, skip: 0, limit: 1 });
|
|
96
|
+
const secondPage = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...options, skip: 1, limit: 1 });
|
|
67
97
|
expect(firstPage.all).toBe(2);
|
|
68
98
|
expect(firstPage.data.map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString()]);
|
|
69
99
|
expect(secondPage.data.map((entry) => entry._id.toString())).toEqual([secondParticipantId.toString()]);
|
|
100
|
+
expect(firstPage.data[0].match.normalizedScore).toBe(4);
|
|
101
|
+
expect(secondPage.data[0].match.normalizedScore).toBe(1);
|
|
102
|
+
});
|
|
103
|
+
it('ranks unfit candidates after feasible ones even when they score higher', async () => {
|
|
104
|
+
const feasibleId = new ObjectId();
|
|
105
|
+
const unfitId = new ObjectId();
|
|
106
|
+
const feasibleCustomerId = new ObjectId();
|
|
107
|
+
const unfitCustomerId = new ObjectId();
|
|
108
|
+
await CustomersModel.db.insertOne({ _id: feasibleCustomerId, id: 'c5', company: options.company, type: 'person', name: 'Eve', prename: '', email: 'eve@example.org' });
|
|
109
|
+
// The grade answer scores the candidate, but the missing required answer still makes it unfit.
|
|
110
|
+
await CustomersModel.db.insertOne({ _id: unfitCustomerId, id: 'c6', company: options.company, type: 'person', name: 'Fay', prename: '', email: 'fay@example.org', 's-string-9': 'gold' });
|
|
111
|
+
await ListParticipantsModel.db.insertOne(participant(feasibleId, feasibleCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }));
|
|
112
|
+
await ListParticipantsModel.db.insertOne(participant(unfitId, unfitCustomerId, 'confirmed', 'housekeeping'));
|
|
113
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...options, skip: 0, limit: 20 });
|
|
114
|
+
const order = result.data.map((entry) => entry._id.toString());
|
|
115
|
+
const unfit = result.data.find((entry) => entry._id.toString() === unfitId.toString());
|
|
116
|
+
expect(unfit?.match).toEqual({ state: 'unfit', score: 1, normalizedScore: 4, matched: 1, total: 2 });
|
|
117
|
+
expect(order.indexOf(feasibleId.toString())).toBeLessThan(order.indexOf(unfitId.toString()));
|
|
70
118
|
});
|
|
71
119
|
it('keeps unavailable entries out of the candidate set', async () => {
|
|
72
|
-
const result = await listParticipantsService.planningParticipants(listId,
|
|
120
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...options, skip: 0, limit: 20 });
|
|
73
121
|
expect(result.data.some((entry) => entry._id.toString() === uncheckedParticipantId.toString())).toBe(false);
|
|
74
122
|
});
|
|
75
123
|
it('filters candidates by a work area category and ignores unknown categories', async () => {
|
|
76
|
-
const filtered = await listParticipantsService.planningParticipants(listId, undefined, [categoryId], undefined,
|
|
124
|
+
const filtered = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: undefined, workArea: workAreaId }, undefined, [categoryId], undefined, { ...options, skip: 0, limit: 20 });
|
|
77
125
|
expect(filtered.all).toBe(1);
|
|
78
126
|
expect(filtered.data.map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString()]);
|
|
79
|
-
const unknown = await listParticipantsService.planningParticipants(listId, undefined, [new ObjectId()], undefined,
|
|
127
|
+
const unknown = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: undefined, workArea: workAreaId }, undefined, [new ObjectId()], undefined, { ...options, skip: 0, limit: 20 });
|
|
80
128
|
expect(unknown.all).toBe(0);
|
|
81
129
|
});
|
|
130
|
+
it('loads each customer once and reuses resolved answers across their list entries', async () => {
|
|
131
|
+
const duplicateParticipantId = new ObjectId();
|
|
132
|
+
await ListParticipantsModel.db.insertOne(participant(duplicateParticipantId, firstCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }));
|
|
133
|
+
const customers = await CustomersService.peopleForPlanning([firstCustomerId, secondCustomerId], options.company);
|
|
134
|
+
const customerAnswer = jest.fn(() => 'gold');
|
|
135
|
+
Object.defineProperty(customers.find((customer) => customer._id.equals(firstCustomerId)), 's-string-9', { enumerable: true, get: customerAnswer });
|
|
136
|
+
const customerLookup = jest.spyOn(CustomersService, 'peopleForPlanning').mockResolvedValue(customers);
|
|
137
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
138
|
+
expect(customerLookup).toHaveBeenCalledWith([firstCustomerId, secondCustomerId], options.company, {
|
|
139
|
+
_id: 1, id: 1, name: 1, prename: 1, email: 1, 's-string-1': 1, 's-string-9': 1,
|
|
140
|
+
});
|
|
141
|
+
expect(customerAnswer).toHaveBeenCalledTimes(1);
|
|
142
|
+
expect(result.all).toBe(3);
|
|
143
|
+
expect(result.data.slice(0, 2).map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString(), duplicateParticipantId.toString()]);
|
|
144
|
+
expect(result.data[0].user).toEqual(result.data[1].user);
|
|
145
|
+
expect(result.data[0].user).not.toBe(result.data[1].user);
|
|
146
|
+
});
|
|
147
|
+
it('applies normalized name search before resolving answers and paginating', async () => {
|
|
148
|
+
const customers = await CustomersService.peopleForPlanning([firstCustomerId, secondCustomerId], options.company);
|
|
149
|
+
const excludedAnswer = jest.fn(() => 'silver');
|
|
150
|
+
Object.defineProperty(customers.find((customer) => customer._id.equals(secondCustomerId)), 's-string-9', { enumerable: true, get: excludedAnswer });
|
|
151
|
+
jest.spyOn(CustomersService, 'peopleForPlanning').mockResolvedValue(customers);
|
|
152
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, ' ADA, LOVE ', planningOptions);
|
|
153
|
+
const nextPage = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, 'lovelace', { ...planningOptions, skip: 1, limit: 1 });
|
|
154
|
+
expect(result.all).toBe(1);
|
|
155
|
+
expect(result.count).toBe(1);
|
|
156
|
+
expect(result.data[0]._id).toEqual(firstParticipantId);
|
|
157
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
158
|
+
expect(nextPage).toEqual({ all: 1, data: [], count: 0 });
|
|
159
|
+
expect(excludedAnswer).not.toHaveBeenCalled();
|
|
160
|
+
});
|
|
161
|
+
it('keeps equal-score candidates in ascending id order across pages', async () => {
|
|
162
|
+
const earlierParticipantId = new ObjectId('000000000000000000000001');
|
|
163
|
+
await ListParticipantsModel.db.insertOne(participant(earlierParticipantId, firstCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }));
|
|
164
|
+
await ListParticipantsModel.db.updateOne({ _id: secondParticipantId }, { $set: { 's-string-1': 'yes' } });
|
|
165
|
+
await CustomersModel.db.updateOne({ _id: secondCustomerId }, { $set: { 's-string-9': 'gold' } });
|
|
166
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
167
|
+
const secondPage = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...planningOptions, skip: 1, limit: 1 });
|
|
168
|
+
expect(result.data.map((entry) => entry._id.toString())).toEqual([earlierParticipantId.toString(), firstParticipantId.toString(), secondParticipantId.toString()]);
|
|
169
|
+
expect(result.data.every((entry) => entry.match.normalizedScore === 4)).toBe(true);
|
|
170
|
+
expect(secondPage.all).toBe(3);
|
|
171
|
+
expect(secondPage.data[0]._id).toEqual(firstParticipantId);
|
|
172
|
+
expect(secondPage.data[0].match.normalizedScore).toBe(4);
|
|
173
|
+
});
|
|
174
|
+
it('skips customer queries for an empty candidate pool', async () => {
|
|
175
|
+
const customerLookup = jest.spyOn(CustomersService, 'peopleForPlanning');
|
|
176
|
+
const result = await listParticipantsService.planningParticipants(new ObjectId(), { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
177
|
+
expect(result).toEqual({ all: 0, data: [], count: 0 });
|
|
178
|
+
expect(customerLookup).not.toHaveBeenCalled();
|
|
179
|
+
});
|
|
180
|
+
it('skips candidate and condition queries when no requested category exists', async () => {
|
|
181
|
+
const participantLookup = jest.spyOn(ListParticipantsModel.db, 'find');
|
|
182
|
+
const areaLookup = jest.spyOn(AreaModel.db, 'findOne');
|
|
183
|
+
const shiftLookup = jest.spyOn(ShiftModel.db, 'findOne');
|
|
184
|
+
const customerLookup = jest.spyOn(CustomersService, 'peopleForPlanning');
|
|
185
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, [new ObjectId()], undefined, planningOptions);
|
|
186
|
+
expect(result).toEqual({ all: 0, data: [], count: 0 });
|
|
187
|
+
expect(participantLookup).not.toHaveBeenCalled();
|
|
188
|
+
expect(areaLookup).not.toHaveBeenCalled();
|
|
189
|
+
expect(shiftLookup).not.toHaveBeenCalled();
|
|
190
|
+
expect(customerLookup).not.toHaveBeenCalled();
|
|
191
|
+
});
|
|
192
|
+
it('covers a plan without booking one person into overlapping shifts', async () => {
|
|
193
|
+
const planId = new ObjectId();
|
|
194
|
+
const dayId = new ObjectId();
|
|
195
|
+
await SettingsModel.db.insertOne({ _id: new ObjectId(), company: options.company, project: options.project, settings: policy() });
|
|
196
|
+
// The area binds only the housekeeping category, so the events participant is not a candidate.
|
|
197
|
+
await ShiftPlanModel.db.insertOne({ _id: planId, company: options.company, project: options.project, name: 'Week', timeZone: 'Europe/Berlin',
|
|
198
|
+
settingsOverrides: {}, list: listId, workAreaCategories: [{ area: workAreaId, categoryIds: [categoryId] }] });
|
|
199
|
+
await ShiftModel.db.insertOne({ _id: new ObjectId(), company: options.company, project: options.project, plan: planId, day: dayId, area: workAreaId,
|
|
200
|
+
title: 'A', start: '2026-01-01T08:00:00.000Z', end: '2026-01-01T12:00:00.000Z', structures: [], assignments: [], requiredPeople: 1 });
|
|
201
|
+
await ShiftModel.db.insertOne({ _id: new ObjectId(), company: options.company, project: options.project, plan: planId, day: dayId, area: workAreaId,
|
|
202
|
+
title: 'B', start: '2026-01-01T10:00:00.000Z', end: '2026-01-01T14:00:00.000Z', structures: [], assignments: [], requiredPeople: 1 });
|
|
203
|
+
await ShiftModel.db.updateMany({ plan: planId }, { $set: { matchingPeople: 1 } });
|
|
204
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'plan', plan: planId }, undefined, undefined, undefined, planningOptions);
|
|
205
|
+
expect(result.data).toEqual([]);
|
|
206
|
+
expect(result.coverage.plan.equals(planId)).toBe(true);
|
|
207
|
+
expect(result.coverage.totalShifts).toBe(2);
|
|
208
|
+
expect(result.coverage.fillableShifts).toBe(1);
|
|
209
|
+
expect(result.coverage.fillable).toBe(false);
|
|
210
|
+
const summary = await listParticipantsService.planCoverageSummary(listId, { level: 'plan', plan: planId }, planningOptions);
|
|
211
|
+
expect(summary).toEqual({ fillable: false });
|
|
212
|
+
});
|
|
213
|
+
it.each(['coverage', 'summary'])('reuses settings and definitions and batches report people for %s', async (mode) => {
|
|
214
|
+
const planId = new ObjectId();
|
|
215
|
+
await ShiftPlanModel.db.insertOne({ _id: planId, company: options.company, project: options.project, name: 'Week',
|
|
216
|
+
list: listId, timeZone: 'Europe/Berlin', settingsOverrides: {} });
|
|
217
|
+
await SettingsModel.db.insertOne({ company: options.company, project: options.project, settings: policy() });
|
|
218
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { plan: planId, day: new ObjectId(), title: 'Morning',
|
|
219
|
+
start: '2026-01-01T08:00:00.000Z', end: '2026-01-01T12:00:00.000Z', requiredPeople: 1 } });
|
|
220
|
+
const participantReads = jest.spyOn(ListParticipantsModel.db, 'find');
|
|
221
|
+
const customerReads = jest.spyOn(CustomersModel.db, 'find');
|
|
222
|
+
const structureReads = jest.spyOn(StructureModel.db, 'find');
|
|
223
|
+
const settingsReads = jest.spyOn(SettingsModel.db, 'findOne');
|
|
224
|
+
if (mode === 'summary') {
|
|
225
|
+
expect(await listParticipantsService.planCoverageSummary(listId, { level: 'plan', plan: planId }, options)).toEqual({ fillable: true });
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'plan', plan: planId }, undefined, undefined, undefined, planningOptions);
|
|
229
|
+
expect(result.coverage?.fillable).toBe(true);
|
|
230
|
+
}
|
|
231
|
+
expect(participantReads).toHaveBeenCalledTimes(2);
|
|
232
|
+
expect(customerReads).toHaveBeenCalledTimes(2);
|
|
233
|
+
expect(structureReads).toHaveBeenCalledTimes(2);
|
|
234
|
+
expect(settingsReads).toHaveBeenCalledTimes(1);
|
|
235
|
+
});
|
|
236
|
+
it('loads other-project definitions when prepared report people include other projects', async () => {
|
|
237
|
+
const planId = new ObjectId();
|
|
238
|
+
const otherProjectStructureId = new ObjectId();
|
|
239
|
+
const otherProjectParticipantId = new ObjectId();
|
|
240
|
+
await ShiftPlanModel.db.insertOne({ _id: planId, company: options.company, project: options.project, name: 'Week',
|
|
241
|
+
list: listId, timeZone: 'Europe/Berlin', settingsOverrides: {} });
|
|
242
|
+
await SettingsModel.db.insertOne({ company: options.company, project: options.project, settings: policy() });
|
|
243
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { plan: planId, day: new ObjectId(), title: 'Morning',
|
|
244
|
+
start: '2026-01-01T08:00:00.000Z', end: '2026-01-01T12:00:00.000Z', requiredPeople: 1 } });
|
|
245
|
+
await StructureModel.db.insertOne({ _id: otherProjectStructureId, id: 's-string-1', model: 'listsParticipants',
|
|
246
|
+
company: options.company, project: 'other-project', type: 'string', question: 'Other project answer' });
|
|
247
|
+
await ListParticipantsModel.db.insertOne({ ...participant(otherProjectParticipantId, firstCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }), project: 'other-project' });
|
|
248
|
+
const preparation = await listParticipantsService.prepareShiftPlanning(listId, { level: 'plan', plan: planId }, options);
|
|
249
|
+
expect(preparation).toBeDefined();
|
|
250
|
+
const structures = jest.spyOn(StructureService, 'byModelAndCompany');
|
|
251
|
+
const context = await listParticipantsService.planningParticipantContext([firstParticipantId, otherProjectParticipantId], [firstCustomerId], options.company, preparation);
|
|
252
|
+
expect(context.participantDetails.find((entry) => entry._id?.equals(firstParticipantId))?.structures?.map((structure) => structure._id)).toEqual([listStructureId]);
|
|
253
|
+
expect(context.participantDetails.find((entry) => entry._id?.equals(otherProjectParticipantId))?.structures?.map((structure) => structure._id)).toEqual([otherProjectStructureId]);
|
|
254
|
+
expect(context.participantDetails[0].user?.structures?.map((structure) => structure._id)).toEqual([customerStructureId]);
|
|
255
|
+
expect(structures).toHaveBeenCalledTimes(1);
|
|
256
|
+
expect(structures).toHaveBeenCalledWith('listsParticipants', options.company);
|
|
257
|
+
});
|
|
258
|
+
it.each([undefined, []])('uses work area conditions when shift conditions are %p', async (structures) => {
|
|
259
|
+
await AreaModel.db.updateOne({ _id: workAreaId }, { $set: { structures: conditions() } });
|
|
260
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, structures === undefined ? { $unset: { structures: '' } } : { $set: { structures } });
|
|
261
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
262
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
263
|
+
expect(result.data[1].match).toEqual({ state: 'unfit', score: 0, normalizedScore: 1, matched: 0, total: 2 });
|
|
264
|
+
});
|
|
265
|
+
it('uses work area conditions without a shift and prefers shift conditions when supplied', async () => {
|
|
266
|
+
await AreaModel.db.updateOne({ _id: workAreaId }, { $set: { structures: [{ structure: listStructureId.toString(), constraint: 'forbidden', value: 'yes' }] } });
|
|
267
|
+
const areaResult = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: undefined, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
268
|
+
const shiftResult = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
269
|
+
expect(areaResult.data[0]._id).toEqual(secondParticipantId);
|
|
270
|
+
expect(areaResult.data[0].match).toEqual({ state: 'fulfilled', score: 0, normalizedScore: 4, matched: 0, total: 1 });
|
|
271
|
+
expect(shiftResult.data[0]._id).toEqual(firstParticipantId);
|
|
272
|
+
expect(shiftResult.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
273
|
+
});
|
|
274
|
+
it('fetches project-scoped list definitions and preserves cross-project reporting details', async () => {
|
|
275
|
+
const otherProjectStructureId = new ObjectId();
|
|
276
|
+
const otherProjectParticipantId = new ObjectId();
|
|
277
|
+
await StructureModel.db.insertMany([
|
|
278
|
+
{ _id: otherProjectStructureId, id: 's-string-1', model: 'listsParticipants', company: options.company, project: 'other-project', type: 'string', question: 'Other project answer' },
|
|
279
|
+
{ _id: new ObjectId(), id: 's-string-9', model: 'customers', company: options.company, project: 'other-project', type: 'string', question: 'Project-only customer answer' },
|
|
280
|
+
{ _id: new ObjectId(), id: 's-string-2', model: 'listsParticipants', company: options.company, project: options.project, type: 'string', question: 'Unanswered' },
|
|
281
|
+
]);
|
|
282
|
+
await ListParticipantsModel.db.insertOne({ ...participant(otherProjectParticipantId, firstCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }), project: 'other-project' });
|
|
283
|
+
const structureLookup = jest.spyOn(StructureService, 'getByModel');
|
|
284
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
285
|
+
expect(structureLookup).toHaveBeenCalledWith('listsParticipants', { company: options.company, project: options.project });
|
|
286
|
+
expect(result.all).toBe(2);
|
|
287
|
+
expect(result.data[0]).not.toHaveProperty('structures');
|
|
288
|
+
expect(result.data[0].user).not.toHaveProperty('structures');
|
|
289
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
290
|
+
const reports = await listParticipantsService.participantsForPlanningWithDetails([firstParticipantId, otherProjectParticipantId], options.company);
|
|
291
|
+
expect(reports.find((entry) => entry._id?.equals(firstParticipantId))?.structures?.map((structure) => structure._id)).toEqual([listStructureId]);
|
|
292
|
+
expect(reports.find((entry) => entry._id?.equals(otherProjectParticipantId))?.structures?.map((structure) => structure._id)).toEqual([otherProjectStructureId]);
|
|
293
|
+
expect(reports[0].user?.structures?.map((structure) => structure._id)).toEqual([customerStructureId]);
|
|
294
|
+
});
|
|
295
|
+
it('retains missing customers without search but excludes them from name searches', async () => {
|
|
296
|
+
const missingCustomerParticipantId = new ObjectId();
|
|
297
|
+
await ListParticipantsModel.db.insertOne(participant(missingCustomerParticipantId, new ObjectId(), 'confirmed', 'housekeeping', { 's-string-1': 'yes' }));
|
|
298
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, ' ', planningOptions);
|
|
299
|
+
const searched = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, 'ada', planningOptions);
|
|
300
|
+
const absent = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, 'nobody', planningOptions);
|
|
301
|
+
expect(result.all).toBe(3);
|
|
302
|
+
expect(result.data.find((entry) => entry._id?.equals(missingCustomerParticipantId))?.user).toBeUndefined();
|
|
303
|
+
expect(searched.all).toBe(1);
|
|
304
|
+
expect(searched.data[0]._id).toEqual(firstParticipantId);
|
|
305
|
+
expect(absent).toEqual({ all: 0, data: [], count: 0 });
|
|
306
|
+
});
|
|
307
|
+
it('projects only response and scoring fields and returns an explicit response shape', async () => {
|
|
308
|
+
const storedStructures = await StructureModel.db.find({}).toArray();
|
|
309
|
+
const history = { source: 'tests', version: 7, additional: { internal: 'audit details' } };
|
|
310
|
+
await StructureModel.db.insertOne({ _id: new ObjectId(), id: 's-string-unrelated', model: 'listsParticipants', company: options.company, project: options.project, type: 'string', question: 'Unrelated' });
|
|
311
|
+
await ListParticipantsModel.db.updateOne({ _id: firstParticipantId }, { $set: {
|
|
312
|
+
history, structures: storedStructures, message: 'private message', note: 'private note', explanation: 'internal explanation', payment: new ObjectId(),
|
|
313
|
+
's-string-unrelated': 'not used for scoring', internalOnly: 'not part of the response',
|
|
314
|
+
} });
|
|
315
|
+
await CustomersModel.db.updateOne({ _id: firstCustomerId }, { $set: {
|
|
316
|
+
history, structures: storedStructures, accounts: [{ account: 'account', app: options.app, project: options.project }],
|
|
317
|
+
emailConfirmationCode: 'secret', street: 'private address', 's-string-unrelated': 'not used for scoring', internalOnly: 'not part of the response',
|
|
318
|
+
} });
|
|
319
|
+
const participantLookup = jest.spyOn(ListParticipantsModel.db, 'find');
|
|
320
|
+
const customerLookup = jest.spyOn(CustomersModel.db, 'find');
|
|
321
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
322
|
+
expect(participantLookup).toHaveBeenCalledWith({ list: listId, company: options.company, project: options.project, state: { $nin: ['blocked', 'unchecked', 'notuseful'] } }, {
|
|
323
|
+
projection: { _id: 1, user: 1, project: 1, category: 1, state: 1, 's-string-1': 1, 's-string-9': 1 },
|
|
324
|
+
});
|
|
325
|
+
expect(customerLookup).toHaveBeenCalledWith({ _id: { $in: [firstCustomerId, secondCustomerId] }, company: options.company, type: 'person' }, {
|
|
326
|
+
projection: { _id: 1, id: 1, name: 1, prename: 1, email: 1, 's-string-1': 1, 's-string-9': 1 },
|
|
327
|
+
});
|
|
328
|
+
expect(result.data[0]).toStrictEqual({
|
|
329
|
+
_id: firstParticipantId,
|
|
330
|
+
category: 'housekeeping',
|
|
331
|
+
state: 'confirmed',
|
|
332
|
+
match: { state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 },
|
|
333
|
+
user: { _id: firstCustomerId, id: 'c1', name: 'Ada, Lovelace', email: 'ada@example.org' },
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
it('does not project structure answers when there are no scoring conditions', async () => {
|
|
337
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $unset: { structures: '' } });
|
|
338
|
+
const participantLookup = jest.spyOn(ListParticipantsModel.db, 'find');
|
|
339
|
+
const customerLookup = jest.spyOn(CustomersModel.db, 'find');
|
|
340
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
341
|
+
expect(participantLookup).toHaveBeenCalledWith(expect.objectContaining({ list: listId }), {
|
|
342
|
+
projection: { _id: 1, user: 1, project: 1, category: 1, state: 1 },
|
|
343
|
+
});
|
|
344
|
+
expect(customerLookup).toHaveBeenCalledWith(expect.objectContaining({ company: options.company, type: 'person' }), {
|
|
345
|
+
projection: { _id: 1, id: 1, name: 1, prename: 1, email: 1 },
|
|
346
|
+
});
|
|
347
|
+
expect(result.all).toBe(2);
|
|
348
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 0, normalizedScore: 4, matched: 0, total: 0 });
|
|
349
|
+
});
|
|
350
|
+
it('preserves zero and false answers needed for scoring without returning them', async () => {
|
|
351
|
+
await StructureModel.db.updateOne({ _id: listStructureId }, { $set: { id: 's-number-1', type: 'number' } });
|
|
352
|
+
await StructureModel.db.updateOne({ _id: customerStructureId }, { $set: { id: 's-boolean-9', type: 'boolean' } });
|
|
353
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { structures: [
|
|
354
|
+
{ structure: listStructureId.toHexString(), constraint: 'required', operator: 'gte', value: 0 },
|
|
355
|
+
{ structure: customerStructureId.toHexString(), grade: 'positive', value: false },
|
|
356
|
+
] } });
|
|
357
|
+
await ListParticipantsModel.db.updateOne({ _id: firstParticipantId }, { $set: { 's-number-1': 0 } });
|
|
358
|
+
await CustomersModel.db.updateOne({ _id: firstCustomerId }, { $set: { 's-boolean-9': false } });
|
|
359
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
360
|
+
expect(result.data[0]._id).toEqual(firstParticipantId);
|
|
361
|
+
expect(result.data[0].match).toEqual({ state: 'fulfilled', score: 1, normalizedScore: 4, matched: 2, total: 2 });
|
|
362
|
+
expect(result.data[0]).not.toHaveProperty('s-number-1');
|
|
363
|
+
expect(result.data[0].user).not.toHaveProperty('s-boolean-9');
|
|
364
|
+
});
|
|
365
|
+
it('ranks multi-select grades across pages while keeping answers out of the response', async () => {
|
|
366
|
+
const bothCustomerId = new ObjectId();
|
|
367
|
+
const emptyCustomerId = new ObjectId();
|
|
368
|
+
const missingCustomerId = new ObjectId();
|
|
369
|
+
const bothParticipantId = new ObjectId();
|
|
370
|
+
const emptyParticipantId = new ObjectId();
|
|
371
|
+
const missingParticipantId = new ObjectId();
|
|
372
|
+
await StructureModel.db.updateOne({ _id: customerStructureId }, { $set: { id: 's-select-4', type: 'select', multiple: true } });
|
|
373
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { structures: [
|
|
374
|
+
{ structure: listStructureId.toHexString(), value: 'yes', constraint: 'required' },
|
|
375
|
+
{ structure: customerStructureId.toHexString(), value: 's-yes', grade: 'very-positive' },
|
|
376
|
+
{ structure: customerStructureId.toHexString(), value: 's-no', grade: 'very-negative' },
|
|
377
|
+
] } });
|
|
378
|
+
await ListParticipantsModel.db.updateOne({ _id: secondParticipantId }, { $set: { 's-string-1': 'yes' } });
|
|
379
|
+
await CustomersModel.db.updateOne({ _id: firstCustomerId }, { $set: { 's-select-4': ['s-no'] } });
|
|
380
|
+
await CustomersModel.db.updateOne({ _id: secondCustomerId }, { $set: { 's-select-4': ['s-yes'] } });
|
|
381
|
+
await CustomersModel.db.insertMany([
|
|
382
|
+
{ _id: bothCustomerId, id: 'both', company: options.company, type: 'person', name: 'Both', 's-select-4': ['s-yes', 's-no'] },
|
|
383
|
+
{ _id: emptyCustomerId, id: 'empty', company: options.company, type: 'person', name: 'Empty', 's-select-4': [] },
|
|
384
|
+
{ _id: missingCustomerId, id: 'missing', company: options.company, type: 'person', name: 'Missing' },
|
|
385
|
+
]);
|
|
386
|
+
await ListParticipantsModel.db.insertMany([
|
|
387
|
+
participant(bothParticipantId, bothCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }),
|
|
388
|
+
participant(emptyParticipantId, emptyCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }),
|
|
389
|
+
participant(missingParticipantId, missingCustomerId, 'confirmed', 'housekeeping', { 's-string-1': 'yes' }),
|
|
390
|
+
]);
|
|
391
|
+
const result = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
392
|
+
const lastPage = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, { ...planningOptions, skip: 4, limit: 1 });
|
|
393
|
+
expect(result.all).toBe(5);
|
|
394
|
+
expect(result.data.map((entry) => entry._id)).toEqual([secondParticipantId, bothParticipantId, emptyParticipantId, missingParticipantId, firstParticipantId]);
|
|
395
|
+
expect(result.data.map((entry) => entry.match.score)).toEqual([2, 0, 0, 0, -2]);
|
|
396
|
+
expect(result.data.map((entry) => entry.match.normalizedScore)).toEqual([4, 3, 3, 3, 1]);
|
|
397
|
+
expect(result.data.map((entry) => entry.match.matched)).toEqual([2, 3, 1, 1, 2]);
|
|
398
|
+
expect(result.data.every((entry) => entry.match.state === 'fulfilled' && entry.match.total === 3)).toBe(true);
|
|
399
|
+
expect(result.data[0].user).toStrictEqual({ _id: secondCustomerId, id: 'c2', name: 'Ben', email: 'ben@example.org' });
|
|
400
|
+
expect(lastPage.all).toBe(5);
|
|
401
|
+
expect(lastPage.data[0]._id).toEqual(firstParticipantId);
|
|
402
|
+
expect(lastPage.data[0].match.score).toBe(-2);
|
|
403
|
+
expect(lastPage.data[0].match.normalizedScore).toBe(1);
|
|
404
|
+
});
|
|
405
|
+
it.each(['positive', 'negative'])('normalizes a %s-only range into four equal-width stages', async (grade) => {
|
|
406
|
+
const scoreListId = new ObjectId();
|
|
407
|
+
const scoreCandidates = Array.from({ length: 5 }, (_, answer) => ({ participantId: new ObjectId(), customerId: new ObjectId(), answer }));
|
|
408
|
+
await StructureModel.db.updateOne({ _id: customerStructureId }, { $set: { id: 's-number-9', type: 'number' } });
|
|
409
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { structures: Array.from({ length: 5 }, (_, threshold) => ({
|
|
410
|
+
structure: customerStructureId.toHexString(), operator: 'gte', value: threshold, grade,
|
|
411
|
+
})) } });
|
|
412
|
+
await CustomersModel.db.insertMany(scoreCandidates.map((candidate) => ({
|
|
413
|
+
_id: candidate.customerId, id: `range-${candidate.answer}`, company: options.company, type: 'person',
|
|
414
|
+
name: `Candidate ${candidate.answer}`, 's-number-9': candidate.answer,
|
|
415
|
+
})));
|
|
416
|
+
await ListParticipantsModel.db.insertMany(scoreCandidates.map((candidate) => ({
|
|
417
|
+
...participant(candidate.participantId, candidate.customerId, 'confirmed', 'housekeeping'), list: scoreListId,
|
|
418
|
+
})));
|
|
419
|
+
const result = await listParticipantsService.planningParticipants(scoreListId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
420
|
+
expect(result.all).toBe(5);
|
|
421
|
+
expect(result.data.map((entry) => entry.match.score)).toEqual(grade === 'positive' ? [5, 4, 3, 2, 1] : [-1, -2, -3, -4, -5]);
|
|
422
|
+
expect(result.data.map((entry) => entry.match.normalizedScore)).toEqual([4, 4, 3, 2, 1]);
|
|
423
|
+
});
|
|
424
|
+
it('normalizes against the searched, state-filtered, or category-filtered pool', async () => {
|
|
425
|
+
await ListParticipantsModel.db.updateOne({ _id: secondParticipantId }, { $set: { state: 'reserved' } });
|
|
426
|
+
const full = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
427
|
+
const searched = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, 'ben', planningOptions);
|
|
428
|
+
const stateFiltered = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, ['reserved'], undefined, undefined, planningOptions);
|
|
429
|
+
const categoryFiltered = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, [otherCategoryId], undefined, planningOptions);
|
|
430
|
+
expect(full.data.find((entry) => entry._id.equals(secondParticipantId))?.match.normalizedScore).toBe(1);
|
|
431
|
+
for (const filtered of [searched, stateFiltered, categoryFiltered]) {
|
|
432
|
+
expect(filtered.all).toBe(1);
|
|
433
|
+
expect(filtered.data[0]._id).toEqual(secondParticipantId);
|
|
434
|
+
expect(filtered.data[0].match).toEqual({ state: 'unfit', score: 0, normalizedScore: 4, matched: 0, total: 2 });
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
it('leaves full customer reads and detailed reporting responses unchanged', async () => {
|
|
438
|
+
const history = { source: 'tests', version: 7 };
|
|
439
|
+
const accounts = [{ account: 'account', app: options.app, project: options.project }];
|
|
440
|
+
await CustomersModel.db.updateOne({ _id: firstCustomerId }, { $set: { history, accounts, emailConfirmationCode: 'secret' } });
|
|
441
|
+
await ListParticipantsModel.db.updateOne({ _id: firstParticipantId }, { $set: { history, note: 'reporting note' } });
|
|
442
|
+
const customers = await CustomersService.peopleForPlanning([firstCustomerId], options.company);
|
|
443
|
+
const reports = await listParticipantsService.participantsForPlanningWithDetails([firstParticipantId], options.company);
|
|
444
|
+
expect(customers[0]).toMatchObject({ history, accounts, emailConfirmationCode: 'secret', 's-string-9': 'gold' });
|
|
445
|
+
expect(reports[0]).toMatchObject({ history, note: 'reporting note', 's-string-1': 'yes' });
|
|
446
|
+
expect(reports[0].structures?.map((structure) => structure._id)).toEqual([listStructureId]);
|
|
447
|
+
expect(reports[0].user?.structures?.map((structure) => structure._id)).toEqual([customerStructureId]);
|
|
448
|
+
expect(reports[0].user).toHaveProperty('s-string-9', 'gold');
|
|
449
|
+
});
|
|
450
|
+
it('filters candidates by whether they already hold a place in the plan', async () => {
|
|
451
|
+
const planId = new ObjectId();
|
|
452
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { plan: planId, assignments: [{ participant: firstParticipantId, customer: firstCustomerId, breaks: [] }] } });
|
|
453
|
+
const assigned = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions, 'assigned');
|
|
454
|
+
const unassigned = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions, 'unassigned');
|
|
455
|
+
const all = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions);
|
|
456
|
+
expect(assigned.data.map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString()]);
|
|
457
|
+
expect(unassigned.data.map((entry) => entry._id.toString())).toEqual([secondParticipantId.toString()]);
|
|
458
|
+
expect(all.all).toBe(2);
|
|
459
|
+
});
|
|
460
|
+
it('treats a shift without a plan as having no assigned participants', async () => {
|
|
461
|
+
const assigned = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions, 'assigned');
|
|
462
|
+
const unassigned = await listParticipantsService.planningParticipants(listId, { level: 'shift', shift: shiftId, workArea: workAreaId }, undefined, undefined, undefined, planningOptions, 'unassigned');
|
|
463
|
+
expect(assigned.all).toBe(0);
|
|
464
|
+
expect(unassigned.all).toBe(2);
|
|
465
|
+
});
|
|
466
|
+
it('returns the membership-filtered pool for a plan scope instead of coverage', async () => {
|
|
467
|
+
const planId = new ObjectId();
|
|
468
|
+
await ShiftPlanModel.db.insertOne({ _id: planId, company: options.company, project: options.project, list: listId, name: 'Week', timeZone: 'UTC' });
|
|
469
|
+
await ShiftModel.db.updateOne({ _id: shiftId }, { $set: { plan: planId, assignments: [{ participant: firstParticipantId, customer: firstCustomerId, breaks: [] }] } });
|
|
470
|
+
const assigned = await listParticipantsService.planningParticipants(listId, { level: 'plan', plan: planId }, undefined, undefined, undefined, planningOptions, 'assigned');
|
|
471
|
+
const all = await listParticipantsService.planningParticipants(listId, { level: 'plan', plan: planId }, undefined, undefined, undefined, planningOptions, 'all');
|
|
472
|
+
expect(assigned.coverage).toBeUndefined();
|
|
473
|
+
expect(assigned.data.map((entry) => entry._id.toString())).toEqual([firstParticipantId.toString()]);
|
|
474
|
+
// `all` still asks for the pool, not coverage, so the caller gets every participant
|
|
475
|
+
expect(all.coverage).toBeUndefined();
|
|
476
|
+
expect(all.all).toBe(2);
|
|
477
|
+
});
|
|
82
478
|
});
|
|
83
479
|
//# sourceMappingURL=listParticipantsPlanning.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listParticipantsPlanning.spec.js","sourceRoot":"","sources":["../../tests/listParticipantsPlanning.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAe,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,MAAM,MAAM,gCAAgC,CAAC;AACpD,OAAO,qBAAqB,MAAM,0CAA0C,CAAC;AAC7E,OAAO,UAAU,MAAM,8BAA8B,CAAC;AACtD,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,uBAAuB,MAAM,6CAA6C,CAAC;AAElF,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACtG,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,IAAI,QAAQ,EAAE,CAAC;AAClC,MAAM,eAAe,GAAG,IAAI,QAAQ,EAAE,CAAC;AACvC,MAAM,eAAe,GAAG,IAAI,QAAQ,EAAE,CAAC;AACvC,MAAM,mBAAmB,GAAG,IAAI,QAAQ,EAAE,CAAC;AAC3C,MAAM,eAAe,GAAG,IAAI,QAAQ,EAAE,CAAC;AACvC,MAAM,gBAAgB,GAAG,IAAI,QAAQ,EAAE,CAAC;AACxC,MAAM,kBAAkB,GAAG,IAAI,QAAQ,EAAE,CAAC;AAC1C,MAAM,mBAAmB,GAAG,IAAI,QAAQ,EAAE,CAAC;AAC3C,MAAM,sBAAsB,GAAG,IAAI,QAAQ,EAAE,CAAC;AAE9C,MAAM,UAAU,GAAG,GAAyB,EAAE,CAAC;IAC7C,EAAE,SAAS,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;IAC/E,EAAE,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;CACjE,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,EAAY,EAAE,IAAc,EAAE,KAAgC,EAAE,QAAgB,EAAE,SAAkC,EAAE,EAAE,EAAE,CAC7I,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAEpI,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAE/C,IAAI,MAAmB,CAAC;IAExB,SAAS,CAAC,KAAK,IAAI,EAAE;QAEnB,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,sDAAsD,CAAgB,CAAC;QAClH,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9E,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QAEpB,KAAK,MAAM,UAAU,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;YAEzG,OAAO,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAAE,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE7E,CAAC;QACD,MAAM,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE;YAChK,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAS,CAAC,CAAC;QAChJ,MAAM,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAS,CAAC,CAAC;QACjN,MAAM,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAS,CAAC,CAAC;QACzK,MAAM,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,EAAS,CAAC,CAAC;QACzM,MAAM,cAAc,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAS,CAAC,CAAC;QAC5K,MAAM,qBAAqB,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAQ,CAAC,CAAC;QACxJ,MAAM,qBAAqB,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,CAAQ,CAAC,CAAC;QAC3H,MAAM,qBAAqB,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,sBAAsB,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAQ,CAAC,CAAC;IAE9J,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAElB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAEvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAEzE,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;QAEpK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAE3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAE9D,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAS,CAAC,CAAC;QACtK,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAS,CAAC,CAAC;QAEvK,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAE1G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAElE,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;QAEpK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,KAAK,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAEzF,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;QACtK,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAErG,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;QACzK,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE9B,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"listParticipantsPlanning.spec.js","sourceRoot":"","sources":["../../tests/listParticipantsPlanning.spec.ts"],"names":[],"mappings":"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"}
|