@voyant-travel/charters 0.117.2

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 (108) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +16 -0
  3. package/dist/adapters/index.d.ts +254 -0
  4. package/dist/adapters/index.d.ts.map +1 -0
  5. package/dist/adapters/index.js +16 -0
  6. package/dist/adapters/memoize.d.ts +28 -0
  7. package/dist/adapters/memoize.d.ts.map +1 -0
  8. package/dist/adapters/memoize.js +121 -0
  9. package/dist/adapters/mock.d.ts +50 -0
  10. package/dist/adapters/mock.d.ts.map +1 -0
  11. package/dist/adapters/mock.js +194 -0
  12. package/dist/adapters/registry.d.ts +24 -0
  13. package/dist/adapters/registry.d.ts.map +1 -0
  14. package/dist/adapters/registry.js +40 -0
  15. package/dist/booking-extension.d.ts +895 -0
  16. package/dist/booking-extension.d.ts.map +1 -0
  17. package/dist/booking-extension.js +339 -0
  18. package/dist/catalog-policy.d.ts +23 -0
  19. package/dist/catalog-policy.d.ts.map +1 -0
  20. package/dist/catalog-policy.js +400 -0
  21. package/dist/content-shape.d.ts +5 -0
  22. package/dist/content-shape.d.ts.map +1 -0
  23. package/dist/content-shape.js +13 -0
  24. package/dist/draft-shape.d.ts +29 -0
  25. package/dist/draft-shape.d.ts.map +1 -0
  26. package/dist/draft-shape.js +63 -0
  27. package/dist/index.d.ts +31 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +55 -0
  30. package/dist/lib/key.d.ts +22 -0
  31. package/dist/lib/key.d.ts.map +1 -0
  32. package/dist/lib/key.js +24 -0
  33. package/dist/routes-public.d.ts +785 -0
  34. package/dist/routes-public.d.ts.map +1 -0
  35. package/dist/routes-public.js +234 -0
  36. package/dist/routes.d.ts +1744 -0
  37. package/dist/routes.d.ts.map +1 -0
  38. package/dist/routes.js +543 -0
  39. package/dist/schema-core.d.ts +815 -0
  40. package/dist/schema-core.d.ts.map +1 -0
  41. package/dist/schema-core.js +98 -0
  42. package/dist/schema-itinerary.d.ts +239 -0
  43. package/dist/schema-itinerary.d.ts.map +1 -0
  44. package/dist/schema-itinerary.js +30 -0
  45. package/dist/schema-pricing.d.ts +385 -0
  46. package/dist/schema-pricing.d.ts.map +1 -0
  47. package/dist/schema-pricing.js +62 -0
  48. package/dist/schema-shared.d.ts +8 -0
  49. package/dist/schema-shared.d.ts.map +1 -0
  50. package/dist/schema-shared.js +37 -0
  51. package/dist/schema-sourced-content.d.ts +253 -0
  52. package/dist/schema-sourced-content.d.ts.map +1 -0
  53. package/dist/schema-sourced-content.js +44 -0
  54. package/dist/schema-yachts.d.ts +367 -0
  55. package/dist/schema-yachts.d.ts.map +1 -0
  56. package/dist/schema-yachts.js +30 -0
  57. package/dist/schema.d.ts +8 -0
  58. package/dist/schema.d.ts.map +1 -0
  59. package/dist/schema.js +7 -0
  60. package/dist/service-bookings-helpers.d.ts +20 -0
  61. package/dist/service-bookings-helpers.d.ts.map +1 -0
  62. package/dist/service-bookings-helpers.js +67 -0
  63. package/dist/service-bookings-local.d.ts +5 -0
  64. package/dist/service-bookings-local.d.ts.map +1 -0
  65. package/dist/service-bookings-local.js +177 -0
  66. package/dist/service-bookings-types.d.ts +88 -0
  67. package/dist/service-bookings-types.d.ts.map +1 -0
  68. package/dist/service-bookings-types.js +1 -0
  69. package/dist/service-bookings.d.ts +36 -0
  70. package/dist/service-bookings.d.ts.map +1 -0
  71. package/dist/service-bookings.js +267 -0
  72. package/dist/service-catalog-plane.d.ts +58 -0
  73. package/dist/service-catalog-plane.d.ts.map +1 -0
  74. package/dist/service-catalog-plane.js +145 -0
  75. package/dist/service-content-synthesizer.d.ts +42 -0
  76. package/dist/service-content-synthesizer.d.ts.map +1 -0
  77. package/dist/service-content-synthesizer.js +122 -0
  78. package/dist/service-content.d.ts +43 -0
  79. package/dist/service-content.d.ts.map +1 -0
  80. package/dist/service-content.js +248 -0
  81. package/dist/service-myba.d.ts +85 -0
  82. package/dist/service-myba.d.ts.map +1 -0
  83. package/dist/service-myba.js +88 -0
  84. package/dist/service-pricing.d.ts +64 -0
  85. package/dist/service-pricing.d.ts.map +1 -0
  86. package/dist/service-pricing.js +167 -0
  87. package/dist/service.d.ts +131 -0
  88. package/dist/service.d.ts.map +1 -0
  89. package/dist/service.js +279 -0
  90. package/dist/validation-core.d.ts +152 -0
  91. package/dist/validation-core.d.ts.map +1 -0
  92. package/dist/validation-core.js +66 -0
  93. package/dist/validation-itinerary.d.ts +43 -0
  94. package/dist/validation-itinerary.d.ts.map +1 -0
  95. package/dist/validation-itinerary.js +19 -0
  96. package/dist/validation-pricing.d.ts +103 -0
  97. package/dist/validation-pricing.d.ts.map +1 -0
  98. package/dist/validation-pricing.js +28 -0
  99. package/dist/validation-shared.d.ts +61 -0
  100. package/dist/validation-shared.d.ts.map +1 -0
  101. package/dist/validation-shared.js +60 -0
  102. package/dist/validation-yachts.d.ts +76 -0
  103. package/dist/validation-yachts.d.ts.map +1 -0
  104. package/dist/validation-yachts.js +36 -0
  105. package/dist/validation.d.ts +6 -0
  106. package/dist/validation.d.ts.map +1 -0
  107. package/dist/validation.js +5 -0
  108. package/package.json +116 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-core.d.ts","sourceRoot":"","sources":["../src/schema-core.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiD3B,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,eAAe,CAAC,YAAY,CAAA;AAChE,MAAM,MAAM,iBAAiB,GAAG,OAAO,eAAe,CAAC,YAAY,CAAA;AAEnE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0D1B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,YAAY,CAAA;AAC9D,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAC,YAAY,CAAA"}
@@ -0,0 +1,98 @@
1
+ import { typeId, typeIdRef } from "@voyant-travel/db/lib/typeid-column";
2
+ import { boolean, date, index, jsonb, numeric, pgTable, smallint, text, timestamp, uniqueIndex, } from "drizzle-orm/pg-core";
3
+ import { charterStatusEnum, voyageSalesStatusEnum } from "./schema-shared.js";
4
+ import { charterYachts } from "./schema-yachts.js";
5
+ export const charterProducts = pgTable("charter_products", {
6
+ id: typeId("charter_products"),
7
+ slug: text("slug").notNull(),
8
+ name: text("name").notNull(),
9
+ lineSupplierId: text("line_supplier_id"),
10
+ defaultYachtId: typeIdRef("default_yacht_id").references(() => charterYachts.id, {
11
+ onDelete: "set null",
12
+ }),
13
+ description: text("description"),
14
+ shortDescription: text("short_description"),
15
+ heroImageUrl: text("hero_image_url"),
16
+ mapImageUrl: text("map_image_url"),
17
+ regions: jsonb("regions").$type().default([]),
18
+ themes: jsonb("themes").$type().default([]),
19
+ status: charterStatusEnum("status").notNull().default("draft"),
20
+ /** Default booking modes offered. Per-voyage entries can override. */
21
+ defaultBookingModes: jsonb("default_booking_modes")
22
+ .$type()
23
+ .default(["per_suite"]),
24
+ /** Soft FK to legal.contractTemplates for whole-yacht MYBA template. */
25
+ defaultMybaTemplateId: text("default_myba_template_id"),
26
+ /** Typical APA % for this brand (e.g. 27.50). Per-voyage can override. */
27
+ defaultApaPercent: numeric("default_apa_percent", { precision: 5, scale: 2 }),
28
+ /**
29
+ * Cached aggregate — the lowest published voyage × suite price for this
30
+ * product, recomputed by `recomputeProductAggregates`. Single-currency
31
+ * (the deployment's chosen browse currency) so card surfaces have a
32
+ * sortable price without scanning the jsonb pricing maps;
33
+ * `lowestPriceCachedCurrency` records which currency the amount is in.
34
+ */
35
+ lowestPriceCachedAmount: numeric("lowest_price_cached_amount", {
36
+ precision: 12,
37
+ scale: 2,
38
+ }),
39
+ lowestPriceCachedCurrency: text("lowest_price_cached_currency"),
40
+ earliestVoyageCached: date("earliest_voyage_cached"),
41
+ latestVoyageCached: date("latest_voyage_cached"),
42
+ externalRefs: jsonb("external_refs").$type().default({}),
43
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
44
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
45
+ }, (table) => [
46
+ uniqueIndex("uidx_charter_products_slug").on(table.slug),
47
+ index("idx_charter_products_status_created").on(table.status, table.createdAt),
48
+ index("idx_charter_products_supplier_status").on(table.lineSupplierId, table.status),
49
+ index("idx_charter_products_earliest").on(table.earliestVoyageCached, table.status),
50
+ ]);
51
+ export const charterVoyages = pgTable("charter_voyages", {
52
+ id: typeId("charter_voyages"),
53
+ productId: typeIdRef("product_id")
54
+ .notNull()
55
+ .references(() => charterProducts.id, { onDelete: "cascade" }),
56
+ yachtId: typeIdRef("yacht_id")
57
+ .notNull()
58
+ .references(() => charterYachts.id, { onDelete: "restrict" }),
59
+ voyageCode: text("voyage_code").notNull(),
60
+ name: text("name"),
61
+ embarkPortFacilityId: text("embark_port_facility_id"),
62
+ embarkPortName: text("embark_port_name"),
63
+ disembarkPortFacilityId: text("disembark_port_facility_id"),
64
+ disembarkPortName: text("disembark_port_name"),
65
+ departureDate: date("departure_date").notNull(),
66
+ returnDate: date("return_date").notNull(),
67
+ nights: smallint("nights").notNull(),
68
+ /** Which booking modes this voyage offers — `['per_suite']`, `['whole_yacht']`, or both. */
69
+ bookingModes: jsonb("booking_modes")
70
+ .$type()
71
+ .notNull()
72
+ .default(["per_suite"]),
73
+ appointmentOnly: boolean("appointment_only").notNull().default(false),
74
+ /**
75
+ * Whole-yacht pricing — only relevant when 'whole_yacht' in bookingModes.
76
+ * `{ "<ISO-4217>": "<numeric-string>" }` map; missing key means the
77
+ * voyage isn't priced in that currency. Adding a new currency is a
78
+ * data-only change.
79
+ */
80
+ wholeYachtPricesByCurrency: jsonb("whole_yacht_prices_by_currency")
81
+ .$type()
82
+ .notNull()
83
+ .default({}),
84
+ apaPercentOverride: numeric("apa_percent_override", { precision: 5, scale: 2 }),
85
+ mybaTemplateIdOverride: text("myba_template_id_override"),
86
+ charterAreaOverride: text("charter_area_override"),
87
+ salesStatus: voyageSalesStatusEnum("sales_status").notNull().default("open"),
88
+ availabilityNote: text("availability_note"),
89
+ externalRefs: jsonb("external_refs").$type().default({}),
90
+ lastSyncedAt: timestamp("last_synced_at", { withTimezone: true }),
91
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
92
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
93
+ }, (table) => [
94
+ index("idx_charter_voyages_product_departure").on(table.productId, table.departureDate),
95
+ index("idx_charter_voyages_yacht_departure").on(table.yachtId, table.departureDate),
96
+ index("idx_charter_voyages_status_departure").on(table.salesStatus, table.departureDate),
97
+ uniqueIndex("uidx_charter_voyages_product_date_yacht").on(table.productId, table.departureDate, table.yachtId),
98
+ ]);
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Charter schedule days. Charter itineraries are flat per voyage — no template
3
+ * + override two-tier model like cruises uses, because the schedule is itself
4
+ * negotiable between broker and charterer for whole-yacht bookings, and is
5
+ * just a published suggestion for per-suite bookings.
6
+ */
7
+ export declare const charterScheduleDays: import("drizzle-orm/pg-core").PgTableWithColumns<{
8
+ name: "charter_schedule_days";
9
+ schema: undefined;
10
+ columns: {
11
+ id: import("drizzle-orm/pg-core").PgColumn<{
12
+ name: string;
13
+ tableName: "charter_schedule_days";
14
+ dataType: "string";
15
+ columnType: "PgText";
16
+ data: string;
17
+ driverParam: string;
18
+ notNull: true;
19
+ hasDefault: true;
20
+ isPrimaryKey: true;
21
+ isAutoincrement: false;
22
+ hasRuntimeDefault: true;
23
+ enumValues: [string, ...string[]];
24
+ baseColumn: never;
25
+ identity: undefined;
26
+ generated: undefined;
27
+ }, {}, {}>;
28
+ voyageId: import("drizzle-orm/pg-core").PgColumn<{
29
+ name: string;
30
+ tableName: "charter_schedule_days";
31
+ dataType: "string";
32
+ columnType: "PgText";
33
+ data: string;
34
+ driverParam: string;
35
+ notNull: true;
36
+ hasDefault: false;
37
+ isPrimaryKey: false;
38
+ isAutoincrement: false;
39
+ hasRuntimeDefault: false;
40
+ enumValues: [string, ...string[]];
41
+ baseColumn: never;
42
+ identity: undefined;
43
+ generated: undefined;
44
+ }, {}, {}>;
45
+ dayNumber: import("drizzle-orm/pg-core").PgColumn<{
46
+ name: "day_number";
47
+ tableName: "charter_schedule_days";
48
+ dataType: "number";
49
+ columnType: "PgSmallInt";
50
+ data: number;
51
+ driverParam: string | number;
52
+ notNull: true;
53
+ hasDefault: false;
54
+ isPrimaryKey: false;
55
+ isAutoincrement: false;
56
+ hasRuntimeDefault: false;
57
+ enumValues: undefined;
58
+ baseColumn: never;
59
+ identity: undefined;
60
+ generated: undefined;
61
+ }, {}, {}>;
62
+ portFacilityId: import("drizzle-orm/pg-core").PgColumn<{
63
+ name: "port_facility_id";
64
+ tableName: "charter_schedule_days";
65
+ dataType: "string";
66
+ columnType: "PgText";
67
+ data: string;
68
+ driverParam: string;
69
+ notNull: false;
70
+ hasDefault: false;
71
+ isPrimaryKey: false;
72
+ isAutoincrement: false;
73
+ hasRuntimeDefault: false;
74
+ enumValues: [string, ...string[]];
75
+ baseColumn: never;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {}>;
79
+ portName: import("drizzle-orm/pg-core").PgColumn<{
80
+ name: "port_name";
81
+ tableName: "charter_schedule_days";
82
+ dataType: "string";
83
+ columnType: "PgText";
84
+ data: string;
85
+ driverParam: string;
86
+ notNull: false;
87
+ hasDefault: false;
88
+ isPrimaryKey: false;
89
+ isAutoincrement: false;
90
+ hasRuntimeDefault: false;
91
+ enumValues: [string, ...string[]];
92
+ baseColumn: never;
93
+ identity: undefined;
94
+ generated: undefined;
95
+ }, {}, {}>;
96
+ scheduleDate: import("drizzle-orm/pg-core").PgColumn<{
97
+ name: "schedule_date";
98
+ tableName: "charter_schedule_days";
99
+ dataType: "string";
100
+ columnType: "PgDateString";
101
+ data: string;
102
+ driverParam: string;
103
+ notNull: false;
104
+ hasDefault: false;
105
+ isPrimaryKey: false;
106
+ isAutoincrement: false;
107
+ hasRuntimeDefault: false;
108
+ enumValues: undefined;
109
+ baseColumn: never;
110
+ identity: undefined;
111
+ generated: undefined;
112
+ }, {}, {}>;
113
+ arrivalTime: import("drizzle-orm/pg-core").PgColumn<{
114
+ name: "arrival_time";
115
+ tableName: "charter_schedule_days";
116
+ dataType: "string";
117
+ columnType: "PgTime";
118
+ data: string;
119
+ driverParam: string;
120
+ notNull: false;
121
+ hasDefault: false;
122
+ isPrimaryKey: false;
123
+ isAutoincrement: false;
124
+ hasRuntimeDefault: false;
125
+ enumValues: undefined;
126
+ baseColumn: never;
127
+ identity: undefined;
128
+ generated: undefined;
129
+ }, {}, {}>;
130
+ departureTime: import("drizzle-orm/pg-core").PgColumn<{
131
+ name: "departure_time";
132
+ tableName: "charter_schedule_days";
133
+ dataType: "string";
134
+ columnType: "PgTime";
135
+ data: string;
136
+ driverParam: string;
137
+ notNull: false;
138
+ hasDefault: false;
139
+ isPrimaryKey: false;
140
+ isAutoincrement: false;
141
+ hasRuntimeDefault: false;
142
+ enumValues: undefined;
143
+ baseColumn: never;
144
+ identity: undefined;
145
+ generated: undefined;
146
+ }, {}, {}>;
147
+ isSeaDay: import("drizzle-orm/pg-core").PgColumn<{
148
+ name: "is_sea_day";
149
+ tableName: "charter_schedule_days";
150
+ dataType: "boolean";
151
+ columnType: "PgBoolean";
152
+ data: boolean;
153
+ driverParam: boolean;
154
+ notNull: true;
155
+ hasDefault: true;
156
+ isPrimaryKey: false;
157
+ isAutoincrement: false;
158
+ hasRuntimeDefault: false;
159
+ enumValues: undefined;
160
+ baseColumn: never;
161
+ identity: undefined;
162
+ generated: undefined;
163
+ }, {}, {}>;
164
+ description: import("drizzle-orm/pg-core").PgColumn<{
165
+ name: "description";
166
+ tableName: "charter_schedule_days";
167
+ dataType: "string";
168
+ columnType: "PgText";
169
+ data: string;
170
+ driverParam: string;
171
+ notNull: false;
172
+ hasDefault: false;
173
+ isPrimaryKey: false;
174
+ isAutoincrement: false;
175
+ hasRuntimeDefault: false;
176
+ enumValues: [string, ...string[]];
177
+ baseColumn: never;
178
+ identity: undefined;
179
+ generated: undefined;
180
+ }, {}, {}>;
181
+ activities: import("drizzle-orm/pg-core").PgColumn<{
182
+ name: "activities";
183
+ tableName: "charter_schedule_days";
184
+ dataType: "json";
185
+ columnType: "PgJsonb";
186
+ data: string[];
187
+ driverParam: unknown;
188
+ notNull: false;
189
+ hasDefault: true;
190
+ isPrimaryKey: false;
191
+ isAutoincrement: false;
192
+ hasRuntimeDefault: false;
193
+ enumValues: undefined;
194
+ baseColumn: never;
195
+ identity: undefined;
196
+ generated: undefined;
197
+ }, {}, {
198
+ $type: string[];
199
+ }>;
200
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
201
+ name: "created_at";
202
+ tableName: "charter_schedule_days";
203
+ dataType: "date";
204
+ columnType: "PgTimestamp";
205
+ data: Date;
206
+ driverParam: string;
207
+ notNull: true;
208
+ hasDefault: true;
209
+ isPrimaryKey: false;
210
+ isAutoincrement: false;
211
+ hasRuntimeDefault: false;
212
+ enumValues: undefined;
213
+ baseColumn: never;
214
+ identity: undefined;
215
+ generated: undefined;
216
+ }, {}, {}>;
217
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
218
+ name: "updated_at";
219
+ tableName: "charter_schedule_days";
220
+ dataType: "date";
221
+ columnType: "PgTimestamp";
222
+ data: Date;
223
+ driverParam: string;
224
+ notNull: true;
225
+ hasDefault: true;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ baseColumn: never;
231
+ identity: undefined;
232
+ generated: undefined;
233
+ }, {}, {}>;
234
+ };
235
+ dialect: "pg";
236
+ }>;
237
+ export type CharterScheduleDay = typeof charterScheduleDays.$inferSelect;
238
+ export type NewCharterScheduleDay = typeof charterScheduleDays.$inferInsert;
239
+ //# sourceMappingURL=schema-itinerary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-itinerary.d.ts","sourceRoot":"","sources":["../src/schema-itinerary.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB/B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAA;AACxE,MAAM,MAAM,qBAAqB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { typeId, typeIdRef } from "@voyant-travel/db/lib/typeid-column";
2
+ import { boolean, date, index, jsonb, pgTable, smallint, text, time, timestamp, uniqueIndex, } from "drizzle-orm/pg-core";
3
+ import { charterVoyages } from "./schema-core.js";
4
+ /**
5
+ * Charter schedule days. Charter itineraries are flat per voyage — no template
6
+ * + override two-tier model like cruises uses, because the schedule is itself
7
+ * negotiable between broker and charterer for whole-yacht bookings, and is
8
+ * just a published suggestion for per-suite bookings.
9
+ */
10
+ export const charterScheduleDays = pgTable("charter_schedule_days", {
11
+ id: typeId("charter_schedule_days"),
12
+ voyageId: typeIdRef("voyage_id")
13
+ .notNull()
14
+ .references(() => charterVoyages.id, { onDelete: "cascade" }),
15
+ dayNumber: smallint("day_number").notNull(),
16
+ portFacilityId: text("port_facility_id"),
17
+ portName: text("port_name"),
18
+ /** Optional explicit date — else derived from voyage.departureDate + dayNumber - 1. */
19
+ scheduleDate: date("schedule_date"),
20
+ arrivalTime: time("arrival_time"),
21
+ departureTime: time("departure_time"),
22
+ isSeaDay: boolean("is_sea_day").notNull().default(false),
23
+ description: text("description"),
24
+ activities: jsonb("activities").$type().default([]),
25
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
26
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
27
+ }, (table) => [
28
+ uniqueIndex("uidx_charter_schedule_voyage_day").on(table.voyageId, table.dayNumber),
29
+ index("idx_charter_schedule_voyage").on(table.voyageId),
30
+ ]);