Improve handling

This commit is contained in:
Phillip Thelen
2022-11-30 15:06:50 +01:00
committed by Phillip Thelen
parent 0f7001b609
commit 82a1d6ff0e
3 changed files with 21 additions and 23 deletions

View File

@@ -106,32 +106,16 @@ async function grantEndOfTheMonthPerks (user, now) {
planMonthsLength = getPlanMonths(plan); planMonthsLength = getPlanMonths(plan);
} }
// every 3 months you get one set of perks - this variable records how many sets you need
let perkAmountNeeded = 0;
if (planMonthsLength === 1) { if (planMonthsLength === 1) {
// User has a single-month recurring subscription and are due for perks
// IF they've been subscribed for a multiple of 3 months.
if (plan.consecutive.count % SUBSCRIPTION_BASIC_BLOCK_LENGTH === 0) { // every 3 months
perkAmountNeeded = 1;
}
plan.consecutive.offset = 0; // allow the same logic to be run next month plan.consecutive.offset = 0; // allow the same logic to be run next month
} else { } else {
// User has a multi-month recurring subscription // User has a multi-month recurring subscription
// and it renewed in the previous calendar month. // and it renewed in the previous calendar month.
// e.g., for a 6-month subscription, give two sets of perks
perkAmountNeeded = planMonthsLength / SUBSCRIPTION_BASIC_BLOCK_LENGTH;
// don't need to check for perks again for this many months // don't need to check for perks again for this many months
// (subtract 1 because we should have run this when the payment was taken last month) // (subtract 1 because we should have run this when the payment was taken last month)
plan.consecutive.offset = planMonthsLength - 1; plan.consecutive.offset = planMonthsLength - 1;
} }
if (perkAmountNeeded > 0) { await plan.incrementPerkCounterAndReward(user._id, planMonthsLength);
// one Hourglass every 3 months
await plan.updateHourglasses(user._id, perkAmountNeeded, 'subscription_perks'); // eslint-disable-line no-await-in-loop
plan.consecutive.gemCapExtra += 5 * perkAmountNeeded; // 5 extra Gems every 3 months
// cap it at 50 (hard 25 limit + extra 25)
if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25;
}
} }
} }
} }

View File

@@ -246,12 +246,11 @@ async function createSubscription (data) {
} = await prepareSubscriptionValues(data); } = await prepareSubscriptionValues(data);
// Block sub perks // Block sub perks
const perks = Math.floor(months / 3); if (months > 0) {
if (perks) { if (!data.gift && !groupId) {
plan.consecutive.offset += months; plan.consecutive.offset = months;
plan.consecutive.gemCapExtra += perks * 5; }
if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25; await plan.incrementPerkCounterAndReward(recipient._id, months);
await plan.updateHourglasses(recipient._id, perks, 'subscription_perks'); // one Hourglass every 3 months
} }
if (recipient !== group) { if (recipient !== group) {

View File

@@ -15,6 +15,7 @@ export const schema = new mongoose.Schema({
dateUpdated: Date, dateUpdated: Date,
dateCurrentTypeCreated: Date, dateCurrentTypeCreated: Date,
extraMonths: { $type: Number, default: 0 }, extraMonths: { $type: Number, default: 0 },
perkMonthCount: { $type: Number, default: 0 },
gemsBought: { $type: Number, default: 0 }, gemsBought: { $type: Number, default: 0 },
mysteryItems: { $type: Array, default: () => [] }, mysteryItems: { $type: Array, default: () => [] },
lastReminderDate: Date, // indicates the last time a subscription reminder was sent lastReminderDate: Date, // indicates the last time a subscription reminder was sent
@@ -46,6 +47,20 @@ schema.plugin(baseModel, {
_id: false, _id: false,
}); });
schema.methods.incrementPerkCounterAndReward = async function incrementPerkCounterAndReward (userID, adding) {
this.perkMonthCount += adding;
const perks = Math.floor(this.perkMonthCount / 3);
if (perks > 0) {
this.consecutive.gemCapExtra += 5 * perks; // 5 extra Gems every 3 months
// cap it at 50 (hard 25 limit + extra 25)
if (this.consecutive.gemCapExtra > 25) this.consecutive.gemCapExtra = 25;
this.perkMonthCount -= (perks * 3);
// one Hourglass every 3 months
await this.updateHourglasses(userID, perks, 'subscription_perks'); // eslint-disable-line no-await-in-loop
}
};
schema.methods.updateHourglasses = async function updateHourglasses (userId, schema.methods.updateHourglasses = async function updateHourglasses (userId,
amount, amount,
transactionType, transactionType,