+ ) : null}
+ >
+ )}
+
+ )
+}
diff --git a/constants/booking.ts b/constants/booking.ts
index 664240a79..5b2e47746 100644
--- a/constants/booking.ts
+++ b/constants/booking.ts
@@ -5,3 +5,48 @@ export enum BookingStatusEnum {
}
export const BOOKING_CONFIRMATION_NUMBER = "bookingConfirmationNumber"
+
+export enum PaymentMethodEnum {
+ card = "card",
+ swish = "swish",
+ vipps = "vipps",
+ mobilePay = "mobilePay",
+ applePay = "applePay",
+ googlePay = "googlePay",
+ alipayPlus = "alipayPlus",
+ weChatPay = "weChatPay",
+ payPal = "payPal",
+ klarna = "klarna",
+}
+
+export const PAYMENT_METHOD_TITLES: Record<
+ keyof typeof PaymentMethodEnum,
+ string
+> = {
+ card: "Credit card",
+ swish: "Swish",
+ vipps: "Vipps",
+ mobilePay: "MobilePay",
+ applePay: "Apple Pay",
+ googlePay: "Google Pay",
+ alipayPlus: "Alipay+",
+ weChatPay: "WeChat Pay",
+ payPal: "PayPal",
+ klarna: "Klarna",
+}
+
+export const PAYMENT_METHOD_ICONS: Record<
+ keyof typeof PaymentMethodEnum,
+ string
+> = {
+ card: "/_static/icons/payment/mastercard.svg",
+ swish: "/_static/icons/payment/swish.svg",
+ vipps: "/_static/icons/payment/vipps.svg",
+ mobilePay: "/_static/icons/payment/mobilepay.svg",
+ applePay: "/_static/icons/payment/apple-pay.svg",
+ googlePay: "/_static/icons/payment/google-pay.svg",
+ alipayPlus: "/_static/icons/payment/alipay-plus.svg",
+ weChatPay: "/_static/icons/payment/wechat-pay.svg",
+ payPal: "/_static/icons/payment/paypal.svg",
+ klarna: "/_static/icons/payment/klarna.svg",
+}
diff --git a/constants/currentWebHrefs.ts b/constants/currentWebHrefs.ts
new file mode 100644
index 000000000..d0ebfe954
--- /dev/null
+++ b/constants/currentWebHrefs.ts
@@ -0,0 +1,17 @@
+export const bookingTermsAndConditions = {
+ da: "https://www.scandichotels.dk/kundeservice/priser-og-bookingvilkar/vilkar-og-betingelser3",
+ de: "https://www.scandichotels.de/kundenbetreuung/preise-und-richtlinien/reservierungsbedingungen",
+ en: "https://www.scandichotels.com/customer-service/rates-and-policies/terms-conditions",
+ fi: "https://www.scandichotels.fi/asiakaspalvelu/hinnat-ja-varausehdot/varausehdot",
+ no: "https://www.scandichotels.no/kundeservice/priser-og-bestillingsvilkar/reservasjonsbetingelser",
+ sv: "https://www.scandichotels.se/kundservice/priser-och-bokningsregler/bokningsregler",
+}
+
+export const privacyPolicy = {
+ da: "https://www.scandichotels.dk/kundeservice/priser-og-bookingvilkar/persondatapolitik",
+ de: "https://www.scandichotels.de/kundenbetreuung/preise-und-richtlinien/reservierungsbedingungen",
+ en: "https://www.scandichotels.com/customer-service/rates-and-policies/privacy-policy",
+ fi: "https://www.scandichotels.fi/asiakaspalvelu/hinnat-ja-varausehdot/tietosuojaseloste",
+ no: "https://www.scandichotels.no/kundeservice/priser-og-bestillingsvilkar/personvernpolicy",
+ sv: "https://www.scandichotels.se/kundservice/priser-och-bokningsregler/integritetspolicy",
+}
diff --git a/constants/routes/hotelReservation.js b/constants/routes/hotelReservation.js
index 23e8c0354..2224b17b6 100644
--- a/constants/routes/hotelReservation.js
+++ b/constants/routes/hotelReservation.js
@@ -59,7 +59,7 @@ export const details = {
}
// TODO: Translate paths
-export const payments = {
+export const payment = {
en: `${hotelReservation.en}/payment`,
sv: `${hotelReservation.sv}/payment`,
no: `${hotelReservation.no}/payment`,
@@ -78,24 +78,14 @@ export const selectHotelMap = {
de: `${selectHotel.de}/map`,
}
-/** @type {import('@/types/routes').LangRoute} */
-export const payment = {
- en: `${hotelReservation.en}/payment`,
- sv: `${hotelReservation.sv}/betalning`,
- no: `${hotelReservation.no}/betaling`,
- fi: `${hotelReservation.fi}/maksu`,
- da: `${hotelReservation.da}/payment`,
- de: `${hotelReservation.de}/bezahlung`,
-}
-
/** @type {import('@/types/routes').LangRoute} */
export const bookingConfirmation = {
en: `${hotelReservation.en}/booking-confirmation`,
- sv: `${hotelReservation.sv}/bokningsbekraftelse`,
+ sv: `${hotelReservation.sv}/booking-confirmation`,
no: `${hotelReservation.no}/booking-confirmation`,
- fi: `${hotelReservation.fi}/varausvahvistus`,
+ fi: `${hotelReservation.fi}/booking-confirmation`,
da: `${hotelReservation.da}/booking-confirmation`,
- de: `${hotelReservation.de}/buchungsbesttigung`,
+ de: `${hotelReservation.de}/booking-confirmation`,
}
export const bookingFlow = [
@@ -103,7 +93,8 @@ export const bookingFlow = [
...Object.values(selectBed),
...Object.values(breakfast),
...Object.values(details),
- ...Object.values(payments),
+ ...Object.values(payment),
...Object.values(selectHotelMap),
+ ...Object.values(bookingConfirmation),
...Object.values(selectRate),
]
diff --git a/i18n/dictionaries/da.json b/i18n/dictionaries/da.json
index c9fa31e4b..0a11b3077 100644
--- a/i18n/dictionaries/da.json
+++ b/i18n/dictionaries/da.json
@@ -37,6 +37,7 @@
"booking.guests": "Maks {nrOfGuests, plural, one {# gæst} other {# gæster}}",
"booking.nights": "{totalNights, plural, one {# nat} other {# nætter}}",
"booking.rooms": "{totalRooms, plural, one {# værelse} other {# værelser}}",
+ "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
"Breakfast": "Morgenmad",
"Breakfast buffet": "Morgenbuffet",
"Breakfast excluded": "Morgenmad ikke inkluderet",
@@ -73,6 +74,7 @@
"Could not find requested resource": "Kunne ikke finde den anmodede ressource",
"Country": "Land",
"Country code": "Landekode",
+ "Credit card": "Kreditkort",
"Credit card deleted successfully": "Kreditkort blev slettet",
"Currency Code": "DKK",
"Current password": "Nuværende kodeord",
@@ -130,12 +132,14 @@
"Hotels": "Hoteller",
"How do you want to sleep?": "Hvordan vil du sove?",
"How it works": "Hvordan det virker",
+ "I would like to get my booking confirmation via sms": "Jeg vil gerne få min booking bekræftelse via SMS",
"Image gallery": "Billedgalleri",
"Included": "Inkluderet",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Det er ikke muligt at administrere dine kommunikationspræferencer lige nu, prøv venligst igen senere eller kontakt support, hvis problemet fortsætter.",
"Join at no cost": "Tilmeld dig uden omkostninger",
"Join Scandic Friends": "Tilmeld dig Scandic Friends",
"King bed": "Kingsize-seng",
+ "km to city center": "km til byens centrum",
"Language": "Sprog",
"Lastname": "Efternavn",
"Latest searches": "Seneste søgninger",
@@ -248,8 +252,8 @@
"Save": "Gemme",
"Scandic Friends Mastercard": "Scandic Friends Mastercard",
"Scandic Friends Point Shop": "Scandic Friends Point Shop",
- "Search": "Søge",
"Scandic's Privacy Policy.": "Scandic's integritetspolicy.",
+ "Search": "Søge",
"See all photos": "Se alle billeder",
"See hotel details": "Se hoteloplysninger",
"See room details": "Se værelsesdetaljer",
@@ -289,7 +293,6 @@
"Things nearby HOTEL_NAME": "Ting i nærheden af {hotelName}",
"to": "til",
"Total Points": "Samlet antal point",
- "Total incl VAT": "Inkl. moms",
"Tourist": "Turist",
"Transaction date": "Overførselsdato",
"Transactions": "Transaktioner",
diff --git a/i18n/dictionaries/de.json b/i18n/dictionaries/de.json
index 144fe2ca4..3b764309c 100644
--- a/i18n/dictionaries/de.json
+++ b/i18n/dictionaries/de.json
@@ -37,6 +37,7 @@
"booking.guests": "Max {nrOfGuests, plural, one {# gast} other {# gäste}}",
"booking.nights": "{totalNights, plural, one {# nacht} other {# Nächte}}",
"booking.rooms": "{totalRooms, plural, one {# zimmer} other {# räume}}",
+ "booking.terms": "Ved at betale med en af de tilgængelige betalingsmetoder, accepterer jeg vilkårene for denne booking og de generelle Vilkår og betingelser, og forstår, at Scandic vil behandle min personlige data i forbindelse med denne booking i henhold til Scandics Privatlivspolitik. Jeg accepterer, at Scandic kræver et gyldigt kreditkort under min besøg i tilfælde af, at noget er tilbagebetalt.",
"Breakfast": "Frühstück",
"Breakfast buffet": "Frühstücksbuffet",
"Breakfast excluded": "Frühstück nicht inbegriffen",
@@ -73,6 +74,7 @@
"Could not find requested resource": "Die angeforderte Ressource konnte nicht gefunden werden.",
"Country": "Land",
"Country code": "Landesvorwahl",
+ "Credit card": "Kreditkarte",
"Credit card deleted successfully": "Kreditkarte erfolgreich gelöscht",
"Currency Code": "EUR",
"Current password": "Aktuelles Passwort",
@@ -132,6 +134,7 @@
"Hotels": "Hotels",
"How do you want to sleep?": "Wie möchtest du schlafen?",
"How it works": "Wie es funktioniert",
+ "I would like to get my booking confirmation via sms": "Ich möchte meine Buchungsbestätigung per SMS erhalten",
"Image gallery": "Bildergalerie",
"Included": "Iinklusive",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Es ist derzeit nicht möglich, Ihre Kommunikationseinstellungen zu verwalten. Bitte versuchen Sie es später erneut oder wenden Sie sich an den Support, wenn das Problem weiterhin besteht.",
@@ -339,8 +342,5 @@
"Zip code": "PLZ",
"Zoo": "Zoo",
"Zoom in": "Vergrößern",
- "Zoom out": "Verkleinern",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}",
- "{width} cm × {length} cm": "{width} cm × {length} cm"
+ "Zoom out": "Verkleinern"
}
diff --git a/i18n/dictionaries/en.json b/i18n/dictionaries/en.json
index d9cc6f9e5..ee9f66a39 100644
--- a/i18n/dictionaries/en.json
+++ b/i18n/dictionaries/en.json
@@ -37,6 +37,7 @@
"booking.guests": "Max {nrOfGuests, plural, one {# guest} other {# guests}}",
"booking.nights": "{totalNights, plural, one {# night} other {# nights}}",
"booking.rooms": "{totalRooms, plural, one {# room} other {# rooms}}",
+ "booking.terms": "By paying with any of the payment methods available, I accept the terms for this booking and the general Terms & Conditions, and understand that Scandic will process my personal data for this booking in accordance with Scandic's Privacy policy. I also accept that Scandic require a valid credit card during my visit in case anything is left unpaid.",
"Breakfast": "Breakfast",
"Breakfast buffet": "Breakfast buffet",
"Breakfast excluded": "Breakfast excluded",
@@ -73,6 +74,7 @@
"Could not find requested resource": "Could not find requested resource",
"Country": "Country",
"Country code": "Country code",
+ "Credit card": "Credit card",
"Credit card deleted successfully": "Credit card deleted successfully",
"Currency Code": "EUR",
"Current password": "Current password",
@@ -132,6 +134,7 @@
"Hotels": "Hotels",
"How do you want to sleep?": "How do you want to sleep?",
"How it works": "How it works",
+ "I would like to get my booking confirmation via sms": "I would like to get my booking confirmation via sms",
"Image gallery": "Image gallery",
"Included": "Included",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.",
@@ -219,6 +222,7 @@
"Please enter a valid phone number": "Please enter a valid phone number",
"points": "Points",
"Points": "Points",
+ "points": "Points",
"Points being calculated": "Points being calculated",
"Points earned prior to May 1, 2021": "Points earned prior to May 1, 2021",
"Points may take up to 10 days to be displayed.": "Points may take up to 10 days to be displayed.",
@@ -338,8 +342,5 @@
"Zip code": "Zip code",
"Zoo": "Zoo",
"Zoom in": "Zoom in",
- "Zoom out": "Zoom out",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}",
- "{width} cm × {length} cm": "{width} cm × {length} cm"
+ "Zoom out": "Zoom out"
}
diff --git a/i18n/dictionaries/fi.json b/i18n/dictionaries/fi.json
index 9ccd7a0c0..b0606434e 100644
--- a/i18n/dictionaries/fi.json
+++ b/i18n/dictionaries/fi.json
@@ -37,6 +37,7 @@
"booking.guests": "Max {nrOfGuests, plural, one {# vieras} other {# vieraita}}",
"booking.nights": "{totalNights, plural, one {# yö} other {# yötä}}",
"booking.rooms": "{totalRooms, plural, one {# huone} other {# sviitti}}",
+ "booking.terms": "Maksamalla minkä tahansa saatavilla olevan maksutavan avulla hyväksyn tämän varauksen ehdot ja yleiset ehdot ja ehtoja, ja ymmärrän, että Scandic käsittelee minun henkilötietoni tässä varauksessa mukaisesti Scandicin tietosuojavaltuuden mukaisesti. Hyväksyn myös, että Scandic vaatii validin luottokortin majoituksen ajan, jos jokin jää maksamatta.",
"Breakfast": "Aamiainen",
"Breakfast buffet": "Aamiaisbuffet",
"Breakfast excluded": "Aamiainen ei sisälly",
@@ -73,6 +74,7 @@
"Could not find requested resource": "Pyydettyä resurssia ei löytynyt",
"Country": "Maa",
"Country code": "Maatunnus",
+ "Credit card": "Luottokortti",
"Credit card deleted successfully": "Luottokortti poistettu onnistuneesti",
"Currency Code": "EUR",
"Current password": "Nykyinen salasana",
@@ -132,6 +134,7 @@
"Hotels": "Hotellit",
"How do you want to sleep?": "Kuinka haluat nukkua?",
"How it works": "Kuinka se toimii",
+ "I would like to get my booking confirmation via sms": "Haluan saada varauksen vahvistuksen SMS-viestillä",
"Image gallery": "Kuvagalleria",
"Included": "Sisälly hintaan",
"It is not posible to manage your communication preferences right now, please try again later or contact support if the problem persists.": "Viestintäasetuksiasi ei voi hallita juuri nyt. Yritä myöhemmin uudelleen tai ota yhteyttä tukeen, jos ongelma jatkuu.",
@@ -339,8 +342,5 @@
"Zip code": "Postinumero",
"Zoo": "Eläintarha",
"Zoom in": "Lähennä",
- "Zoom out": "Loitonna",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}",
- "{width} cm × {length} cm": "{width} cm × {length} cm"
+ "Zoom out": "Loitonna"
}
diff --git a/i18n/dictionaries/sv.json b/i18n/dictionaries/sv.json
index 64076bbf1..39bd19abf 100644
--- a/i18n/dictionaries/sv.json
+++ b/i18n/dictionaries/sv.json
@@ -36,6 +36,7 @@
"booking.guests": "Max {nrOfGuests, plural, one {# gäst} other {# gäster}}",
"booking.nights": "{totalNights, plural, one {# natt} other {# nätter}}",
"booking.rooms": "{totalRooms, plural, one {# rum} other {# rum}}",
+ "booking.terms": "Genom att betala med någon av de tillgängliga betalningsmetoderna accepterar jag villkoren för denna bokning och de generella Villkoren och villkoren, och förstår att Scandic kommer att behandla min personliga data i samband med denna bokning i enlighet med Scandics integritetspolicy. Jag accepterar att Scandic kräver ett giltigt kreditkort under min besök i fall att något är tillbaka betalt.",
"Breakfast": "Frukost",
"Breakfast buffet": "Frukostbuffé",
"Breakfast excluded": "Frukost ingår ej",
@@ -336,8 +337,5 @@
"Zip code": "Postnummer",
"Zoo": "Djurpark",
"Zoom in": "Zooma in",
- "Zoom out": "Zooma ut",
- "{amount} {currency}": "{amount} {currency}",
- "{difference}{amount} {currency}": "{difference}{amount} {currency}",
- "{width} cm × {length} cm": "{width} cm × {length} cm"
+ "Zoom out": "Zooma ut"
}
diff --git a/public/_static/icons/payment/american-express.svg b/public/_static/icons/payment/american-express.svg
new file mode 100644
index 000000000..cbf62d4d4
--- /dev/null
+++ b/public/_static/icons/payment/american-express.svg
@@ -0,0 +1,17 @@
+
diff --git a/public/_static/icons/payment/apple-pay.svg b/public/_static/icons/payment/apple-pay.svg
new file mode 100644
index 000000000..4ead34d6d
--- /dev/null
+++ b/public/_static/icons/payment/apple-pay.svg
@@ -0,0 +1,21 @@
+
diff --git a/public/_static/icons/payment/card-generic.svg b/public/_static/icons/payment/card-generic.svg
new file mode 100644
index 000000000..e57873694
--- /dev/null
+++ b/public/_static/icons/payment/card-generic.svg
@@ -0,0 +1,21 @@
+
diff --git a/public/_static/icons/payment/dankort.svg b/public/_static/icons/payment/dankort.svg
new file mode 100644
index 000000000..e5924aee2
--- /dev/null
+++ b/public/_static/icons/payment/dankort.svg
@@ -0,0 +1,16 @@
+
diff --git a/public/_static/icons/payment/diners-club.svg b/public/_static/icons/payment/diners-club.svg
new file mode 100644
index 000000000..866d5687c
--- /dev/null
+++ b/public/_static/icons/payment/diners-club.svg
@@ -0,0 +1,16 @@
+
diff --git a/public/_static/icons/payment/discover.svg b/public/_static/icons/payment/discover.svg
new file mode 100644
index 000000000..f782c92fb
--- /dev/null
+++ b/public/_static/icons/payment/discover.svg
@@ -0,0 +1,28 @@
+
diff --git a/public/_static/icons/payment/google-pay.svg b/public/_static/icons/payment/google-pay.svg
new file mode 100644
index 000000000..e7d6d3a9b
--- /dev/null
+++ b/public/_static/icons/payment/google-pay.svg
@@ -0,0 +1,18 @@
+
diff --git a/public/_static/icons/payment/jcb.svg b/public/_static/icons/payment/jcb.svg
new file mode 100644
index 000000000..b1cf701b3
--- /dev/null
+++ b/public/_static/icons/payment/jcb.svg
@@ -0,0 +1,48 @@
+
diff --git a/public/_static/icons/payment/klarna.svg b/public/_static/icons/payment/klarna.svg
new file mode 100644
index 000000000..74c0b8419
--- /dev/null
+++ b/public/_static/icons/payment/klarna.svg
@@ -0,0 +1,11 @@
+
diff --git a/public/_static/icons/payment/maestro.svg b/public/_static/icons/payment/maestro.svg
new file mode 100644
index 000000000..d01d068c7
--- /dev/null
+++ b/public/_static/icons/payment/maestro.svg
@@ -0,0 +1,15 @@
+
diff --git a/public/_static/icons/payment/mastercard.svg b/public/_static/icons/payment/mastercard.svg
new file mode 100644
index 000000000..994a38700
--- /dev/null
+++ b/public/_static/icons/payment/mastercard.svg
@@ -0,0 +1,15 @@
+
diff --git a/public/_static/icons/payment/mobilepay.svg b/public/_static/icons/payment/mobilepay.svg
new file mode 100644
index 000000000..45201136d
--- /dev/null
+++ b/public/_static/icons/payment/mobilepay.svg
@@ -0,0 +1,51 @@
+
diff --git a/public/_static/icons/payment/paypal.svg b/public/_static/icons/payment/paypal.svg
new file mode 100644
index 000000000..8e59e2886
--- /dev/null
+++ b/public/_static/icons/payment/paypal.svg
@@ -0,0 +1,17 @@
+
diff --git a/public/_static/icons/payment/swish.svg b/public/_static/icons/payment/swish.svg
new file mode 100644
index 000000000..b2a0e7815
--- /dev/null
+++ b/public/_static/icons/payment/swish.svg
@@ -0,0 +1,38 @@
+
diff --git a/public/_static/icons/payment/unionpay.svg b/public/_static/icons/payment/unionpay.svg
new file mode 100644
index 000000000..ab53e6e5d
--- /dev/null
+++ b/public/_static/icons/payment/unionpay.svg
@@ -0,0 +1,24 @@
+
diff --git a/public/_static/icons/payment/vipps.svg b/public/_static/icons/payment/vipps.svg
new file mode 100644
index 000000000..2ce0f776e
--- /dev/null
+++ b/public/_static/icons/payment/vipps.svg
@@ -0,0 +1,16 @@
+
diff --git a/public/_static/icons/payment/visa.svg b/public/_static/icons/payment/visa.svg
new file mode 100644
index 000000000..3c07340d8
--- /dev/null
+++ b/public/_static/icons/payment/visa.svg
@@ -0,0 +1,16 @@
+
diff --git a/server/routers/booking/output.ts b/server/routers/booking/output.ts
index dbc8101df..7535aac6e 100644
--- a/server/routers/booking/output.ts
+++ b/server/routers/booking/output.ts
@@ -5,9 +5,10 @@ export const createBookingSchema = z
data: z.object({
attributes: z.object({
confirmationNumber: z.string(),
- cancellationNumber: z.string().optional(),
+ cancellationNumber: z.string().nullable(),
reservationStatus: z.string(),
- paymentUrl: z.string().optional(),
+ paymentUrl: z.string().nullable(),
+ metadata: z.any(), // TODO: define metadata schema (not sure what it does)
}),
type: z.string(),
id: z.string(),