@voyantjs/crm 0.26.3 → 0.26.4

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,733 @@
1
+ import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ import type { z } from "zod";
3
+ import type { customerSignalListQuerySchema, insertCustomerSignalSchema, updateCustomerSignalSchema } from "../validation.js";
4
+ export type CreateCustomerSignalInput = z.infer<typeof insertCustomerSignalSchema>;
5
+ export type UpdateCustomerSignalInput = z.infer<typeof updateCustomerSignalSchema>;
6
+ export type CustomerSignalListQuery = z.infer<typeof customerSignalListQuerySchema>;
7
+ export declare const customerSignalsService: {
8
+ /**
9
+ * Top-level list with filters. Defaults to newest-first so the
10
+ * sales-pipeline UI shows fresh inquiries on top.
11
+ */
12
+ listCustomerSignals(db: PostgresJsDatabase, query: CustomerSignalListQuery): Promise<{
13
+ data: {
14
+ id: string;
15
+ personId: string;
16
+ productId: string | null;
17
+ optionUnitId: string | null;
18
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
19
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
20
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
21
+ priority: string;
22
+ notes: string | null;
23
+ tags: string[];
24
+ assignedToUserId: string | null;
25
+ followUpAt: Date | null;
26
+ resolvedBookingId: string | null;
27
+ sourceSubmissionId: string | null;
28
+ metadata: Record<string, unknown> | null;
29
+ createdAt: Date;
30
+ updatedAt: Date;
31
+ }[];
32
+ total: number;
33
+ limit: number;
34
+ offset: number;
35
+ }>;
36
+ /**
37
+ * Per-person convenience list — same shape, ordered oldest-first
38
+ * so a person's signal history reads chronologically alongside
39
+ * their notes / activities.
40
+ */
41
+ listSignalsForPerson(db: PostgresJsDatabase, personId: string): Omit<import("drizzle-orm/pg-core").PgSelectBase<"customer_signals", {
42
+ id: import("drizzle-orm/pg-core").PgColumn<{
43
+ name: string;
44
+ tableName: "customer_signals";
45
+ dataType: "string";
46
+ columnType: "PgText";
47
+ data: string;
48
+ driverParam: string;
49
+ notNull: true;
50
+ hasDefault: true;
51
+ isPrimaryKey: true;
52
+ isAutoincrement: false;
53
+ hasRuntimeDefault: true;
54
+ enumValues: [string, ...string[]];
55
+ baseColumn: never;
56
+ identity: undefined;
57
+ generated: undefined;
58
+ }, {}, {}>;
59
+ personId: import("drizzle-orm/pg-core").PgColumn<{
60
+ name: string;
61
+ tableName: "customer_signals";
62
+ dataType: "string";
63
+ columnType: "PgText";
64
+ data: string;
65
+ driverParam: string;
66
+ notNull: true;
67
+ hasDefault: false;
68
+ isPrimaryKey: false;
69
+ isAutoincrement: false;
70
+ hasRuntimeDefault: false;
71
+ enumValues: [string, ...string[]];
72
+ baseColumn: never;
73
+ identity: undefined;
74
+ generated: undefined;
75
+ }, {}, {}>;
76
+ productId: import("drizzle-orm/pg-core").PgColumn<{
77
+ name: "product_id";
78
+ tableName: "customer_signals";
79
+ dataType: "string";
80
+ columnType: "PgText";
81
+ data: string;
82
+ driverParam: string;
83
+ notNull: false;
84
+ hasDefault: false;
85
+ isPrimaryKey: false;
86
+ isAutoincrement: false;
87
+ hasRuntimeDefault: false;
88
+ enumValues: [string, ...string[]];
89
+ baseColumn: never;
90
+ identity: undefined;
91
+ generated: undefined;
92
+ }, {}, {}>;
93
+ optionUnitId: import("drizzle-orm/pg-core").PgColumn<{
94
+ name: "option_unit_id";
95
+ tableName: "customer_signals";
96
+ dataType: "string";
97
+ columnType: "PgText";
98
+ data: string;
99
+ driverParam: string;
100
+ notNull: false;
101
+ hasDefault: false;
102
+ isPrimaryKey: false;
103
+ isAutoincrement: false;
104
+ hasRuntimeDefault: false;
105
+ enumValues: [string, ...string[]];
106
+ baseColumn: never;
107
+ identity: undefined;
108
+ generated: undefined;
109
+ }, {}, {}>;
110
+ kind: import("drizzle-orm/pg-core").PgColumn<{
111
+ name: "kind";
112
+ tableName: "customer_signals";
113
+ dataType: "string";
114
+ columnType: "PgEnumColumn";
115
+ data: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
116
+ driverParam: string;
117
+ notNull: true;
118
+ hasDefault: false;
119
+ isPrimaryKey: false;
120
+ isAutoincrement: false;
121
+ hasRuntimeDefault: false;
122
+ enumValues: ["wishlist", "notify", "inquiry", "request_offer", "referral"];
123
+ baseColumn: never;
124
+ identity: undefined;
125
+ generated: undefined;
126
+ }, {}, {}>;
127
+ source: import("drizzle-orm/pg-core").PgColumn<{
128
+ name: "source";
129
+ tableName: "customer_signals";
130
+ dataType: "string";
131
+ columnType: "PgEnumColumn";
132
+ data: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
133
+ driverParam: string;
134
+ notNull: true;
135
+ hasDefault: false;
136
+ isPrimaryKey: false;
137
+ isAutoincrement: false;
138
+ hasRuntimeDefault: false;
139
+ enumValues: ["form", "phone", "admin", "abandoned_cart", "website", "booking"];
140
+ baseColumn: never;
141
+ identity: undefined;
142
+ generated: undefined;
143
+ }, {}, {}>;
144
+ status: import("drizzle-orm/pg-core").PgColumn<{
145
+ name: "status";
146
+ tableName: "customer_signals";
147
+ dataType: "string";
148
+ columnType: "PgEnumColumn";
149
+ data: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
150
+ driverParam: string;
151
+ notNull: true;
152
+ hasDefault: true;
153
+ isPrimaryKey: false;
154
+ isAutoincrement: false;
155
+ hasRuntimeDefault: false;
156
+ enumValues: ["new", "contacted", "qualified", "converted", "lost", "expired"];
157
+ baseColumn: never;
158
+ identity: undefined;
159
+ generated: undefined;
160
+ }, {}, {}>;
161
+ priority: import("drizzle-orm/pg-core").PgColumn<{
162
+ name: "priority";
163
+ tableName: "customer_signals";
164
+ dataType: "string";
165
+ columnType: "PgText";
166
+ data: string;
167
+ driverParam: string;
168
+ notNull: true;
169
+ hasDefault: true;
170
+ isPrimaryKey: false;
171
+ isAutoincrement: false;
172
+ hasRuntimeDefault: false;
173
+ enumValues: [string, ...string[]];
174
+ baseColumn: never;
175
+ identity: undefined;
176
+ generated: undefined;
177
+ }, {}, {}>;
178
+ notes: import("drizzle-orm/pg-core").PgColumn<{
179
+ name: "notes";
180
+ tableName: "customer_signals";
181
+ dataType: "string";
182
+ columnType: "PgText";
183
+ data: string;
184
+ driverParam: string;
185
+ notNull: false;
186
+ hasDefault: false;
187
+ isPrimaryKey: false;
188
+ isAutoincrement: false;
189
+ hasRuntimeDefault: false;
190
+ enumValues: [string, ...string[]];
191
+ baseColumn: never;
192
+ identity: undefined;
193
+ generated: undefined;
194
+ }, {}, {}>;
195
+ tags: import("drizzle-orm/pg-core").PgColumn<{
196
+ name: "tags";
197
+ tableName: "customer_signals";
198
+ dataType: "json";
199
+ columnType: "PgJsonb";
200
+ data: string[];
201
+ driverParam: unknown;
202
+ notNull: true;
203
+ hasDefault: true;
204
+ isPrimaryKey: false;
205
+ isAutoincrement: false;
206
+ hasRuntimeDefault: false;
207
+ enumValues: undefined;
208
+ baseColumn: never;
209
+ identity: undefined;
210
+ generated: undefined;
211
+ }, {}, {
212
+ $type: string[];
213
+ }>;
214
+ assignedToUserId: import("drizzle-orm/pg-core").PgColumn<{
215
+ name: "assigned_to_user_id";
216
+ tableName: "customer_signals";
217
+ dataType: "string";
218
+ columnType: "PgText";
219
+ data: string;
220
+ driverParam: string;
221
+ notNull: false;
222
+ hasDefault: false;
223
+ isPrimaryKey: false;
224
+ isAutoincrement: false;
225
+ hasRuntimeDefault: false;
226
+ enumValues: [string, ...string[]];
227
+ baseColumn: never;
228
+ identity: undefined;
229
+ generated: undefined;
230
+ }, {}, {}>;
231
+ followUpAt: import("drizzle-orm/pg-core").PgColumn<{
232
+ name: "follow_up_at";
233
+ tableName: "customer_signals";
234
+ dataType: "date";
235
+ columnType: "PgTimestamp";
236
+ data: Date;
237
+ driverParam: string;
238
+ notNull: false;
239
+ hasDefault: false;
240
+ isPrimaryKey: false;
241
+ isAutoincrement: false;
242
+ hasRuntimeDefault: false;
243
+ enumValues: undefined;
244
+ baseColumn: never;
245
+ identity: undefined;
246
+ generated: undefined;
247
+ }, {}, {}>;
248
+ resolvedBookingId: import("drizzle-orm/pg-core").PgColumn<{
249
+ name: "resolved_booking_id";
250
+ tableName: "customer_signals";
251
+ dataType: "string";
252
+ columnType: "PgText";
253
+ data: string;
254
+ driverParam: string;
255
+ notNull: false;
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
+ sourceSubmissionId: import("drizzle-orm/pg-core").PgColumn<{
266
+ name: "source_submission_id";
267
+ tableName: "customer_signals";
268
+ dataType: "string";
269
+ columnType: "PgText";
270
+ data: string;
271
+ driverParam: string;
272
+ notNull: false;
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
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
283
+ name: "metadata";
284
+ tableName: "customer_signals";
285
+ dataType: "json";
286
+ columnType: "PgJsonb";
287
+ data: Record<string, unknown>;
288
+ driverParam: unknown;
289
+ notNull: false;
290
+ hasDefault: false;
291
+ isPrimaryKey: false;
292
+ isAutoincrement: false;
293
+ hasRuntimeDefault: false;
294
+ enumValues: undefined;
295
+ baseColumn: never;
296
+ identity: undefined;
297
+ generated: undefined;
298
+ }, {}, {
299
+ $type: Record<string, unknown>;
300
+ }>;
301
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
302
+ name: "created_at";
303
+ tableName: "customer_signals";
304
+ dataType: "date";
305
+ columnType: "PgTimestamp";
306
+ data: Date;
307
+ driverParam: string;
308
+ notNull: true;
309
+ hasDefault: true;
310
+ isPrimaryKey: false;
311
+ isAutoincrement: false;
312
+ hasRuntimeDefault: false;
313
+ enumValues: undefined;
314
+ baseColumn: never;
315
+ identity: undefined;
316
+ generated: undefined;
317
+ }, {}, {}>;
318
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
319
+ name: "updated_at";
320
+ tableName: "customer_signals";
321
+ dataType: "date";
322
+ columnType: "PgTimestamp";
323
+ data: Date;
324
+ driverParam: string;
325
+ notNull: true;
326
+ hasDefault: true;
327
+ isPrimaryKey: false;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: undefined;
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}, {}>;
335
+ }, "single", Record<"customer_signals", "not-null">, false, "where" | "orderBy", {
336
+ id: string;
337
+ personId: string;
338
+ productId: string | null;
339
+ optionUnitId: string | null;
340
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
341
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
342
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
343
+ priority: string;
344
+ notes: string | null;
345
+ tags: string[];
346
+ assignedToUserId: string | null;
347
+ followUpAt: Date | null;
348
+ resolvedBookingId: string | null;
349
+ sourceSubmissionId: string | null;
350
+ metadata: Record<string, unknown> | null;
351
+ createdAt: Date;
352
+ updatedAt: Date;
353
+ }[], {
354
+ id: import("drizzle-orm/pg-core").PgColumn<{
355
+ name: string;
356
+ tableName: "customer_signals";
357
+ dataType: "string";
358
+ columnType: "PgText";
359
+ data: string;
360
+ driverParam: string;
361
+ notNull: true;
362
+ hasDefault: true;
363
+ isPrimaryKey: true;
364
+ isAutoincrement: false;
365
+ hasRuntimeDefault: true;
366
+ enumValues: [string, ...string[]];
367
+ baseColumn: never;
368
+ identity: undefined;
369
+ generated: undefined;
370
+ }, {}, {}>;
371
+ personId: import("drizzle-orm/pg-core").PgColumn<{
372
+ name: string;
373
+ tableName: "customer_signals";
374
+ dataType: "string";
375
+ columnType: "PgText";
376
+ data: string;
377
+ driverParam: string;
378
+ notNull: true;
379
+ hasDefault: false;
380
+ isPrimaryKey: false;
381
+ isAutoincrement: false;
382
+ hasRuntimeDefault: false;
383
+ enumValues: [string, ...string[]];
384
+ baseColumn: never;
385
+ identity: undefined;
386
+ generated: undefined;
387
+ }, {}, {}>;
388
+ productId: import("drizzle-orm/pg-core").PgColumn<{
389
+ name: "product_id";
390
+ tableName: "customer_signals";
391
+ dataType: "string";
392
+ columnType: "PgText";
393
+ data: string;
394
+ driverParam: string;
395
+ notNull: false;
396
+ hasDefault: false;
397
+ isPrimaryKey: false;
398
+ isAutoincrement: false;
399
+ hasRuntimeDefault: false;
400
+ enumValues: [string, ...string[]];
401
+ baseColumn: never;
402
+ identity: undefined;
403
+ generated: undefined;
404
+ }, {}, {}>;
405
+ optionUnitId: import("drizzle-orm/pg-core").PgColumn<{
406
+ name: "option_unit_id";
407
+ tableName: "customer_signals";
408
+ dataType: "string";
409
+ columnType: "PgText";
410
+ data: string;
411
+ driverParam: string;
412
+ notNull: false;
413
+ hasDefault: false;
414
+ isPrimaryKey: false;
415
+ isAutoincrement: false;
416
+ hasRuntimeDefault: false;
417
+ enumValues: [string, ...string[]];
418
+ baseColumn: never;
419
+ identity: undefined;
420
+ generated: undefined;
421
+ }, {}, {}>;
422
+ kind: import("drizzle-orm/pg-core").PgColumn<{
423
+ name: "kind";
424
+ tableName: "customer_signals";
425
+ dataType: "string";
426
+ columnType: "PgEnumColumn";
427
+ data: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
428
+ driverParam: string;
429
+ notNull: true;
430
+ hasDefault: false;
431
+ isPrimaryKey: false;
432
+ isAutoincrement: false;
433
+ hasRuntimeDefault: false;
434
+ enumValues: ["wishlist", "notify", "inquiry", "request_offer", "referral"];
435
+ baseColumn: never;
436
+ identity: undefined;
437
+ generated: undefined;
438
+ }, {}, {}>;
439
+ source: import("drizzle-orm/pg-core").PgColumn<{
440
+ name: "source";
441
+ tableName: "customer_signals";
442
+ dataType: "string";
443
+ columnType: "PgEnumColumn";
444
+ data: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
445
+ driverParam: string;
446
+ notNull: true;
447
+ hasDefault: false;
448
+ isPrimaryKey: false;
449
+ isAutoincrement: false;
450
+ hasRuntimeDefault: false;
451
+ enumValues: ["form", "phone", "admin", "abandoned_cart", "website", "booking"];
452
+ baseColumn: never;
453
+ identity: undefined;
454
+ generated: undefined;
455
+ }, {}, {}>;
456
+ status: import("drizzle-orm/pg-core").PgColumn<{
457
+ name: "status";
458
+ tableName: "customer_signals";
459
+ dataType: "string";
460
+ columnType: "PgEnumColumn";
461
+ data: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
462
+ driverParam: string;
463
+ notNull: true;
464
+ hasDefault: true;
465
+ isPrimaryKey: false;
466
+ isAutoincrement: false;
467
+ hasRuntimeDefault: false;
468
+ enumValues: ["new", "contacted", "qualified", "converted", "lost", "expired"];
469
+ baseColumn: never;
470
+ identity: undefined;
471
+ generated: undefined;
472
+ }, {}, {}>;
473
+ priority: import("drizzle-orm/pg-core").PgColumn<{
474
+ name: "priority";
475
+ tableName: "customer_signals";
476
+ dataType: "string";
477
+ columnType: "PgText";
478
+ data: string;
479
+ driverParam: string;
480
+ notNull: true;
481
+ hasDefault: true;
482
+ isPrimaryKey: false;
483
+ isAutoincrement: false;
484
+ hasRuntimeDefault: false;
485
+ enumValues: [string, ...string[]];
486
+ baseColumn: never;
487
+ identity: undefined;
488
+ generated: undefined;
489
+ }, {}, {}>;
490
+ notes: import("drizzle-orm/pg-core").PgColumn<{
491
+ name: "notes";
492
+ tableName: "customer_signals";
493
+ dataType: "string";
494
+ columnType: "PgText";
495
+ data: string;
496
+ driverParam: string;
497
+ notNull: false;
498
+ hasDefault: false;
499
+ isPrimaryKey: false;
500
+ isAutoincrement: false;
501
+ hasRuntimeDefault: false;
502
+ enumValues: [string, ...string[]];
503
+ baseColumn: never;
504
+ identity: undefined;
505
+ generated: undefined;
506
+ }, {}, {}>;
507
+ tags: import("drizzle-orm/pg-core").PgColumn<{
508
+ name: "tags";
509
+ tableName: "customer_signals";
510
+ dataType: "json";
511
+ columnType: "PgJsonb";
512
+ data: string[];
513
+ driverParam: unknown;
514
+ notNull: true;
515
+ hasDefault: true;
516
+ isPrimaryKey: false;
517
+ isAutoincrement: false;
518
+ hasRuntimeDefault: false;
519
+ enumValues: undefined;
520
+ baseColumn: never;
521
+ identity: undefined;
522
+ generated: undefined;
523
+ }, {}, {
524
+ $type: string[];
525
+ }>;
526
+ assignedToUserId: import("drizzle-orm/pg-core").PgColumn<{
527
+ name: "assigned_to_user_id";
528
+ tableName: "customer_signals";
529
+ dataType: "string";
530
+ columnType: "PgText";
531
+ data: string;
532
+ driverParam: string;
533
+ notNull: false;
534
+ hasDefault: false;
535
+ isPrimaryKey: false;
536
+ isAutoincrement: false;
537
+ hasRuntimeDefault: false;
538
+ enumValues: [string, ...string[]];
539
+ baseColumn: never;
540
+ identity: undefined;
541
+ generated: undefined;
542
+ }, {}, {}>;
543
+ followUpAt: import("drizzle-orm/pg-core").PgColumn<{
544
+ name: "follow_up_at";
545
+ tableName: "customer_signals";
546
+ dataType: "date";
547
+ columnType: "PgTimestamp";
548
+ data: Date;
549
+ driverParam: string;
550
+ notNull: false;
551
+ hasDefault: false;
552
+ isPrimaryKey: false;
553
+ isAutoincrement: false;
554
+ hasRuntimeDefault: false;
555
+ enumValues: undefined;
556
+ baseColumn: never;
557
+ identity: undefined;
558
+ generated: undefined;
559
+ }, {}, {}>;
560
+ resolvedBookingId: import("drizzle-orm/pg-core").PgColumn<{
561
+ name: "resolved_booking_id";
562
+ tableName: "customer_signals";
563
+ dataType: "string";
564
+ columnType: "PgText";
565
+ data: string;
566
+ driverParam: string;
567
+ notNull: false;
568
+ hasDefault: false;
569
+ isPrimaryKey: false;
570
+ isAutoincrement: false;
571
+ hasRuntimeDefault: false;
572
+ enumValues: [string, ...string[]];
573
+ baseColumn: never;
574
+ identity: undefined;
575
+ generated: undefined;
576
+ }, {}, {}>;
577
+ sourceSubmissionId: import("drizzle-orm/pg-core").PgColumn<{
578
+ name: "source_submission_id";
579
+ tableName: "customer_signals";
580
+ dataType: "string";
581
+ columnType: "PgText";
582
+ data: string;
583
+ driverParam: string;
584
+ notNull: false;
585
+ hasDefault: false;
586
+ isPrimaryKey: false;
587
+ isAutoincrement: false;
588
+ hasRuntimeDefault: false;
589
+ enumValues: [string, ...string[]];
590
+ baseColumn: never;
591
+ identity: undefined;
592
+ generated: undefined;
593
+ }, {}, {}>;
594
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
595
+ name: "metadata";
596
+ tableName: "customer_signals";
597
+ dataType: "json";
598
+ columnType: "PgJsonb";
599
+ data: Record<string, unknown>;
600
+ driverParam: unknown;
601
+ notNull: false;
602
+ hasDefault: false;
603
+ isPrimaryKey: false;
604
+ isAutoincrement: false;
605
+ hasRuntimeDefault: false;
606
+ enumValues: undefined;
607
+ baseColumn: never;
608
+ identity: undefined;
609
+ generated: undefined;
610
+ }, {}, {
611
+ $type: Record<string, unknown>;
612
+ }>;
613
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
614
+ name: "created_at";
615
+ tableName: "customer_signals";
616
+ dataType: "date";
617
+ columnType: "PgTimestamp";
618
+ data: Date;
619
+ driverParam: string;
620
+ notNull: true;
621
+ hasDefault: true;
622
+ isPrimaryKey: false;
623
+ isAutoincrement: false;
624
+ hasRuntimeDefault: false;
625
+ enumValues: undefined;
626
+ baseColumn: never;
627
+ identity: undefined;
628
+ generated: undefined;
629
+ }, {}, {}>;
630
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
631
+ name: "updated_at";
632
+ tableName: "customer_signals";
633
+ dataType: "date";
634
+ columnType: "PgTimestamp";
635
+ data: Date;
636
+ driverParam: string;
637
+ notNull: true;
638
+ hasDefault: true;
639
+ isPrimaryKey: false;
640
+ isAutoincrement: false;
641
+ hasRuntimeDefault: false;
642
+ enumValues: undefined;
643
+ baseColumn: never;
644
+ identity: undefined;
645
+ generated: undefined;
646
+ }, {}, {}>;
647
+ }>, "where" | "orderBy">;
648
+ getCustomerSignal(db: PostgresJsDatabase, id: string): Promise<{
649
+ id: string;
650
+ personId: string;
651
+ productId: string | null;
652
+ optionUnitId: string | null;
653
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
654
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
655
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
656
+ priority: string;
657
+ notes: string | null;
658
+ tags: string[];
659
+ assignedToUserId: string | null;
660
+ followUpAt: Date | null;
661
+ resolvedBookingId: string | null;
662
+ sourceSubmissionId: string | null;
663
+ metadata: Record<string, unknown> | null;
664
+ createdAt: Date;
665
+ updatedAt: Date;
666
+ } | null>;
667
+ createCustomerSignal(db: PostgresJsDatabase, data: CreateCustomerSignalInput): Promise<{
668
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
669
+ metadata: Record<string, unknown> | null;
670
+ id: string;
671
+ createdAt: Date;
672
+ updatedAt: Date;
673
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
674
+ notes: string | null;
675
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
676
+ tags: string[];
677
+ personId: string;
678
+ productId: string | null;
679
+ optionUnitId: string | null;
680
+ priority: string;
681
+ assignedToUserId: string | null;
682
+ followUpAt: Date | null;
683
+ resolvedBookingId: string | null;
684
+ sourceSubmissionId: string | null;
685
+ } | null>;
686
+ updateCustomerSignal(db: PostgresJsDatabase, id: string, data: UpdateCustomerSignalInput): Promise<{
687
+ id: string;
688
+ personId: string;
689
+ productId: string | null;
690
+ optionUnitId: string | null;
691
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
692
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
693
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
694
+ priority: string;
695
+ notes: string | null;
696
+ tags: string[];
697
+ assignedToUserId: string | null;
698
+ followUpAt: Date | null;
699
+ resolvedBookingId: string | null;
700
+ sourceSubmissionId: string | null;
701
+ metadata: Record<string, unknown> | null;
702
+ createdAt: Date;
703
+ updatedAt: Date;
704
+ } | null>;
705
+ deleteCustomerSignal(db: PostgresJsDatabase, id: string): Promise<{
706
+ id: string;
707
+ } | null>;
708
+ /**
709
+ * Closes the loop: marks the signal as converted and records the
710
+ * booking it became. The caller (operator UI) is responsible for
711
+ * actually creating the booking; this is just the bookkeeping.
712
+ */
713
+ resolveCustomerSignalToBooking(db: PostgresJsDatabase, signalId: string, bookingId: string): Promise<{
714
+ id: string;
715
+ personId: string;
716
+ productId: string | null;
717
+ optionUnitId: string | null;
718
+ kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
719
+ source: "admin" | "form" | "phone" | "website" | "abandoned_cart" | "booking";
720
+ status: "lost" | "expired" | "new" | "contacted" | "qualified" | "converted";
721
+ priority: string;
722
+ notes: string | null;
723
+ tags: string[];
724
+ assignedToUserId: string | null;
725
+ followUpAt: Date | null;
726
+ resolvedBookingId: string | null;
727
+ sourceSubmissionId: string | null;
728
+ metadata: Record<string, unknown> | null;
729
+ createdAt: Date;
730
+ updatedAt: Date;
731
+ } | null>;
732
+ };
733
+ //# sourceMappingURL=customer-signals.d.ts.map