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.
@@ -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 = vipBonus.type === vip_bonus_type_1.VipBonusType.RELOADED
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 = vipBonus.type === vip_bonus_type_1.VipBonusType.RELOADED
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":"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"}
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.RELOADED) {
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,qDAAgD;AAWhD,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;AAC5G,QAAA,+BAA+B,GAAG,CAAC,CAAC;AAEpC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAUpD,SAAgB,4BAA4B,CAAC,EAAE,IAAI,EAAE,KAAK,EAAyD;IACjH,IAAI,KAAK,CAAC,IAAI,KAAK,6BAAY,CAAC,QAAQ,EAAE,CAAC;QACzC,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;AAlDD,oEAkDC"}
1
+ {"version":3,"file":"parse-create-vip-bonus.js","sourceRoot":"","sources":["../../src/utils/parse-create-vip-bonus.ts"],"names":[],"mappings":"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"}
@@ -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,YAGX;AAHD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,qCAAqB,CAAA;AACvB,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB"}
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.0",
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": "8adc8fb3a04423582ef6704c78bc3cafe746ff15"
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 BigNumber from 'bignumber.js';
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
- vipBonus.type === VipBonusType.RELOADED
65
- ? getReloadExpiryDate(
66
- activationTime,
67
- vipBonus.cadence!,
68
- vipBonus.expiryPerOccurrence ?? 0,
69
- occurrenceIndex,
70
- bonusCreatedAt,
71
- vipBonus.firstOccurrenceActivationPeriod ?? 0,
72
- )?.toISOString()
73
- : vipBonus.endAt;
74
- const availableDate =
75
- vipBonus.type === VipBonusType.RELOADED
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
- if (bonus.type === VipBonusType.RELOADED) {
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);