@sellout/models 0.0.182 → 0.0.184
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/.dist/graphql/mutations/cancelOrder.mutation.d.ts +2 -0
- package/.dist/graphql/mutations/cancelOrder.mutation.js +15 -0
- package/.dist/graphql/mutations/cancelOrder.mutation.js.map +1 -0
- package/.dist/graphql/mutations/deleteSubscription.mutation.d.ts +2 -0
- package/.dist/graphql/mutations/deleteSubscription.mutation.js +16 -0
- package/.dist/graphql/mutations/deleteSubscription.mutation.js.map +1 -0
- package/.dist/graphql/mutations/salesReport.mutation.d.ts +2 -0
- package/.dist/graphql/mutations/salesReport.mutation.js +15 -0
- package/.dist/graphql/mutations/salesReport.mutation.js.map +1 -0
- package/.dist/graphql/mutations/updateOrder.mutation.d.ts +2 -0
- package/.dist/graphql/mutations/updateOrder.mutation.js +16 -0
- package/.dist/graphql/mutations/updateOrder.mutation.js.map +1 -0
- package/.dist/graphql/queries/event.query.js +5 -0
- package/.dist/graphql/queries/event.query.js.map +1 -1
- package/.dist/interfaces/IEvent.d.ts +2 -0
- package/.dist/interfaces/IEvent.js.map +1 -1
- package/.dist/interfaces/IOrder.d.ts +1 -0
- package/.dist/interfaces/IOrder.js.map +1 -1
- package/.dist/interfaces/ISalesReport.d.ts +9 -0
- package/.dist/interfaces/ISalesReport.js +9 -0
- package/.dist/interfaces/ISalesReport.js.map +1 -0
- package/.dist/interfaces/ITask.d.ts +4 -1
- package/.dist/interfaces/ITask.js +1 -0
- package/.dist/interfaces/ITask.js.map +1 -1
- package/.dist/schemas/Event.d.ts +14 -0
- package/.dist/schemas/Event.js +16 -1
- package/.dist/schemas/Event.js.map +1 -1
- package/.dist/schemas/Order.d.ts +4 -0
- package/.dist/schemas/Order.js +3 -0
- package/.dist/schemas/Order.js.map +1 -1
- package/.dist/sellout-proto.js +22030 -17062
- package/.dist/utils/EventUtil.js +2 -2
- package/.dist/utils/EventUtil.js.map +1 -1
- package/.dist/utils/FeeUtil.d.ts +1 -0
- package/.dist/utils/FeeUtil.js +8 -0
- package/.dist/utils/FeeUtil.js.map +1 -1
- package/.dist/utils/OrderUtil.d.ts +2 -0
- package/.dist/utils/OrderUtil.js +157 -1
- package/.dist/utils/OrderUtil.js.map +1 -1
- package/.dist/utils/PaymentUtil.d.ts +1 -0
- package/.dist/utils/PaymentUtil.js +201 -4
- package/.dist/utils/PaymentUtil.js.map +1 -1
- package/package.json +3 -3
- package/src/graphql/mutations/cancelOrder.mutation.ts +11 -0
- package/src/graphql/mutations/deleteSubscription.mutation.ts +12 -0
- package/src/graphql/mutations/salesReport.mutation.ts +10 -0
- package/src/graphql/mutations/updateOrder.mutation.ts +11 -0
- package/src/graphql/queries/event.query.ts +5 -0
- package/src/interfaces/IEvent.ts +2 -0
- package/src/interfaces/IOrder.ts +2 -1
- package/src/interfaces/ISalesReport.ts +11 -0
- package/src/interfaces/ITask.ts +4 -0
- package/src/proto/email.proto +6 -2
- package/src/proto/event.proto +45 -0
- package/src/proto/order.proto +63 -0
- package/src/proto/task.proto +22 -0
- package/src/schemas/Event.ts +17 -1
- package/src/schemas/Order.ts +6 -3
- package/src/utils/EventUtil.ts +3 -2
- package/src/utils/FeeUtil.ts +8 -0
- package/src/utils/OrderUtil.ts +182 -2
- package/src/utils/PaymentUtil.ts +298 -5
package/src/schemas/Event.ts
CHANGED
|
@@ -362,6 +362,21 @@ const TicketTier = {
|
|
|
362
362
|
},
|
|
363
363
|
};
|
|
364
364
|
|
|
365
|
+
const Subscription = {
|
|
366
|
+
_id: {
|
|
367
|
+
type: String,
|
|
368
|
+
default: shortid.generate,
|
|
369
|
+
},
|
|
370
|
+
email: {
|
|
371
|
+
type: String,
|
|
372
|
+
required: true,
|
|
373
|
+
},
|
|
374
|
+
frequency: {
|
|
375
|
+
type: String,
|
|
376
|
+
required: true,
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
|
|
365
380
|
const TicketType = {
|
|
366
381
|
_id: {
|
|
367
382
|
type: String,
|
|
@@ -542,5 +557,6 @@ export default {
|
|
|
542
557
|
}, guestTicketPerMember: {
|
|
543
558
|
type: String,
|
|
544
559
|
required: false
|
|
545
|
-
}
|
|
560
|
+
},
|
|
561
|
+
subscription: [Subscription]
|
|
546
562
|
};
|
package/src/schemas/Order.ts
CHANGED
|
@@ -131,10 +131,10 @@ const OrderTicket = {
|
|
|
131
131
|
required: false
|
|
132
132
|
},
|
|
133
133
|
teiMemberInfo: TeiMemberInfoInput,
|
|
134
|
-
|
|
134
|
+
guestTicket: {
|
|
135
135
|
type: Boolean,
|
|
136
136
|
required: false
|
|
137
|
-
|
|
137
|
+
}
|
|
138
138
|
};
|
|
139
139
|
|
|
140
140
|
const OrderUpgrade = {
|
|
@@ -368,8 +368,11 @@ export default {
|
|
|
368
368
|
type: Boolean,
|
|
369
369
|
required: false,
|
|
370
370
|
default: false
|
|
371
|
-
},parentSeasonOrderId:{
|
|
371
|
+
}, parentSeasonOrderId: {
|
|
372
372
|
type: String,
|
|
373
373
|
required: false,
|
|
374
|
+
}, cancelReason: {
|
|
375
|
+
type: String,
|
|
376
|
+
required: false
|
|
374
377
|
}
|
|
375
378
|
};
|
package/src/utils/EventUtil.ts
CHANGED
|
@@ -138,8 +138,9 @@ export default {
|
|
|
138
138
|
return startsAt - TWO_WEEKS;
|
|
139
139
|
} */
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|
|
141
|
+
// return doorsAt - 600;
|
|
142
|
+
|
|
143
|
+
return doorsAt - 28800
|
|
143
144
|
},
|
|
144
145
|
shouldSendOrderReceipt(event): boolean {
|
|
145
146
|
const now = Time.now();
|
package/src/utils/FeeUtil.ts
CHANGED
|
@@ -26,6 +26,14 @@ export default {
|
|
|
26
26
|
return true;
|
|
27
27
|
});
|
|
28
28
|
},
|
|
29
|
+
organizationFees(fees: any[] = []) {
|
|
30
|
+
return fees.filter((fee) => {
|
|
31
|
+
if (fee.appliedBy === "Organization") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
},
|
|
29
37
|
promoterFees(fees: any[] = []) {
|
|
30
38
|
return fees?.filter((fee) => {
|
|
31
39
|
if (fee.appliedBy === "Sellout" || fee.appliedBy === "Stripe") {
|
package/src/utils/OrderUtil.ts
CHANGED
|
@@ -6,6 +6,7 @@ import ICreateOrderParams from '../interfaces/ICreateOrderParams';
|
|
|
6
6
|
import IPayment from '../interfaces/IPayment';
|
|
7
7
|
import PaymentUtil from './PaymentUtil';
|
|
8
8
|
// import IFee from '../interfaces/IFee';
|
|
9
|
+
import IFee, { FeeAppliedByEnum, FeeTypeEnum, FeeFiltersEnum } from "../interfaces/IFee";
|
|
9
10
|
|
|
10
11
|
export default {
|
|
11
12
|
isComp(order) {
|
|
@@ -112,7 +113,6 @@ export default {
|
|
|
112
113
|
upgradeFees.reduce((cur, fee) => cur + applyUpgradeFee(upgrade, fee), 0)
|
|
113
114
|
);
|
|
114
115
|
}, 0);
|
|
115
|
-
|
|
116
116
|
const orderSubtotal =
|
|
117
117
|
ticketTotal + ticketFeeTotal + upgradeTotal + upgradeFeeTotal;
|
|
118
118
|
|
|
@@ -130,9 +130,170 @@ export default {
|
|
|
130
130
|
return Math.round(orderTotal);
|
|
131
131
|
}
|
|
132
132
|
},
|
|
133
|
+
|
|
134
|
+
// orderTotalExport(order: IOrder, fees: any[]): number {
|
|
135
|
+
// if (order?.payments && order?.payments.length > 0) {
|
|
136
|
+
// return order.payments.reduce((cur: number, payment: IPayment): number => {
|
|
137
|
+
// const paymentTickets = order.tickets.filter(ticket => ticket.paymentId === payment._id)
|
|
138
|
+
// const paymentUpgrades = order.upgrades.filter(upgrade => upgrade.paymentId === payment._id)
|
|
139
|
+
// const total = PaymentUtil.calculatePaymentTotalDublicate({
|
|
140
|
+
// tickets: paymentTickets,
|
|
141
|
+
// upgrades: paymentUpgrades,
|
|
142
|
+
// fees: fees,
|
|
143
|
+
// paymentMethodType: payment.paymentMethodType,
|
|
144
|
+
// })
|
|
145
|
+
// return cur + total
|
|
146
|
+
// }, 0);
|
|
147
|
+
// } else {
|
|
148
|
+
// if (
|
|
149
|
+
// (!order.tickets || !order.tickets.length) &&
|
|
150
|
+
// (!order.upgrades || !order.upgrades.length)
|
|
151
|
+
// )
|
|
152
|
+
// return 0;
|
|
153
|
+
|
|
154
|
+
// if (!order.tickets) order.tickets = [];
|
|
155
|
+
// if (!order.upgrades) order.upgrades = [];
|
|
156
|
+
|
|
157
|
+
// const ticketFees = fees.filter(f => f.appliedTo === "Ticket");
|
|
158
|
+
// const upgradeFees = fees.filter(f => f.appliedTo === "Upgrade");
|
|
159
|
+
// let orderFees = fees.filter(f => f.appliedTo === "Order");
|
|
160
|
+
|
|
161
|
+
// function applyTicketFee(ticket, fee) {
|
|
162
|
+
// if (fee.filters.includes("Seated") && !ticket.seat) return 0;
|
|
163
|
+
// const noMax = fee.maxAppliedToPrice === 0;
|
|
164
|
+
// if (
|
|
165
|
+
// (fee.minAppliedToPrice <= ticket.price &&
|
|
166
|
+
// ticket.price <= fee.maxAppliedToPrice) ||
|
|
167
|
+
// noMax
|
|
168
|
+
// ) {
|
|
169
|
+
// if (fee.type === "Flat") {
|
|
170
|
+
// return fee.value;
|
|
171
|
+
// }
|
|
172
|
+
// if (fee.type === "Percent") {
|
|
173
|
+
// return (ticket.price * fee.value) / 100;
|
|
174
|
+
// }
|
|
175
|
+
// } else {
|
|
176
|
+
// return 0;
|
|
177
|
+
// }
|
|
178
|
+
// }
|
|
179
|
+
|
|
180
|
+
// function applyUpgradeFee(upgrade, fee) {
|
|
181
|
+
// const noMax = fee.maxAppliedToPrice === 0;
|
|
182
|
+
// if (
|
|
183
|
+
// (fee.minAppliedToPrice <= upgrade.price &&
|
|
184
|
+
// upgrade.price <= fee.minAppliedToPrice) ||
|
|
185
|
+
// noMax
|
|
186
|
+
// ) {
|
|
187
|
+
// if (fee.type === "Flat") {
|
|
188
|
+
// return fee.value;
|
|
189
|
+
// }
|
|
190
|
+
// if (fee.type === "Percent") {
|
|
191
|
+
// return (upgrade.price * fee.value) / 100;
|
|
192
|
+
// }
|
|
193
|
+
// } else {
|
|
194
|
+
// return 0;
|
|
195
|
+
// }
|
|
196
|
+
// }
|
|
197
|
+
|
|
198
|
+
// function applyOrderFee(orderSubtotal, fee) {
|
|
199
|
+
// if (fee.type === "Flat") {
|
|
200
|
+
// return orderSubtotal + fee.value;
|
|
201
|
+
// }
|
|
202
|
+
// if (fee.type === "Percent") {
|
|
203
|
+
// return orderSubtotal / (1 - fee.value / 100);
|
|
204
|
+
// }
|
|
205
|
+
// }
|
|
206
|
+
|
|
207
|
+
// const ticketTotal = order.tickets.reduce(
|
|
208
|
+
// (cur, ticket) => cur + ticket.price,
|
|
209
|
+
// 0
|
|
210
|
+
// );
|
|
211
|
+
|
|
212
|
+
// const ticketFeeTotal = order.tickets.reduce((cur, ticket) => {
|
|
213
|
+
// return (
|
|
214
|
+
// cur +
|
|
215
|
+
// ticketFees.reduce((cur, fee) => cur + applyTicketFee(ticket, fee), 0)
|
|
216
|
+
// );
|
|
217
|
+
// }, 0);
|
|
218
|
+
|
|
219
|
+
// const upgradeTotal = order.upgrades.reduce(
|
|
220
|
+
// (cur, upgrade) => cur + upgrade.price,
|
|
221
|
+
// 0
|
|
222
|
+
// );
|
|
223
|
+
|
|
224
|
+
// const upgradeFeeTotal = order.upgrades.reduce((cur, upgrade) => {
|
|
225
|
+
// return (
|
|
226
|
+
// cur +
|
|
227
|
+
// upgradeFees.reduce((cur, fee) => cur + applyUpgradeFee(upgrade, fee), 0)
|
|
228
|
+
// );
|
|
229
|
+
// }, 0);
|
|
230
|
+
// const orderSubtotal =
|
|
231
|
+
// ticketTotal + ticketFeeTotal + upgradeTotal + upgradeFeeTotal;
|
|
232
|
+
|
|
233
|
+
// // Order matters here. Flat type fees must be
|
|
234
|
+
// // applied before Percent type fees
|
|
235
|
+
// orderFees = orderFees.sort(({ type }) => {
|
|
236
|
+
// if (type === "Flat") return -1;
|
|
237
|
+
// return 1;
|
|
238
|
+
// });
|
|
239
|
+
|
|
240
|
+
// const orderTotal = orderFees.reduce((cur, fee) => {
|
|
241
|
+
// return applyOrderFee(cur, fee);
|
|
242
|
+
// }, orderSubtotal);
|
|
243
|
+
|
|
244
|
+
// return Math.round(orderTotal);
|
|
245
|
+
// }
|
|
246
|
+
// },
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
guestFees(order: IOrder, fees: IFee[]): any {
|
|
251
|
+
let guestTicketFees = fees.find(
|
|
252
|
+
(fee: IFee) => {
|
|
253
|
+
const filter: any = fee?.filters
|
|
254
|
+
return filter.includes(FeeFiltersEnum.GuestTicket)
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
let guestFeesValue = guestTicketFees?.value || 0;
|
|
259
|
+
// const ticketTotal = order.tickets.reduce((cur, ticket) => cur + ticket.price - ticket.refund.refundedAmount, 0);
|
|
260
|
+
const ticketTotal = order.tickets.reduce((cur, ticket) => cur + ticket.price - ticket.refund.refundedAmount, 0);
|
|
261
|
+
let guestMembers = order.tickets.filter((a) => a.guestTicket).length;
|
|
262
|
+
// let guestMembers = order.tickets.filter((a) => a.guestTicket && a.refund.refunded == false).length;
|
|
263
|
+
let guestMembersRefunded = order.tickets.filter((a) => a.guestTicket && a.refund.refunded == true).length;
|
|
264
|
+
const stripeFees: any = fees.find(
|
|
265
|
+
(fee: IFee) => fee.appliedBy === FeeAppliedByEnum.Stripe && fee.type === FeeTypeEnum.Percent
|
|
266
|
+
);
|
|
267
|
+
let guestFees;
|
|
268
|
+
let guestFeesRefunded;
|
|
269
|
+
|
|
270
|
+
if (guestTicketFees?.type === "Flat") {
|
|
271
|
+
guestFees = (guestFeesValue as number) * guestMembers
|
|
272
|
+
guestFeesRefunded = (guestFeesValue as number) * guestMembersRefunded
|
|
273
|
+
} else if (guestTicketFees?.type === "Percent") {
|
|
274
|
+
guestFees = (ticketTotal * guestFeesValue) / 100
|
|
275
|
+
guestFeesRefunded = (ticketTotal * guestMembersRefunded) / 100
|
|
276
|
+
}
|
|
277
|
+
let stripeFeeAmount = 0;
|
|
278
|
+
if (stripeFees?.value) {
|
|
279
|
+
stripeFeeAmount = Math.round(guestFees * stripeFees?.value / 100)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return {
|
|
283
|
+
guestFees: guestFees || 0,
|
|
284
|
+
guestFeesRefunded: guestFeesRefunded || 0,
|
|
285
|
+
stripeFeeAmount: stripeFeeAmount || 0
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
},
|
|
133
289
|
orderTotalWithRefund(order, fees) {
|
|
134
|
-
|
|
290
|
+
const orderTotal = this.orderTotal(order, fees);
|
|
291
|
+
return orderTotal - (order.refundedAmount || 0);
|
|
135
292
|
},
|
|
293
|
+
// orderExportTotalWithRefund(order, fees) {
|
|
294
|
+
// const orderTotal = this.orderTotalExport(order, fees);
|
|
295
|
+
// return orderTotal - (order.refundedAmount || 0);
|
|
296
|
+
// },
|
|
136
297
|
orderTransferAmountWithRefund(order, fees) {
|
|
137
298
|
const promoterFees = FeeUtil.promoterFees(fees);
|
|
138
299
|
return this.orderTotalWithRefund(order, promoterFees);
|
|
@@ -195,6 +356,13 @@ export default {
|
|
|
195
356
|
fees = FeeUtil.selloutFees(fees);
|
|
196
357
|
return this.orderTotal(order, fees) - this.orderSubtotal(order);
|
|
197
358
|
},
|
|
359
|
+
|
|
360
|
+
// selloutExortFees(order, fees) {
|
|
361
|
+
// if (!order.tickets) order.tickets = [];
|
|
362
|
+
// if (!order.upgrades) order.upgrades = [];
|
|
363
|
+
// fees = FeeUtil.selloutFees(fees);
|
|
364
|
+
// return this.orderTotalExport(order, fees) - this.orderSubtotal(order);
|
|
365
|
+
// },
|
|
198
366
|
// This one is special because stripe fees
|
|
199
367
|
// can be applied as a percentage
|
|
200
368
|
stripeFees(order, fees) {
|
|
@@ -208,6 +376,18 @@ export default {
|
|
|
208
376
|
let stripeFeeT = stripeFee < 0 ? 0 : stripeFee;
|
|
209
377
|
return stripeFeeT;
|
|
210
378
|
},
|
|
379
|
+
|
|
380
|
+
// stripeFeesExport(order, fees) {
|
|
381
|
+
// if (!order.tickets) order.tickets = [];
|
|
382
|
+
// if (!order.upgrades) order.upgrades = [];
|
|
383
|
+
// const total = this.orderTotalExport(order, fees);
|
|
384
|
+
// const subtotal = this.orderSubtotal(order);
|
|
385
|
+
// const selloutFees = this.selloutExortFees(order, fees);
|
|
386
|
+
// const promoterFees = this.promoterFees(order, fees);
|
|
387
|
+
// let stripeFee = total - subtotal - selloutFees - promoterFees;
|
|
388
|
+
// let stripeFeeT = stripeFee < 0 ? 0 : stripeFee;
|
|
389
|
+
// return stripeFeeT;
|
|
390
|
+
// },
|
|
211
391
|
promoterFees(order, fees) {
|
|
212
392
|
if (!order.tickets) order.tickets = [];
|
|
213
393
|
if (!order.upgrades) order.upgrades = [];
|
package/src/utils/PaymentUtil.ts
CHANGED
|
@@ -163,11 +163,61 @@ class PaymentUtil {
|
|
|
163
163
|
return true;
|
|
164
164
|
});
|
|
165
165
|
|
|
166
|
+
let guestFees = fees.filter(
|
|
167
|
+
(fee: IFee) =>
|
|
168
|
+
fee.filters && fee.filters[0] == FeeFiltersEnum.GuestTicket
|
|
169
|
+
);
|
|
170
|
+
|
|
166
171
|
fees = fees.filter(
|
|
167
172
|
(fee: IFee) =>
|
|
168
173
|
fee.filters && fee.filters[0] !== FeeFiltersEnum.GuestTicket
|
|
169
174
|
);
|
|
170
175
|
|
|
176
|
+
function applyGuestTicketFee(
|
|
177
|
+
ticket: ICreateOrderTicketParams,
|
|
178
|
+
fee: IFee
|
|
179
|
+
): number {
|
|
180
|
+
// Ignore seated fees if not seated
|
|
181
|
+
if (
|
|
182
|
+
fee.filters &&
|
|
183
|
+
fee.filters.includes(FeeFiltersEnum.Seated) &&
|
|
184
|
+
!ticket.seat
|
|
185
|
+
) {
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if(!ticket.guestTicket){
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const minFee = fee.minAppliedToPrice || 0;
|
|
194
|
+
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
195
|
+
|
|
196
|
+
if (minFee <= ticket.price && ticket.price <= maxFee) {
|
|
197
|
+
if (fee.type === FeeTypeEnum.Flat) {
|
|
198
|
+
return fee.value;
|
|
199
|
+
}
|
|
200
|
+
if (fee.type === FeeTypeEnum.Percent) {
|
|
201
|
+
return (ticket.price * fee.value) / 100;
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const ticketGuestFeeTotal = tickets.reduce((cur, ticket) => {
|
|
211
|
+
return (
|
|
212
|
+
cur +
|
|
213
|
+
guestFees.reduce((cur, fee) => {
|
|
214
|
+
const value = cur + applyGuestTicketFee(ticket, fee);
|
|
215
|
+
return value;
|
|
216
|
+
}, 0)
|
|
217
|
+
);
|
|
218
|
+
}, 0);
|
|
219
|
+
|
|
220
|
+
|
|
171
221
|
const ticketFees = fees
|
|
172
222
|
.filter((f) => f.appliedTo === FeeAppliedToEnum.Ticket)
|
|
173
223
|
.sort(({ type }) => {
|
|
@@ -270,6 +320,9 @@ class PaymentUtil {
|
|
|
270
320
|
);
|
|
271
321
|
}, 0);
|
|
272
322
|
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
273
326
|
const upgradeTotal = upgrades.reduce(
|
|
274
327
|
(cur, upgrade) => cur + upgrade.price,
|
|
275
328
|
0
|
|
@@ -291,22 +344,261 @@ class PaymentUtil {
|
|
|
291
344
|
const orderSubtotal = Math.round(
|
|
292
345
|
ticketTotal +
|
|
293
346
|
ticketTaxFeeTotal +
|
|
347
|
+
// ticketFeeTotal +
|
|
294
348
|
ticketFeeTotal +
|
|
295
|
-
upgradeTaxFeeTotal +
|
|
349
|
+
upgradeTaxFeeTotal + ticketGuestFeeTotal +
|
|
350
|
+
upgradeTotal +
|
|
351
|
+
upgradeFeeTotal
|
|
352
|
+
);
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
const orderTotal = orderFees.reduce((cur, fee) => {
|
|
356
|
+
return applyOrderFee(cur, fee);
|
|
357
|
+
}, orderSubtotal);
|
|
358
|
+
|
|
359
|
+
return Math.round(orderTotal);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
calculatePaymentTotalDublicate(params: IPaymentCalculatorParams): number {
|
|
364
|
+
let { tickets = [], upgrades = [], fees = [], paymentMethodType } = params;
|
|
365
|
+
|
|
366
|
+
// No items, total is always 0
|
|
367
|
+
if (!tickets.length && !upgrades.length) return 0;
|
|
368
|
+
|
|
369
|
+
// Filter fees
|
|
370
|
+
fees = fees.filter((fee: IFee) => {
|
|
371
|
+
// Ignore card reader fees for non card reader payemnts
|
|
372
|
+
if (
|
|
373
|
+
fee.filters &&
|
|
374
|
+
fee.filters.includes(FeeFiltersEnum.CardReader) &&
|
|
375
|
+
paymentMethodType !== PaymentMethodTypeEnum.CardReader
|
|
376
|
+
) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Ignore card entry fees for non card entry payemnts
|
|
381
|
+
if (
|
|
382
|
+
fee.filters &&
|
|
383
|
+
fee.filters.includes(FeeFiltersEnum.CardEntry) &&
|
|
384
|
+
paymentMethodType !== PaymentMethodTypeEnum.CardEntry
|
|
385
|
+
) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return true;
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
let guestFees = fees.filter(
|
|
393
|
+
(fee: IFee) =>
|
|
394
|
+
fee.filters && fee.filters[0] == FeeFiltersEnum.GuestTicket
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
fees = fees.filter(
|
|
398
|
+
(fee: IFee) =>
|
|
399
|
+
fee.filters && fee.filters[0] !== FeeFiltersEnum.GuestTicket
|
|
400
|
+
);
|
|
401
|
+
|
|
402
|
+
function applyGuestTicketFee(
|
|
403
|
+
ticket: ICreateOrderTicketParams,
|
|
404
|
+
fee: IFee
|
|
405
|
+
): number {
|
|
406
|
+
// Ignore seated fees if not seated
|
|
407
|
+
if (
|
|
408
|
+
fee.filters &&
|
|
409
|
+
fee.filters.includes(FeeFiltersEnum.Seated) &&
|
|
410
|
+
!ticket.seat
|
|
411
|
+
) {
|
|
412
|
+
return 0;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if(!ticket.guestTicket){
|
|
416
|
+
return 0;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const minFee = fee.minAppliedToPrice || 0;
|
|
420
|
+
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
421
|
+
|
|
422
|
+
if (minFee <= ticket.price && ticket.price <= maxFee) {
|
|
423
|
+
if (fee.type === FeeTypeEnum.Flat) {
|
|
424
|
+
return fee.value;
|
|
425
|
+
}
|
|
426
|
+
if (fee.type === FeeTypeEnum.Percent) {
|
|
427
|
+
return (ticket.price * fee.value) / 100;
|
|
428
|
+
}
|
|
429
|
+
} else {
|
|
430
|
+
return 0;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return 0;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const ticketGuestFeeTotal = tickets.reduce((cur, ticket) => {
|
|
437
|
+
return (
|
|
438
|
+
cur +
|
|
439
|
+
guestFees.reduce((cur, fee) => {
|
|
440
|
+
const value = cur + applyGuestTicketFee(ticket, fee);
|
|
441
|
+
return value;
|
|
442
|
+
}, 0)
|
|
443
|
+
);
|
|
444
|
+
}, 0);
|
|
445
|
+
|
|
446
|
+
const ticketFees = fees
|
|
447
|
+
.filter((f) => f.appliedTo === FeeAppliedToEnum.Ticket)
|
|
448
|
+
.sort(({ type }) => {
|
|
449
|
+
if (type === FeeTypeEnum.Flat) return -1;
|
|
450
|
+
else return 1;
|
|
451
|
+
});
|
|
452
|
+
const upgradeFees = fees.filter(
|
|
453
|
+
(f) => f.appliedTo === FeeAppliedToEnum.Upgrade
|
|
454
|
+
);
|
|
455
|
+
// Orders mattes here. Flat type fees must be applied before Percent type fees
|
|
456
|
+
const orderFees = fees
|
|
457
|
+
.filter(
|
|
458
|
+
(f) => f.appliedTo === FeeAppliedToEnum.Order && f.name != "Sales tax"
|
|
459
|
+
)
|
|
460
|
+
.sort(({ type }) => {
|
|
461
|
+
if (type === "Flat") return -1;
|
|
462
|
+
else return 1;
|
|
463
|
+
});
|
|
464
|
+
const salesTax = fees.filter((f) => f.name == "Sales tax");
|
|
465
|
+
|
|
466
|
+
function applyTicketFee(
|
|
467
|
+
ticket: ICreateOrderTicketParams,
|
|
468
|
+
fee: IFee
|
|
469
|
+
): number {
|
|
470
|
+
// Ignore seated fees if not seated
|
|
471
|
+
if (
|
|
472
|
+
fee.filters &&
|
|
473
|
+
fee.filters.includes(FeeFiltersEnum.Seated) &&
|
|
474
|
+
!ticket.seat
|
|
475
|
+
) {
|
|
476
|
+
return 0;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const minFee = fee.minAppliedToPrice || 0;
|
|
480
|
+
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
481
|
+
|
|
482
|
+
if (minFee <= ticket.price && ticket.price <= maxFee) {
|
|
483
|
+
if (fee.type === FeeTypeEnum.Flat) {
|
|
484
|
+
return fee.value;
|
|
485
|
+
}
|
|
486
|
+
if (fee.type === FeeTypeEnum.Percent) {
|
|
487
|
+
return (ticket.price * fee.value) / 100;
|
|
488
|
+
}
|
|
489
|
+
} else {
|
|
490
|
+
return 0;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return 0;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function applyUpgradeFee(
|
|
497
|
+
upgrade: ICreateOrderUpgradeParams,
|
|
498
|
+
fee: IFee
|
|
499
|
+
): number {
|
|
500
|
+
const minFee = fee.minAppliedToPrice || 0;
|
|
501
|
+
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
502
|
+
|
|
503
|
+
if (minFee <= upgrade.price && upgrade.price <= maxFee) {
|
|
504
|
+
if (fee.type === FeeTypeEnum.Flat) {
|
|
505
|
+
return upgrade.price + fee.value;
|
|
506
|
+
}
|
|
507
|
+
if (fee.type === FeeTypeEnum.Percent) {
|
|
508
|
+
return (upgrade.price * fee.value) / 100;
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
return 0;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
return 0;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function applyOrderFee(orderSubtotal, fee) {
|
|
518
|
+
if (fee.type === FeeTypeEnum.Flat) {
|
|
519
|
+
return orderSubtotal + fee.value;
|
|
520
|
+
}
|
|
521
|
+
if (fee.type === FeeTypeEnum.Percent) {
|
|
522
|
+
return orderSubtotal / (1 - fee.value / 100);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
const ticketTotal = tickets.reduce((cur, ticket) => cur + ticket.price, 0);
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
const ticketTaxFeeTotal = tickets.reduce((cur, ticket) => {
|
|
530
|
+
return (
|
|
531
|
+
cur +
|
|
532
|
+
salesTax.reduce((cur, fee) => {
|
|
533
|
+
const value = cur + applyTicketFee(ticket, fee);
|
|
534
|
+
return value;
|
|
535
|
+
}, 0)
|
|
536
|
+
);
|
|
537
|
+
}, 0);
|
|
538
|
+
|
|
539
|
+
// const ticketGuestFeeTotal = tickets.reduce((cur, ticket) => {
|
|
540
|
+
// return (
|
|
541
|
+
// cur +
|
|
542
|
+
// ticketFees.reduce((cur, fee) => {
|
|
543
|
+
// const value = cur + applyTicketFee(ticket, fee);
|
|
544
|
+
// return value;
|
|
545
|
+
// }, 0)
|
|
546
|
+
// );
|
|
547
|
+
// }, 0);
|
|
548
|
+
|
|
549
|
+
// applyGuestTicketFee
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
const ticketFeeTotal = tickets.reduce((cur, ticket) => {
|
|
555
|
+
return (
|
|
556
|
+
cur +
|
|
557
|
+
ticketFees.reduce((cur, fee) => {
|
|
558
|
+
const value = cur + applyTicketFee(ticket, fee);
|
|
559
|
+
return value;
|
|
560
|
+
}, 0)
|
|
561
|
+
);
|
|
562
|
+
}, 0);
|
|
563
|
+
|
|
564
|
+
const upgradeTotal = upgrades.reduce(
|
|
565
|
+
(cur, upgrade) => cur + upgrade.price,
|
|
566
|
+
0
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
const upgradeTaxFeeTotal = upgrades.reduce((cur, upgrade) => {
|
|
570
|
+
return (
|
|
571
|
+
cur +
|
|
572
|
+
salesTax.reduce((curr, fee) => curr + applyUpgradeFee(upgrade, fee), 0)
|
|
573
|
+
);
|
|
574
|
+
}, 0);
|
|
575
|
+
|
|
576
|
+
const upgradeFeeTotal = upgrades.reduce((cur, upgrade) => {
|
|
577
|
+
return (
|
|
578
|
+
cur +
|
|
579
|
+
upgradeFees.reduce((cur, fee) => cur + applyUpgradeFee(upgrade, fee), 0)
|
|
580
|
+
);
|
|
581
|
+
}, 0);
|
|
582
|
+
const orderSubtotal = Math.round(
|
|
583
|
+
ticketTotal +
|
|
584
|
+
ticketTaxFeeTotal +
|
|
585
|
+
ticketFeeTotal +
|
|
586
|
+
upgradeTaxFeeTotal + ticketGuestFeeTotal +
|
|
296
587
|
upgradeTotal +
|
|
297
588
|
upgradeFeeTotal
|
|
298
589
|
);
|
|
299
590
|
|
|
300
|
-
// console.log(`Order SubTotal:`, orderSubtotal);
|
|
301
591
|
|
|
302
592
|
const orderTotal = orderFees.reduce((cur, fee) => {
|
|
303
593
|
return applyOrderFee(cur, fee);
|
|
304
594
|
}, orderSubtotal);
|
|
305
595
|
|
|
306
|
-
console.log(`Order Total`, orderTotal);
|
|
307
596
|
|
|
308
597
|
return Math.round(orderTotal);
|
|
309
598
|
}
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
|
|
310
602
|
calculatePaymentSubtotal(params: IPaymentCalculatorParams): number {
|
|
311
603
|
let {
|
|
312
604
|
tickets = [],
|
|
@@ -404,15 +696,16 @@ class PaymentUtil {
|
|
|
404
696
|
(fee: IFee) => fee.appliedBy === FeeAppliedByEnum.Stripe && fee.type === FeeTypeEnum.Percent
|
|
405
697
|
);
|
|
406
698
|
|
|
699
|
+
|
|
407
700
|
let guestFeesValue = guestTicketFees && guestTicketFees[0]?.value;
|
|
408
701
|
let stripeFeesValue = stripeFees && stripeFees[0]?.value;
|
|
409
702
|
let guestMembers = tickets.filter((a) => a.guestTicket).length;
|
|
410
|
-
|
|
411
703
|
let guestFees = (guestFeesValue as number) * guestMembers;
|
|
412
704
|
return guestTicketFees.length > 0 && event.organization.isTegIntegration
|
|
413
|
-
? guestFees +
|
|
705
|
+
? guestFees + guestFees * stripeFeesValue/100
|
|
414
706
|
: 0;
|
|
415
707
|
}
|
|
708
|
+
|
|
416
709
|
}
|
|
417
710
|
|
|
418
711
|
export default new PaymentUtil();
|