@voyantjs/bookings 0.52.4 → 0.53.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.
package/dist/index.d.ts CHANGED
@@ -20,7 +20,7 @@ export interface BookingsHonoModuleOptions extends BookingRouteRuntimeOptions {
20
20
  }
21
21
  export declare function createBookingsHonoModule(options?: BookingsHonoModuleOptions): HonoModule;
22
22
  export declare const bookingsHonoModule: HonoModule;
23
- export type { BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingKmsProvider, } from "./route-runtime.js";
23
+ export type { BookingPersonResolverContact, BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingBillingPerson, ResolveBookingKmsProvider, ResolveBookingTravelerPerson, ResolveBookingTravelSnapshot, } from "./route-runtime.js";
24
24
  export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
25
25
  export type { BookingActionLedgerListResponse, BookingRoutes } from "./routes.js";
26
26
  export type { PublicBookingRoutes } from "./routes-public.js";
@@ -29,6 +29,6 @@ export type { BookingTravelerBedPreference, BookingTravelerDietary, BookingTrave
29
29
  export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, bookingTravelerIdentitySchema, bookingTravelerTravelDetailInsertSchema, bookingTravelerTravelDetailSelectSchema, bookingTravelerTravelDetails, bookingTravelerTravelDetailUpdateSchema, decryptedBookingTravelerTravelDetailSchema, travelerAllocationMapSchema, } from "./schema/travel-details.js";
30
30
  export type { Booking, BookingActivity, BookingAllocation, BookingDocument, BookingFulfillment, BookingGroup, BookingGroupMember, BookingItem, BookingItemTraveler, BookingNote, BookingPiiAccessLog, BookingPriceOverride, BookingRedemptionEvent, BookingSessionState, BookingStaffAssignment, BookingSupplierStatus, BookingTraveler, NewBooking, NewBookingActivity, NewBookingAllocation, NewBookingDocument, NewBookingFulfillment, NewBookingGroup, NewBookingGroupMember, NewBookingItem, NewBookingItemTraveler, NewBookingNote, NewBookingPiiAccessLog, NewBookingRedemptionEvent, NewBookingSessionState, NewBookingStaffAssignment, NewBookingSupplierStatus, NewBookingTraveler, } from "./schema.js";
31
31
  export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
32
- export { publicBookingsService, resolveSessionPricingSnapshot } from "./service-public.js";
32
+ export { type PublicBookingsServiceResolvers, publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
33
33
  export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
34
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -42,5 +42,5 @@ export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "
42
42
  export { publicBookingRoutes } from "./routes-public.js";
43
43
  export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, bookingTravelerIdentitySchema, bookingTravelerTravelDetailInsertSchema, bookingTravelerTravelDetailSelectSchema, bookingTravelerTravelDetails, bookingTravelerTravelDetailUpdateSchema, decryptedBookingTravelerTravelDetailSchema, travelerAllocationMapSchema, } from "./schema/travel-details.js";
44
44
  export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
45
- export { publicBookingsService, resolveSessionPricingSnapshot } from "./service-public.js";
45
+ export { publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
46
46
  export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
@@ -15,9 +15,49 @@ export declare const BOOKING_ROUTE_RUNTIME_CONTAINER_KEY = "runtime.bookings.rou
15
15
  export type ResolveBookingTravelSnapshot = (db: PostgresJsDatabase, personId: string, ctx: {
16
16
  kms: KmsProvider;
17
17
  }) => Promise<BookingTravelerSnapshot | null>;
18
+ /**
19
+ * Best-effort contact snapshot the booking-session bootstrap + update
20
+ * flows hand to the caller's person resolver. Mirrors the storefront
21
+ * lead-intake `StorefrontLeadContact` shape so the same resolver can
22
+ * service both surfaces.
23
+ */
24
+ export interface BookingPersonResolverContact {
25
+ firstName: string | null;
26
+ lastName: string | null;
27
+ email: string | null;
28
+ phone: string | null;
29
+ preferredLanguage: string | null;
30
+ }
31
+ /**
32
+ * Resolves (or upserts) a CRM person from a booking's billing contact
33
+ * snapshot. Returns the resolved person id, or `null` to leave the
34
+ * booking's `person_id` unset. Templates wire this from
35
+ * `crmService.upsertPersonFromContact` so the bookings package stays
36
+ * free of any direct CRM dependency — see issue #961.
37
+ */
38
+ export type ResolveBookingBillingPerson = (db: PostgresJsDatabase, contact: BookingPersonResolverContact, ctx: {
39
+ bookingId: string;
40
+ source: string;
41
+ sourceRef: string;
42
+ }) => Promise<string | null>;
43
+ /**
44
+ * Resolves (or upserts) a CRM person from a booking traveler payload.
45
+ * Called from `publicBookingsService.createSession` /
46
+ * `updateSession` per-traveler so storefront-originated bookings
47
+ * produce CRM person links per traveler (not just for the billing
48
+ * contact). Returns the resolved person id, or `null` to keep
49
+ * `booking_travelers.person_id` unset.
50
+ */
51
+ export type ResolveBookingTravelerPerson = (db: PostgresJsDatabase, contact: BookingPersonResolverContact, ctx: {
52
+ bookingId: string;
53
+ source: string;
54
+ sourceRef: string;
55
+ }) => Promise<string | null>;
18
56
  export interface BookingRouteRuntime {
19
57
  getKmsProvider(): Promise<KmsProvider>;
20
58
  resolveTravelSnapshot?: ResolveBookingTravelSnapshot;
59
+ resolveBillingPerson?: ResolveBookingBillingPerson;
60
+ resolveTravelerPerson?: ResolveBookingTravelerPerson;
21
61
  }
22
62
  /**
23
63
  * Hook for apps that source their KMS key material from somewhere other than
@@ -30,6 +70,8 @@ export type ResolveBookingKmsProvider = (env: Record<string, string | undefined>
30
70
  export interface BookingRouteRuntimeOptions {
31
71
  resolveKmsProvider?: ResolveBookingKmsProvider;
32
72
  resolveTravelSnapshot?: ResolveBookingTravelSnapshot;
73
+ resolveBillingPerson?: ResolveBookingBillingPerson;
74
+ resolveTravelerPerson?: ResolveBookingTravelerPerson;
33
75
  }
34
76
  export declare function buildBookingRouteRuntime(bindings: KmsBindings, options?: BookingRouteRuntimeOptions): BookingRouteRuntime;
35
77
  //# sourceMappingURL=route-runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../src/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAO,MAAM,mCAAmC,4BAA4B,CAAA;AAE5E;;;;;;;;GAQG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,KACtB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAA;AAE5C,MAAM,WAAW,mBAAmB;IAClC,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACtC,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KACpC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvC,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAYrB"}
1
+ {"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../src/route-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,eAAO,MAAM,mCAAmC,4BAA4B,CAAA;AAE5E;;;;;;;;GAQG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,WAAW,CAAA;CAAE,KACtB,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG,CACxC,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,4BAA4B,EACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AAE3B;;;;;;;GAOG;AACH,MAAM,MAAM,4BAA4B,GAAG,CACzC,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,4BAA4B,EACrC,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;AAE3B,MAAM,WAAW,mBAAmB;IAClC,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACtC,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;IACpD,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KACpC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvC,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,CAAA;IAC9C,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;IACpD,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;AAgBD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAcrB"}
@@ -17,5 +17,7 @@ export function buildBookingRouteRuntime(bindings, options = {}) {
17
17
  return createKmsProviderFromEnv(runtimeEnv);
18
18
  },
19
19
  resolveTravelSnapshot: options.resolveTravelSnapshot,
20
+ resolveBillingPerson: options.resolveBillingPerson,
21
+ resolveTravelerPerson: options.resolveTravelerPerson,
20
22
  };
21
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,GAAG,EAA2B,MAAM,oBAAoB,CAAA;AAoEtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;+BAyBsC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAkJxE,CAAA;AAEJ,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
1
+ {"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,GAAG,EAA2B,MAAM,oBAAoB,CAAA;AAyFtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;+BA0BsC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAoJxE,CAAA;AAEJ,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { idempotencyKey, parseJsonBody, parseQuery, UnauthorizedApiError } from "@voyantjs/hono";
2
2
  import { Hono } from "hono";
3
3
  import { checkoutCapabilityActions, checkoutCapabilityCookie, issueCheckoutCapability, requireCheckoutCapability, } from "./checkout-capability.js";
4
+ import { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
4
5
  import { getRuntimeEnv, notFound } from "./routes-shared.js";
5
6
  import { publicBookingsService } from "./service-public.js";
6
7
  import { publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, } from "./validation-public.js";
@@ -50,9 +51,25 @@ function sessionCapability(action) {
50
51
  await next();
51
52
  };
52
53
  }
54
+ function getRouteRuntime(c) {
55
+ const container = c.var.container;
56
+ try {
57
+ return (container?.resolve(BOOKING_ROUTE_RUNTIME_CONTAINER_KEY) ?? buildBookingRouteRuntime(c.env));
58
+ }
59
+ catch {
60
+ return buildBookingRouteRuntime(c.env);
61
+ }
62
+ }
63
+ function publicResolvers(c) {
64
+ const runtime = getRouteRuntime(c);
65
+ return {
66
+ resolveBillingPerson: runtime.resolveBillingPerson,
67
+ resolveTravelerPerson: runtime.resolveTravelerPerson,
68
+ };
69
+ }
53
70
  export const publicBookingRoutes = new Hono()
54
71
  .post("/sessions", idempotencyKey({ scope: "POST /v1/public/bookings/sessions" }), async (c) => {
55
- const result = await publicBookingsService.createSession(c.get("db"), await parseJsonBody(c, publicCreateBookingSessionSchema), c.get("userId"));
72
+ const result = await publicBookingsService.createSession(c.get("db"), await parseJsonBody(c, publicCreateBookingSessionSchema), c.get("userId"), publicResolvers(c));
56
73
  if (result.status === "slot_not_found") {
57
74
  return notFound(c, "Availability slot not found");
58
75
  }
@@ -71,7 +88,7 @@ export const publicBookingRoutes = new Hono()
71
88
  return session ? c.json({ data: session }) : notFound(c, "Booking session not found");
72
89
  })
73
90
  .patch("/sessions/:sessionId", sessionCapability("session:update"), idempotencyKey(), async (c) => {
74
- const result = await publicBookingsService.updateSession(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpdateBookingSessionSchema), c.get("userId"));
91
+ const result = await publicBookingsService.updateSession(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpdateBookingSessionSchema), c.get("userId"), publicResolvers(c));
75
92
  if (result.status === "not_found") {
76
93
  return notFound(c, "Booking session not found");
77
94
  }
@@ -86,7 +103,7 @@ export const publicBookingRoutes = new Hono()
86
103
  return state ? c.json({ data: state }) : notFound(c, "Booking session not found");
87
104
  })
88
105
  .put("/sessions/:sessionId/state", sessionCapability("session:update"), idempotencyKey(), async (c) => {
89
- const result = await publicBookingsService.updateSessionState(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpsertBookingSessionStateSchema));
106
+ const result = await publicBookingsService.updateSessionState(c.get("db"), c.req.param("sessionId"), await parseJsonBody(c, publicUpsertBookingSessionStateSchema), publicResolvers(c));
90
107
  if (result.status === "not_found") {
91
108
  return notFound(c, "Booking session not found");
92
109
  }
@@ -1,5 +1,18 @@
1
1
  import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
2
+ import type { ResolveBookingBillingPerson, ResolveBookingTravelerPerson } from "./route-runtime.js";
2
3
  import type { InternalBookingOverviewLookupQuery, PublicBookingOverviewLookupQuery, PublicBookingSessionMutationInput, PublicBookingSessionRepriceInput, PublicCreateBookingSessionInput, PublicUpdateBookingSessionInput, PublicUpsertBookingSessionStateInput } from "./validation-public.js";
4
+ /**
5
+ * Optional resolver bundle for storefront/public booking flows. When
6
+ * supplied, billing-contact + traveler payloads are run through the
7
+ * caller's resolver to look up (or create) the matching CRM person
8
+ * and the booking / traveler rows pick up the resulting `person_id`.
9
+ * Default (omitted) behaviour is the historic one: rows land with
10
+ * `person_id = NULL`. See issue #961.
11
+ */
12
+ export interface PublicBookingsServiceResolvers {
13
+ resolveBillingPerson?: ResolveBookingBillingPerson;
14
+ resolveTravelerPerson?: ResolveBookingTravelerPerson;
15
+ }
3
16
  /**
4
17
  * Resolves the catalog-scoped pricing snapshot for a product (options → option
5
18
  * price rules → per-unit price rules → tiers). The snapshot is the same data
@@ -56,7 +69,7 @@ export declare function resolveSessionPricingSnapshot(db: PostgresJsDatabase, pr
56
69
  }[];
57
70
  } | null>;
58
71
  export declare const publicBookingsService: {
59
- createSession(db: PostgresJsDatabase, input: PublicCreateBookingSessionInput, userId?: string): Promise<{
72
+ createSession(db: PostgresJsDatabase, input: PublicCreateBookingSessionInput, userId?: string, resolvers?: PublicBookingsServiceResolvers): Promise<{
60
73
  status: Exclude<string, "ok">;
61
74
  } | {
62
75
  status: "ok";
@@ -251,7 +264,7 @@ export declare const publicBookingsService: {
251
264
  createdAt: string;
252
265
  updatedAt: string;
253
266
  } | null>;
254
- updateSessionState(db: PostgresJsDatabase, bookingId: string, input: PublicUpsertBookingSessionStateInput): Promise<{
267
+ updateSessionState(db: PostgresJsDatabase, bookingId: string, input: PublicUpsertBookingSessionStateInput, resolvers?: PublicBookingsServiceResolvers): Promise<{
255
268
  status: "not_found";
256
269
  state?: undefined;
257
270
  } | {
@@ -267,7 +280,7 @@ export declare const publicBookingsService: {
267
280
  updatedAt: string;
268
281
  };
269
282
  }>;
270
- updateSession(db: PostgresJsDatabase, bookingId: string, input: PublicUpdateBookingSessionInput, userId?: string): Promise<{
283
+ updateSession(db: PostgresJsDatabase, bookingId: string, input: PublicUpdateBookingSessionInput, userId?: string, resolvers?: PublicBookingsServiceResolvers): Promise<{
271
284
  status: Exclude<string, "ok">;
272
285
  } | {
273
286
  status: "ok";
@@ -1 +1 @@
1
- {"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,47 @@ import { optionPriceRulesRef, optionUnitPriceRulesRef, optionUnitTiersRef, price
3
3
  import { optionUnitsRef, productOptionsRef, productsRef } from "./products-ref.js";
4
4
  import { bookingAllocations, bookingDocuments, bookingFulfillments, bookingItems, bookingItemTravelers, bookingSessionStates, bookings, bookingTravelers, } from "./schema.js";
5
5
  import { bookingsService } from "./service.js";
6
+ const BOOKING_PERSON_SOURCE = "storefront-booking";
7
+ async function safeResolveTravelerPerson(db, resolver, participant, bookingId) {
8
+ if (!resolver)
9
+ return null;
10
+ const contact = {
11
+ firstName: participant.firstName,
12
+ lastName: participant.lastName,
13
+ email: participant.email,
14
+ phone: participant.phone,
15
+ preferredLanguage: participant.preferredLanguage,
16
+ };
17
+ try {
18
+ return await resolver(db, contact, {
19
+ bookingId,
20
+ source: BOOKING_PERSON_SOURCE,
21
+ sourceRef: bookingId,
22
+ });
23
+ }
24
+ catch (error) {
25
+ // Person resolution is best-effort — a CRM hiccup must not block
26
+ // the actual booking. Log and fall back to `null` so the traveler
27
+ // row still lands without a person link.
28
+ console.error("[bookings] resolveTravelerPerson failed for booking", bookingId, error);
29
+ return null;
30
+ }
31
+ }
32
+ async function safeResolveBillingPerson(db, resolver, contact, bookingId) {
33
+ if (!resolver)
34
+ return null;
35
+ try {
36
+ return await resolver(db, contact, {
37
+ bookingId,
38
+ source: BOOKING_PERSON_SOURCE,
39
+ sourceRef: bookingId,
40
+ });
41
+ }
42
+ catch (error) {
43
+ console.error("[bookings] resolveBillingPerson failed for booking", bookingId, error);
44
+ return null;
45
+ }
46
+ }
6
47
  const travelerParticipantTypes = new Set(["traveler", "occupant"]);
7
48
  const WIZARD_STATE_KEY = "wizard";
8
49
  function normalizeDate(value) {
@@ -577,7 +618,7 @@ async function buildSessionSnapshot(db, bookingId) {
577
618
  };
578
619
  }
579
620
  export const publicBookingsService = {
580
- async createSession(db, input, userId) {
621
+ async createSession(db, input, userId, resolvers = {}) {
581
622
  const travelers = input.travelers ?? [];
582
623
  const travelerCount = countTravelerParticipants(travelers);
583
624
  const bookingNumber = await generateBookingNumber(db);
@@ -618,6 +659,13 @@ export const publicBookingsService = {
618
659
  return result;
619
660
  }
620
661
  for (const participant of travelers) {
662
+ const personId = await safeResolveTravelerPerson(db, resolvers.resolveTravelerPerson, {
663
+ firstName: participant.firstName,
664
+ lastName: participant.lastName,
665
+ email: participant.email ?? null,
666
+ phone: participant.phone ?? null,
667
+ preferredLanguage: participant.preferredLanguage ?? null,
668
+ }, result.booking.id);
621
669
  await bookingsService.createTravelerRecord(db, result.booking.id, {
622
670
  participantType: participant.participantType,
623
671
  travelerCategory: participant.travelerCategory ?? null,
@@ -629,7 +677,7 @@ export const publicBookingsService = {
629
677
  specialRequests: participant.specialRequests ?? null,
630
678
  isPrimary: participant.isPrimary,
631
679
  notes: participant.notes ?? null,
632
- personId: null,
680
+ personId,
633
681
  }, userId);
634
682
  }
635
683
  const session = await buildSessionSnapshot(db, result.booking.id);
@@ -645,7 +693,7 @@ export const publicBookingsService = {
645
693
  }
646
694
  return getWizardSessionState(db, bookingId);
647
695
  },
648
- async updateSessionState(db, bookingId, input) {
696
+ async updateSessionState(db, bookingId, input, resolvers = {}) {
649
697
  const booking = await bookingsService.getBookingById(db, bookingId);
650
698
  if (!booking) {
651
699
  return { status: "not_found" };
@@ -656,11 +704,27 @@ export const publicBookingsService = {
656
704
  }
657
705
  const bookingContact = extractBookingContactFromStatePayload(state.payload);
658
706
  if (bookingContact) {
659
- await bookingsService.updateBooking(db, bookingId, bookingContact);
707
+ // Resolve a CRM person from the billing snapshot when a resolver
708
+ // is wired — issue #961 calls out that storefront bookings used
709
+ // to land with `person_id = NULL`, leaving every customer outside
710
+ // the CRM until each operator wired their own bridge.
711
+ const personId = booking.personId
712
+ ? booking.personId
713
+ : await safeResolveBillingPerson(db, resolvers.resolveBillingPerson, {
714
+ firstName: bookingContact.contactFirstName,
715
+ lastName: bookingContact.contactLastName,
716
+ email: bookingContact.contactEmail,
717
+ phone: bookingContact.contactPhone,
718
+ preferredLanguage: null,
719
+ }, bookingId);
720
+ await bookingsService.updateBooking(db, bookingId, {
721
+ ...bookingContact,
722
+ ...(personId && booking.personId !== personId ? { personId } : {}),
723
+ });
660
724
  }
661
725
  return { status: "ok", state };
662
726
  },
663
- async updateSession(db, bookingId, input, userId) {
727
+ async updateSession(db, bookingId, input, userId, resolvers = {}) {
664
728
  const booking = await bookingsService.getBookingById(db, bookingId);
665
729
  if (!booking) {
666
730
  return { status: "not_found" };
@@ -703,6 +767,13 @@ export const publicBookingsService = {
703
767
  });
704
768
  continue;
705
769
  }
770
+ const personId = await safeResolveTravelerPerson(db, resolvers.resolveTravelerPerson, {
771
+ firstName: participant.firstName,
772
+ lastName: participant.lastName,
773
+ email: participant.email ?? null,
774
+ phone: participant.phone ?? null,
775
+ preferredLanguage: participant.preferredLanguage ?? null,
776
+ }, bookingId);
706
777
  await bookingsService.createTravelerRecord(db, bookingId, {
707
778
  participantType: participant.participantType,
708
779
  travelerCategory: participant.travelerCategory ?? null,
@@ -714,7 +785,7 @@ export const publicBookingsService = {
714
785
  specialRequests: participant.specialRequests ?? null,
715
786
  isPrimary: participant.isPrimary,
716
787
  notes: participant.notes ?? null,
717
- personId: null,
788
+ personId,
718
789
  }, userId);
719
790
  }
720
791
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/bookings",
3
- "version": "0.52.4",
3
+ "version": "0.53.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -79,15 +79,15 @@
79
79
  "drizzle-orm": "^0.45.2",
80
80
  "hono": "^4.12.10",
81
81
  "zod": "^4.3.6",
82
- "@voyantjs/action-ledger": "0.52.4",
83
- "@voyantjs/core": "0.52.4",
84
- "@voyantjs/db": "0.52.4",
85
- "@voyantjs/hono": "0.52.4",
86
- "@voyantjs/utils": "0.52.4"
82
+ "@voyantjs/action-ledger": "0.53.0",
83
+ "@voyantjs/core": "0.53.0",
84
+ "@voyantjs/db": "0.53.0",
85
+ "@voyantjs/hono": "0.53.0",
86
+ "@voyantjs/utils": "0.53.0"
87
87
  },
88
88
  "devDependencies": {
89
89
  "typescript": "^6.0.2",
90
- "@voyantjs/products": "0.52.4",
90
+ "@voyantjs/products": "0.53.0",
91
91
  "@voyantjs/voyant-typescript-config": "0.1.0"
92
92
  },
93
93
  "files": [