placementt-core 1.400.1117 → 1.400.1118

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.
@@ -14,7 +14,6 @@ export declare const misSyncCallables: {
14
14
  method: z.ZodEnum<["email", "api"]>;
15
15
  allowedSenders: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
16
16
  studentEmailDomains: z.ZodArray<z.ZodString, "many">;
17
- columnMapping: z.ZodRecord<z.ZodEnum<["mis_student_id", "first_name", "last_name", "email", "year_group", "course", "tutor_group", "status", "start_date", "leave_date"]>, z.ZodString>;
18
17
  inactiveStatuses: z.ZodArray<z.ZodString, "many">;
19
18
  requireApproval: z.ZodBoolean;
20
19
  maxArchivePercent: z.ZodNumber;
@@ -30,7 +29,6 @@ export declare const misSyncCallables: {
30
29
  enabled: boolean;
31
30
  allowedSenders: string[];
32
31
  studentEmailDomains: string[];
33
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
34
32
  inactiveStatuses: string[];
35
33
  requireApproval: boolean;
36
34
  maxArchivePercent: number;
@@ -44,7 +42,6 @@ export declare const misSyncCallables: {
44
42
  enabled: boolean;
45
43
  allowedSenders: string[];
46
44
  studentEmailDomains: string[];
47
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
48
45
  inactiveStatuses: string[];
49
46
  requireApproval: boolean;
50
47
  maxArchivePercent: number;
@@ -17,7 +17,6 @@ export declare const allCallables: {
17
17
  method: z.ZodEnum<["email", "api"]>;
18
18
  allowedSenders: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
19
19
  studentEmailDomains: z.ZodArray<z.ZodString, "many">;
20
- columnMapping: z.ZodRecord<z.ZodEnum<["mis_student_id", "first_name", "last_name", "email", "year_group", "course", "tutor_group", "status", "start_date", "leave_date"]>, z.ZodString>;
21
20
  inactiveStatuses: z.ZodArray<z.ZodString, "many">;
22
21
  requireApproval: z.ZodBoolean;
23
22
  maxArchivePercent: z.ZodNumber;
@@ -33,7 +32,6 @@ export declare const allCallables: {
33
32
  enabled: boolean;
34
33
  allowedSenders: string[];
35
34
  studentEmailDomains: string[];
36
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
37
35
  inactiveStatuses: string[];
38
36
  requireApproval: boolean;
39
37
  maxArchivePercent: number;
@@ -47,7 +45,6 @@ export declare const allCallables: {
47
45
  enabled: boolean;
48
46
  allowedSenders: string[];
49
47
  studentEmailDomains: string[];
50
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
51
48
  inactiveStatuses: string[];
52
49
  requireApproval: boolean;
53
50
  maxArchivePercent: number;
@@ -2765,7 +2762,6 @@ export declare const callableGroups: {
2765
2762
  method: z.ZodEnum<["email", "api"]>;
2766
2763
  allowedSenders: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
2767
2764
  studentEmailDomains: z.ZodArray<z.ZodString, "many">;
2768
- columnMapping: z.ZodRecord<z.ZodEnum<["mis_student_id", "first_name", "last_name", "email", "year_group", "course", "tutor_group", "status", "start_date", "leave_date"]>, z.ZodString>;
2769
2765
  inactiveStatuses: z.ZodArray<z.ZodString, "many">;
2770
2766
  requireApproval: z.ZodBoolean;
2771
2767
  maxArchivePercent: z.ZodNumber;
@@ -2781,7 +2777,6 @@ export declare const callableGroups: {
2781
2777
  enabled: boolean;
2782
2778
  allowedSenders: string[];
2783
2779
  studentEmailDomains: string[];
2784
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
2785
2780
  inactiveStatuses: string[];
2786
2781
  requireApproval: boolean;
2787
2782
  maxArchivePercent: number;
@@ -2795,7 +2790,6 @@ export declare const callableGroups: {
2795
2790
  enabled: boolean;
2796
2791
  allowedSenders: string[];
2797
2792
  studentEmailDomains: string[];
2798
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
2799
2793
  inactiveStatuses: string[];
2800
2794
  requireApproval: boolean;
2801
2795
  maxArchivePercent: number;
package/lib/misSync.d.ts CHANGED
@@ -11,15 +11,10 @@ import { z } from "zod";
11
11
  * that list staying minimal).
12
12
  */
13
13
  /** Canonical snapshot columns, in the order the spec documents them. */
14
- export declare const MIS_SNAPSHOT_FIELDS: readonly ["mis_student_id", "first_name", "last_name", "email", "year_group", "course", "tutor_group", "status", "start_date", "leave_date"];
14
+ export declare const MIS_SNAPSHOT_FIELDS: readonly ["mis_student_id", "first_name", "last_name", "email", "year_group", "parent_email", "course", "tutor_group", "status", "start_date", "leave_date"];
15
15
  export type MisSnapshotField = typeof MIS_SNAPSHOT_FIELDS[number];
16
16
  /** Columns a file must have. A file missing any of these is never applied. */
17
17
  export declare const MIS_REQUIRED_FIELDS: readonly MisSnapshotField[];
18
- /**
19
- * Header spellings accepted without any mapping. Compared after
20
- * `normaliseMisHeader`, so case, spaces and hyphens don't matter.
21
- */
22
- export declare const MIS_FIELD_ALIASES: Record<MisSnapshotField, readonly string[]>;
23
18
  /** Human labels for the settings panel and preview. */
24
19
  export declare const MIS_FIELD_LABELS: Record<MisSnapshotField, string>;
25
20
  /** One validated snapshot row. Optional columns are omitted when blank. */
@@ -29,6 +24,7 @@ export type MisSnapshotRow = {
29
24
  "last_name": string;
30
25
  "email": string;
31
26
  "year_group": string;
27
+ "parent_email"?: string;
32
28
  "course"?: string;
33
29
  "tutor_group"?: string;
34
30
  "status"?: string;
@@ -37,7 +33,10 @@ export type MisSnapshotRow = {
37
33
  };
38
34
  /** A raw row keyed by canonical field, before validation. */
39
35
  export type MisRawRow = Partial<Record<MisSnapshotField, string>>;
40
- /** Per-field header overrides: canonical field to the header in the college's file. */
36
+ /**
37
+ * Per-field header overrides, stored on `InstituteData.mis.mapping`: canonical
38
+ * field to the exact header in the college's file.
39
+ */
41
40
  export type MisColumnMapping = Partial<Record<MisSnapshotField, string>>;
42
41
  export type MisRowErrorCode = "missing" | "invalid" | "tooLong" | "duplicateId" | "duplicateEmail" | "emailDomain" | "emailInUse" | "dateOrder";
43
42
  /**
@@ -98,7 +97,6 @@ export type MisSyncConfig = {
98
97
  allowedSenders: string[];
99
98
  /** If set, every student email must be on one of these domains. */
100
99
  studentEmailDomains: string[];
101
- columnMapping: MisColumnMapping;
102
100
  inactiveStatuses: string[];
103
101
  requireApproval: boolean;
104
102
  maxArchivePercent: number;
@@ -215,28 +213,28 @@ export type MisSyncRun = {
215
213
  updatedAt: string;
216
214
  };
217
215
  /**
218
- * Normalises a header for matching: lower case, trimmed, runs of spaces, hyphens
219
- * and dots become one underscore, and a UTF-8 BOM is dropped.
216
+ * Drops the UTF-8 BOM Excel adds and surrounding whitespace. Nothing else: headers
217
+ * must match exactly.
220
218
  *
221
219
  * @param {string} header the raw header text.
222
- * @return {string} the normalised header.
220
+ * @return {string} the cleaned header.
223
221
  */
224
- export declare const normaliseMisHeader: (header: string) => string;
222
+ export declare const cleanMisHeader: (header: string) => string;
225
223
  export type MisColumnResolution = {
226
224
  /** Canonical field to column index in the file. */
227
225
  columns: Partial<Record<MisSnapshotField, number>>;
228
226
  missingRequired: MisSnapshotField[];
229
227
  /** Headers that map to no field. */
230
228
  ignored: string[];
231
- /** Fields matched by more than one header. The first wins. */
229
+ /** Fields whose header appears more than once. The first wins. */
232
230
  ambiguous: MisSnapshotField[];
233
231
  };
234
232
  /**
235
- * Works out which column holds each field. A configured mapping wins over the
236
- * built-in aliases, so a college can point `year_group` at "Course Year 2025".
233
+ * Works out which column holds each field. Each field is found by its exact
234
+ * header: the college's mapped name if it has one, otherwise the field name.
237
235
  *
238
236
  * @param {string[]} headers the header row as read from the file.
239
- * @param {MisColumnMapping} mapping per-field header overrides from the config.
237
+ * @param {MisColumnMapping} mapping per-field header overrides from the institute.
240
238
  * @return {MisColumnResolution} the resolved columns and any problems.
241
239
  */
242
240
  export declare const resolveMisColumns: (headers: string[], mapping?: MisColumnMapping) => MisColumnResolution;
@@ -316,7 +314,6 @@ export declare const misSyncSettingsSchema: z.ZodObject<{
316
314
  method: z.ZodEnum<["email", "api"]>;
317
315
  allowedSenders: z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">;
318
316
  studentEmailDomains: z.ZodArray<z.ZodString, "many">;
319
- columnMapping: z.ZodRecord<z.ZodEnum<["mis_student_id", "first_name", "last_name", "email", "year_group", "course", "tutor_group", "status", "start_date", "leave_date"]>, z.ZodString>;
320
317
  inactiveStatuses: z.ZodArray<z.ZodString, "many">;
321
318
  requireApproval: z.ZodBoolean;
322
319
  maxArchivePercent: z.ZodNumber;
@@ -329,7 +326,6 @@ export declare const misSyncSettingsSchema: z.ZodObject<{
329
326
  enabled: boolean;
330
327
  allowedSenders: string[];
331
328
  studentEmailDomains: string[];
332
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
333
329
  inactiveStatuses: string[];
334
330
  requireApproval: boolean;
335
331
  maxArchivePercent: number;
@@ -342,7 +338,6 @@ export declare const misSyncSettingsSchema: z.ZodObject<{
342
338
  enabled: boolean;
343
339
  allowedSenders: string[];
344
340
  studentEmailDomains: string[];
345
- columnMapping: Partial<Record<"email" | "status" | "mis_student_id" | "first_name" | "last_name" | "year_group" | "course" | "tutor_group" | "start_date" | "leave_date", string>>;
346
341
  inactiveStatuses: string[];
347
342
  requireApproval: boolean;
348
343
  maxArchivePercent: number;
package/lib/misSync.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultMisSyncSettings = exports.misSyncSettingsSchema = exports.misAllowedSenderSchema = exports.emptyMisSyncCounts = exports.misInboundTokenFromAddress = exports.misInboundAddress = exports.isMisRowEnrolled = exports.validateMisSnapshot = exports.validateMisRow = exports.isIsoDate = exports.resolveMisColumns = exports.normaliseMisHeader = exports.MIS_SYNC_CHANGES_PER_DOC = exports.MIS_SYNC_DECIDABLE_STATUSES = exports.MIS_SYNC_UPLOAD_FUNCTION = exports.MIS_SYNC_API_KEY_PREFIX = exports.MIS_SYNC_INBOUND_PREFIX = exports.MIS_SYNC_INBOUND_DOMAIN = exports.MIS_SYNC_MAX_STORED_ERRORS = exports.MIS_SYNC_MAX_ROWS = exports.MIS_SYNC_MAX_FILE_BYTES = exports.MIS_SYNC_DEFAULTS = exports.MIS_DEFAULT_INACTIVE_STATUSES = exports.MIS_FIELD_LABELS = exports.MIS_FIELD_ALIASES = exports.MIS_REQUIRED_FIELDS = exports.MIS_SNAPSHOT_FIELDS = void 0;
3
+ exports.defaultMisSyncSettings = exports.misSyncSettingsSchema = exports.misAllowedSenderSchema = exports.emptyMisSyncCounts = exports.misInboundTokenFromAddress = exports.misInboundAddress = exports.isMisRowEnrolled = exports.validateMisSnapshot = exports.validateMisRow = exports.isIsoDate = exports.resolveMisColumns = exports.cleanMisHeader = exports.MIS_SYNC_CHANGES_PER_DOC = exports.MIS_SYNC_DECIDABLE_STATUSES = exports.MIS_SYNC_UPLOAD_FUNCTION = exports.MIS_SYNC_API_KEY_PREFIX = exports.MIS_SYNC_INBOUND_PREFIX = exports.MIS_SYNC_INBOUND_DOMAIN = exports.MIS_SYNC_MAX_STORED_ERRORS = exports.MIS_SYNC_MAX_ROWS = exports.MIS_SYNC_MAX_FILE_BYTES = exports.MIS_SYNC_DEFAULTS = exports.MIS_DEFAULT_INACTIVE_STATUSES = exports.MIS_FIELD_LABELS = exports.MIS_REQUIRED_FIELDS = exports.MIS_SNAPSHOT_FIELDS = void 0;
4
4
  const zod_1 = require("zod");
5
5
  /**
6
6
  * MIS file sync: shared contract between the college's scheduled MIS export, the
@@ -20,6 +20,7 @@ exports.MIS_SNAPSHOT_FIELDS = [
20
20
  "last_name",
21
21
  "email",
22
22
  "year_group",
23
+ "parent_email",
23
24
  "course",
24
25
  "tutor_group",
25
26
  "status",
@@ -34,28 +35,13 @@ exports.MIS_REQUIRED_FIELDS = [
34
35
  "email",
35
36
  "year_group",
36
37
  ];
37
- /**
38
- * Header spellings accepted without any mapping. Compared after
39
- * `normaliseMisHeader`, so case, spaces and hyphens don't matter.
40
- */
41
- exports.MIS_FIELD_ALIASES = {
42
- "mis_student_id": ["mis_student_id", "student_id", "learner_id", "student_ref", "student_reference"],
43
- "first_name": ["first_name", "forename", "firstname", "legal_forename", "preferred_forename"],
44
- "last_name": ["last_name", "surname", "lastname", "legal_surname"],
45
- "email": ["email", "college_email", "email_address", "student_email"],
46
- "year_group": ["year_group", "course_year", "year", "year_of_study"],
47
- "course": ["course", "course_name", "programme", "study_programme"],
48
- "tutor_group": ["tutor_group", "tutor", "form_group", "registration_group"],
49
- "status": ["status", "enrolment_status", "enrollment_status"],
50
- "start_date": ["start_date", "enrolment_date", "enrollment_date"],
51
- "leave_date": ["leave_date", "end_date", "withdrawal_date"],
52
- };
53
38
  /** Human labels for the settings panel and preview. */
54
39
  exports.MIS_FIELD_LABELS = {
55
40
  "mis_student_id": "MIS student ID",
56
41
  "first_name": "First name",
57
42
  "last_name": "Last name",
58
43
  "email": "College email",
44
+ "parent_email": "Parent email",
59
45
  "year_group": "Year group / course year",
60
46
  "course": "Course",
61
47
  "tutor_group": "Tutor group",
@@ -101,32 +87,31 @@ exports.MIS_SYNC_DECIDABLE_STATUSES = ["pendingApproval", "blocked"];
101
87
  /** How many preview changes go in each `changes` doc. */
102
88
  exports.MIS_SYNC_CHANGES_PER_DOC = 400;
103
89
  /**
104
- * Normalises a header for matching: lower case, trimmed, runs of spaces, hyphens
105
- * and dots become one underscore, and a UTF-8 BOM is dropped.
90
+ * Drops the UTF-8 BOM Excel adds and surrounding whitespace. Nothing else: headers
91
+ * must match exactly.
106
92
  *
107
93
  * @param {string} header the raw header text.
108
- * @return {string} the normalised header.
94
+ * @return {string} the cleaned header.
109
95
  */
110
- const normaliseMisHeader = (header) => header.replace(/^\uFEFF/, "").trim().toLowerCase().replace(/[\s\-./]+/g, "_").replace(/^_+|_+$/g, "");
111
- exports.normaliseMisHeader = normaliseMisHeader;
96
+ const cleanMisHeader = (header) => header.replace(/^\uFEFF/, "").trim();
97
+ exports.cleanMisHeader = cleanMisHeader;
112
98
  /**
113
- * Works out which column holds each field. A configured mapping wins over the
114
- * built-in aliases, so a college can point `year_group` at "Course Year 2025".
99
+ * Works out which column holds each field. Each field is found by its exact
100
+ * header: the college's mapped name if it has one, otherwise the field name.
115
101
  *
116
102
  * @param {string[]} headers the header row as read from the file.
117
- * @param {MisColumnMapping} mapping per-field header overrides from the config.
103
+ * @param {MisColumnMapping} mapping per-field header overrides from the institute.
118
104
  * @return {MisColumnResolution} the resolved columns and any problems.
119
105
  */
120
106
  const resolveMisColumns = (headers, mapping = {}) => {
121
- const normalised = headers.map(exports.normaliseMisHeader);
107
+ const cleaned = headers.map(exports.cleanMisHeader);
122
108
  const columns = {};
123
109
  const ambiguous = [];
124
110
  const used = new Set();
125
111
  for (const field of exports.MIS_SNAPSHOT_FIELDS) {
126
- const override = mapping[field]?.trim();
127
- const candidates = override ? [(0, exports.normaliseMisHeader)(override)] : exports.MIS_FIELD_ALIASES[field];
128
- const matches = normalised
129
- .map((h, i) => (candidates.includes(h) && !used.has(i) ? i : -1))
112
+ const expected = mapping[field]?.trim() || field;
113
+ const matches = cleaned
114
+ .map((h, i) => (h === expected && !used.has(i) ? i : -1))
130
115
  .filter((i) => i >= 0);
131
116
  if (!matches.length)
132
117
  continue;
@@ -162,6 +147,7 @@ const FIELD_MAX_LENGTH = {
162
147
  "first_name": 100,
163
148
  "last_name": 100,
164
149
  "email": 254,
150
+ "parent_email": 254,
165
151
  "year_group": 50,
166
152
  "course": 150,
167
153
  "tutor_group": 50,
@@ -213,6 +199,11 @@ const validateMisRow = (raw, rowNumber, studentEmailDomains = []) => {
213
199
  }
214
200
  }
215
201
  }
202
+ if (clean.parent_email) {
203
+ clean.parent_email = clean.parent_email.toLowerCase();
204
+ if (!emailSchema.safeParse(clean.parent_email).success)
205
+ fail("parent_email", "invalid", "Parent email is not a valid email address.");
206
+ }
216
207
  for (const field of ["start_date", "leave_date"]) {
217
208
  if (clean[field] && !(0, exports.isIsoDate)(clean[field]))
218
209
  fail(field, "invalid", `${exports.MIS_FIELD_LABELS[field]} must be a date in YYYY-MM-DD format.`);
@@ -327,7 +318,6 @@ exports.misSyncSettingsSchema = zod_1.z.object({
327
318
  method: zod_1.z.enum(["email", "api"]),
328
319
  allowedSenders: zod_1.z.array(exports.misAllowedSenderSchema).max(20),
329
320
  studentEmailDomains: zod_1.z.array(zod_1.z.string().trim().toLowerCase().regex(/^@?[a-z0-9.-]+\.[a-z]{2,}$/, "Enter a domain such as college.ac.uk.")).max(10),
330
- columnMapping: zod_1.z.record(zod_1.z.enum(exports.MIS_SNAPSHOT_FIELDS), zod_1.z.string().trim().max(100)),
331
321
  inactiveStatuses: zod_1.z.array(zod_1.z.string().trim().min(1).max(50)).max(30),
332
322
  requireApproval: zod_1.z.boolean(),
333
323
  maxArchivePercent: zod_1.z.number().min(0).max(100),
@@ -346,7 +336,6 @@ const defaultMisSyncSettings = () => ({
346
336
  method: "email",
347
337
  allowedSenders: [],
348
338
  studentEmailDomains: [],
349
- columnMapping: {},
350
339
  inactiveStatuses: [...exports.MIS_DEFAULT_INACTIVE_STATUSES],
351
340
  requireApproval: exports.MIS_SYNC_DEFAULTS.requireApproval,
352
341
  maxArchivePercent: exports.MIS_SYNC_DEFAULTS.maxArchivePercent,
@@ -1 +1 @@
1
- {"version":3,"file":"misSync.js","sourceRoot":"","sources":["../src/misSync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misSync.js","sourceRoot":"","sources":["../src/misSync.ts"],"names":[],"mappings":"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"}
@@ -9,29 +9,27 @@ const good = {
9
9
  "email": "Ada.Lovelace@College.ac.uk",
10
10
  "year_group": "Year 12",
11
11
  };
12
- describe("normaliseMisHeader", () => {
13
- it("ignores case, spacing, punctuation and a BOM", () => {
14
- expect((0, misSync_1.normaliseMisHeader)("\uFEFF MIS Student-ID ")).toBe("mis_student_id");
15
- expect((0, misSync_1.normaliseMisHeader)("Course.Year")).toBe("course_year");
16
- });
17
- });
18
12
  describe("resolveMisColumns", () => {
19
- it("matches canonical headers and aliases", () => {
20
- const r = (0, misSync_1.resolveMisColumns)(["mis_student_id", "Forename", "Surname", "Email", "Course Year", "Extra"]);
13
+ it("matches exact field names, ignoring only a BOM and surrounding spaces", () => {
14
+ const r = (0, misSync_1.resolveMisColumns)(["\uFEFFmis_student_id", " first_name ", "last_name", "email", "year_group", "Forename", "Extra"]);
21
15
  expect(r.columns).toEqual({ "mis_student_id": 0, "first_name": 1, "last_name": 2, "email": 3, "year_group": 4 });
22
16
  expect(r.missingRequired).toEqual([]);
23
- expect(r.ignored).toEqual(["Extra"]);
17
+ expect(r.ignored).toEqual(["Forename", "Extra"]);
24
18
  });
25
- it("prefers a configured mapping over aliases", () => {
26
- const r = (0, misSync_1.resolveMisColumns)(["Learner Ref", "first_name", "last_name", "email", "Yr 2025"], { "mis_student_id": "learner ref", "year_group": "Yr 2025" });
19
+ it("never guesses: other spellings and case don't match", () => {
20
+ expect((0, misSync_1.resolveMisColumns)(["Student ID", "First_Name", "surname", "email", "year_group"]).missingRequired).toEqual(["mis_student_id", "first_name", "last_name"]);
21
+ });
22
+ it("uses the mapped header instead of the field name", () => {
23
+ const r = (0, misSync_1.resolveMisColumns)(["Learner Ref", "first_name", "last_name", "email", "Yr 2025", "mis_student_id"], { "mis_student_id": "Learner Ref", "year_group": "Yr 2025" });
27
24
  expect(r.columns.mis_student_id).toBe(0);
28
25
  expect(r.columns.year_group).toBe(4);
26
+ expect(r.ignored).toEqual(["mis_student_id"]);
29
27
  });
30
28
  it("reports missing required columns", () => {
31
29
  expect((0, misSync_1.resolveMisColumns)(["first_name", "email"]).missingRequired).toEqual(["mis_student_id", "last_name", "year_group"]);
32
30
  });
33
- it("flags a field matched twice and uses the first", () => {
34
- const r = (0, misSync_1.resolveMisColumns)(["email", "college_email", "mis_student_id", "first_name", "last_name", "year_group"]);
31
+ it("flags a repeated header and uses the first", () => {
32
+ const r = (0, misSync_1.resolveMisColumns)(["email", "email", "mis_student_id", "first_name", "last_name", "year_group"]);
35
33
  expect(r.ambiguous).toContain("email");
36
34
  expect(r.columns.email).toBe(0);
37
35
  });
@@ -59,6 +57,11 @@ describe("validateMisRow", () => {
59
57
  expect((0, misSync_1.validateMisRow)({ ...good, "start_date": "2025-02-30" }, 2).errors[0].field).toBe("start_date");
60
58
  expect((0, misSync_1.validateMisRow)({ ...good, "start_date": "2025-09-01", "leave_date": "2025-01-01" }, 2).errors[0].code).toBe("dateOrder");
61
59
  });
60
+ it("lower-cases a parent email and rejects an invalid one", () => {
61
+ expect((0, misSync_1.validateMisRow)({ ...good, "parent_email": "Parent@Home.com" }, 2).row?.parent_email).toBe("parent@home.com");
62
+ expect((0, misSync_1.validateMisRow)({ ...good, "parent_email": "nope" }, 2).errors[0].field).toBe("parent_email");
63
+ expect((0, misSync_1.validateMisRow)({ ...good, "parent_email": "parent@elsewhere.com" }, 2, ["college.ac.uk"]).errors).toEqual([]);
64
+ });
62
65
  it("enforces student email domains when configured", () => {
63
66
  expect((0, misSync_1.validateMisRow)(good, 2, ["college.ac.uk"]).errors).toEqual([]);
64
67
  expect((0, misSync_1.validateMisRow)(good, 2, ["@college.ac.uk"]).errors).toEqual([]);
@@ -1 +1 @@
1
- {"version":3,"file":"misSync.test.js","sourceRoot":"","sources":["../src/misSync.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misSync.test.js","sourceRoot":"","sources":["../src/misSync.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import type { ChecklistItem, GiftHistory } from "./customerCareConfig";
5
5
  import type { StudentTaskConfigMap, SurveyKind, SurveySendPolicyMap, SurveySlot } from "./surveys/types";
6
6
  import type { InstitutePricing } from "./pricing";
7
7
  import type { CompassActivityType, CompassCareersPartnerType, CompassDeliveryMethod } from "./compassTemplate";
8
+ import type { MisColumnMapping } from "./misSync";
8
9
  export type FilterObject = {
9
10
  [key: string]: {
10
11
  label: string;
@@ -1058,6 +1059,10 @@ export type EmployerField = {
1058
1059
  /** The areas of the staff platform that each own part of the careers year. */
1059
1060
  export type CareersSetupArea = "development" | "destinations";
1060
1061
  export type InstituteData = {
1062
+ /** MIS file sync. `mapping` holds the college's own header for any field not named exactly as we specify. */
1063
+ mis?: {
1064
+ mapping?: MisColumnMapping;
1065
+ };
1061
1066
  students: number;
1062
1067
  staff: number;
1063
1068
  studentsFields: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../src/typeDefinitions.ts"],"names":[],"mappings":";;;AAqkIA,sDASC;AAeD,oDAKC;AAaD,0CAEC;AA/nED;;;;;kFAKkF;AACrE,QAAA,qBAAqB,GAAG,SAAS,CAAC;AAClC,QAAA,iBAAiB,GAAG,OAAO,CAAC;AA2iEzC;yEACyE;AAC5D,QAAA,0BAA0B,GAA2C;IAC9E,gBAAgB,EAAE,2BAA2B;IAC7C,mBAAmB,EAAE,sBAAsB;IAC3C,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,UAAU,EAAE,oCAAoC;IAChD,aAAa,EAAE,yBAAyB;IACxC,aAAa,EAAE,wBAAwB;IACvC,KAAK,EAAE,OAAO;CACjB,CAAC;AAEW,QAAA,0BAA0B,GAA+C;IAClF,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,SAAgB,qBAAqB,CAAC,SAAsC;IACxE,QAAQ,SAAS,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC;QAC5B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,OAAO,CAAC,CAAC,OAAO,UAAU,CAAC;IAC3B,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAChC,IAAwC,EACxC,MAA6C;IAE7C,OAAO,IAAI,EAAE,WAAW,IAAI,MAAM,EAAE,YAAY,IAAI,KAAK,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,eAAe,CAAC,KAA6D;IACzF,OAAO,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../src/typeDefinitions.ts"],"names":[],"mappings":";;;AAwkIA,sDASC;AAeD,oDAKC;AAaD,0CAEC;AA/nED;;;;;kFAKkF;AACrE,QAAA,qBAAqB,GAAG,SAAS,CAAC;AAClC,QAAA,iBAAiB,GAAG,OAAO,CAAC;AA2iEzC;yEACyE;AAC5D,QAAA,0BAA0B,GAA2C;IAC9E,gBAAgB,EAAE,2BAA2B;IAC7C,mBAAmB,EAAE,sBAAsB;IAC3C,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,UAAU,EAAE,oCAAoC;IAChD,aAAa,EAAE,yBAAyB;IACxC,aAAa,EAAE,wBAAwB;IACvC,KAAK,EAAE,OAAO;CACjB,CAAC;AAEW,QAAA,0BAA0B,GAA+C;IAClF,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,SAAgB,qBAAqB,CAAC,SAAsC;IACxE,QAAQ,SAAS,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC;QAC5B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,OAAO,CAAC,CAAC,OAAO,UAAU,CAAC;IAC3B,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,oBAAoB,CAChC,IAAwC,EACxC,MAA6C;IAE7C,OAAO,IAAI,EAAE,WAAW,IAAI,MAAM,EAAE,YAAY,IAAI,KAAK,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,eAAe,CAAC,KAA6D;IACzF,OAAO,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AAC/E,CAAC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "private": false,
3
3
  "name": "placementt-core",
4
4
  "author": "Placementt",
5
- "version": "1.400.1117",
5
+ "version": "1.400.1118",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "scripts": {
@@ -6,7 +6,6 @@ import {
6
6
  misInboundTokenFromAddress,
7
7
  misAllowedSenderSchema,
8
8
  misSyncSettingsSchema,
9
- normaliseMisHeader,
10
9
  resolveMisColumns,
11
10
  validateMisRow,
12
11
  validateMisSnapshot,
@@ -22,33 +21,31 @@ const good: MisRawRow = {
22
21
  "year_group": "Year 12",
23
22
  };
24
23
 
25
- describe("normaliseMisHeader", () => {
26
- it("ignores case, spacing, punctuation and a BOM", () => {
27
- expect(normaliseMisHeader("\uFEFF MIS Student-ID ")).toBe("mis_student_id");
28
- expect(normaliseMisHeader("Course.Year")).toBe("course_year");
29
- });
30
- });
31
-
32
24
  describe("resolveMisColumns", () => {
33
- it("matches canonical headers and aliases", () => {
34
- const r = resolveMisColumns(["mis_student_id", "Forename", "Surname", "Email", "Course Year", "Extra"]);
25
+ it("matches exact field names, ignoring only a BOM and surrounding spaces", () => {
26
+ const r = resolveMisColumns(["\uFEFFmis_student_id", " first_name ", "last_name", "email", "year_group", "Forename", "Extra"]);
35
27
  expect(r.columns).toEqual({"mis_student_id": 0, "first_name": 1, "last_name": 2, "email": 3, "year_group": 4});
36
28
  expect(r.missingRequired).toEqual([]);
37
- expect(r.ignored).toEqual(["Extra"]);
29
+ expect(r.ignored).toEqual(["Forename", "Extra"]);
38
30
  });
39
31
 
40
- it("prefers a configured mapping over aliases", () => {
41
- const r = resolveMisColumns(["Learner Ref", "first_name", "last_name", "email", "Yr 2025"], {"mis_student_id": "learner ref", "year_group": "Yr 2025"});
32
+ it("never guesses: other spellings and case don't match", () => {
33
+ expect(resolveMisColumns(["Student ID", "First_Name", "surname", "email", "year_group"]).missingRequired).toEqual(["mis_student_id", "first_name", "last_name"]);
34
+ });
35
+
36
+ it("uses the mapped header instead of the field name", () => {
37
+ const r = resolveMisColumns(["Learner Ref", "first_name", "last_name", "email", "Yr 2025", "mis_student_id"], {"mis_student_id": "Learner Ref", "year_group": "Yr 2025"});
42
38
  expect(r.columns.mis_student_id).toBe(0);
43
39
  expect(r.columns.year_group).toBe(4);
40
+ expect(r.ignored).toEqual(["mis_student_id"]);
44
41
  });
45
42
 
46
43
  it("reports missing required columns", () => {
47
44
  expect(resolveMisColumns(["first_name", "email"]).missingRequired).toEqual(["mis_student_id", "last_name", "year_group"]);
48
45
  });
49
46
 
50
- it("flags a field matched twice and uses the first", () => {
51
- const r = resolveMisColumns(["email", "college_email", "mis_student_id", "first_name", "last_name", "year_group"]);
47
+ it("flags a repeated header and uses the first", () => {
48
+ const r = resolveMisColumns(["email", "email", "mis_student_id", "first_name", "last_name", "year_group"]);
52
49
  expect(r.ambiguous).toContain("email");
53
50
  expect(r.columns.email).toBe(0);
54
51
  });
@@ -81,6 +78,12 @@ describe("validateMisRow", () => {
81
78
  expect(validateMisRow({...good, "start_date": "2025-09-01", "leave_date": "2025-01-01"}, 2).errors[0].code).toBe("dateOrder");
82
79
  });
83
80
 
81
+ it("lower-cases a parent email and rejects an invalid one", () => {
82
+ expect(validateMisRow({...good, "parent_email": "Parent@Home.com"}, 2).row?.parent_email).toBe("parent@home.com");
83
+ expect(validateMisRow({...good, "parent_email": "nope"}, 2).errors[0].field).toBe("parent_email");
84
+ expect(validateMisRow({...good, "parent_email": "parent@elsewhere.com"}, 2, ["college.ac.uk"]).errors).toEqual([]);
85
+ });
86
+
84
87
  it("enforces student email domains when configured", () => {
85
88
  expect(validateMisRow(good, 2, ["college.ac.uk"]).errors).toEqual([]);
86
89
  expect(validateMisRow(good, 2, ["@college.ac.uk"]).errors).toEqual([]);
package/src/misSync.ts CHANGED
@@ -19,6 +19,7 @@ export const MIS_SNAPSHOT_FIELDS = [
19
19
  "last_name",
20
20
  "email",
21
21
  "year_group",
22
+ "parent_email",
22
23
  "course",
23
24
  "tutor_group",
24
25
  "status",
@@ -37,29 +38,13 @@ export const MIS_REQUIRED_FIELDS: readonly MisSnapshotField[] = [
37
38
  "year_group",
38
39
  ];
39
40
 
40
- /**
41
- * Header spellings accepted without any mapping. Compared after
42
- * `normaliseMisHeader`, so case, spaces and hyphens don't matter.
43
- */
44
- export const MIS_FIELD_ALIASES: Record<MisSnapshotField, readonly string[]> = {
45
- "mis_student_id": ["mis_student_id", "student_id", "learner_id", "student_ref", "student_reference"],
46
- "first_name": ["first_name", "forename", "firstname", "legal_forename", "preferred_forename"],
47
- "last_name": ["last_name", "surname", "lastname", "legal_surname"],
48
- "email": ["email", "college_email", "email_address", "student_email"],
49
- "year_group": ["year_group", "course_year", "year", "year_of_study"],
50
- "course": ["course", "course_name", "programme", "study_programme"],
51
- "tutor_group": ["tutor_group", "tutor", "form_group", "registration_group"],
52
- "status": ["status", "enrolment_status", "enrollment_status"],
53
- "start_date": ["start_date", "enrolment_date", "enrollment_date"],
54
- "leave_date": ["leave_date", "end_date", "withdrawal_date"],
55
- };
56
-
57
41
  /** Human labels for the settings panel and preview. */
58
42
  export const MIS_FIELD_LABELS: Record<MisSnapshotField, string> = {
59
43
  "mis_student_id": "MIS student ID",
60
44
  "first_name": "First name",
61
45
  "last_name": "Last name",
62
46
  "email": "College email",
47
+ "parent_email": "Parent email",
63
48
  "year_group": "Year group / course year",
64
49
  "course": "Course",
65
50
  "tutor_group": "Tutor group",
@@ -75,6 +60,7 @@ export type MisSnapshotRow = {
75
60
  "last_name": string,
76
61
  "email": string,
77
62
  "year_group": string,
63
+ "parent_email"?: string,
78
64
  "course"?: string,
79
65
  "tutor_group"?: string,
80
66
  "status"?: string,
@@ -85,7 +71,10 @@ export type MisSnapshotRow = {
85
71
  /** A raw row keyed by canonical field, before validation. */
86
72
  export type MisRawRow = Partial<Record<MisSnapshotField, string>>;
87
73
 
88
- /** Per-field header overrides: canonical field to the header in the college's file. */
74
+ /**
75
+ * Per-field header overrides, stored on `InstituteData.mis.mapping`: canonical
76
+ * field to the exact header in the college's file.
77
+ */
89
78
  export type MisColumnMapping = Partial<Record<MisSnapshotField, string>>;
90
79
 
91
80
  export type MisRowErrorCode =
@@ -177,7 +166,6 @@ export type MisSyncConfig = {
177
166
  allowedSenders: string[],
178
167
  /** If set, every student email must be on one of these domains. */
179
168
  studentEmailDomains: string[],
180
- columnMapping: MisColumnMapping,
181
169
  inactiveStatuses: string[],
182
170
  requireApproval: boolean,
183
171
  maxArchivePercent: number,
@@ -306,14 +294,13 @@ export type MisSyncRun = {
306
294
  };
307
295
 
308
296
  /**
309
- * Normalises a header for matching: lower case, trimmed, runs of spaces, hyphens
310
- * and dots become one underscore, and a UTF-8 BOM is dropped.
297
+ * Drops the UTF-8 BOM Excel adds and surrounding whitespace. Nothing else: headers
298
+ * must match exactly.
311
299
  *
312
300
  * @param {string} header the raw header text.
313
- * @return {string} the normalised header.
301
+ * @return {string} the cleaned header.
314
302
  */
315
- export const normaliseMisHeader = (header: string): string =>
316
- header.replace(/^\uFEFF/, "").trim().toLowerCase().replace(/[\s\-./]+/g, "_").replace(/^_+|_+$/g, "");
303
+ export const cleanMisHeader = (header: string): string => header.replace(/^\uFEFF/, "").trim();
317
304
 
318
305
  export type MisColumnResolution = {
319
306
  /** Canonical field to column index in the file. */
@@ -321,29 +308,28 @@ export type MisColumnResolution = {
321
308
  missingRequired: MisSnapshotField[],
322
309
  /** Headers that map to no field. */
323
310
  ignored: string[],
324
- /** Fields matched by more than one header. The first wins. */
311
+ /** Fields whose header appears more than once. The first wins. */
325
312
  ambiguous: MisSnapshotField[],
326
313
  };
327
314
 
328
315
  /**
329
- * Works out which column holds each field. A configured mapping wins over the
330
- * built-in aliases, so a college can point `year_group` at "Course Year 2025".
316
+ * Works out which column holds each field. Each field is found by its exact
317
+ * header: the college's mapped name if it has one, otherwise the field name.
331
318
  *
332
319
  * @param {string[]} headers the header row as read from the file.
333
- * @param {MisColumnMapping} mapping per-field header overrides from the config.
320
+ * @param {MisColumnMapping} mapping per-field header overrides from the institute.
334
321
  * @return {MisColumnResolution} the resolved columns and any problems.
335
322
  */
336
323
  export const resolveMisColumns = (headers: string[], mapping: MisColumnMapping = {}): MisColumnResolution => {
337
- const normalised = headers.map(normaliseMisHeader);
324
+ const cleaned = headers.map(cleanMisHeader);
338
325
  const columns: Partial<Record<MisSnapshotField, number>> = {};
339
326
  const ambiguous: MisSnapshotField[] = [];
340
327
  const used = new Set<number>();
341
328
 
342
329
  for (const field of MIS_SNAPSHOT_FIELDS) {
343
- const override = mapping[field]?.trim();
344
- const candidates = override ? [normaliseMisHeader(override)] : MIS_FIELD_ALIASES[field];
345
- const matches = normalised
346
- .map((h, i) => (candidates.includes(h) && !used.has(i) ? i : -1))
330
+ const expected = mapping[field]?.trim() || field;
331
+ const matches = cleaned
332
+ .map((h, i) => (h === expected && !used.has(i) ? i : -1))
347
333
  .filter((i) => i >= 0);
348
334
  if (!matches.length) continue;
349
335
  if (matches.length > 1) ambiguous.push(field);
@@ -378,6 +364,7 @@ const FIELD_MAX_LENGTH: Record<MisSnapshotField, number> = {
378
364
  "first_name": 100,
379
365
  "last_name": 100,
380
366
  "email": 254,
367
+ "parent_email": 254,
381
368
  "year_group": 50,
382
369
  "course": 150,
383
370
  "tutor_group": 50,
@@ -431,6 +418,10 @@ export const validateMisRow = (raw: MisRawRow, rowNumber: number, studentEmailDo
431
418
  }
432
419
  }
433
420
  }
421
+ if (clean.parent_email) {
422
+ clean.parent_email = clean.parent_email.toLowerCase();
423
+ if (!emailSchema.safeParse(clean.parent_email).success) fail("parent_email", "invalid", "Parent email is not a valid email address.");
424
+ }
434
425
  for (const field of ["start_date", "leave_date"] as const) {
435
426
  if (clean[field] && !isIsoDate(clean[field] as string)) fail(field, "invalid", `${MIS_FIELD_LABELS[field]} must be a date in YYYY-MM-DD format.`);
436
427
  }
@@ -555,7 +546,6 @@ export const misSyncSettingsSchema = z.object({
555
546
  method: z.enum(["email", "api"]),
556
547
  allowedSenders: z.array(misAllowedSenderSchema).max(20),
557
548
  studentEmailDomains: z.array(z.string().trim().toLowerCase().regex(/^@?[a-z0-9.-]+\.[a-z]{2,}$/, "Enter a domain such as college.ac.uk.")).max(10),
558
- columnMapping: z.record(z.enum(MIS_SNAPSHOT_FIELDS), z.string().trim().max(100)),
559
549
  inactiveStatuses: z.array(z.string().trim().min(1).max(50)).max(30),
560
550
  requireApproval: z.boolean(),
561
551
  maxArchivePercent: z.number().min(0).max(100),
@@ -577,7 +567,6 @@ export const defaultMisSyncSettings = (): MisSyncSettings => ({
577
567
  method: "email",
578
568
  allowedSenders: [],
579
569
  studentEmailDomains: [],
580
- columnMapping: {},
581
570
  inactiveStatuses: [...MIS_DEFAULT_INACTIVE_STATUSES],
582
571
  requireApproval: MIS_SYNC_DEFAULTS.requireApproval,
583
572
  maxArchivePercent: MIS_SYNC_DEFAULTS.maxArchivePercent,
@@ -5,6 +5,7 @@ import type {ChecklistItem, GiftHistory} from "./customerCareConfig";
5
5
  import type {StudentTaskConfigMap, SurveyKind, SurveySendPolicyMap, SurveySlot} from "./surveys/types";
6
6
  import type {InstitutePricing} from "./pricing";
7
7
  import type {CompassActivityType, CompassCareersPartnerType, CompassDeliveryMethod} from "./compassTemplate";
8
+ import type {MisColumnMapping} from "./misSync";
8
9
 
9
10
  export type FilterObject = {
10
11
  [key: string]: {
@@ -1106,6 +1107,8 @@ export type EmployerField = {
1106
1107
  export type CareersSetupArea = "development"|"destinations";
1107
1108
 
1108
1109
  export type InstituteData = {
1110
+ /** MIS file sync. `mapping` holds the college's own header for any field not named exactly as we specify. */
1111
+ mis?: {mapping?: MisColumnMapping},
1109
1112
  students: number,
1110
1113
  staff: number,
1111
1114
  studentsFields: string[],