@driveflux/api-functions 0.0.3 → 0.0.4

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.
Files changed (50) hide show
  1. package/dist/auth/confirm.js +73 -327
  2. package/dist/auth/emails.js +43 -210
  3. package/dist/auth/formatter.js +11 -11
  4. package/dist/auth/otp.js +122 -392
  5. package/dist/auth/register.d.ts +1 -1
  6. package/dist/auth/register.js +100 -396
  7. package/dist/auth/tokens.js +115 -430
  8. package/dist/auth/verifications.js +154 -512
  9. package/dist/constants.js +5 -4
  10. package/dist/mailjet/calls/manage-contacts-in-list.js +22 -166
  11. package/dist/mailjet/calls/manage-subscription-status.js +13 -153
  12. package/dist/mailjet/calls/request-service.js +18 -183
  13. package/dist/mailjet/refresh-email-preferences.js +26 -225
  14. package/dist/mailjet/set-contact.js +23 -214
  15. package/dist/mailjet/types.js +2 -1
  16. package/dist/mailjet/utils/convert-to-array.js +9 -58
  17. package/dist/mailjet/utils/extract-email-preferences.js +41 -217
  18. package/dist/mailjet/utils/lists.js +30 -249
  19. package/dist/mailjet/utils/update-email-references.js +27 -208
  20. package/dist/notion/client.js +48 -197
  21. package/dist/notion/helpful.js +29 -170
  22. package/dist/notion/schemas/block.js +49 -43
  23. package/dist/notion/schemas/common.js +17 -14
  24. package/dist/notion/schemas/database.js +125 -159
  25. package/dist/notion/schemas/emoji.js +3 -2
  26. package/dist/notion/schemas/file.js +10 -10
  27. package/dist/notion/schemas/kb.js +9 -8
  28. package/dist/notion/schemas/page.js +126 -171
  29. package/dist/notion/schemas/parent.js +9 -8
  30. package/dist/notion/schemas/user.js +21 -20
  31. package/dist/reservation/agree.js +19 -158
  32. package/dist/reservation/checks.js +23 -178
  33. package/dist/reservation/display-vehicle.js +142 -514
  34. package/dist/reservation/fetch-or-create.js +197 -482
  35. package/dist/reservation/invoice.d.ts.map +1 -1
  36. package/dist/reservation/invoice.js +199 -501
  37. package/dist/reservation/invoice.js.map +1 -1
  38. package/dist/reservation/payer.js +28 -177
  39. package/dist/reservation/reserve.js +31 -191
  40. package/dist/reservation/types.js +2 -1
  41. package/dist/reservation/vehicle.js +24 -186
  42. package/dist/slack.js +67 -273
  43. package/dist/validation.d.ts +11 -11
  44. package/dist/validation.d.ts.map +1 -1
  45. package/dist/validation.js +63 -96
  46. package/dist/validation.js.map +1 -1
  47. package/dist/vehicle/vehicle-pricing/constants.js +33 -36
  48. package/dist/vehicle/vehicle-pricing/index.js +99 -257
  49. package/dist/vehicle/vehicle-pricing/types.js +2 -1
  50. package/package.json +10 -10
@@ -1,205 +1,6 @@
1
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
- try {
3
- var info = gen[key](arg);
4
- var value = info.value;
5
- } catch (error) {
6
- reject(error);
7
- return;
8
- }
9
- if (info.done) {
10
- resolve(value);
11
- } else {
12
- Promise.resolve(value).then(_next, _throw);
13
- }
14
- }
15
- function _async_to_generator(fn) {
16
- return function() {
17
- var self = this, args = arguments;
18
- return new Promise(function(resolve, reject) {
19
- var gen = fn.apply(self, args);
20
- function _next(value) {
21
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
- }
23
- function _throw(err) {
24
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
- }
26
- _next(undefined);
27
- });
28
- };
29
- }
30
- function _define_property(obj, key, value) {
31
- if (key in obj) {
32
- Object.defineProperty(obj, key, {
33
- value: value,
34
- enumerable: true,
35
- configurable: true,
36
- writable: true
37
- });
38
- } else {
39
- obj[key] = value;
40
- }
41
- return obj;
42
- }
43
- function _object_spread(target) {
44
- for(var i = 1; i < arguments.length; i++){
45
- var source = arguments[i] != null ? arguments[i] : {};
46
- var ownKeys = Object.keys(source);
47
- if (typeof Object.getOwnPropertySymbols === "function") {
48
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
49
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
50
- }));
51
- }
52
- ownKeys.forEach(function(key) {
53
- _define_property(target, key, source[key]);
54
- });
55
- }
56
- return target;
57
- }
58
- function ownKeys(object, enumerableOnly) {
59
- var keys = Object.keys(object);
60
- if (Object.getOwnPropertySymbols) {
61
- var symbols = Object.getOwnPropertySymbols(object);
62
- if (enumerableOnly) {
63
- symbols = symbols.filter(function(sym) {
64
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
65
- });
66
- }
67
- keys.push.apply(keys, symbols);
68
- }
69
- return keys;
70
- }
71
- function _object_spread_props(target, source) {
72
- source = source != null ? source : {};
73
- if (Object.getOwnPropertyDescriptors) {
74
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
75
- } else {
76
- ownKeys(Object(source)).forEach(function(key) {
77
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
78
- });
79
- }
80
- return target;
81
- }
82
- function _object_without_properties(source, excluded) {
83
- if (source == null) return {};
84
- var target = _object_without_properties_loose(source, excluded);
85
- var key, i;
86
- if (Object.getOwnPropertySymbols) {
87
- var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
88
- for(i = 0; i < sourceSymbolKeys.length; i++){
89
- key = sourceSymbolKeys[i];
90
- if (excluded.indexOf(key) >= 0) continue;
91
- if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
92
- target[key] = source[key];
93
- }
94
- }
95
- return target;
96
- }
97
- function _object_without_properties_loose(source, excluded) {
98
- if (source == null) return {};
99
- var target = {};
100
- var sourceKeys = Object.keys(source);
101
- var key, i;
102
- for(i = 0; i < sourceKeys.length; i++){
103
- key = sourceKeys[i];
104
- if (excluded.indexOf(key) >= 0) continue;
105
- target[key] = source[key];
106
- }
107
- return target;
108
- }
109
- function _ts_generator(thisArg, body) {
110
- var f, y, t, _ = {
111
- label: 0,
112
- sent: function() {
113
- if (t[0] & 1) throw t[1];
114
- return t[1];
115
- },
116
- trys: [],
117
- ops: []
118
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
119
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
120
- return this;
121
- }), g;
122
- function verb(n) {
123
- return function(v) {
124
- return step([
125
- n,
126
- v
127
- ]);
128
- };
129
- }
130
- function step(op) {
131
- if (f) throw new TypeError("Generator is already executing.");
132
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
133
- 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;
134
- if (y = 0, t) op = [
135
- op[0] & 2,
136
- t.value
137
- ];
138
- switch(op[0]){
139
- case 0:
140
- case 1:
141
- t = op;
142
- break;
143
- case 4:
144
- _.label++;
145
- return {
146
- value: op[1],
147
- done: false
148
- };
149
- case 5:
150
- _.label++;
151
- y = op[1];
152
- op = [
153
- 0
154
- ];
155
- continue;
156
- case 7:
157
- op = _.ops.pop();
158
- _.trys.pop();
159
- continue;
160
- default:
161
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
162
- _ = 0;
163
- continue;
164
- }
165
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
166
- _.label = op[1];
167
- break;
168
- }
169
- if (op[0] === 6 && _.label < t[1]) {
170
- _.label = t[1];
171
- t = op;
172
- break;
173
- }
174
- if (t && _.label < t[2]) {
175
- _.label = t[2];
176
- _.ops.push(op);
177
- break;
178
- }
179
- if (t[2]) _.ops.pop();
180
- _.trys.pop();
181
- continue;
182
- }
183
- op = body.call(thisArg, _);
184
- } catch (e) {
185
- op = [
186
- 6,
187
- e
188
- ];
189
- y = 0;
190
- } finally{
191
- f = t = 0;
192
- }
193
- if (op[0] & 5) throw op[1];
194
- return {
195
- value: op[0] ? op[1] : void 0,
196
- done: true
197
- };
198
- }
199
- }
200
1
  import { config } from '@driveflux/config/backend';
201
2
  import { loadCoupon, PROBLEM_APPLICABLE_NOT_FOUND } from '@driveflux/coupon';
202
- import { prisma } from '@driveflux/db';
3
+ import { prisma, } from '@driveflux/db';
203
4
  import { generateId } from '@driveflux/db/id';
204
5
  import { EMPTY_BILLING_ADDRESS } from '@driveflux/db/models/other';
205
6
  import { PURPOSE_RESERVATION } from '@driveflux/db/models/subscription';
@@ -211,301 +12,199 @@ import { Ok } from '@driveflux/result';
211
12
  import { format } from '@driveflux/time';
212
13
  import { isAfter } from 'date-fns/isAfter';
213
14
  import { subMinutes } from 'date-fns/subMinutes';
214
- export var updateReservationInvoiceIfNeeded = function(oldReservationInvoice, newParams) {
215
- return _async_to_generator(function() {
216
- var couponIsDifferent, update, result, _oldReservationInvoice_discountIds, _result_val, discounts, rest, toDisconnect, disconnectClauses, updated;
217
- return _ts_generator(this, function(_state) {
218
- switch(_state.label){
219
- case 0:
220
- console.log('UPDATING INVOICE IF NEEDED');
221
- couponIsDifferent = oldReservationInvoice.couponCode !== newParams.couponCode;
222
- if (!couponIsDifferent && oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
223
- return [
224
- 2,
225
- new Ok(oldReservationInvoice)
226
- ];
227
- }
228
- // If the coupon or payment intent are differnt we should update the invoice
229
- update = {
230
- stripePaymentIntentId: newParams.paymentIntentId,
231
- couponCode: newParams.couponCode
232
- };
233
- if (!couponIsDifferent) return [
234
- 3,
235
- 3
236
- ];
237
- if (!newParams.couponCode) return [
238
- 3,
239
- 2
240
- ];
241
- return [
242
- 4,
243
- coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice)
244
- ];
245
- case 1:
246
- result = _state.sent();
247
- if (result.ok) {
248
- ;
249
- _result_val = result.val, discounts = _result_val.discounts, rest = _object_without_properties(_result_val, [
250
- "discounts"
251
- ]);
252
- toDisconnect = discounts ? (_oldReservationInvoice_discountIds = oldReservationInvoice.discountIds) === null || _oldReservationInvoice_discountIds === void 0 ? void 0 : _oldReservationInvoice_discountIds.filter(function(id) {
253
- var _discounts_connect;
254
- return !((_discounts_connect = discounts.connect) === null || _discounts_connect === void 0 ? void 0 : _discounts_connect.some(function(d) {
255
- return d.id === id;
256
- }));
257
- }) : undefined;
258
- disconnectClauses = (toDisconnect === null || toDisconnect === void 0 ? void 0 : toDisconnect.length) ? {
259
- disconnect: toDisconnect.map(function(id) {
260
- return {
261
- id: id
262
- };
263
- })
264
- } : undefined;
265
- update = _object_spread_props(_object_spread({}, update, rest, discounts || disconnectClauses ? {
266
- discounts: _object_spread({}, discounts || {}, disconnectClauses || {})
267
- } : {}), {
268
- metadata: _object_spread_props(_object_spread({}, update.metadata), {
269
- couponCode: newParams.couponCode
270
- }),
271
- providerMetadata: _object_spread_props(_object_spread({}, update.providerMetadata), {
272
- couponCode: newParams.couponCode
273
- })
274
- });
275
- }
276
- if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
277
- return [
278
- 2,
279
- result
280
- ];
15
+ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams) => {
16
+ console.log('UPDATING INVOICE IF NEEDED');
17
+ const couponIsDifferent = oldReservationInvoice.couponCode !== newParams.couponCode;
18
+ if (!couponIsDifferent &&
19
+ oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
20
+ return new Ok(oldReservationInvoice);
21
+ }
22
+ // If the coupon or payment intent are differnt we should update the invoice
23
+ let update = {
24
+ stripePaymentIntentId: newParams.paymentIntentId,
25
+ couponCode: newParams.couponCode,
26
+ };
27
+ // If the coupon is different, we need to apply the coupon to the invoice
28
+ if (couponIsDifferent) {
29
+ if (newParams.couponCode) {
30
+ const result = await coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice);
31
+ if (result.ok) {
32
+ const { discounts, ...rest } = result.val;
33
+ const toDisconnect = discounts
34
+ ? oldReservationInvoice.discountIds?.filter((id) => !discounts.connect?.some((d) => d.id === id))
35
+ : undefined;
36
+ const disconnectClauses = toDisconnect?.length
37
+ ? {
38
+ disconnect: toDisconnect.map((id) => ({ id })),
281
39
  }
282
- return [
283
- 3,
284
- 3
285
- ];
286
- case 2:
287
- if (oldReservationInvoice.discountIds.length) {
288
- // No discounts, so we disconnect all of them
289
- update = {
40
+ : undefined;
41
+ update = {
42
+ ...update,
43
+ ...rest,
44
+ ...(discounts || disconnectClauses
45
+ ? {
290
46
  discounts: {
291
- disconnect: oldReservationInvoice.discountIds.map(function(id) {
292
- return {
293
- id: id
294
- };
295
- })
296
- }
297
- };
298
- }
299
- _state.label = 3;
300
- case 3:
301
- return [
302
- 4,
303
- wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update))
304
- ];
305
- case 4:
306
- updated = _state.sent();
307
- console.log('Updating invoice result', updated);
308
- if (!(updated.err && updated.val.code === 'invoice_pending')) return [
309
- 3,
310
- 6
311
- ];
312
- if (!(oldReservationInvoice.lockedAt && isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1)) || !oldReservationInvoice.lockedAt)) return [
313
- 3,
314
- 6
315
- ];
316
- return [
317
- 4,
318
- wrapInResult(biller.updateInvoice(oldReservationInvoice.id, _object_spread_props(_object_spread({}, update), {
319
- locked: false,
320
- lockedAt: null,
321
- lockReason: null,
322
- unlockAt: null,
323
- status: 'draft'
324
- })))
325
- ];
326
- case 5:
327
- updated = _state.sent();
328
- _state.label = 6;
329
- case 6:
330
- if (updated.err) {
331
- return [
332
- 2,
333
- updated
334
- ];
335
- }
336
- return [
337
- 2,
338
- new Ok(updated.val)
339
- ];
47
+ ...(discounts || {}),
48
+ ...(disconnectClauses || {}),
49
+ },
50
+ }
51
+ : {}),
52
+ metadata: {
53
+ ...update.metadata,
54
+ couponCode: newParams.couponCode,
55
+ },
56
+ providerMetadata: {
57
+ ...update.providerMetadata,
58
+ couponCode: newParams.couponCode,
59
+ },
60
+ };
340
61
  }
341
- });
342
- })();
343
- };
344
- export var createReservationInvoice = function(param) {
345
- var couponCode = param.couponCode, plan = param.plan, mileagePackage = param.mileagePackage, referralCode = param.referralCode, reservationId = param.reservationId, paymentIntentId = param.paymentIntentId, freeReservation = param.freeReservation, freeReservationReason = param.freeReservationReason, analytics = param.analytics, vehicle = param.vehicle, payer = param.payer, subscribingUser = param.subscribingUser;
346
- return _async_to_generator(function() {
347
- var finalCouponCode, referral, _tmp, referralCoupon, reservationAmount, invoiceCreateDetails, withCoupon;
348
- return _ts_generator(this, function(_state) {
349
- switch(_state.label){
350
- case 0:
351
- if (!freeReservation) return [
352
- 3,
353
- 2
354
- ];
355
- return [
356
- 4,
357
- wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
358
- payer: payer,
359
- vehicle: vehicle,
360
- plan: plan,
361
- mileagePackage: mileagePackage,
362
- paymentIntentId: paymentIntentId,
363
- freeReservation: freeReservation,
364
- freeReservationReason: freeReservationReason,
365
- analytics: analytics,
366
- reservationId: reservationId
367
- })))
368
- ];
369
- case 1:
370
- // It's a free reservation, so we don't need to add a coupon code
371
- return [
372
- 2,
373
- _state.sent()
374
- ];
375
- case 2:
376
- finalCouponCode = couponCode;
377
- _tmp = referralCode;
378
- if (!_tmp) return [
379
- 3,
380
- 4
381
- ];
382
- return [
383
- 4,
384
- prisma.referral.findUnique({
385
- where: {
386
- id: referralCode
387
- }
388
- })
389
- ];
390
- case 3:
391
- _tmp = _state.sent();
392
- _state.label = 4;
393
- case 4:
394
- referral = _tmp;
395
- if (!(!finalCouponCode && referral && referral.discountToReceiverCouponId && referral.discountToReceiverCouponApplicationName === 'reservationFee')) return [
396
- 3,
397
- 6
398
- ];
399
- return [
400
- 4,
401
- loadCoupon(referral.discountToReceiverCouponId)
402
- ];
403
- case 5:
404
- referralCoupon = _state.sent();
405
- if (referralCoupon) {
406
- finalCouponCode = referralCoupon.code;
407
- }
408
- _state.label = 6;
409
- case 6:
410
- reservationAmount = config.reservationFee;
411
- // We leave adding the coupon code applyCouponToUnsavedInvoice()
412
- invoiceCreateDetails = _object_spread_props(_object_spread({}, getInvoiceCreateDetails({
413
- payer: payer,
414
- vehicle: vehicle,
415
- plan: plan,
416
- mileagePackage: mileagePackage,
417
- paymentIntentId: paymentIntentId,
418
- freeReservation: freeReservation,
419
- freeReservationReason: freeReservationReason,
420
- analytics: analytics,
421
- reservationId: reservationId
422
- })), {
423
- lines: [
424
- {
425
- amount: reservationAmount,
426
- description: "Reservation fee for ".concat(vehicleName(vehicle)),
427
- chargingFor: 'reservationFee'
428
- }
429
- ]
430
- });
431
- if (!finalCouponCode) return [
432
- 3,
433
- 8
434
- ];
435
- return [
436
- 4,
437
- coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
438
- subscriptionPlans: plan,
439
- subscriptionMileagePackages: mileagePackage,
440
- vehicleId: vehicle.id,
441
- vehicleMake: vehicle.make,
442
- userId: subscribingUser.id,
443
- businessId: payer.object === 'business' ? payer.id : undefined,
444
- vehicleType: vehicle.type
445
- })
446
- ];
447
- case 7:
448
- withCoupon = _state.sent();
449
- if (withCoupon.err && withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
450
- return [
451
- 2,
452
- withCoupon
453
- ];
454
- }
455
- if (withCoupon.ok) {
456
- invoiceCreateDetails = _object_spread_props(_object_spread({}, withCoupon.val), {
457
- metadata: _object_spread_props(_object_spread({}, withCoupon.val.metadata), {
458
- couponCode: finalCouponCode
459
- }),
460
- providerMetadata: _object_spread_props(_object_spread({}, withCoupon.val.providerMetadata), {
461
- couponCode: finalCouponCode
462
- })
463
- });
464
- }
465
- _state.label = 8;
466
- case 8:
467
- console.log('CREATING INVOICE!!!!!!');
468
- console.dir(invoiceCreateDetails, {
469
- depth: null,
470
- colors: true
471
- });
472
- return [
473
- 4,
474
- wrapInResult(biller.createInvoice(invoiceCreateDetails))
475
- ];
476
- case 9:
477
- return [
478
- 2,
479
- _state.sent()
480
- ];
62
+ if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
63
+ return result;
481
64
  }
65
+ }
66
+ else if (oldReservationInvoice.discountIds.length) {
67
+ // No discounts, so we disconnect all of them
68
+ update = {
69
+ discounts: {
70
+ disconnect: oldReservationInvoice.discountIds.map((id) => ({
71
+ id,
72
+ })),
73
+ },
74
+ };
75
+ }
76
+ }
77
+ let updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update));
78
+ console.log('Updating invoice result', updated);
79
+ // If the invoice was locked due to pending status and we're more than 1 minute old, we unlock it
80
+ if (updated.err && updated.val.code === 'invoice_pending') {
81
+ if ((oldReservationInvoice.lockedAt &&
82
+ isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1))) ||
83
+ !oldReservationInvoice.lockedAt) {
84
+ updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, {
85
+ ...update,
86
+ locked: false,
87
+ lockedAt: null,
88
+ lockReason: null,
89
+ unlockAt: null,
90
+ status: 'draft',
91
+ }));
92
+ }
93
+ }
94
+ if (updated.err) {
95
+ return updated;
96
+ }
97
+ return new Ok(updated.val);
98
+ };
99
+ export const createReservationInvoice = async ({ couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser, }) => {
100
+ if (freeReservation) {
101
+ // It's a free reservation, so we don't need to add a coupon code
102
+ return await wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
103
+ payer,
104
+ vehicle,
105
+ plan,
106
+ mileagePackage,
107
+ paymentIntentId,
108
+ freeReservation,
109
+ freeReservationReason,
110
+ analytics,
111
+ reservationId,
112
+ })));
113
+ }
114
+ let finalCouponCode = couponCode;
115
+ // If we don't have a reservation coupon ID, we apply the referral discount if any
116
+ const referral = referralCode &&
117
+ (await prisma.referral.findUnique({
118
+ where: {
119
+ id: referralCode,
120
+ },
121
+ }));
122
+ if (!finalCouponCode &&
123
+ referral &&
124
+ referral.discountToReceiverCouponId &&
125
+ referral.discountToReceiverCouponApplicationName === 'reservationFee') {
126
+ const referralCoupon = await loadCoupon(referral.discountToReceiverCouponId);
127
+ if (referralCoupon) {
128
+ finalCouponCode = referralCoupon.code;
129
+ }
130
+ }
131
+ const reservationAmount = config.reservationFee;
132
+ // We leave adding the coupon code applyCouponToUnsavedInvoice()
133
+ let invoiceCreateDetails = {
134
+ ...getInvoiceCreateDetails({
135
+ payer,
136
+ vehicle,
137
+ plan,
138
+ mileagePackage,
139
+ paymentIntentId,
140
+ freeReservation,
141
+ freeReservationReason,
142
+ analytics,
143
+ reservationId,
144
+ }),
145
+ lines: [
146
+ {
147
+ amount: reservationAmount,
148
+ description: `Reservation fee for ${vehicleName(vehicle)}`,
149
+ chargingFor: 'reservationFee',
150
+ },
151
+ ],
152
+ };
153
+ if (finalCouponCode) {
154
+ const withCoupon = await coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
155
+ subscriptionPlans: plan,
156
+ subscriptionMileagePackages: mileagePackage,
157
+ vehicleId: vehicle.id,
158
+ vehicleMake: vehicle.make,
159
+ userId: subscribingUser.id,
160
+ businessId: payer.object === 'business' ? payer.id : undefined,
161
+ vehicleType: vehicle.type,
482
162
  });
483
- })();
163
+ if (withCoupon.err &&
164
+ withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
165
+ return withCoupon;
166
+ }
167
+ if (withCoupon.ok) {
168
+ invoiceCreateDetails = {
169
+ ...withCoupon.val,
170
+ metadata: {
171
+ ...withCoupon.val.metadata,
172
+ couponCode: finalCouponCode,
173
+ },
174
+ providerMetadata: {
175
+ ...withCoupon.val.providerMetadata,
176
+ couponCode: finalCouponCode,
177
+ },
178
+ };
179
+ }
180
+ }
181
+ return await wrapInResult(biller.createInvoice(invoiceCreateDetails));
484
182
  };
485
- var getInvoiceCreateDetails = function(param) {
486
- var invoiceId = param.invoiceId, payer = param.payer, date = param.date, reservationDiscountId = param.reservationDiscountId, vehicle = param.vehicle, plan = param.plan, mileagePackage = param.mileagePackage, couponCode = param.couponCode, paymentIntentId = param.paymentIntentId, freeReservation = param.freeReservation, freeReservationReason = param.freeReservationReason, analytics = param.analytics, reservationId = param.reservationId;
487
- var _payer_addresses;
488
- return _object_spread_props(_object_spread({
183
+ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId, }) => {
184
+ return {
489
185
  id: invoiceId || generateId('Invoice'),
490
186
  taxPercentage: 0,
187
+ attemptToSavePaymentMethod: true,
491
188
  payerName: 'name' in payer ? payer.name : userName(payer),
492
189
  payerEmail: payer.email,
493
190
  payerId: payer.id,
494
191
  ownerId: payer.id,
495
192
  payerType: payer.object,
496
- billingAddress: (payer === null || payer === void 0 ? void 0 : (_payer_addresses = payer.addresses) === null || _payer_addresses === void 0 ? void 0 : _payer_addresses.billing) || EMPTY_BILLING_ADDRESS,
497
- date: date !== null && date !== void 0 ? date : new Date(),
193
+ billingAddress: payer?.addresses?.billing || EMPTY_BILLING_ADDRESS,
194
+ date: date ?? new Date(),
498
195
  subscriptionPurpose: PURPOSE_RESERVATION,
499
196
  description: 'Reservation fee for a FLUX subscription',
500
- footer: "Invoice for a FLUX subscription reservation. Due by ".concat(format(date !== null && date !== void 0 ? date : new Date())),
501
- invoiceUrl: "".concat(config.appUrl, "/invoice-preview/").concat(invoiceId)
502
- }, reservationDiscountId ? {
503
- discounts: {
504
- connect: {
505
- id: reservationDiscountId
197
+ footer: `Invoice for a FLUX subscription reservation. Due by ${format(date ?? new Date())}`,
198
+ invoiceUrl: `${config.appUrl}/invoice-preview/${invoiceId}`,
199
+ ...(reservationDiscountId
200
+ ? {
201
+ discounts: {
202
+ connect: {
203
+ id: reservationDiscountId,
204
+ },
205
+ },
506
206
  }
507
- }
508
- } : {}), {
207
+ : {}),
509
208
  lines: [],
510
209
  subscriptionDetails: {
511
210
  vehicleId: vehicle.id,
@@ -514,36 +213,35 @@ var getInvoiceCreateDetails = function(param) {
514
213
  variant: vehicle.variant,
515
214
  year: vehicle.year,
516
215
  plan: plan,
517
- mileagePackage: mileagePackage
216
+ mileagePackage: mileagePackage,
518
217
  },
519
218
  stripePaymentIntentId: paymentIntentId,
520
- providerMetadata: _object_spread({
521
- plan: plan,
522
- mileagePackage: mileagePackage,
219
+ providerMetadata: {
220
+ plan,
221
+ mileagePackage,
523
222
  vehicleId: vehicle.id,
524
- vehicleName: vehicleName(vehicle)
525
- }, reservationId ? {
526
- reservationId: reservationId
527
- } : {}, couponCode ? {
528
- couponCode: couponCode
529
- } : {}),
223
+ vehicleName: vehicleName(vehicle),
224
+ ...(reservationId ? { reservationId } : {}),
225
+ ...(couponCode ? { couponCode } : {}),
226
+ },
530
227
  autoRetry: {
531
228
  enabled: false,
532
229
  interval: 0,
533
230
  maxAttempts: 0,
534
- attempts: 0
231
+ attempts: 0,
535
232
  },
536
- metadata: _object_spread_props(_object_spread({
233
+ metadata: {
537
234
  purpose: PURPOSE_RESERVATION,
538
- reservationId: reservationId,
235
+ reservationId,
539
236
  vehicleName: vehicleName(vehicle),
540
- plan: plan,
541
- mileagePackage: mileagePackage,
542
- couponCode: couponCode
543
- }, freeReservation && freeReservationReason ? {
544
- freeReservationReason: freeReservationReason
545
- } : {}), {
546
- analytics: analytics
547
- })
548
- });
237
+ plan,
238
+ mileagePackage,
239
+ couponCode,
240
+ ...(freeReservation && freeReservationReason
241
+ ? { freeReservationReason }
242
+ : {}),
243
+ analytics,
244
+ },
245
+ };
549
246
  };
247
+ //# sourceMappingURL=invoice.js.map