@voyantjs/crm 0.25.0 → 0.26.1

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.
Files changed (40) hide show
  1. package/dist/index.d.ts +18 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +25 -6
  4. package/dist/route-runtime.d.ts +21 -0
  5. package/dist/route-runtime.d.ts.map +1 -0
  6. package/dist/route-runtime.js +28 -0
  7. package/dist/routes/accounts.d.ts +50 -2
  8. package/dist/routes/accounts.d.ts.map +1 -1
  9. package/dist/routes/index.d.ts +496 -2
  10. package/dist/routes/index.d.ts.map +1 -1
  11. package/dist/routes/index.js +2 -0
  12. package/dist/routes/person-documents.d.ts +458 -0
  13. package/dist/routes/person-documents.d.ts.map +1 -0
  14. package/dist/routes/person-documents.js +160 -0
  15. package/dist/schema-accounts.d.ts +367 -0
  16. package/dist/schema-accounts.d.ts.map +1 -1
  17. package/dist/schema-accounts.js +68 -2
  18. package/dist/schema-activities.js +2 -2
  19. package/dist/schema-relations.js +3 -3
  20. package/dist/schema-sales.js +2 -2
  21. package/dist/schema.d.ts +6 -6
  22. package/dist/schema.d.ts.map +1 -1
  23. package/dist/schema.js +6 -6
  24. package/dist/service/accounts-people.d.ts +49 -1
  25. package/dist/service/accounts-people.d.ts.map +1 -1
  26. package/dist/service/accounts-shared.d.ts +12 -0
  27. package/dist/service/accounts-shared.d.ts.map +1 -1
  28. package/dist/service/accounts-shared.js +4 -0
  29. package/dist/service/accounts.d.ts +49 -1
  30. package/dist/service/accounts.d.ts.map +1 -1
  31. package/dist/service/index.d.ts +1172 -1
  32. package/dist/service/index.d.ts.map +1 -1
  33. package/dist/service/index.js +3 -0
  34. package/dist/service/person-documents.d.ts +1188 -0
  35. package/dist/service/person-documents.d.ts.map +1 -0
  36. package/dist/service/person-documents.js +216 -0
  37. package/dist/validation.d.ts +168 -0
  38. package/dist/validation.d.ts.map +1 -1
  39. package/dist/validation.js +68 -0
  40. package/package.json +6 -5
@@ -0,0 +1,1188 @@
1
+ import type { KeyRef, KmsProvider } from "@voyantjs/utils";
2
+ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
3
+ import { z } from "zod";
4
+ import type { insertPersonDocumentSchema, personDocumentListQuerySchema, updatePersonDocumentSchema } from "../validation.js";
5
+ /**
6
+ * Canonical plaintext shape for free-text PII blobs encrypted as
7
+ * `accessibilityEncrypted` / `dietaryEncrypted` / `loyaltyEncrypted` /
8
+ * `insuranceEncrypted` on `crm.people`. Wrapped so future fields can
9
+ * be added without breaking existing ciphertexts.
10
+ *
11
+ * Writers (customer-portal) and readers (crm + bookings snapshot)
12
+ * must use this shape — drift between sides means decryption fails
13
+ * silently and pre-fill stops working.
14
+ */
15
+ export declare const personPiiBlobPlaintextSchema: z.ZodObject<{
16
+ text: z.ZodString;
17
+ }, z.core.$strip>;
18
+ /**
19
+ * Canonical plaintext shape for `numberEncrypted` on
20
+ * `crm.person_documents`. Same compatibility contract as
21
+ * `personPiiBlobPlaintextSchema`.
22
+ */
23
+ export declare const personDocumentNumberPlaintextSchema: z.ZodObject<{
24
+ number: z.ZodString;
25
+ }, z.core.$strip>;
26
+ /** Plaintext, mergeable snapshot derived from a person record. */
27
+ export interface PersonTravelSnapshot {
28
+ dateOfBirth: string | null;
29
+ dietaryRequirements: string | null;
30
+ accessibilityNeeds: string | null;
31
+ passportNumber: string | null;
32
+ passportExpiry: string | null;
33
+ passportIssuingCountry: string | null;
34
+ passportIssuingAuthority: string | null;
35
+ passportPersonDocumentId: string | null;
36
+ }
37
+ export type CreatePersonDocumentInput = z.infer<typeof insertPersonDocumentSchema>;
38
+ export type UpdatePersonDocumentInput = z.infer<typeof updatePersonDocumentSchema>;
39
+ export type PersonDocumentListQuery = z.infer<typeof personDocumentListQuerySchema>;
40
+ export type PersonDocumentType = CreatePersonDocumentInput["type"];
41
+ export declare const personDocumentsService: {
42
+ listPersonDocuments(db: PostgresJsDatabase, personId: string, query?: PersonDocumentListQuery): Omit<import("drizzle-orm/pg-core").PgSelectBase<"person_documents", {
43
+ id: import("drizzle-orm/pg-core").PgColumn<{
44
+ name: string;
45
+ tableName: "person_documents";
46
+ dataType: "string";
47
+ columnType: "PgText";
48
+ data: string;
49
+ driverParam: string;
50
+ notNull: true;
51
+ hasDefault: true;
52
+ isPrimaryKey: true;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: true;
55
+ enumValues: [string, ...string[]];
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {}>;
60
+ personId: import("drizzle-orm/pg-core").PgColumn<{
61
+ name: string;
62
+ tableName: "person_documents";
63
+ dataType: "string";
64
+ columnType: "PgText";
65
+ data: string;
66
+ driverParam: string;
67
+ notNull: true;
68
+ hasDefault: false;
69
+ isPrimaryKey: false;
70
+ isAutoincrement: false;
71
+ hasRuntimeDefault: false;
72
+ enumValues: [string, ...string[]];
73
+ baseColumn: never;
74
+ identity: undefined;
75
+ generated: undefined;
76
+ }, {}, {}>;
77
+ type: import("drizzle-orm/pg-core").PgColumn<{
78
+ name: "type";
79
+ tableName: "person_documents";
80
+ dataType: "string";
81
+ columnType: "PgEnumColumn";
82
+ data: "passport" | "visa" | "other" | "id_card" | "driver_license";
83
+ driverParam: string;
84
+ notNull: true;
85
+ hasDefault: false;
86
+ isPrimaryKey: false;
87
+ isAutoincrement: false;
88
+ hasRuntimeDefault: false;
89
+ enumValues: ["passport", "id_card", "driver_license", "visa", "other"];
90
+ baseColumn: never;
91
+ identity: undefined;
92
+ generated: undefined;
93
+ }, {}, {}>;
94
+ numberEncrypted: import("drizzle-orm/pg-core").PgColumn<{
95
+ name: "number_encrypted";
96
+ tableName: "person_documents";
97
+ dataType: "json";
98
+ columnType: "PgJsonb";
99
+ data: {
100
+ enc: string;
101
+ } | null;
102
+ driverParam: unknown;
103
+ notNull: false;
104
+ hasDefault: false;
105
+ isPrimaryKey: false;
106
+ isAutoincrement: false;
107
+ hasRuntimeDefault: false;
108
+ enumValues: undefined;
109
+ baseColumn: never;
110
+ identity: undefined;
111
+ generated: undefined;
112
+ }, {}, {
113
+ $type: {
114
+ enc: string;
115
+ } | null;
116
+ }>;
117
+ issuingAuthority: import("drizzle-orm/pg-core").PgColumn<{
118
+ name: "issuing_authority";
119
+ tableName: "person_documents";
120
+ dataType: "string";
121
+ columnType: "PgText";
122
+ data: string;
123
+ driverParam: string;
124
+ notNull: false;
125
+ hasDefault: false;
126
+ isPrimaryKey: false;
127
+ isAutoincrement: false;
128
+ hasRuntimeDefault: false;
129
+ enumValues: [string, ...string[]];
130
+ baseColumn: never;
131
+ identity: undefined;
132
+ generated: undefined;
133
+ }, {}, {}>;
134
+ issuingCountry: import("drizzle-orm/pg-core").PgColumn<{
135
+ name: "issuing_country";
136
+ tableName: "person_documents";
137
+ dataType: "string";
138
+ columnType: "PgText";
139
+ data: string;
140
+ driverParam: string;
141
+ notNull: false;
142
+ hasDefault: false;
143
+ isPrimaryKey: false;
144
+ isAutoincrement: false;
145
+ hasRuntimeDefault: false;
146
+ enumValues: [string, ...string[]];
147
+ baseColumn: never;
148
+ identity: undefined;
149
+ generated: undefined;
150
+ }, {}, {}>;
151
+ issueDate: import("drizzle-orm/pg-core").PgColumn<{
152
+ name: "issue_date";
153
+ tableName: "person_documents";
154
+ dataType: "string";
155
+ columnType: "PgDateString";
156
+ data: string;
157
+ driverParam: string;
158
+ notNull: false;
159
+ hasDefault: false;
160
+ isPrimaryKey: false;
161
+ isAutoincrement: false;
162
+ hasRuntimeDefault: false;
163
+ enumValues: undefined;
164
+ baseColumn: never;
165
+ identity: undefined;
166
+ generated: undefined;
167
+ }, {}, {}>;
168
+ expiryDate: import("drizzle-orm/pg-core").PgColumn<{
169
+ name: "expiry_date";
170
+ tableName: "person_documents";
171
+ dataType: "string";
172
+ columnType: "PgDateString";
173
+ data: string;
174
+ driverParam: string;
175
+ notNull: false;
176
+ hasDefault: false;
177
+ isPrimaryKey: false;
178
+ isAutoincrement: false;
179
+ hasRuntimeDefault: false;
180
+ enumValues: undefined;
181
+ baseColumn: never;
182
+ identity: undefined;
183
+ generated: undefined;
184
+ }, {}, {}>;
185
+ attachmentId: import("drizzle-orm/pg-core").PgColumn<{
186
+ name: "attachment_id";
187
+ tableName: "person_documents";
188
+ dataType: "string";
189
+ columnType: "PgText";
190
+ data: string;
191
+ driverParam: string;
192
+ notNull: false;
193
+ hasDefault: false;
194
+ isPrimaryKey: false;
195
+ isAutoincrement: false;
196
+ hasRuntimeDefault: false;
197
+ enumValues: [string, ...string[]];
198
+ baseColumn: never;
199
+ identity: undefined;
200
+ generated: undefined;
201
+ }, {}, {}>;
202
+ isPrimary: import("drizzle-orm/pg-core").PgColumn<{
203
+ name: "is_primary";
204
+ tableName: "person_documents";
205
+ dataType: "boolean";
206
+ columnType: "PgBoolean";
207
+ data: boolean;
208
+ driverParam: boolean;
209
+ notNull: true;
210
+ hasDefault: true;
211
+ isPrimaryKey: false;
212
+ isAutoincrement: false;
213
+ hasRuntimeDefault: false;
214
+ enumValues: undefined;
215
+ baseColumn: never;
216
+ identity: undefined;
217
+ generated: undefined;
218
+ }, {}, {}>;
219
+ notes: import("drizzle-orm/pg-core").PgColumn<{
220
+ name: "notes";
221
+ tableName: "person_documents";
222
+ dataType: "string";
223
+ columnType: "PgText";
224
+ data: string;
225
+ driverParam: string;
226
+ notNull: false;
227
+ hasDefault: false;
228
+ isPrimaryKey: false;
229
+ isAutoincrement: false;
230
+ hasRuntimeDefault: false;
231
+ enumValues: [string, ...string[]];
232
+ baseColumn: never;
233
+ identity: undefined;
234
+ generated: undefined;
235
+ }, {}, {}>;
236
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
237
+ name: "metadata";
238
+ tableName: "person_documents";
239
+ dataType: "json";
240
+ columnType: "PgJsonb";
241
+ data: Record<string, unknown>;
242
+ driverParam: unknown;
243
+ notNull: false;
244
+ hasDefault: false;
245
+ isPrimaryKey: false;
246
+ isAutoincrement: false;
247
+ hasRuntimeDefault: false;
248
+ enumValues: undefined;
249
+ baseColumn: never;
250
+ identity: undefined;
251
+ generated: undefined;
252
+ }, {}, {
253
+ $type: Record<string, unknown>;
254
+ }>;
255
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
256
+ name: "created_at";
257
+ tableName: "person_documents";
258
+ dataType: "date";
259
+ columnType: "PgTimestamp";
260
+ data: Date;
261
+ driverParam: string;
262
+ notNull: true;
263
+ hasDefault: true;
264
+ isPrimaryKey: false;
265
+ isAutoincrement: false;
266
+ hasRuntimeDefault: false;
267
+ enumValues: undefined;
268
+ baseColumn: never;
269
+ identity: undefined;
270
+ generated: undefined;
271
+ }, {}, {}>;
272
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
273
+ name: "updated_at";
274
+ tableName: "person_documents";
275
+ dataType: "date";
276
+ columnType: "PgTimestamp";
277
+ data: Date;
278
+ driverParam: string;
279
+ notNull: true;
280
+ hasDefault: true;
281
+ isPrimaryKey: false;
282
+ isAutoincrement: false;
283
+ hasRuntimeDefault: false;
284
+ enumValues: undefined;
285
+ baseColumn: never;
286
+ identity: undefined;
287
+ generated: undefined;
288
+ }, {}, {}>;
289
+ }, "single", Record<"person_documents", "not-null">, false, "where" | "orderBy" | "limit" | "offset", {
290
+ id: string;
291
+ personId: string;
292
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
293
+ numberEncrypted: {
294
+ enc: string;
295
+ } | null;
296
+ issuingAuthority: string | null;
297
+ issuingCountry: string | null;
298
+ issueDate: string | null;
299
+ expiryDate: string | null;
300
+ attachmentId: string | null;
301
+ isPrimary: boolean;
302
+ notes: string | null;
303
+ metadata: Record<string, unknown> | null;
304
+ createdAt: Date;
305
+ updatedAt: Date;
306
+ }[], {
307
+ id: import("drizzle-orm/pg-core").PgColumn<{
308
+ name: string;
309
+ tableName: "person_documents";
310
+ dataType: "string";
311
+ columnType: "PgText";
312
+ data: string;
313
+ driverParam: string;
314
+ notNull: true;
315
+ hasDefault: true;
316
+ isPrimaryKey: true;
317
+ isAutoincrement: false;
318
+ hasRuntimeDefault: true;
319
+ enumValues: [string, ...string[]];
320
+ baseColumn: never;
321
+ identity: undefined;
322
+ generated: undefined;
323
+ }, {}, {}>;
324
+ personId: import("drizzle-orm/pg-core").PgColumn<{
325
+ name: string;
326
+ tableName: "person_documents";
327
+ dataType: "string";
328
+ columnType: "PgText";
329
+ data: string;
330
+ driverParam: string;
331
+ notNull: true;
332
+ hasDefault: false;
333
+ isPrimaryKey: false;
334
+ isAutoincrement: false;
335
+ hasRuntimeDefault: false;
336
+ enumValues: [string, ...string[]];
337
+ baseColumn: never;
338
+ identity: undefined;
339
+ generated: undefined;
340
+ }, {}, {}>;
341
+ type: import("drizzle-orm/pg-core").PgColumn<{
342
+ name: "type";
343
+ tableName: "person_documents";
344
+ dataType: "string";
345
+ columnType: "PgEnumColumn";
346
+ data: "passport" | "visa" | "other" | "id_card" | "driver_license";
347
+ driverParam: string;
348
+ notNull: true;
349
+ hasDefault: false;
350
+ isPrimaryKey: false;
351
+ isAutoincrement: false;
352
+ hasRuntimeDefault: false;
353
+ enumValues: ["passport", "id_card", "driver_license", "visa", "other"];
354
+ baseColumn: never;
355
+ identity: undefined;
356
+ generated: undefined;
357
+ }, {}, {}>;
358
+ numberEncrypted: import("drizzle-orm/pg-core").PgColumn<{
359
+ name: "number_encrypted";
360
+ tableName: "person_documents";
361
+ dataType: "json";
362
+ columnType: "PgJsonb";
363
+ data: {
364
+ enc: string;
365
+ } | null;
366
+ driverParam: unknown;
367
+ notNull: false;
368
+ hasDefault: false;
369
+ isPrimaryKey: false;
370
+ isAutoincrement: false;
371
+ hasRuntimeDefault: false;
372
+ enumValues: undefined;
373
+ baseColumn: never;
374
+ identity: undefined;
375
+ generated: undefined;
376
+ }, {}, {
377
+ $type: {
378
+ enc: string;
379
+ } | null;
380
+ }>;
381
+ issuingAuthority: import("drizzle-orm/pg-core").PgColumn<{
382
+ name: "issuing_authority";
383
+ tableName: "person_documents";
384
+ dataType: "string";
385
+ columnType: "PgText";
386
+ data: string;
387
+ driverParam: string;
388
+ notNull: false;
389
+ hasDefault: false;
390
+ isPrimaryKey: false;
391
+ isAutoincrement: false;
392
+ hasRuntimeDefault: false;
393
+ enumValues: [string, ...string[]];
394
+ baseColumn: never;
395
+ identity: undefined;
396
+ generated: undefined;
397
+ }, {}, {}>;
398
+ issuingCountry: import("drizzle-orm/pg-core").PgColumn<{
399
+ name: "issuing_country";
400
+ tableName: "person_documents";
401
+ dataType: "string";
402
+ columnType: "PgText";
403
+ data: string;
404
+ driverParam: string;
405
+ notNull: false;
406
+ hasDefault: false;
407
+ isPrimaryKey: false;
408
+ isAutoincrement: false;
409
+ hasRuntimeDefault: false;
410
+ enumValues: [string, ...string[]];
411
+ baseColumn: never;
412
+ identity: undefined;
413
+ generated: undefined;
414
+ }, {}, {}>;
415
+ issueDate: import("drizzle-orm/pg-core").PgColumn<{
416
+ name: "issue_date";
417
+ tableName: "person_documents";
418
+ dataType: "string";
419
+ columnType: "PgDateString";
420
+ data: string;
421
+ driverParam: string;
422
+ notNull: false;
423
+ hasDefault: false;
424
+ isPrimaryKey: false;
425
+ isAutoincrement: false;
426
+ hasRuntimeDefault: false;
427
+ enumValues: undefined;
428
+ baseColumn: never;
429
+ identity: undefined;
430
+ generated: undefined;
431
+ }, {}, {}>;
432
+ expiryDate: import("drizzle-orm/pg-core").PgColumn<{
433
+ name: "expiry_date";
434
+ tableName: "person_documents";
435
+ dataType: "string";
436
+ columnType: "PgDateString";
437
+ data: string;
438
+ driverParam: string;
439
+ notNull: false;
440
+ hasDefault: false;
441
+ isPrimaryKey: false;
442
+ isAutoincrement: false;
443
+ hasRuntimeDefault: false;
444
+ enumValues: undefined;
445
+ baseColumn: never;
446
+ identity: undefined;
447
+ generated: undefined;
448
+ }, {}, {}>;
449
+ attachmentId: import("drizzle-orm/pg-core").PgColumn<{
450
+ name: "attachment_id";
451
+ tableName: "person_documents";
452
+ dataType: "string";
453
+ columnType: "PgText";
454
+ data: string;
455
+ driverParam: string;
456
+ notNull: false;
457
+ hasDefault: false;
458
+ isPrimaryKey: false;
459
+ isAutoincrement: false;
460
+ hasRuntimeDefault: false;
461
+ enumValues: [string, ...string[]];
462
+ baseColumn: never;
463
+ identity: undefined;
464
+ generated: undefined;
465
+ }, {}, {}>;
466
+ isPrimary: import("drizzle-orm/pg-core").PgColumn<{
467
+ name: "is_primary";
468
+ tableName: "person_documents";
469
+ dataType: "boolean";
470
+ columnType: "PgBoolean";
471
+ data: boolean;
472
+ driverParam: boolean;
473
+ notNull: true;
474
+ hasDefault: true;
475
+ isPrimaryKey: false;
476
+ isAutoincrement: false;
477
+ hasRuntimeDefault: false;
478
+ enumValues: undefined;
479
+ baseColumn: never;
480
+ identity: undefined;
481
+ generated: undefined;
482
+ }, {}, {}>;
483
+ notes: import("drizzle-orm/pg-core").PgColumn<{
484
+ name: "notes";
485
+ tableName: "person_documents";
486
+ dataType: "string";
487
+ columnType: "PgText";
488
+ data: string;
489
+ driverParam: string;
490
+ notNull: false;
491
+ hasDefault: false;
492
+ isPrimaryKey: false;
493
+ isAutoincrement: false;
494
+ hasRuntimeDefault: false;
495
+ enumValues: [string, ...string[]];
496
+ baseColumn: never;
497
+ identity: undefined;
498
+ generated: undefined;
499
+ }, {}, {}>;
500
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
501
+ name: "metadata";
502
+ tableName: "person_documents";
503
+ dataType: "json";
504
+ columnType: "PgJsonb";
505
+ data: Record<string, unknown>;
506
+ driverParam: unknown;
507
+ notNull: false;
508
+ hasDefault: false;
509
+ isPrimaryKey: false;
510
+ isAutoincrement: false;
511
+ hasRuntimeDefault: false;
512
+ enumValues: undefined;
513
+ baseColumn: never;
514
+ identity: undefined;
515
+ generated: undefined;
516
+ }, {}, {
517
+ $type: Record<string, unknown>;
518
+ }>;
519
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
520
+ name: "created_at";
521
+ tableName: "person_documents";
522
+ dataType: "date";
523
+ columnType: "PgTimestamp";
524
+ data: Date;
525
+ driverParam: string;
526
+ notNull: true;
527
+ hasDefault: true;
528
+ isPrimaryKey: false;
529
+ isAutoincrement: false;
530
+ hasRuntimeDefault: false;
531
+ enumValues: undefined;
532
+ baseColumn: never;
533
+ identity: undefined;
534
+ generated: undefined;
535
+ }, {}, {}>;
536
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
537
+ name: "updated_at";
538
+ tableName: "person_documents";
539
+ dataType: "date";
540
+ columnType: "PgTimestamp";
541
+ data: Date;
542
+ driverParam: string;
543
+ notNull: true;
544
+ hasDefault: true;
545
+ isPrimaryKey: false;
546
+ isAutoincrement: false;
547
+ hasRuntimeDefault: false;
548
+ enumValues: undefined;
549
+ baseColumn: never;
550
+ identity: undefined;
551
+ generated: undefined;
552
+ }, {}, {}>;
553
+ }>, "where" | "orderBy" | "limit" | "offset">;
554
+ getPersonDocument(db: PostgresJsDatabase, documentId: string): Promise<{
555
+ id: string;
556
+ personId: string;
557
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
558
+ numberEncrypted: {
559
+ enc: string;
560
+ } | null;
561
+ issuingAuthority: string | null;
562
+ issuingCountry: string | null;
563
+ issueDate: string | null;
564
+ expiryDate: string | null;
565
+ attachmentId: string | null;
566
+ isPrimary: boolean;
567
+ notes: string | null;
568
+ metadata: Record<string, unknown> | null;
569
+ createdAt: Date;
570
+ updatedAt: Date;
571
+ } | null>;
572
+ /**
573
+ * Returns the primary document of a given type for a person, or
574
+ * `null` if no primary is set. Used by booking-traveler create to
575
+ * snapshot the person's passport.
576
+ */
577
+ getPrimaryPersonDocument(db: PostgresJsDatabase, personId: string, type: PersonDocumentType): Promise<{
578
+ id: string;
579
+ personId: string;
580
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
581
+ numberEncrypted: {
582
+ enc: string;
583
+ } | null;
584
+ issuingAuthority: string | null;
585
+ issuingCountry: string | null;
586
+ issueDate: string | null;
587
+ expiryDate: string | null;
588
+ attachmentId: string | null;
589
+ isPrimary: boolean;
590
+ notes: string | null;
591
+ metadata: Record<string, unknown> | null;
592
+ createdAt: Date;
593
+ updatedAt: Date;
594
+ } | null>;
595
+ createPersonDocument(db: PostgresJsDatabase, personId: string, data: CreatePersonDocumentInput): Promise<{
596
+ metadata: Record<string, unknown> | null;
597
+ id: string;
598
+ createdAt: Date;
599
+ updatedAt: Date;
600
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
601
+ issuingAuthority: string | null;
602
+ issuingCountry: string | null;
603
+ expiryDate: string | null;
604
+ issueDate: string | null;
605
+ notes: string | null;
606
+ isPrimary: boolean;
607
+ personId: string;
608
+ numberEncrypted: {
609
+ enc: string;
610
+ } | null;
611
+ attachmentId: string | null;
612
+ } | null>;
613
+ updatePersonDocument(db: PostgresJsDatabase, documentId: string, data: UpdatePersonDocumentInput): Promise<{
614
+ id: string;
615
+ personId: string;
616
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
617
+ numberEncrypted: {
618
+ enc: string;
619
+ } | null;
620
+ issuingAuthority: string | null;
621
+ issuingCountry: string | null;
622
+ issueDate: string | null;
623
+ expiryDate: string | null;
624
+ attachmentId: string | null;
625
+ isPrimary: boolean;
626
+ notes: string | null;
627
+ metadata: Record<string, unknown> | null;
628
+ createdAt: Date;
629
+ updatedAt: Date;
630
+ } | null>;
631
+ deletePersonDocument(db: PostgresJsDatabase, documentId: string): Promise<{
632
+ id: string;
633
+ } | null>;
634
+ /**
635
+ * Atomically promotes a document to primary, demoting any prior
636
+ * primary of the same type for the same person.
637
+ */
638
+ setPrimaryPersonDocument(db: PostgresJsDatabase, documentId: string): Promise<{
639
+ id: string;
640
+ personId: string;
641
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
642
+ numberEncrypted: {
643
+ enc: string;
644
+ } | null;
645
+ issuingAuthority: string | null;
646
+ issuingCountry: string | null;
647
+ issueDate: string | null;
648
+ expiryDate: string | null;
649
+ attachmentId: string | null;
650
+ isPrimary: boolean;
651
+ notes: string | null;
652
+ metadata: Record<string, unknown> | null;
653
+ createdAt: Date;
654
+ updatedAt: Date;
655
+ } | null>;
656
+ /**
657
+ * Plaintext snapshot of the fields a booking-traveler creation
658
+ * pulls from a person record: dietary, accessibility, primary
659
+ * passport (number + expiry + country + authority + provenance id),
660
+ * and date-of-birth from `people.birthday`.
661
+ *
662
+ * Caller passes a KMS provider so decryption happens in-process.
663
+ * Missing person → returns null. Missing document or blob → that
664
+ * field returns null in the snapshot.
665
+ */
666
+ loadPersonTravelSnapshot(db: PostgresJsDatabase, personId: string, options: {
667
+ kms: KmsProvider;
668
+ keyRef?: KeyRef;
669
+ }): Promise<PersonTravelSnapshot | null>;
670
+ /**
671
+ * Documents whose `expiryDate` falls within the next `daysAhead`
672
+ * days. Used by the future `crm.detect-expiring-documents` cron;
673
+ * shipped now since the helper is free.
674
+ */
675
+ listExpiringPersonDocuments(db: PostgresJsDatabase, daysAhead?: number): Omit<import("drizzle-orm/pg-core").PgSelectBase<"person_documents", {
676
+ id: import("drizzle-orm/pg-core").PgColumn<{
677
+ name: string;
678
+ tableName: "person_documents";
679
+ dataType: "string";
680
+ columnType: "PgText";
681
+ data: string;
682
+ driverParam: string;
683
+ notNull: true;
684
+ hasDefault: true;
685
+ isPrimaryKey: true;
686
+ isAutoincrement: false;
687
+ hasRuntimeDefault: true;
688
+ enumValues: [string, ...string[]];
689
+ baseColumn: never;
690
+ identity: undefined;
691
+ generated: undefined;
692
+ }, {}, {}>;
693
+ personId: import("drizzle-orm/pg-core").PgColumn<{
694
+ name: string;
695
+ tableName: "person_documents";
696
+ dataType: "string";
697
+ columnType: "PgText";
698
+ data: string;
699
+ driverParam: string;
700
+ notNull: true;
701
+ hasDefault: false;
702
+ isPrimaryKey: false;
703
+ isAutoincrement: false;
704
+ hasRuntimeDefault: false;
705
+ enumValues: [string, ...string[]];
706
+ baseColumn: never;
707
+ identity: undefined;
708
+ generated: undefined;
709
+ }, {}, {}>;
710
+ type: import("drizzle-orm/pg-core").PgColumn<{
711
+ name: "type";
712
+ tableName: "person_documents";
713
+ dataType: "string";
714
+ columnType: "PgEnumColumn";
715
+ data: "passport" | "visa" | "other" | "id_card" | "driver_license";
716
+ driverParam: string;
717
+ notNull: true;
718
+ hasDefault: false;
719
+ isPrimaryKey: false;
720
+ isAutoincrement: false;
721
+ hasRuntimeDefault: false;
722
+ enumValues: ["passport", "id_card", "driver_license", "visa", "other"];
723
+ baseColumn: never;
724
+ identity: undefined;
725
+ generated: undefined;
726
+ }, {}, {}>;
727
+ numberEncrypted: import("drizzle-orm/pg-core").PgColumn<{
728
+ name: "number_encrypted";
729
+ tableName: "person_documents";
730
+ dataType: "json";
731
+ columnType: "PgJsonb";
732
+ data: {
733
+ enc: string;
734
+ } | null;
735
+ driverParam: unknown;
736
+ notNull: false;
737
+ hasDefault: false;
738
+ isPrimaryKey: false;
739
+ isAutoincrement: false;
740
+ hasRuntimeDefault: false;
741
+ enumValues: undefined;
742
+ baseColumn: never;
743
+ identity: undefined;
744
+ generated: undefined;
745
+ }, {}, {
746
+ $type: {
747
+ enc: string;
748
+ } | null;
749
+ }>;
750
+ issuingAuthority: import("drizzle-orm/pg-core").PgColumn<{
751
+ name: "issuing_authority";
752
+ tableName: "person_documents";
753
+ dataType: "string";
754
+ columnType: "PgText";
755
+ data: string;
756
+ driverParam: string;
757
+ notNull: false;
758
+ hasDefault: false;
759
+ isPrimaryKey: false;
760
+ isAutoincrement: false;
761
+ hasRuntimeDefault: false;
762
+ enumValues: [string, ...string[]];
763
+ baseColumn: never;
764
+ identity: undefined;
765
+ generated: undefined;
766
+ }, {}, {}>;
767
+ issuingCountry: import("drizzle-orm/pg-core").PgColumn<{
768
+ name: "issuing_country";
769
+ tableName: "person_documents";
770
+ dataType: "string";
771
+ columnType: "PgText";
772
+ data: string;
773
+ driverParam: string;
774
+ notNull: false;
775
+ hasDefault: false;
776
+ isPrimaryKey: false;
777
+ isAutoincrement: false;
778
+ hasRuntimeDefault: false;
779
+ enumValues: [string, ...string[]];
780
+ baseColumn: never;
781
+ identity: undefined;
782
+ generated: undefined;
783
+ }, {}, {}>;
784
+ issueDate: import("drizzle-orm/pg-core").PgColumn<{
785
+ name: "issue_date";
786
+ tableName: "person_documents";
787
+ dataType: "string";
788
+ columnType: "PgDateString";
789
+ data: string;
790
+ driverParam: string;
791
+ notNull: false;
792
+ hasDefault: false;
793
+ isPrimaryKey: false;
794
+ isAutoincrement: false;
795
+ hasRuntimeDefault: false;
796
+ enumValues: undefined;
797
+ baseColumn: never;
798
+ identity: undefined;
799
+ generated: undefined;
800
+ }, {}, {}>;
801
+ expiryDate: import("drizzle-orm/pg-core").PgColumn<{
802
+ name: "expiry_date";
803
+ tableName: "person_documents";
804
+ dataType: "string";
805
+ columnType: "PgDateString";
806
+ data: string;
807
+ driverParam: string;
808
+ notNull: false;
809
+ hasDefault: false;
810
+ isPrimaryKey: false;
811
+ isAutoincrement: false;
812
+ hasRuntimeDefault: false;
813
+ enumValues: undefined;
814
+ baseColumn: never;
815
+ identity: undefined;
816
+ generated: undefined;
817
+ }, {}, {}>;
818
+ attachmentId: import("drizzle-orm/pg-core").PgColumn<{
819
+ name: "attachment_id";
820
+ tableName: "person_documents";
821
+ dataType: "string";
822
+ columnType: "PgText";
823
+ data: string;
824
+ driverParam: string;
825
+ notNull: false;
826
+ hasDefault: false;
827
+ isPrimaryKey: false;
828
+ isAutoincrement: false;
829
+ hasRuntimeDefault: false;
830
+ enumValues: [string, ...string[]];
831
+ baseColumn: never;
832
+ identity: undefined;
833
+ generated: undefined;
834
+ }, {}, {}>;
835
+ isPrimary: import("drizzle-orm/pg-core").PgColumn<{
836
+ name: "is_primary";
837
+ tableName: "person_documents";
838
+ dataType: "boolean";
839
+ columnType: "PgBoolean";
840
+ data: boolean;
841
+ driverParam: boolean;
842
+ notNull: true;
843
+ hasDefault: true;
844
+ isPrimaryKey: false;
845
+ isAutoincrement: false;
846
+ hasRuntimeDefault: false;
847
+ enumValues: undefined;
848
+ baseColumn: never;
849
+ identity: undefined;
850
+ generated: undefined;
851
+ }, {}, {}>;
852
+ notes: import("drizzle-orm/pg-core").PgColumn<{
853
+ name: "notes";
854
+ tableName: "person_documents";
855
+ dataType: "string";
856
+ columnType: "PgText";
857
+ data: string;
858
+ driverParam: string;
859
+ notNull: false;
860
+ hasDefault: false;
861
+ isPrimaryKey: false;
862
+ isAutoincrement: false;
863
+ hasRuntimeDefault: false;
864
+ enumValues: [string, ...string[]];
865
+ baseColumn: never;
866
+ identity: undefined;
867
+ generated: undefined;
868
+ }, {}, {}>;
869
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
870
+ name: "metadata";
871
+ tableName: "person_documents";
872
+ dataType: "json";
873
+ columnType: "PgJsonb";
874
+ data: Record<string, unknown>;
875
+ driverParam: unknown;
876
+ notNull: false;
877
+ hasDefault: false;
878
+ isPrimaryKey: false;
879
+ isAutoincrement: false;
880
+ hasRuntimeDefault: false;
881
+ enumValues: undefined;
882
+ baseColumn: never;
883
+ identity: undefined;
884
+ generated: undefined;
885
+ }, {}, {
886
+ $type: Record<string, unknown>;
887
+ }>;
888
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
889
+ name: "created_at";
890
+ tableName: "person_documents";
891
+ dataType: "date";
892
+ columnType: "PgTimestamp";
893
+ data: Date;
894
+ driverParam: string;
895
+ notNull: true;
896
+ hasDefault: true;
897
+ isPrimaryKey: false;
898
+ isAutoincrement: false;
899
+ hasRuntimeDefault: false;
900
+ enumValues: undefined;
901
+ baseColumn: never;
902
+ identity: undefined;
903
+ generated: undefined;
904
+ }, {}, {}>;
905
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
906
+ name: "updated_at";
907
+ tableName: "person_documents";
908
+ dataType: "date";
909
+ columnType: "PgTimestamp";
910
+ data: Date;
911
+ driverParam: string;
912
+ notNull: true;
913
+ hasDefault: true;
914
+ isPrimaryKey: false;
915
+ isAutoincrement: false;
916
+ hasRuntimeDefault: false;
917
+ enumValues: undefined;
918
+ baseColumn: never;
919
+ identity: undefined;
920
+ generated: undefined;
921
+ }, {}, {}>;
922
+ }, "single", Record<"person_documents", "not-null">, false, "where" | "orderBy", {
923
+ id: string;
924
+ personId: string;
925
+ type: "passport" | "visa" | "other" | "id_card" | "driver_license";
926
+ numberEncrypted: {
927
+ enc: string;
928
+ } | null;
929
+ issuingAuthority: string | null;
930
+ issuingCountry: string | null;
931
+ issueDate: string | null;
932
+ expiryDate: string | null;
933
+ attachmentId: string | null;
934
+ isPrimary: boolean;
935
+ notes: string | null;
936
+ metadata: Record<string, unknown> | null;
937
+ createdAt: Date;
938
+ updatedAt: Date;
939
+ }[], {
940
+ id: import("drizzle-orm/pg-core").PgColumn<{
941
+ name: string;
942
+ tableName: "person_documents";
943
+ dataType: "string";
944
+ columnType: "PgText";
945
+ data: string;
946
+ driverParam: string;
947
+ notNull: true;
948
+ hasDefault: true;
949
+ isPrimaryKey: true;
950
+ isAutoincrement: false;
951
+ hasRuntimeDefault: true;
952
+ enumValues: [string, ...string[]];
953
+ baseColumn: never;
954
+ identity: undefined;
955
+ generated: undefined;
956
+ }, {}, {}>;
957
+ personId: import("drizzle-orm/pg-core").PgColumn<{
958
+ name: string;
959
+ tableName: "person_documents";
960
+ dataType: "string";
961
+ columnType: "PgText";
962
+ data: string;
963
+ driverParam: string;
964
+ notNull: true;
965
+ hasDefault: false;
966
+ isPrimaryKey: false;
967
+ isAutoincrement: false;
968
+ hasRuntimeDefault: false;
969
+ enumValues: [string, ...string[]];
970
+ baseColumn: never;
971
+ identity: undefined;
972
+ generated: undefined;
973
+ }, {}, {}>;
974
+ type: import("drizzle-orm/pg-core").PgColumn<{
975
+ name: "type";
976
+ tableName: "person_documents";
977
+ dataType: "string";
978
+ columnType: "PgEnumColumn";
979
+ data: "passport" | "visa" | "other" | "id_card" | "driver_license";
980
+ driverParam: string;
981
+ notNull: true;
982
+ hasDefault: false;
983
+ isPrimaryKey: false;
984
+ isAutoincrement: false;
985
+ hasRuntimeDefault: false;
986
+ enumValues: ["passport", "id_card", "driver_license", "visa", "other"];
987
+ baseColumn: never;
988
+ identity: undefined;
989
+ generated: undefined;
990
+ }, {}, {}>;
991
+ numberEncrypted: import("drizzle-orm/pg-core").PgColumn<{
992
+ name: "number_encrypted";
993
+ tableName: "person_documents";
994
+ dataType: "json";
995
+ columnType: "PgJsonb";
996
+ data: {
997
+ enc: string;
998
+ } | null;
999
+ driverParam: unknown;
1000
+ notNull: false;
1001
+ hasDefault: false;
1002
+ isPrimaryKey: false;
1003
+ isAutoincrement: false;
1004
+ hasRuntimeDefault: false;
1005
+ enumValues: undefined;
1006
+ baseColumn: never;
1007
+ identity: undefined;
1008
+ generated: undefined;
1009
+ }, {}, {
1010
+ $type: {
1011
+ enc: string;
1012
+ } | null;
1013
+ }>;
1014
+ issuingAuthority: import("drizzle-orm/pg-core").PgColumn<{
1015
+ name: "issuing_authority";
1016
+ tableName: "person_documents";
1017
+ dataType: "string";
1018
+ columnType: "PgText";
1019
+ data: string;
1020
+ driverParam: string;
1021
+ notNull: false;
1022
+ hasDefault: false;
1023
+ isPrimaryKey: false;
1024
+ isAutoincrement: false;
1025
+ hasRuntimeDefault: false;
1026
+ enumValues: [string, ...string[]];
1027
+ baseColumn: never;
1028
+ identity: undefined;
1029
+ generated: undefined;
1030
+ }, {}, {}>;
1031
+ issuingCountry: import("drizzle-orm/pg-core").PgColumn<{
1032
+ name: "issuing_country";
1033
+ tableName: "person_documents";
1034
+ dataType: "string";
1035
+ columnType: "PgText";
1036
+ data: string;
1037
+ driverParam: string;
1038
+ notNull: false;
1039
+ hasDefault: false;
1040
+ isPrimaryKey: false;
1041
+ isAutoincrement: false;
1042
+ hasRuntimeDefault: false;
1043
+ enumValues: [string, ...string[]];
1044
+ baseColumn: never;
1045
+ identity: undefined;
1046
+ generated: undefined;
1047
+ }, {}, {}>;
1048
+ issueDate: import("drizzle-orm/pg-core").PgColumn<{
1049
+ name: "issue_date";
1050
+ tableName: "person_documents";
1051
+ dataType: "string";
1052
+ columnType: "PgDateString";
1053
+ data: string;
1054
+ driverParam: string;
1055
+ notNull: false;
1056
+ hasDefault: false;
1057
+ isPrimaryKey: false;
1058
+ isAutoincrement: false;
1059
+ hasRuntimeDefault: false;
1060
+ enumValues: undefined;
1061
+ baseColumn: never;
1062
+ identity: undefined;
1063
+ generated: undefined;
1064
+ }, {}, {}>;
1065
+ expiryDate: import("drizzle-orm/pg-core").PgColumn<{
1066
+ name: "expiry_date";
1067
+ tableName: "person_documents";
1068
+ dataType: "string";
1069
+ columnType: "PgDateString";
1070
+ data: string;
1071
+ driverParam: string;
1072
+ notNull: false;
1073
+ hasDefault: false;
1074
+ isPrimaryKey: false;
1075
+ isAutoincrement: false;
1076
+ hasRuntimeDefault: false;
1077
+ enumValues: undefined;
1078
+ baseColumn: never;
1079
+ identity: undefined;
1080
+ generated: undefined;
1081
+ }, {}, {}>;
1082
+ attachmentId: import("drizzle-orm/pg-core").PgColumn<{
1083
+ name: "attachment_id";
1084
+ tableName: "person_documents";
1085
+ dataType: "string";
1086
+ columnType: "PgText";
1087
+ data: string;
1088
+ driverParam: string;
1089
+ notNull: false;
1090
+ hasDefault: false;
1091
+ isPrimaryKey: false;
1092
+ isAutoincrement: false;
1093
+ hasRuntimeDefault: false;
1094
+ enumValues: [string, ...string[]];
1095
+ baseColumn: never;
1096
+ identity: undefined;
1097
+ generated: undefined;
1098
+ }, {}, {}>;
1099
+ isPrimary: import("drizzle-orm/pg-core").PgColumn<{
1100
+ name: "is_primary";
1101
+ tableName: "person_documents";
1102
+ dataType: "boolean";
1103
+ columnType: "PgBoolean";
1104
+ data: boolean;
1105
+ driverParam: boolean;
1106
+ notNull: true;
1107
+ hasDefault: true;
1108
+ isPrimaryKey: false;
1109
+ isAutoincrement: false;
1110
+ hasRuntimeDefault: false;
1111
+ enumValues: undefined;
1112
+ baseColumn: never;
1113
+ identity: undefined;
1114
+ generated: undefined;
1115
+ }, {}, {}>;
1116
+ notes: import("drizzle-orm/pg-core").PgColumn<{
1117
+ name: "notes";
1118
+ tableName: "person_documents";
1119
+ dataType: "string";
1120
+ columnType: "PgText";
1121
+ data: string;
1122
+ driverParam: string;
1123
+ notNull: false;
1124
+ hasDefault: false;
1125
+ isPrimaryKey: false;
1126
+ isAutoincrement: false;
1127
+ hasRuntimeDefault: false;
1128
+ enumValues: [string, ...string[]];
1129
+ baseColumn: never;
1130
+ identity: undefined;
1131
+ generated: undefined;
1132
+ }, {}, {}>;
1133
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
1134
+ name: "metadata";
1135
+ tableName: "person_documents";
1136
+ dataType: "json";
1137
+ columnType: "PgJsonb";
1138
+ data: Record<string, unknown>;
1139
+ driverParam: unknown;
1140
+ notNull: false;
1141
+ hasDefault: false;
1142
+ isPrimaryKey: false;
1143
+ isAutoincrement: false;
1144
+ hasRuntimeDefault: false;
1145
+ enumValues: undefined;
1146
+ baseColumn: never;
1147
+ identity: undefined;
1148
+ generated: undefined;
1149
+ }, {}, {
1150
+ $type: Record<string, unknown>;
1151
+ }>;
1152
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
1153
+ name: "created_at";
1154
+ tableName: "person_documents";
1155
+ dataType: "date";
1156
+ columnType: "PgTimestamp";
1157
+ data: Date;
1158
+ driverParam: string;
1159
+ notNull: true;
1160
+ hasDefault: true;
1161
+ isPrimaryKey: false;
1162
+ isAutoincrement: false;
1163
+ hasRuntimeDefault: false;
1164
+ enumValues: undefined;
1165
+ baseColumn: never;
1166
+ identity: undefined;
1167
+ generated: undefined;
1168
+ }, {}, {}>;
1169
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
1170
+ name: "updated_at";
1171
+ tableName: "person_documents";
1172
+ dataType: "date";
1173
+ columnType: "PgTimestamp";
1174
+ data: Date;
1175
+ driverParam: string;
1176
+ notNull: true;
1177
+ hasDefault: true;
1178
+ isPrimaryKey: false;
1179
+ isAutoincrement: false;
1180
+ hasRuntimeDefault: false;
1181
+ enumValues: undefined;
1182
+ baseColumn: never;
1183
+ identity: undefined;
1184
+ generated: undefined;
1185
+ }, {}, {}>;
1186
+ }>, "where" | "orderBy">;
1187
+ };
1188
+ //# sourceMappingURL=person-documents.d.ts.map