@voyantjs/notifications 0.6.7 → 0.6.9
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.
- package/README.md +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/liquid.d.ts +5 -0
- package/dist/liquid.d.ts.map +1 -0
- package/dist/liquid.js +156 -0
- package/dist/routes.d.ts +18 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +5 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +29 -20
- package/dist/service-booking-documents.d.ts.map +1 -1
- package/dist/service-booking-documents.js +11 -4
- package/dist/service-deliveries.d.ts.map +1 -1
- package/dist/service-deliveries.js +25 -7
- package/dist/service-reminders.d.ts.map +1 -1
- package/dist/service-reminders.js +98 -78
- package/dist/service-shared.d.ts +48 -3
- package/dist/service-shared.d.ts.map +1 -1
- package/dist/service-shared.js +300 -40
- package/dist/service.d.ts +3 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +3 -1
- package/dist/template-authoring.d.ts +23 -0
- package/dist/template-authoring.d.ts.map +1 -0
- package/dist/template-authoring.js +386 -0
- package/dist/validation.d.ts +23 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +21 -0
- package/package.json +8 -7
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bookings, bookingTravelers } from "@voyantjs/bookings/schema";
|
|
2
2
|
import { bookingPaymentSchedules, invoices } from "@voyantjs/finance";
|
|
3
3
|
import { and, desc, eq, gt, or } from "drizzle-orm";
|
|
4
4
|
import { notificationReminderRules, notificationReminderRuns } from "./schema.js";
|
|
5
5
|
import { sendInvoiceNotification, sendNotification } from "./service-deliveries.js";
|
|
6
|
-
import { addUtcDays, buildReminderDedupeKey, resolveReminderRecipient, startOfUtcDay, toDateString, toTimestamp, } from "./service-shared.js";
|
|
6
|
+
import { addUtcDays, buildReminderDedupeKey, listBookingNotificationItems, resolveReminderRecipient, startOfUtcDay, toDateString, toTimestamp, } from "./service-shared.js";
|
|
7
7
|
function buildReminderSweepSummary() {
|
|
8
8
|
return {
|
|
9
9
|
processed: 0,
|
|
@@ -156,21 +156,23 @@ async function queueBookingPaymentScheduleReminder(db, enqueueDelivery, rule, sc
|
|
|
156
156
|
if (!booking) {
|
|
157
157
|
return markReminderRunSkipped(db, reminderRun.id, now, "Booking not found for payment schedule");
|
|
158
158
|
}
|
|
159
|
-
const participants = await
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
159
|
+
const [participants] = await Promise.all([
|
|
160
|
+
db
|
|
161
|
+
.select({
|
|
162
|
+
id: bookingTravelers.id,
|
|
163
|
+
firstName: bookingTravelers.firstName,
|
|
164
|
+
lastName: bookingTravelers.lastName,
|
|
165
|
+
email: bookingTravelers.email,
|
|
166
|
+
participantType: bookingTravelers.participantType,
|
|
167
|
+
isPrimary: bookingTravelers.isPrimary,
|
|
168
|
+
})
|
|
169
|
+
.from(bookingTravelers)
|
|
170
|
+
.where(eq(bookingTravelers.bookingId, booking.id))
|
|
171
|
+
.orderBy(desc(bookingTravelers.isPrimary), bookingTravelers.createdAt),
|
|
172
|
+
]);
|
|
173
|
+
const recipient = resolveReminderRecipient(booking, participants);
|
|
172
174
|
if (!recipient?.email) {
|
|
173
|
-
return markReminderRunSkipped(db, reminderRun.id, now, "No
|
|
175
|
+
return markReminderRunSkipped(db, reminderRun.id, now, "No traveler email available for booking payment reminder");
|
|
174
176
|
}
|
|
175
177
|
return enqueueReminderRun(db, enqueueDelivery, { ...reminderRun, recipient: recipient.email }, now);
|
|
176
178
|
}
|
|
@@ -225,21 +227,23 @@ async function queueInvoiceReminder(db, enqueueDelivery, rule, invoice, now) {
|
|
|
225
227
|
if (!booking) {
|
|
226
228
|
return markReminderRunSkipped(db, reminderRun.id, now, "Booking not found for invoice reminder");
|
|
227
229
|
}
|
|
228
|
-
const participants = await
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
230
|
+
const [participants] = await Promise.all([
|
|
231
|
+
db
|
|
232
|
+
.select({
|
|
233
|
+
id: bookingTravelers.id,
|
|
234
|
+
firstName: bookingTravelers.firstName,
|
|
235
|
+
lastName: bookingTravelers.lastName,
|
|
236
|
+
email: bookingTravelers.email,
|
|
237
|
+
participantType: bookingTravelers.participantType,
|
|
238
|
+
isPrimary: bookingTravelers.isPrimary,
|
|
239
|
+
})
|
|
240
|
+
.from(bookingTravelers)
|
|
241
|
+
.where(eq(bookingTravelers.bookingId, booking.id))
|
|
242
|
+
.orderBy(desc(bookingTravelers.isPrimary), bookingTravelers.createdAt),
|
|
243
|
+
]);
|
|
244
|
+
const recipient = resolveReminderRecipient(booking, participants);
|
|
241
245
|
if (!recipient?.email) {
|
|
242
|
-
return markReminderRunSkipped(db, reminderRun.id, now, "No
|
|
246
|
+
return markReminderRunSkipped(db, reminderRun.id, now, "No traveler email available for invoice reminder");
|
|
243
247
|
}
|
|
244
248
|
return enqueueReminderRun(db, enqueueDelivery, { ...reminderRun, recipient: recipient.email }, now);
|
|
245
249
|
}
|
|
@@ -285,19 +289,22 @@ async function sendBookingPaymentScheduleReminder(db, dispatcher, rule, schedule
|
|
|
285
289
|
.returning();
|
|
286
290
|
return run ?? null;
|
|
287
291
|
}
|
|
288
|
-
const participants = await
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
292
|
+
const [participants, items] = await Promise.all([
|
|
293
|
+
db
|
|
294
|
+
.select({
|
|
295
|
+
id: bookingTravelers.id,
|
|
296
|
+
firstName: bookingTravelers.firstName,
|
|
297
|
+
lastName: bookingTravelers.lastName,
|
|
298
|
+
email: bookingTravelers.email,
|
|
299
|
+
participantType: bookingTravelers.participantType,
|
|
300
|
+
isPrimary: bookingTravelers.isPrimary,
|
|
301
|
+
})
|
|
302
|
+
.from(bookingTravelers)
|
|
303
|
+
.where(eq(bookingTravelers.bookingId, booking.id))
|
|
304
|
+
.orderBy(desc(bookingTravelers.isPrimary), bookingTravelers.createdAt),
|
|
305
|
+
listBookingNotificationItems(db, booking.id),
|
|
306
|
+
]);
|
|
307
|
+
const recipient = resolveReminderRecipient(booking, participants);
|
|
301
308
|
const [processingRun] = await db
|
|
302
309
|
.insert(notificationReminderRuns)
|
|
303
310
|
.values({
|
|
@@ -327,7 +334,7 @@ async function sendBookingPaymentScheduleReminder(db, dispatcher, rule, schedule
|
|
|
327
334
|
return null;
|
|
328
335
|
}
|
|
329
336
|
if (!recipient?.email) {
|
|
330
|
-
return markReminderRunSkipped(db, processingRun.id, now, "No
|
|
337
|
+
return markReminderRunSkipped(db, processingRun.id, now, "No traveler email available for booking payment reminder");
|
|
331
338
|
}
|
|
332
339
|
try {
|
|
333
340
|
const delivery = await sendNotification(db, dispatcher, {
|
|
@@ -344,11 +351,14 @@ async function sendBookingPaymentScheduleReminder(db, dispatcher, rule, schedule
|
|
|
344
351
|
currency: schedule.currency,
|
|
345
352
|
scheduleType: schedule.scheduleType,
|
|
346
353
|
reminderOffsetDays: rule.relativeDaysFromDueDate,
|
|
347
|
-
|
|
354
|
+
traveler: {
|
|
348
355
|
firstName: recipient.firstName,
|
|
349
356
|
lastName: recipient.lastName,
|
|
350
357
|
email: recipient.email,
|
|
358
|
+
participantType: recipient.participantType,
|
|
359
|
+
isPrimary: recipient.isPrimary,
|
|
351
360
|
},
|
|
361
|
+
travelers: participants,
|
|
352
362
|
booking: {
|
|
353
363
|
id: booking.id,
|
|
354
364
|
bookingNumber: booking.bookingNumber,
|
|
@@ -365,6 +375,7 @@ async function sendBookingPaymentScheduleReminder(db, dispatcher, rule, schedule
|
|
|
365
375
|
scheduleType: schedule.scheduleType,
|
|
366
376
|
status: schedule.status,
|
|
367
377
|
},
|
|
378
|
+
items,
|
|
368
379
|
},
|
|
369
380
|
targetType: "booking_payment_schedule",
|
|
370
381
|
targetId: schedule.id,
|
|
@@ -428,19 +439,21 @@ async function sendInvoiceReminder(db, dispatcher, rule, invoice, now) {
|
|
|
428
439
|
.returning();
|
|
429
440
|
return run ?? null;
|
|
430
441
|
}
|
|
431
|
-
const participants = await
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
442
|
+
const [participants] = await Promise.all([
|
|
443
|
+
db
|
|
444
|
+
.select({
|
|
445
|
+
id: bookingTravelers.id,
|
|
446
|
+
firstName: bookingTravelers.firstName,
|
|
447
|
+
lastName: bookingTravelers.lastName,
|
|
448
|
+
email: bookingTravelers.email,
|
|
449
|
+
participantType: bookingTravelers.participantType,
|
|
450
|
+
isPrimary: bookingTravelers.isPrimary,
|
|
451
|
+
})
|
|
452
|
+
.from(bookingTravelers)
|
|
453
|
+
.where(eq(bookingTravelers.bookingId, booking.id))
|
|
454
|
+
.orderBy(desc(bookingTravelers.isPrimary), bookingTravelers.createdAt),
|
|
455
|
+
]);
|
|
456
|
+
const recipient = resolveReminderRecipient(booking, participants);
|
|
444
457
|
const [processingRun] = await db
|
|
445
458
|
.insert(notificationReminderRuns)
|
|
446
459
|
.values({
|
|
@@ -472,7 +485,7 @@ async function sendInvoiceReminder(db, dispatcher, rule, invoice, now) {
|
|
|
472
485
|
return null;
|
|
473
486
|
}
|
|
474
487
|
if (!recipient?.email) {
|
|
475
|
-
return markReminderRunSkipped(db, processingRun.id, now, "No
|
|
488
|
+
return markReminderRunSkipped(db, processingRun.id, now, "No traveler email available for invoice reminder");
|
|
476
489
|
}
|
|
477
490
|
try {
|
|
478
491
|
const delivery = await sendInvoiceNotification(db, dispatcher, invoice.id, {
|
|
@@ -515,23 +528,26 @@ async function sendQueuedBookingPaymentScheduleReminder(db, dispatcher, run, rul
|
|
|
515
528
|
if (!booking) {
|
|
516
529
|
return markReminderRunSkipped(db, run.id, now, "Booking not found for payment schedule");
|
|
517
530
|
}
|
|
518
|
-
const participants = await
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
531
|
+
const [participants, items] = await Promise.all([
|
|
532
|
+
db
|
|
533
|
+
.select({
|
|
534
|
+
id: bookingTravelers.id,
|
|
535
|
+
firstName: bookingTravelers.firstName,
|
|
536
|
+
lastName: bookingTravelers.lastName,
|
|
537
|
+
email: bookingTravelers.email,
|
|
538
|
+
participantType: bookingTravelers.participantType,
|
|
539
|
+
isPrimary: bookingTravelers.isPrimary,
|
|
540
|
+
})
|
|
541
|
+
.from(bookingTravelers)
|
|
542
|
+
.where(eq(bookingTravelers.bookingId, booking.id))
|
|
543
|
+
.orderBy(desc(bookingTravelers.isPrimary), bookingTravelers.createdAt),
|
|
544
|
+
listBookingNotificationItems(db, booking.id),
|
|
545
|
+
]);
|
|
546
|
+
const fallbackRecipient = resolveReminderRecipient(booking, participants);
|
|
547
|
+
const traveler = participants.find((entry) => entry.email === run.recipient) ?? fallbackRecipient ?? null;
|
|
548
|
+
const recipientEmail = run.recipient ?? traveler?.email ?? null;
|
|
533
549
|
if (!recipientEmail) {
|
|
534
|
-
return markReminderRunSkipped(db, run.id, now, "No
|
|
550
|
+
return markReminderRunSkipped(db, run.id, now, "No traveler email available for booking payment reminder");
|
|
535
551
|
}
|
|
536
552
|
try {
|
|
537
553
|
const delivery = await sendNotification(db, dispatcher, {
|
|
@@ -548,13 +564,16 @@ async function sendQueuedBookingPaymentScheduleReminder(db, dispatcher, run, rul
|
|
|
548
564
|
currency: schedule.currency,
|
|
549
565
|
scheduleType: schedule.scheduleType,
|
|
550
566
|
reminderOffsetDays: rule.relativeDaysFromDueDate,
|
|
551
|
-
|
|
567
|
+
traveler: traveler
|
|
552
568
|
? {
|
|
553
|
-
firstName:
|
|
554
|
-
lastName:
|
|
569
|
+
firstName: traveler.firstName,
|
|
570
|
+
lastName: traveler.lastName,
|
|
555
571
|
email: recipientEmail,
|
|
572
|
+
participantType: traveler.participantType,
|
|
573
|
+
isPrimary: traveler.isPrimary,
|
|
556
574
|
}
|
|
557
575
|
: null,
|
|
576
|
+
travelers: participants,
|
|
558
577
|
booking: {
|
|
559
578
|
id: booking.id,
|
|
560
579
|
bookingNumber: booking.bookingNumber,
|
|
@@ -571,6 +590,7 @@ async function sendQueuedBookingPaymentScheduleReminder(db, dispatcher, run, rul
|
|
|
571
590
|
scheduleType: schedule.scheduleType,
|
|
572
591
|
status: schedule.status,
|
|
573
592
|
},
|
|
593
|
+
items,
|
|
574
594
|
},
|
|
575
595
|
targetType: "booking_payment_schedule",
|
|
576
596
|
targetId: schedule.id,
|
package/dist/service-shared.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { SQLWrapper } from "drizzle-orm/sql";
|
|
|
4
4
|
import type { z } from "zod";
|
|
5
5
|
import type { notificationReminderRules } from "./schema.js";
|
|
6
6
|
import type { NotificationAttachment, NotificationChannel, NotificationPayload, NotificationProvider, NotificationResult } from "./types.js";
|
|
7
|
-
import type { bookingDocumentBundleItemSchema, insertNotificationReminderRuleSchema, insertNotificationTemplateSchema, notificationDeliveryListQuerySchema, notificationReminderRuleListQuerySchema, notificationReminderRunListQuerySchema, notificationReminderRunRecordSchema, notificationTemplateListQuerySchema, runDueRemindersSchema, sendBookingDocumentsNotificationSchema, sendInvoiceNotificationSchema, sendNotificationSchema, sendPaymentSessionNotificationSchema, updateNotificationReminderRuleSchema, updateNotificationTemplateSchema } from "./validation.js";
|
|
7
|
+
import type { bookingDocumentBundleItemSchema, insertNotificationReminderRuleSchema, insertNotificationTemplateSchema, notificationDeliveryListQuerySchema, notificationReminderRuleListQuerySchema, notificationReminderRunListQuerySchema, notificationReminderRunRecordSchema, notificationTemplateListQuerySchema, previewNotificationTemplateSchema, runDueRemindersSchema, sendBookingDocumentsNotificationSchema, sendInvoiceNotificationSchema, sendNotificationSchema, sendPaymentSessionNotificationSchema, updateNotificationReminderRuleSchema, updateNotificationTemplateSchema } from "./validation.js";
|
|
8
8
|
export type NotificationTemplateListQuery = z.infer<typeof notificationTemplateListQuerySchema>;
|
|
9
9
|
export type NotificationDeliveryListQuery = z.infer<typeof notificationDeliveryListQuerySchema>;
|
|
10
10
|
export type CreateNotificationTemplateInput = z.infer<typeof insertNotificationTemplateSchema>;
|
|
@@ -16,6 +16,7 @@ export type NotificationReminderRunRecord = z.infer<typeof notificationReminderR
|
|
|
16
16
|
export type CreateNotificationReminderRuleInput = z.infer<typeof insertNotificationReminderRuleSchema>;
|
|
17
17
|
export type UpdateNotificationReminderRuleInput = z.infer<typeof updateNotificationReminderRuleSchema>;
|
|
18
18
|
export type RunDueRemindersInput = z.infer<typeof runDueRemindersSchema>;
|
|
19
|
+
export type PreviewNotificationTemplateInput = z.infer<typeof previewNotificationTemplateSchema>;
|
|
19
20
|
export type SendPaymentSessionNotificationInput = z.infer<typeof sendPaymentSessionNotificationSchema>;
|
|
20
21
|
export type SendInvoiceNotificationInput = z.infer<typeof sendInvoiceNotificationSchema>;
|
|
21
22
|
export type SendBookingDocumentsNotificationInput = z.infer<typeof sendBookingDocumentsNotificationSchema>;
|
|
@@ -51,12 +52,55 @@ export declare function summarizeNotificationAttachments(attachments: ReadonlyAr
|
|
|
51
52
|
contentId: string | null;
|
|
52
53
|
}[];
|
|
53
54
|
export declare function renderNotificationTemplate(template: string | null | undefined, data: Record<string, unknown>): string | null;
|
|
55
|
+
export declare function previewNotificationTemplate(input: PreviewNotificationTemplateInput): {
|
|
56
|
+
channel: "email" | "sms";
|
|
57
|
+
provider: string | null;
|
|
58
|
+
fromAddress: string | null;
|
|
59
|
+
subject: string | null;
|
|
60
|
+
html: string | null;
|
|
61
|
+
text: string | null;
|
|
62
|
+
};
|
|
54
63
|
export declare function toTimestamp(value?: string | null): Date | null;
|
|
64
|
+
export declare function normalizeNotificationTemplateData(data: Record<string, unknown>): {
|
|
65
|
+
traveler: unknown;
|
|
66
|
+
travelers: unknown[];
|
|
67
|
+
billingPerson: unknown;
|
|
68
|
+
billing: unknown;
|
|
69
|
+
booking: unknown;
|
|
70
|
+
invoice: unknown;
|
|
71
|
+
paymentSession: unknown;
|
|
72
|
+
paymentSchedule: unknown;
|
|
73
|
+
payment: {
|
|
74
|
+
amount: {} | null;
|
|
75
|
+
currency: {} | null;
|
|
76
|
+
dueDate: {} | null;
|
|
77
|
+
daysLeft: {} | null;
|
|
78
|
+
reference: {} | null;
|
|
79
|
+
method: {} | null;
|
|
80
|
+
link: {} | null;
|
|
81
|
+
payMode: {} | null;
|
|
82
|
+
paidAmount: {} | null;
|
|
83
|
+
balanceDue: {} | null;
|
|
84
|
+
isPaidInFull: boolean;
|
|
85
|
+
} | null;
|
|
86
|
+
documents: unknown[];
|
|
87
|
+
documentsCount: number;
|
|
88
|
+
items: unknown[];
|
|
89
|
+
product: {
|
|
90
|
+
title: {} | null;
|
|
91
|
+
} | null;
|
|
92
|
+
};
|
|
55
93
|
export declare function startOfUtcDay(value: Date): Date;
|
|
56
94
|
export declare function addUtcDays(value: Date, days: number): Date;
|
|
57
95
|
export declare function toDateString(value: Date): string;
|
|
58
96
|
export declare function buildReminderDedupeKey(ruleId: string, targetId: string, runDate: string): string;
|
|
59
|
-
export declare function resolveReminderRecipient(
|
|
97
|
+
export declare function resolveReminderRecipient(booking: {
|
|
98
|
+
contactFirstName: string | null;
|
|
99
|
+
contactLastName: string | null;
|
|
100
|
+
contactEmail: string | null;
|
|
101
|
+
contactPhone: string | null;
|
|
102
|
+
contactPreferredLanguage: string | null;
|
|
103
|
+
} | null, participants: Array<{
|
|
60
104
|
email: string | null;
|
|
61
105
|
isPrimary: boolean;
|
|
62
106
|
participantType: string;
|
|
@@ -74,9 +118,10 @@ export declare function listBookingNotificationParticipants(db: PostgresJsDataba
|
|
|
74
118
|
firstName: string;
|
|
75
119
|
lastName: string;
|
|
76
120
|
email: string | null;
|
|
77
|
-
participantType: "
|
|
121
|
+
participantType: "other" | "traveler" | "occupant";
|
|
78
122
|
isPrimary: boolean;
|
|
79
123
|
}[]>;
|
|
124
|
+
export declare function listBookingNotificationItems(db: PostgresJsDatabase, bookingId: string): Promise<unknown[]>;
|
|
80
125
|
export declare function paginate<T>(rowsPromise: Promise<T[]>, totalPromise: Promise<Array<{
|
|
81
126
|
total: number;
|
|
82
127
|
}>>, limit: number, offset: number): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-shared.d.ts","sourceRoot":"","sources":["../src/service-shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"service-shared.d.ts","sourceRoot":"","sources":["../src/service-shared.ts"],"names":[],"mappings":"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"}
|