@driveflux/api-functions 0.0.7-next.34 → 0.0.7-next.35

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.
@@ -1,6 +1,6 @@
1
1
  import { config } from '@driveflux/config/backend';
2
2
  import { loadCoupon, PROBLEM_APPLICABLE_NOT_FOUND } from '@driveflux/coupon';
3
- import { prisma, } from '@driveflux/db';
3
+ import { prisma } from '@driveflux/db';
4
4
  import { generateId } from '@driveflux/db/id';
5
5
  import { EMPTY_BILLING_ADDRESS } from '@driveflux/db/models/other';
6
6
  import { PURPOSE_RESERVATION } from '@driveflux/db/models/subscription';
@@ -12,16 +12,15 @@ import { Ok } from '@driveflux/result';
12
12
  import { format } from '@driveflux/time';
13
13
  import { isAfter } from 'date-fns/isAfter';
14
14
  import { subMinutes } from 'date-fns/subMinutes';
15
- export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams) => {
15
+ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, newParams)=>{
16
16
  const couponIsDifferent = oldReservationInvoice.couponCode !== newParams.couponCode;
17
- if (!couponIsDifferent &&
18
- oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
17
+ if (!couponIsDifferent && oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
19
18
  return new Ok(oldReservationInvoice);
20
19
  }
21
20
  // If the coupon or payment intent are differnt we should update the invoice
22
21
  let update = {
23
22
  stripePaymentIntentId: newParams.paymentIntentId,
24
- couponCode: newParams.couponCode,
23
+ couponCode: newParams.couponCode
25
24
  };
26
25
  // If the coupon is different, we need to apply the coupon to the invoice
27
26
  if (couponIsDifferent) {
@@ -29,63 +28,56 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
29
28
  const result = await coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice);
30
29
  if (result.ok) {
31
30
  const { discounts, ...rest } = result.val;
32
- const toDisconnect = discounts
33
- ? oldReservationInvoice.discountIds?.filter((id) => !discounts.connect?.some((d) => d.id === id))
34
- : undefined;
35
- const disconnectClauses = toDisconnect?.length
36
- ? {
37
- disconnect: toDisconnect.map((id) => ({ id })),
38
- }
39
- : undefined;
31
+ const toDisconnect = discounts ? oldReservationInvoice.discountIds?.filter((id)=>!discounts.connect?.some((d)=>d.id === id)) : undefined;
32
+ const disconnectClauses = toDisconnect?.length ? {
33
+ disconnect: toDisconnect.map((id)=>({
34
+ id
35
+ }))
36
+ } : undefined;
40
37
  update = {
41
38
  ...update,
42
39
  ...rest,
43
- ...(discounts || disconnectClauses
44
- ? {
45
- discounts: {
46
- ...(discounts || {}),
47
- ...(disconnectClauses || {}),
48
- },
40
+ ...discounts || disconnectClauses ? {
41
+ discounts: {
42
+ ...discounts || {},
43
+ ...disconnectClauses || {}
49
44
  }
50
- : {}),
45
+ } : {},
51
46
  metadata: {
52
47
  ...update.metadata,
53
- couponCode: newParams.couponCode,
48
+ couponCode: newParams.couponCode
54
49
  },
55
50
  providerMetadata: {
56
51
  ...update.providerMetadata,
57
- couponCode: newParams.couponCode,
58
- },
52
+ couponCode: newParams.couponCode
53
+ }
59
54
  };
60
55
  }
61
56
  if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
62
57
  return result;
63
58
  }
64
- }
65
- else if (oldReservationInvoice.discountIds.length) {
59
+ } else if (oldReservationInvoice.discountIds.length) {
66
60
  // No discounts, so we disconnect all of them
67
61
  update = {
68
62
  discounts: {
69
- disconnect: oldReservationInvoice.discountIds.map((id) => ({
70
- id,
71
- })),
72
- },
63
+ disconnect: oldReservationInvoice.discountIds.map((id)=>({
64
+ id
65
+ }))
66
+ }
73
67
  };
74
68
  }
75
69
  }
76
70
  let updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update));
77
71
  // If the invoice was locked due to pending status and we're more than 1 minute old, we unlock it
78
72
  if (updated.err && updated.val.code === 'invoice_pending') {
79
- if ((oldReservationInvoice.lockedAt &&
80
- isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1))) ||
81
- !oldReservationInvoice.lockedAt) {
73
+ if (oldReservationInvoice.lockedAt && isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1)) || !oldReservationInvoice.lockedAt) {
82
74
  updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, {
83
75
  ...update,
84
76
  locked: false,
85
77
  lockedAt: null,
86
78
  lockReason: null,
87
79
  unlockAt: null,
88
- status: 'draft',
80
+ status: 'draft'
89
81
  }));
90
82
  }
91
83
  }
@@ -94,7 +86,7 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
94
86
  }
95
87
  return new Ok(updated.val);
96
88
  };
97
- export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser, }) => {
89
+ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser })=>{
98
90
  if (freeReservation) {
99
91
  // It's a free reservation, so we don't need to add a coupon code
100
92
  return await wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
@@ -107,21 +99,17 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
107
99
  freeReservation,
108
100
  freeReservationReason,
109
101
  analytics,
110
- reservationId,
102
+ reservationId
111
103
  })));
112
104
  }
113
105
  let finalCouponCode = couponCode;
114
106
  // If we don't have a reservation coupon ID, we apply the referral discount if any
115
- const referral = referralCode &&
116
- (await prisma.referral.findUnique({
117
- where: {
118
- id: referralCode,
119
- },
120
- }));
121
- if (!finalCouponCode &&
122
- referral &&
123
- referral.discountToReceiverCouponId &&
124
- referral.discountToReceiverCouponApplicationName === 'reservationFee') {
107
+ const referral = referralCode && await prisma.referral.findUnique({
108
+ where: {
109
+ id: referralCode
110
+ }
111
+ });
112
+ if (!finalCouponCode && referral && referral.discountToReceiverCouponId && referral.discountToReceiverCouponApplicationName === 'reservationFee') {
125
113
  const referralCoupon = await loadCoupon(referral.discountToReceiverCouponId);
126
114
  if (referralCoupon) {
127
115
  finalCouponCode = referralCoupon.code;
@@ -140,15 +128,15 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
140
128
  freeReservation,
141
129
  freeReservationReason,
142
130
  analytics,
143
- reservationId,
131
+ reservationId
144
132
  }),
145
133
  lines: [
146
134
  {
147
135
  amount: reservationAmount,
148
136
  description: `Reservation fee for ${vehicleName(vehicle)}`,
149
- chargingFor: 'reservationFee',
150
- },
151
- ],
137
+ chargingFor: 'reservationFee'
138
+ }
139
+ ]
152
140
  };
153
141
  if (finalCouponCode) {
154
142
  const withCoupon = await coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
@@ -158,10 +146,9 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
158
146
  vehicleMake: vehicle.make,
159
147
  userId: subscribingUser.id,
160
148
  businessId: payer.object === 'business' ? payer.id : undefined,
161
- vehicleType: vehicle.type,
149
+ vehicleType: vehicle.type
162
150
  });
163
- if (withCoupon.err &&
164
- withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
151
+ if (withCoupon.err && withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
165
152
  return withCoupon;
166
153
  }
167
154
  if (withCoupon.ok) {
@@ -169,18 +156,18 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
169
156
  ...withCoupon.val,
170
157
  metadata: {
171
158
  ...withCoupon.val.metadata,
172
- couponCode: finalCouponCode,
159
+ couponCode: finalCouponCode
173
160
  },
174
161
  providerMetadata: {
175
162
  ...withCoupon.val.providerMetadata,
176
- couponCode: finalCouponCode,
177
- },
163
+ couponCode: finalCouponCode
164
+ }
178
165
  };
179
166
  }
180
167
  }
181
168
  return await wrapInResult(biller.createInvoice(invoiceCreateDetails));
182
169
  };
183
- const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId, }) => {
170
+ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId })=>{
184
171
  return {
185
172
  id: invoiceId || generateId('Invoice'),
186
173
  taxPercentage: 0,
@@ -196,15 +183,13 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
196
183
  description: 'Reservation fee for a FLUX subscription',
197
184
  footer: `Invoice for a FLUX subscription reservation. Due by ${format(date ?? new Date())}`,
198
185
  invoiceUrl: `${config.appUrl}/invoice-preview/${invoiceId}`,
199
- ...(reservationDiscountId
200
- ? {
201
- discounts: {
202
- connect: {
203
- id: reservationDiscountId,
204
- },
205
- },
186
+ ...reservationDiscountId ? {
187
+ discounts: {
188
+ connect: {
189
+ id: reservationDiscountId
190
+ }
206
191
  }
207
- : {}),
192
+ } : {},
208
193
  lines: [],
209
194
  subscriptionDetails: {
210
195
  vehicleId: vehicle.id,
@@ -213,7 +198,7 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
213
198
  variant: vehicle.variant,
214
199
  year: vehicle.year,
215
200
  plan: plan,
216
- mileagePackage: mileagePackage,
201
+ mileagePackage: mileagePackage
217
202
  },
218
203
  stripePaymentIntentId: paymentIntentId,
219
204
  providerMetadata: {
@@ -221,14 +206,18 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
221
206
  mileagePackage,
222
207
  vehicleId: vehicle.id,
223
208
  vehicleName: vehicleName(vehicle),
224
- ...(reservationId ? { reservationId } : {}),
225
- ...(couponCode ? { couponCode } : {}),
209
+ ...reservationId ? {
210
+ reservationId
211
+ } : {},
212
+ ...couponCode ? {
213
+ couponCode
214
+ } : {}
226
215
  },
227
216
  autoRetry: {
228
217
  enabled: false,
229
218
  interval: 0,
230
219
  maxAttempts: 0,
231
- attempts: 0,
220
+ attempts: 0
232
221
  },
233
222
  metadata: {
234
223
  purpose: PURPOSE_RESERVATION,
@@ -237,11 +226,10 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
237
226
  plan,
238
227
  mileagePackage,
239
228
  couponCode,
240
- ...(freeReservation && freeReservationReason
241
- ? { freeReservationReason }
242
- : {}),
243
- analytics,
244
- },
229
+ ...freeReservation && freeReservationReason ? {
230
+ freeReservationReason
231
+ } : {},
232
+ analytics
233
+ }
245
234
  };
246
235
  };
247
- //# sourceMappingURL=invoice.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@driveflux/api-functions",
3
- "version": "0.0.7-next.34",
3
+ "version": "0.0.7-next.35",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./notion": {
@@ -73,7 +73,7 @@
73
73
  ],
74
74
  "dependencies": {
75
75
  "@casl/ability": "^6.7.3",
76
- "@driveflux/auth": "3.0.0-next.19",
76
+ "@driveflux/auth": "3.0.0-next.20",
77
77
  "@driveflux/billing": "7.0.0-develop.42",
78
78
  "@driveflux/config": "2.1.0-next.5",
79
79
  "@driveflux/coupon": "8.0.0-develop.61",