@v-office/website-sdk 2.11.0 → 2.13.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/README.md +6 -1
- package/dist/capabilities/search.d.mts +2 -0
- package/dist/capabilities/search.mjs +2 -0
- package/dist/cli.d.mts +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/{client-DYAHnU5F.mjs → client-Ma0daa2H.mjs} +140 -68
- package/dist/index.d.mts +569 -344
- package/dist/index.mjs +1 -1
- package/dist/instructions/CHANGELOG.md +2 -0
- package/dist/instructions/MIGRATION.md +2 -0
- package/dist/instructions/README.md +12 -4
- package/dist/instructions/booking.md +56 -40
- package/dist/instructions/quote.md +100 -6
- package/dist/instructions/search.md +99 -12
- package/dist/instructions/versions/2.12.0/CHANGELOG.md +56 -0
- package/dist/instructions/versions/2.12.0/MIGRATION.md +194 -0
- package/dist/instructions/versions/2.13.0/CHANGELOG.md +87 -0
- package/dist/instructions/versions/2.13.0/MIGRATION.md +315 -0
- package/dist/instructions/versions/2.5.0/MIGRATION.md +3 -0
- package/dist/{quote-Cs6jGoRS.mjs → quote-Qy_affum.mjs} +4 -4
- package/dist/{rentals-CFod9H4m.mjs → rentals-BG1diZoo.mjs} +7 -4
- package/dist/{search-QlZrI7ue.mjs → search-Byi6XboR.mjs} +39 -19
- package/dist/{to-rental-highlights-B6a_fi0j.mjs → to-rental-highlights-BVikT4Iz.mjs} +4 -2
- package/dist/translations/shared/de-DE/booking.json +7 -0
- package/dist/translations/shared/en-US/booking.json +7 -0
- package/instructions/CHANGELOG.md +2 -0
- package/instructions/MIGRATION.md +2 -0
- package/instructions/README.md +12 -4
- package/instructions/booking.md +56 -40
- package/instructions/quote.md +100 -6
- package/instructions/search.md +99 -12
- package/instructions/versions/2.12.0/CHANGELOG.md +56 -0
- package/instructions/versions/2.12.0/MIGRATION.md +194 -0
- package/instructions/versions/2.13.0/CHANGELOG.md +87 -0
- package/instructions/versions/2.13.0/MIGRATION.md +315 -0
- package/instructions/versions/2.5.0/MIGRATION.md +3 -0
- package/package.json +16 -13
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as parseQueryParameters, i as collectQueryParameters, n as makeV9CustomAttributeFilterCapabilities, o as toQueryString, r as toBasicQueryInputs, s as applyVofficeFilterDerivedBasicQueryInputs } from "./client-
|
|
2
|
-
import { a as searchQuery, c as VofficeUnitDataFieldSchemas, m as parseVofficeUnitData, n as toImages, r as toAddress, t as toRentalHighlights } from "./to-rental-highlights-
|
|
1
|
+
import { a as parseQueryParameters, i as collectQueryParameters, n as makeV9CustomAttributeFilterCapabilities, o as toQueryString, r as toBasicQueryInputs, s as applyVofficeFilterDerivedBasicQueryInputs } from "./client-Ma0daa2H.mjs";
|
|
2
|
+
import { a as searchQuery, c as VofficeUnitDataFieldSchemas, m as parseVofficeUnitData, n as toImages, r as toAddress, t as toRentalHighlights } from "./to-rental-highlights-BVikT4Iz.mjs";
|
|
3
3
|
import { CoreSDKError, STABLE_SEARCH_INPUTS, daysBetweenLocalDates, expandCustomAttributeFilterCompositions, parseChildrenAges, parseOccupancyCount, resolveExpandedCompositions, toFormattedSearchPrice, toIsoDateFromPeriodQueryDate, toStableSearchInputBackendQueryKeys, toStableSearchInputParameterValues, toStableSearchInputQueryKeys, toUnusedFilterKeys } from "@v-office/sdk-core";
|
|
4
4
|
import { Effect } from "effect";
|
|
5
5
|
//#region src/legacy-v9/parser/search/input/search-input-error.ts
|
|
@@ -79,9 +79,11 @@ const PERIOD_QUERY_KEYS = toStableSearchInputBackendQueryKeys({
|
|
|
79
79
|
backend: "v9",
|
|
80
80
|
group: STABLE_SEARCH_INPUTS.period
|
|
81
81
|
});
|
|
82
|
+
const UNSUPPORTED_FLEXIBLE_PERIOD_QUERY_KEYS = new Set(STABLE_SEARCH_INPUTS.period.keys.filter((key) => !PERIOD_QUERY_KEYS.has(key)));
|
|
82
83
|
//#endregion
|
|
83
84
|
//#region src/legacy-v9/parser/search/input/period/collect-period-query-parameters.ts
|
|
84
85
|
const hasPeriodInput = (query) => parseQueryParameters(query).some(([key]) => PERIOD_QUERY_KEYS.has(key));
|
|
86
|
+
const hasUnsupportedFlexiblePeriodInput = (query) => parseQueryParameters(query).some(([key]) => UNSUPPORTED_FLEXIBLE_PERIOD_QUERY_KEYS.has(key));
|
|
85
87
|
const collectPeriodQueryParameters = ({ query }) => {
|
|
86
88
|
const { matchingParameters, remainingParameters } = collectQueryParameters({
|
|
87
89
|
query,
|
|
@@ -178,6 +180,7 @@ const toVofficeSorting = (sort) => {
|
|
|
178
180
|
//#endregion
|
|
179
181
|
//#region src/legacy-v9/parser/search/input/to-query-input.ts
|
|
180
182
|
const toQueryInput = ({ query, sort, customAttributeFilterDefinitions, locale, translations }) => Effect.gen(function* () {
|
|
183
|
+
if (hasUnsupportedFlexiblePeriodInput(query)) return yield* failInvalidV9SearchInput("Legacy v9 search does not support flexible period query parameters \"month\", \"dates\", \"nights\", or \"weekend\". Use \"start\" and \"end\" for a fixed period.");
|
|
181
184
|
const compositionResult = expandCustomAttributeFilterCompositions({
|
|
182
185
|
capabilities: makeV9CustomAttributeFilterCapabilities(customAttributeFilterDefinitions),
|
|
183
186
|
customAttributeFilterDefinitions,
|
|
@@ -221,21 +224,41 @@ const toQueryInput = ({ query, sort, customAttributeFilterDefinitions, locale, t
|
|
|
221
224
|
alternatives: true,
|
|
222
225
|
sorting: toVofficeSorting(sort)
|
|
223
226
|
},
|
|
224
|
-
basicQueryInputs
|
|
227
|
+
basicQueryInputs: basicQueryInputs.length > 0 ? basicQueryInputs : null
|
|
225
228
|
},
|
|
226
229
|
unusedFilterKeys: compositionFilters.unusedFilterKeys
|
|
227
230
|
};
|
|
228
231
|
});
|
|
229
232
|
//#endregion
|
|
230
|
-
//#region src/legacy-v9/parser/search/output/to-
|
|
231
|
-
const DEFAULT_V9_SEARCH_CURRENCY
|
|
232
|
-
const
|
|
233
|
-
if (calc?.total == null) return
|
|
234
|
-
|
|
233
|
+
//#region src/legacy-v9/parser/search/output/to-search-price-fields.ts
|
|
234
|
+
const DEFAULT_V9_SEARCH_CURRENCY = "EUR";
|
|
235
|
+
const toSearchPriceFields = ({ locale, calc }) => {
|
|
236
|
+
if (calc?.total == null) return {};
|
|
237
|
+
const formattedTotal = toFormattedSearchPrice({
|
|
235
238
|
amount: calc.total,
|
|
236
|
-
currency: DEFAULT_V9_SEARCH_CURRENCY
|
|
239
|
+
currency: DEFAULT_V9_SEARCH_CURRENCY,
|
|
237
240
|
locale
|
|
238
|
-
})
|
|
241
|
+
});
|
|
242
|
+
if (calc.oTotal == null || calc.oTotal <= calc.total) return { formattedTotal };
|
|
243
|
+
const label = calc.discountName?.trim();
|
|
244
|
+
return {
|
|
245
|
+
formattedTotal,
|
|
246
|
+
discount: {
|
|
247
|
+
formattedOriginalTotal: toFormattedSearchPrice({
|
|
248
|
+
amount: calc.oTotal,
|
|
249
|
+
currency: DEFAULT_V9_SEARCH_CURRENCY,
|
|
250
|
+
locale
|
|
251
|
+
}),
|
|
252
|
+
applied: label == null || label.length === 0 ? [] : [{
|
|
253
|
+
label,
|
|
254
|
+
formattedAmount: toFormattedSearchPrice({
|
|
255
|
+
amount: calc.total - calc.oTotal,
|
|
256
|
+
currency: DEFAULT_V9_SEARCH_CURRENCY,
|
|
257
|
+
locale
|
|
258
|
+
})
|
|
259
|
+
}]
|
|
260
|
+
}
|
|
261
|
+
};
|
|
239
262
|
};
|
|
240
263
|
//#endregion
|
|
241
264
|
//#region src/legacy-v9/parser/search/to-search-output-item.ts
|
|
@@ -258,26 +281,23 @@ const toSearchOutputItem = ({ locale, imageProxyBaseUrl, rentalHighlightPrioriti
|
|
|
258
281
|
attributes: data
|
|
259
282
|
});
|
|
260
283
|
if (highlights != null) item.highlights = highlights;
|
|
261
|
-
|
|
284
|
+
if (includeFormattedTotal) Object.assign(item, toSearchPriceFields({
|
|
262
285
|
locale,
|
|
263
286
|
calc: rental.additional_voffice_data?.calc
|
|
264
|
-
});
|
|
265
|
-
if (includeFormattedTotal && formattedPrice != null) item.formattedTotal = formattedPrice;
|
|
287
|
+
}));
|
|
266
288
|
return item;
|
|
267
289
|
});
|
|
268
290
|
//#endregion
|
|
269
291
|
//#region src/legacy-v9/parser/search/output/to-alternative-periods.ts
|
|
270
|
-
const DEFAULT_V9_SEARCH_CURRENCY = "EUR";
|
|
271
292
|
const toAlternativePeriods = ({ locale, alternatives }) => Effect.succeed((alternatives ?? []).flatMap((alternative) => {
|
|
272
293
|
if (alternative.fromdate == null || alternative.tilldate == null) return [];
|
|
273
294
|
return [{
|
|
274
295
|
start: alternative.fromdate,
|
|
275
296
|
end: alternative.tilldate,
|
|
276
|
-
...
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}) }
|
|
297
|
+
...toSearchPriceFields({
|
|
298
|
+
locale,
|
|
299
|
+
calc: alternative.calc
|
|
300
|
+
})
|
|
281
301
|
}];
|
|
282
302
|
}));
|
|
283
303
|
//#endregion
|
|
@@ -5900,10 +5900,11 @@ const toRentalHighlights = ({ locale, translations, highlightPrioritization, cus
|
|
|
5900
5900
|
const attribute = customAttributes.byKey[highlightKey];
|
|
5901
5901
|
if (attribute === void 0) continue;
|
|
5902
5902
|
const binding = attribute.v9;
|
|
5903
|
+
const value = binding === void 0 ? void 0 : knownAttributes[binding] ?? attributes.unknown[binding];
|
|
5903
5904
|
const highlight = renderResolvedCustomAttribute({
|
|
5904
5905
|
attribute,
|
|
5905
5906
|
locale,
|
|
5906
|
-
value
|
|
5907
|
+
value
|
|
5907
5908
|
});
|
|
5908
5909
|
if (highlight != null) {
|
|
5909
5910
|
highlights.push(highlight);
|
|
@@ -5914,9 +5915,10 @@ const toRentalHighlights = ({ locale, translations, highlightPrioritization, cus
|
|
|
5914
5915
|
if (seenKeys.has(v9Key)) continue;
|
|
5915
5916
|
seenKeys.add(v9Key);
|
|
5916
5917
|
const metadata = VofficeUnitDataPropertyMetadata[v9Key];
|
|
5918
|
+
const label = yield* translate(metadata.labelKey, v9Key);
|
|
5917
5919
|
const highlight = renderLabeledAttributeValue({
|
|
5918
5920
|
key: v9Key,
|
|
5919
|
-
label
|
|
5921
|
+
label,
|
|
5920
5922
|
locale,
|
|
5921
5923
|
value: knownAttributes[v9Key]
|
|
5922
5924
|
});
|
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
"booking.payment.schedule.prepayment.label": "Anzahlung",
|
|
5
5
|
"booking.payment.schedule.rest.label": "Restzahlung",
|
|
6
6
|
"booking.payment.schedule.dueOn": "Zahlbar bis zum",
|
|
7
|
+
"booking.payment.schedule.location.online": "Online zahlbar",
|
|
8
|
+
"booking.payment.schedule.location.onSite": "Vor Ort zahlbar",
|
|
9
|
+
"booking.payment.schedule.location.onSite.partner": "Vor Ort an den Vermieter zu zahlen",
|
|
10
|
+
"booking.payment.schedule.location.onSite.us": "Vor Ort an vOffice zu zahlen",
|
|
11
|
+
"booking.payment.schedule.location.external": "Extern zu zahlen",
|
|
12
|
+
"booking.payment.schedule.location.external.partner": "Extern an den Vermieter zu zahlen",
|
|
13
|
+
"booking.payment.schedule.location.external.us": "Extern an vOffice zu zahlen",
|
|
7
14
|
"booking.payment.schedule.deposit": "Kaution",
|
|
8
15
|
"booking.payment.schedule.price": "Preis",
|
|
9
16
|
"booking.payment.schedule.totalAmount": "Endpreis",
|
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
"booking.payment.schedule.prepayment.label": "Down payment",
|
|
5
5
|
"booking.payment.schedule.rest.label": "Remaining payment",
|
|
6
6
|
"booking.payment.schedule.dueOn": "Payable until",
|
|
7
|
+
"booking.payment.schedule.location.online": "Payable online",
|
|
8
|
+
"booking.payment.schedule.location.onSite": "Payable on site",
|
|
9
|
+
"booking.payment.schedule.location.onSite.partner": "Payable on site to the host",
|
|
10
|
+
"booking.payment.schedule.location.onSite.us": "Payable on site to vOffice",
|
|
11
|
+
"booking.payment.schedule.location.external": "Payable externally",
|
|
12
|
+
"booking.payment.schedule.location.external.partner": "Payable externally to the host",
|
|
13
|
+
"booking.payment.schedule.location.external.us": "Payable externally to vOffice",
|
|
7
14
|
"booking.payment.schedule.deposit": "Deposit",
|
|
8
15
|
"booking.payment.schedule.price": "Price",
|
|
9
16
|
"booking.payment.schedule.totalAmount": "Final price",
|
|
@@ -4,6 +4,8 @@ This file is the versioned changelog index for the website SDK instructions.
|
|
|
4
4
|
|
|
5
5
|
## Versions
|
|
6
6
|
|
|
7
|
+
- `versions/2.13.0/CHANGELOG.md`: `@v-office/website-sdk` 2.13.0 release notes.
|
|
8
|
+
- `versions/2.12.0/CHANGELOG.md`: `@v-office/website-sdk` 2.12.0 release notes.
|
|
7
9
|
- `versions/2.11.0/CHANGELOG.md`: `@v-office/website-sdk` 2.11.0 release notes.
|
|
8
10
|
- `versions/2.10.0/CHANGELOG.md`: `@v-office/website-sdk` 2.10.0 release notes.
|
|
9
11
|
- `versions/2.9.0/CHANGELOG.md`: `@v-office/website-sdk` 2.9.0 release notes.
|
|
@@ -4,6 +4,8 @@ This file is the versioned migration index for the website SDK instructions.
|
|
|
4
4
|
|
|
5
5
|
## Available Guides
|
|
6
6
|
|
|
7
|
+
- `versions/2.13.0/MIGRATION.md`: migrate from `@v-office/website-sdk` 2.12.0 to 2.13.0.
|
|
8
|
+
- `versions/2.12.0/MIGRATION.md`: migrate from `@v-office/website-sdk` 2.11.0 to 2.12.0.
|
|
7
9
|
- `versions/2.11.0/MIGRATION.md`: migrate from `@v-office/website-sdk` 2.10.0 to 2.11.0.
|
|
8
10
|
- `versions/2.10.0/MIGRATION.md`: migrate from `@v-office/website-sdk` 2.9.0 to 2.10.0.
|
|
9
11
|
- `versions/2.9.0/MIGRATION.md`: migrate from `@v-office/website-sdk` 2.8.0 to 2.9.0.
|
package/instructions/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Website SDK Instructions
|
|
2
2
|
|
|
3
3
|
These instructions describe the current source targeted for
|
|
4
|
-
`@v-office/website-sdk` 2.
|
|
4
|
+
`@v-office/website-sdk` 2.13.0. Package versions remain unchanged until the release
|
|
5
5
|
workflow performs the coordinated core and website bumps.
|
|
6
6
|
|
|
7
7
|
Use this directory as the consumer-facing reference for the package:
|
|
@@ -12,12 +12,18 @@ Use this directory as the consumer-facing reference for the package:
|
|
|
12
12
|
- `custom-attributes.md`: custom attribute catalog, configuration, per-backend behaviour, and the v9-to-v10 move.
|
|
13
13
|
- `search.md`: `sdk.live.search.search`.
|
|
14
14
|
- `availability.md`: date-picker availability flows.
|
|
15
|
-
- `quote.md`: quote, additional services, cancellation policy, and insurance flows.
|
|
15
|
+
- `quote.md`: quote booking-card modifiers, additional services, cancellation policy, and insurance flows.
|
|
16
16
|
- `booking.md`: booking and payment option submission.
|
|
17
17
|
- `contact.md`: contact submission.
|
|
18
18
|
- `document-structured-json.md`: `sdk.static.documents.getTermsAndPrivacyPolicy` and structured document JSON rendering rules.
|
|
19
19
|
- `CHANGELOG.md`: versioned changelog index.
|
|
20
20
|
- `MIGRATION.md`: versioned migration index.
|
|
21
|
+
- `versions/2.13.0/`: 2.13.0 static search capability discovery, shared v9/v10
|
|
22
|
+
booking-payment output, corrected remaining-payment deadlines, opaque booking
|
|
23
|
+
credentials, and the 2.12.0-to-2.13.0 migration guide.
|
|
24
|
+
- `versions/2.12.0/`: 2.12.0 legacy-v9 search discounts, empty-query browsing,
|
|
25
|
+
and flexible-period rejection; quote booking-card cleanup; and v10 modifier
|
|
26
|
+
guidance, plus the 2.11.0-to-2.12.0 migration guide.
|
|
21
27
|
- `versions/2.11.0/`: 2.11.0 search-discount release notes and
|
|
22
28
|
2.10.0-to-2.11.0 migration guide.
|
|
23
29
|
- `versions/2.10.0/`: 2.10.0 option-booking release notes and 2.9.0-to-2.10.0 migration guide.
|
|
@@ -39,7 +45,9 @@ Use this directory as the consumer-facing reference for the package:
|
|
|
39
45
|
pnpm add @v-office/website-sdk
|
|
40
46
|
```
|
|
41
47
|
|
|
42
|
-
The package is ESM-only
|
|
48
|
+
The package is ESM-only. It exports the SDK facade from `@v-office/website-sdk`
|
|
49
|
+
and instance-independent search capability helpers from
|
|
50
|
+
`@v-office/website-sdk/capabilities/search`.
|
|
43
51
|
|
|
44
52
|
## Quick Start
|
|
45
53
|
|
|
@@ -79,5 +87,5 @@ website-sdk --backend v10 search --locale de-DE --query "adults=2" --sort '{"by"
|
|
|
79
87
|
```
|
|
80
88
|
|
|
81
89
|
Config file examples in these docs use the flat `WebsiteSDKConfig` shape introduced
|
|
82
|
-
in 2.0.0 and kept in 2.
|
|
90
|
+
in 2.0.0 and kept in 2.13.0. v10 config additionally requires `searchEndpoint` as
|
|
83
91
|
of 2.5.0.
|
package/instructions/booking.md
CHANGED
|
@@ -78,47 +78,63 @@ Sample:
|
|
|
78
78
|
```json
|
|
79
79
|
{
|
|
80
80
|
"bookingNumber": "B-2026-0001",
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
81
|
+
"payment": {
|
|
82
|
+
"schedule": [
|
|
83
|
+
{
|
|
84
|
+
"kind": "prepayment",
|
|
85
|
+
"label": "Down payment",
|
|
86
|
+
"amount": "€76.00",
|
|
87
|
+
"dueOn": "Payable until August 19, 2026",
|
|
88
|
+
"paymentOptions": [
|
|
89
|
+
{
|
|
90
|
+
"kind": "bank_transfer",
|
|
91
|
+
"label": "Bank transfer",
|
|
92
|
+
"holder": "Example GmbH",
|
|
93
|
+
"iban": "DE02120300000000202051",
|
|
94
|
+
"swiftOrBic": "BYLADEM1001",
|
|
95
|
+
"remittanceText": "Booking number: B-2026-0001"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"kind": "remaining_payment",
|
|
101
|
+
"label": "Remaining payment",
|
|
102
|
+
"amount": "€304.00",
|
|
103
|
+
"dueOn": "Payable until February 6, 2027"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"alternatives": [
|
|
107
|
+
{
|
|
108
|
+
"kind": "full_amount",
|
|
109
|
+
"label": "Total payment",
|
|
110
|
+
"amount": "€380.00",
|
|
111
|
+
"paymentOptions": [
|
|
112
|
+
{
|
|
113
|
+
"kind": "bank_transfer",
|
|
114
|
+
"label": "Bank transfer",
|
|
115
|
+
"holder": "Example GmbH",
|
|
116
|
+
"iban": "DE02120300000000202051",
|
|
117
|
+
"swiftOrBic": "BYLADEM1001",
|
|
118
|
+
"remittanceText": "Booking number: B-2026-0001"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
119
124
|
}
|
|
120
125
|
```
|
|
121
126
|
|
|
127
|
+
`payment.schedule` contains the remaining contractual payment steps known to the backend. Its `kind` is one of `prepayment`, `remaining_payment`, `installment`, or `deposit`. `v9` emits named prepayment and remaining-payment steps; `v10` emits its backend-provided installment and deposit steps.
|
|
128
|
+
|
|
129
|
+
`payment.alternatives` contains ways to settle the complete outstanding balance. A `full_amount` alternative has no inferred deadline. `dueOn`, `paymentAt`, labels, amounts, and line amounts are already translated and formatted for the booking locale.
|
|
130
|
+
|
|
131
|
+
`paymentOptions` is present only when the SDK can currently perform that payment. Future or on-site steps remain visible without payment options.
|
|
132
|
+
|
|
133
|
+
An optional `insurancePaymentOptions` array is returned only when post-booking insurance payment is available.
|
|
134
|
+
|
|
135
|
+
Sites upgrading from 2.12.0 must replace the former `paymentSchedules` output. See
|
|
136
|
+
`versions/2.13.0/MIGRATION.md`.
|
|
137
|
+
|
|
122
138
|
Payment option variants:
|
|
123
139
|
|
|
124
140
|
- `bank_transfer`: display-only payment details.
|
|
@@ -153,13 +169,13 @@ try {
|
|
|
153
169
|
|
|
154
170
|
Online payment providers return the guest to a URL derived from `relativeRedirectUrl`. Stripe returns to that path with `payment=stripe&success=true` after payment and `payment=stripe&cancel=true` after cancellation, so the path must exist in your site and should read those query parameters.
|
|
155
171
|
|
|
156
|
-
`relativeRedirectUrl` is supplied before the reservation exists, so the return URL cannot carry the booking number
|
|
172
|
+
`relativeRedirectUrl` is supplied before the reservation exists, so the return URL cannot carry the booking number. Persist whatever the return page needs, for example in `sessionStorage`, before submitting a payment option.
|
|
157
173
|
|
|
158
174
|
A successful return means the provider sent the browser back, not that the payment has settled. Confirmation reaches vOffice through the provider's webhook.
|
|
159
175
|
|
|
160
176
|
## Configuration
|
|
161
177
|
|
|
162
|
-
Booking requests are rate-limited to one backend request per second with a queue size of five. `v9` books through the v0 `book` action and initializes
|
|
178
|
+
Booking requests are rate-limited to one backend request per second with a queue size of five. `v9` books through the v0 `book` action and initializes Stripe only for currently payable choices when the property has Stripe enabled. `v10` books through GraphQL, preserves all remaining payment steps for display, and initializes Adyen for the next payable online step and the full-outstanding alternative.
|
|
163
179
|
|
|
164
180
|
## CLI Usage
|
|
165
181
|
|
package/instructions/quote.md
CHANGED
|
@@ -62,13 +62,13 @@ Sample:
|
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
Dates are local dates formatted as `YYYY-MM-DD`. For `v9`, `rentalId` must be a numeric vOffice unit id.
|
|
65
|
-
Both backends accept `voucher` on quote and booking flows. `v10
|
|
65
|
+
Both backends accept `voucher` on quote and booking flows. On `v10`, applied voucher and non-voucher modifiers can be exposed through the booking-card fields described below. `v9` reflects voucher effects in quoted totals but does not expose booking-card modifier details.
|
|
66
66
|
|
|
67
67
|
## Output
|
|
68
68
|
|
|
69
69
|
Returns `Promise<GuestQuoteResult>`.
|
|
70
70
|
|
|
71
|
-
Available sample:
|
|
71
|
+
Available sample without modifiers:
|
|
72
72
|
|
|
73
73
|
```json
|
|
74
74
|
{
|
|
@@ -139,6 +139,94 @@ Unavailable sample:
|
|
|
139
139
|
|
|
140
140
|
Selection methods return `{ ok: true, quote }` or `{ ok: false, error }`. Possible selection errors include unknown additional service, additional service limit exceeded, unknown cancellation policy, unavailable cancellation policy quote, and unavailable quote combination.
|
|
141
141
|
|
|
142
|
+
## Booking-Card Breakdown
|
|
143
|
+
|
|
144
|
+
Booking-card sections are returned in display order. On both v9 and v10, the SDK
|
|
145
|
+
omits numeric zero-value lines without subitems from the included, tax, and other
|
|
146
|
+
breakdown sections. If no lines remain in a section, the section is omitted.
|
|
147
|
+
Non-zero lines are unchanged, including when they share an `other` section with a
|
|
148
|
+
filtered zero-value line.
|
|
149
|
+
|
|
150
|
+
A zero-total line with subitems can remain because those subitems carry
|
|
151
|
+
descriptive content. Do not use the absence or presence of a zero-value price row
|
|
152
|
+
as service-selection state; use the quote's explicit service or selection data.
|
|
153
|
+
|
|
154
|
+
### Modifiers and Pre-Modifier Totals
|
|
155
|
+
|
|
156
|
+
On `v10`, a booking-card item at
|
|
157
|
+
`bookingCardInformation.sections[].lines[].item` can include these optional
|
|
158
|
+
fields:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
{
|
|
162
|
+
modifiers?: readonly {
|
|
163
|
+
label: string;
|
|
164
|
+
amount: string;
|
|
165
|
+
}[];
|
|
166
|
+
totalBeforeModifiers?: string;
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`modifiers` contains localized, formatted adjustments applied to that item. A
|
|
171
|
+
negative amount represents a deduction and a positive amount represents a
|
|
172
|
+
surcharge. The SDK groups backend modifiers with the same label and formats their
|
|
173
|
+
summed amount as one entry. The field is omitted when the item has no modifiers.
|
|
174
|
+
|
|
175
|
+
`item.totalBeforeModifiers` is the formatted item amount before its modifiers. It
|
|
176
|
+
is present when the item has a non-zero net modifier effect and the amount can be
|
|
177
|
+
derived; otherwise it is omitted. `item.appliedCharge` remains the final amount
|
|
178
|
+
after modifiers.
|
|
179
|
+
|
|
180
|
+
The booking card itself can also include
|
|
181
|
+
`bookingCardInformation.totalBeforeModifiers`. It is the formatted whole-card
|
|
182
|
+
total before all backend modifiers and is present when those modifiers have a
|
|
183
|
+
non-zero net effect. It is omitted when there are no modifiers or their amounts
|
|
184
|
+
net to zero. The SDK derives quote pre-modifier totals from the final amounts and
|
|
185
|
+
modifier values.
|
|
186
|
+
|
|
187
|
+
Items in the included, tax, and other sections carry their adjustments in
|
|
188
|
+
`item.modifiers`; do not expect those adjustments to be separate section lines.
|
|
189
|
+
Negative modifiers on backend lines that cannot be mapped to those sections may
|
|
190
|
+
instead appear as dedicated booking-card lines. `v9` quote cards omit
|
|
191
|
+
`modifiers` and both `totalBeforeModifiers` fields.
|
|
192
|
+
|
|
193
|
+
Discounted `v10` example for locale `de-DE`:
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"bookingCardInformation": {
|
|
198
|
+
"sections": [
|
|
199
|
+
{
|
|
200
|
+
"lines": [
|
|
201
|
+
{
|
|
202
|
+
"item": {
|
|
203
|
+
"position": "Inklusivpreis",
|
|
204
|
+
"appliedCharge": "1.554,00 €",
|
|
205
|
+
"modifiers": [
|
|
206
|
+
{
|
|
207
|
+
"label": "Frühbucher/Last-Minute",
|
|
208
|
+
"amount": "-140,00 €"
|
|
209
|
+
}
|
|
210
|
+
],
|
|
211
|
+
"totalBeforeModifiers": "1.694,00 €"
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
"total": "1.596,70 €",
|
|
218
|
+
"totalBeforeModifiers": "1.736,70 €"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
For a price breakdown that keeps its arithmetic visible, render
|
|
224
|
+
`totalBeforeModifiers` as the pre-modifier amount, show each modifier as an
|
|
225
|
+
adjustment row, and use `appliedCharge` or `total` as the resulting final amount.
|
|
226
|
+
The SDK supplies formatted values but does not decide whether a reference price
|
|
227
|
+
should be displayed or struck through; that presentation and its legal
|
|
228
|
+
requirements remain the consuming site's responsibility.
|
|
229
|
+
|
|
142
230
|
## Vouchers
|
|
143
231
|
|
|
144
232
|
When `voucher` is provided in the quote input, an available quote may include `quote.voucher`:
|
|
@@ -153,7 +241,11 @@ When `voucher` is provided in the quote input, an available quote may include `q
|
|
|
153
241
|
|
|
154
242
|
`status` is `"applied"`, `"not_applied"`, or `"unknown"`. `v10` reports `"applied"` when the backend returns a non-zero voucher modifier and `"not_applied"` when no voucher modifier is returned for the requested voucher. `v9` returns `"unknown"` for available voucher quotes because the legacy response does not provide a reliable voucher modifier signal.
|
|
155
243
|
|
|
156
|
-
|
|
244
|
+
Do not assume an applied voucher appears as its own section line. On `v10`, a
|
|
245
|
+
voucher adjustment on an included, tax, or other line appears in that line's
|
|
246
|
+
`item.modifiers`; an unmapped negative modifier can appear as a dedicated line.
|
|
247
|
+
Use `quote.voucher.status` for voucher application status and the booking-card
|
|
248
|
+
fields for price presentation.
|
|
157
249
|
|
|
158
250
|
## Additional Services
|
|
159
251
|
|
|
@@ -301,16 +393,18 @@ quote = await sdk.live.quote.selectInsurancePayment({
|
|
|
301
393
|
});
|
|
302
394
|
```
|
|
303
395
|
|
|
304
|
-
After the rental booking is created, complete insurance booking with the booking
|
|
396
|
+
After the rental booking is created, complete insurance booking with the opaque booking result. Keep the live result object; its private backend credentials are intentionally not serialized:
|
|
305
397
|
|
|
306
398
|
```ts
|
|
307
399
|
const insuranceBooking = await sdk.live.quote.bookInsurance({
|
|
308
400
|
quote,
|
|
309
|
-
|
|
310
|
-
guestToken: booking.guestToken,
|
|
401
|
+
booking,
|
|
311
402
|
});
|
|
312
403
|
```
|
|
313
404
|
|
|
405
|
+
This is a breaking change in 2.13.0. The former public `guestToken` input is no
|
|
406
|
+
longer used; see `versions/2.13.0/MIGRATION.md`.
|
|
407
|
+
|
|
314
408
|
`v9` supports real insurance option refresh, pre-contract, payment selection, and booking. `v10` currently returns a no-insurance placeholder and insurance actions resolve as not required.
|
|
315
409
|
|
|
316
410
|
## Configuration
|