@driveflux/api-functions 0.0.7-next.11 → 0.0.7-next.13

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 (43) hide show
  1. package/dist/auth/confirm.js +29 -24
  2. package/dist/auth/emails.js +13 -12
  3. package/dist/auth/formatter.js +5 -5
  4. package/dist/auth/otp.js +50 -66
  5. package/dist/auth/register.js +34 -42
  6. package/dist/auth/tokens.js +55 -58
  7. package/dist/auth/verifications.js +52 -53
  8. package/dist/constants.js +1 -0
  9. package/dist/mailjet/calls/manage-contacts-in-list.js +6 -5
  10. package/dist/mailjet/calls/manage-subscription-status.js +5 -4
  11. package/dist/mailjet/calls/request-service.js +6 -7
  12. package/dist/mailjet/refresh-email-preferences.js +12 -11
  13. package/dist/mailjet/set-contact.js +12 -11
  14. package/dist/mailjet/types.js +2 -1
  15. package/dist/mailjet/utils/convert-to-array.js +6 -8
  16. package/dist/mailjet/utils/extract-email-preferences.js +15 -14
  17. package/dist/mailjet/utils/lists.js +8 -7
  18. package/dist/mailjet/utils/update-email-references.js +15 -16
  19. package/dist/notion/client.js +19 -22
  20. package/dist/notion/helpful.js +9 -6
  21. package/dist/notion/schemas/block.js +48 -42
  22. package/dist/notion/schemas/common.js +14 -9
  23. package/dist/notion/schemas/database.js +60 -62
  24. package/dist/notion/schemas/emoji.js +2 -1
  25. package/dist/notion/schemas/file.js +9 -9
  26. package/dist/notion/schemas/kb.js +6 -5
  27. package/dist/notion/schemas/page.js +61 -72
  28. package/dist/notion/schemas/parent.js +5 -4
  29. package/dist/notion/schemas/user.js +19 -18
  30. package/dist/reservation/agree.js +7 -6
  31. package/dist/reservation/checks.js +4 -3
  32. package/dist/reservation/display-vehicle.js +71 -65
  33. package/dist/reservation/invoice.js +74 -62
  34. package/dist/reservation/payer.js +6 -5
  35. package/dist/reservation/reserve.js +4 -3
  36. package/dist/reservation/types.js +2 -1
  37. package/dist/reservation/vehicle.js +16 -13
  38. package/dist/slack.js +29 -24
  39. package/dist/validation.js +71 -69
  40. package/dist/vehicle/vehicle-pricing/constants.js +19 -22
  41. package/dist/vehicle/vehicle-pricing/index.js +42 -28
  42. package/dist/vehicle/vehicle-pricing/types.js +2 -1
  43. package/package.json +10 -10
@@ -1,75 +1,73 @@
1
1
  import { config } from '@driveflux/config/backend';
2
- import { prisma } from '@driveflux/db';
2
+ import { prisma, } from '@driveflux/db';
3
3
  import { generateId } from '@driveflux/db/id';
4
4
  import { createPricingController } from '@driveflux/db/models/vehicle';
5
- import { getFluxExcessMileage, getFluxPiceMatrix, getHostExcessMileage, getHostsMatrix, getRecommendedMotorcycleDeposit, getStartFeeMatrix } from '../vehicle/vehicle-pricing/index.js';
6
- export const fetchDisplayVehicle = async (displayVehicle)=>{
7
- return typeof displayVehicle === 'string' ? await prisma.displayVehicle.findFirst({
8
- where: {
9
- id: displayVehicle
10
- }
11
- }) : displayVehicle;
5
+ import { getFluxExcessMileage, getFluxPiceMatrix, getHostExcessMileage, getHostsMatrix, getRecommendedMotorcycleDeposit, getStartFeeMatrix, } from '../vehicle/vehicle-pricing/index.js';
6
+ export const fetchDisplayVehicle = async (displayVehicle) => {
7
+ return typeof displayVehicle === 'string'
8
+ ? await prisma.displayVehicle.findFirst({ where: { id: displayVehicle } })
9
+ : displayVehicle;
12
10
  };
13
- export const createVehicleFromDisplayVehicle = async (displayVehicle, selectedColor)=>{
11
+ export const createVehicleFromDisplayVehicle = async (displayVehicle, selectedColor) => {
14
12
  const dv = await fetchDisplayVehicle(displayVehicle);
15
- if (!dv || typeof dv !== 'object') return;
16
- if (!dv.details) return;
17
- const mainImage = dv.images.main.find((m)=>m.variant === selectedColor)?.url;
13
+ if (!dv || typeof dv !== 'object')
14
+ return;
15
+ if (!dv.details)
16
+ return;
17
+ const mainImage = dv.images.main.find((m) => m.variant === selectedColor)?.url;
18
18
  const vehicleData = {
19
19
  id: generateId('Vehicle'),
20
20
  ...transformBasicVehicleData(dv),
21
21
  images: [
22
- ...mainImage ? [
23
- transfromSingleImage(mainImage)
24
- ] : [],
25
- ...transformImages(dv.images)
22
+ ...(mainImage ? [transfromSingleImage(mainImage)] : []),
23
+ ...transformImages(dv.images),
26
24
  ],
27
25
  ...transformBasePrices(dv.pricing),
28
26
  pricing: transformPriceMatrix(dv.type, dv.pricing),
29
27
  details: transformDetails(dv.details, selectedColor),
30
28
  host: {
31
29
  connect: {
32
- id: dv.defaultHostId
33
- }
30
+ id: dv.defaultHostId,
31
+ },
34
32
  },
35
33
  displayVehicle: {
36
34
  connect: {
37
- id: dv.id
38
- }
39
- }
35
+ id: dv.id,
36
+ },
37
+ },
40
38
  };
41
39
  return await prisma.vehicle.create({
42
40
  data: vehicleData,
43
41
  include: {
44
- host: true
45
- }
42
+ host: true,
43
+ },
46
44
  });
47
45
  };
48
- export const transfromVehicleDisplayToVehicle = async (displayVehicle, selectedColor)=>{
46
+ export const transfromVehicleDisplayToVehicle = async (displayVehicle, selectedColor) => {
49
47
  const dv = await fetchDisplayVehicle(displayVehicle);
50
- if (!dv || typeof dv !== 'object') return;
51
- if (!dv.details) return;
52
- const mainImage = dv.images.main.find((m)=>m.variant === selectedColor)?.url;
48
+ if (!dv || typeof dv !== 'object')
49
+ return;
50
+ if (!dv.details)
51
+ return;
52
+ const mainImage = dv.images.main.find((m) => m.variant === selectedColor)?.url;
53
53
  return {
54
54
  id: dv.id,
55
55
  ...transformBasicVehicleData(dv),
56
56
  images: [
57
- ...mainImage ? [
58
- transfromSingleImage(mainImage)
59
- ] : [],
60
- ...transformImages(dv.images)
57
+ ...(mainImage ? [transfromSingleImage(mainImage)] : []),
58
+ ...transformImages(dv.images),
61
59
  ],
62
60
  ...transformBasePrices(dv.pricing),
63
61
  pricing: transformPriceMatrix(dv.type, dv.pricing),
64
62
  details: transformDetails(dv.details, selectedColor),
65
63
  host: {
66
64
  address: {
67
- state: 'Kuala Lumpur'
68
- }
69
- }
65
+ state: 'Kuala Lumpur',
66
+ },
67
+ },
70
68
  };
71
69
  };
72
- export const transformBasicVehicleData = (dv)=>{
70
+ export const transformBasicVehicleData = (dv) => {
73
71
  return {
74
72
  registrationNumber: null,
75
73
  featured: false,
@@ -87,17 +85,17 @@ export const transformBasicVehicleData = (dv)=>{
87
85
  type: dv.type,
88
86
  niceName: `${dv.make} ${dv.vehicleModel} ${dv.variant} ${dv.year}`,
89
87
  niceNameShort: `${dv.make} ${dv.vehicleModel}`,
90
- appliedCoupon: dv.appliedCoupon
88
+ appliedCoupon: dv.appliedCoupon,
91
89
  };
92
90
  };
93
- export const transformImages = (images)=>{
91
+ export const transformImages = (images) => {
94
92
  return [
95
93
  transfromSingleImage(images.exterior[0].url, 'exterior'),
96
94
  transfromSingleImage(images.interior[0].url, 'interior'),
97
- ...images.gallery.map((i)=>transfromSingleImage(i.url))
95
+ ...images.gallery.map((i) => transfromSingleImage(i.url)),
98
96
  ];
99
97
  };
100
- const transfromSingleImage = (imageUrl, inspectionType)=>{
98
+ const transfromSingleImage = (imageUrl, inspectionType) => {
101
99
  return {
102
100
  default: imageUrl,
103
101
  blurBase64: null,
@@ -108,20 +106,20 @@ const transfromSingleImage = (imageUrl, inspectionType)=>{
108
106
  description: null,
109
107
  inspection: !!inspectionType,
110
108
  inspectionType: inspectionType || null,
111
- notActualPhoto: true
109
+ notActualPhoto: true,
112
110
  };
113
111
  };
114
- const transformBasePrices = (pricing)=>{
112
+ const transformBasePrices = (pricing) => {
115
113
  return {
116
114
  basePrice: pricing.matrix.plan36.lite,
117
115
  basePricePlan1: pricing.matrix.plan1.lite,
118
116
  basePricePlan12: pricing.matrix.plan12.lite,
119
117
  basePricePlan24: pricing.matrix.plan24.lite,
120
118
  basePricePlan36: pricing.matrix.plan36.lite,
121
- basePricePlan60: pricing.matrix.plan60.lite
119
+ basePricePlan60: pricing.matrix.plan60.lite,
122
120
  };
123
121
  };
124
- const transformPriceMatrix = (vehicleType, pricing)=>{
122
+ const transformPriceMatrix = (vehicleType, pricing) => {
125
123
  const baseline = pricing?.matrix.plan36.lite;
126
124
  const ultraTier = 'tier1';
127
125
  const fluxPriceCoefficient = 25;
@@ -134,14 +132,16 @@ const transformPriceMatrix = (vehicleType, pricing)=>{
134
132
  const { availablePlans, availableMileagePackages } = getNonZeroKeys(priceMatrix);
135
133
  const pricingController = createPricingController({
136
134
  coefficient: fluxPriceCoefficient,
137
- vehicleType
135
+ vehicleType,
138
136
  });
139
137
  const startFeeMatrix = excludeServiceFeesFrom(getStartFeeMatrix(pricingController, baseline, flatPricing));
140
138
  const hostMatrix = excludeServiceFeesFrom(getHostsMatrix(pricingController, baseline, ultraTier, flatPricing));
141
139
  const hostExcessMileage = getHostExcessMileage(pricingController, baseline);
142
140
  const fluxPriceMatrix = excludeServiceFeesFrom(getFluxPiceMatrix(pricingController, vehicleType, baseline, hostMatrix, ultraTier, flatPricing));
143
141
  const fluxExcessMileage = getFluxExcessMileage(pricingController, baseline);
144
- const recommendedDeposit = pricing.refundableDeposit || vehicleType === 'motorcycle' ? getRecommendedMotorcycleDeposit(baseline) : null;
142
+ const recommendedDeposit = pricing.refundableDeposit || vehicleType === 'motorcycle'
143
+ ? getRecommendedMotorcycleDeposit(baseline)
144
+ : null;
145
145
  return {
146
146
  tmv,
147
147
  gfv,
@@ -160,31 +160,31 @@ const transformPriceMatrix = (vehicleType, pricing)=>{
160
160
  excessMileage: fluxExcessMileage,
161
161
  originalExcessMileage: fluxExcessMileage,
162
162
  matrixComments: null,
163
- add: null
163
+ add: null,
164
164
  },
165
165
  hostTake: {
166
166
  matrix: hostMatrix,
167
167
  originalMatrix: hostMatrix,
168
168
  excessMileage: hostExcessMileage,
169
169
  originalExcessMileage: hostExcessMileage,
170
- matrixComments: null
170
+ matrixComments: null,
171
171
  },
172
172
  startFee: {
173
173
  matrix: startFeeMatrix,
174
174
  originalMatrix: startFeeMatrix,
175
- matrixComments: null
176
- }
175
+ matrixComments: null,
176
+ },
177
177
  };
178
178
  };
179
- const getNonZeroKeys = (matrix)=>{
179
+ const getNonZeroKeys = (matrix) => {
180
180
  const planKeys = new Set();
181
181
  const mileageKeys = new Set();
182
- for (const [plan, mileageMap] of Object.entries(matrix)){
182
+ for (const [plan, mileageMap] of Object.entries(matrix)) {
183
183
  const entries = Object.entries(mileageMap ?? {});
184
- const hasNonZero = entries.some(([_, value])=>(value ?? 0) > 0);
184
+ const hasNonZero = entries.some(([_, value]) => (value ?? 0) > 0);
185
185
  if (hasNonZero) {
186
186
  planKeys.add(plan);
187
- for (const [mileage, value] of entries){
187
+ for (const [mileage, value] of entries) {
188
188
  if ((value ?? 0) > 0) {
189
189
  mileageKeys.add(mileage);
190
190
  }
@@ -193,20 +193,20 @@ const getNonZeroKeys = (matrix)=>{
193
193
  }
194
194
  return {
195
195
  availablePlans: Array.from(planKeys),
196
- availableMileagePackages: Array.from(mileageKeys)
196
+ availableMileagePackages: Array.from(mileageKeys),
197
197
  };
198
198
  };
199
- const _getInspection = ()=>{
199
+ const _getInspection = () => {
200
200
  return {
201
201
  exterior: 5,
202
202
  interior: 5,
203
203
  engine: 5,
204
204
  frame: 5,
205
205
  total: 5,
206
- comment: 'COMMENT HERE'
206
+ comment: 'COMMENT HERE',
207
207
  };
208
208
  };
209
- const transformDetails = (details, selectColor)=>{
209
+ const transformDetails = (details, selectColor) => {
210
210
  const color = selectColor || details.colors[0].name || '';
211
211
  return {
212
212
  numberOfSeats: details.numberOfSeats,
@@ -214,25 +214,31 @@ const transformDetails = (details, selectColor)=>{
214
214
  bodyType: details.bodyType,
215
215
  transmission: details.transmission,
216
216
  engineType: details.fuelType,
217
- engineCapacity: details.fuelType === 'electric' ? details.batteryCapacity : details.engineCapacity,
217
+ engineCapacity: details.fuelType === 'electric'
218
+ ? details.batteryCapacity
219
+ : details.engineCapacity,
218
220
  drivetrain: details.drivetrain,
219
221
  accelerationTo100km: details.accelerationTo100km,
220
222
  fuelConsumptionLitersPer100Km: details.fuelConsumptionLitersPer100Km,
221
223
  color,
222
224
  features: details.features,
223
- condition: 'new'
225
+ condition: 'new',
224
226
  };
225
227
  };
226
- const excludeServiceFeesFrom = (originalMatrix)=>{
228
+ const excludeServiceFeesFrom = (originalMatrix) => {
227
229
  const matrix = {};
228
- for (const [planKey, planValue] of Object.entries(originalMatrix)){
229
- if (!planValue) continue;
230
- if (!matrix[planKey]) matrix[planKey] = {};
231
- for (const [mileageKey, price] of Object.entries(planValue)){
230
+ for (const [planKey, planValue] of Object.entries(originalMatrix)) {
231
+ if (!planValue)
232
+ continue;
233
+ if (!matrix[planKey])
234
+ matrix[planKey] = {};
235
+ for (const [mileageKey, price] of Object.entries(planValue)) {
232
236
  if (typeof price === 'number') {
233
- matrix[planKey][mileageKey] = price / (1 + config.serviceRate);
237
+ matrix[planKey][mileageKey] =
238
+ price / (1 + config.serviceRate);
234
239
  }
235
240
  }
236
241
  }
237
242
  return matrix;
238
243
  };
244
+ //# sourceMappingURL=display-vehicle.js.map
@@ -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,15 +12,16 @@ 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 && oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
17
+ if (!couponIsDifferent &&
18
+ oldReservationInvoice.stripePaymentIntentId === newParams.paymentIntentId) {
18
19
  return new Ok(oldReservationInvoice);
19
20
  }
20
21
  // If the coupon or payment intent are differnt we should update the invoice
21
22
  let update = {
22
23
  stripePaymentIntentId: newParams.paymentIntentId,
23
- couponCode: newParams.couponCode
24
+ couponCode: newParams.couponCode,
24
25
  };
25
26
  // If the coupon is different, we need to apply the coupon to the invoice
26
27
  if (couponIsDifferent) {
@@ -28,56 +29,63 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
28
29
  const result = await coupons.applyCouponToUnsavedInvoice(newParams.couponCode, oldReservationInvoice);
29
30
  if (result.ok) {
30
31
  const { discounts, ...rest } = result.val;
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;
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;
37
40
  update = {
38
41
  ...update,
39
42
  ...rest,
40
- ...discounts || disconnectClauses ? {
41
- discounts: {
42
- ...discounts || {},
43
- ...disconnectClauses || {}
43
+ ...(discounts || disconnectClauses
44
+ ? {
45
+ discounts: {
46
+ ...(discounts || {}),
47
+ ...(disconnectClauses || {}),
48
+ },
44
49
  }
45
- } : {},
50
+ : {}),
46
51
  metadata: {
47
52
  ...update.metadata,
48
- couponCode: newParams.couponCode
53
+ couponCode: newParams.couponCode,
49
54
  },
50
55
  providerMetadata: {
51
56
  ...update.providerMetadata,
52
- couponCode: newParams.couponCode
53
- }
57
+ couponCode: newParams.couponCode,
58
+ },
54
59
  };
55
60
  }
56
61
  if (result.err && result.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
57
62
  return result;
58
63
  }
59
- } else if (oldReservationInvoice.discountIds.length) {
64
+ }
65
+ else if (oldReservationInvoice.discountIds.length) {
60
66
  // No discounts, so we disconnect all of them
61
67
  update = {
62
68
  discounts: {
63
- disconnect: oldReservationInvoice.discountIds.map((id)=>({
64
- id
65
- }))
66
- }
69
+ disconnect: oldReservationInvoice.discountIds.map((id) => ({
70
+ id,
71
+ })),
72
+ },
67
73
  };
68
74
  }
69
75
  }
70
76
  let updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, update));
71
77
  // If the invoice was locked due to pending status and we're more than 1 minute old, we unlock it
72
78
  if (updated.err && updated.val.code === 'invoice_pending') {
73
- if (oldReservationInvoice.lockedAt && isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1)) || !oldReservationInvoice.lockedAt) {
79
+ if ((oldReservationInvoice.lockedAt &&
80
+ isAfter(oldReservationInvoice.lockedAt, subMinutes(new Date(), 1))) ||
81
+ !oldReservationInvoice.lockedAt) {
74
82
  updated = await wrapInResult(biller.updateInvoice(oldReservationInvoice.id, {
75
83
  ...update,
76
84
  locked: false,
77
85
  lockedAt: null,
78
86
  lockReason: null,
79
87
  unlockAt: null,
80
- status: 'draft'
88
+ status: 'draft',
81
89
  }));
82
90
  }
83
91
  }
@@ -86,7 +94,7 @@ export const updateReservationInvoiceIfNeeded = async (oldReservationInvoice, ne
86
94
  }
87
95
  return new Ok(updated.val);
88
96
  };
89
- export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser })=>{
97
+ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mileagePackage, referralCode, reservationId, paymentIntentId, freeReservation, freeReservationReason, analytics, vehicle, payer, subscribingUser, }) => {
90
98
  if (freeReservation) {
91
99
  // It's a free reservation, so we don't need to add a coupon code
92
100
  return await wrapInResult(biller.createInvoice(getInvoiceCreateDetails({
@@ -99,17 +107,21 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
99
107
  freeReservation,
100
108
  freeReservationReason,
101
109
  analytics,
102
- reservationId
110
+ reservationId,
103
111
  })));
104
112
  }
105
113
  let finalCouponCode = couponCode;
106
114
  // If we don't have a reservation coupon ID, we apply the referral discount if any
107
- const referral = referralCode && await prisma.referral.findUnique({
108
- where: {
109
- id: referralCode
110
- }
111
- });
112
- if (!finalCouponCode && referral && referral.discountToReceiverCouponId && referral.discountToReceiverCouponApplicationName === 'reservationFee') {
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') {
113
125
  const referralCoupon = await loadCoupon(referral.discountToReceiverCouponId);
114
126
  if (referralCoupon) {
115
127
  finalCouponCode = referralCoupon.code;
@@ -128,15 +140,15 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
128
140
  freeReservation,
129
141
  freeReservationReason,
130
142
  analytics,
131
- reservationId
143
+ reservationId,
132
144
  }),
133
145
  lines: [
134
146
  {
135
147
  amount: reservationAmount,
136
148
  description: `Reservation fee for ${vehicleName(vehicle)}`,
137
- chargingFor: 'reservationFee'
138
- }
139
- ]
149
+ chargingFor: 'reservationFee',
150
+ },
151
+ ],
140
152
  };
141
153
  if (finalCouponCode) {
142
154
  const withCoupon = await coupons.applyCouponToUnsavedInvoice(finalCouponCode, invoiceCreateDetails, 'reservationFee', {
@@ -146,9 +158,10 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
146
158
  vehicleMake: vehicle.make,
147
159
  userId: subscribingUser.id,
148
160
  businessId: payer.object === 'business' ? payer.id : undefined,
149
- vehicleType: vehicle.type
161
+ vehicleType: vehicle.type,
150
162
  });
151
- if (withCoupon.err && withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
163
+ if (withCoupon.err &&
164
+ withCoupon.val.code !== PROBLEM_APPLICABLE_NOT_FOUND) {
152
165
  return withCoupon;
153
166
  }
154
167
  if (withCoupon.ok) {
@@ -156,18 +169,18 @@ export const createReservationInvoice = async ({ invoiceId, couponCode, plan, mi
156
169
  ...withCoupon.val,
157
170
  metadata: {
158
171
  ...withCoupon.val.metadata,
159
- couponCode: finalCouponCode
172
+ couponCode: finalCouponCode,
160
173
  },
161
174
  providerMetadata: {
162
175
  ...withCoupon.val.providerMetadata,
163
- couponCode: finalCouponCode
164
- }
176
+ couponCode: finalCouponCode,
177
+ },
165
178
  };
166
179
  }
167
180
  }
168
181
  return await wrapInResult(biller.createInvoice(invoiceCreateDetails));
169
182
  };
170
- const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId })=>{
183
+ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId, vehicle, plan, mileagePackage, couponCode, paymentIntentId, freeReservation, freeReservationReason, analytics, reservationId, }) => {
171
184
  return {
172
185
  id: invoiceId || generateId('Invoice'),
173
186
  taxPercentage: 0,
@@ -183,13 +196,15 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
183
196
  description: 'Reservation fee for a FLUX subscription',
184
197
  footer: `Invoice for a FLUX subscription reservation. Due by ${format(date ?? new Date())}`,
185
198
  invoiceUrl: `${config.appUrl}/invoice-preview/${invoiceId}`,
186
- ...reservationDiscountId ? {
187
- discounts: {
188
- connect: {
189
- id: reservationDiscountId
190
- }
199
+ ...(reservationDiscountId
200
+ ? {
201
+ discounts: {
202
+ connect: {
203
+ id: reservationDiscountId,
204
+ },
205
+ },
191
206
  }
192
- } : {},
207
+ : {}),
193
208
  lines: [],
194
209
  subscriptionDetails: {
195
210
  vehicleId: vehicle.id,
@@ -198,7 +213,7 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
198
213
  variant: vehicle.variant,
199
214
  year: vehicle.year,
200
215
  plan: plan,
201
- mileagePackage: mileagePackage
216
+ mileagePackage: mileagePackage,
202
217
  },
203
218
  stripePaymentIntentId: paymentIntentId,
204
219
  providerMetadata: {
@@ -206,18 +221,14 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
206
221
  mileagePackage,
207
222
  vehicleId: vehicle.id,
208
223
  vehicleName: vehicleName(vehicle),
209
- ...reservationId ? {
210
- reservationId
211
- } : {},
212
- ...couponCode ? {
213
- couponCode
214
- } : {}
224
+ ...(reservationId ? { reservationId } : {}),
225
+ ...(couponCode ? { couponCode } : {}),
215
226
  },
216
227
  autoRetry: {
217
228
  enabled: false,
218
229
  interval: 0,
219
230
  maxAttempts: 0,
220
- attempts: 0
231
+ attempts: 0,
221
232
  },
222
233
  metadata: {
223
234
  purpose: PURPOSE_RESERVATION,
@@ -226,10 +237,11 @@ const getInvoiceCreateDetails = ({ invoiceId, payer, date, reservationDiscountId
226
237
  plan,
227
238
  mileagePackage,
228
239
  couponCode,
229
- ...freeReservation && freeReservationReason ? {
230
- freeReservationReason
231
- } : {},
232
- analytics
233
- }
240
+ ...(freeReservation && freeReservationReason
241
+ ? { freeReservationReason }
242
+ : {}),
243
+ analytics,
244
+ },
234
245
  };
235
246
  };
247
+ //# sourceMappingURL=invoice.js.map
@@ -1,7 +1,7 @@
1
1
  import { prisma } from '@driveflux/db';
2
- import { makeProblem, PROBLEM_CONDITION_FAILED, PROBLEM_NOT_FOUND } from '@driveflux/problem';
2
+ import { makeProblem, PROBLEM_CONDITION_FAILED, PROBLEM_NOT_FOUND, } from '@driveflux/problem';
3
3
  import { Err, Ok } from '@driveflux/result';
4
- export const getPayer = async ({ subscribingUser, asBusiness })=>{
4
+ export const getPayer = async ({ subscribingUser, asBusiness, }) => {
5
5
  let business = null;
6
6
  let payer = subscribingUser;
7
7
  if (asBusiness) {
@@ -11,8 +11,8 @@ export const getPayer = async ({ subscribingUser, asBusiness })=>{
11
11
  // load business
12
12
  business = await prisma.business.findUnique({
13
13
  where: {
14
- id: subscribingUser.businessId
15
- }
14
+ id: subscribingUser.businessId,
15
+ },
16
16
  });
17
17
  if (!business) {
18
18
  return new Err(makeProblem(PROBLEM_NOT_FOUND, `The business ${subscribingUser.businessId} was not found.`));
@@ -26,7 +26,7 @@ export const getPayer = async ({ subscribingUser, asBusiness })=>{
26
26
  }
27
27
  return new Ok(payer);
28
28
  };
29
- const checkPayerObjectSanity = (subscriber)=>{
29
+ const checkPayerObjectSanity = (subscriber) => {
30
30
  if (!subscriber.email) {
31
31
  return new Err(makeProblem(PROBLEM_CONDITION_FAILED, `Subscriber ${subscriber.id} has no email. Please add a verified email first.`));
32
32
  }
@@ -35,3 +35,4 @@ const checkPayerObjectSanity = (subscriber)=>{
35
35
  }
36
36
  return new Ok(true);
37
37
  };
38
+ //# sourceMappingURL=payer.js.map
@@ -4,14 +4,14 @@ import { checkIfUserCanReserve } from './checks.js';
4
4
  import { fetchOrCreateReservation } from './fetch-or-create.js';
5
5
  import { getPayer } from './payer.js';
6
6
  import { getVehicle } from './vehicle.js';
7
- const processBody = (body)=>{
7
+ const processBody = (body) => {
8
8
  // Switch mileage package
9
9
  if (body.plan === 'plan1' || body.plan === 'planWeekly') {
10
10
  body.mileagePackage = 'unlimited';
11
11
  }
12
12
  return body;
13
13
  };
14
- export const reserveVehicle = async (vehicleId, unprocessed)=>{
14
+ export const reserveVehicle = async (vehicleId, unprocessed) => {
15
15
  const body = processBody(unprocessed);
16
16
  // Agree to terms if not done yet
17
17
  await handleAgreeToTerms(body);
@@ -33,7 +33,7 @@ export const reserveVehicle = async (vehicleId, unprocessed)=>{
33
33
  const reservationResult = await fetchOrCreateReservation({
34
34
  vehicle,
35
35
  payer,
36
- body
36
+ body,
37
37
  });
38
38
  if (reservationResult.err) {
39
39
  return reservationResult;
@@ -41,3 +41,4 @@ export const reserveVehicle = async (vehicleId, unprocessed)=>{
41
41
  const reservation = reservationResult.val;
42
42
  return new Ok(reservation);
43
43
  };
44
+ //# sourceMappingURL=reserve.js.map
@@ -1 +1,2 @@
1
- export { };
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -4,19 +4,21 @@ import { makeProblem, PROBLEM_NOT_FOUND } from '@driveflux/problem';
4
4
  import { Err, Ok } from '@driveflux/result';
5
5
  import { checkIfVehicleIsAvailableForReservation } from './checks.js';
6
6
  import { createVehicleFromDisplayVehicle } from './display-vehicle.js';
7
- export const getVehicle = async (id, { selectedColor, plan, requestUser }, requesterAbility)=>{
8
- const vehicle = id.startsWith('DV_') ? await createVehicleFromDisplayVehicle(id, selectedColor || undefined) : await prisma.vehicle.findUnique({
9
- where: {
10
- id
11
- },
12
- include: {
13
- host: {
14
- select: {
15
- id: true
16
- }
17
- }
18
- }
19
- });
7
+ export const getVehicle = async (id, { selectedColor, plan, requestUser, }, requesterAbility) => {
8
+ const vehicle = id.startsWith('DV_')
9
+ ? await createVehicleFromDisplayVehicle(id, selectedColor || undefined)
10
+ : await prisma.vehicle.findUnique({
11
+ where: {
12
+ id,
13
+ },
14
+ include: {
15
+ host: {
16
+ select: {
17
+ id: true,
18
+ },
19
+ },
20
+ },
21
+ });
20
22
  if (!vehicle) {
21
23
  return new Err(makeProblem(PROBLEM_NOT_FOUND, 'Vehicle not found'));
22
24
  }
@@ -27,3 +29,4 @@ export const getVehicle = async (id, { selectedColor, plan, requestUser }, reque
27
29
  }
28
30
  return new Ok(vehicle);
29
31
  };
32
+ //# sourceMappingURL=vehicle.js.map