@sellout/models 0.0.1
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/interfaces/IAddress.d.ts +13 -0
- package/.dist/interfaces/IAddress.js +3 -0
- package/.dist/interfaces/IAddress.js.map +1 -0
- package/.dist/interfaces/IMetrics.d.ts +29 -0
- package/.dist/interfaces/IMetrics.js +3 -0
- package/.dist/interfaces/IMetrics.js.map +1 -0
- package/.dist/interfaces/IPagination.d.ts +4 -0
- package/.dist/interfaces/IPagination.js +3 -0
- package/.dist/interfaces/IPagination.js.map +1 -0
- package/.dist/interfaces/IQuery.d.ts +15 -0
- package/.dist/interfaces/IQuery.js +20 -0
- package/.dist/interfaces/IQuery.js.map +1 -0
- package/.dist/mongo/Address.d.ts +58 -0
- package/.dist/mongo/Address.js +60 -0
- package/.dist/mongo/Address.js.map +1 -0
- package/.dist/mongo/Metrics.d.ts +131 -0
- package/.dist/mongo/Metrics.js +137 -0
- package/.dist/mongo/Metrics.js.map +1 -0
- package/.dist/schemas/Address.d.ts +58 -0
- package/.dist/schemas/Address.js +60 -0
- package/.dist/schemas/Address.js.map +1 -0
- package/.dist/schemas/Metrics.d.ts +131 -0
- package/.dist/schemas/Metrics.js +137 -0
- package/.dist/schemas/Metrics.js.map +1 -0
- package/.dist/sellout-proto.js +92266 -0
- package/.dist/utils/EventUtil.d.ts +38 -0
- package/.dist/utils/EventUtil.js +188 -0
- package/.dist/utils/EventUtil.js.map +1 -0
- package/.dist/utils/FeeUtil.d.ts +7 -0
- package/.dist/utils/FeeUtil.js +37 -0
- package/.dist/utils/FeeUtil.js.map +1 -0
- package/.dist/utils/OrderUtil.d.ts +29 -0
- package/.dist/utils/OrderUtil.js +216 -0
- package/.dist/utils/OrderUtil.js.map +1 -0
- package/.dist/utils/WebFlowUtil.d.ts +7 -0
- package/.dist/utils/WebFlowUtil.js +10 -0
- package/.dist/utils/WebFlowUtil.js.map +1 -0
- package/package.json +29 -0
- package/src/interfaces/IAddress.ts +13 -0
- package/src/interfaces/IArtist.ts +14 -0
- package/src/interfaces/IArtistContact.ts +8 -0
- package/src/interfaces/IArtistPressKit.ts +8 -0
- package/src/interfaces/IEvent.ts +62 -0
- package/src/interfaces/IEventCustomField.ts +16 -0
- package/src/interfaces/IEventPromotion.ts +15 -0
- package/src/interfaces/IEventSchedule.ts +7 -0
- package/src/interfaces/IEventUpgrade.ts +13 -0
- package/src/interfaces/IFee.ts +46 -0
- package/src/interfaces/IFile.ts +7 -0
- package/src/interfaces/IMetrics.ts +33 -0
- package/src/interfaces/IOrder.ts +32 -0
- package/src/interfaces/IOrderCustomField.ts +7 -0
- package/src/interfaces/IOrderState.ts +19 -0
- package/src/interfaces/IOrderSummary.ts +37 -0
- package/src/interfaces/IOrderTicket.ts +15 -0
- package/src/interfaces/IOrderType.ts +5 -0
- package/src/interfaces/IOrderUpgrade.ts +14 -0
- package/src/interfaces/IOrganization.ts +19 -0
- package/src/interfaces/IPagination.ts +4 -0
- package/src/interfaces/IPerformance.ts +18 -0
- package/src/interfaces/IQuery.ts +30 -0
- package/src/interfaces/IRefund.ts +6 -0
- package/src/interfaces/IRole.ts +17 -0
- package/src/interfaces/IScan.ts +5 -0
- package/src/interfaces/ISeating.ts +9 -0
- package/src/interfaces/ISocialAccountLink.ts +14 -0
- package/src/interfaces/ITask.ts +22 -0
- package/src/interfaces/ITicketExchange.ts +11 -0
- package/src/interfaces/ITicketHold.ts +6 -0
- package/src/interfaces/ITicketTier.ts +9 -0
- package/src/interfaces/ITicketType.ts +12 -0
- package/src/interfaces/IUser.ts +26 -0
- package/src/interfaces/IUserProfile.ts +20 -0
- package/src/interfaces/IVenue.ts +17 -0
- package/src/interfaces/IWebFlow.ts +55 -0
- package/src/proto/artist.proto +156 -0
- package/src/proto/broadcast.proto +157 -0
- package/src/proto/common.proto +59 -0
- package/src/proto/email.proto +179 -0
- package/src/proto/error.proto +31 -0
- package/src/proto/event.proto +270 -0
- package/src/proto/fee.proto +196 -0
- package/src/proto/file-upload.proto +27 -0
- package/src/proto/order.proto +272 -0
- package/src/proto/organization.proto +107 -0
- package/src/proto/role.proto +136 -0
- package/src/proto/seating.proto +64 -0
- package/src/proto/stripe.proto +181 -0
- package/src/proto/task.proto +39 -0
- package/src/proto/twilio.proto +43 -0
- package/src/proto/user-profile.proto +124 -0
- package/src/proto/user.proto +284 -0
- package/src/proto/venue.proto +120 -0
- package/src/proto/web-flow.proto +315 -0
- package/src/schemas/Address.ts +57 -0
- package/src/schemas/Artist.ts +104 -0
- package/src/schemas/Event.ts +400 -0
- package/src/schemas/Fee.ts +74 -0
- package/src/schemas/Metrics.ts +134 -0
- package/src/schemas/Order.ts +200 -0
- package/src/schemas/Organization.ts +108 -0
- package/src/schemas/Role.ts +37 -0
- package/src/schemas/Seating.ts +34 -0
- package/src/schemas/User.ts +95 -0
- package/src/schemas/UserProfile.ts +67 -0
- package/src/schemas/Venue.ts +58 -0
- package/src/schemas/WebFlow.ts +132 -0
- package/src/utils/EventUtil.ts +186 -0
- package/src/utils/FeeUtil.ts +34 -0
- package/src/utils/OrderUtil.ts +226 -0
- package/src/utils/WebFlowUtil.ts +8 -0
- package/tsconfig.json +27 -0
- package/tslint.json +21 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import * as Time from '@sellout/utils/.dist/time';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
hasBeenAnnouced(event): boolean {
|
|
5
|
+
const { schedule: { announceAt } } = event;
|
|
6
|
+
const now = Time.now();
|
|
7
|
+
return announceAt < now;
|
|
8
|
+
},
|
|
9
|
+
isAnnounced(event): boolean {
|
|
10
|
+
const { schedule: { announceAt, ticketsAt } } = event;
|
|
11
|
+
const now = Time.now();
|
|
12
|
+
return announceAt < now && now < ticketsAt;
|
|
13
|
+
},
|
|
14
|
+
isOnSale(event): boolean {
|
|
15
|
+
const { schedule: { ticketsAt, ticketsEndAt } } = event;
|
|
16
|
+
const now = Time.now();
|
|
17
|
+
return ticketsAt < now && now < ticketsEndAt;
|
|
18
|
+
},
|
|
19
|
+
isInProgress(event): boolean {
|
|
20
|
+
const { schedule: { startsAt, endsAt } } = event;
|
|
21
|
+
const now = Time.now();
|
|
22
|
+
return startsAt < now && now < endsAt;
|
|
23
|
+
},
|
|
24
|
+
saleHasEnded(event): boolean {
|
|
25
|
+
const { schedule: { ticketsEndAt } } = event;
|
|
26
|
+
const now = Time.now();
|
|
27
|
+
return ticketsEndAt < now;
|
|
28
|
+
},
|
|
29
|
+
hasEnded(event): boolean {
|
|
30
|
+
const { schedule: { endsAt } } = event;
|
|
31
|
+
const now = Time.now();
|
|
32
|
+
return endsAt < now;
|
|
33
|
+
},
|
|
34
|
+
hasActivePreSalePromotions(event): boolean{
|
|
35
|
+
return event.promotions
|
|
36
|
+
.filter(promotion => promotion.type === 'Pre-Sale Code')
|
|
37
|
+
.filter(promotion => promotion.active)
|
|
38
|
+
.length > 0;
|
|
39
|
+
},
|
|
40
|
+
qrCodeEmailAt(event): number {
|
|
41
|
+
const { performances: [performance] } = event;
|
|
42
|
+
const { schedule: { doorsAt, startsAt } } = performance;
|
|
43
|
+
|
|
44
|
+
if(event.sendQRCode === 'Upon Order') {
|
|
45
|
+
return Time.now();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if(event.sendQRCode === 'Two Weeks Before Show') {
|
|
49
|
+
const TWO_WEEKS = 14 * 24 * 60 * 60;
|
|
50
|
+
return startsAt - TWO_WEEKS;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return doorsAt - (600);
|
|
54
|
+
},
|
|
55
|
+
shouldSendOrderReceipt(event): boolean {
|
|
56
|
+
const now = Time.now();
|
|
57
|
+
const qrCodeEmailAt = this.qrCodeEmailAt(event);
|
|
58
|
+
|
|
59
|
+
// Never send a receipt if we are
|
|
60
|
+
// send a qr code upon order
|
|
61
|
+
if (event.sendQRCode === 'Upon Order') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Only send a receipt if QR codes for
|
|
66
|
+
// the event haven't already gone out
|
|
67
|
+
if(qrCodeEmailAt > now) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return false;
|
|
72
|
+
},
|
|
73
|
+
/****************************************************************************************
|
|
74
|
+
Venue
|
|
75
|
+
****************************************************************************************/
|
|
76
|
+
venueIds(event): string[] {
|
|
77
|
+
let venueIds = [event.venueId];
|
|
78
|
+
event.performances.forEach(performance => {
|
|
79
|
+
venueIds = venueIds.concat(performance.venueStageId)
|
|
80
|
+
});
|
|
81
|
+
venueIds = [...new Set(venueIds)];
|
|
82
|
+
venueIds = venueIds.filter(v => !!v);
|
|
83
|
+
return venueIds;
|
|
84
|
+
},
|
|
85
|
+
seatingId(event): string {
|
|
86
|
+
return event._id.replace('_', 'SAMH');
|
|
87
|
+
},
|
|
88
|
+
/****************************************************************************************
|
|
89
|
+
Artist
|
|
90
|
+
****************************************************************************************/
|
|
91
|
+
artistIds(event): string[] {
|
|
92
|
+
let artistIds = [];
|
|
93
|
+
event.performances.forEach(performance => {
|
|
94
|
+
artistIds = artistIds
|
|
95
|
+
.concat(performance.headliningArtistIds)
|
|
96
|
+
.concat(performance.openingArtistIds);
|
|
97
|
+
});
|
|
98
|
+
artistIds = [...new Set(artistIds)];
|
|
99
|
+
artistIds = artistIds.filter(a => !!a);
|
|
100
|
+
return artistIds;
|
|
101
|
+
},
|
|
102
|
+
headliningArtistIds(event): string[] {
|
|
103
|
+
let artistIds = [];
|
|
104
|
+
event.performances.forEach(performance => {
|
|
105
|
+
artistIds = artistIds
|
|
106
|
+
.concat(performance.headliningArtistIds)
|
|
107
|
+
});
|
|
108
|
+
artistIds = [...new Set(artistIds)];
|
|
109
|
+
artistIds = artistIds.filter(a => !!a);
|
|
110
|
+
return artistIds;
|
|
111
|
+
},
|
|
112
|
+
openingArtistIds(event): string[] {
|
|
113
|
+
let artistIds = [];
|
|
114
|
+
event.performances.forEach(performance => {
|
|
115
|
+
artistIds = artistIds
|
|
116
|
+
.concat(performance.openingArtistIds);
|
|
117
|
+
});
|
|
118
|
+
artistIds = [...new Set(artistIds)];
|
|
119
|
+
artistIds = artistIds.filter(a => !!a);
|
|
120
|
+
return artistIds;
|
|
121
|
+
},
|
|
122
|
+
/****************************************************************************************
|
|
123
|
+
Tickets
|
|
124
|
+
****************************************************************************************/
|
|
125
|
+
ticketType(event, ticketTypeId): any {
|
|
126
|
+
return event.ticketTypes.find(ticketType => ticketType._id === ticketTypeId);
|
|
127
|
+
},
|
|
128
|
+
remainingTicketQty(event, ticketTypeId: string | null = null): number {
|
|
129
|
+
if (ticketTypeId) {
|
|
130
|
+
let ticketType = event.ticketTypes.find(ticketType => ticketType._id === ticketTypeId);
|
|
131
|
+
if (!ticketType) return 0;
|
|
132
|
+
else return ticketType.remainingQty;
|
|
133
|
+
} else {
|
|
134
|
+
return event.ticketTypes.reduce((cur, next) => {
|
|
135
|
+
return cur + next.remainingQty;
|
|
136
|
+
}, 0);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
remainingQtyByTicketTypes(event): object {
|
|
140
|
+
return event.ticketTypes.reduce((cur, ticketType) => {
|
|
141
|
+
cur[ticketType._id] = this.remainingTicketQty(event, ticketType._id);
|
|
142
|
+
return cur;
|
|
143
|
+
}, {});
|
|
144
|
+
},
|
|
145
|
+
purchaseLimitByTicketTypes(event): object {
|
|
146
|
+
return event.ticketTypes.reduce((cur, ticketType) => {
|
|
147
|
+
cur[ticketType._id] = ticketType.purchaseLimit;
|
|
148
|
+
return cur;
|
|
149
|
+
}, {});
|
|
150
|
+
},
|
|
151
|
+
getCurrentTierId(event, ticketTypeId: string): string {
|
|
152
|
+
const ticketType = event.ticketTypes.find(t => t._id.toString() === ticketTypeId);
|
|
153
|
+
const now = Time.now();
|
|
154
|
+
const tier = ticketType.tiers.find(tier => tier.startsAt < now && now < tier.endsAt);
|
|
155
|
+
return tier._id;
|
|
156
|
+
},
|
|
157
|
+
/****************************************************************************************
|
|
158
|
+
Upgrades
|
|
159
|
+
****************************************************************************************/
|
|
160
|
+
upgrade(event, upgradeId): any {
|
|
161
|
+
return event.upgrades.find(upgrades => upgrades._id === upgradeId);
|
|
162
|
+
},
|
|
163
|
+
remainingUpgradeQty(event, upgradeId: string | null = null): number {
|
|
164
|
+
if (upgradeId) {
|
|
165
|
+
let upgrade = event.upgrades.find(upgrade => upgrade._id === upgradeId);
|
|
166
|
+
if (!upgrade) return 0;
|
|
167
|
+
else return upgrade.remainingQty;
|
|
168
|
+
} else {
|
|
169
|
+
return event.upgrades.reduce((cur, next) => {
|
|
170
|
+
return cur + next.remainingQty;
|
|
171
|
+
}, 0);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
remainingQtyByUpgrades(event): object {
|
|
175
|
+
return event.upgrades.reduce((cur, upgrade) => {
|
|
176
|
+
cur[upgrade._id] = this.remainingUpgradeQty(event, upgrade._id);
|
|
177
|
+
return cur;
|
|
178
|
+
}, {});
|
|
179
|
+
},
|
|
180
|
+
purchaseLimitByUpgrades(event): object {
|
|
181
|
+
return event.upgrades.reduce((cur, upgrade) => {
|
|
182
|
+
cur[upgrade._id] = upgrade.purchaseLimit;
|
|
183
|
+
return cur;
|
|
184
|
+
}, {});
|
|
185
|
+
},
|
|
186
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
processingFees(fees) {
|
|
3
|
+
return fees.filter((fee) => {
|
|
4
|
+
if (fee.appliedBy === 'Sellout' || fee.appliedBy === 'Stripe') {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
return false;
|
|
8
|
+
});
|
|
9
|
+
},
|
|
10
|
+
selloutFees(fees) {
|
|
11
|
+
return fees.filter((fee) => {
|
|
12
|
+
if (fee.appliedBy === 'Sellout') {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
stripeFees(fees) {
|
|
19
|
+
return fees.filter((fee) => {
|
|
20
|
+
if (fee.appliedBy === 'Stripe') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
promoterFees(fees) {
|
|
27
|
+
return fees.filter((fee) => {
|
|
28
|
+
if (fee.appliedBy === 'Sellout' || fee.appliedBy === 'Stripe') {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import FeeUtil from "./FeeUtil";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
/** **************************************************************************************
|
|
5
|
+
Order
|
|
6
|
+
*************************************************************************************** */
|
|
7
|
+
orderTotal(order, fees) {
|
|
8
|
+
// if (order.type === this.types.Complimentary) return 0;
|
|
9
|
+
// if (order.type === this.types.RSVP) fees = [];
|
|
10
|
+
|
|
11
|
+
if (
|
|
12
|
+
(!order.tickets || !order.tickets.length) &&
|
|
13
|
+
(!order.upgrades || !order.upgrades.length)
|
|
14
|
+
)
|
|
15
|
+
return 0;
|
|
16
|
+
|
|
17
|
+
if (!order.tickets) order.tickets = [];
|
|
18
|
+
if (!order.upgrades) order.upgrades = [];
|
|
19
|
+
|
|
20
|
+
const ticketFees = fees.filter(f => f.appliedTo === "Ticket");
|
|
21
|
+
const upgradeFees = fees.filter(f => f.appliedTo === "Upgrade");
|
|
22
|
+
let orderFees = fees.filter(f => f.appliedTo === "Order");
|
|
23
|
+
|
|
24
|
+
function applyTicketFee(ticket, fee) {
|
|
25
|
+
if (fee.filters.includes("Seated") && !ticket.seat) return 0;
|
|
26
|
+
const noMax = fee.maxAppliedToPrice === 0;
|
|
27
|
+
if (
|
|
28
|
+
(fee.minAppliedToPrice <= ticket.price &&
|
|
29
|
+
ticket.price <= fee.maxAppliedToPrice) ||
|
|
30
|
+
noMax
|
|
31
|
+
) {
|
|
32
|
+
if (fee.type === "Flat") {
|
|
33
|
+
return fee.value;
|
|
34
|
+
}
|
|
35
|
+
if (fee.type === "Percent") {
|
|
36
|
+
return (ticket.price * fee.value) / 100;
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function applyUpgradeFee(upgrade, fee) {
|
|
44
|
+
const noMax = fee.maxAppliedToPrice === 0;
|
|
45
|
+
if (
|
|
46
|
+
(fee.minAppliedToPrice <= upgrade.price &&
|
|
47
|
+
upgrade.price <= fee.minAppliedToPrice) ||
|
|
48
|
+
noMax
|
|
49
|
+
) {
|
|
50
|
+
if (fee.type === "Flat") {
|
|
51
|
+
return fee.value;
|
|
52
|
+
}
|
|
53
|
+
if (fee.type === "Percent") {
|
|
54
|
+
return (upgrade.price * fee.value) / 100;
|
|
55
|
+
}
|
|
56
|
+
} else {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function applyOrderFee(orderSubtotal, fee) {
|
|
62
|
+
if (fee.type === "Flat") {
|
|
63
|
+
return orderSubtotal + fee.value;
|
|
64
|
+
}
|
|
65
|
+
if (fee.type === "Percent") {
|
|
66
|
+
return orderSubtotal / (1 - fee.value / 100);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const ticketTotal = order.tickets.reduce(
|
|
71
|
+
(cur, ticket) => cur + ticket.price,
|
|
72
|
+
0
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const ticketFeeTotal = order.tickets.reduce((cur, ticket) => {
|
|
76
|
+
return (
|
|
77
|
+
cur +
|
|
78
|
+
ticketFees.reduce((cur, fee) => cur + applyTicketFee(ticket, fee), 0)
|
|
79
|
+
);
|
|
80
|
+
}, 0);
|
|
81
|
+
|
|
82
|
+
const upgradeTotal = order.upgrades.reduce(
|
|
83
|
+
(cur, upgrade) => cur + upgrade.price,
|
|
84
|
+
0
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const upgradeFeeTotal = order.upgrades.reduce((cur, upgrade) => {
|
|
88
|
+
return (
|
|
89
|
+
cur +
|
|
90
|
+
upgradeFees.reduce((cur, fee) => cur + applyUpgradeFee(upgrade, fee), 0)
|
|
91
|
+
);
|
|
92
|
+
}, 0);
|
|
93
|
+
|
|
94
|
+
const orderSubtotal =
|
|
95
|
+
ticketTotal + ticketFeeTotal + upgradeTotal + upgradeFeeTotal;
|
|
96
|
+
|
|
97
|
+
// Order matters here. Flat type fees must be
|
|
98
|
+
// applied before Percent type fees
|
|
99
|
+
orderFees = orderFees.sort(({ type }) => {
|
|
100
|
+
if (type === "Flat") return -1;
|
|
101
|
+
return 1;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const orderTotal = orderFees.reduce((cur, fee) => {
|
|
105
|
+
return applyOrderFee(cur, fee);
|
|
106
|
+
}, orderSubtotal);
|
|
107
|
+
|
|
108
|
+
return Math.round(orderTotal);
|
|
109
|
+
},
|
|
110
|
+
orderTotalWithRefund(order, fees) {
|
|
111
|
+
return this.orderTotal(order, fees) - (order.refundedAmount || 0);
|
|
112
|
+
},
|
|
113
|
+
orderSubtotal(order) {
|
|
114
|
+
if (!order.tickets) order.tickets = [];
|
|
115
|
+
if (!order.upgrades) order.upgrades = [];
|
|
116
|
+
|
|
117
|
+
const ticketTotal = order.tickets.reduce(
|
|
118
|
+
(cur, ticket) => cur + ticket.price,
|
|
119
|
+
0
|
|
120
|
+
);
|
|
121
|
+
const upgradeTotal = order.upgrades.reduce(
|
|
122
|
+
(cur, upgrade) => cur + upgrade.price,
|
|
123
|
+
0
|
|
124
|
+
);
|
|
125
|
+
return ticketTotal + upgradeTotal;
|
|
126
|
+
},
|
|
127
|
+
orderFee(order, fees) {
|
|
128
|
+
if (!order.tickets) order.tickets = [];
|
|
129
|
+
if (!order.upgrades) order.upgrades = [];
|
|
130
|
+
return this.orderTotal(order, fees) - this.orderSubtotal(order);
|
|
131
|
+
},
|
|
132
|
+
// This one is special because stripe fees
|
|
133
|
+
// can be applied as a percentage
|
|
134
|
+
processingFees(order, fees) {
|
|
135
|
+
if (!order.tickets) order.tickets = [];
|
|
136
|
+
if (!order.upgrades) order.upgrades = [];
|
|
137
|
+
const total = this.orderTotal(order, fees);
|
|
138
|
+
const subtotal = this.orderSubtotal(order);
|
|
139
|
+
const promoterFees = this.promoterFees(order, fees);
|
|
140
|
+
return total - subtotal - promoterFees;
|
|
141
|
+
},
|
|
142
|
+
selloutFees(order, fees) {
|
|
143
|
+
if (!order.tickets) order.tickets = [];
|
|
144
|
+
if (!order.upgrades) order.upgrades = [];
|
|
145
|
+
fees = FeeUtil.selloutFees(fees);
|
|
146
|
+
return this.orderTotal(order, fees) - this.orderSubtotal(order);
|
|
147
|
+
},
|
|
148
|
+
// This one is special because stripe fees
|
|
149
|
+
// can be applied as a percentage
|
|
150
|
+
stripeFees(order, fees) {
|
|
151
|
+
if (!order.tickets) order.tickets = [];
|
|
152
|
+
if (!order.upgrades) order.upgrades = [];
|
|
153
|
+
const total = this.orderTotal(order, fees);
|
|
154
|
+
const subtotal = this.orderSubtotal(order);
|
|
155
|
+
const selloutFees = this.selloutFees(order, fees);
|
|
156
|
+
const promoterFees = this.promoterFees(order, fees);
|
|
157
|
+
return total - subtotal - selloutFees - promoterFees;
|
|
158
|
+
},
|
|
159
|
+
promoterFees(order, fees) {
|
|
160
|
+
if (!order.tickets) order.tickets = [];
|
|
161
|
+
if (!order.upgrades) order.upgrades = [];
|
|
162
|
+
fees = FeeUtil.promoterFees(fees);
|
|
163
|
+
return this.orderFee(order, fees);
|
|
164
|
+
},
|
|
165
|
+
/** **************************************************************************************
|
|
166
|
+
Ticket
|
|
167
|
+
*************************************************************************************** */
|
|
168
|
+
ticketTypeTotal(order, ticketTypeId) {
|
|
169
|
+
return order.tickets
|
|
170
|
+
.filter(t => t.ticketTypeId === ticketTypeId)
|
|
171
|
+
.reduce((cur, next) => cur + next.price, 0);
|
|
172
|
+
},
|
|
173
|
+
ticketCountsByTicketTypeId(order) {
|
|
174
|
+
return order.tickets.reduce((cur, ticket) => {
|
|
175
|
+
if (cur[ticket.ticketTypeId]) cur[ticket.ticketTypeId]++;
|
|
176
|
+
else cur[ticket.ticketTypeId] = 1;
|
|
177
|
+
return cur;
|
|
178
|
+
}, {});
|
|
179
|
+
},
|
|
180
|
+
ticketIsScannable(orderTicket) {
|
|
181
|
+
if (!orderTicket) return false;
|
|
182
|
+
let { scan = {}, refund = {} } = orderTicket;
|
|
183
|
+
|
|
184
|
+
if (scan.scanned && scan.scannedAt > 0) return false;
|
|
185
|
+
if (refund.refunded && refund.refundedAt > 0) return false;
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
seatIsSelected(order, seat) {
|
|
189
|
+
const allSeats = this.allSeats(order);
|
|
190
|
+
return allSeats.includes(seat);
|
|
191
|
+
},
|
|
192
|
+
allSeats(order) {
|
|
193
|
+
return order.tickets
|
|
194
|
+
.filter(ticket => Boolean(ticket.seat))
|
|
195
|
+
.map(ticket => ticket.seat);
|
|
196
|
+
},
|
|
197
|
+
ticketTypeSeats(order, ticketTypeId) {
|
|
198
|
+
return order.tickets
|
|
199
|
+
.filter(ticket => ticket.ticketTypeId === ticketTypeId)
|
|
200
|
+
.filter(ticket => Boolean(ticket.seat))
|
|
201
|
+
.map(ticket => ticket.seat);
|
|
202
|
+
},
|
|
203
|
+
/** **************************************************************************************
|
|
204
|
+
Upgrade
|
|
205
|
+
*************************************************************************************** */
|
|
206
|
+
upgradeTypeTotal(order, upgradeId) {
|
|
207
|
+
return order.upgrades
|
|
208
|
+
.filter(t => t.upgradeId === upgradeId)
|
|
209
|
+
.reduce((cur, next) => cur + next.price, 0);
|
|
210
|
+
},
|
|
211
|
+
upgradeCountsByUpgradeId(order) {
|
|
212
|
+
return order.upgrades.reduce((cur, upgrades) => {
|
|
213
|
+
if (cur[upgrades.upgradeId]) cur[upgrades.upgradeId]++;
|
|
214
|
+
else cur[upgrades.upgradeId] = 1;
|
|
215
|
+
return cur;
|
|
216
|
+
}, {});
|
|
217
|
+
},
|
|
218
|
+
upgradeIsScannable(orderUpgrade) {
|
|
219
|
+
if (!orderUpgrade) return false;
|
|
220
|
+
let { scan = {}, refund = {} } = orderUpgrade;
|
|
221
|
+
|
|
222
|
+
if (scan.scanned && scan.scannedAt > 0) return false;
|
|
223
|
+
if (refund.refunded && refund.refundedAt > 0) return false;
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compileOnSave": true,
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"target": "es6",
|
|
7
|
+
"module": "commonjs",
|
|
8
|
+
"outDir": "./.dist/",
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"sourceMap": true,
|
|
11
|
+
"strictNullChecks": true,
|
|
12
|
+
"noUnusedLocals": true,
|
|
13
|
+
"paths": {},
|
|
14
|
+
"types": [
|
|
15
|
+
"node",
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"typeRoots": [
|
|
19
|
+
"node_modules/@types"
|
|
20
|
+
],
|
|
21
|
+
"include": [
|
|
22
|
+
"./src/**/*.ts"
|
|
23
|
+
],
|
|
24
|
+
"exclude": [
|
|
25
|
+
"node_modules"
|
|
26
|
+
]
|
|
27
|
+
}
|
package/tslint.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "tslint-config-airbnb",
|
|
3
|
+
"rules": {
|
|
4
|
+
"max-line-length": {
|
|
5
|
+
"options": [120]
|
|
6
|
+
},
|
|
7
|
+
"no-console": false,
|
|
8
|
+
"ban": [
|
|
9
|
+
true,
|
|
10
|
+
{
|
|
11
|
+
"name": ["Math", "random"],
|
|
12
|
+
"message": "Use a better RNG, perhaps UUID?"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"jsRules": {
|
|
17
|
+
"max-line-length": {
|
|
18
|
+
"options": [120]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|