ti2-ventrata 1.0.5 → 1.0.8
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/index.js +21 -6
- package/index.test.js +20 -20
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -37,6 +37,8 @@ const doMapCurry = mapObj => item => doMap(item, mapObj);
|
|
|
37
37
|
const productMapIn = {
|
|
38
38
|
productId: R.path(['id']),
|
|
39
39
|
productName: R.path(['title']),
|
|
40
|
+
availableCurrencies: R.path(['availableCurrencies']),
|
|
41
|
+
defaultCurrency: R.path(['defaultCurrency']),
|
|
40
42
|
options: e => R.pathOr(undefined, ['options'], e).map(option => doMap(option, optionMapIn, ['id', 'title'])),
|
|
41
43
|
};
|
|
42
44
|
|
|
@@ -57,6 +59,7 @@ const availabilityMap = {
|
|
|
57
59
|
dateTimeEnd: R.path(['localDateTimeEnd']),
|
|
58
60
|
allDay: R.path(['allDay']),
|
|
59
61
|
pricing: R.path(['pricing']),
|
|
62
|
+
unitPricing: R.path(['unitPricing']),
|
|
60
63
|
offer: avail => (avail.offerCode ? doMap(avail, {
|
|
61
64
|
offerId: R.path(['offerCode']),
|
|
62
65
|
title: R.pathOr(undefined, ['offerTitle']),
|
|
@@ -81,8 +84,9 @@ const capitalize = sParam => {
|
|
|
81
84
|
const unitMap = {
|
|
82
85
|
unitId: R.path(['id']),
|
|
83
86
|
unitName: R.path(['title']),
|
|
87
|
+
subtitle: R.path(['subtitle']),
|
|
84
88
|
restrictions: R.path(['restrictions']),
|
|
85
|
-
pricing: R.path(['pricing']),
|
|
89
|
+
pricing: root => R.path(['pricing'], root) || R.path(['pricingFrom'], root),
|
|
86
90
|
};
|
|
87
91
|
|
|
88
92
|
const itineraryMap = {
|
|
@@ -103,11 +107,13 @@ const itineraryMap = {
|
|
|
103
107
|
|
|
104
108
|
const unitItemMap = {
|
|
105
109
|
unitItemId: R.path(['uuid']),
|
|
110
|
+
unitId: R.path(['unitId']),
|
|
111
|
+
unitName: R.path(['unit', 'title']),
|
|
106
112
|
supplierId: R.path(['supplierReference']),
|
|
107
113
|
status: e => capitalize(R.path(['status'], e)),
|
|
108
114
|
contact: R.path(['contact']),
|
|
109
115
|
pricing: R.path(['pricing']),
|
|
110
|
-
unit:
|
|
116
|
+
unit: root => doMap(root.unit, unitMap),
|
|
111
117
|
};
|
|
112
118
|
|
|
113
119
|
const contactMapOut = {
|
|
@@ -123,11 +129,14 @@ const contactMapOut = {
|
|
|
123
129
|
|
|
124
130
|
const bookingMap = {
|
|
125
131
|
id: R.path(['id']),
|
|
132
|
+
orderId: R.path(['orderReference']),
|
|
133
|
+
bookingId: R.path(['supplierReference']),
|
|
126
134
|
supplierId: R.path(['supplierReference']),
|
|
127
135
|
status: e => capitalize(R.path(['status'], e)),
|
|
128
136
|
productId: R.path(['product', 'id']),
|
|
129
137
|
productName: R.path(['product', 'title']),
|
|
130
138
|
optionId: R.path(['option', 'id']),
|
|
139
|
+
optionName: R.path(['option', 'title']),
|
|
131
140
|
itinerary: ({ option: { itinerary } = {} }) =>
|
|
132
141
|
(isNilOrEmptyArray(itinerary) ? undefined : itinerary.map(doMapCurry(itineraryMap))),
|
|
133
142
|
duration: booking => doMap(booking, {
|
|
@@ -141,7 +150,7 @@ const bookingMap = {
|
|
|
141
150
|
start: R.path(['availability', 'localDateTimeStart']),
|
|
142
151
|
end: R.path(['availability', 'localDateTimeEnd']),
|
|
143
152
|
allDay: R.path(['availability', 'allDay']),
|
|
144
|
-
bookingDate: R.path(['
|
|
153
|
+
bookingDate: R.path(['utcCreatedAt']),
|
|
145
154
|
holder: booking => doMap(R.path(['contact'], booking), contactMapOut),
|
|
146
155
|
telephone: R.pathOr(undefined, ['contact', 'phoneNumber']),
|
|
147
156
|
notes: R.pathOr(undefined, ['notes']),
|
|
@@ -210,7 +219,10 @@ class Plugin {
|
|
|
210
219
|
if (Object.keys(extraFilters).length > 0) {
|
|
211
220
|
products = products.filter(
|
|
212
221
|
product => Object.entries(extraFilters).every(
|
|
213
|
-
([key, value]) =>
|
|
222
|
+
([key, value]) => {
|
|
223
|
+
if (typeof value === 'string') return wildcardMatch(value, product[key]);
|
|
224
|
+
return true;
|
|
225
|
+
},
|
|
214
226
|
),
|
|
215
227
|
);
|
|
216
228
|
}
|
|
@@ -276,8 +288,9 @@ class Plugin {
|
|
|
276
288
|
optionIds,
|
|
277
289
|
occupancies,
|
|
278
290
|
startDate,
|
|
279
|
-
|
|
291
|
+
endDate,
|
|
280
292
|
dateFormat,
|
|
293
|
+
currency,
|
|
281
294
|
},
|
|
282
295
|
}) {
|
|
283
296
|
assert(this.jwtKey, 'JWT secret should be set');
|
|
@@ -294,7 +307,7 @@ class Plugin {
|
|
|
294
307
|
assert(optionIds.every(Boolean), 'some invalid optionId(s)');
|
|
295
308
|
assert(occupancies.every(Boolean), 'some invalid occupacies(s)');
|
|
296
309
|
const localDateStart = moment(startDate, dateFormat).format('YYYY-MM-DD');
|
|
297
|
-
const localDateEnd = moment(
|
|
310
|
+
const localDateEnd = moment(endDate, dateFormat).format('YYYY-MM-DD');
|
|
298
311
|
// obtain the rates
|
|
299
312
|
const { quote } = await this.searchQuote({
|
|
300
313
|
token,
|
|
@@ -320,6 +333,7 @@ class Plugin {
|
|
|
320
333
|
optionId: optionIds[rateIx],
|
|
321
334
|
localDateStart,
|
|
322
335
|
localDateEnd,
|
|
336
|
+
currency,
|
|
323
337
|
units: Object.entries(qtys).map(([id, quantity]) => ({
|
|
324
338
|
id, quantity,
|
|
325
339
|
})),
|
|
@@ -339,6 +353,7 @@ class Plugin {
|
|
|
339
353
|
productId: productIds[availsIx],
|
|
340
354
|
optionId: optionIds[availsIx],
|
|
341
355
|
availabilityId: avail.id,
|
|
356
|
+
currency,
|
|
342
357
|
unitItems: rates[availsIx].map(rate => ({ unitId: rate })),
|
|
343
358
|
}), this.jwtKey),
|
|
344
359
|
...doMap(avail, availabilityMap),
|
package/index.test.js
CHANGED
|
@@ -10,13 +10,13 @@ const app = new Plugin({
|
|
|
10
10
|
jwtKey: process.env.ti2_ventrata_jwtKey,
|
|
11
11
|
});
|
|
12
12
|
|
|
13
|
-
const rnd =
|
|
13
|
+
const rnd = arr => arr[Math.floor(Math.random() * arr.length)];
|
|
14
14
|
|
|
15
15
|
describe('search tests', () => {
|
|
16
16
|
let products;
|
|
17
17
|
let testProduct = {
|
|
18
18
|
productName: 'Pub Crawl Tour',
|
|
19
|
-
}
|
|
19
|
+
};
|
|
20
20
|
const token = {
|
|
21
21
|
apiKey: process.env.ti2_ventrata_apiKey,
|
|
22
22
|
endpoint: process.env.ti2_ventrata_endpoint,
|
|
@@ -74,7 +74,7 @@ describe('search tests', () => {
|
|
|
74
74
|
token,
|
|
75
75
|
payload: {
|
|
76
76
|
productId: testProduct.productId,
|
|
77
|
-
}
|
|
77
|
+
},
|
|
78
78
|
});
|
|
79
79
|
expect(Array.isArray(retVal.products)).toBeTruthy();
|
|
80
80
|
expect(retVal.products).toHaveLength(1);
|
|
@@ -181,7 +181,7 @@ describe('search tests', () => {
|
|
|
181
181
|
phoneNumber: faker.phone.phoneNumber(),
|
|
182
182
|
emailAddress: `salvador+tests_${faker.lorem.slug()}@tourconnect.com`,
|
|
183
183
|
country: faker.address.countryCode(),
|
|
184
|
-
locales:
|
|
184
|
+
locales: ['en-US', 'en', 'es'],
|
|
185
185
|
},
|
|
186
186
|
reference,
|
|
187
187
|
},
|
|
@@ -189,9 +189,9 @@ describe('search tests', () => {
|
|
|
189
189
|
expect(retVal.booking).toBeTruthy();
|
|
190
190
|
({ booking } = retVal);
|
|
191
191
|
expect(booking).toBeTruthy();
|
|
192
|
-
expect(R.path(['id'], booking)).toBeTruthy()
|
|
193
|
-
expect(R.path(['supplierId'], booking)).toBeTruthy()
|
|
194
|
-
expect(R.path(['cancellable'], booking)).toBeTruthy()
|
|
192
|
+
expect(R.path(['id'], booking)).toBeTruthy();
|
|
193
|
+
expect(R.path(['supplierId'], booking)).toBeTruthy();
|
|
194
|
+
expect(R.path(['cancellable'], booking)).toBeTruthy();
|
|
195
195
|
// console.log({ booking });
|
|
196
196
|
});
|
|
197
197
|
it('should be able to cancel the booking', async () => {
|
|
@@ -200,13 +200,13 @@ describe('search tests', () => {
|
|
|
200
200
|
payload: {
|
|
201
201
|
bookingId: booking.id,
|
|
202
202
|
reason: faker.lorem.paragraph(),
|
|
203
|
-
}
|
|
203
|
+
},
|
|
204
204
|
});
|
|
205
|
-
|
|
205
|
+
const { cancellation } = retVal;
|
|
206
206
|
expect(cancellation).toBeTruthy();
|
|
207
207
|
expect(cancellation).toBeTruthy();
|
|
208
|
-
expect(R.path(['id'], cancellation)).toBeTruthy()
|
|
209
|
-
expect(R.path(['cancellable'], cancellation)).toBeFalsy()
|
|
208
|
+
expect(R.path(['id'], cancellation)).toBeTruthy();
|
|
209
|
+
expect(R.path(['cancellable'], cancellation)).toBeFalsy();
|
|
210
210
|
});
|
|
211
211
|
let bookings = [];
|
|
212
212
|
it('it should be able to search bookings by id', async () => {
|
|
@@ -214,33 +214,33 @@ describe('search tests', () => {
|
|
|
214
214
|
token,
|
|
215
215
|
payload: {
|
|
216
216
|
bookingId: booking.id,
|
|
217
|
-
}
|
|
217
|
+
},
|
|
218
218
|
});
|
|
219
219
|
expect(Array.isArray(retVal.bookings)).toBeTruthy();
|
|
220
220
|
({ bookings } = retVal);
|
|
221
|
-
expect(R.path([0, 'id'], bookings)).toBeTruthy()
|
|
221
|
+
expect(R.path([0, 'id'], bookings)).toBeTruthy();
|
|
222
222
|
});
|
|
223
223
|
it('it should be able to search bookings by reference', async () => {
|
|
224
224
|
const retVal = await app.searchBooking({
|
|
225
225
|
token,
|
|
226
226
|
payload: {
|
|
227
227
|
bookingId: reference,
|
|
228
|
-
}
|
|
228
|
+
},
|
|
229
229
|
});
|
|
230
230
|
expect(Array.isArray(retVal.bookings)).toBeTruthy();
|
|
231
231
|
({ bookings } = retVal);
|
|
232
|
-
expect(R.path([0, 'id'], bookings)).toBeTruthy()
|
|
232
|
+
expect(R.path([0, 'id'], bookings)).toBeTruthy();
|
|
233
233
|
});
|
|
234
234
|
it('it should be able to search bookings by supplierId', async () => {
|
|
235
235
|
const retVal = await app.searchBooking({
|
|
236
236
|
token,
|
|
237
237
|
payload: {
|
|
238
238
|
bookingId: booking.supplierId,
|
|
239
|
-
}
|
|
239
|
+
},
|
|
240
240
|
});
|
|
241
241
|
expect(Array.isArray(retVal.bookings)).toBeTruthy();
|
|
242
242
|
({ bookings } = retVal);
|
|
243
|
-
expect(R.path([0, 'id'], bookings)).toBeTruthy()
|
|
243
|
+
expect(R.path([0, 'id'], bookings)).toBeTruthy();
|
|
244
244
|
});
|
|
245
245
|
it('it should be able to search bookings by travelDate', async () => {
|
|
246
246
|
const retVal = await app.searchBooking({
|
|
@@ -249,11 +249,11 @@ describe('search tests', () => {
|
|
|
249
249
|
travelDateStart: moment().add(6, 'M').format(dateFormat),
|
|
250
250
|
travelDateEnd: moment().add(6, 'M').add(2, 'd').format(dateFormat),
|
|
251
251
|
dateFormat,
|
|
252
|
-
}
|
|
252
|
+
},
|
|
253
253
|
});
|
|
254
254
|
expect(Array.isArray(retVal.bookings)).toBeTruthy();
|
|
255
255
|
({ bookings } = retVal);
|
|
256
|
-
expect(R.path([0, 'id'], bookings)).toBeTruthy()
|
|
256
|
+
expect(R.path([0, 'id'], bookings)).toBeTruthy();
|
|
257
257
|
});
|
|
258
|
-
|
|
258
|
+
});
|
|
259
259
|
});
|