placementt-core 1.400.1127 → 1.400.1129

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" },
@@ -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
  }>;
@@ -74,6 +82,8 @@ export declare const outreachCallables: {
74
82
  deferUntil: z.ZodOptional<z.ZodString>;
75
83
  /** Customer institute, when status is customer. */
76
84
  oId: z.ZodOptional<z.ZodString>;
85
+ /** Lead to link, e.g. when confirming a domain match. */
86
+ leadId: z.ZodOptional<z.ZodString>;
77
87
  /** Also apply to every URN in `outreach.sharedEmailUrns`. */
78
88
  applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
79
89
  }, "strip", z.ZodTypeAny, {
@@ -82,6 +92,7 @@ export declare const outreachCallables: {
82
92
  reason?: string | undefined;
83
93
  oId?: string | undefined;
84
94
  deferUntil?: string | undefined;
95
+ leadId?: string | undefined;
85
96
  applyToSharedEmail?: boolean | undefined;
86
97
  }, {
87
98
  status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
@@ -89,6 +100,7 @@ export declare const outreachCallables: {
89
100
  reason?: string | undefined;
90
101
  oId?: string | undefined;
91
102
  deferUntil?: string | undefined;
103
+ leadId?: string | undefined;
92
104
  applyToSharedEmail?: boolean | undefined;
93
105
  }>;
94
106
  response: z.ZodObject<{
@@ -108,6 +120,38 @@ export declare const outreachCallables: {
108
120
  affectedUrns: number[];
109
121
  }>;
110
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
+ };
111
155
  "outreach-convertToLead": {
112
156
  request: z.ZodObject<{
113
157
  urn: z.ZodNumber;
@@ -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
  }),
@@ -42,6 +48,8 @@ exports.outreachCallables = {
42
48
  deferUntil: isoDate.optional(),
43
49
  /** Customer institute, when status is customer. */
44
50
  oId: zod_1.z.string().optional(),
51
+ /** Lead to link, e.g. when confirming a domain match. */
52
+ leadId: zod_1.z.string().optional(),
45
53
  /** Also apply to every URN in `outreach.sharedEmailUrns`. */
46
54
  applyToSharedEmail: zod_1.z.boolean().optional(),
47
55
  }),
@@ -52,6 +60,20 @@ exports.outreachCallables = {
52
60
  affectedUrns: zod_1.z.array(zod_1.z.number()),
53
61
  }),
54
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
+ },
55
77
  "outreach-convertToLead": {
56
78
  request: zod_1.z.object({
57
79
  urn: zod_1.z.number(),
@@ -1 +1 @@
1
- {"version":3,"file":"outreach.js","sourceRoot":"","sources":["../../src/callables/outreach.ts"],"names":[],"mappings":"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"}
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
  }>;
@@ -81,6 +87,7 @@ export declare const allCallables: {
81
87
  reason: z.ZodOptional<z.ZodString>;
82
88
  deferUntil: z.ZodOptional<z.ZodString>;
83
89
  oId: z.ZodOptional<z.ZodString>;
90
+ leadId: z.ZodOptional<z.ZodString>;
84
91
  applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
85
92
  }, "strip", z.ZodTypeAny, {
86
93
  status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
@@ -88,6 +95,7 @@ export declare const allCallables: {
88
95
  reason?: string | undefined;
89
96
  oId?: string | undefined;
90
97
  deferUntil?: string | undefined;
98
+ leadId?: string | undefined;
91
99
  applyToSharedEmail?: boolean | undefined;
92
100
  }, {
93
101
  status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
@@ -95,6 +103,7 @@ export declare const allCallables: {
95
103
  reason?: string | undefined;
96
104
  oId?: string | undefined;
97
105
  deferUntil?: string | undefined;
106
+ leadId?: string | undefined;
98
107
  applyToSharedEmail?: boolean | undefined;
99
108
  }>;
100
109
  response: z.ZodObject<{
@@ -114,6 +123,37 @@ export declare const allCallables: {
114
123
  affectedUrns: number[];
115
124
  }>;
116
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
+ };
117
157
  "outreach-convertToLead": {
118
158
  request: z.ZodObject<{
119
159
  urn: z.ZodNumber;
@@ -3582,12 +3622,15 @@ export declare const callableGroups: {
3582
3622
  "outreach-upsertContacts": {
3583
3623
  request: z.ZodObject<{
3584
3624
  rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodOptional<z.ZodString>>, "many">;
3625
+ group: z.ZodOptional<z.ZodString>;
3585
3626
  dryRun: z.ZodOptional<z.ZodBoolean>;
3586
3627
  }, "strip", z.ZodTypeAny, {
3587
3628
  rows: Record<string, string | undefined>[];
3629
+ group?: string | undefined;
3588
3630
  dryRun?: boolean | undefined;
3589
3631
  }, {
3590
3632
  rows: Record<string, string | undefined>[];
3633
+ group?: string | undefined;
3591
3634
  dryRun?: boolean | undefined;
3592
3635
  }>;
3593
3636
  response: z.ZodObject<{
@@ -3610,6 +3653,7 @@ export declare const callableGroups: {
3610
3653
  row: number;
3611
3654
  urn?: string | undefined;
3612
3655
  }>, "many">;
3656
+ groups: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
3613
3657
  brevoProcessId: z.ZodOptional<z.ZodNumber>;
3614
3658
  brevoError: z.ZodOptional<z.ZodString>;
3615
3659
  }, "strip", z.ZodTypeAny, {
@@ -3624,6 +3668,7 @@ export declare const callableGroups: {
3624
3668
  keptStatus: number;
3625
3669
  invalidEmail: number;
3626
3670
  duplicateEmailInUpload: number;
3671
+ groups?: Record<string, number> | undefined;
3627
3672
  brevoProcessId?: number | undefined;
3628
3673
  brevoError?: string | undefined;
3629
3674
  }, {
@@ -3638,6 +3683,7 @@ export declare const callableGroups: {
3638
3683
  keptStatus: number;
3639
3684
  invalidEmail: number;
3640
3685
  duplicateEmailInUpload: number;
3686
+ groups?: Record<string, number> | undefined;
3641
3687
  brevoProcessId?: number | undefined;
3642
3688
  brevoError?: string | undefined;
3643
3689
  }>;
@@ -3649,6 +3695,7 @@ export declare const callableGroups: {
3649
3695
  reason: z.ZodOptional<z.ZodString>;
3650
3696
  deferUntil: z.ZodOptional<z.ZodString>;
3651
3697
  oId: z.ZodOptional<z.ZodString>;
3698
+ leadId: z.ZodOptional<z.ZodString>;
3652
3699
  applyToSharedEmail: z.ZodOptional<z.ZodBoolean>;
3653
3700
  }, "strip", z.ZodTypeAny, {
3654
3701
  status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
@@ -3656,6 +3703,7 @@ export declare const callableGroups: {
3656
3703
  reason?: string | undefined;
3657
3704
  oId?: string | undefined;
3658
3705
  deferUntil?: string | undefined;
3706
+ leadId?: string | undefined;
3659
3707
  applyToSharedEmail?: boolean | undefined;
3660
3708
  }, {
3661
3709
  status: "pool" | "lead" | "deferred" | "customer" | "doNotContact";
@@ -3663,6 +3711,7 @@ export declare const callableGroups: {
3663
3711
  reason?: string | undefined;
3664
3712
  oId?: string | undefined;
3665
3713
  deferUntil?: string | undefined;
3714
+ leadId?: string | undefined;
3666
3715
  applyToSharedEmail?: boolean | undefined;
3667
3716
  }>;
3668
3717
  response: z.ZodObject<{
@@ -3682,6 +3731,37 @@ export declare const callableGroups: {
3682
3731
  affectedUrns: number[];
3683
3732
  }>;
3684
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
+ };
3685
3765
  "outreach-convertToLead": {
3686
3766
  request: z.ZodObject<{
3687
3767
  urn: z.ZodNumber;
@@ -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;
@@ -4517,6 +4519,12 @@ export type OutreachConfig = {
4517
4519
  marketingListId: number;
4518
4520
  customersListId: number;
4519
4521
  webhookId?: number;
4522
+ /** Brevo folder the outreach lists live in. */
4523
+ folderId?: number;
4524
+ /** Brevo list id per outreach group name, created on first use. */
4525
+ groupLists?: {
4526
+ [group: string]: number;
4527
+ };
4520
4528
  backfill?: {
4521
4529
  cursorUrn?: number;
4522
4530
  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.1127",
5
+ "version": "1.400.1129",
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"},
@@ -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
  }),
@@ -45,6 +52,8 @@ export const outreachCallables = {
45
52
  deferUntil: isoDate.optional(),
46
53
  /** Customer institute, when status is customer. */
47
54
  oId: z.string().optional(),
55
+ /** Lead to link, e.g. when confirming a domain match. */
56
+ leadId: z.string().optional(),
48
57
  /** Also apply to every URN in `outreach.sharedEmailUrns`. */
49
58
  applyToSharedEmail: z.boolean().optional(),
50
59
  }),
@@ -55,6 +64,20 @@ export const outreachCallables = {
55
64
  affectedUrns: z.array(z.number()),
56
65
  }),
57
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
+ },
58
81
  "outreach-convertToLead": {
59
82
  request: z.object({
60
83
  urn: z.number(),
@@ -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,
@@ -4670,6 +4672,10 @@ export type OutreachConfig = {
4670
4672
  marketingListId: number,
4671
4673
  customersListId: number,
4672
4674
  webhookId?: number,
4675
+ /** Brevo folder the outreach lists live in. */
4676
+ folderId?: number,
4677
+ /** Brevo list id per outreach group name, created on first use. */
4678
+ groupLists?: {[group: string]: number},
4673
4679
  backfill?: {cursorUrn?: number, done: boolean, total: number, processed?: number},
4674
4680
  lastSweepAt?: string,
4675
4681
  lastReconcile?: {