@voyant-travel/mice 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Delegate registry — the attendee roster of a program with role + lifecycle
3
+ * status, plus per-session enrollment. The gap the audit found: bookings model
4
+ * travelers but have no attendee lifecycle (invited → … → checked_in/no_show),
5
+ * delegate roles, or session enrollment.
6
+ *
7
+ * No new PII store (§9-Q7): identity/dietary/accessibility live on the linked
8
+ * CRM person / booking traveler (KMS-encrypted there). A delegate references
9
+ * `personId`/`bookingId` and carries only role/status/timing.
10
+ */
11
+ export declare const delegateRoleEnum: import("drizzle-orm/pg-core").PgEnum<["attendee", "speaker", "sponsor", "vip", "staff", "exhibitor", "organizer"]>;
12
+ export declare const delegateStatusEnum: import("drizzle-orm/pg-core").PgEnum<["invited", "registered", "confirmed", "checked_in", "no_show", "cancelled"]>;
13
+ export declare const programDelegates: import("drizzle-orm/pg-core").PgTableWithColumns<{
14
+ name: "mice_program_delegates";
15
+ schema: undefined;
16
+ columns: {
17
+ id: import("drizzle-orm/pg-core").PgColumn<{
18
+ name: string;
19
+ tableName: "mice_program_delegates";
20
+ dataType: "string";
21
+ columnType: "PgText";
22
+ data: string;
23
+ driverParam: string;
24
+ notNull: true;
25
+ hasDefault: true;
26
+ isPrimaryKey: true;
27
+ isAutoincrement: false;
28
+ hasRuntimeDefault: true;
29
+ enumValues: [string, ...string[]];
30
+ baseColumn: never;
31
+ identity: undefined;
32
+ generated: undefined;
33
+ }, {}, {}>;
34
+ programId: import("drizzle-orm/pg-core").PgColumn<{
35
+ name: string;
36
+ tableName: "mice_program_delegates";
37
+ dataType: "string";
38
+ columnType: "PgText";
39
+ data: string;
40
+ driverParam: string;
41
+ notNull: true;
42
+ hasDefault: false;
43
+ isPrimaryKey: false;
44
+ isAutoincrement: false;
45
+ hasRuntimeDefault: false;
46
+ enumValues: [string, ...string[]];
47
+ baseColumn: never;
48
+ identity: undefined;
49
+ generated: undefined;
50
+ }, {}, {}>;
51
+ personId: import("drizzle-orm/pg-core").PgColumn<{
52
+ name: string;
53
+ tableName: "mice_program_delegates";
54
+ dataType: "string";
55
+ columnType: "PgText";
56
+ data: string;
57
+ driverParam: string;
58
+ notNull: false;
59
+ hasDefault: false;
60
+ isPrimaryKey: false;
61
+ isAutoincrement: false;
62
+ hasRuntimeDefault: false;
63
+ enumValues: [string, ...string[]];
64
+ baseColumn: never;
65
+ identity: undefined;
66
+ generated: undefined;
67
+ }, {}, {}>;
68
+ bookingId: import("drizzle-orm/pg-core").PgColumn<{
69
+ name: string;
70
+ tableName: "mice_program_delegates";
71
+ dataType: "string";
72
+ columnType: "PgText";
73
+ data: string;
74
+ driverParam: string;
75
+ notNull: false;
76
+ hasDefault: false;
77
+ isPrimaryKey: false;
78
+ isAutoincrement: false;
79
+ hasRuntimeDefault: false;
80
+ enumValues: [string, ...string[]];
81
+ baseColumn: never;
82
+ identity: undefined;
83
+ generated: undefined;
84
+ }, {}, {}>;
85
+ role: import("drizzle-orm/pg-core").PgColumn<{
86
+ name: "role";
87
+ tableName: "mice_program_delegates";
88
+ dataType: "string";
89
+ columnType: "PgEnumColumn";
90
+ data: "staff" | "attendee" | "speaker" | "sponsor" | "vip" | "exhibitor" | "organizer";
91
+ driverParam: string;
92
+ notNull: true;
93
+ hasDefault: true;
94
+ isPrimaryKey: false;
95
+ isAutoincrement: false;
96
+ hasRuntimeDefault: false;
97
+ enumValues: ["attendee", "speaker", "sponsor", "vip", "staff", "exhibitor", "organizer"];
98
+ baseColumn: never;
99
+ identity: undefined;
100
+ generated: undefined;
101
+ }, {}, {}>;
102
+ status: import("drizzle-orm/pg-core").PgColumn<{
103
+ name: "status";
104
+ tableName: "mice_program_delegates";
105
+ dataType: "string";
106
+ columnType: "PgEnumColumn";
107
+ data: "cancelled" | "invited" | "registered" | "confirmed" | "checked_in" | "no_show";
108
+ driverParam: string;
109
+ notNull: true;
110
+ hasDefault: true;
111
+ isPrimaryKey: false;
112
+ isAutoincrement: false;
113
+ hasRuntimeDefault: false;
114
+ enumValues: ["invited", "registered", "confirmed", "checked_in", "no_show", "cancelled"];
115
+ baseColumn: never;
116
+ identity: undefined;
117
+ generated: undefined;
118
+ }, {}, {}>;
119
+ arrivalAt: import("drizzle-orm/pg-core").PgColumn<{
120
+ name: "arrival_at";
121
+ tableName: "mice_program_delegates";
122
+ dataType: "date";
123
+ columnType: "PgTimestamp";
124
+ data: Date;
125
+ driverParam: string;
126
+ notNull: false;
127
+ hasDefault: false;
128
+ isPrimaryKey: false;
129
+ isAutoincrement: false;
130
+ hasRuntimeDefault: false;
131
+ enumValues: undefined;
132
+ baseColumn: never;
133
+ identity: undefined;
134
+ generated: undefined;
135
+ }, {}, {}>;
136
+ departureAt: import("drizzle-orm/pg-core").PgColumn<{
137
+ name: "departure_at";
138
+ tableName: "mice_program_delegates";
139
+ dataType: "date";
140
+ columnType: "PgTimestamp";
141
+ data: Date;
142
+ driverParam: string;
143
+ notNull: false;
144
+ hasDefault: false;
145
+ isPrimaryKey: false;
146
+ isAutoincrement: false;
147
+ hasRuntimeDefault: false;
148
+ enumValues: undefined;
149
+ baseColumn: never;
150
+ identity: undefined;
151
+ generated: undefined;
152
+ }, {}, {}>;
153
+ notes: import("drizzle-orm/pg-core").PgColumn<{
154
+ name: "notes";
155
+ tableName: "mice_program_delegates";
156
+ dataType: "string";
157
+ columnType: "PgText";
158
+ data: string;
159
+ driverParam: string;
160
+ notNull: false;
161
+ hasDefault: false;
162
+ isPrimaryKey: false;
163
+ isAutoincrement: false;
164
+ hasRuntimeDefault: false;
165
+ enumValues: [string, ...string[]];
166
+ baseColumn: never;
167
+ identity: undefined;
168
+ generated: undefined;
169
+ }, {}, {}>;
170
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
171
+ name: "metadata";
172
+ tableName: "mice_program_delegates";
173
+ dataType: "json";
174
+ columnType: "PgJsonb";
175
+ data: Record<string, unknown>;
176
+ driverParam: unknown;
177
+ notNull: false;
178
+ hasDefault: false;
179
+ isPrimaryKey: false;
180
+ isAutoincrement: false;
181
+ hasRuntimeDefault: false;
182
+ enumValues: undefined;
183
+ baseColumn: never;
184
+ identity: undefined;
185
+ generated: undefined;
186
+ }, {}, {
187
+ $type: Record<string, unknown>;
188
+ }>;
189
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
190
+ name: "created_at";
191
+ tableName: "mice_program_delegates";
192
+ dataType: "date";
193
+ columnType: "PgTimestamp";
194
+ data: Date;
195
+ driverParam: string;
196
+ notNull: true;
197
+ hasDefault: true;
198
+ isPrimaryKey: false;
199
+ isAutoincrement: false;
200
+ hasRuntimeDefault: false;
201
+ enumValues: undefined;
202
+ baseColumn: never;
203
+ identity: undefined;
204
+ generated: undefined;
205
+ }, {}, {}>;
206
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
207
+ name: "updated_at";
208
+ tableName: "mice_program_delegates";
209
+ dataType: "date";
210
+ columnType: "PgTimestamp";
211
+ data: Date;
212
+ driverParam: string;
213
+ notNull: true;
214
+ hasDefault: true;
215
+ isPrimaryKey: false;
216
+ isAutoincrement: false;
217
+ hasRuntimeDefault: false;
218
+ enumValues: undefined;
219
+ baseColumn: never;
220
+ identity: undefined;
221
+ generated: undefined;
222
+ }, {}, {}>;
223
+ };
224
+ dialect: "pg";
225
+ }>;
226
+ export declare const enrollmentStatusEnum: import("drizzle-orm/pg-core").PgEnum<["registered", "waitlisted", "attended", "cancelled"]>;
227
+ export declare const delegateSessionEnrollments: import("drizzle-orm/pg-core").PgTableWithColumns<{
228
+ name: "mice_delegate_session_enrollments";
229
+ schema: undefined;
230
+ columns: {
231
+ id: import("drizzle-orm/pg-core").PgColumn<{
232
+ name: string;
233
+ tableName: "mice_delegate_session_enrollments";
234
+ dataType: "string";
235
+ columnType: "PgText";
236
+ data: string;
237
+ driverParam: string;
238
+ notNull: true;
239
+ hasDefault: true;
240
+ isPrimaryKey: true;
241
+ isAutoincrement: false;
242
+ hasRuntimeDefault: true;
243
+ enumValues: [string, ...string[]];
244
+ baseColumn: never;
245
+ identity: undefined;
246
+ generated: undefined;
247
+ }, {}, {}>;
248
+ delegateId: import("drizzle-orm/pg-core").PgColumn<{
249
+ name: string;
250
+ tableName: "mice_delegate_session_enrollments";
251
+ dataType: "string";
252
+ columnType: "PgText";
253
+ data: string;
254
+ driverParam: string;
255
+ notNull: true;
256
+ hasDefault: false;
257
+ isPrimaryKey: false;
258
+ isAutoincrement: false;
259
+ hasRuntimeDefault: false;
260
+ enumValues: [string, ...string[]];
261
+ baseColumn: never;
262
+ identity: undefined;
263
+ generated: undefined;
264
+ }, {}, {}>;
265
+ sessionId: import("drizzle-orm/pg-core").PgColumn<{
266
+ name: string;
267
+ tableName: "mice_delegate_session_enrollments";
268
+ dataType: "string";
269
+ columnType: "PgText";
270
+ data: string;
271
+ driverParam: string;
272
+ notNull: true;
273
+ hasDefault: false;
274
+ isPrimaryKey: false;
275
+ isAutoincrement: false;
276
+ hasRuntimeDefault: false;
277
+ enumValues: [string, ...string[]];
278
+ baseColumn: never;
279
+ identity: undefined;
280
+ generated: undefined;
281
+ }, {}, {}>;
282
+ status: import("drizzle-orm/pg-core").PgColumn<{
283
+ name: "status";
284
+ tableName: "mice_delegate_session_enrollments";
285
+ dataType: "string";
286
+ columnType: "PgEnumColumn";
287
+ data: "cancelled" | "registered" | "waitlisted" | "attended";
288
+ driverParam: string;
289
+ notNull: true;
290
+ hasDefault: true;
291
+ isPrimaryKey: false;
292
+ isAutoincrement: false;
293
+ hasRuntimeDefault: false;
294
+ enumValues: ["registered", "waitlisted", "attended", "cancelled"];
295
+ baseColumn: never;
296
+ identity: undefined;
297
+ generated: undefined;
298
+ }, {}, {}>;
299
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
300
+ name: "created_at";
301
+ tableName: "mice_delegate_session_enrollments";
302
+ dataType: "date";
303
+ columnType: "PgTimestamp";
304
+ data: Date;
305
+ driverParam: string;
306
+ notNull: true;
307
+ hasDefault: true;
308
+ isPrimaryKey: false;
309
+ isAutoincrement: false;
310
+ hasRuntimeDefault: false;
311
+ enumValues: undefined;
312
+ baseColumn: never;
313
+ identity: undefined;
314
+ generated: undefined;
315
+ }, {}, {}>;
316
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
317
+ name: "updated_at";
318
+ tableName: "mice_delegate_session_enrollments";
319
+ dataType: "date";
320
+ columnType: "PgTimestamp";
321
+ data: Date;
322
+ driverParam: string;
323
+ notNull: true;
324
+ hasDefault: true;
325
+ isPrimaryKey: false;
326
+ isAutoincrement: false;
327
+ hasRuntimeDefault: false;
328
+ enumValues: undefined;
329
+ baseColumn: never;
330
+ identity: undefined;
331
+ generated: undefined;
332
+ }, {}, {}>;
333
+ };
334
+ dialect: "pg";
335
+ }>;
336
+ export type ProgramDelegate = typeof programDelegates.$inferSelect;
337
+ export type NewProgramDelegate = typeof programDelegates.$inferInsert;
338
+ export type DelegateSessionEnrollment = typeof delegateSessionEnrollments.$inferSelect;
339
+ export type NewDelegateSessionEnrollment = typeof delegateSessionEnrollments.$inferInsert;
340
+ //# sourceMappingURL=schema-delegates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-delegates.d.ts","sourceRoot":"","sources":["../src/schema-delegates.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,oHAQ3B,CAAA;AAEF,eAAO,MAAM,kBAAkB,oHAO7B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B5B,CAAA;AAED,eAAO,MAAM,oBAAoB,6FAK/B,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBtC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC,YAAY,CAAA;AAClE,MAAM,MAAM,kBAAkB,GAAG,OAAO,gBAAgB,CAAC,YAAY,CAAA;AACrE,MAAM,MAAM,yBAAyB,GAAG,OAAO,0BAA0B,CAAC,YAAY,CAAA;AACtF,MAAM,MAAM,4BAA4B,GAAG,OAAO,0BAA0B,CAAC,YAAY,CAAA"}
@@ -0,0 +1,76 @@
1
+ import { typeId, typeIdRef } from "@voyant-travel/db/lib/typeid-column";
2
+ import { index, jsonb, pgEnum, pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core";
3
+ import { programs } from "./schema.js";
4
+ import { programSessions } from "./schema-sessions.js";
5
+ /**
6
+ * Delegate registry — the attendee roster of a program with role + lifecycle
7
+ * status, plus per-session enrollment. The gap the audit found: bookings model
8
+ * travelers but have no attendee lifecycle (invited → … → checked_in/no_show),
9
+ * delegate roles, or session enrollment.
10
+ *
11
+ * No new PII store (§9-Q7): identity/dietary/accessibility live on the linked
12
+ * CRM person / booking traveler (KMS-encrypted there). A delegate references
13
+ * `personId`/`bookingId` and carries only role/status/timing.
14
+ */
15
+ export const delegateRoleEnum = pgEnum("mice_delegate_role", [
16
+ "attendee",
17
+ "speaker",
18
+ "sponsor",
19
+ "vip",
20
+ "staff",
21
+ "exhibitor",
22
+ "organizer",
23
+ ]);
24
+ export const delegateStatusEnum = pgEnum("mice_delegate_status", [
25
+ "invited",
26
+ "registered",
27
+ "confirmed",
28
+ "checked_in",
29
+ "no_show",
30
+ "cancelled",
31
+ ]);
32
+ export const programDelegates = pgTable("mice_program_delegates", {
33
+ id: typeId("mice_program_delegates"),
34
+ // Intra-package FK (delegates + programs both live in mice):
35
+ programId: typeIdRef("program_id")
36
+ .notNull()
37
+ .references(() => programs.id, { onDelete: "cascade" }),
38
+ // Cross-package → loose columns + defineLink at the deployment:
39
+ personId: typeIdRef("person_id"), // → relationships.people (nullable: leads pre-booking)
40
+ bookingId: typeIdRef("booking_id"), // → bookings (populated on confirmation)
41
+ role: delegateRoleEnum("role").notNull().default("attendee"),
42
+ status: delegateStatusEnum("status").notNull().default("invited"),
43
+ arrivalAt: timestamp("arrival_at", { withTimezone: true }),
44
+ departureAt: timestamp("departure_at", { withTimezone: true }),
45
+ notes: text("notes"),
46
+ metadata: jsonb("metadata").$type(),
47
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
48
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
49
+ }, (table) => [
50
+ index("idx_mice_program_delegates_program").on(table.programId),
51
+ index("idx_mice_program_delegates_program_status").on(table.programId, table.status),
52
+ index("idx_mice_program_delegates_person").on(table.personId),
53
+ index("idx_mice_program_delegates_booking").on(table.bookingId),
54
+ ]);
55
+ export const enrollmentStatusEnum = pgEnum("mice_enrollment_status", [
56
+ "registered",
57
+ "waitlisted",
58
+ "attended",
59
+ "cancelled",
60
+ ]);
61
+ export const delegateSessionEnrollments = pgTable("mice_delegate_session_enrollments", {
62
+ id: typeId("mice_delegate_session_enrollments"),
63
+ delegateId: typeIdRef("delegate_id")
64
+ .notNull()
65
+ .references(() => programDelegates.id, { onDelete: "cascade" }),
66
+ sessionId: typeIdRef("session_id")
67
+ .notNull()
68
+ .references(() => programSessions.id, { onDelete: "cascade" }),
69
+ status: enrollmentStatusEnum("status").notNull().default("registered"),
70
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
71
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
72
+ }, (table) => [
73
+ index("idx_mice_enrollments_session").on(table.sessionId),
74
+ // A delegate enrolls in a given session at most once.
75
+ uniqueIndex("uidx_mice_enrollments_delegate_session").on(table.delegateId, table.sessionId),
76
+ ]);