mts-booking-library 1.3.1 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ // import { MTSEnvs } from "../config";
3
+ // import { ServiceBooking } from "../booking/serviceBooking";
4
+ // import { CreateServiceCartRequest, ServiceCart } from "../types/services/ServiceCart";
5
+ // import { Service, ServiceTripsResponse } from "../types/services/Service";
6
+ // import { GetBuyerPassengersDetailsResponse } from "../types/common/Person";
7
+ // import { GetPaymentInformationFromGatewayResponse, GetSellerGatewaysResponse, PaymentMethods } from "../types/common/Payment";
8
+ // import { useTestState } from "../mtsStorage";
9
+ // import { SubscriptionBooking } from "../booking/subscriptionBooking";
10
+ // // Load .env file
11
+ // require('dotenv').config();
12
+ // // How to run the test: npm run test -- SubscriptionBooking.test.ts
13
+ // describe("SubscriptionBooking", () => {
14
+ // const timeOut = 120000;
15
+ // const sub_key = process.env.OCP_SUB_KEY_MTS;
16
+ // const access_token = process.env.ACCESS_TOKEN;
17
+ // const sellerId = 8; // ATV
18
+ // // Define localStorage for local testing
19
+ // if (typeof localStorage === "undefined" || localStorage === null) {
20
+ // var LocalStorage = require("node-localstorage").LocalStorage;
21
+ // global.localStorage = new LocalStorage("./scratch");
22
+ // }
23
+ // test("search_tpl", async () => {
24
+ // const booking = new SubscriptionBooking(MTSEnvs.TEST, sub_key!, true, SubscriptionBooking.Languages.EN, access_token, sellerId);
25
+ // // First, get the departures
26
+ // const departures = await booking.getSubscriptionsDepartures() as string[];
27
+ // expect(departures.length).toBeGreaterThan(0);
28
+ // expect(departures).toContain("APT TREVISO CANOVA");
29
+ // const selectedDeparture = "APT TREVISO CANOVA";
30
+ // const destinations = await booking.getJourneysDestinations(selectedDeparture);
31
+ // expect(destinations).toContain("MESTRE FFSS");
32
+ // }, timeOut);
33
+ // const createCart = async (booking: ServiceBooking): Promise<ServiceCart> => {
34
+ // const servicesResponse = await booking.getServices(ServiceBooking.Currencies.EUR);
35
+ // const services = servicesResponse as Service[];
36
+ // // Build create cart request
37
+ // let tariffsMatrix = services[0].tariffsMatrix;
38
+ // tariffsMatrix[0][0].quantity = 1;
39
+ // const createServiceCartRequest: CreateServiceCartRequest = {
40
+ // currency: ServiceBooking.Currencies.EUR,
41
+ // service: {
42
+ // serviceId: services[0].id,
43
+ // tariffsMatrix: tariffsMatrix
44
+ // }
45
+ // };
46
+ // // Create cart
47
+ // const cart = await booking.createServiceCart(createServiceCartRequest) as ServiceCart;
48
+ // return cart;
49
+ // }
50
+ // test("create_service_cart", async () => {
51
+ // const booking = new ServiceBooking(MTSEnvs.TEST, sub_key!, true, ServiceBooking.Languages.EN);
52
+ // const cart = await createCart(booking);
53
+ // // Check that the cartId was saved to the local storage
54
+ // expect(useTestState().getState().cartId).toBe(cart.id);
55
+ // expect(booking.cartId).toBe(cart.id);
56
+ // // Test the booking status (we test only the Buyer and passenger data, as it will always be required)
57
+ // expect(booking.bookingStepsToStatus.get(ServiceBooking.BookingSteps.BUYER_PASSENGERS)).toStrictEqual([ true, false, true ]);
58
+ // expect(booking.bookingStepsToStatus.get(ServiceBooking.BookingSteps.ISSUE)).toStrictEqual([ false, false, true ]);
59
+ // // Test booking due date
60
+ // expect(booking.bookingDueDate?.toISOString()).toBe(new Date(cart.bookingDueDate).toISOString());
61
+ // // Test expired tickets
62
+ // expect(cart.hasIssuedTickets).toBe(false);
63
+ // // Test seller data
64
+ // expect(booking.getSellerId()).toBe(cart.sellerId);
65
+ // expect(cart.sellerPrivacyUrl.length).toBeGreaterThan(0);
66
+ // expect(cart.sellerTermsUrl.length).toBeGreaterThan(0);
67
+ // // Now try to get the cart
68
+ // const newBooking = await ServiceBooking.createBooking(MTSEnvs.TEST, sub_key!, true, ServiceBooking.Languages.EN);
69
+ // expect(newBooking.cartId).toBe(cart.id);
70
+ // expect(newBooking.getCart()?.id).toBe(cart.id)
71
+ // expect(newBooking.getSellerId()).toBe(cart.sellerId);
72
+ // // Finally try to delete the cart
73
+ // await booking.deleteCart();
74
+ // expect(booking.getCart()).toBe(undefined);
75
+ // expect(useTestState().getState().cartId).toBe(undefined);
76
+ // }, timeOut);
77
+ // test("get_edit_buyer_data", async () => {
78
+ // const booking = new ServiceBooking(MTSEnvs.TEST, sub_key!, true, ServiceBooking.Languages.EN);
79
+ // const cart = await createCart(booking);
80
+ // // First, try to get the buyer data
81
+ // let buyerDataResponse = await booking.getBuyerPassengersDetails();
82
+ // expect((buyerDataResponse as GetBuyerPassengersDetailsResponse).passengers.length).toBe(0);
83
+ // let buyer = (buyerDataResponse as GetBuyerPassengersDetailsResponse).buyer;
84
+ // expect(buyer).toBe(null);
85
+ // // Now try to edit the buyer data
86
+ // buyer = {
87
+ // id: 0,
88
+ // name: "TestName",
89
+ // lastName: "TestSurname",
90
+ // email: "testBookingLib@infos.it",
91
+ // phoneNumber: "+391234567890"
92
+ // }
93
+ // await booking.updateBuyerPassengersDetails(buyer);
94
+ // // Finally, get the buyer data again and check that the data was updated
95
+ // buyerDataResponse = await booking.getBuyerPassengersDetails();
96
+ // const updatedBuyer = (buyerDataResponse as GetBuyerPassengersDetailsResponse).buyer;
97
+ // expect(updatedBuyer.id).toBeGreaterThan(0);
98
+ // expect(updatedBuyer.name).toBe(buyer.name);
99
+ // expect(updatedBuyer.lastName).toBe(buyer.lastName);
100
+ // expect(updatedBuyer.email).toBe(buyer.email);
101
+ // expect(updatedBuyer.phoneNumber).toBe(buyer.phoneNumber);
102
+ // // Finally try to delete the cart
103
+ // await booking.deleteCart();
104
+ // expect(booking.getCart()).toBe(undefined);
105
+ // expect(useTestState().getState().cartId).toBe(undefined);
106
+ // }, timeOut);
107
+ // test("get_gateway_info", async () => {
108
+ // const booking = new ServiceBooking(MTSEnvs.TEST, sub_key!, true, ServiceBooking.Languages.EN);
109
+ // const cart = await createCart(booking);
110
+ // booking.updateSellerId(cart.sellerId);
111
+ // // First, try to get the buyer data
112
+ // let buyerDataResponse = await booking.getBuyerPassengersDetails();
113
+ // expect((buyerDataResponse as GetBuyerPassengersDetailsResponse).passengers.length).toBe(0);
114
+ // let buyer = (buyerDataResponse as GetBuyerPassengersDetailsResponse).buyer;
115
+ // expect(buyer).toBe(null);
116
+ // // Now try to edit the buyer data
117
+ // buyer = {
118
+ // id: 0,
119
+ // name: "TestName",
120
+ // lastName: "TestSurname",
121
+ // email: "testBookingLib@infos.it",
122
+ // phoneNumber: "+391234567890"
123
+ // }
124
+ // await booking.updateBuyerPassengersDetails(buyer);
125
+ // // Try to get the gateways
126
+ // const gateways = await booking.getSellerGateways() as GetSellerGatewaysResponse;
127
+ // if (!gateways.payPalGatewayDTO && !gateways.cardGatewayDTO) {
128
+ // throw new Error("No gateways found");
129
+ // }
130
+ // const gateway = gateways.payPalGatewayDTO ? gateways.payPalGatewayDTO : gateways.cardGatewayDTO;
131
+ // expect(gateway?.id).toBeGreaterThan(0);
132
+ // // Now try to get the info
133
+ // const gatewayInfo = await booking.getPaymentInformationFromGateway(gateway?.id ?? 0) as GetPaymentInformationFromGatewayResponse;
134
+ // // Finally try to delete the cart
135
+ // await booking.deleteCart();
136
+ // expect(booking.getCart()).toBe(undefined);
137
+ // expect(useTestState().getState().cartId).toBe(undefined);
138
+ // }, timeOut);
139
+ // });
@@ -51,7 +51,6 @@ export declare abstract class Booking {
51
51
  getBookingStepsToStatus(): Map<string, boolean[]>;
52
52
  changeCurrency(currency: Booking.Currencies): void;
53
53
  changeLanguage(language: string): void;
54
- getCartExpirationTimeInMs(): Promise<number>;
55
54
  /**
56
55
  * This API allows to mark a non-required booking step as completed. It is useful for example for the seats selection step.
57
56
  * @param bookingStep The booking step to mark as completed
@@ -104,22 +104,33 @@ var Booking = /** @class */ (function () {
104
104
  (0, config_1.setConfig)(this.config.ENV, this.config.OCP_SUBSCRIPTION_KEY, this.config.DEBUG, access_token);
105
105
  };
106
106
  Booking.prototype.callGetApi = function (url) {
107
+ var _a, _b, _c, _d;
107
108
  // Add sellerId, resellerId and language to the query string.
108
109
  // If the last character of the url is a question mark (meaning that the query string is empty), don't add the "&" character.
109
110
  // Otherwise, add it (as we are adding some parameters to the query string)
110
- var completeUrl = "".concat(url).concat(url.slice(-1) === "?" ? "" : "&").concat(new URLSearchParams(__assign(__assign(__assign({}, (this.sellerId && { sellerId: this.sellerId.toString() })), (this.resellerId && { resellerId: this.resellerId.toString() })), { language: this.language })));
111
+ var completeUrl = "".concat(url).concat(url.slice(-1) === "?" ? "" : "&").concat(new URLSearchParams({
112
+ sellerId: (_b = (_a = this.sellerId) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : "0",
113
+ resellerId: (_d = (_c = this.resellerId) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : "0",
114
+ language: this.language
115
+ }));
111
116
  return (0, apiCall_1.makeGet)(completeUrl);
112
117
  };
113
118
  Booking.prototype.callPostApi = function (url, body) {
119
+ var _a, _b, _c, _d;
114
120
  // Add sellerId, resellerId and language to the query string
115
- var completeBody = __assign(__assign(__assign(__assign({}, body), (this.sellerId && { sellerId: this.sellerId.toString() })), (this.resellerId && { resellerId: this.resellerId.toString() })), { language: this.language });
121
+ var completeBody = __assign(__assign({}, body), { sellerId: (_b = (_a = this.sellerId) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : 0, resellerId: (_d = (_c = this.resellerId) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : 0, language: this.language });
116
122
  return (0, apiCall_1.makePost)(url, completeBody);
117
123
  };
118
124
  Booking.prototype.callDeleteApi = function (url) {
125
+ var _a, _b, _c, _d;
119
126
  // Add sellerId, resellerId and language to the query string.
120
127
  // If the last character of the url is a question mark (meaning that the query string is empty), don't add the "&" character.
121
128
  // Otherwise, add it (as we are adding some parameters to the query string)
122
- var completeUrl = "".concat(url).concat(url.slice(-1) === "?" ? "" : "&").concat(new URLSearchParams(__assign(__assign(__assign({}, (this.sellerId && { sellerId: this.sellerId.toString() })), (this.resellerId && { resellerId: this.resellerId.toString() })), { language: this.language })));
129
+ var completeUrl = "".concat(url).concat(url.slice(-1) === "?" ? "" : "&").concat(new URLSearchParams({
130
+ sellerId: (_b = (_a = this.sellerId) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : "0",
131
+ resellerId: (_d = (_c = this.resellerId) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : "0",
132
+ language: this.language
133
+ }));
123
134
  return (0, apiCall_1.makeDelete)(completeUrl);
124
135
  };
125
136
  Booking.prototype.getBookingStepsToStatus = function () {
@@ -138,19 +149,6 @@ var Booking = /** @class */ (function () {
138
149
  this.language = Booking.Languages.EN;
139
150
  }
140
151
  };
141
- Booking.prototype.getCartExpirationTimeInMs = function () {
142
- return __awaiter(this, void 0, void 0, function () {
143
- return __generator(this, function (_a) {
144
- // If cart is initialized, return the time in ms until the cart expires.
145
- // Note that bookingDueDate is initialized only when the cart is created.
146
- if (this.bookingDueDate) {
147
- return [2 /*return*/, (new Date(this.bookingDueDate).valueOf() - new Date().valueOf())];
148
- }
149
- // Cart is not initialized
150
- throw Error("Cart is not initialized yet");
151
- });
152
- });
153
- };
154
152
  /**
155
153
  * This API allows to mark a non-required booking step as completed. It is useful for example for the seats selection step.
156
154
  * @param bookingStep The booking step to mark as completed
@@ -176,7 +174,7 @@ var Booking = /** @class */ (function () {
176
174
  // Booking step is already completed, no need to call the API
177
175
  if (currentStepStatus[0])
178
176
  return [2 /*return*/, true];
179
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/bookingSteps");
177
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/bookingSteps");
180
178
  return [2 /*return*/, this.callPostApi(url, { bookingStep: bookingStep }).then(function (response) {
181
179
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
182
180
  return response;
@@ -259,7 +257,7 @@ var Booking = /** @class */ (function () {
259
257
  throw Error("The status of the cart does not allow to call this API");
260
258
  }
261
259
  searchParams = new URLSearchParams(__assign({ gatewayId: gatewayId.toString() }, (returnUrl && { returnUrl: returnUrl })));
262
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment?").concat(searchParams);
260
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment?").concat(searchParams);
263
261
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
264
262
  return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response;
265
263
  })];
@@ -324,7 +322,7 @@ var Booking = /** @class */ (function () {
324
322
  }
325
323
  _c.label = 7;
326
324
  case 7:
327
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/issue");
325
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/issue");
328
326
  body = {
329
327
  cartId: this.cartId,
330
328
  paymentMethod: paymentMethodToSet === Payment_1.PaymentMethods.PAY_LATER ? null : paymentMethodToSet,
@@ -133,11 +133,12 @@ var JourneyBooking = /** @class */ (function (_super) {
133
133
  switch (_a.label) {
134
134
  case 0: return [4 /*yield*/, this.fetchCart(cartId).then(function (cart) {
135
135
  if (cart) {
136
- var cartDate = new Date(cart.bookingDueDate);
137
- if (cartDate > new Date() && !cart.hasIssuedTickets) {
136
+ var cartDueDate = new Date();
137
+ cartDueDate.setSeconds(cartDueDate.getSeconds() + cart.bookingDueDateRemainingSeconds);
138
+ if (cartDueDate > new Date() && !cart.hasIssuedTickets) {
138
139
  _this.cart = cart;
139
140
  _this.cartId = cart.id;
140
- _this.bookingDueDate = cartDate; // See Booking class
141
+ _this.bookingDueDate = cartDueDate; // See Booking class
141
142
  // Update the sellerId. This is particularly important in Linkavel
142
143
  _this.updateSellerId(cart.sellerId);
143
144
  // Fill the booking process status
@@ -161,7 +162,7 @@ var JourneyBooking = /** @class */ (function (_super) {
161
162
  var url;
162
163
  var _this = this;
163
164
  return __generator(this, function (_a) {
164
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
166
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
166
167
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
167
168
  _this.resetBooking();
@@ -258,7 +259,7 @@ var JourneyBooking = /** @class */ (function (_super) {
258
259
  var url, request;
259
260
  var _this = this;
260
261
  return __generator(this, function (_a) {
261
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/journeys/cart");
262
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/journeys/carts");
262
263
  request = __assign(__assign({}, journeyCart), (this.cartId && { cartId: this.cartId.toString() }));
263
264
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
264
265
  // Check for errors
@@ -298,7 +299,7 @@ var JourneyBooking = /** @class */ (function (_super) {
298
299
  if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
299
300
  throw Error("The status of the cart does not allow to call this API");
300
301
  }
301
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details?");
302
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details?");
302
303
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
303
304
  // Check for errors
304
305
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -394,7 +395,7 @@ var JourneyBooking = /** @class */ (function (_super) {
394
395
  });
395
396
  request.passengers[passengerIndex].tripsToTariffs = tripsToTariffsToJson;
396
397
  });
397
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details");
398
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details");
398
399
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
399
400
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
400
401
  return response;
@@ -455,7 +456,7 @@ var JourneyBooking = /** @class */ (function (_super) {
455
456
  throw Error("The status of the cart does not allow to call this API");
456
457
  }
457
458
  searchParams = new URLSearchParams({ tripId: tripId.toString() });
458
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/seats?").concat(searchParams);
459
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/seats?").concat(searchParams);
459
460
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
460
461
  return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.assignedSeats;
461
462
  })];
@@ -481,7 +482,7 @@ var JourneyBooking = /** @class */ (function (_super) {
481
482
  if (!seatSelectionStatus || !seatSelectionStatus[0]) {
482
483
  throw Error("The status of the cart does not allow to call this API");
483
484
  }
484
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/seats");
485
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/seats");
485
486
  return [2 /*return*/, this.callPostApi(url, { tripId: tripId, newSeatsIds: newSeatsIds }).then(function (response) {
486
487
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
487
488
  return response;
@@ -508,7 +509,7 @@ var JourneyBooking = /** @class */ (function (_super) {
508
509
  if (!this.cart) {
509
510
  throw Error("Cart is not initialized yet");
510
511
  }
511
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/payment/reduction/trips?");
512
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/payment/reduction/trips?");
512
513
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
513
514
  return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.trips;
514
515
  })];
@@ -557,7 +558,7 @@ var JourneyBooking = /** @class */ (function (_super) {
557
558
  }
558
559
  _c.label = 5;
559
560
  case 5:
560
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction");
561
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction");
561
562
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
562
563
  var _a, _b;
563
564
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -594,7 +595,7 @@ var JourneyBooking = /** @class */ (function (_super) {
594
595
  throw Error("The status of the cart does not allow to call this API");
595
596
  }
596
597
  queryParams = new URLSearchParams({ tripId: tripId.toString() });
597
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
598
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
598
599
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
599
600
  var _a, _b, _c;
600
601
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -651,11 +652,11 @@ var JourneyBooking = /** @class */ (function (_super) {
651
652
  // Check again if the discounts step is accessible
652
653
  issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
653
654
  if (!issueStep || !issueStep[0]) {
654
- throw Error("The status of the cart does not allow to call the API: booking/cart/".concat(this.cartId, "/payment/wallet"));
655
+ throw Error("The status of the cart does not allow to call the API: booking/carts/".concat(this.cartId, "/payment/wallet"));
655
656
  }
656
657
  _c.label = 5;
657
658
  case 5:
658
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
659
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
659
660
  return [2 /*return*/, this.callPostApi(url, {}).then(function (response) {
660
661
  var _a, _b;
661
662
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -686,7 +687,7 @@ var JourneyBooking = /** @class */ (function (_super) {
686
687
  if (!this.cartId || this.cartId === 0) {
687
688
  throw Error("Cart is not initialized yet");
688
689
  }
689
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
690
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
690
691
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
691
692
  var _a, _b, _c;
692
693
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -746,7 +747,7 @@ var JourneyBooking = /** @class */ (function (_super) {
746
747
  }
747
748
  _c.label = 5;
748
749
  case 5:
749
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/voucher");
750
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/voucher");
750
751
  return [2 /*return*/, this.callPostApi(url, { voucherCode: voucherCode }).then(function (response) {
751
752
  var _a, _b;
752
753
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -2,7 +2,7 @@ import { MTSEnvs } from "../config";
2
2
  import { ErrorResponse } from "../types/ErrorResponse";
3
3
  import { GetBuyerPassengersDetailsResponse, Person } from "../types/common/Person";
4
4
  import { AddReductionRequest } from "../types/common/Reduction";
5
- import { Service, ServiceTrip } from "../types/services/Service";
5
+ import { Service, ServiceTripsResponse } from "../types/services/Service";
6
6
  import { CreateServiceCartRequest, ServiceCart } from "../types/services/ServiceCart";
7
7
  import { Booking } from "./booking";
8
8
  export declare class ServiceBooking extends Booking {
@@ -94,9 +94,9 @@ export declare class ServiceBooking extends Booking {
94
94
  * You should call this method only if {@link Service.isDateOptional} or {@link Service.isDateRequired} is true for the selected tour.
95
95
  * @param {number} serviceId The id of the selected tour (can be retrieved in the object {@link Service} returned by {@link getTours})
96
96
  * @param {string} date The date on which to get the tours, in ISO string format
97
- * @returns {ServiceTrip[]} The returned information about the tour (tripId and hour)
97
+ * @returns {ServiceTripsResponse} The returned information about the tour (tripId and hour)
98
98
  */
99
- getServiceTrips(serviceId: number, date: string): Promise<ErrorResponse | ServiceTrip[]>;
99
+ getServiceTrips(serviceId: number, date: string): Promise<ErrorResponse | ServiceTripsResponse>;
100
100
  createServiceCart(serviceCart: CreateServiceCartRequest): Promise<ErrorResponse | ServiceCart>;
101
101
  /**
102
102
  * @description This method shall be called when the user wants to retrieve information about the buyer and the passengers.
@@ -133,11 +133,12 @@ var ServiceBooking = /** @class */ (function (_super) {
133
133
  switch (_a.label) {
134
134
  case 0: return [4 /*yield*/, this.fetchCart(cartId).then(function (cart) {
135
135
  if (cart) {
136
- var cartDate = new Date(cart.bookingDueDate);
137
- if (cartDate > new Date() && !cart.hasIssuedTickets) {
136
+ var cartDueDate = new Date();
137
+ cartDueDate.setSeconds(cartDueDate.getSeconds() + cart.bookingDueDateRemainingSeconds);
138
+ if (cartDueDate > new Date() && !cart.hasIssuedTickets) {
138
139
  _this.cart = cart;
139
140
  _this.cartId = cart.id;
140
- _this.bookingDueDate = cartDate; // See Booking class
141
+ _this.bookingDueDate = cartDueDate; // See Booking class
141
142
  // Update the sellerId. This is particularly important in Linkavel
142
143
  _this.updateSellerId(cart.sellerId);
143
144
  // Fill the booking process status
@@ -161,7 +162,7 @@ var ServiceBooking = /** @class */ (function (_super) {
161
162
  var url;
162
163
  var _this = this;
163
164
  return __generator(this, function (_a) {
164
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
166
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
166
167
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
167
168
  _this.resetBooking();
@@ -240,7 +241,7 @@ var ServiceBooking = /** @class */ (function (_super) {
240
241
  * You should call this method only if {@link Service.isDateOptional} or {@link Service.isDateRequired} is true for the selected tour.
241
242
  * @param {number} serviceId The id of the selected tour (can be retrieved in the object {@link Service} returned by {@link getTours})
242
243
  * @param {string} date The date on which to get the tours, in ISO string format
243
- * @returns {ServiceTrip[]} The returned information about the tour (tripId and hour)
244
+ * @returns {ServiceTripsResponse} The returned information about the tour (tripId and hour)
244
245
  */
245
246
  ServiceBooking.prototype.getServiceTrips = function (serviceId, date) {
246
247
  return __awaiter(this, void 0, void 0, function () {
@@ -249,7 +250,7 @@ var ServiceBooking = /** @class */ (function (_super) {
249
250
  searchParams = new URLSearchParams({ date: date });
250
251
  url = "".concat(this.config.API_ENDPOINT, "/v3_booking/services/").concat(serviceId, "/trips?").concat(searchParams);
251
252
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
252
- return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response.trips;
253
+ return (0, ErrorResponse_1.objectIsMTSErrorResponse)(response) ? response : response;
253
254
  })];
254
255
  });
255
256
  });
@@ -259,7 +260,7 @@ var ServiceBooking = /** @class */ (function (_super) {
259
260
  var url;
260
261
  var _this = this;
261
262
  return __generator(this, function (_a) {
262
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/services/cart");
263
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/services/carts");
263
264
  return [2 /*return*/, this.callPostApi(url, serviceCart).then(function (response) {
264
265
  // Check for errors
265
266
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -300,7 +301,7 @@ var ServiceBooking = /** @class */ (function (_super) {
300
301
  if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
301
302
  throw Error("The status of the cart does not allow to call this API");
302
303
  }
303
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details?");
304
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details?");
304
305
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
305
306
  // Check for errors
306
307
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -373,7 +374,7 @@ var ServiceBooking = /** @class */ (function (_super) {
373
374
  buyer: buyerDetails,
374
375
  passengers: [],
375
376
  };
376
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details");
377
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details");
377
378
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
378
379
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
379
380
  return response;
@@ -429,7 +430,7 @@ var ServiceBooking = /** @class */ (function (_super) {
429
430
  }
430
431
  _c.label = 5;
431
432
  case 5:
432
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction");
433
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction");
433
434
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
434
435
  var _a, _b;
435
436
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -466,7 +467,7 @@ var ServiceBooking = /** @class */ (function (_super) {
466
467
  throw Error("The status of the cart does not allow to call this API");
467
468
  }
468
469
  queryParams = new URLSearchParams({ tripId: tripId.toString() });
469
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
470
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
470
471
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
471
472
  var _a, _b, _c;
472
473
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -523,11 +524,11 @@ var ServiceBooking = /** @class */ (function (_super) {
523
524
  // Check again if the discounts step is accessible
524
525
  issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
525
526
  if (!issueStep || !issueStep[0]) {
526
- throw Error("The status of the cart does not allow to call the API: booking/cart/".concat(this.cartId, "/payment/wallet"));
527
+ throw Error("The status of the cart does not allow to call the API: booking/carts/".concat(this.cartId, "/payment/wallet"));
527
528
  }
528
529
  _c.label = 5;
529
530
  case 5:
530
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
531
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
531
532
  return [2 /*return*/, this.callPostApi(url, {}).then(function (response) {
532
533
  var _a, _b;
533
534
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -558,7 +559,7 @@ var ServiceBooking = /** @class */ (function (_super) {
558
559
  if (!this.cartId || this.cartId === 0) {
559
560
  throw Error("Cart is not initialized yet");
560
561
  }
561
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
562
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
562
563
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
563
564
  var _a, _b, _c;
564
565
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -618,7 +619,7 @@ var ServiceBooking = /** @class */ (function (_super) {
618
619
  }
619
620
  _c.label = 5;
620
621
  case 5:
621
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/voucher");
622
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/voucher");
622
623
  return [2 /*return*/, this.callPostApi(url, { voucherCode: voucherCode }).then(function (response) {
623
624
  var _a, _b;
624
625
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -133,11 +133,12 @@ var SubscriptionBooking = /** @class */ (function (_super) {
133
133
  switch (_a.label) {
134
134
  case 0: return [4 /*yield*/, this.fetchCart(cartId).then(function (cart) {
135
135
  if (cart) {
136
- var cartDate = new Date(cart.bookingDueDate);
137
- if (cartDate > new Date() && !cart.hasIssuedTickets) {
136
+ var cartDueDate = new Date();
137
+ cartDueDate.setSeconds(cartDueDate.getSeconds() + cart.bookingDueDateRemainingSeconds);
138
+ if (cartDueDate > new Date() && !cart.hasIssuedTickets) {
138
139
  _this.cart = cart;
139
140
  _this.cartId = cart.id;
140
- _this.bookingDueDate = cartDate; // See Booking class
141
+ _this.bookingDueDate = cartDueDate; // See Booking class
141
142
  // Update the sellerId. This is particularly important in Linkavel
142
143
  _this.updateSellerId(cart.sellerId);
143
144
  // Fill the booking process status
@@ -161,7 +162,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
161
162
  var url;
162
163
  var _this = this;
163
164
  return __generator(this, function (_a) {
164
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
166
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
166
167
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
167
168
  _this.resetBooking();
@@ -314,7 +315,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
314
315
  var url;
315
316
  var _this = this;
316
317
  return __generator(this, function (_a) {
317
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/subscriptions/cart");
318
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/subscriptions/carts");
318
319
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
319
320
  // Check for errors
320
321
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -353,7 +354,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
353
354
  if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
354
355
  throw Error("The status of the cart does not allow to call this API");
355
356
  }
356
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details?");
357
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details?");
357
358
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
358
359
  // Check for errors
359
360
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -449,7 +450,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
449
450
  });
450
451
  request.passengers[passengerIndex].tripsToTariffs = tripsToTariffsToJson;
451
452
  });
452
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details");
453
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details");
453
454
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
454
455
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
455
456
  return response;
@@ -504,7 +505,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
504
505
  }
505
506
  _c.label = 5;
506
507
  case 5:
507
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction");
508
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction");
508
509
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
509
510
  var _a, _b;
510
511
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -541,7 +542,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
541
542
  throw Error("The status of the cart does not allow to call this API");
542
543
  }
543
544
  queryParams = new URLSearchParams({ tripId: tripId.toString() });
544
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
545
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
545
546
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
546
547
  var _a, _b, _c;
547
548
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -598,11 +599,11 @@ var SubscriptionBooking = /** @class */ (function (_super) {
598
599
  // Check again if the discounts step is accessible
599
600
  issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
600
601
  if (!issueStep || !issueStep[0]) {
601
- throw Error("The status of the cart does not allow to call the API: booking/cart/".concat(this.cartId, "/payment/wallet"));
602
+ throw Error("The status of the cart does not allow to call the API: booking/carts/".concat(this.cartId, "/payment/wallet"));
602
603
  }
603
604
  _c.label = 5;
604
605
  case 5:
605
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
606
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
606
607
  return [2 /*return*/, this.callPostApi(url, {}).then(function (response) {
607
608
  var _a, _b;
608
609
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -633,7 +634,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
633
634
  if (!this.cartId || this.cartId === 0) {
634
635
  throw Error("Cart is not initialized yet");
635
636
  }
636
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
637
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
637
638
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
638
639
  var _a, _b, _c;
639
640
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -693,7 +694,7 @@ var SubscriptionBooking = /** @class */ (function (_super) {
693
694
  }
694
695
  _c.label = 5;
695
696
  case 5:
696
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/voucher");
697
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/voucher");
697
698
  return [2 /*return*/, this.callPostApi(url, { voucherCode: voucherCode }).then(function (response) {
698
699
  var _a, _b;
699
700
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -133,11 +133,12 @@ var TplBooking = /** @class */ (function (_super) {
133
133
  switch (_a.label) {
134
134
  case 0: return [4 /*yield*/, this.fetchCart(cartId).then(function (cart) {
135
135
  if (cart) {
136
- var cartDate = new Date(cart.bookingDueDate);
137
- if (cartDate > new Date() && !cart.hasIssuedTickets) {
136
+ var cartDueDate = new Date();
137
+ cartDueDate.setSeconds(cartDueDate.getSeconds() + cart.bookingDueDateRemainingSeconds);
138
+ if (cartDueDate > new Date() && !cart.hasIssuedTickets) {
138
139
  _this.cart = cart;
139
140
  _this.cartId = cart.id;
140
- _this.bookingDueDate = cartDate; // See Booking class
141
+ _this.bookingDueDate = cartDueDate; // See Booking class
141
142
  // Update the sellerId. This is particularly important in Linkavel
142
143
  _this.updateSellerId(cart.sellerId);
143
144
  // Fill the booking process status
@@ -161,7 +162,7 @@ var TplBooking = /** @class */ (function (_super) {
161
162
  var url;
162
163
  var _this = this;
163
164
  return __generator(this, function (_a) {
164
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts?").concat(new URLSearchParams({ cartId: cartId.toString() }));
165
166
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
166
167
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
167
168
  _this.resetBooking();
@@ -287,7 +288,7 @@ var TplBooking = /** @class */ (function (_super) {
287
288
  var url, processedTariffIdToQuantity, request;
288
289
  var _this = this;
289
290
  return __generator(this, function (_a) {
290
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/cart");
291
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/tpl/carts");
291
292
  processedTariffIdToQuantity = {};
292
293
  tariffIdToQuantity.forEach(function (value, key) {
293
294
  processedTariffIdToQuantity[key] = value;
@@ -333,7 +334,7 @@ var TplBooking = /** @class */ (function (_super) {
333
334
  if (!buyerPassengersDetails || !buyerPassengersDetails[0]) {
334
335
  throw Error("The status of the cart does not allow to call this API");
335
336
  }
336
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details?");
337
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details?");
337
338
  return [2 /*return*/, this.callGetApi(url).then(function (response) {
338
339
  // Check for errors
339
340
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -406,7 +407,7 @@ var TplBooking = /** @class */ (function (_super) {
406
407
  buyer: buyerDetails,
407
408
  passengers: [],
408
409
  };
409
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cart.id, "/details");
410
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cart.id, "/details");
410
411
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
411
412
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
412
413
  return response;
@@ -462,7 +463,7 @@ var TplBooking = /** @class */ (function (_super) {
462
463
  }
463
464
  _c.label = 5;
464
465
  case 5:
465
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction");
466
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction");
466
467
  return [2 /*return*/, this.callPostApi(url, request).then(function (response) {
467
468
  var _a, _b;
468
469
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -499,7 +500,7 @@ var TplBooking = /** @class */ (function (_super) {
499
500
  throw Error("The status of the cart does not allow to call this API");
500
501
  }
501
502
  queryParams = new URLSearchParams({ tripId: tripId.toString() });
502
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
503
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/reduction?").concat(queryParams);
503
504
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
504
505
  var _a, _b, _c;
505
506
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -556,11 +557,11 @@ var TplBooking = /** @class */ (function (_super) {
556
557
  // Check again if the discounts step is accessible
557
558
  issueStep = this.bookingStepsToStatus.get(booking_1.Booking.BookingSteps.ISSUE);
558
559
  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
+ throw Error("The status of the cart does not allow to call the API: booking/carts/".concat(this.cartId, "/payment/wallet"));
560
561
  }
561
562
  _c.label = 5;
562
563
  case 5:
563
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
564
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
564
565
  return [2 /*return*/, this.callPostApi(url, {}).then(function (response) {
565
566
  var _a, _b;
566
567
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -591,7 +592,7 @@ var TplBooking = /** @class */ (function (_super) {
591
592
  if (!this.cartId || this.cartId === 0) {
592
593
  throw Error("Cart is not initialized yet");
593
594
  }
594
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/wallet");
595
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/wallet");
595
596
  return [2 /*return*/, this.callDeleteApi(url).then(function (response) {
596
597
  var _a, _b, _c;
597
598
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -651,7 +652,7 @@ var TplBooking = /** @class */ (function (_super) {
651
652
  }
652
653
  _c.label = 5;
653
654
  case 5:
654
- url = "".concat(this.config.API_ENDPOINT, "/v3_booking/cart/").concat(this.cartId, "/payment/voucher");
655
+ url = "".concat(this.config.API_ENDPOINT, "/v3_booking/carts/").concat(this.cartId, "/payment/voucher");
655
656
  return [2 /*return*/, this.callPostApi(url, { voucherCode: voucherCode }).then(function (response) {
656
657
  var _a, _b;
657
658
  if ((0, ErrorResponse_1.objectIsMTSErrorResponse)(response)) {
@@ -21,6 +21,7 @@ import { Extra } from "./Extra";
21
21
  * - The second tells whether the section is completed.
22
22
  * - The third tells whether the section is required.
23
23
  * @property {Booking.Currencies} currency The currency of the cart. See {@link Booking.Currencies}
24
+ * @property {number} bookingDueDateRemainingSeconds The number of seconds remaining before the cart expires. This should be equivalent `bookingDueDate`
24
25
  * @property {string} bookingDueDate The date and time when the cart expires
25
26
  * @property {Reduction[]} reductions The list of reductions applied to the cart
26
27
  * @property {Extra[]} extras The list of extras services of the cart
@@ -42,6 +43,7 @@ export type Cart = {
42
43
  stepsToStatus: Map<string, boolean[]>;
43
44
  currency: Booking.Currencies;
44
45
  bookingDueDate: string;
46
+ bookingDueDateRemainingSeconds: number;
45
47
  reductions: Reduction[];
46
48
  extras: Extra[];
47
49
  sellingMethod: string;
@@ -31,3 +31,13 @@ export type ServiceTrip = {
31
31
  date: Date;
32
32
  name: string;
33
33
  };
34
+ /**
35
+ * @description Represents a response from the service trips endpoint
36
+ * @param {boolean} areThereTrips - Indicates whether there are trips available for the service.
37
+ * @param {ServiceTrip[]} trips - An array of {@link ServiceTrip} objects representing the available trips. This can be empty
38
+ * even if `areThereTrips` is true, as the user might be not allowed to select a specific trip.
39
+ */
40
+ export type ServiceTripsResponse = {
41
+ areThereTrips: boolean;
42
+ trips: ServiceTrip[];
43
+ };
@@ -9,7 +9,7 @@ import { ServiceTrip } from "./Service";
9
9
  * @property {Object} service - Information about the selected service.
10
10
  * @property {number} service.serviceId - The unique identifier for the service.
11
11
  * @property {TariffsMatrix} service.tariffsMatrix - The tariff matrix for pricing the service.
12
- * @property {Date|undefined} [service.date] - The date for the service (optional).
12
+ * @property {string|undefined} [service.date] - The date for the service in ISO string format (optional).
13
13
  * @property {number|undefined} [service.tripId] - The unique identifier for the trip (optional).
14
14
  */
15
15
  export type CreateServiceCartRequest = {
@@ -17,7 +17,7 @@ export type CreateServiceCartRequest = {
17
17
  service: {
18
18
  serviceId: number;
19
19
  tariffsMatrix: TariffsMatrix;
20
- date?: Date;
20
+ date?: string;
21
21
  tripId?: number;
22
22
  };
23
23
  };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * This method return the ISO string of the date without GMT. An ISO string looks like this: YYYY-MM-DDThh:mm:ss.mmmZ
3
+ * @param {Date | string} date the date to convert
4
+ * @param {boolean} [removeTimezone=true] if true, the timezone will be removed from the ISO string, meaning
5
+ * that the string will look like this: YYYY-MM-DDThh:mm:ss.mmm
6
+ * @returns {string} the ISO string
7
+ */
8
+ export declare const getISOStringWithoutGMT: (date: Date | string | null | undefined, removeTimezone?: boolean) => string | null;
9
+ /**
10
+ * This method check where a variable is null or undefined
11
+ * @param value The value to check
12
+ * @returns True if the value is null or undefined, false otherwise
13
+ */
14
+ export declare const isNullOrUndefined: (value: any) => boolean;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNullOrUndefined = exports.getISOStringWithoutGMT = void 0;
4
+ /**
5
+ * This method return the ISO string of the date without GMT. An ISO string looks like this: YYYY-MM-DDThh:mm:ss.mmmZ
6
+ * @param {Date | string} date the date to convert
7
+ * @param {boolean} [removeTimezone=true] if true, the timezone will be removed from the ISO string, meaning
8
+ * that the string will look like this: YYYY-MM-DDThh:mm:ss.mmm
9
+ * @returns {string} the ISO string
10
+ */
11
+ var getISOStringWithoutGMT = function (date, removeTimezone) {
12
+ if (removeTimezone === void 0) { removeTimezone = true; }
13
+ if (!date)
14
+ return null;
15
+ var newDate = new Date(date);
16
+ var isoString = new Date(newDate.valueOf() - newDate.getTimezoneOffset() * 60000).toISOString();
17
+ return removeTimezone ? isoString.slice(0, -1) : isoString;
18
+ };
19
+ exports.getISOStringWithoutGMT = getISOStringWithoutGMT;
20
+ /**
21
+ * This method check where a variable is null or undefined
22
+ * @param value The value to check
23
+ * @returns True if the value is null or undefined, false otherwise
24
+ */
25
+ var isNullOrUndefined = function (value) { return value === null || value === undefined; };
26
+ exports.isNullOrUndefined = isNullOrUndefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mts-booking-library",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "description": "Library for using MyTicketSolution Booking API",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "@types/jest": "^29.5.12",
18
18
  "jest": "^29.7.0",
19
19
  "ts-jest": "^29.1.2",
20
- "typescript": "^5.4.2"
20
+ "typescript": "^5.4.3"
21
21
  },
22
22
  "files": [
23
23
  "lib/**/*"
@@ -30,6 +30,7 @@
30
30
  "dependencies": {
31
31
  "@react-native-async-storage/async-storage": "^1.23.1",
32
32
  "axios": "^1.6.8",
33
+ "dotenv": "^16.4.5",
33
34
  "node-localstorage": "^3.0.5",
34
35
  "zustand": "^4.5.2"
35
36
  }