shufflecom-calculations 1.12.18 → 1.12.21
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/lib/games/dice.js +1 -1
- package/lib/games/dice.js.map +1 -1
- package/lib/games/hilo.js +2 -2
- package/lib/games/hilo.js.map +1 -1
- package/lib/games/mines.js +1 -1
- package/lib/games/mines.js.map +1 -1
- package/lib/games/tower.js +1 -1
- package/lib/games/tower.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utils/derive-vip-bonus.js +7 -9
- package/lib/utils/derive-vip-bonus.js.map +1 -1
- package/lib/utils/validate-cashout-avaliable.d.ts +3 -7
- package/lib/utils/validate-cashout-avaliable.js +36 -37
- package/lib/utils/validate-cashout-avaliable.js.map +1 -1
- package/lib/utils/vip-bonus.type.d.ts +2 -1
- package/lib/utils/vip-bonus.type.js.map +1 -1
- package/package.json +2 -2
- package/src/games/dice.ts +1 -1
- package/src/games/hilo.ts +2 -3
- package/src/games/mines.ts +1 -1
- package/src/games/tower.ts +1 -2
- package/src/utils/derive-vip-bonus.spec.ts +221 -117
- package/src/utils/derive-vip-bonus.ts +26 -14
- package/src/utils/validate-cashout-avaliable.ts +50 -46
- package/src/utils/vip-bonus.type.ts +2 -1
|
@@ -22,49 +22,57 @@ export enum SportsCashoutFailedReason {
|
|
|
22
22
|
SPORTS_MARKET_CASHOUT_NOT_ENABLED = 'SPORTS_MARKET_CASHOUT_NOT_ENABLED',
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
class SportsCashoutError extends Error {
|
|
26
|
+
sportsBetSelection?: SportsBetSelectionInterface;
|
|
27
|
+
market?: SportsMarketInterface;
|
|
28
|
+
marketSelection?: SportsMarketSelectionInterface;
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
reason: SportsCashoutFailedReason,
|
|
32
|
+
{
|
|
33
|
+
sportsBetSelection,
|
|
34
|
+
market,
|
|
35
|
+
marketSelection,
|
|
36
|
+
}: {
|
|
33
37
|
sportsBetSelection?: SportsBetSelectionInterface;
|
|
34
38
|
market?: SportsMarketInterface;
|
|
35
39
|
marketSelection?: SportsMarketSelectionInterface;
|
|
36
|
-
}
|
|
37
|
-
|
|
40
|
+
} = {},
|
|
41
|
+
) {
|
|
42
|
+
super(reason);
|
|
43
|
+
|
|
44
|
+
// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#example
|
|
45
|
+
Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain
|
|
46
|
+
|
|
47
|
+
this.sportsBetSelection = sportsBetSelection;
|
|
48
|
+
this.market = market;
|
|
49
|
+
this.marketSelection = marketSelection;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function validateSportsBetCashoutAvailable(sportsBet: SportsBetInterface, sportsBetSelections: SportsBetSelectionInterface[]) {
|
|
38
54
|
if (SportsBetStatus.PENDING !== sportsBet.status) {
|
|
39
|
-
|
|
40
|
-
reason: SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED,
|
|
41
|
-
};
|
|
55
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED);
|
|
42
56
|
}
|
|
43
57
|
|
|
44
58
|
const containsLostBetSelection = sportsBetSelections.find(({ status }) => status === SportsBetSelectionStatus.LOST);
|
|
45
59
|
|
|
46
60
|
if (containsLostBetSelection) {
|
|
47
|
-
|
|
48
|
-
reason: SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED,
|
|
49
|
-
sportsBetSelection: containsLostBetSelection,
|
|
50
|
-
};
|
|
61
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_BET_IS_CLOSED, { sportsBetSelection: containsLostBetSelection });
|
|
51
62
|
}
|
|
63
|
+
}
|
|
52
64
|
|
|
65
|
+
export function validateSportsMarketsCashoutAvailable(markets: SportsMarketInterface[], marketSelections: SportsMarketSelectionInterface[]) {
|
|
53
66
|
const containsManualMarketSelection = marketSelections.find(({ provider }) => provider === SportsMarketProvider.SHUFFLE);
|
|
54
67
|
|
|
55
68
|
if (containsManualMarketSelection) {
|
|
56
|
-
|
|
57
|
-
reason: SportsCashoutFailedReason.MANUAL_MARKET_NOT_ALLOWED_CASHOUT,
|
|
58
|
-
marketSelection: containsManualMarketSelection,
|
|
59
|
-
};
|
|
69
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.MANUAL_MARKET_NOT_ALLOWED_CASHOUT, { marketSelection: containsManualMarketSelection });
|
|
60
70
|
}
|
|
61
71
|
|
|
62
72
|
const atLeastOneTrading = marketSelections.some(({ status }) => status === SportsMarketSelectionStatus.TRADING);
|
|
63
73
|
|
|
64
74
|
if (!atLeastOneTrading) {
|
|
65
|
-
|
|
66
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
|
|
67
|
-
};
|
|
75
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN);
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
const containsUnavailableMarketSelection = marketSelections.find(marketSelection => {
|
|
@@ -78,10 +86,10 @@ function checkCashoutAvailable(
|
|
|
78
86
|
});
|
|
79
87
|
|
|
80
88
|
if (containsUnavailableMarketSelection) {
|
|
81
|
-
|
|
82
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
|
|
89
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN, {
|
|
83
90
|
marketSelection: containsUnavailableMarketSelection,
|
|
84
|
-
|
|
91
|
+
market: markets.find(market => market.id === containsUnavailableMarketSelection.marketId),
|
|
92
|
+
});
|
|
85
93
|
}
|
|
86
94
|
|
|
87
95
|
for (const marketSelection of marketSelections) {
|
|
@@ -90,32 +98,20 @@ function checkCashoutAvailable(
|
|
|
90
98
|
const market = markets.find(market => market.id === marketSelection.marketId);
|
|
91
99
|
|
|
92
100
|
if (!market) {
|
|
93
|
-
|
|
94
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_NOT_FOUND,
|
|
95
|
-
market,
|
|
96
|
-
};
|
|
101
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_NOT_FOUND, { market });
|
|
97
102
|
}
|
|
98
103
|
|
|
99
104
|
if (!market.inPlay && dayjs().isAfter(market.expiryTime)) {
|
|
100
|
-
|
|
101
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_CLOSED,
|
|
102
|
-
market,
|
|
103
|
-
};
|
|
105
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CLOSED, { market });
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
if (market.inPlay) {
|
|
107
109
|
if (!market.cashoutEnabled) {
|
|
108
|
-
|
|
109
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_NOT_ENABLED,
|
|
110
|
-
market,
|
|
111
|
-
};
|
|
110
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_NOT_ENABLED, { market });
|
|
112
111
|
}
|
|
113
112
|
|
|
114
113
|
if (market.cashoutStatus !== SportsMarketCashoutStatus.OPEN) {
|
|
115
|
-
|
|
116
|
-
reason: SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN,
|
|
117
|
-
market,
|
|
118
|
-
};
|
|
114
|
+
throw new SportsCashoutError(SportsCashoutFailedReason.SPORTS_MARKET_CASHOUT_IS_NOT_OPEN, { market });
|
|
119
115
|
}
|
|
120
116
|
}
|
|
121
117
|
}
|
|
@@ -134,10 +130,18 @@ export function isCashoutAvailable({
|
|
|
134
130
|
markets: SportsMarketInterface[];
|
|
135
131
|
marketSelections: SportsMarketSelectionInterface[];
|
|
136
132
|
}) {
|
|
137
|
-
|
|
133
|
+
try {
|
|
134
|
+
validateSportsBetCashoutAvailable(sportsBet, sportsBetSelections);
|
|
135
|
+
validateSportsMarketsCashoutAvailable(markets, marketSelections);
|
|
136
|
+
} catch (error: any) {
|
|
137
|
+
return {
|
|
138
|
+
canCashout: false,
|
|
139
|
+
reason: error.message,
|
|
140
|
+
...error,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
138
143
|
|
|
139
144
|
return {
|
|
140
|
-
canCashout:
|
|
141
|
-
...cashoutAvailableState,
|
|
145
|
+
canCashout: true,
|
|
142
146
|
};
|
|
143
147
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export interface VipBonusIssuanceModel {
|
|
2
2
|
currency?: string | null;
|
|
3
|
-
bonusAmountUsd: string;
|
|
4
3
|
occurrenceIndex: number;
|
|
4
|
+
amount?: string | null;
|
|
5
|
+
bonusAmountUsd?: string | null; // derived field
|
|
5
6
|
createdAt?: string; // derived field
|
|
6
7
|
expiryDate?: string; // derived field
|
|
7
8
|
availableDate?: string; // derived field
|