@voyantjs/storefront 0.49.0 → 0.50.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.
@@ -1,10 +1,10 @@
1
- import type { EventBus } from "@voyantjs/core";
1
+ import { type VoyantBindings, type VoyantVariables } from "@voyantjs/hono";
2
2
  import { type StorefrontServiceOptions } from "./service.js";
3
3
  type Env = {
4
+ Bindings: VoyantBindings;
4
5
  Variables: {
5
- db: unknown;
6
- eventBus?: EventBus;
7
- };
6
+ userId?: string;
7
+ } & VoyantVariables;
8
8
  };
9
9
  export declare function createStorefrontPublicRoutes(options?: StorefrontServiceOptions): import("hono/hono-base").HonoBase<Env, {
10
10
  "/settings": {
@@ -14,17 +14,30 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
14
14
  data: {
15
15
  branding: {
16
16
  logoUrl: string | null;
17
+ faviconUrl: string | null;
18
+ brandMarkUrl: string | null;
19
+ primaryColor: string | null;
20
+ accentColor: string | null;
17
21
  supportedLanguages: string[];
18
22
  };
19
23
  support: {
20
24
  email: string | null;
21
25
  phone: string | null;
26
+ links: {
27
+ label: string;
28
+ url: string;
29
+ }[];
22
30
  };
23
31
  legal: {
24
32
  termsUrl: string | null;
25
33
  privacyUrl: string | null;
34
+ cancellationUrl: string | null;
26
35
  defaultContractTemplateId: string | null;
27
36
  };
37
+ localization: {
38
+ defaultLocale: string | null;
39
+ currencyDisplay: "symbol" | "name" | "code";
40
+ };
28
41
  forms: {
29
42
  billing: {
30
43
  fields: {
@@ -58,13 +71,39 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
58
71
  };
59
72
  };
60
73
  payment: {
61
- defaultMethod: "voucher" | "bank_transfer" | "card" | "cash" | "invoice" | null;
74
+ defaultMethod: "voucher" | "bank_transfer" | "cash" | "invoice" | "card" | null;
62
75
  methods: {
63
- code: "voucher" | "bank_transfer" | "card" | "cash" | "invoice";
76
+ code: "voucher" | "bank_transfer" | "cash" | "invoice" | "card";
64
77
  label: string;
65
78
  description: string | null;
66
79
  enabled: boolean;
67
80
  }[];
81
+ structure: "split" | "full";
82
+ schedule: {
83
+ percent: number;
84
+ dueInDays: number;
85
+ dueCondition: "after_booking" | "before_departure";
86
+ }[];
87
+ defaultSchedule: {
88
+ depositPercent: number | null;
89
+ balanceDueDaysBeforeDeparture: number | null;
90
+ } | null;
91
+ bankTransfer: {
92
+ dueDays: number | null;
93
+ account: {
94
+ provider: string | null;
95
+ currency: string | null;
96
+ iban: string;
97
+ beneficiary: string;
98
+ bank: string;
99
+ } | null;
100
+ accountHolder: string | null;
101
+ bankName: string | null;
102
+ iban: string | null;
103
+ bic: string | null;
104
+ paymentReference: string | null;
105
+ instructions: string | null;
106
+ } | null;
68
107
  };
69
108
  };
70
109
  };
@@ -88,7 +127,7 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
88
127
  id: string;
89
128
  personId: string;
90
129
  kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
91
- source: "admin" | "form" | "phone" | "website" | "booking" | "abandoned_cart";
130
+ source: "admin" | "form" | "phone" | "booking" | "website" | "abandoned_cart";
92
131
  status: "expired" | "converted" | "lost" | "new" | "contacted" | "qualified";
93
132
  duplicate: boolean;
94
133
  };
@@ -113,10 +152,10 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
113
152
  id: string;
114
153
  personId: string;
115
154
  kind: "wishlist" | "notify" | "inquiry" | "request_offer" | "referral";
116
- source: "admin" | "form" | "phone" | "website" | "booking" | "abandoned_cart";
155
+ source: "admin" | "form" | "phone" | "booking" | "website" | "abandoned_cart";
117
156
  status: "expired" | "converted" | "lost" | "new" | "contacted" | "qualified";
118
157
  duplicate: boolean;
119
- doubleOptIn: "not_configured" | "requested";
158
+ doubleOptIn: "requested" | "not_configured";
120
159
  };
121
160
  };
122
161
  outputFormat: "json";
@@ -279,6 +318,272 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
279
318
  quantity: number;
280
319
  unitPrice: number;
281
320
  }[];
321
+ allocation: {
322
+ slot: {
323
+ id: string;
324
+ productId: string;
325
+ optionId: string | null;
326
+ dateLocal: string | null;
327
+ startAt: string | null;
328
+ endAt: string | null;
329
+ timezone: string;
330
+ status: "cancelled" | "open" | "closed" | "sold_out" | "on_request";
331
+ availabilityState: "cancelled" | "closed" | "sold_out" | "past_cutoff" | "too_early" | "on_request" | "unavailable" | "available";
332
+ capacity: number | null;
333
+ remaining: number | null;
334
+ pastCutoff: boolean;
335
+ tooEarly: boolean;
336
+ };
337
+ pax: {
338
+ adults: number;
339
+ children: number;
340
+ infants: number;
341
+ total: number;
342
+ };
343
+ requestedUnits: {
344
+ unitId: string | null;
345
+ requestRef: string | null;
346
+ name: string;
347
+ unitType: string | null;
348
+ quantity: number;
349
+ pricingMode: string | null;
350
+ unitPrice: number;
351
+ total: number;
352
+ currencyCode: string;
353
+ tierId: string | null;
354
+ }[];
355
+ rooms: {
356
+ unitId: string;
357
+ name: string;
358
+ occupancy: number;
359
+ quantity: number;
360
+ pax: number;
361
+ pricingMode: string | null;
362
+ unitPrice: number;
363
+ total: number;
364
+ currencyCode: string;
365
+ tierId: string | null;
366
+ }[];
367
+ };
368
+ units: {
369
+ unitId: string | null;
370
+ requestRef: string | null;
371
+ name: string;
372
+ unitType: string | null;
373
+ quantity: number;
374
+ pricingMode: string | null;
375
+ unitPrice: number;
376
+ total: number;
377
+ currencyCode: string;
378
+ tierId: string | null;
379
+ }[];
380
+ rooms: {
381
+ unitId: string;
382
+ name: string;
383
+ occupancy: number;
384
+ quantity: number;
385
+ pax: number;
386
+ pricingMode: string | null;
387
+ unitPrice: number;
388
+ total: number;
389
+ currencyCode: string;
390
+ tierId: string | null;
391
+ }[];
392
+ extras: {
393
+ extraId: string;
394
+ name: string;
395
+ required: boolean;
396
+ selectable: boolean;
397
+ selected: boolean;
398
+ pricingMode: string;
399
+ quantity: number;
400
+ unitPrice: number;
401
+ total: number;
402
+ currencyCode: string;
403
+ }[];
404
+ offers: {
405
+ available: {
406
+ offer: {
407
+ id: string;
408
+ name: string;
409
+ slug: string | null;
410
+ description: string | null;
411
+ discountType: "percentage" | "fixed_amount";
412
+ discountValue: string;
413
+ currency: string | null;
414
+ applicableProductIds: string[];
415
+ applicableDepartureIds: string[];
416
+ validFrom: string | null;
417
+ validTo: string | null;
418
+ minTravelers: number | null;
419
+ imageMobileUrl: string | null;
420
+ imageDesktopUrl: string | null;
421
+ stackable: boolean;
422
+ createdAt: string;
423
+ updatedAt: string;
424
+ };
425
+ status: string;
426
+ reason: string | null;
427
+ selected: boolean;
428
+ discountAppliedCents: number;
429
+ discountedPriceCents: number;
430
+ }[];
431
+ requested: ({
432
+ kind: "slug";
433
+ value: string;
434
+ result: {
435
+ status: "applied" | "not_applicable" | "conflict" | "invalid";
436
+ reason: "scope" | "currency" | "booking_mismatch" | "conflict" | "min_pax" | "no_discount" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "session_mismatch" | null;
437
+ offer: {
438
+ id: string;
439
+ name: string;
440
+ slug: string | null;
441
+ description: string | null;
442
+ discountType: "percentage" | "fixed_amount";
443
+ discountValue: string;
444
+ currency: string | null;
445
+ applicableProductIds: string[];
446
+ applicableDepartureIds: string[];
447
+ validFrom: string | null;
448
+ validTo: string | null;
449
+ minTravelers: number | null;
450
+ imageMobileUrl: string | null;
451
+ imageDesktopUrl: string | null;
452
+ stackable: boolean;
453
+ createdAt: string;
454
+ updatedAt: string;
455
+ } | null;
456
+ target: {
457
+ bookingId: string | null;
458
+ sessionId: string | null;
459
+ productId: string;
460
+ departureId: string | null;
461
+ };
462
+ pricing: {
463
+ basePriceCents: number;
464
+ currency: string;
465
+ discountAppliedCents: number;
466
+ discountedPriceCents: number;
467
+ };
468
+ appliedOffers: {
469
+ offerId: string;
470
+ offerName: string;
471
+ discountAppliedCents: number;
472
+ discountedPriceCents: number;
473
+ currency: string;
474
+ discountKind: "percentage" | "fixed_amount";
475
+ discountPercent: number | null;
476
+ discountAmountCents: number | null;
477
+ appliedCode: string | null;
478
+ stackable: boolean;
479
+ }[];
480
+ conflict: {
481
+ policy: "best_discount_wins" | "stackable_compose";
482
+ autoAppliedOfferIds: string[];
483
+ manualOfferId: string | null;
484
+ selectedOfferIds: string[];
485
+ message: string;
486
+ } | null;
487
+ } | null;
488
+ } | {
489
+ kind: "code";
490
+ value: string;
491
+ result: {
492
+ status: "applied" | "not_applicable" | "conflict" | "invalid";
493
+ reason: "scope" | "currency" | "booking_mismatch" | "conflict" | "min_pax" | "no_discount" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "session_mismatch" | null;
494
+ offer: {
495
+ id: string;
496
+ name: string;
497
+ slug: string | null;
498
+ description: string | null;
499
+ discountType: "percentage" | "fixed_amount";
500
+ discountValue: string;
501
+ currency: string | null;
502
+ applicableProductIds: string[];
503
+ applicableDepartureIds: string[];
504
+ validFrom: string | null;
505
+ validTo: string | null;
506
+ minTravelers: number | null;
507
+ imageMobileUrl: string | null;
508
+ imageDesktopUrl: string | null;
509
+ stackable: boolean;
510
+ createdAt: string;
511
+ updatedAt: string;
512
+ } | null;
513
+ target: {
514
+ bookingId: string | null;
515
+ sessionId: string | null;
516
+ productId: string;
517
+ departureId: string | null;
518
+ };
519
+ pricing: {
520
+ basePriceCents: number;
521
+ currency: string;
522
+ discountAppliedCents: number;
523
+ discountedPriceCents: number;
524
+ };
525
+ appliedOffers: {
526
+ offerId: string;
527
+ offerName: string;
528
+ discountAppliedCents: number;
529
+ discountedPriceCents: number;
530
+ currency: string;
531
+ discountKind: "percentage" | "fixed_amount";
532
+ discountPercent: number | null;
533
+ discountAmountCents: number | null;
534
+ appliedCode: string | null;
535
+ stackable: boolean;
536
+ }[];
537
+ conflict: {
538
+ policy: "best_discount_wins" | "stackable_compose";
539
+ autoAppliedOfferIds: string[];
540
+ manualOfferId: string | null;
541
+ selectedOfferIds: string[];
542
+ message: string;
543
+ } | null;
544
+ } | null;
545
+ })[];
546
+ applied: {
547
+ offerId: string;
548
+ offerName: string;
549
+ discountAppliedCents: number;
550
+ discountedPriceCents: number;
551
+ currency: string;
552
+ discountKind: "percentage" | "fixed_amount";
553
+ discountPercent: number | null;
554
+ discountAmountCents: number | null;
555
+ appliedCode: string | null;
556
+ stackable: boolean;
557
+ }[];
558
+ conflict: {
559
+ policy: "best_discount_wins" | "stackable_compose";
560
+ autoAppliedOfferIds: string[];
561
+ manualOfferId: string | null;
562
+ selectedOfferIds: string[];
563
+ message: string;
564
+ } | {
565
+ policy: string;
566
+ autoAppliedOfferIds: string[];
567
+ manualOfferId: null;
568
+ selectedOfferIds: string[];
569
+ message: string;
570
+ } | null;
571
+ discountTotal: number;
572
+ discountTotalCents: number;
573
+ totalAfterDiscount: number;
574
+ currencyCode: string;
575
+ };
576
+ totals: {
577
+ currencyCode: string;
578
+ base: number;
579
+ extras: number;
580
+ subtotal: number;
581
+ discount: number;
582
+ tax: number;
583
+ total: number;
584
+ perPerson: number;
585
+ perBooking: number;
586
+ };
282
587
  };
283
588
  };
284
589
  outputFormat: "json";
@@ -296,6 +601,250 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
296
601
  status: 404;
297
602
  };
298
603
  };
604
+ } & {
605
+ "/bookings/sessions/bootstrap": {
606
+ $post: {
607
+ input: {};
608
+ output: {
609
+ error: string;
610
+ };
611
+ outputFormat: "json";
612
+ status: 404;
613
+ } | {
614
+ input: {};
615
+ output: {
616
+ data?: {
617
+ repricing: {
618
+ originalQuote: {
619
+ currencyCode: string;
620
+ totalSellAmountCents: number;
621
+ quotedAt?: string | null | undefined;
622
+ expiresAt?: string | null | undefined;
623
+ };
624
+ current: {
625
+ sessionId: string;
626
+ catalogId: string | null;
627
+ currencyCode: string;
628
+ totalSellAmountCents: number;
629
+ items: {
630
+ inputIndex: number;
631
+ itemId: string;
632
+ title: string;
633
+ productId: string | null;
634
+ optionId: string | null;
635
+ optionUnitId: string | null;
636
+ optionUnitName: string | null;
637
+ optionUnitType: string | null;
638
+ pricingCategoryId: string | null;
639
+ quantity: number;
640
+ pricingMode: string;
641
+ unitSellAmountCents: number | null;
642
+ totalSellAmountCents: number | null;
643
+ warnings: string[];
644
+ }[];
645
+ warnings: never[];
646
+ appliedToSession: boolean;
647
+ };
648
+ deltaAmountCents: number;
649
+ staleQuote: boolean;
650
+ };
651
+ } | undefined;
652
+ error: string;
653
+ };
654
+ outputFormat: "json";
655
+ status: 400 | 409;
656
+ } | {
657
+ input: {};
658
+ output: {
659
+ error: string;
660
+ };
661
+ outputFormat: "json";
662
+ status: 409;
663
+ } | {
664
+ input: {};
665
+ output: {
666
+ data: {
667
+ session: {
668
+ sessionId: string;
669
+ bookingNumber: string;
670
+ status: "completed" | "cancelled" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress" | "expired";
671
+ externalBookingRef: string | null;
672
+ communicationLanguage: string | null;
673
+ sellCurrency: string;
674
+ sellAmountCents: number | null;
675
+ startDate: string | null;
676
+ endDate: string | null;
677
+ pax: number | null;
678
+ holdExpiresAt: string | null;
679
+ confirmedAt: string | null;
680
+ expiredAt: string | null;
681
+ cancelledAt: string | null;
682
+ completedAt: string | null;
683
+ travelers: {
684
+ id: string;
685
+ participantType: "other" | "traveler" | "occupant";
686
+ travelerCategory: "child" | "other" | "adult" | "infant" | "senior" | null;
687
+ firstName: string;
688
+ lastName: string;
689
+ email: string | null;
690
+ phone: string | null;
691
+ preferredLanguage: string | null;
692
+ specialRequests: string | null;
693
+ isPrimary: boolean;
694
+ notes: string | null;
695
+ }[];
696
+ items: {
697
+ id: string;
698
+ title: string;
699
+ description: string | null;
700
+ itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
701
+ status: "cancelled" | "draft" | "on_hold" | "confirmed" | "expired" | "fulfilled";
702
+ serviceDate: string | null;
703
+ startsAt: string | null;
704
+ endsAt: string | null;
705
+ quantity: number;
706
+ sellCurrency: string;
707
+ unitSellAmountCents: number | null;
708
+ totalSellAmountCents: number | null;
709
+ costCurrency: string | null;
710
+ unitCostAmountCents: number | null;
711
+ totalCostAmountCents: number | null;
712
+ notes: string | null;
713
+ productId: string | null;
714
+ optionId: string | null;
715
+ optionUnitId: string | null;
716
+ pricingCategoryId: string | null;
717
+ travelerLinks: {
718
+ id: string;
719
+ travelerId: string;
720
+ role: string;
721
+ isPrimary: boolean;
722
+ }[];
723
+ }[];
724
+ allocations: {
725
+ id: string;
726
+ bookingItemId: string;
727
+ productId: string | null;
728
+ optionId: string | null;
729
+ optionUnitId: string | null;
730
+ pricingCategoryId: string | null;
731
+ availabilitySlotId: string | null;
732
+ quantity: number;
733
+ allocationType: "resource" | "pickup" | "unit";
734
+ status: "cancelled" | "confirmed" | "expired" | "fulfilled" | "held" | "released";
735
+ holdExpiresAt: string | null;
736
+ confirmedAt: string | null;
737
+ releasedAt: string | null;
738
+ }[];
739
+ checklist: {
740
+ hasTravelers: boolean;
741
+ hasPrimaryTraveler: boolean;
742
+ hasItems: boolean;
743
+ hasAllocations: boolean;
744
+ readyForConfirmation: boolean;
745
+ };
746
+ state: {
747
+ sessionId: string;
748
+ stateKey: "wizard";
749
+ currentStep: string | null;
750
+ completedSteps: string[];
751
+ payload: {
752
+ [x: string]: import("hono/utils/types").JSONValue;
753
+ };
754
+ version: number;
755
+ createdAt: string;
756
+ updatedAt: string;
757
+ } | null;
758
+ checkoutCapability: {
759
+ token: string;
760
+ expiresAt: string;
761
+ actions: ("session:read" | "session:update" | "session:reprice" | "session:finalize" | "payment:read" | "payment:start")[];
762
+ };
763
+ };
764
+ paymentPlan: {
765
+ source: "storefront_default";
766
+ depositKind: import("@voyantjs/finance").DepositKind;
767
+ depositPercent: number | null;
768
+ depositAmountCents: number | null;
769
+ requiresFullPayment: boolean;
770
+ };
771
+ paymentSchedule: {
772
+ id: string;
773
+ scheduleType: "other" | "deposit" | "installment" | "balance" | "hold";
774
+ status: "pending" | "cancelled" | "expired" | "paid" | "due" | "waived";
775
+ dueDate: string;
776
+ currency: string;
777
+ amountCents: number;
778
+ notes: string | null;
779
+ }[];
780
+ repricing: {
781
+ originalQuote: {
782
+ currencyCode: string;
783
+ totalSellAmountCents: number;
784
+ quotedAt?: string | null | undefined;
785
+ expiresAt?: string | null | undefined;
786
+ };
787
+ current: {
788
+ sessionId: string;
789
+ items: {
790
+ itemId: string;
791
+ title: string;
792
+ productId: string | null;
793
+ optionId: string | null;
794
+ optionUnitId: string | null;
795
+ optionUnitName: string | null;
796
+ optionUnitType: string | null;
797
+ pricingCategoryId: string | null;
798
+ quantity: number;
799
+ pricingMode: string;
800
+ unitSellAmountCents: number | null;
801
+ totalSellAmountCents: number | null;
802
+ warnings: string[];
803
+ }[];
804
+ catalogId: string | null;
805
+ currencyCode: string;
806
+ totalSellAmountCents: number;
807
+ warnings: never[];
808
+ appliedToSession: boolean;
809
+ };
810
+ deltaAmountCents: number;
811
+ staleQuote: boolean;
812
+ };
813
+ availability: {
814
+ departureId: string;
815
+ slotId: string;
816
+ productId: string;
817
+ optionId: string | null;
818
+ dateLocal: string;
819
+ startsAt: string | null;
820
+ endsAt: string | null;
821
+ timezone: string;
822
+ status: "cancelled" | "open" | "closed" | "sold_out";
823
+ capacity: number | null;
824
+ remaining: number | null;
825
+ };
826
+ allocation: {
827
+ id: string;
828
+ bookingItemId: string;
829
+ productId: string | null;
830
+ optionId: string | null;
831
+ optionUnitId: string | null;
832
+ pricingCategoryId: string | null;
833
+ availabilitySlotId: string | null;
834
+ quantity: number;
835
+ allocationType: "resource" | "pickup" | "unit";
836
+ status: "cancelled" | "confirmed" | "expired" | "fulfilled" | "held" | "released";
837
+ holdExpiresAt: string | null;
838
+ confirmedAt: string | null;
839
+ releasedAt: string | null;
840
+ }[];
841
+ currency: string;
842
+ };
843
+ };
844
+ outputFormat: "json";
845
+ status: 201;
846
+ };
847
+ };
299
848
  } & {
300
849
  "/departures/:departureId/eligibility": {
301
850
  $post: {
@@ -491,7 +1040,7 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
491
1040
  output: {
492
1041
  data: {
493
1042
  productId: string;
494
- availabilityState: "cancelled" | "closed" | "sold_out" | "past_cutoff" | "too_early" | "unavailable" | "on_request" | "available";
1043
+ availabilityState: "cancelled" | "closed" | "sold_out" | "past_cutoff" | "too_early" | "on_request" | "unavailable" | "available";
495
1044
  counts: {
496
1045
  total: number;
497
1046
  open: number;
@@ -512,7 +1061,7 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
512
1061
  endAt: string | null;
513
1062
  timezone: string;
514
1063
  status: "cancelled" | "open" | "closed" | "sold_out" | "on_request";
515
- availabilityState: "cancelled" | "closed" | "sold_out" | "past_cutoff" | "too_early" | "unavailable" | "on_request" | "available";
1064
+ availabilityState: "cancelled" | "closed" | "sold_out" | "past_cutoff" | "too_early" | "on_request" | "unavailable" | "available";
516
1065
  capacity: number | null;
517
1066
  remaining: number | null;
518
1067
  pastCutoff: boolean;
@@ -660,8 +1209,8 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
660
1209
  };
661
1210
  output: {
662
1211
  data: {
663
- status: "not_applicable" | "applied" | "invalid" | "conflict";
664
- reason: "scope" | "currency" | "min_pax" | "conflict" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "no_discount" | "booking_mismatch" | "session_mismatch" | null;
1212
+ status: "applied" | "not_applicable" | "conflict" | "invalid";
1213
+ reason: "scope" | "currency" | "booking_mismatch" | "conflict" | "min_pax" | "no_discount" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "session_mismatch" | null;
665
1214
  offer: {
666
1215
  id: string;
667
1216
  name: string;
@@ -735,8 +1284,8 @@ export declare function createStorefrontPublicRoutes(options?: StorefrontService
735
1284
  input: {};
736
1285
  output: {
737
1286
  data: {
738
- status: "not_applicable" | "applied" | "invalid" | "conflict";
739
- reason: "scope" | "currency" | "min_pax" | "conflict" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "no_discount" | "booking_mismatch" | "session_mismatch" | null;
1287
+ status: "applied" | "not_applicable" | "conflict" | "invalid";
1288
+ reason: "scope" | "currency" | "booking_mismatch" | "conflict" | "min_pax" | "no_discount" | "offer_not_found" | "offer_expired" | "offer_not_yet_valid" | "code_not_found" | "code_required" | "code_expired" | "code_not_yet_valid" | "session_mismatch" | null;
740
1289
  offer: {
741
1290
  id: string;
742
1291
  name: string;