mts-booking-library 1.2.35 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,705 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
65
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
66
+ if (ar || !(i in from)) {
67
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
68
+ ar[i] = from[i];
69
+ }
70
+ }
71
+ return to.concat(ar || Array.prototype.slice.call(from));
72
+ };
73
+ Object.defineProperty(exports, "__esModule", { value: true });
74
+ exports.TplBooking = void 0;
75
+ var config_1 = require("../config");
76
+ var mtsStorage_1 = require("../mtsStorage");
77
+ var ErrorResponse_1 = require("../types/ErrorResponse");
78
+ var Reduction_1 = require("../types/common/Reduction");
79
+ var processBookingSteps_1 = require("../utils/processBookingSteps");
80
+ var booking_1 = require("./booking");
81
+ var TplBooking = /** @class */ (function (_super) {
82
+ __extends(TplBooking, _super);
83
+ /**
84
+ * This is the constructor of the TplBooking class.
85
+ * @param {MTSEnvs} env The environment in which the app is running. Can be "DEV", "STAGING" or "PROD"
86
+ * @param {string} sub_key The subscription key for using the APIs
87
+ * @param {boolean} [debug=false] If true, the app will run in debug mode (meaning that will print requests and responses in the console)
88
+ * @param {string} [language=Booking.Languages.EN] The language in which the app is running. Can be "it", "en", "fr", "de" or "es"
89
+ * @param {string} [access_token=undefined] The access token for calling MTS APIs
90
+ * @param {number} [sellerId=undefined] The id of the seller. If not set, it will return the results for all sellers
91
+ * @param {number} [resellerId=undefined] The id of the reseller.
92
+ */
93
+ function TplBooking(env, sub_key, debug, language, access_token, sellerId, resellerId) {
94
+ if (debug === void 0) { debug = false; }
95
+ if (language === void 0) { language = booking_1.Booking.Languages.EN; }
96
+ // Call Booking constructor
97
+ var _this = _super.call(this, env, sub_key, booking_1.Booking.BookingTypes.TPL, debug, language, access_token, sellerId, resellerId) || this;
98
+ // Set cartId
99
+ var cartId = _this.getStorage().getState().cartId;
100
+ if (cartId) {
101
+ _this.cartId = cartId;
102
+ }
103
+ return _this;
104
+ }
105
+ TplBooking.prototype.getStorage = function () {
106
+ if (this.config.ENV !== config_1.MTSEnvs.TEST) {
107
+ return (0, mtsStorage_1.useMtsBookingState)();
108
+ }
109
+ return (0, mtsStorage_1.useTestState)();
110
+ };
111
+ TplBooking.prototype.getCart = function () {
112
+ return this.cart;
113
+ };
114
+ TplBooking.prototype.resetBooking = function () {
115
+ this.cart = undefined;
116
+ this.cartId = undefined;
117
+ this.bookingStepsToStatus = new Map();
118
+ this.bookingDueDate = undefined;
119
+ try {
120
+ this.getStorage().getState().updateCartId(undefined);
121
+ }
122
+ catch (e) {
123
+ if (this.config.ENV !== config_1.MTSEnvs.TEST) {
124
+ throw new Error("Error while deleting cartId from storage");
125
+ }
126
+ console.log(e);
127
+ }
128
+ };
129
+ TplBooking.prototype.fetchAndSetCart = function (cartId) {
130
+ return __awaiter(this, void 0, void 0, function () {
131
+ var _this = this;
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0: return [4 /*yield*/, this.fetchCart(cartId).then(function (cart) {
135
+ if (cart) {
136
+ var cartDate = new Date(cart.bookingDueDate);
137
+ if (cartDate > new Date() && !cart.hasIssuedTickets) {
138
+ _this.cart = cart;
139
+ _this.cartId = cart.id;
140
+ _this.bookingDueDate = cartDate; // See Booking class
141
+ // Update the sellerId. This is particularly important in Linkavel
142
+ _this.updateSellerId(cart.sellerId);
143
+ // Fill the booking process status
144
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(cart.stepsToStatus);
145
+ }
146
+ else {
147
+ // This should never happen, but just in case
148
+ _this.resetBooking();
149
+ }
150
+ }
151
+ })];
152
+ case 1:
153
+ _a.sent();
154
+ return [2 /*return*/];
155
+ }
156
+ });
157
+ });
158
+ };
159
+ TplBooking.prototype.fetchCart = function (cartId) {
160
+ return __awaiter(this, void 0, void 0, function () {
161
+ var url;
162
+ var _this = this;
163
+ return __generator(this, function (_a) {
164
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
166
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
167
+ _this.resetBooking();
168
+ throw new Error(response);
169
+ }
170
+ // Check that the cart doe not have issued tickets
171
+ if (response.cart.hasIssuedTickets) {
172
+ _this.resetBooking();
173
+ }
174
+ return response.cart;
175
+ })];
176
+ });
177
+ });
178
+ };
179
+ /**
180
+ * This method allows to delete a cart, thus allowing the user to exit from the booking process.
181
+ * @returns An {@link ErrorResponse} object in case of error, nothing otherwise. Note that also in case of error, all
182
+ * data will be deleted.
183
+ */
184
+ TplBooking.prototype.deleteCart = function () {
185
+ return __awaiter(this, void 0, void 0, function () {
186
+ var url;
187
+ var _this = this;
188
+ return __generator(this, function (_a) {
189
+ // First check that it is possible to call this API
190
+ if (!this.cart || !this.cartId) {
191
+ throw Error("Cart is not initialized yet");
192
+ }
193
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts?").concat(new URLSearchParams({ cartId: this.cartId.toString() }));
194
+ return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
195
+ // Clear all data
196
+ _this.resetBooking();
197
+ return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response;
198
+ })];
199
+ });
200
+ });
201
+ };
202
+ /**
203
+ * This method allows to get the list of cities where it is possible to book a TPL service.
204
+ * @returns An array of {@link City} objects representing the cities where it is possible to book a TPL service
205
+ * if the call is successful, an {@link ErrorResponse} object otherwise.
206
+ */
207
+ TplBooking.prototype.getCities = function () {
208
+ return __awaiter(this, void 0, void 0, function () {
209
+ var url;
210
+ return __generator(this, function (_a) {
211
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/cities?");
212
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
213
+ return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.cities;
214
+ })];
215
+ });
216
+ });
217
+ };
218
+ /**
219
+ * This method fetches the list of super areas for a given city. A super area is a region of the city in which
220
+ * the TPL service is available at a certain price.
221
+ * @returns An array of {@link SuperArea} objects representing the SuperAreas if the call is successful, an {@link ErrorResponse} object otherwise.
222
+ */
223
+ TplBooking.prototype.getSuperAreas = function (cityId) {
224
+ return __awaiter(this, void 0, void 0, function () {
225
+ var searchParams, url;
226
+ return __generator(this, function (_a) {
227
+ searchParams = new URLSearchParams({ cityId: cityId.toString() });
228
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/superAreasByCity?").concat(searchParams);
229
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
230
+ return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.superAreas;
231
+ })];
232
+ });
233
+ });
234
+ };
235
+ /**
236
+ * This method fetches the list of terms types in a given super area.
237
+ * @returns An array of {@link TermsType} objects representing the available terms types if the call is successful, an {@link ErrorResponse} object otherwise.
238
+ */
239
+ TplBooking.prototype.getTermsTypes = function (superAreaId) {
240
+ return __awaiter(this, void 0, void 0, function () {
241
+ var searchParams, url;
242
+ return __generator(this, function (_a) {
243
+ searchParams = new URLSearchParams({ superAreaId: superAreaId.toString() });
244
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/termsTypesBySuperArea?").concat(searchParams);
245
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
246
+ return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.termsTypes;
247
+ })];
248
+ });
249
+ });
250
+ };
251
+ /**
252
+ * This method fetches the list of available tariffs for the selected terms type in a given super area.
253
+ * @returns An array of {@link GetTariffsResponse} if the call is successful, an {@link ErrorResponse} object otherwise.
254
+ */
255
+ TplBooking.prototype.getTariffs = function (superAreaId, termsTypeId) {
256
+ return __awaiter(this, void 0, void 0, function () {
257
+ var searchParams, url;
258
+ return __generator(this, function (_a) {
259
+ searchParams = new URLSearchParams({ superAreaId: superAreaId.toString(), termsTypeId: termsTypeId.toString() });
260
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/tariffs?").concat(searchParams);
261
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
262
+ // Check for error
263
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
264
+ return response;
265
+ }
266
+ // Convert the dictionary in the response and return the the correct object
267
+ var tariffPlanToTariffs = new Map(Object.entries(response.tariffPlanToTariffs).map(function (_a) {
268
+ var tariffPlanId = _a[0], tariffs = _a[1];
269
+ return [
270
+ +tariffPlanId,
271
+ tariffs
272
+ ];
273
+ }));
274
+ return { tariffs: response.tariffs, tariffPlanToTariffs: tariffPlanToTariffs };
275
+ })];
276
+ });
277
+ });
278
+ };
279
+ /**
280
+ * This method allows to create a TPL cart.
281
+ * @param {Map<number, number>} tariffIdToQuantity A map that associates a tariff id (the one chosen by the user) to the number of tickets to buy for that tariff.
282
+ * @param {Booking.Currencies} currency The currency in which the ticket is priced.
283
+ * @param {string} [startDate] The start date of the ticket. This is optional and should be used only for subscriptions.
284
+ */
285
+ TplBooking.prototype.createTplCart = function (tariffIdToQuantity, currency, startDate) {
286
+ return __awaiter(this, void 0, void 0, function () {
287
+ var url, processedTariffIdToQuantity, request;
288
+ var _this = this;
289
+ return __generator(this, function (_a) {
290
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/cart");
291
+ processedTariffIdToQuantity = {};
292
+ tariffIdToQuantity.forEach(function (value, key) {
293
+ processedTariffIdToQuantity[key] = value;
294
+ });
295
+ request = __assign({ tariffIdToQuantity: processedTariffIdToQuantity, currency: currency }, (startDate && { startDate: startDate }));
296
+ // Call the API
297
+ return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
298
+ // Check for errors
299
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
300
+ // If there was an error, reset cartId and remove it from the mts-storage
301
+ _this.resetBooking();
302
+ return response;
303
+ }
304
+ _this.cart = response.cart;
305
+ _this.cartId = response.cart.id;
306
+ // Save the cartId in the mts-storage
307
+ _this.getStorage().getState().updateCartId(response.cart.id);
308
+ // Fill the booking process status
309
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(response.cart.stepsToStatus);
310
+ _this.bookingDueDate = new Date(response.cart.bookingDueDate);
311
+ // Update the sellerId. This is particularly important in Linkavel
312
+ _this.updateSellerId(response.cart.sellerId);
313
+ return response.cart;
314
+ })];
315
+ });
316
+ });
317
+ };
318
+ //#region Buyer data API
319
+ /**
320
+ * @description This method shall be called when the user wants to retrieve information about the buyer and the passengers.
321
+ * @returns An object of type {@link GetBuyerPassengersDetailsResponse} containing the buyer and the passengers information,
322
+ * as well as a list of the available tariffs for each trip.
323
+ */
324
+ TplBooking.prototype.getBuyerPassengersDetails = function () {
325
+ return __awaiter(this, void 0, void 0, function () {
326
+ var buyerPassengersDetails, url;
327
+ return __generator(this, function (_a) {
328
+ // First check that it is possible to call this API
329
+ if (!this.cart) {
330
+ throw Error("Cart is not initialized yet");
331
+ }
332
+ buyerPassengersDetails = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.BUYER_PASSENGERS);
333
+ if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
334
+ throw Error("The status of the cart does not allow to call this API");
335
+ }
336
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details?");
337
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
338
+ // Check for errors
339
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
340
+ return response;
341
+ }
342
+ return {
343
+ buyerDataStatus: response.buyerDataStatus,
344
+ buyer: response.buyer,
345
+ passengers: [],
346
+ };
347
+ })];
348
+ });
349
+ });
350
+ };
351
+ /**
352
+ * @description This method shall be called when the user wants to retrieve information about an esisting buyer.
353
+ * @param {string} [linkavelCardNumber=undefined] The linkavel card number of the buyer. This parameter is required if linkavelCardPhoneNumber is not set.
354
+ * A linkavelCardNumber is a string of 9 digits.
355
+ * @param {string} [linkavelCardPhoneNumber=undefined] The linkavel card phone number of the buyer. This parameter is required if linkavelCardNumber is not set.
356
+ * @returns An object of type {@link GetBuyerPassengersDetailsResponse} containing the buyer and the passengers information,
357
+ * as well as a list of the available tariffs for each trip.
358
+ */
359
+ TplBooking.prototype.getBuyerFromLinkavelCard = function (linkavelCardNumber, linkavelCardPhoneNumber) {
360
+ return __awaiter(this, void 0, void 0, function () {
361
+ var buyerPassengersDetails, searchParams, url;
362
+ return __generator(this, function (_a) {
363
+ // First check that it is possible to call this API
364
+ if (!this.cart) {
365
+ throw Error("Cart is not initialized yet");
366
+ }
367
+ buyerPassengersDetails = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.BUYER_PASSENGERS);
368
+ if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
369
+ throw Error("The status of the cart does not allow to call this API");
370
+ }
371
+ if (!linkavelCardNumber && !linkavelCardPhoneNumber) {
372
+ throw Error("At least one of the parameters linkavelCardNumber and linkavelCardPhoneNumber must be set");
373
+ }
374
+ searchParams = new URLSearchParams(__assign(__assign({}, (linkavelCardNumber && { linkavelCardNumber: linkavelCardNumber })), (linkavelCardPhoneNumber && { linkavelCardPhoneNumber: linkavelCardPhoneNumber })));
375
+ url = "".concat(this.config.API_ENDPOINT, "/v3_resources/buyers?").concat(searchParams);
376
+ return [2 /*return*/, this.callGetApi(url).then(function (response) {
377
+ // Check for errors
378
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
379
+ return response;
380
+ }
381
+ return response.buyers[0];
382
+ })];
383
+ });
384
+ });
385
+ };
386
+ /**
387
+ * @description This method shall be called when the user wants to update the buyer information.
388
+ * @param {Person | null} buyerDetails The object containing the buyer information.
389
+ * It should be null if the buyer data cannot be specified (see {@link GetBuyerPassengersDetailsResponse.buyerDataStatus}).
390
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise.
391
+ */
392
+ TplBooking.prototype.updateBuyerPassengersDetails = function (buyerDetails) {
393
+ return __awaiter(this, void 0, void 0, function () {
394
+ var buyerPassengersDetails, request, url;
395
+ var _this = this;
396
+ return __generator(this, function (_a) {
397
+ // First check that it is possible to call this API
398
+ if (!this.cart) {
399
+ throw Error("Cart is not initialized yet");
400
+ }
401
+ buyerPassengersDetails = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.BUYER_PASSENGERS);
402
+ if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
403
+ throw Error("The status of the cart does not allow to call this API");
404
+ }
405
+ request = {
406
+ buyer: buyerDetails,
407
+ passengers: [],
408
+ };
409
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details");
410
+ return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
411
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
412
+ return response;
413
+ }
414
+ // Update the booking process status
415
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(response.stepsToStatus);
416
+ return true;
417
+ })];
418
+ });
419
+ });
420
+ };
421
+ //#endregion
422
+ //#region Reductions APIs
423
+ /**
424
+ * @description This method allows to add a reduction to the whole cart or to a single trip in the cart.
425
+ * @param {AddReductionRequest} request The information about the reduction to add
426
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise. Also, the cart is updated.
427
+ */
428
+ TplBooking.prototype.addReduction = function (request) {
429
+ return __awaiter(this, void 0, void 0, function () {
430
+ var discountsStep, _i, _a, step, url;
431
+ var _this = this;
432
+ var _b;
433
+ return __generator(this, function (_c) {
434
+ switch (_c.label) {
435
+ case 0:
436
+ // First check that it is possible to call this API
437
+ if (!this.cartId || this.cartId === 0) {
438
+ throw Error("Cart is not initialized yet");
439
+ }
440
+ discountsStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.DISCOUNTS);
441
+ if (!discountsStep)
442
+ throw Error("Booking step not found!");
443
+ if (!!discountsStep[0]) return [3 /*break*/, 5];
444
+ _i = 0, _a = [booking_1.Booking.BookingSteps.SEATS_SELECTION, booking_1.Booking.BookingSteps.EXTRAS];
445
+ _c.label = 1;
446
+ case 1:
447
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
448
+ step = _a[_i];
449
+ if (!!((_b = this.bookingStepsToStatus.get(step)) !== null && _b !== void 0 ? _b : [false])[0]) return [3 /*break*/, 3];
450
+ return [4 /*yield*/, this.markBookingStepCompleted(step)];
451
+ case 2:
452
+ _c.sent();
453
+ _c.label = 3;
454
+ case 3:
455
+ _i++;
456
+ return [3 /*break*/, 1];
457
+ case 4:
458
+ // Check again if the discounts step is accessible
459
+ discountsStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.DISCOUNTS);
460
+ if (!discountsStep || !discountsStep[0]) {
461
+ throw Error("The status of the cart does not allow to call this API");
462
+ }
463
+ _c.label = 5;
464
+ case 5:
465
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction");
466
+ return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
467
+ var _a, _b;
468
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
469
+ return response;
470
+ }
471
+ var reductionResponse = response;
472
+ // Update the booking process status
473
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(reductionResponse.stepsToStatus);
474
+ // Update the cart
475
+ _this.cart = __assign(__assign({}, _this.cart), { totalAmountToPay: reductionResponse.totalAmountToPay, reductions: __spreadArray(__spreadArray([], ((_b = (_a = _this.cart) === null || _a === void 0 ? void 0 : _a.reductions) !== null && _b !== void 0 ? _b : []), true), [reductionResponse.reduction], false) });
476
+ return true;
477
+ })];
478
+ }
479
+ });
480
+ });
481
+ };
482
+ /**
483
+ * @description This method allows to remove a reduction from the whole cart or from a single trip in the cart.
484
+ * @param tripId The id of the trip from which the reduction should be removed. If the tripId is 0, then the reduction
485
+ * will be removed from the whole cart.
486
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise. Also, the cart is updated.
487
+ */
488
+ TplBooking.prototype.removeReduction = function (tripId) {
489
+ return __awaiter(this, void 0, void 0, function () {
490
+ var discountsStep, queryParams, url;
491
+ var _this = this;
492
+ return __generator(this, function (_a) {
493
+ // First check that it is possible to call this API
494
+ if (!this.cartId || this.cartId === 0) {
495
+ throw Error("Cart is not initialized yet");
496
+ }
497
+ discountsStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.DISCOUNTS);
498
+ if (!discountsStep || !discountsStep[0]) {
499
+ throw Error("The status of the cart does not allow to call this API");
500
+ }
501
+ queryParams = new URLSearchParams({ tripId: tripId.toString() });
502
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
503
+ return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
504
+ var _a, _b, _c;
505
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
506
+ return response;
507
+ }
508
+ var reductionResponse = response;
509
+ // Update the booking process status
510
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(reductionResponse.stepsToStatus);
511
+ // Update the cart
512
+ _this.cart = __assign(__assign({}, _this.cart), { totalAmountToPay: reductionResponse.totalAmountToPay, reductions: (_c = (_b = (_a = _this.cart) === null || _a === void 0 ? void 0 : _a.reductions) === null || _b === void 0 ? void 0 : _b.filter(function (reduction) { return reduction.type === Reduction_1.ReductionType.WALLET ||
513
+ reduction.type === Reduction_1.ReductionType.VOUCHER ||
514
+ (reduction.type === Reduction_1.ReductionType.CASH && reduction.tripId !== tripId); })) !== null && _c !== void 0 ? _c : [] });
515
+ return true;
516
+ })];
517
+ });
518
+ });
519
+ };
520
+ /**
521
+ * @description This method allows the user to use the balance in his wallet to pay the cart. If the balance of
522
+ * the wallet is enough to pay the cart, the cart will be paid fully. Otherwise, the user will be asked to pay the
523
+ * remaining amount with another payment method.
524
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise.
525
+ */
526
+ TplBooking.prototype.useWallet = function () {
527
+ return __awaiter(this, void 0, void 0, function () {
528
+ var issueStep, _i, _a, step, url;
529
+ var _this = this;
530
+ var _b;
531
+ return __generator(this, function (_c) {
532
+ switch (_c.label) {
533
+ case 0:
534
+ // First check that it is possible to call this API
535
+ if (!this.cartId || this.cartId === 0) {
536
+ throw Error("Cart is not initialized yet");
537
+ }
538
+ issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
539
+ if (!issueStep)
540
+ throw Error("Booking step: ".concat(booking_1.Booking.BookingSteps.ISSUE, " not found!"));
541
+ if (!!issueStep[0]) return [3 /*break*/, 5];
542
+ _i = 0, _a = [booking_1.Booking.BookingSteps.SEATS_SELECTION, booking_1.Booking.BookingSteps.EXTRAS, booking_1.Booking.BookingSteps.DISCOUNTS];
543
+ _c.label = 1;
544
+ case 1:
545
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
546
+ step = _a[_i];
547
+ if (!!((_b = this.bookingStepsToStatus.get(step)) !== null && _b !== void 0 ? _b : [false])[0]) return [3 /*break*/, 3];
548
+ return [4 /*yield*/, this.markBookingStepCompleted(step)];
549
+ case 2:
550
+ _c.sent();
551
+ _c.label = 3;
552
+ case 3:
553
+ _i++;
554
+ return [3 /*break*/, 1];
555
+ case 4:
556
+ // Check again if the discounts step is accessible
557
+ issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
558
+ if (!issueStep || !issueStep[0]) {
559
+ throw Error("The status of the cart does not allow to call the API: booking/cart/".concat(this.cartId, "/payment/wallet"));
560
+ }
561
+ _c.label = 5;
562
+ case 5:
563
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
564
+ return [2 /*return*/, this.callPostApi(url, {}).then(function (response) {
565
+ var _a, _b;
566
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
567
+ return response;
568
+ }
569
+ var reductionResponse = response;
570
+ // Update the booking process status
571
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(reductionResponse.stepsToStatus);
572
+ // Update the cart
573
+ _this.cart = __assign(__assign({}, _this.cart), { totalAmountToPay: reductionResponse.totalAmountToPay, reductions: __spreadArray(__spreadArray([], ((_b = (_a = _this.cart) === null || _a === void 0 ? void 0 : _a.reductions) !== null && _b !== void 0 ? _b : []), true), [reductionResponse.reduction], false) });
574
+ return true;
575
+ })];
576
+ }
577
+ });
578
+ });
579
+ };
580
+ /**
581
+ * @description This method allows to remove a waller reduction from the cart.
582
+ *
583
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise. Also, the cart is updated.
584
+ */
585
+ TplBooking.prototype.removeWalletReduction = function () {
586
+ return __awaiter(this, void 0, void 0, function () {
587
+ var url;
588
+ var _this = this;
589
+ return __generator(this, function (_a) {
590
+ // First check that it is possible to call this API
591
+ if (!this.cartId || this.cartId === 0) {
592
+ throw Error("Cart is not initialized yet");
593
+ }
594
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
595
+ return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
596
+ var _a, _b, _c;
597
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
598
+ return response;
599
+ }
600
+ var reductionResponse = response;
601
+ // Update the booking process status
602
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(reductionResponse.stepsToStatus);
603
+ // Update the cart
604
+ _this.cart = __assign(__assign({}, _this.cart), { totalAmountToPay: reductionResponse.totalAmountToPay, reductions: (_c = (_b = (_a = _this.cart) === null || _a === void 0 ? void 0 : _a.reductions) === null || _b === void 0 ? void 0 : _b.filter(function (reduction) { return reduction.type !== Reduction_1.ReductionType.WALLET; })) !== null && _c !== void 0 ? _c : [] });
605
+ return true;
606
+ })];
607
+ });
608
+ });
609
+ };
610
+ /**
611
+ * @description This method allows the user to use a voucher to pay the cart.
612
+ * If the balance of the value of the voucher is enough to pay the cart, the cart will be paid fully.
613
+ * Otherwise, the user will be asked to pay the remaining amount with another payment method.
614
+ * @param {string} voucherCode The code of the voucher to use
615
+ * @returns An {@link ErrorResponse} object in case of error, true otherwise.
616
+ */
617
+ TplBooking.prototype.useVoucher = function (voucherCode) {
618
+ return __awaiter(this, void 0, void 0, function () {
619
+ var discountsStep, _i, _a, step, url;
620
+ var _this = this;
621
+ var _b;
622
+ return __generator(this, function (_c) {
623
+ switch (_c.label) {
624
+ case 0:
625
+ // First check that it is possible to call this API
626
+ if (!this.cartId || this.cartId === 0) {
627
+ throw Error("Cart is not initialized yet");
628
+ }
629
+ discountsStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.DISCOUNTS);
630
+ if (!discountsStep)
631
+ throw Error("Booking step not found!");
632
+ if (!!discountsStep[0]) return [3 /*break*/, 5];
633
+ _i = 0, _a = [booking_1.Booking.BookingSteps.SEATS_SELECTION, booking_1.Booking.BookingSteps.EXTRAS];
634
+ _c.label = 1;
635
+ case 1:
636
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
637
+ step = _a[_i];
638
+ if (!!((_b = this.bookingStepsToStatus.get(step)) !== null && _b !== void 0 ? _b : [false])[0]) return [3 /*break*/, 3];
639
+ return [4 /*yield*/, this.markBookingStepCompleted(step)];
640
+ case 2:
641
+ _c.sent();
642
+ _c.label = 3;
643
+ case 3:
644
+ _i++;
645
+ return [3 /*break*/, 1];
646
+ case 4:
647
+ // Check again if the discounts step is accessible
648
+ discountsStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.DISCOUNTS);
649
+ if (!discountsStep || !discountsStep[0]) {
650
+ throw Error("The status of the cart does not allow to call this API");
651
+ }
652
+ _c.label = 5;
653
+ case 5:
654
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/voucher");
655
+ return [2 /*return*/, this.callPostApi(url, { voucherCode: voucherCode }).then(function (response) {
656
+ var _a, _b;
657
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
658
+ return response;
659
+ }
660
+ var reductionResponse = response;
661
+ // Update the booking process status
662
+ _this.bookingStepsToStatus = (0, processBookingSteps_1.processBookingSteps)(reductionResponse.stepsToStatus);
663
+ // Update the cart
664
+ _this.cart = __assign(__assign({}, _this.cart), { totalAmountToPay: reductionResponse.totalAmountToPay, reductions: __spreadArray(__spreadArray([], ((_b = (_a = _this.cart) === null || _a === void 0 ? void 0 : _a.reductions) !== null && _b !== void 0 ? _b : []), true), [reductionResponse.reduction], false) });
665
+ return true;
666
+ })];
667
+ }
668
+ });
669
+ });
670
+ };
671
+ return TplBooking;
672
+ }(booking_1.Booking));
673
+ exports.TplBooking = TplBooking;
674
+ (function (TplBooking) {
675
+ var _this = this;
676
+ TplBooking.createBooking = function (env, sub_key, debug, language, access_token, sellerId, resellerId) { return __awaiter(_this, void 0, void 0, function () {
677
+ var booking, error_1;
678
+ return __generator(this, function (_a) {
679
+ switch (_a.label) {
680
+ case 0:
681
+ booking = new TplBooking(env, sub_key, debug, language, access_token, sellerId, resellerId);
682
+ _a.label = 1;
683
+ case 1:
684
+ _a.trys.push([1, 4, , 5]);
685
+ if (!booking.cartId) return [3 /*break*/, 3];
686
+ return [4 /*yield*/, booking.fetchAndSetCart(booking.cartId)];
687
+ case 2:
688
+ _a.sent();
689
+ _a.label = 3;
690
+ case 3: return [2 /*return*/, booking];
691
+ case 4:
692
+ error_1 = _a.sent();
693
+ // Check if the error is due to an expired cart. In this case, delete the cartId from the mts-storage
694
+ // This error can occur when the user refreshes the page and the cart has expired
695
+ if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(error_1) && error_1.mtsCode === 40053) {
696
+ booking.getStorage().getState().updateCartId(undefined);
697
+ booking.cartId = undefined;
698
+ return [2 /*return*/, booking];
699
+ }
700
+ throw new Error("Could not instantiate TplBooking");
701
+ case 5: return [2 /*return*/];
702
+ }
703
+ });
704
+ }); };
705
+ })(TplBooking || (exports.TplBooking = TplBooking = {}));