mts-booking-library 1.2.33 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/booking/booking.d.ts +2 -1
- package/lib/booking/booking.js +31 -42
- package/lib/booking/journeyBooking.d.ts +46 -0
- package/lib/booking/journeyBooking.js +70 -81
- package/lib/booking/serviceBooking.d.ts +46 -0
- package/lib/booking/serviceBooking.js +67 -78
- package/lib/booking/subscriptionBooking.d.ts +46 -0
- package/lib/booking/subscriptionBooking.js +68 -79
- package/lib/booking/tplBooking.d.ts +168 -0
- package/lib/booking/tplBooking.js +705 -0
- package/lib/config.js +4 -4
- package/lib/index.d.ts +4 -0
- package/lib/index.js +3 -1
- package/lib/mtsStorage.d.ts +44 -0
- package/lib/mtsStorage.js +48 -0
- package/lib/types/common/City.d.ts +17 -0
- package/lib/types/common/City.js +2 -0
- package/lib/types/common/Tariffs.d.ts +9 -3
- package/lib/types/journeys/JourneyInfo.d.ts +3 -1
- package/lib/types/tpl/GetTariffsResponse.d.ts +12 -0
- package/lib/types/tpl/GetTariffsResponse.js +2 -0
- package/lib/types/tpl/SuperArea.d.ts +13 -0
- package/lib/types/tpl/SuperArea.js +2 -0
- package/lib/types/tpl/TplCart.d.ts +41 -0
- package/lib/types/tpl/TplCart.js +2 -0
- package/lib/utils/apiCall.js +26 -26
- package/package.json +8 -6
@@ -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 = {}));
|