@voyant-travel/commerce 0.1.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.
Files changed (210) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +145 -0
  3. package/dist/accepted-quote-version-reservation-golden-flow.test.d.ts +2 -0
  4. package/dist/accepted-quote-version-reservation-golden-flow.test.d.ts.map +1 -0
  5. package/dist/accepted-quote-version-reservation-golden-flow.test.js +398 -0
  6. package/dist/index.d.ts +15 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +14 -0
  9. package/dist/interface.d.ts +18 -0
  10. package/dist/interface.d.ts.map +1 -0
  11. package/dist/interface.js +246 -0
  12. package/dist/interface.test.d.ts +2 -0
  13. package/dist/interface.test.d.ts.map +1 -0
  14. package/dist/interface.test.js +357 -0
  15. package/dist/markets/index.d.ts +11 -0
  16. package/dist/markets/index.d.ts.map +1 -0
  17. package/dist/markets/index.js +12 -0
  18. package/dist/markets/routes.d.ts +1182 -0
  19. package/dist/markets/routes.d.ts.map +1 -0
  20. package/dist/markets/routes.js +209 -0
  21. package/dist/markets/schema.d.ts +1527 -0
  22. package/dist/markets/schema.d.ts.map +1 -0
  23. package/dist/markets/schema.js +240 -0
  24. package/dist/markets/service-core.d.ts +253 -0
  25. package/dist/markets/service-core.d.ts.map +1 -0
  26. package/dist/markets/service-core.js +242 -0
  27. package/dist/markets/service-rules.d.ts +191 -0
  28. package/dist/markets/service-rules.d.ts.map +1 -0
  29. package/dist/markets/service-rules.js +155 -0
  30. package/dist/markets/service-shared.d.ts +36 -0
  31. package/dist/markets/service-shared.d.ts.map +1 -0
  32. package/dist/markets/service-shared.js +7 -0
  33. package/dist/markets/service.d.ts +43 -0
  34. package/dist/markets/service.d.ts.map +1 -0
  35. package/dist/markets/service.js +42 -0
  36. package/dist/markets/validation.d.ts +451 -0
  37. package/dist/markets/validation.d.ts.map +1 -0
  38. package/dist/markets/validation.js +160 -0
  39. package/dist/pricing/events.d.ts +53 -0
  40. package/dist/pricing/events.d.ts.map +1 -0
  41. package/dist/pricing/events.js +28 -0
  42. package/dist/pricing/index.d.ts +15 -0
  43. package/dist/pricing/index.d.ts.map +1 -0
  44. package/dist/pricing/index.js +18 -0
  45. package/dist/pricing/routes-core.d.ts +981 -0
  46. package/dist/pricing/routes-core.d.ts.map +1 -0
  47. package/dist/pricing/routes-core.js +102 -0
  48. package/dist/pricing/routes-public.d.ts +136 -0
  49. package/dist/pricing/routes-public.d.ts.map +1 -0
  50. package/dist/pricing/routes-public.js +14 -0
  51. package/dist/pricing/routes-rules.d.ts +1339 -0
  52. package/dist/pricing/routes-rules.d.ts.map +1 -0
  53. package/dist/pricing/routes-rules.js +138 -0
  54. package/dist/pricing/routes-shared.d.ts +14 -0
  55. package/dist/pricing/routes-shared.d.ts.map +1 -0
  56. package/dist/pricing/routes-shared.js +3 -0
  57. package/dist/pricing/routes.d.ts +7 -0
  58. package/dist/pricing/routes.d.ts.map +1 -0
  59. package/dist/pricing/routes.js +6 -0
  60. package/dist/pricing/schema-catalogs.d.ts +467 -0
  61. package/dist/pricing/schema-catalogs.d.ts.map +1 -0
  62. package/dist/pricing/schema-catalogs.js +47 -0
  63. package/dist/pricing/schema-categories.d.ts +497 -0
  64. package/dist/pricing/schema-categories.d.ts.map +1 -0
  65. package/dist/pricing/schema-categories.js +54 -0
  66. package/dist/pricing/schema-departure-overrides.d.ts +228 -0
  67. package/dist/pricing/schema-departure-overrides.d.ts.map +1 -0
  68. package/dist/pricing/schema-departure-overrides.js +36 -0
  69. package/dist/pricing/schema-option-rules.d.ts +1770 -0
  70. package/dist/pricing/schema-option-rules.d.ts.map +1 -0
  71. package/dist/pricing/schema-option-rules.js +181 -0
  72. package/dist/pricing/schema-policies.d.ts +395 -0
  73. package/dist/pricing/schema-policies.d.ts.map +1 -0
  74. package/dist/pricing/schema-policies.js +41 -0
  75. package/dist/pricing/schema-relations.d.ts +59 -0
  76. package/dist/pricing/schema-relations.d.ts.map +1 -0
  77. package/dist/pricing/schema-relations.js +111 -0
  78. package/dist/pricing/schema-shared.d.ts +11 -0
  79. package/dist/pricing/schema-shared.d.ts.map +1 -0
  80. package/dist/pricing/schema-shared.js +67 -0
  81. package/dist/pricing/schema.d.ts +8 -0
  82. package/dist/pricing/schema.d.ts.map +1 -0
  83. package/dist/pricing/schema.js +7 -0
  84. package/dist/pricing/service-catalog-plane-pricing.d.ts +95 -0
  85. package/dist/pricing/service-catalog-plane-pricing.d.ts.map +1 -0
  86. package/dist/pricing/service-catalog-plane-pricing.js +382 -0
  87. package/dist/pricing/service-catalogs.d.ts +139 -0
  88. package/dist/pricing/service-catalogs.d.ts.map +1 -0
  89. package/dist/pricing/service-catalogs.js +89 -0
  90. package/dist/pricing/service-categories.d.ts +147 -0
  91. package/dist/pricing/service-categories.d.ts.map +1 -0
  92. package/dist/pricing/service-categories.js +105 -0
  93. package/dist/pricing/service-departure-overrides.d.ts +67 -0
  94. package/dist/pricing/service-departure-overrides.d.ts.map +1 -0
  95. package/dist/pricing/service-departure-overrides.js +54 -0
  96. package/dist/pricing/service-option-rules.d.ts +321 -0
  97. package/dist/pricing/service-option-rules.d.ts.map +1 -0
  98. package/dist/pricing/service-option-rules.js +340 -0
  99. package/dist/pricing/service-policies.d.ts +123 -0
  100. package/dist/pricing/service-policies.d.ts.map +1 -0
  101. package/dist/pricing/service-policies.js +95 -0
  102. package/dist/pricing/service-public.d.ts +89 -0
  103. package/dist/pricing/service-public.d.ts.map +1 -0
  104. package/dist/pricing/service-public.js +473 -0
  105. package/dist/pricing/service-rule-resolver.d.ts +67 -0
  106. package/dist/pricing/service-rule-resolver.d.ts.map +1 -0
  107. package/dist/pricing/service-rule-resolver.js +204 -0
  108. package/dist/pricing/service-shared.d.ts +53 -0
  109. package/dist/pricing/service-shared.d.ts.map +1 -0
  110. package/dist/pricing/service-shared.js +4 -0
  111. package/dist/pricing/service-transfer-rules.d.ts +211 -0
  112. package/dist/pricing/service-transfer-rules.d.ts.map +1 -0
  113. package/dist/pricing/service-transfer-rules.js +139 -0
  114. package/dist/pricing/service.d.ts +79 -0
  115. package/dist/pricing/service.d.ts.map +1 -0
  116. package/dist/pricing/service.js +78 -0
  117. package/dist/pricing/validation-public.d.ts +412 -0
  118. package/dist/pricing/validation-public.d.ts.map +1 -0
  119. package/dist/pricing/validation-public.js +111 -0
  120. package/dist/pricing/validation-shared.d.ts +71 -0
  121. package/dist/pricing/validation-shared.d.ts.map +1 -0
  122. package/dist/pricing/validation-shared.js +63 -0
  123. package/dist/pricing/validation.d.ts +987 -0
  124. package/dist/pricing/validation.d.ts.map +1 -0
  125. package/dist/pricing/validation.js +307 -0
  126. package/dist/promotions/events.d.ts +38 -0
  127. package/dist/promotions/events.d.ts.map +1 -0
  128. package/dist/promotions/events.js +25 -0
  129. package/dist/promotions/index.d.ts +12 -0
  130. package/dist/promotions/index.d.ts.map +1 -0
  131. package/dist/promotions/index.js +17 -0
  132. package/dist/promotions/routes-shared.d.ts +14 -0
  133. package/dist/promotions/routes-shared.d.ts.map +1 -0
  134. package/dist/promotions/routes-shared.js +3 -0
  135. package/dist/promotions/routes.d.ts +395 -0
  136. package/dist/promotions/routes.d.ts.map +1 -0
  137. package/dist/promotions/routes.js +55 -0
  138. package/dist/promotions/schema.d.ts +675 -0
  139. package/dist/promotions/schema.d.ts.map +1 -0
  140. package/dist/promotions/schema.js +126 -0
  141. package/dist/promotions/service-booking-confirmed.d.ts +77 -0
  142. package/dist/promotions/service-booking-confirmed.d.ts.map +1 -0
  143. package/dist/promotions/service-booking-confirmed.js +134 -0
  144. package/dist/promotions/service-boundary-scheduler.d.ts +85 -0
  145. package/dist/promotions/service-boundary-scheduler.d.ts.map +1 -0
  146. package/dist/promotions/service-boundary-scheduler.js +141 -0
  147. package/dist/promotions/service-catalog-evaluator.d.ts +22 -0
  148. package/dist/promotions/service-catalog-evaluator.d.ts.map +1 -0
  149. package/dist/promotions/service-catalog-evaluator.js +33 -0
  150. package/dist/promotions/service-catalog-plane-promotions.d.ts +73 -0
  151. package/dist/promotions/service-catalog-plane-promotions.d.ts.map +1 -0
  152. package/dist/promotions/service-catalog-plane-promotions.js +118 -0
  153. package/dist/promotions/service-evaluator.d.ts +134 -0
  154. package/dist/promotions/service-evaluator.d.ts.map +1 -0
  155. package/dist/promotions/service-evaluator.js +302 -0
  156. package/dist/promotions/service-storefront.d.ts +147 -0
  157. package/dist/promotions/service-storefront.d.ts.map +1 -0
  158. package/dist/promotions/service-storefront.js +326 -0
  159. package/dist/promotions/service.d.ts +143 -0
  160. package/dist/promotions/service.d.ts.map +1 -0
  161. package/dist/promotions/service.js +359 -0
  162. package/dist/promotions/validation.d.ts +195 -0
  163. package/dist/promotions/validation.d.ts.map +1 -0
  164. package/dist/promotions/validation.js +167 -0
  165. package/dist/promotions/workflow-bulk-reindex.d.ts +36 -0
  166. package/dist/promotions/workflow-bulk-reindex.d.ts.map +1 -0
  167. package/dist/promotions/workflow-bulk-reindex.js +53 -0
  168. package/dist/promotions/workflow-runtime.d.ts +17 -0
  169. package/dist/promotions/workflow-runtime.d.ts.map +1 -0
  170. package/dist/promotions/workflow-runtime.js +9 -0
  171. package/dist/runtime.d.ts +18 -0
  172. package/dist/runtime.d.ts.map +1 -0
  173. package/dist/runtime.js +27 -0
  174. package/dist/runtime.test.d.ts +2 -0
  175. package/dist/runtime.test.d.ts.map +1 -0
  176. package/dist/runtime.test.js +25 -0
  177. package/dist/schema.d.ts +5 -0
  178. package/dist/schema.d.ts.map +1 -0
  179. package/dist/schema.js +4 -0
  180. package/dist/sellability/index.d.ts +13 -0
  181. package/dist/sellability/index.d.ts.map +1 -0
  182. package/dist/sellability/index.js +17 -0
  183. package/dist/sellability/routes.d.ts +2332 -0
  184. package/dist/sellability/routes.d.ts.map +1 -0
  185. package/dist/sellability/routes.js +166 -0
  186. package/dist/sellability/schema.d.ts +1716 -0
  187. package/dist/sellability/schema.d.ts.map +1 -0
  188. package/dist/sellability/schema.js +278 -0
  189. package/dist/sellability/service-records.d.ts +316 -0
  190. package/dist/sellability/service-records.d.ts.map +1 -0
  191. package/dist/sellability/service-records.js +253 -0
  192. package/dist/sellability/service-resolve.d.ts +72 -0
  193. package/dist/sellability/service-resolve.d.ts.map +1 -0
  194. package/dist/sellability/service-resolve.js +580 -0
  195. package/dist/sellability/service-shared.d.ts +124 -0
  196. package/dist/sellability/service-shared.d.ts.map +1 -0
  197. package/dist/sellability/service-shared.js +96 -0
  198. package/dist/sellability/service-snapshots.d.ts +191 -0
  199. package/dist/sellability/service-snapshots.d.ts.map +1 -0
  200. package/dist/sellability/service-snapshots.js +153 -0
  201. package/dist/sellability/service.d.ts +1038 -0
  202. package/dist/sellability/service.d.ts.map +1 -0
  203. package/dist/sellability/service.js +17 -0
  204. package/dist/sellability/validation.d.ts +477 -0
  205. package/dist/sellability/validation.d.ts.map +1 -0
  206. package/dist/sellability/validation.js +192 -0
  207. package/dist/types.d.ts +239 -0
  208. package/dist/types.d.ts.map +1 -0
  209. package/dist/types.js +1 -0
  210. package/package.json +62 -0
@@ -0,0 +1,675 @@
1
+ /**
2
+ * Promotional offers schema — three tables backing the promotions module.
3
+ *
4
+ * Per docs/architecture/promotions-architecture.md §4:
5
+ * - `promotional_offers` (root): the offer header (name, discount type/value,
6
+ * scope JSONB, conditions JSONB, validity window, optional code).
7
+ * - `promotional_offer_products` (link): denormalized materialization of the
8
+ * offer's product set for the product-shaped scopes (`products`,
9
+ * `categories`, `destinations`). Slice-shaped scopes (`global`, `markets`,
10
+ * `audiences`) leave this table empty for that offer.
11
+ * - `promotional_offer_redemptions` (audit): one row per (offer, booking).
12
+ * Aggregated by the redemption recorder when a booking spans multiple
13
+ * line-item snapshots that share an applied offer.
14
+ *
15
+ * Cross-module FK rules: `product_id` and `booking_id` are plain `text`
16
+ * columns with no `.references()` per the cross-module decoupling rule
17
+ * (see docs/architecture/schema-discipline.md). Cross-module integrity is
18
+ * enforced at the service layer.
19
+ */
20
+ export declare const promotionalOfferDiscountTypeEnum: import("drizzle-orm/pg-core").PgEnum<["percentage", "fixed_amount"]>;
21
+ export type PromotionalOfferDiscountType = (typeof promotionalOfferDiscountTypeEnum.enumValues)[number];
22
+ export declare const promotionalOffers: import("drizzle-orm/pg-core").PgTableWithColumns<{
23
+ name: "promotional_offers";
24
+ schema: undefined;
25
+ columns: {
26
+ id: import("drizzle-orm/pg-core").PgColumn<{
27
+ name: string;
28
+ tableName: "promotional_offers";
29
+ dataType: "string";
30
+ columnType: "PgText";
31
+ data: string;
32
+ driverParam: string;
33
+ notNull: true;
34
+ hasDefault: true;
35
+ isPrimaryKey: true;
36
+ isAutoincrement: false;
37
+ hasRuntimeDefault: true;
38
+ enumValues: [string, ...string[]];
39
+ baseColumn: never;
40
+ identity: undefined;
41
+ generated: undefined;
42
+ }, {}, {}>;
43
+ name: import("drizzle-orm/pg-core").PgColumn<{
44
+ name: "name";
45
+ tableName: "promotional_offers";
46
+ dataType: "string";
47
+ columnType: "PgText";
48
+ data: string;
49
+ driverParam: string;
50
+ notNull: true;
51
+ hasDefault: false;
52
+ isPrimaryKey: false;
53
+ isAutoincrement: false;
54
+ hasRuntimeDefault: false;
55
+ enumValues: [string, ...string[]];
56
+ baseColumn: never;
57
+ identity: undefined;
58
+ generated: undefined;
59
+ }, {}, {}>;
60
+ slug: import("drizzle-orm/pg-core").PgColumn<{
61
+ name: "slug";
62
+ tableName: "promotional_offers";
63
+ dataType: "string";
64
+ columnType: "PgText";
65
+ data: string;
66
+ driverParam: string;
67
+ notNull: true;
68
+ hasDefault: false;
69
+ isPrimaryKey: false;
70
+ isAutoincrement: false;
71
+ hasRuntimeDefault: false;
72
+ enumValues: [string, ...string[]];
73
+ baseColumn: never;
74
+ identity: undefined;
75
+ generated: undefined;
76
+ }, {}, {}>;
77
+ description: import("drizzle-orm/pg-core").PgColumn<{
78
+ name: "description";
79
+ tableName: "promotional_offers";
80
+ dataType: "string";
81
+ columnType: "PgText";
82
+ data: string;
83
+ driverParam: string;
84
+ notNull: false;
85
+ hasDefault: false;
86
+ isPrimaryKey: false;
87
+ isAutoincrement: false;
88
+ hasRuntimeDefault: false;
89
+ enumValues: [string, ...string[]];
90
+ baseColumn: never;
91
+ identity: undefined;
92
+ generated: undefined;
93
+ }, {}, {}>;
94
+ discountType: import("drizzle-orm/pg-core").PgColumn<{
95
+ name: "discount_type";
96
+ tableName: "promotional_offers";
97
+ dataType: "string";
98
+ columnType: "PgEnumColumn";
99
+ data: "percentage" | "fixed_amount";
100
+ driverParam: string;
101
+ notNull: true;
102
+ hasDefault: false;
103
+ isPrimaryKey: false;
104
+ isAutoincrement: false;
105
+ hasRuntimeDefault: false;
106
+ enumValues: ["percentage", "fixed_amount"];
107
+ baseColumn: never;
108
+ identity: undefined;
109
+ generated: undefined;
110
+ }, {}, {}>;
111
+ discountPercent: import("drizzle-orm/pg-core").PgColumn<{
112
+ name: "discount_percent";
113
+ tableName: "promotional_offers";
114
+ dataType: "string";
115
+ columnType: "PgNumeric";
116
+ data: string;
117
+ driverParam: string;
118
+ notNull: false;
119
+ hasDefault: false;
120
+ isPrimaryKey: false;
121
+ isAutoincrement: false;
122
+ hasRuntimeDefault: false;
123
+ enumValues: undefined;
124
+ baseColumn: never;
125
+ identity: undefined;
126
+ generated: undefined;
127
+ }, {}, {}>;
128
+ discountAmountCents: import("drizzle-orm/pg-core").PgColumn<{
129
+ name: "discount_amount_cents";
130
+ tableName: "promotional_offers";
131
+ dataType: "number";
132
+ columnType: "PgInteger";
133
+ data: number;
134
+ driverParam: string | number;
135
+ notNull: false;
136
+ hasDefault: false;
137
+ isPrimaryKey: false;
138
+ isAutoincrement: false;
139
+ hasRuntimeDefault: false;
140
+ enumValues: undefined;
141
+ baseColumn: never;
142
+ identity: undefined;
143
+ generated: undefined;
144
+ }, {}, {}>;
145
+ currency: import("drizzle-orm/pg-core").PgColumn<{
146
+ name: "currency";
147
+ tableName: "promotional_offers";
148
+ dataType: "string";
149
+ columnType: "PgText";
150
+ data: string;
151
+ driverParam: string;
152
+ notNull: false;
153
+ hasDefault: false;
154
+ isPrimaryKey: false;
155
+ isAutoincrement: false;
156
+ hasRuntimeDefault: false;
157
+ enumValues: [string, ...string[]];
158
+ baseColumn: never;
159
+ identity: undefined;
160
+ generated: undefined;
161
+ }, {}, {}>;
162
+ scope: import("drizzle-orm/pg-core").PgColumn<{
163
+ name: "scope";
164
+ tableName: "promotional_offers";
165
+ dataType: "json";
166
+ columnType: "PgJsonb";
167
+ data: {
168
+ kind: "global";
169
+ } | {
170
+ kind: "products";
171
+ productIds: string[];
172
+ } | {
173
+ kind: "categories";
174
+ categoryIds: string[];
175
+ } | {
176
+ kind: "destinations";
177
+ destinationIds: string[];
178
+ } | {
179
+ kind: "markets";
180
+ marketIds: string[];
181
+ } | {
182
+ kind: "audiences";
183
+ audiences: ("staff" | "customer" | "partner" | "supplier")[];
184
+ } | {
185
+ kind: "fare_codes";
186
+ fareCodes: string[];
187
+ } | {
188
+ kind: "cabin_grades";
189
+ cabinGradeCodes: string[];
190
+ };
191
+ driverParam: unknown;
192
+ notNull: true;
193
+ hasDefault: false;
194
+ isPrimaryKey: false;
195
+ isAutoincrement: false;
196
+ hasRuntimeDefault: false;
197
+ enumValues: undefined;
198
+ baseColumn: never;
199
+ identity: undefined;
200
+ generated: undefined;
201
+ }, {}, {
202
+ $type: {
203
+ kind: "global";
204
+ } | {
205
+ kind: "products";
206
+ productIds: string[];
207
+ } | {
208
+ kind: "categories";
209
+ categoryIds: string[];
210
+ } | {
211
+ kind: "destinations";
212
+ destinationIds: string[];
213
+ } | {
214
+ kind: "markets";
215
+ marketIds: string[];
216
+ } | {
217
+ kind: "audiences";
218
+ audiences: ("staff" | "customer" | "partner" | "supplier")[];
219
+ } | {
220
+ kind: "fare_codes";
221
+ fareCodes: string[];
222
+ } | {
223
+ kind: "cabin_grades";
224
+ cabinGradeCodes: string[];
225
+ };
226
+ }>;
227
+ conditions: import("drizzle-orm/pg-core").PgColumn<{
228
+ name: "conditions";
229
+ tableName: "promotional_offers";
230
+ dataType: "json";
231
+ columnType: "PgJsonb";
232
+ data: {
233
+ minPax?: number | undefined;
234
+ pastGuestOnly?: boolean | undefined;
235
+ soloTravelerOnly?: boolean | undefined;
236
+ childTravelerOnly?: boolean | undefined;
237
+ familyOnly?: boolean | undefined;
238
+ };
239
+ driverParam: unknown;
240
+ notNull: true;
241
+ hasDefault: true;
242
+ isPrimaryKey: false;
243
+ isAutoincrement: false;
244
+ hasRuntimeDefault: false;
245
+ enumValues: undefined;
246
+ baseColumn: never;
247
+ identity: undefined;
248
+ generated: undefined;
249
+ }, {}, {
250
+ $type: {
251
+ minPax?: number | undefined;
252
+ pastGuestOnly?: boolean | undefined;
253
+ soloTravelerOnly?: boolean | undefined;
254
+ childTravelerOnly?: boolean | undefined;
255
+ familyOnly?: boolean | undefined;
256
+ };
257
+ }>;
258
+ validFrom: import("drizzle-orm/pg-core").PgColumn<{
259
+ name: "valid_from";
260
+ tableName: "promotional_offers";
261
+ dataType: "date";
262
+ columnType: "PgTimestamp";
263
+ data: Date;
264
+ driverParam: string;
265
+ notNull: false;
266
+ hasDefault: false;
267
+ isPrimaryKey: false;
268
+ isAutoincrement: false;
269
+ hasRuntimeDefault: false;
270
+ enumValues: undefined;
271
+ baseColumn: never;
272
+ identity: undefined;
273
+ generated: undefined;
274
+ }, {}, {}>;
275
+ validUntil: import("drizzle-orm/pg-core").PgColumn<{
276
+ name: "valid_until";
277
+ tableName: "promotional_offers";
278
+ dataType: "date";
279
+ columnType: "PgTimestamp";
280
+ data: Date;
281
+ driverParam: string;
282
+ notNull: false;
283
+ hasDefault: false;
284
+ isPrimaryKey: false;
285
+ isAutoincrement: false;
286
+ hasRuntimeDefault: false;
287
+ enumValues: undefined;
288
+ baseColumn: never;
289
+ identity: undefined;
290
+ generated: undefined;
291
+ }, {}, {}>;
292
+ code: import("drizzle-orm/pg-core").PgColumn<{
293
+ name: "code";
294
+ tableName: "promotional_offers";
295
+ dataType: "string";
296
+ columnType: "PgText";
297
+ data: string;
298
+ driverParam: string;
299
+ notNull: false;
300
+ hasDefault: false;
301
+ isPrimaryKey: false;
302
+ isAutoincrement: false;
303
+ hasRuntimeDefault: false;
304
+ enumValues: [string, ...string[]];
305
+ baseColumn: never;
306
+ identity: undefined;
307
+ generated: undefined;
308
+ }, {}, {}>;
309
+ stackable: import("drizzle-orm/pg-core").PgColumn<{
310
+ name: "stackable";
311
+ tableName: "promotional_offers";
312
+ dataType: "boolean";
313
+ columnType: "PgBoolean";
314
+ data: boolean;
315
+ driverParam: boolean;
316
+ notNull: true;
317
+ hasDefault: true;
318
+ isPrimaryKey: false;
319
+ isAutoincrement: false;
320
+ hasRuntimeDefault: false;
321
+ enumValues: undefined;
322
+ baseColumn: never;
323
+ identity: undefined;
324
+ generated: undefined;
325
+ }, {}, {}>;
326
+ active: import("drizzle-orm/pg-core").PgColumn<{
327
+ name: "active";
328
+ tableName: "promotional_offers";
329
+ dataType: "boolean";
330
+ columnType: "PgBoolean";
331
+ data: boolean;
332
+ driverParam: boolean;
333
+ notNull: true;
334
+ hasDefault: true;
335
+ isPrimaryKey: false;
336
+ isAutoincrement: false;
337
+ hasRuntimeDefault: false;
338
+ enumValues: undefined;
339
+ baseColumn: never;
340
+ identity: undefined;
341
+ generated: undefined;
342
+ }, {}, {}>;
343
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
344
+ name: "metadata";
345
+ tableName: "promotional_offers";
346
+ dataType: "json";
347
+ columnType: "PgJsonb";
348
+ data: unknown;
349
+ driverParam: unknown;
350
+ notNull: false;
351
+ hasDefault: false;
352
+ isPrimaryKey: false;
353
+ isAutoincrement: false;
354
+ hasRuntimeDefault: false;
355
+ enumValues: undefined;
356
+ baseColumn: never;
357
+ identity: undefined;
358
+ generated: undefined;
359
+ }, {}, {}>;
360
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
361
+ name: "created_at";
362
+ tableName: "promotional_offers";
363
+ dataType: "date";
364
+ columnType: "PgTimestamp";
365
+ data: Date;
366
+ driverParam: string;
367
+ notNull: true;
368
+ hasDefault: true;
369
+ isPrimaryKey: false;
370
+ isAutoincrement: false;
371
+ hasRuntimeDefault: false;
372
+ enumValues: undefined;
373
+ baseColumn: never;
374
+ identity: undefined;
375
+ generated: undefined;
376
+ }, {}, {}>;
377
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
378
+ name: "updated_at";
379
+ tableName: "promotional_offers";
380
+ dataType: "date";
381
+ columnType: "PgTimestamp";
382
+ data: Date;
383
+ driverParam: string;
384
+ notNull: true;
385
+ hasDefault: true;
386
+ isPrimaryKey: false;
387
+ isAutoincrement: false;
388
+ hasRuntimeDefault: false;
389
+ enumValues: undefined;
390
+ baseColumn: never;
391
+ identity: undefined;
392
+ generated: undefined;
393
+ }, {}, {}>;
394
+ };
395
+ dialect: "pg";
396
+ }>;
397
+ /**
398
+ * Denormalized scope materialization. Populated by the service layer on
399
+ * offer create/update for `scope.kind ∈ {products, categories, destinations}`.
400
+ * The catalog projection joins against this table on the hot path.
401
+ *
402
+ * `product_id` is a plain text column — no Drizzle `.references()` per the
403
+ * cross-module decoupling rule.
404
+ */
405
+ export declare const promotionalOfferProducts: import("drizzle-orm/pg-core").PgTableWithColumns<{
406
+ name: "promotional_offer_products";
407
+ schema: undefined;
408
+ columns: {
409
+ offerId: import("drizzle-orm/pg-core").PgColumn<{
410
+ name: "offer_id";
411
+ tableName: "promotional_offer_products";
412
+ dataType: "string";
413
+ columnType: "PgText";
414
+ data: string;
415
+ driverParam: string;
416
+ notNull: true;
417
+ hasDefault: false;
418
+ isPrimaryKey: false;
419
+ isAutoincrement: false;
420
+ hasRuntimeDefault: false;
421
+ enumValues: [string, ...string[]];
422
+ baseColumn: never;
423
+ identity: undefined;
424
+ generated: undefined;
425
+ }, {}, {}>;
426
+ productId: import("drizzle-orm/pg-core").PgColumn<{
427
+ name: "product_id";
428
+ tableName: "promotional_offer_products";
429
+ dataType: "string";
430
+ columnType: "PgText";
431
+ data: string;
432
+ driverParam: string;
433
+ notNull: true;
434
+ hasDefault: false;
435
+ isPrimaryKey: false;
436
+ isAutoincrement: false;
437
+ hasRuntimeDefault: false;
438
+ enumValues: [string, ...string[]];
439
+ baseColumn: never;
440
+ identity: undefined;
441
+ generated: undefined;
442
+ }, {}, {}>;
443
+ };
444
+ dialect: "pg";
445
+ }>;
446
+ /**
447
+ * Per-booking redemption record. ON DELETE RESTRICT on `offer_id` so an
448
+ * offer with redemptions cannot be deleted (operators must archive instead).
449
+ *
450
+ * The `(offer_id, booking_id)` unique constraint enforces "one row per
451
+ * (offer, booking)" — the redemption recorder aggregates `discount_applied_cents`
452
+ * across multiple line-item snapshots that share an offer before inserting,
453
+ * and the recorder upsert (`ON CONFLICT … DO UPDATE`) is idempotent against
454
+ * subscriber retries.
455
+ */
456
+ export declare const promotionalOfferRedemptions: import("drizzle-orm/pg-core").PgTableWithColumns<{
457
+ name: "promotional_offer_redemptions";
458
+ schema: undefined;
459
+ columns: {
460
+ id: import("drizzle-orm/pg-core").PgColumn<{
461
+ name: string;
462
+ tableName: "promotional_offer_redemptions";
463
+ dataType: "string";
464
+ columnType: "PgText";
465
+ data: string;
466
+ driverParam: string;
467
+ notNull: true;
468
+ hasDefault: true;
469
+ isPrimaryKey: true;
470
+ isAutoincrement: false;
471
+ hasRuntimeDefault: true;
472
+ enumValues: [string, ...string[]];
473
+ baseColumn: never;
474
+ identity: undefined;
475
+ generated: undefined;
476
+ }, {}, {}>;
477
+ offerId: import("drizzle-orm/pg-core").PgColumn<{
478
+ name: "offer_id";
479
+ tableName: "promotional_offer_redemptions";
480
+ dataType: "string";
481
+ columnType: "PgText";
482
+ data: string;
483
+ driverParam: string;
484
+ notNull: true;
485
+ hasDefault: false;
486
+ isPrimaryKey: false;
487
+ isAutoincrement: false;
488
+ hasRuntimeDefault: false;
489
+ enumValues: [string, ...string[]];
490
+ baseColumn: never;
491
+ identity: undefined;
492
+ generated: undefined;
493
+ }, {}, {}>;
494
+ bookingId: import("drizzle-orm/pg-core").PgColumn<{
495
+ name: "booking_id";
496
+ tableName: "promotional_offer_redemptions";
497
+ dataType: "string";
498
+ columnType: "PgText";
499
+ data: string;
500
+ driverParam: string;
501
+ notNull: true;
502
+ hasDefault: false;
503
+ isPrimaryKey: false;
504
+ isAutoincrement: false;
505
+ hasRuntimeDefault: false;
506
+ enumValues: [string, ...string[]];
507
+ baseColumn: never;
508
+ identity: undefined;
509
+ generated: undefined;
510
+ }, {}, {}>;
511
+ codeUsed: import("drizzle-orm/pg-core").PgColumn<{
512
+ name: "code_used";
513
+ tableName: "promotional_offer_redemptions";
514
+ dataType: "string";
515
+ columnType: "PgText";
516
+ data: string;
517
+ driverParam: string;
518
+ notNull: false;
519
+ hasDefault: false;
520
+ isPrimaryKey: false;
521
+ isAutoincrement: false;
522
+ hasRuntimeDefault: false;
523
+ enumValues: [string, ...string[]];
524
+ baseColumn: never;
525
+ identity: undefined;
526
+ generated: undefined;
527
+ }, {}, {}>;
528
+ discountAppliedCents: import("drizzle-orm/pg-core").PgColumn<{
529
+ name: "discount_applied_cents";
530
+ tableName: "promotional_offer_redemptions";
531
+ dataType: "number";
532
+ columnType: "PgInteger";
533
+ data: number;
534
+ driverParam: string | number;
535
+ notNull: true;
536
+ hasDefault: false;
537
+ isPrimaryKey: false;
538
+ isAutoincrement: false;
539
+ hasRuntimeDefault: false;
540
+ enumValues: undefined;
541
+ baseColumn: never;
542
+ identity: undefined;
543
+ generated: undefined;
544
+ }, {}, {}>;
545
+ currency: import("drizzle-orm/pg-core").PgColumn<{
546
+ name: "currency";
547
+ tableName: "promotional_offer_redemptions";
548
+ dataType: "string";
549
+ columnType: "PgText";
550
+ data: string;
551
+ driverParam: string;
552
+ notNull: true;
553
+ hasDefault: false;
554
+ isPrimaryKey: false;
555
+ isAutoincrement: false;
556
+ hasRuntimeDefault: false;
557
+ enumValues: [string, ...string[]];
558
+ baseColumn: never;
559
+ identity: undefined;
560
+ generated: undefined;
561
+ }, {}, {}>;
562
+ redeemedAt: import("drizzle-orm/pg-core").PgColumn<{
563
+ name: "redeemed_at";
564
+ tableName: "promotional_offer_redemptions";
565
+ dataType: "date";
566
+ columnType: "PgTimestamp";
567
+ data: Date;
568
+ driverParam: string;
569
+ notNull: true;
570
+ hasDefault: true;
571
+ isPrimaryKey: false;
572
+ isAutoincrement: false;
573
+ hasRuntimeDefault: false;
574
+ enumValues: undefined;
575
+ baseColumn: never;
576
+ identity: undefined;
577
+ generated: undefined;
578
+ }, {}, {}>;
579
+ };
580
+ dialect: "pg";
581
+ }>;
582
+ export type PromotionalOffer = typeof promotionalOffers.$inferSelect;
583
+ export type NewPromotionalOffer = typeof promotionalOffers.$inferInsert;
584
+ export type PromotionalOfferProduct = typeof promotionalOfferProducts.$inferSelect;
585
+ export type NewPromotionalOfferProduct = typeof promotionalOfferProducts.$inferInsert;
586
+ export type PromotionalOfferRedemption = typeof promotionalOfferRedemptions.$inferSelect;
587
+ export type NewPromotionalOfferRedemption = typeof promotionalOfferRedemptions.$inferInsert;
588
+ /**
589
+ * Boundary-scheduler watermark — a single row tracking the last_tick the
590
+ * boundary scheduler observed. Per §9.2 of the architecture doc, the
591
+ * scheduler queries offers whose `valid_from` / `valid_until` falls
592
+ * BETWEEN `last_tick` and `now()` to detect lifecycle transitions.
593
+ *
594
+ * Single-row convention: rows are upserted with id = `BOUNDARY_SCHEDULER_STATE_ID`
595
+ * (typeid `pofs_default`). The unique constraint on `singleton_key` enforces
596
+ * "at most one row" defensively even if a future caller forgot the convention.
597
+ */
598
+ export declare const promotionalOfferSchedulerState: import("drizzle-orm/pg-core").PgTableWithColumns<{
599
+ name: "promotional_offer_scheduler_state";
600
+ schema: undefined;
601
+ columns: {
602
+ id: import("drizzle-orm/pg-core").PgColumn<{
603
+ name: string;
604
+ tableName: "promotional_offer_scheduler_state";
605
+ dataType: "string";
606
+ columnType: "PgText";
607
+ data: string;
608
+ driverParam: string;
609
+ notNull: true;
610
+ hasDefault: true;
611
+ isPrimaryKey: true;
612
+ isAutoincrement: false;
613
+ hasRuntimeDefault: true;
614
+ enumValues: [string, ...string[]];
615
+ baseColumn: never;
616
+ identity: undefined;
617
+ generated: undefined;
618
+ }, {}, {}>;
619
+ singletonKey: import("drizzle-orm/pg-core").PgColumn<{
620
+ name: "singleton_key";
621
+ tableName: "promotional_offer_scheduler_state";
622
+ dataType: "string";
623
+ columnType: "PgText";
624
+ data: string;
625
+ driverParam: string;
626
+ notNull: true;
627
+ hasDefault: true;
628
+ isPrimaryKey: false;
629
+ isAutoincrement: false;
630
+ hasRuntimeDefault: false;
631
+ enumValues: [string, ...string[]];
632
+ baseColumn: never;
633
+ identity: undefined;
634
+ generated: undefined;
635
+ }, {}, {}>;
636
+ lastTick: import("drizzle-orm/pg-core").PgColumn<{
637
+ name: "last_tick";
638
+ tableName: "promotional_offer_scheduler_state";
639
+ dataType: "date";
640
+ columnType: "PgTimestamp";
641
+ data: Date;
642
+ driverParam: string;
643
+ notNull: true;
644
+ hasDefault: false;
645
+ isPrimaryKey: false;
646
+ isAutoincrement: false;
647
+ hasRuntimeDefault: false;
648
+ enumValues: undefined;
649
+ baseColumn: never;
650
+ identity: undefined;
651
+ generated: undefined;
652
+ }, {}, {}>;
653
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
654
+ name: "updated_at";
655
+ tableName: "promotional_offer_scheduler_state";
656
+ dataType: "date";
657
+ columnType: "PgTimestamp";
658
+ data: Date;
659
+ driverParam: string;
660
+ notNull: true;
661
+ hasDefault: true;
662
+ isPrimaryKey: false;
663
+ isAutoincrement: false;
664
+ hasRuntimeDefault: false;
665
+ enumValues: undefined;
666
+ baseColumn: never;
667
+ identity: undefined;
668
+ generated: undefined;
669
+ }, {}, {}>;
670
+ };
671
+ dialect: "pg";
672
+ }>;
673
+ export type PromotionalOfferSchedulerState = typeof promotionalOfferSchedulerState.$inferSelect;
674
+ export type NewPromotionalOfferSchedulerState = typeof promotionalOfferSchedulerState.$inferInsert;
675
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/promotions/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAoBH,eAAO,MAAM,gCAAgC,sEAG3C,CAAA;AAEF,MAAM,MAAM,4BAA4B,GACtC,CAAC,OAAO,gCAAgC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2C7B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYpC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBvC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAA;AACpE,MAAM,MAAM,mBAAmB,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAA;AACvE,MAAM,MAAM,uBAAuB,GAAG,OAAO,wBAAwB,CAAC,YAAY,CAAA;AAClF,MAAM,MAAM,0BAA0B,GAAG,OAAO,wBAAwB,CAAC,YAAY,CAAA;AACrF,MAAM,MAAM,0BAA0B,GAAG,OAAO,2BAA2B,CAAC,YAAY,CAAA;AACxF,MAAM,MAAM,6BAA6B,GAAG,OAAO,2BAA2B,CAAC,YAAY,CAAA;AAE3F;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc1C,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,OAAO,8BAA8B,CAAC,YAAY,CAAA;AAC/F,MAAM,MAAM,iCAAiC,GAAG,OAAO,8BAA8B,CAAC,YAAY,CAAA"}