@sellout/models 0.0.61 → 0.0.63
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/fragments/order.fragment.js +2 -0
- package/.dist/graphql/fragments/order.fragment.js.map +1 -1
- package/.dist/graphql/mutations/breakApartOrder.d.ts +2 -0
- package/.dist/graphql/mutations/breakApartOrder.js +50 -0
- package/.dist/graphql/mutations/breakApartOrder.js.map +1 -0
- package/.dist/graphql/queries/order.query.js +1 -0
- package/.dist/graphql/queries/order.query.js.map +1 -1
- package/.dist/interfaces/IOrderTicket.d.ts +1 -0
- package/.dist/interfaces/IOrderTicket.js.map +1 -1
- package/.dist/interfaces/IOrderUpgrade.d.ts +1 -0
- package/.dist/schemas/Order.d.ts +10 -0
- package/.dist/schemas/Order.js +10 -0
- package/.dist/schemas/Order.js.map +1 -1
- package/.dist/sellout-proto.js +545 -0
- package/.dist/utils/PaymentUtil.js +128 -25
- package/.dist/utils/PaymentUtil.js.map +1 -1
- package/package.json +4 -4
- package/src/graphql/fragments/order.fragment.ts +2 -0
- package/src/graphql/mutations/breakApartOrder.ts +46 -0
- package/src/graphql/queries/order.query.ts +1 -0
- package/src/interfaces/IOrderTicket.ts +1 -0
- package/src/interfaces/IOrderUpgrade.ts +1 -0
- package/src/proto/order.proto +16 -0
- package/src/schemas/Order.ts +10 -0
- package/src/utils/PaymentUtil.ts +158 -33
|
@@ -2,38 +2,139 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const IFee_1 = require("../interfaces/IFee");
|
|
4
4
|
const PaymentMethodTypeEnum_1 = require("../enums/PaymentMethodTypeEnum");
|
|
5
|
+
// interface IOrderItems {
|
|
6
|
+
// tickets: ICreateOrderTicketParams[];
|
|
7
|
+
// upgrades: ICreateOrderUpgradeParams[];
|
|
8
|
+
// }
|
|
5
9
|
exports.default = {
|
|
10
|
+
// DOES NOT WORK! Work in Progress :)
|
|
11
|
+
// calculateOrderItemPrices(params: IPaymentCalculatorParams): IOrderItems {
|
|
12
|
+
// let {
|
|
13
|
+
// tickets = [],
|
|
14
|
+
// upgrades = [],
|
|
15
|
+
// fees = [],
|
|
16
|
+
// paymentMethodType,
|
|
17
|
+
// } = params;
|
|
18
|
+
// // Filter fees
|
|
19
|
+
// fees = fees.filter((fee: IFee) => {
|
|
20
|
+
// // Ignore card reader fees for non card reader payemnts
|
|
21
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum.CardReader) {
|
|
22
|
+
// return false;
|
|
23
|
+
// }
|
|
24
|
+
// // Ignore card entry fees for non card entry payemnts
|
|
25
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum.CardEntry) {
|
|
26
|
+
// return false;
|
|
27
|
+
// }
|
|
28
|
+
// return true;
|
|
29
|
+
// });
|
|
30
|
+
// const ticketFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Ticket)
|
|
31
|
+
// .sort(({ type }) => {
|
|
32
|
+
// if (type === FeeTypeEnum.Flat) return -1;
|
|
33
|
+
// else return 1;
|
|
34
|
+
// });
|
|
35
|
+
// const upgradeFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Upgrade);
|
|
36
|
+
// // Orders mattes here. Flat type fees must be applied before Percent type fees
|
|
37
|
+
// const orderFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Order)
|
|
38
|
+
// .sort(({ type }) => {
|
|
39
|
+
// if (type === FeeTypeEnum.Percent) return -1;
|
|
40
|
+
// else return 1;
|
|
41
|
+
// })
|
|
42
|
+
// .map(fee => {
|
|
43
|
+
// if(fee.type === FeeTypeEnum.Flat) {
|
|
44
|
+
// return {
|
|
45
|
+
// ...fee,
|
|
46
|
+
// value: fee.value / tickets.length,
|
|
47
|
+
// }
|
|
48
|
+
// }
|
|
49
|
+
// else return fee;
|
|
50
|
+
// });
|
|
51
|
+
// const reverseApplyFee = (price: number, ticket: ICreateOrderTicketParams, fee: IFee): number => {
|
|
52
|
+
// // Ignore seated fees
|
|
53
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.Seated) && !ticket.seat) {
|
|
54
|
+
// return price;
|
|
55
|
+
// }
|
|
56
|
+
// const minFee = fee.minAppliedToPrice || 0;
|
|
57
|
+
// const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
58
|
+
// if (minFee <= price && price <= maxFee) {
|
|
59
|
+
// console.log(fee);
|
|
60
|
+
// if (fee.type === FeeTypeEnum.Flat) {
|
|
61
|
+
// return price - fee.value;
|
|
62
|
+
// } if (fee.type === FeeTypeEnum.Percent) {
|
|
63
|
+
// return price * (1 - fee.value / 100);
|
|
64
|
+
// }
|
|
65
|
+
// }
|
|
66
|
+
// // if(fee.type === FeeTypeEnum.Percent) {
|
|
67
|
+
// // return price * (1 - fee.value / 100);
|
|
68
|
+
// // }
|
|
69
|
+
// // if(fee.type === FeeTypeEnum.Flat) {
|
|
70
|
+
// // return price - fee.value;
|
|
71
|
+
// // }
|
|
72
|
+
// return price;
|
|
73
|
+
// }
|
|
74
|
+
// function calculateTicketPrice(ticket: ICreateOrderTicketParams): number {
|
|
75
|
+
// if(!ticket.rollFees) return ticket.price;
|
|
76
|
+
// const allFees = [...orderFees, ...ticketFees];
|
|
77
|
+
// return allFees.reduce((cur, fee) => {
|
|
78
|
+
// const next = reverseApplyFee(cur, ticket, fee);
|
|
79
|
+
// return next;
|
|
80
|
+
// }, ticket.price);
|
|
81
|
+
// }
|
|
82
|
+
// tickets = tickets.map((ticket: ICreateOrderTicketParams): ICreateOrderTicketParams => {
|
|
83
|
+
// const price = Math.floor(calculateTicketPrice(ticket));
|
|
84
|
+
// console.log(`Ticket Price: `, price);
|
|
85
|
+
// return {
|
|
86
|
+
// ...ticket,
|
|
87
|
+
// price,
|
|
88
|
+
// }
|
|
89
|
+
// });
|
|
90
|
+
// // upgrades = upgrades.map((upgrade: ICreateOrderUpgradeParams): ICreateOrderUpgradeParams => {
|
|
91
|
+
// // return {
|
|
92
|
+
// // ...upgrade,
|
|
93
|
+
// // price: calculateUpgradePrice(upgrade),
|
|
94
|
+
// // }
|
|
95
|
+
// // });
|
|
96
|
+
// return {
|
|
97
|
+
// tickets,
|
|
98
|
+
// upgrades,
|
|
99
|
+
// };
|
|
100
|
+
// },
|
|
6
101
|
calculateTotal(params) {
|
|
7
|
-
|
|
8
|
-
console.log(fees);
|
|
102
|
+
let { tickets = [], upgrades = [], fees = [], paymentMethodType, } = params;
|
|
9
103
|
// No items, total is always 0
|
|
10
104
|
if (!tickets.length && !upgrades.length)
|
|
11
105
|
return 0;
|
|
12
|
-
|
|
106
|
+
// Filter fees
|
|
107
|
+
fees = fees.filter((fee) => {
|
|
108
|
+
// Ignore card reader fees for non card reader payemnts
|
|
109
|
+
if (fee.filters && fee.filters.includes(IFee_1.FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum_1.PaymentMethodTypeEnum.CardReader) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
// Ignore card entry fees for non card entry payemnts
|
|
113
|
+
if (fee.filters && fee.filters.includes(IFee_1.FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum_1.PaymentMethodTypeEnum.CardEntry) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
});
|
|
118
|
+
const ticketFees = fees.filter(f => f.appliedTo === IFee_1.FeeAppliedToEnum.Ticket)
|
|
119
|
+
.sort(({ type }) => {
|
|
120
|
+
if (type === IFee_1.FeeTypeEnum.Flat)
|
|
121
|
+
return -1;
|
|
122
|
+
else
|
|
123
|
+
return 1;
|
|
124
|
+
});
|
|
13
125
|
const upgradeFees = fees.filter(f => f.appliedTo === IFee_1.FeeAppliedToEnum.Upgrade);
|
|
14
126
|
// Orders mattes here. Flat type fees must be applied before Percent type fees
|
|
15
127
|
const orderFees = fees.filter(f => f.appliedTo === IFee_1.FeeAppliedToEnum.Order).sort(({ type }) => {
|
|
16
128
|
if (type === 'Flat')
|
|
17
129
|
return -1;
|
|
18
|
-
|
|
130
|
+
else
|
|
131
|
+
return 1;
|
|
19
132
|
});
|
|
20
133
|
function applyTicketFee(ticket, fee) {
|
|
21
|
-
//
|
|
22
|
-
// if (ticket.rollFees) {
|
|
23
|
-
// return 0;
|
|
24
|
-
// }
|
|
25
|
-
// Ignore seated fees
|
|
134
|
+
// Ignore seated fees if not seated
|
|
26
135
|
if (fee.filters && fee.filters.includes(IFee_1.FeeFiltersEnum.Seated) && !ticket.seat) {
|
|
27
136
|
return 0;
|
|
28
137
|
}
|
|
29
|
-
// Ignore card reader fees for non card reader payemnts
|
|
30
|
-
if (fee.filters && fee.filters.includes(IFee_1.FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum_1.PaymentMethodTypeEnum.CardReader) {
|
|
31
|
-
return 0;
|
|
32
|
-
}
|
|
33
|
-
// Ignore card entry fees for non card entry payemnts
|
|
34
|
-
if (fee.filters && fee.filters.includes(IFee_1.FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum_1.PaymentMethodTypeEnum.CardEntry) {
|
|
35
|
-
return 0;
|
|
36
|
-
}
|
|
37
138
|
const minFee = fee.minAppliedToPrice || 0;
|
|
38
139
|
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
39
140
|
if (minFee <= ticket.price && ticket.price <= maxFee) {
|
|
@@ -50,18 +151,14 @@ exports.default = {
|
|
|
50
151
|
return 0;
|
|
51
152
|
}
|
|
52
153
|
function applyUpgradeFee(upgrade, fee) {
|
|
53
|
-
// // Ignore rolled fees
|
|
54
|
-
// if (upgrade.rollFees) {
|
|
55
|
-
// return 0;
|
|
56
|
-
// }
|
|
57
154
|
const minFee = fee.minAppliedToPrice || 0;
|
|
58
155
|
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
59
156
|
if (minFee <= upgrade.price && upgrade.price <= maxFee) {
|
|
60
157
|
if (fee.type === IFee_1.FeeTypeEnum.Flat) {
|
|
61
|
-
return fee.value;
|
|
158
|
+
return upgrade.price + fee.value;
|
|
62
159
|
}
|
|
63
160
|
if (fee.type === IFee_1.FeeTypeEnum.Percent) {
|
|
64
|
-
return (upgrade.price
|
|
161
|
+
return (upgrade.price / (1 - fee.value / 100));
|
|
65
162
|
}
|
|
66
163
|
}
|
|
67
164
|
else {
|
|
@@ -79,17 +176,23 @@ exports.default = {
|
|
|
79
176
|
}
|
|
80
177
|
const ticketTotal = tickets.reduce((cur, ticket) => cur + ticket.price, 0);
|
|
81
178
|
const ticketFeeTotal = tickets.reduce((cur, ticket) => {
|
|
82
|
-
return cur + ticketFees.reduce((cur, fee) =>
|
|
179
|
+
return cur + ticketFees.reduce((cur, fee) => {
|
|
180
|
+
const value = cur + applyTicketFee(ticket, fee);
|
|
181
|
+
console.log(`${fee.name}: ${value}`);
|
|
182
|
+
return value;
|
|
183
|
+
}, 0);
|
|
83
184
|
}, 0);
|
|
84
185
|
const upgradeTotal = upgrades.reduce((cur, upgrade) => cur + upgrade.price, 0);
|
|
85
186
|
const upgradeFeeTotal = upgrades.reduce((cur, upgrade) => {
|
|
86
187
|
return cur + upgradeFees.reduce((cur, fee) => cur + applyUpgradeFee(upgrade, fee), 0);
|
|
87
188
|
}, 0);
|
|
88
189
|
const orderSubtotal = ticketTotal + ticketFeeTotal + upgradeTotal + upgradeFeeTotal;
|
|
190
|
+
console.log(`Order SubTotal:`, orderSubtotal);
|
|
89
191
|
const orderTotal = orderFees.reduce((cur, fee) => {
|
|
90
192
|
return applyOrderFee(cur, fee);
|
|
91
193
|
}, orderSubtotal);
|
|
92
|
-
|
|
194
|
+
console.log(`Order Total`, orderTotal);
|
|
195
|
+
return orderTotal;
|
|
93
196
|
}
|
|
94
197
|
};
|
|
95
198
|
//# sourceMappingURL=PaymentUtil.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentUtil.js","sourceRoot":"","sources":["../../src/utils/PaymentUtil.ts"],"names":[],"mappings":";;AACA,6CAAyF;AACzF,0EAAuE;
|
|
1
|
+
{"version":3,"file":"PaymentUtil.js","sourceRoot":"","sources":["../../src/utils/PaymentUtil.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sellout/models",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.63",
|
|
4
4
|
"description": "Sellout.io models",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"author": "samheutmaker@gmail.com",
|
|
17
17
|
"license": "MIT",
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@sellout/service": "^0.0.
|
|
20
|
-
"@sellout/utils": "^0.0.
|
|
19
|
+
"@sellout/service": "^0.0.63",
|
|
20
|
+
"@sellout/utils": "^0.0.63",
|
|
21
21
|
"@types/shortid": "0.0.29",
|
|
22
22
|
"apollo-link-debounce": "^2.1.0",
|
|
23
23
|
"graphql": "^14.6.0",
|
|
@@ -30,5 +30,5 @@
|
|
|
30
30
|
"protobufjs": "~6.10.1",
|
|
31
31
|
"typescript": "^3.8.3"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "ac189b9687d565aeec74f94ade3dabe3d0b29e34"
|
|
34
34
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import gql from "graphql-tag";
|
|
2
|
+
import Order from '../fragments/order.fragment';
|
|
3
|
+
|
|
4
|
+
const mutation = gql`
|
|
5
|
+
mutation breakApartOrder($orderId: String!) {
|
|
6
|
+
breakApartOrder(orderId: $orderId) {
|
|
7
|
+
_id
|
|
8
|
+
event {
|
|
9
|
+
_id
|
|
10
|
+
name
|
|
11
|
+
posterImageUrl
|
|
12
|
+
sendQRCode
|
|
13
|
+
performances {
|
|
14
|
+
schedule {
|
|
15
|
+
doorsAt
|
|
16
|
+
startsAt
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
schedule {
|
|
20
|
+
startsAt
|
|
21
|
+
}
|
|
22
|
+
venue {
|
|
23
|
+
name
|
|
24
|
+
address {
|
|
25
|
+
state
|
|
26
|
+
city
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
organization {
|
|
30
|
+
orgName
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
state
|
|
34
|
+
refundedAmount
|
|
35
|
+
refundReason
|
|
36
|
+
promotionCode
|
|
37
|
+
type
|
|
38
|
+
...OrderTickets
|
|
39
|
+
...OrderUpgrades
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
${Order.fragments.tickets}
|
|
43
|
+
${Order.fragments.upgrades}
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
export default mutation;
|
package/src/proto/order.proto
CHANGED
|
@@ -327,6 +327,21 @@ message QueryOrderAnalyticsResponse {
|
|
|
327
327
|
repeated Analytics analytics = 2;
|
|
328
328
|
}
|
|
329
329
|
|
|
330
|
+
/****************************************************************************************
|
|
331
|
+
Break Apart Order
|
|
332
|
+
****************************************************************************************/
|
|
333
|
+
|
|
334
|
+
message BreakApartOrderRequest {
|
|
335
|
+
string spanContext = 0;
|
|
336
|
+
string orderId = 1;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
message BreakApartOrderResponse {
|
|
340
|
+
StatusCode status = 0;
|
|
341
|
+
repeated Error errors = 1;
|
|
342
|
+
Order order = 2;
|
|
343
|
+
}
|
|
344
|
+
|
|
330
345
|
service OrderService {
|
|
331
346
|
// Create
|
|
332
347
|
rpc createOrder(CreateOrderRequest) returns (CreateOrderResponse) {}
|
|
@@ -335,6 +350,7 @@ service OrderService {
|
|
|
335
350
|
rpc sendOrderReceiptEmail(SendOrderReceiptEmailRequest) returns (SendOrderReceiptEmailResponse) {}
|
|
336
351
|
rpc sendOrderRefundEmail(SendOrderRefundEmailRequest) returns (SendOrderRefundEmailResponse) {}
|
|
337
352
|
rpc scanOrder(ScanOrderRequest) returns (ScanOrderResponse) {}
|
|
353
|
+
rpc breakApartOrder(BreakApartOrderRequest) returns (BreakApartOrderResponse) {}
|
|
338
354
|
// Refund
|
|
339
355
|
rpc refundOrder(RefundOrderRequest) returns (RefundOrderResponse) {}
|
|
340
356
|
rpc refundEventOrders(RefundEventOrdersRequest) returns (RefundEventOrdersResponse) {}
|
package/src/schemas/Order.ts
CHANGED
|
@@ -82,6 +82,11 @@ const OrderTicket = {
|
|
|
82
82
|
type: String,
|
|
83
83
|
required: true,
|
|
84
84
|
},
|
|
85
|
+
qrCodeUrl: {
|
|
86
|
+
type: String,
|
|
87
|
+
required: false,
|
|
88
|
+
default: null,
|
|
89
|
+
},
|
|
85
90
|
};
|
|
86
91
|
|
|
87
92
|
const OrderUpgrade = {
|
|
@@ -118,6 +123,11 @@ const OrderUpgrade = {
|
|
|
118
123
|
type: String,
|
|
119
124
|
required: true,
|
|
120
125
|
},
|
|
126
|
+
qrCodeUrl: {
|
|
127
|
+
type: String,
|
|
128
|
+
required: false,
|
|
129
|
+
default: null,
|
|
130
|
+
},
|
|
121
131
|
};
|
|
122
132
|
|
|
123
133
|
const OrderCustomField = {
|
package/src/utils/PaymentUtil.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ICreateOrderTicketParams, ICreateOrderUpgradeParams } from '../interfaces/ICreateOrderParams';
|
|
2
2
|
import IFee, { FeeAppliedToEnum, FeeFiltersEnum, FeeTypeEnum } from '../interfaces/IFee';
|
|
3
3
|
import { PaymentMethodTypeEnum } from '../enums/PaymentMethodTypeEnum';
|
|
4
|
+
// import { OrderTypeEnum } from 'src/interfaces/IOrderType';
|
|
4
5
|
|
|
5
6
|
interface IPaymentCalculatorParams {
|
|
6
7
|
tickets: ICreateOrderTicketParams[];
|
|
@@ -9,50 +10,171 @@ interface IPaymentCalculatorParams {
|
|
|
9
10
|
paymentMethodType: PaymentMethodTypeEnum
|
|
10
11
|
}
|
|
11
12
|
|
|
13
|
+
// interface IOrderItems {
|
|
14
|
+
// tickets: ICreateOrderTicketParams[];
|
|
15
|
+
// upgrades: ICreateOrderUpgradeParams[];
|
|
16
|
+
// }
|
|
17
|
+
|
|
12
18
|
export default {
|
|
19
|
+
// DOES NOT WORK! Work in Progress :)
|
|
20
|
+
// calculateOrderItemPrices(params: IPaymentCalculatorParams): IOrderItems {
|
|
21
|
+
|
|
22
|
+
// let {
|
|
23
|
+
// tickets = [],
|
|
24
|
+
// upgrades = [],
|
|
25
|
+
// fees = [],
|
|
26
|
+
// paymentMethodType,
|
|
27
|
+
// } = params;
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
// // Filter fees
|
|
31
|
+
// fees = fees.filter((fee: IFee) => {
|
|
32
|
+
// // Ignore card reader fees for non card reader payemnts
|
|
33
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum.CardReader) {
|
|
34
|
+
// return false;
|
|
35
|
+
// }
|
|
36
|
+
|
|
37
|
+
// // Ignore card entry fees for non card entry payemnts
|
|
38
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum.CardEntry) {
|
|
39
|
+
// return false;
|
|
40
|
+
// }
|
|
41
|
+
|
|
42
|
+
// return true;
|
|
43
|
+
// });
|
|
44
|
+
|
|
45
|
+
// const ticketFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Ticket)
|
|
46
|
+
// .sort(({ type }) => {
|
|
47
|
+
// if (type === FeeTypeEnum.Flat) return -1;
|
|
48
|
+
// else return 1;
|
|
49
|
+
// });
|
|
50
|
+
// const upgradeFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Upgrade);
|
|
51
|
+
// // Orders mattes here. Flat type fees must be applied before Percent type fees
|
|
52
|
+
// const orderFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Order)
|
|
53
|
+
// .sort(({ type }) => {
|
|
54
|
+
// if (type === FeeTypeEnum.Percent) return -1;
|
|
55
|
+
// else return 1;
|
|
56
|
+
// })
|
|
57
|
+
// .map(fee => {
|
|
58
|
+
// if(fee.type === FeeTypeEnum.Flat) {
|
|
59
|
+
// return {
|
|
60
|
+
// ...fee,
|
|
61
|
+
// value: fee.value / tickets.length,
|
|
62
|
+
// }
|
|
63
|
+
// }
|
|
64
|
+
// else return fee;
|
|
65
|
+
// });
|
|
66
|
+
|
|
67
|
+
// const reverseApplyFee = (price: number, ticket: ICreateOrderTicketParams, fee: IFee): number => {
|
|
68
|
+
// // Ignore seated fees
|
|
69
|
+
// if (fee.filters && fee.filters.includes(FeeFiltersEnum.Seated) && !ticket.seat) {
|
|
70
|
+
// return price;
|
|
71
|
+
// }
|
|
72
|
+
|
|
73
|
+
// const minFee = fee.minAppliedToPrice || 0;
|
|
74
|
+
// const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
75
|
+
|
|
76
|
+
// if (minFee <= price && price <= maxFee) {
|
|
77
|
+
// console.log(fee);
|
|
78
|
+
// if (fee.type === FeeTypeEnum.Flat) {
|
|
79
|
+
// return price - fee.value;
|
|
80
|
+
// } if (fee.type === FeeTypeEnum.Percent) {
|
|
81
|
+
// return price * (1 - fee.value / 100);
|
|
82
|
+
// }
|
|
83
|
+
// }
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
// // if(fee.type === FeeTypeEnum.Percent) {
|
|
87
|
+
// // return price * (1 - fee.value / 100);
|
|
88
|
+
// // }
|
|
89
|
+
|
|
90
|
+
// // if(fee.type === FeeTypeEnum.Flat) {
|
|
91
|
+
// // return price - fee.value;
|
|
92
|
+
// // }
|
|
93
|
+
|
|
94
|
+
// return price;
|
|
95
|
+
// }
|
|
96
|
+
|
|
97
|
+
// function calculateTicketPrice(ticket: ICreateOrderTicketParams): number {
|
|
98
|
+
// if(!ticket.rollFees) return ticket.price;
|
|
99
|
+
|
|
100
|
+
// const allFees = [...orderFees, ...ticketFees];
|
|
101
|
+
|
|
102
|
+
// return allFees.reduce((cur, fee) => {
|
|
103
|
+
// const next = reverseApplyFee(cur, ticket, fee);
|
|
104
|
+
// return next;
|
|
105
|
+
// }, ticket.price);
|
|
106
|
+
|
|
107
|
+
// }
|
|
108
|
+
|
|
109
|
+
// tickets = tickets.map((ticket: ICreateOrderTicketParams): ICreateOrderTicketParams => {
|
|
110
|
+
// const price = Math.floor(calculateTicketPrice(ticket));
|
|
111
|
+
// console.log(`Ticket Price: `, price);
|
|
112
|
+
// return {
|
|
113
|
+
// ...ticket,
|
|
114
|
+
// price,
|
|
115
|
+
// }
|
|
116
|
+
// });
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
// // upgrades = upgrades.map((upgrade: ICreateOrderUpgradeParams): ICreateOrderUpgradeParams => {
|
|
121
|
+
// // return {
|
|
122
|
+
// // ...upgrade,
|
|
123
|
+
// // price: calculateUpgradePrice(upgrade),
|
|
124
|
+
// // }
|
|
125
|
+
// // });
|
|
126
|
+
|
|
127
|
+
// return {
|
|
128
|
+
// tickets,
|
|
129
|
+
// upgrades,
|
|
130
|
+
// };
|
|
131
|
+
// },
|
|
13
132
|
calculateTotal(params: IPaymentCalculatorParams): number {
|
|
14
133
|
|
|
15
|
-
|
|
16
|
-
tickets = [],
|
|
134
|
+
let {
|
|
135
|
+
tickets = [],
|
|
17
136
|
upgrades = [],
|
|
18
137
|
fees = [],
|
|
19
138
|
paymentMethodType,
|
|
20
139
|
} = params;
|
|
21
140
|
|
|
22
|
-
console.log(fees);
|
|
23
|
-
|
|
24
141
|
// No items, total is always 0
|
|
25
|
-
if(!tickets.length && !upgrades.length) return 0;
|
|
142
|
+
if (!tickets.length && !upgrades.length) return 0;
|
|
143
|
+
|
|
144
|
+
// Filter fees
|
|
145
|
+
fees = fees.filter((fee: IFee) => {
|
|
146
|
+
// Ignore card reader fees for non card reader payemnts
|
|
147
|
+
if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum.CardReader) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
26
150
|
|
|
27
|
-
|
|
151
|
+
// Ignore card entry fees for non card entry payemnts
|
|
152
|
+
if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum.CardEntry) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return true;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const ticketFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Ticket)
|
|
160
|
+
.sort(({ type }) => {
|
|
161
|
+
if (type === FeeTypeEnum.Flat) return -1;
|
|
162
|
+
else return 1;
|
|
163
|
+
})
|
|
28
164
|
const upgradeFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Upgrade);
|
|
29
165
|
// Orders mattes here. Flat type fees must be applied before Percent type fees
|
|
30
166
|
const orderFees = fees.filter(f => f.appliedTo === FeeAppliedToEnum.Order).sort(({ type }) => {
|
|
31
167
|
if (type === 'Flat') return -1;
|
|
32
|
-
return 1;
|
|
168
|
+
else return 1;
|
|
33
169
|
});
|
|
170
|
+
|
|
34
171
|
|
|
35
172
|
function applyTicketFee(ticket: ICreateOrderTicketParams, fee: IFee): number {
|
|
36
|
-
//
|
|
37
|
-
// if (ticket.rollFees) {
|
|
38
|
-
// return 0;
|
|
39
|
-
// }
|
|
40
|
-
|
|
41
|
-
// Ignore seated fees
|
|
173
|
+
// Ignore seated fees if not seated
|
|
42
174
|
if (fee.filters && fee.filters.includes(FeeFiltersEnum.Seated) && !ticket.seat) {
|
|
43
175
|
return 0;
|
|
44
176
|
}
|
|
45
|
-
|
|
46
|
-
// Ignore card reader fees for non card reader payemnts
|
|
47
|
-
if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardReader) && paymentMethodType !== PaymentMethodTypeEnum.CardReader) {
|
|
48
|
-
return 0;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Ignore card entry fees for non card entry payemnts
|
|
52
|
-
if (fee.filters && fee.filters.includes(FeeFiltersEnum.CardEntry) && paymentMethodType !== PaymentMethodTypeEnum.CardEntry) {
|
|
53
|
-
return 0;
|
|
54
|
-
}
|
|
55
|
-
|
|
177
|
+
|
|
56
178
|
const minFee = fee.minAppliedToPrice || 0;
|
|
57
179
|
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
58
180
|
|
|
@@ -70,19 +192,14 @@ export default {
|
|
|
70
192
|
}
|
|
71
193
|
|
|
72
194
|
function applyUpgradeFee(upgrade: ICreateOrderUpgradeParams, fee: IFee): number {
|
|
73
|
-
// // Ignore rolled fees
|
|
74
|
-
// if (upgrade.rollFees) {
|
|
75
|
-
// return 0;
|
|
76
|
-
// }
|
|
77
|
-
|
|
78
195
|
const minFee = fee.minAppliedToPrice || 0;
|
|
79
196
|
const maxFee = fee.maxAppliedToPrice || Infinity;
|
|
80
197
|
|
|
81
198
|
if (minFee <= upgrade.price && upgrade.price <= maxFee) {
|
|
82
199
|
if (fee.type === FeeTypeEnum.Flat) {
|
|
83
|
-
return fee.value;
|
|
200
|
+
return upgrade.price + fee.value;
|
|
84
201
|
} if (fee.type === FeeTypeEnum.Percent) {
|
|
85
|
-
return (upgrade.price
|
|
202
|
+
return (upgrade.price / (1 - fee.value / 100));
|
|
86
203
|
}
|
|
87
204
|
} else {
|
|
88
205
|
return 0;
|
|
@@ -102,7 +219,11 @@ export default {
|
|
|
102
219
|
const ticketTotal = tickets.reduce((cur, ticket) => cur + ticket.price, 0);
|
|
103
220
|
|
|
104
221
|
const ticketFeeTotal = tickets.reduce((cur, ticket) => {
|
|
105
|
-
return cur + ticketFees.reduce((cur, fee) =>
|
|
222
|
+
return cur + ticketFees.reduce((cur, fee) => {
|
|
223
|
+
const value = cur + applyTicketFee(ticket, fee);
|
|
224
|
+
console.log(`${fee.name}: ${value}`);
|
|
225
|
+
return value;
|
|
226
|
+
}, 0);
|
|
106
227
|
}, 0);
|
|
107
228
|
|
|
108
229
|
const upgradeTotal = upgrades.reduce((cur, upgrade) => cur + upgrade.price, 0);
|
|
@@ -113,10 +234,14 @@ export default {
|
|
|
113
234
|
|
|
114
235
|
const orderSubtotal = ticketTotal + ticketFeeTotal + upgradeTotal + upgradeFeeTotal;
|
|
115
236
|
|
|
237
|
+
console.log(`Order SubTotal:`, orderSubtotal);
|
|
238
|
+
|
|
116
239
|
const orderTotal = orderFees.reduce((cur, fee) => {
|
|
117
240
|
return applyOrderFee(cur, fee);
|
|
118
241
|
}, orderSubtotal);
|
|
119
242
|
|
|
120
|
-
|
|
243
|
+
console.log(`Order Total`, orderTotal);
|
|
244
|
+
|
|
245
|
+
return orderTotal;
|
|
121
246
|
}
|
|
122
247
|
}
|