shufflecom-calculations 5.1.0 → 5.1.2
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/sports/sports-content-home-page.types.d.ts +9 -1
- package/lib/sports/sports-content-home-page.types.js +4 -1
- package/lib/sports/sports-content-home-page.types.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utils/derive-vip-bonus.js +4 -3
- package/lib/utils/derive-vip-bonus.js.map +1 -1
- package/lib/utils/parse-create-vip-bonus.d.ts +6 -0
- package/lib/utils/parse-create-vip-bonus.js +16 -2
- package/lib/utils/parse-create-vip-bonus.js.map +1 -1
- package/lib/utils/vip-bonus.type.d.ts +4 -1
- package/lib/utils/vip-bonus.type.js +5 -1
- package/lib/utils/vip-bonus.type.js.map +1 -1
- package/package.json +2 -2
- package/src/sports/sports-content-home-page.types.ts +12 -1
- package/src/utils/derive-vip-bonus.spec.ts +33 -2
- package/src/utils/derive-vip-bonus.ts +17 -17
- package/src/utils/parse-create-vip-bonus.spec.ts +36 -1
- package/src/utils/parse-create-vip-bonus.ts +23 -2
- package/src/utils/vip-bonus.type.ts +5 -0
|
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.updateBonusIssuanceStatus = exports.deriveBonusIssuances = exports.getReloadExpiryDate = exports.getReloadAvailableDate = void 0;
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
7
8
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
9
|
const isSameOrAfter_1 = __importDefault(require("dayjs/plugin/isSameOrAfter"));
|
|
9
10
|
const minMax_1 = __importDefault(require("dayjs/plugin/minMax"));
|
|
10
11
|
const lodash_1 = require("lodash");
|
|
11
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
12
12
|
const vip_bonus_type_1 = require("./vip-bonus.type");
|
|
13
13
|
dayjs_1.default.extend(isSameOrAfter_1.default);
|
|
14
14
|
dayjs_1.default.extend(minMax_1.default);
|
|
@@ -48,13 +48,14 @@ function deriveBonusIssuances(vipBonus, now = (0, dayjs_1.default)()) {
|
|
|
48
48
|
else if (now.isSameOrAfter(maxBonusActivationTime)) {
|
|
49
49
|
activationTime = maxBonusActivationTime;
|
|
50
50
|
}
|
|
51
|
+
const isReload = (0, vip_bonus_type_1.isReloadVipBonusType)(vipBonus.type);
|
|
51
52
|
return (0, lodash_1.range)(1, vipBonus.occurrence + 1).map(occurrenceIndex => {
|
|
52
53
|
var _a, _b, _c, _d;
|
|
53
54
|
const claim = claims === null || claims === void 0 ? void 0 : claims.find(claim => claim.occurrenceIndex == occurrenceIndex);
|
|
54
|
-
const expiryDate =
|
|
55
|
+
const expiryDate = isReload
|
|
55
56
|
? (_c = getReloadExpiryDate(activationTime, vipBonus.cadence, (_a = vipBonus.expiryPerOccurrence) !== null && _a !== void 0 ? _a : 0, occurrenceIndex, bonusCreatedAt, (_b = vipBonus.firstOccurrenceActivationPeriod) !== null && _b !== void 0 ? _b : 0)) === null || _c === void 0 ? void 0 : _c.toISOString()
|
|
56
57
|
: vipBonus.endAt;
|
|
57
|
-
const availableDate =
|
|
58
|
+
const availableDate = isReload
|
|
58
59
|
? (_d = getReloadAvailableDate(activationTime, vipBonus.cadence, occurrenceIndex, bonusCreatedAt)) === null || _d === void 0 ? void 0 : _d.toISOString()
|
|
59
60
|
: vipBonus.createdAt;
|
|
60
61
|
return updateBonusIssuanceStatus({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-vip-bonus.js","sourceRoot":"","sources":["../../src/utils/derive-vip-bonus.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"derive-vip-bonus.js","sourceRoot":"","sources":["../../src/utils/derive-vip-bonus.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,12 @@ export interface BaseCreateVipBonusInput {
|
|
|
9
9
|
expiryDate?: Date;
|
|
10
10
|
}
|
|
11
11
|
export declare const VALID_RELOAD_VIP_BONUS_CADENCE: number[];
|
|
12
|
+
export declare const AUTOMATED_RELOAD_SCHEDULE: {
|
|
13
|
+
cadence: number;
|
|
14
|
+
occurrence: number;
|
|
15
|
+
firstOccurrenceActivationPeriod: number;
|
|
16
|
+
expiryPerOccurrence: number;
|
|
17
|
+
};
|
|
12
18
|
export declare const MIN_RELOAD_VIP_BONUS_OCCURRENCE = 3;
|
|
13
19
|
export declare const MAX_RELOAD_VIP_BONUS_OCCURRENCE = 5000;
|
|
14
20
|
type ParsedVipBonusData = {
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseCreateVipBonusBaseInput = exports.MAX_RELOAD_VIP_BONUS_OCCURRENCE = exports.MIN_RELOAD_VIP_BONUS_OCCURRENCE = exports.VALID_RELOAD_VIP_BONUS_CADENCE = void 0;
|
|
3
|
+
exports.parseCreateVipBonusBaseInput = exports.MAX_RELOAD_VIP_BONUS_OCCURRENCE = exports.MIN_RELOAD_VIP_BONUS_OCCURRENCE = exports.AUTOMATED_RELOAD_SCHEDULE = exports.VALID_RELOAD_VIP_BONUS_CADENCE = void 0;
|
|
4
4
|
const vip_bonus_type_1 = require("./vip-bonus.type");
|
|
5
5
|
const minuteInSeconds = (min) => min * 60;
|
|
6
6
|
const hourInSeconds = (hour) => minuteInSeconds(hour * 60);
|
|
7
7
|
const dayInSeconds = (day) => hourInSeconds(day * 24);
|
|
8
8
|
exports.VALID_RELOAD_VIP_BONUS_CADENCE = [minuteInSeconds(10), hourInSeconds(1), hourInSeconds(8), dayInSeconds(1)];
|
|
9
|
+
exports.AUTOMATED_RELOAD_SCHEDULE = {
|
|
10
|
+
cadence: hourInSeconds(8),
|
|
11
|
+
occurrence: 21,
|
|
12
|
+
firstOccurrenceActivationPeriod: 0,
|
|
13
|
+
expiryPerOccurrence: dayInSeconds(1),
|
|
14
|
+
};
|
|
9
15
|
exports.MIN_RELOAD_VIP_BONUS_OCCURRENCE = 3;
|
|
10
16
|
exports.MAX_RELOAD_VIP_BONUS_OCCURRENCE = 5000;
|
|
11
17
|
function parseCreateVipBonusBaseInput({ date, bonus }) {
|
|
12
|
-
if (bonus.type === vip_bonus_type_1.VipBonusType.
|
|
18
|
+
if (bonus.type === vip_bonus_type_1.VipBonusType.AUTOMATED_RELOAD) {
|
|
19
|
+
const { cadence, occurrence, firstOccurrenceActivationPeriod, expiryPerOccurrence } = exports.AUTOMATED_RELOAD_SCHEDULE;
|
|
20
|
+
return Object.assign(Object.assign({}, exports.AUTOMATED_RELOAD_SCHEDULE), { endAt: date
|
|
21
|
+
.add(firstOccurrenceActivationPeriod, 'hour')
|
|
22
|
+
.add(cadence * (occurrence - 1), 'second')
|
|
23
|
+
.add(expiryPerOccurrence, 'second')
|
|
24
|
+
.toDate() });
|
|
25
|
+
}
|
|
26
|
+
if ((0, vip_bonus_type_1.isReloadVipBonusType)(bonus.type)) {
|
|
13
27
|
const { cadence, occurrence, firstOccurrenceActivationPeriod, expiryPerOccurrence } = bonus;
|
|
14
28
|
if (!cadence || !exports.VALID_RELOAD_VIP_BONUS_CADENCE.includes(cadence)) {
|
|
15
29
|
throw new Error(`Vip Bonus (Reloaded) cadence must be oneOf ${exports.VALID_RELOAD_VIP_BONUS_CADENCE.join(', ')} seconds`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-create-vip-bonus.js","sourceRoot":"","sources":["../../src/utils/parse-create-vip-bonus.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"parse-create-vip-bonus.js","sourceRoot":"","sources":["../../src/utils/parse-create-vip-bonus.ts"],"names":[],"mappings":";;;AACA,qDAAsE;AAWtE,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;AAClD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACnE,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AAEjD,QAAA,8BAA8B,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5G,QAAA,yBAAyB,GAAG;IACvC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACzB,UAAU,EAAE,EAAE;IACd,+BAA+B,EAAE,CAAC;IAClC,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAC;CACrC,CAAC;AACW,QAAA,+BAA+B,GAAG,CAAC,CAAC;AAEpC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAUpD,SAAgB,4BAA4B,CAAC,EAAE,IAAI,EAAE,KAAK,EAAyD;IAEjH,IAAI,KAAK,CAAC,IAAI,KAAK,6BAAY,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,GAAG,iCAAyB,CAAC;QAEhH,uCACK,iCAAyB,KAC5B,KAAK,EAAE,IAAI;iBACR,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC;iBAC5C,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;iBACzC,GAAG,CAAC,mBAAmB,EAAE,QAAQ,CAAC;iBAClC,MAAM,EAAE,IACX;IACJ,CAAC;IAED,IAAI,IAAA,qCAAoB,EAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,GAAG,KAAK,CAAC;QAE5F,IAAI,CAAC,OAAO,IAAI,CAAC,sCAA8B,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,8CAA8C,sCAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrH,CAAC;QAED,IAAI,CAAC,UAAU,IAAI,UAAU,GAAG,uCAA+B,IAAI,UAAU,GAAG,uCAA+B,EAAE,CAAC;YAChH,MAAM,IAAI,KAAK,CAAC,8CAA8C,uCAA+B,WAAW,uCAA+B,EAAE,CAAC,CAAC;QAC7I,CAAC;QAED,IAAI,+BAA+B,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,OAAO,GAAG,mBAAmB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,KAAK,GAAG,IAAI;aACf,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC;aAC5C,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;aACzC,GAAG,CAAC,mBAAmB,EAAE,QAAQ,CAAC;aAClC,MAAM,EAAE,CAAC;QAEZ,OAAO;YACL,OAAO;YACP,UAAU;YACV,+BAA+B;YAC/B,mBAAmB;YACnB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,CAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,CAAC;QACb,+BAA+B,EAAE,CAAC;QAClC,mBAAmB,EAAE,CAAC;QACtB,KAAK,EAAE,KAAK,CAAC,UAAU;KACxB,CAAC;AACJ,CAAC;AAhED,oEAgEC"}
|
|
@@ -30,5 +30,8 @@ export declare enum VipBonusIssuanceStatus {
|
|
|
30
30
|
}
|
|
31
31
|
export declare enum VipBonusType {
|
|
32
32
|
SINGLE = "SINGLE",
|
|
33
|
-
RELOADED = "RELOADED"
|
|
33
|
+
RELOADED = "RELOADED",
|
|
34
|
+
AUTOMATED_RELOAD = "AUTOMATED_RELOAD"
|
|
34
35
|
}
|
|
36
|
+
export declare const RELOAD_VIP_BONUS_TYPES: VipBonusType[];
|
|
37
|
+
export declare const isReloadVipBonusType: (type: VipBonusType) => boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.VipBonusType = exports.VipBonusIssuanceStatus = void 0;
|
|
3
|
+
exports.isReloadVipBonusType = exports.RELOAD_VIP_BONUS_TYPES = exports.VipBonusType = exports.VipBonusIssuanceStatus = void 0;
|
|
4
4
|
var VipBonusIssuanceStatus;
|
|
5
5
|
(function (VipBonusIssuanceStatus) {
|
|
6
6
|
VipBonusIssuanceStatus["SCHEDULED"] = "SCHEDULED";
|
|
@@ -13,5 +13,9 @@ var VipBonusType;
|
|
|
13
13
|
(function (VipBonusType) {
|
|
14
14
|
VipBonusType["SINGLE"] = "SINGLE";
|
|
15
15
|
VipBonusType["RELOADED"] = "RELOADED";
|
|
16
|
+
VipBonusType["AUTOMATED_RELOAD"] = "AUTOMATED_RELOAD";
|
|
16
17
|
})(VipBonusType || (exports.VipBonusType = VipBonusType = {}));
|
|
18
|
+
exports.RELOAD_VIP_BONUS_TYPES = [VipBonusType.RELOADED, VipBonusType.AUTOMATED_RELOAD];
|
|
19
|
+
const isReloadVipBonusType = (type) => exports.RELOAD_VIP_BONUS_TYPES.includes(type);
|
|
20
|
+
exports.isReloadVipBonusType = isReloadVipBonusType;
|
|
17
21
|
//# sourceMappingURL=vip-bonus.type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vip-bonus.type.js","sourceRoot":"","sources":["../../src/utils/vip-bonus.type.ts"],"names":[],"mappings":";;;AAyBA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,iDAAuB,CAAA;IACvB,yDAA+B,CAAA;IAC/B,6CAAmB,CAAA;IACnB,iDAAuB,CAAA;IACvB,6CAAmB,CAAA;AACrB,CAAC,EANW,sBAAsB,sCAAtB,sBAAsB,QAMjC;AAED,IAAY,
|
|
1
|
+
{"version":3,"file":"vip-bonus.type.js","sourceRoot":"","sources":["../../src/utils/vip-bonus.type.ts"],"names":[],"mappings":";;;AAyBA,IAAY,sBAMX;AAND,WAAY,sBAAsB;IAChC,iDAAuB,CAAA;IACvB,yDAA+B,CAAA;IAC/B,6CAAmB,CAAA;IACnB,iDAAuB,CAAA;IACvB,6CAAmB,CAAA;AACrB,CAAC,EANW,sBAAsB,sCAAtB,sBAAsB,QAMjC;AAED,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,qCAAqB,CAAA;IACrB,qDAAqC,CAAA;AACvC,CAAC,EAJW,YAAY,4BAAZ,YAAY,QAIvB;AAEY,QAAA,sBAAsB,GAAmB,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAEtG,MAAM,oBAAoB,GAAG,CAAC,IAAkB,EAAW,EAAE,CAAC,8BAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAA9F,QAAA,oBAAoB,wBAA0E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shufflecom-calculations",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"types": "lib/index.d.ts",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -16,5 +16,5 @@
|
|
|
16
16
|
},
|
|
17
17
|
"author": "",
|
|
18
18
|
"license": "ISC",
|
|
19
|
-
"gitHead": "
|
|
19
|
+
"gitHead": "b82b7e49df6e48db5e47a55087866c4b0ee26bb2"
|
|
20
20
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PrebuildBetFeaturedPrebuilds } from './prebuild-bet.types';
|
|
2
2
|
import { PopularSportsCompetitionsV2Info } from './sports-competition-fixture.types';
|
|
3
3
|
import { SportsContentFeaturedEvents, SportsContentFeaturedOutright } from './sports-content-fixture.types';
|
|
4
|
-
import { PaginatedSportsBoostedSelectionsInfo } from './sports-selection.types';
|
|
4
|
+
import { PaginatedSportsBoostedSelectionsInfo, SportsCustomBoostMarketSelectionType } from './sports-selection.types';
|
|
5
5
|
import { Nullable, SportsContentType } from './sports.types';
|
|
6
6
|
|
|
7
7
|
export class SportsContentWeight {
|
|
@@ -9,6 +9,7 @@ export class SportsContentWeight {
|
|
|
9
9
|
weight: number;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
/** @deprecated Use v2 */
|
|
12
13
|
export class SportsContentHomePage {
|
|
13
14
|
featuredEvents: Nullable<SportsContentFeaturedEvents>;
|
|
14
15
|
featuredOutright: Nullable<SportsContentFeaturedOutright>;
|
|
@@ -18,3 +19,13 @@ export class SportsContentHomePage {
|
|
|
18
19
|
/** Enabled content types with their weights, ordered by weight DESC. */
|
|
19
20
|
weights: SportsContentWeight[];
|
|
20
21
|
}
|
|
22
|
+
|
|
23
|
+
export class SportsContentHomePageV2 {
|
|
24
|
+
featuredEvents: Nullable<SportsContentFeaturedEvents>;
|
|
25
|
+
featuredOutright: Nullable<SportsContentFeaturedOutright>;
|
|
26
|
+
popularCompetitions: Nullable<PopularSportsCompetitionsV2Info>;
|
|
27
|
+
featuredPrebuilds: Nullable<PrebuildBetFeaturedPrebuilds>;
|
|
28
|
+
sportsCustomBoosts: Nullable<SportsCustomBoostMarketSelectionType[]>;
|
|
29
|
+
/** Enabled content types with their weights, ordered by weight DESC. */
|
|
30
|
+
weights: SportsContentWeight[];
|
|
31
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
1
2
|
import dayjs, { Dayjs } from 'dayjs';
|
|
2
3
|
import { range } from 'lodash';
|
|
3
4
|
import { v4 as uuidv4 } from 'uuid';
|
|
4
5
|
import { mockdatetime } from '../../../../test/utils/mockdatetime';
|
|
6
|
+
import { Currency } from './currency';
|
|
5
7
|
import { deriveBonusIssuances, getReloadAvailableDate, getReloadExpiryDate, updateBonusIssuanceStatus } from './derive-vip-bonus';
|
|
6
8
|
import { VipBonusIssuanceModel, VipBonusIssuanceStatus, VipBonusPartial, VipBonusType } from './vip-bonus.type';
|
|
7
|
-
import { Currency } from './currency';
|
|
8
|
-
import BigNumber from 'bignumber.js';
|
|
9
9
|
|
|
10
10
|
describe('VipBonusUtils', () => {
|
|
11
11
|
afterEach(() => {
|
|
@@ -580,4 +580,35 @@ describe('VipBonusUtils', () => {
|
|
|
580
580
|
}
|
|
581
581
|
});
|
|
582
582
|
});
|
|
583
|
+
|
|
584
|
+
it('schedules AUTOMATED_RELOAD per occurrence, the same as RELOADED', () => {
|
|
585
|
+
const startDate = dayjs('2026-01-01T00:00:00.000Z');
|
|
586
|
+
const cadence = 8 * 60 * 60;
|
|
587
|
+
const expiryPerOccurrence = 24 * 60 * 60;
|
|
588
|
+
const occurrence = 21;
|
|
589
|
+
|
|
590
|
+
const vipBonus: VipBonusPartial = {
|
|
591
|
+
type: VipBonusType.AUTOMATED_RELOAD,
|
|
592
|
+
currency: null,
|
|
593
|
+
bonusAmountUsd: '210',
|
|
594
|
+
cadence,
|
|
595
|
+
occurrence,
|
|
596
|
+
cancelledAt: null,
|
|
597
|
+
createdAt: startDate.toISOString(),
|
|
598
|
+
endAt: startDate.add(cadence * (occurrence - 1) + expiryPerOccurrence, 'seconds').toISOString(),
|
|
599
|
+
bonusClaims: [],
|
|
600
|
+
firstOccurrenceActivationPeriod: 0,
|
|
601
|
+
expiryPerOccurrence,
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
mockdatetime(startDate.toDate());
|
|
605
|
+
const issuances = deriveBonusIssuances(vipBonus);
|
|
606
|
+
|
|
607
|
+
// treated as SINGLE, every occurrence would share the bonus endAt and be available immediately
|
|
608
|
+
expect(issuances[1].availableDate).toEqual(startDate.add(cadence, 'seconds').toISOString());
|
|
609
|
+
expect(issuances[1].expiryDate).toEqual(startDate.add(cadence + expiryPerOccurrence, 'seconds').toISOString());
|
|
610
|
+
expect(issuances[1].status).toEqual(VipBonusIssuanceStatus.SCHEDULED);
|
|
611
|
+
|
|
612
|
+
expect(issuances[0].status).toEqual(VipBonusIssuanceStatus.PENDING_CLAIM);
|
|
613
|
+
});
|
|
583
614
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
1
2
|
import { Dayjs } from 'dayjs';
|
|
2
3
|
import dayjs from 'dayjs';
|
|
3
4
|
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
|
|
4
5
|
import minMax from 'dayjs/plugin/minMax';
|
|
5
6
|
import { range } from 'lodash';
|
|
6
|
-
import
|
|
7
|
-
import { VipBonusIssuanceModel, VipBonusIssuanceStatus, VipBonusPartial, VipBonusType } from './vip-bonus.type';
|
|
7
|
+
import { VipBonusIssuanceModel, VipBonusIssuanceStatus, VipBonusPartial, isReloadVipBonusType } from './vip-bonus.type';
|
|
8
8
|
|
|
9
9
|
dayjs.extend(isSameOrAfter);
|
|
10
10
|
dayjs.extend(minMax);
|
|
@@ -58,23 +58,23 @@ export function deriveBonusIssuances(vipBonus: VipBonusPartial, now = dayjs()) {
|
|
|
58
58
|
activationTime = maxBonusActivationTime;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
const isReload = isReloadVipBonusType(vipBonus.type);
|
|
62
|
+
|
|
61
63
|
return range(1, vipBonus.occurrence + 1).map(occurrenceIndex => {
|
|
62
64
|
const claim = claims?.find(claim => claim.occurrenceIndex == occurrenceIndex);
|
|
63
|
-
const expiryDate =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
vipBonus.
|
|
76
|
-
? getReloadAvailableDate(activationTime, vipBonus.cadence!, occurrenceIndex, bonusCreatedAt)?.toISOString()
|
|
77
|
-
: vipBonus.createdAt;
|
|
65
|
+
const expiryDate = isReload
|
|
66
|
+
? getReloadExpiryDate(
|
|
67
|
+
activationTime,
|
|
68
|
+
vipBonus.cadence!,
|
|
69
|
+
vipBonus.expiryPerOccurrence ?? 0,
|
|
70
|
+
occurrenceIndex,
|
|
71
|
+
bonusCreatedAt,
|
|
72
|
+
vipBonus.firstOccurrenceActivationPeriod ?? 0,
|
|
73
|
+
)?.toISOString()
|
|
74
|
+
: vipBonus.endAt;
|
|
75
|
+
const availableDate = isReload
|
|
76
|
+
? getReloadAvailableDate(activationTime, vipBonus.cadence!, occurrenceIndex, bonusCreatedAt)?.toISOString()
|
|
77
|
+
: vipBonus.createdAt;
|
|
78
78
|
return updateBonusIssuanceStatus(
|
|
79
79
|
{
|
|
80
80
|
currency,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import dayjs from 'dayjs';
|
|
2
2
|
import {
|
|
3
|
+
AUTOMATED_RELOAD_SCHEDULE,
|
|
3
4
|
BaseCreateVipBonusInput,
|
|
4
5
|
MAX_RELOAD_VIP_BONUS_OCCURRENCE,
|
|
5
6
|
MIN_RELOAD_VIP_BONUS_OCCURRENCE,
|
|
6
|
-
parseCreateVipBonusBaseInput,
|
|
7
7
|
VALID_RELOAD_VIP_BONUS_CADENCE,
|
|
8
|
+
parseCreateVipBonusBaseInput,
|
|
8
9
|
} from './parse-create-vip-bonus';
|
|
9
10
|
import { VipBonusType } from './vip-bonus.type';
|
|
10
11
|
|
|
@@ -136,6 +137,40 @@ describe('parseCreateVipBonusBaseInput', () => {
|
|
|
136
137
|
});
|
|
137
138
|
});
|
|
138
139
|
|
|
140
|
+
describe('AUTOMATED_RELOAD', () => {
|
|
141
|
+
it('applies the fixed schedule and ignores whatever the caller passed', () => {
|
|
142
|
+
const result = parseCreateVipBonusBaseInput({
|
|
143
|
+
date,
|
|
144
|
+
bonus: {
|
|
145
|
+
type: VipBonusType.AUTOMATED_RELOAD,
|
|
146
|
+
// deliberately wrong: the admin does not get to choose these
|
|
147
|
+
cadence: VALID_RELOAD_VIP_BONUS_CADENCE[0],
|
|
148
|
+
occurrence: MIN_RELOAD_VIP_BONUS_OCCURRENCE,
|
|
149
|
+
firstOccurrenceActivationPeriod: 99,
|
|
150
|
+
expiryPerOccurrence: 1,
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(result).toEqual({
|
|
155
|
+
...AUTOMATED_RELOAD_SCHEDULE,
|
|
156
|
+
endAt: date
|
|
157
|
+
.add(AUTOMATED_RELOAD_SCHEDULE.firstOccurrenceActivationPeriod, 'hour')
|
|
158
|
+
.add(AUTOMATED_RELOAD_SCHEDULE.cadence * (AUTOMATED_RELOAD_SCHEDULE.occurrence - 1), 'second')
|
|
159
|
+
.add(AUTOMATED_RELOAD_SCHEDULE.expiryPerOccurrence, 'second')
|
|
160
|
+
.toDate(),
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('needs no schedule fields at all', () => {
|
|
165
|
+
expect(() => parseCreateVipBonusBaseInput({ date, bonus: { type: VipBonusType.AUTOMATED_RELOAD } })).not.toThrow();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it('keeps a cadence the reloaded validator would also accept', () => {
|
|
169
|
+
expect(VALID_RELOAD_VIP_BONUS_CADENCE).toContain(AUTOMATED_RELOAD_SCHEDULE.cadence);
|
|
170
|
+
expect(AUTOMATED_RELOAD_SCHEDULE.expiryPerOccurrence).toBeGreaterThanOrEqual(AUTOMATED_RELOAD_SCHEDULE.cadence);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
139
174
|
describe('SINGLE', () => {
|
|
140
175
|
it('should return parsed data using expiryDate as endAt for a future expiry', () => {
|
|
141
176
|
const expiryDate = date.add(7, 'day').toDate();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import dayjs from 'dayjs';
|
|
2
|
-
import { VipBonusType } from './vip-bonus.type';
|
|
2
|
+
import { VipBonusType, isReloadVipBonusType } from './vip-bonus.type';
|
|
3
3
|
|
|
4
4
|
export interface BaseCreateVipBonusInput {
|
|
5
5
|
type: VipBonusType;
|
|
@@ -15,6 +15,13 @@ const hourInSeconds = (hour: number) => minuteInSeconds(hour * 60);
|
|
|
15
15
|
const dayInSeconds = (day: number) => hourInSeconds(day * 24);
|
|
16
16
|
|
|
17
17
|
export const VALID_RELOAD_VIP_BONUS_CADENCE = [minuteInSeconds(10), hourInSeconds(1), hourInSeconds(8), dayInSeconds(1)];
|
|
18
|
+
|
|
19
|
+
export const AUTOMATED_RELOAD_SCHEDULE = {
|
|
20
|
+
cadence: hourInSeconds(8),
|
|
21
|
+
occurrence: 21,
|
|
22
|
+
firstOccurrenceActivationPeriod: 0,
|
|
23
|
+
expiryPerOccurrence: dayInSeconds(1),
|
|
24
|
+
};
|
|
18
25
|
export const MIN_RELOAD_VIP_BONUS_OCCURRENCE = 3;
|
|
19
26
|
// max occurance 5000 if set to high might cause slow performance in the frontend when handling each reload bonus occurance state
|
|
20
27
|
export const MAX_RELOAD_VIP_BONUS_OCCURRENCE = 5000;
|
|
@@ -28,7 +35,21 @@ type ParsedVipBonusData = {
|
|
|
28
35
|
};
|
|
29
36
|
|
|
30
37
|
export function parseCreateVipBonusBaseInput({ date, bonus }: { date: dayjs.Dayjs; bonus: BaseCreateVipBonusInput }): ParsedVipBonusData {
|
|
31
|
-
|
|
38
|
+
// Whatever the caller passed for the schedule is ignored — these are not the admin's to choose.
|
|
39
|
+
if (bonus.type === VipBonusType.AUTOMATED_RELOAD) {
|
|
40
|
+
const { cadence, occurrence, firstOccurrenceActivationPeriod, expiryPerOccurrence } = AUTOMATED_RELOAD_SCHEDULE;
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
...AUTOMATED_RELOAD_SCHEDULE,
|
|
44
|
+
endAt: date
|
|
45
|
+
.add(firstOccurrenceActivationPeriod, 'hour')
|
|
46
|
+
.add(cadence * (occurrence - 1), 'second')
|
|
47
|
+
.add(expiryPerOccurrence, 'second')
|
|
48
|
+
.toDate(),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (isReloadVipBonusType(bonus.type)) {
|
|
32
53
|
const { cadence, occurrence, firstOccurrenceActivationPeriod, expiryPerOccurrence } = bonus;
|
|
33
54
|
|
|
34
55
|
if (!cadence || !VALID_RELOAD_VIP_BONUS_CADENCE.includes(cadence)) {
|
|
@@ -34,4 +34,9 @@ export enum VipBonusIssuanceStatus {
|
|
|
34
34
|
export enum VipBonusType {
|
|
35
35
|
SINGLE = 'SINGLE',
|
|
36
36
|
RELOADED = 'RELOADED',
|
|
37
|
+
AUTOMATED_RELOAD = 'AUTOMATED_RELOAD',
|
|
37
38
|
}
|
|
39
|
+
|
|
40
|
+
export const RELOAD_VIP_BONUS_TYPES: VipBonusType[] = [VipBonusType.RELOADED, VipBonusType.AUTOMATED_RELOAD];
|
|
41
|
+
|
|
42
|
+
export const isReloadVipBonusType = (type: VipBonusType): boolean => RELOAD_VIP_BONUS_TYPES.includes(type);
|