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.
- 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 +4 -4
- 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 = {}));
|