placementt-core 1.400.1128 → 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
  }>;
@@ -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;
@@ -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(),
@@ -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
  }>;
@@ -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;
@@ -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;
@@ -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.1128",
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
  }),
@@ -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(),
@@ -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?: {