placementt-core 1.400.1128 → 1.400.1130

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.
@@ -5,13 +5,17 @@ const outreach_1 = require("../outreach");
5
5
  * breaks the web or backend payload fails here first. */
6
6
  const samples = {
7
7
  "outreach-upsertContacts": {
8
- request: { rows: [{ urn: "100000", affiliation: "Test School", email: "head@test.sch.uk" }], dryRun: true },
8
+ request: { rows: [{ urn: "100000", affiliation: "Test School", email: "head@test.sch.uk" }], dryRun: true, group: "Derby" },
9
9
  response: { added: 1, updated: 0, keptStatus: 0, noEmail: 0, invalidEmail: 0, duplicateEmailInUpload: 0, skipped: [{ row: 2, reason: "No URN" }] },
10
10
  },
11
11
  "outreach-setStatus": {
12
12
  request: { urn: 100000, status: "deferred", deferUntil: "2027-09-28", reason: "Next year" },
13
13
  response: { urn: 100000, status: "deferred", brevoSynced: true, affectedUrns: [100000] },
14
14
  },
15
+ "outreach-setGroup": {
16
+ request: { urn: 100000, group: "Derby" },
17
+ response: { urn: 100000, group: "Derby", brevoSynced: true, affectedUrns: [100000] },
18
+ },
15
19
  "outreach-convertToLead": {
16
20
  request: { urn: 100000, lead: { forename: "Jo", surname: "Bloggs", email: "jo@test.sch.uk", organisation: "Test School", assignee: "uid1" } },
17
21
  response: { leadId: "lead1" },
@@ -22,7 +26,7 @@ const samples = {
22
26
  },
23
27
  "outreach-setupBrevo": {
24
28
  request: {},
25
- response: { marketingListId: 3, customersListId: 80, webhookId: 5, attributesCreated: ["URN"] },
29
+ response: { folderId: 12, customersListId: 80, webhookId: 5, attributesCreated: ["URN"] },
26
30
  },
27
31
  "outreach-migrateExisting": {
28
32
  request: {},
@@ -49,6 +53,10 @@ describe("outreach contracts", () => {
49
53
  expect(outreach_1.outreachCallables["outreach-setStatus"].request
50
54
  .safeParse({ urn: 1, status: "deferred", deferUntil: "28/09/2027" }).success).toBe(false);
51
55
  });
56
+ it("rejects a blank group name", () => {
57
+ expect(outreach_1.outreachCallables["outreach-upsertContacts"].request
58
+ .safeParse({ rows: [{ urn: "1" }], group: " " }).success).toBe(false);
59
+ });
52
60
  it("rejects an empty upload", () => {
53
61
  expect(outreach_1.outreachCallables["outreach-upsertContacts"].request.safeParse({ rows: [] }).success).toBe(false);
54
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"outreach.test.js","sourceRoot":"","sources":["../../../src/callables/__tests__/outreach.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outreach.test.js","sourceRoot":"","sources":["../../../src/callables/__tests__/outreach.test.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,17 @@ export declare const outreachCallables: {
3
3
  "outreach-upsertContacts": {
4
4
  request: z.ZodObject<{
5
5
  rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
6
+ /** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
7
+ group: z.ZodOptional<z.ZodString>;
6
8
  /** Count what would happen without writing to Firestore or Brevo. */
7
9
  dryRun: z.ZodOptional<z.ZodBoolean>;
8
10
  }, "strip", z.ZodTypeAny, {
9
11
  rows: Record<string, string | undefined>[];
12
+ group?: string | undefined;
10
13
  dryRun?: boolean | undefined;
11
14
  }, {
12
15
  rows: Record<string, string | undefined>[];
16
+ group?: string | undefined;
13
17
  dryRun?: boolean | undefined;
14
18
  }>;
15
19
  response: z.ZodObject<{
@@ -33,6 +37,8 @@ export declare const outreachCallables: {
33
37
  row: number;
34
38
  urn?: string | undefined;
35
39
  }>, "many">;
40
+ /** Rows put in each group by this upload. */
41
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
36
42
  brevoProcessId: z.ZodOptional<z.ZodNumber>;
37
43
  brevoError: z.ZodOptional<z.ZodString>;
38
44
  }, "strip", z.ZodTypeAny, {
@@ -47,6 +53,7 @@ export declare const outreachCallables: {
47
53
  keptStatus: number;
48
54
  invalidEmail: number;
49
55
  duplicateEmailInUpload: number;
56
+ groups?: Record<string, number> | undefined;
50
57
  brevoProcessId?: number | undefined;
51
58
  brevoError?: string | undefined;
52
59
  }, {
@@ -61,6 +68,7 @@ export declare const outreachCallables: {
61
68
  keptStatus: number;
62
69
  invalidEmail: number;
63
70
  duplicateEmailInUpload: number;
71
+ groups?: Record<string, number> | undefined;
64
72
  brevoProcessId?: number | undefined;
65
73
  brevoError?: string | undefined;
66
74
  }>;
@@ -112,6 +120,38 @@ export declare const outreachCallables: {
112
120
  affectedUrns: number[];
113
121
  }>;
114
122
  };
123
+ "outreach-setGroup": {
124
+ request: z.ZodObject<{
125
+ urn: z.ZodNumber;
126
+ /** The school's group; null takes it out of any group. */
127
+ group: z.ZodNullable<z.ZodString>;
128
+ applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
129
+ }, "strip", z.ZodTypeAny, {
130
+ group: string | null;
131
+ urn: number;
132
+ applyToSharedEmail?: boolean | undefined;
133
+ }, {
134
+ group: string | null;
135
+ urn: number;
136
+ applyToSharedEmail?: boolean | undefined;
137
+ }>;
138
+ response: z.ZodObject<{
139
+ urn: z.ZodNumber;
140
+ group: z.ZodNullable<z.ZodString>;
141
+ brevoSynced: z.ZodBoolean;
142
+ affectedUrns: z.ZodArray<z.ZodNumber, "many">;
143
+ }, "strip", z.ZodTypeAny, {
144
+ group: string | null;
145
+ urn: number;
146
+ brevoSynced: boolean;
147
+ affectedUrns: number[];
148
+ }, {
149
+ group: string | null;
150
+ urn: number;
151
+ brevoSynced: boolean;
152
+ affectedUrns: number[];
153
+ }>;
154
+ };
115
155
  "outreach-convertToLead": {
116
156
  request: z.ZodObject<{
117
157
  urn: z.ZodNumber;
@@ -220,17 +260,18 @@ export declare const outreachCallables: {
220
260
  "outreach-setupBrevo": {
221
261
  request: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
222
262
  response: z.ZodObject<{
223
- marketingListId: z.ZodNumber;
263
+ /** The Brevo "Marketing Contacts" folder the group lists live in. */
264
+ folderId: z.ZodNumber;
224
265
  customersListId: z.ZodNumber;
225
266
  webhookId: z.ZodNumber;
226
267
  attributesCreated: z.ZodArray<z.ZodString, "many">;
227
268
  }, "strip", z.ZodTypeAny, {
228
- marketingListId: number;
269
+ folderId: number;
229
270
  customersListId: number;
230
271
  webhookId: number;
231
272
  attributesCreated: string[];
232
273
  }, {
233
- marketingListId: number;
274
+ folderId: number;
234
275
  customersListId: number;
235
276
  webhookId: number;
236
277
  attributesCreated: string[];
@@ -12,11 +12,15 @@ const zod_1 = require("zod");
12
12
  const outreachStatus = zod_1.z.enum(["pool", "lead", "deferred", "customer", "doNotContact"]);
13
13
  /** A pasted spreadsheet row keyed by DFE_CONTACT_UPLOAD_COLUMNS. Raw strings; the backend coerces. */
14
14
  const uploadRow = zod_1.z.record(zod_1.z.string(), zod_1.z.string().optional());
15
+ /** An outreach group name, which is also its Brevo list name. */
16
+ const groupName = zod_1.z.string().trim().min(1, "Name the group.").max(60, "Keep group names under 60 characters.");
15
17
  const isoDate = zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Use a YYYY-MM-DD date.");
16
18
  exports.outreachCallables = {
17
19
  "outreach-upsertContacts": {
18
20
  request: zod_1.z.object({
19
21
  rows: zod_1.z.array(uploadRow).min(1).max(2000),
22
+ /** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
23
+ group: groupName.optional(),
20
24
  /** Count what would happen without writing to Firestore or Brevo. */
21
25
  dryRun: zod_1.z.boolean().optional(),
22
26
  }),
@@ -29,6 +33,8 @@ exports.outreachCallables = {
29
33
  invalidEmail: zod_1.z.number(),
30
34
  duplicateEmailInUpload: zod_1.z.number(),
31
35
  skipped: zod_1.z.array(zod_1.z.object({ row: zod_1.z.number(), urn: zod_1.z.string().optional(), reason: zod_1.z.string() })),
36
+ /** Rows put in each group by this upload. */
37
+ groups: zod_1.z.record(zod_1.z.string(), zod_1.z.number()).optional(),
32
38
  brevoProcessId: zod_1.z.number().optional(),
33
39
  brevoError: zod_1.z.string().optional(),
34
40
  }),
@@ -54,6 +60,20 @@ exports.outreachCallables = {
54
60
  affectedUrns: zod_1.z.array(zod_1.z.number()),
55
61
  }),
56
62
  },
63
+ "outreach-setGroup": {
64
+ request: zod_1.z.object({
65
+ urn: zod_1.z.number(),
66
+ /** The school's group; null takes it out of any group. */
67
+ group: groupName.nullable(),
68
+ applyToSharedEmail: zod_1.z.boolean().optional(),
69
+ }),
70
+ response: zod_1.z.object({
71
+ urn: zod_1.z.number(),
72
+ group: zod_1.z.string().nullable(),
73
+ brevoSynced: zod_1.z.boolean(),
74
+ affectedUrns: zod_1.z.array(zod_1.z.number()),
75
+ }),
76
+ },
57
77
  "outreach-convertToLead": {
58
78
  request: zod_1.z.object({
59
79
  urn: zod_1.z.number(),
@@ -86,7 +106,8 @@ exports.outreachCallables = {
86
106
  "outreach-setupBrevo": {
87
107
  request: zod_1.z.object({}),
88
108
  response: zod_1.z.object({
89
- marketingListId: zod_1.z.number(),
109
+ /** The Brevo "Marketing Contacts" folder the group lists live in. */
110
+ folderId: zod_1.z.number(),
90
111
  customersListId: zod_1.z.number(),
91
112
  webhookId: zod_1.z.number(),
92
113
  attributesCreated: zod_1.z.array(zod_1.z.string()),
@@ -1 +1 @@
1
- {"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../src/callables/outreach.ts"],"names":[],"mappings":";;;AAAA,6BAAsB;AAGtB;;;;;;GAMG;AAEH,MAAM,cAAc,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;AAExF,sGAAsG;AACtG,MAAM,SAAS,GAAG,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE9D,MAAM,OAAO,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,CAAC;AAErE,QAAA,iBAAiB,GAAG;IAC7B,yBAAyB,EAAE;QACvB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YACzC,qEAAqE;YACrE,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SACjC,CAAC;QACF,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;YACjB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;YACnB,0EAA0E;YAC1E,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;YACtB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;YACnB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;YACxB,sBAAsB,EAAE,OAAC,CAAC,MAAM,EAAE;YAClC,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC,EAAC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAC,CAAC,CAAC;YAC7F,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACrC,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACpC,CAAC;KACL;IACD,oBAAoB,EAAE;QAClB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;YACd,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;YACf,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,wCAAwC;YACxC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC9B,mDAAmD;YACnD,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC1B,yDAAyD;YACzD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC7B,6DAA6D;YAC7D,kBAAkB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC7C,CAAC;QACF,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;YACf,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,OAAC,CAAC,OAAO,EAAE;YACxB,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;SACpC,CAAC;KACL;IACD,wBAAwB,EAAE;QACtB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;YACd,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;YACf,IAAI,EAAE,OAAC,CAAC,MAAM,CAAC;gBACX,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC/B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;gBACzB,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE;gBACxB,GAAG,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC3B,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAC9B,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;gBAChC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;gBACpB,aAAa,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;gBAC1C,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;aAC5C,CAAC;SACL,CAAC;QACF,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAC,CAAC;KAC3C;IACD,0BAA0B,EAAE;QACxB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,EAAC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,EAAC,CAAC;QACpC,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,OAAC,CAAC,OAAO,EAAE;YAClB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;YAC5B,gBAAgB,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YACxC,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;YACxD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAClC,CAAC;KACL;IACD,qBAAqB,EAAE;QACnB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;YAC3B,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;YAC3B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;YACrB,iBAAiB,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;SACzC,CAAC;KACL;IACD,0BAA0B,EAAE;QACxB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;YACvB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;YACzB,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE;YAC7B,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;SAC9B,CAAC;KACL;IACD,4BAA4B,EAAE;QAC1B,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;YACd,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;YACtD,kCAAkC;YAClC,KAAK,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAChC,CAAC;QACF,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE;YACjB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACnC,CAAC;KACL;IACD,mBAAmB,EAAE;QACjB,OAAO,EAAE,OAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;SAC5G,CAAC;QACF,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;YACtB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;YAC3B,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;YACzB,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;YAC5B,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC;gBAChB,oBAAoB,EAAE,OAAC,CAAC,MAAM,EAAE;gBAChC,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;aAC/B,CAAC,CAAC,QAAQ,EAAE;SAChB,CAAC;KACL;CACoB,CAAC"}
1
+ {"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../src/callables/outreach.ts"],"names":[],"mappings":"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"}
@@ -14,12 +14,15 @@ export declare const allCallables: {
14
14
  "outreach-upsertContacts": {
15
15
  request: z.ZodObject<{
16
16
  rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
17
+ group: z.ZodOptional<z.ZodString>;
17
18
  dryRun: z.ZodOptional<z.ZodBoolean>;
18
19
  }, "strip", z.ZodTypeAny, {
19
20
  rows: Record<string, string | undefined>[];
21
+ group?: string | undefined;
20
22
  dryRun?: boolean | undefined;
21
23
  }, {
22
24
  rows: Record<string, string | undefined>[];
25
+ group?: string | undefined;
23
26
  dryRun?: boolean | undefined;
24
27
  }>;
25
28
  response: z.ZodObject<{
@@ -42,6 +45,7 @@ export declare const allCallables: {
42
45
  row: number;
43
46
  urn?: string | undefined;
44
47
  }>, "many">;
48
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
45
49
  brevoProcessId: z.ZodOptional<z.ZodNumber>;
46
50
  brevoError: z.ZodOptional<z.ZodString>;
47
51
  }, "strip", z.ZodTypeAny, {
@@ -56,6 +60,7 @@ export declare const allCallables: {
56
60
  keptStatus: number;
57
61
  invalidEmail: number;
58
62
  duplicateEmailInUpload: number;
63
+ groups?: Record<string, number> | undefined;
59
64
  brevoProcessId?: number | undefined;
60
65
  brevoError?: string | undefined;
61
66
  }, {
@@ -70,6 +75,7 @@ export declare const allCallables: {
70
75
  keptStatus: number;
71
76
  invalidEmail: number;
72
77
  duplicateEmailInUpload: number;
78
+ groups?: Record<string, number> | undefined;
73
79
  brevoProcessId?: number | undefined;
74
80
  brevoError?: string | undefined;
75
81
  }>;
@@ -117,6 +123,37 @@ export declare const allCallables: {
117
123
  affectedUrns: number[];
118
124
  }>;
119
125
  };
126
+ "outreach-setGroup": {
127
+ request: z.ZodObject<{
128
+ urn: z.ZodNumber;
129
+ group: z.ZodNullable<z.ZodString>;
130
+ applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
131
+ }, "strip", z.ZodTypeAny, {
132
+ group: string | null;
133
+ urn: number;
134
+ applyToSharedEmail?: boolean | undefined;
135
+ }, {
136
+ group: string | null;
137
+ urn: number;
138
+ applyToSharedEmail?: boolean | undefined;
139
+ }>;
140
+ response: z.ZodObject<{
141
+ urn: z.ZodNumber;
142
+ group: z.ZodNullable<z.ZodString>;
143
+ brevoSynced: z.ZodBoolean;
144
+ affectedUrns: z.ZodArray<z.ZodNumber, "many">;
145
+ }, "strip", z.ZodTypeAny, {
146
+ group: string | null;
147
+ urn: number;
148
+ brevoSynced: boolean;
149
+ affectedUrns: number[];
150
+ }, {
151
+ group: string | null;
152
+ urn: number;
153
+ brevoSynced: boolean;
154
+ affectedUrns: number[];
155
+ }>;
156
+ };
120
157
  "outreach-convertToLead": {
121
158
  request: z.ZodObject<{
122
159
  urn: z.ZodNumber;
@@ -225,17 +262,17 @@ export declare const allCallables: {
225
262
  "outreach-setupBrevo": {
226
263
  request: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
227
264
  response: z.ZodObject<{
228
- marketingListId: z.ZodNumber;
265
+ folderId: z.ZodNumber;
229
266
  customersListId: z.ZodNumber;
230
267
  webhookId: z.ZodNumber;
231
268
  attributesCreated: z.ZodArray<z.ZodString, "many">;
232
269
  }, "strip", z.ZodTypeAny, {
233
- marketingListId: number;
270
+ folderId: number;
234
271
  customersListId: number;
235
272
  webhookId: number;
236
273
  attributesCreated: string[];
237
274
  }, {
238
- marketingListId: number;
275
+ folderId: number;
239
276
  customersListId: number;
240
277
  webhookId: number;
241
278
  attributesCreated: string[];
@@ -3585,12 +3622,15 @@ export declare const callableGroups: {
3585
3622
  "outreach-upsertContacts": {
3586
3623
  request: z.ZodObject<{
3587
3624
  rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
3625
+ group: z.ZodOptional<z.ZodString>;
3588
3626
  dryRun: z.ZodOptional<z.ZodBoolean>;
3589
3627
  }, "strip", z.ZodTypeAny, {
3590
3628
  rows: Record<string, string | undefined>[];
3629
+ group?: string | undefined;
3591
3630
  dryRun?: boolean | undefined;
3592
3631
  }, {
3593
3632
  rows: Record<string, string | undefined>[];
3633
+ group?: string | undefined;
3594
3634
  dryRun?: boolean | undefined;
3595
3635
  }>;
3596
3636
  response: z.ZodObject<{
@@ -3613,6 +3653,7 @@ export declare const callableGroups: {
3613
3653
  row: number;
3614
3654
  urn?: string | undefined;
3615
3655
  }>, "many">;
3656
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
3616
3657
  brevoProcessId: z.ZodOptional<z.ZodNumber>;
3617
3658
  brevoError: z.ZodOptional<z.ZodString>;
3618
3659
  }, "strip", z.ZodTypeAny, {
@@ -3627,6 +3668,7 @@ export declare const callableGroups: {
3627
3668
  keptStatus: number;
3628
3669
  invalidEmail: number;
3629
3670
  duplicateEmailInUpload: number;
3671
+ groups?: Record<string, number> | undefined;
3630
3672
  brevoProcessId?: number | undefined;
3631
3673
  brevoError?: string | undefined;
3632
3674
  }, {
@@ -3641,6 +3683,7 @@ export declare const callableGroups: {
3641
3683
  keptStatus: number;
3642
3684
  invalidEmail: number;
3643
3685
  duplicateEmailInUpload: number;
3686
+ groups?: Record<string, number> | undefined;
3644
3687
  brevoProcessId?: number | undefined;
3645
3688
  brevoError?: string | undefined;
3646
3689
  }>;
@@ -3688,6 +3731,37 @@ export declare const callableGroups: {
3688
3731
  affectedUrns: number[];
3689
3732
  }>;
3690
3733
  };
3734
+ "outreach-setGroup": {
3735
+ request: z.ZodObject<{
3736
+ urn: z.ZodNumber;
3737
+ group: z.ZodNullable<z.ZodString>;
3738
+ applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
3739
+ }, "strip", z.ZodTypeAny, {
3740
+ group: string | null;
3741
+ urn: number;
3742
+ applyToSharedEmail?: boolean | undefined;
3743
+ }, {
3744
+ group: string | null;
3745
+ urn: number;
3746
+ applyToSharedEmail?: boolean | undefined;
3747
+ }>;
3748
+ response: z.ZodObject<{
3749
+ urn: z.ZodNumber;
3750
+ group: z.ZodNullable<z.ZodString>;
3751
+ brevoSynced: z.ZodBoolean;
3752
+ affectedUrns: z.ZodArray<z.ZodNumber, "many">;
3753
+ }, "strip", z.ZodTypeAny, {
3754
+ group: string | null;
3755
+ urn: number;
3756
+ brevoSynced: boolean;
3757
+ affectedUrns: number[];
3758
+ }, {
3759
+ group: string | null;
3760
+ urn: number;
3761
+ brevoSynced: boolean;
3762
+ affectedUrns: number[];
3763
+ }>;
3764
+ };
3691
3765
  "outreach-convertToLead": {
3692
3766
  request: z.ZodObject<{
3693
3767
  urn: z.ZodNumber;
@@ -3796,17 +3870,17 @@ export declare const callableGroups: {
3796
3870
  "outreach-setupBrevo": {
3797
3871
  request: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
3798
3872
  response: z.ZodObject<{
3799
- marketingListId: z.ZodNumber;
3873
+ folderId: z.ZodNumber;
3800
3874
  customersListId: z.ZodNumber;
3801
3875
  webhookId: z.ZodNumber;
3802
3876
  attributesCreated: z.ZodArray<z.ZodString, "many">;
3803
3877
  }, "strip", z.ZodTypeAny, {
3804
- marketingListId: number;
3878
+ folderId: number;
3805
3879
  customersListId: number;
3806
3880
  webhookId: number;
3807
3881
  attributesCreated: string[];
3808
3882
  }, {
3809
- marketingListId: number;
3883
+ folderId: number;
3810
3884
  customersListId: number;
3811
3885
  webhookId: number;
3812
3886
  attributesCreated: string[];
@@ -4421,6 +4421,8 @@ export type DfESchoolContact = {
4421
4421
  city: string;
4422
4422
  doesWex?: boolean;
4423
4423
  notes?: string;
4424
+ /** Outreach group (e.g. "Derby"), false for none. Each group is a Brevo list the
4425
+ * school is in while it is in the mailable pool. */
4424
4426
  group?: string | false;
4425
4427
  url: string;
4426
4428
  potential: string;
@@ -4514,9 +4516,16 @@ export type OutreachCampaign = {
4514
4516
  };
4515
4517
  /** `adminConfig/outreach`. */
4516
4518
  export type OutreachConfig = {
4517
- marketingListId: number;
4519
+ /** Legacy: no longer used. Schools go into their group's list in the Marketing Contacts folder. */
4520
+ marketingListId?: number;
4518
4521
  customersListId: number;
4519
4522
  webhookId?: number;
4523
+ /** The Brevo "Marketing Contacts" folder holding one list per group. */
4524
+ folderId?: number;
4525
+ /** Brevo list id per outreach group name (list named as the group), created on first use. */
4526
+ groupLists?: {
4527
+ [group: string]: number;
4528
+ };
4520
4529
  backfill?: {
4521
4530
  cursorUrn?: number;
4522
4531
  done: boolean;
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.1128",
5
+ "version": "1.400.1130",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "scripts": {
@@ -4,13 +4,17 @@ import {outreachCallables} from "../outreach";
4
4
  * breaks the web or backend payload fails here first. */
5
5
  const samples: {[K in keyof typeof outreachCallables]: {request: unknown, response: unknown}} = {
6
6
  "outreach-upsertContacts": {
7
- request: {rows: [{urn: "100000", affiliation: "Test School", email: "head@test.sch.uk"}], dryRun: true},
7
+ request: {rows: [{urn: "100000", affiliation: "Test School", email: "head@test.sch.uk"}], dryRun: true, group: "Derby"},
8
8
  response: {added: 1, updated: 0, keptStatus: 0, noEmail: 0, invalidEmail: 0, duplicateEmailInUpload: 0, skipped: [{row: 2, reason: "No URN"}]},
9
9
  },
10
10
  "outreach-setStatus": {
11
11
  request: {urn: 100000, status: "deferred", deferUntil: "2027-09-28", reason: "Next year"},
12
12
  response: {urn: 100000, status: "deferred", brevoSynced: true, affectedUrns: [100000]},
13
13
  },
14
+ "outreach-setGroup": {
15
+ request: {urn: 100000, group: "Derby"},
16
+ response: {urn: 100000, group: "Derby", brevoSynced: true, affectedUrns: [100000]},
17
+ },
14
18
  "outreach-convertToLead": {
15
19
  request: {urn: 100000, lead: {forename: "Jo", surname: "Bloggs", email: "jo@test.sch.uk", organisation: "Test School", assignee: "uid1"}},
16
20
  response: {leadId: "lead1"},
@@ -21,7 +25,7 @@ const samples: {[K in keyof typeof outreachCallables]: {request: unknown, respon
21
25
  },
22
26
  "outreach-setupBrevo": {
23
27
  request: {},
24
- response: {marketingListId: 3, customersListId: 80, webhookId: 5, attributesCreated: ["URN"]},
28
+ response: {folderId: 12, customersListId: 80, webhookId: 5, attributesCreated: ["URN"]},
25
29
  },
26
30
  "outreach-migrateExisting": {
27
31
  request: {},
@@ -51,6 +55,11 @@ describe("outreach contracts", () => {
51
55
  .safeParse({urn: 1, status: "deferred", deferUntil: "28/09/2027"}).success).toBe(false);
52
56
  });
53
57
 
58
+ it("rejects a blank group name", () => {
59
+ expect(outreachCallables["outreach-upsertContacts"].request
60
+ .safeParse({rows: [{urn: "1"}], group: " "}).success).toBe(false);
61
+ });
62
+
54
63
  it("rejects an empty upload", () => {
55
64
  expect(outreachCallables["outreach-upsertContacts"].request.safeParse({rows: []}).success).toBe(false);
56
65
  });
@@ -14,12 +14,17 @@ const outreachStatus = z.enum(["pool", "lead", "deferred", "customer", "doNotCon
14
14
  /** A pasted spreadsheet row keyed by DFE_CONTACT_UPLOAD_COLUMNS. Raw strings; the backend coerces. */
15
15
  const uploadRow = z.record(z.string(), z.string().optional());
16
16
 
17
+ /** An outreach group name, which is also its Brevo list name. */
18
+ const groupName = z.string().trim().min(1, "Name the group.").max(60, "Keep group names under 60 characters.");
19
+
17
20
  const isoDate = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Use a YYYY-MM-DD date.");
18
21
 
19
22
  export const outreachCallables = {
20
23
  "outreach-upsertContacts": {
21
24
  request: z.object({
22
25
  rows: z.array(uploadRow).min(1).max(2000),
26
+ /** Group for rows whose group column is blank (created in Brevo if new). A row's own group wins. */
27
+ group: groupName.optional(),
23
28
  /** Count what would happen without writing to Firestore or Brevo. */
24
29
  dryRun: z.boolean().optional(),
25
30
  }),
@@ -32,6 +37,8 @@ export const outreachCallables = {
32
37
  invalidEmail: z.number(),
33
38
  duplicateEmailInUpload: z.number(),
34
39
  skipped: z.array(z.object({row: z.number(), urn: z.string().optional(), reason: z.string()})),
40
+ /** Rows put in each group by this upload. */
41
+ groups: z.record(z.string(), z.number()).optional(),
35
42
  brevoProcessId: z.number().optional(),
36
43
  brevoError: z.string().optional(),
37
44
  }),
@@ -57,6 +64,20 @@ export const outreachCallables = {
57
64
  affectedUrns: z.array(z.number()),
58
65
  }),
59
66
  },
67
+ "outreach-setGroup": {
68
+ request: z.object({
69
+ urn: z.number(),
70
+ /** The school's group; null takes it out of any group. */
71
+ group: groupName.nullable(),
72
+ applyToSharedEmail: z.boolean().optional(),
73
+ }),
74
+ response: z.object({
75
+ urn: z.number(),
76
+ group: z.string().nullable(),
77
+ brevoSynced: z.boolean(),
78
+ affectedUrns: z.array(z.number()),
79
+ }),
80
+ },
60
81
  "outreach-convertToLead": {
61
82
  request: z.object({
62
83
  urn: z.number(),
@@ -89,7 +110,8 @@ export const outreachCallables = {
89
110
  "outreach-setupBrevo": {
90
111
  request: z.object({}),
91
112
  response: z.object({
92
- marketingListId: z.number(),
113
+ /** The Brevo "Marketing Contacts" folder the group lists live in. */
114
+ folderId: z.number(),
93
115
  customersListId: z.number(),
94
116
  webhookId: z.number(),
95
117
  attributesCreated: z.array(z.string()),
@@ -4573,6 +4573,8 @@ export type DfESchoolContact = {
4573
4573
  city: string,
4574
4574
  doesWex?: boolean,
4575
4575
  notes?: string,
4576
+ /** Outreach group (e.g. "Derby"), false for none. Each group is a Brevo list the
4577
+ * school is in while it is in the mailable pool. */
4576
4578
  group?: string|false,
4577
4579
  url: string,
4578
4580
  potential: string,
@@ -4667,9 +4669,14 @@ export type OutreachCampaign = {
4667
4669
 
4668
4670
  /** `adminConfig/outreach`. */
4669
4671
  export type OutreachConfig = {
4670
- marketingListId: number,
4672
+ /** Legacy: no longer used. Schools go into their group's list in the Marketing Contacts folder. */
4673
+ marketingListId?: number,
4671
4674
  customersListId: number,
4672
4675
  webhookId?: number,
4676
+ /** The Brevo "Marketing Contacts" folder holding one list per group. */
4677
+ folderId?: number,
4678
+ /** Brevo list id per outreach group name (list named as the group), created on first use. */
4679
+ groupLists?: {[group: string]: number},
4673
4680
  backfill?: {cursorUrn?: number, done: boolean, total: number, processed?: number},
4674
4681
  lastSweepAt?: string,
4675
4682
  lastReconcile?: {