diff --git a/website/client/src/components/admin-panel/user-support/cronAndAuth.vue b/website/client/src/components/admin-panel/user-support/cronAndAuth.vue index 1a28b044c7..8b107ebf21 100644 --- a/website/client/src/components/admin-panel/user-support/cronAndAuth.vue +++ b/website/client/src/components/admin-panel/user-support/cronAndAuth.vue @@ -22,11 +22,6 @@ Account created: {{ hero.auth.timestamps.created | formatDate }} -
- Most recent cron: - {{ hero.auth.timestamps.loggedin | formatDate }} - ("auth.timestamps.loggedin") -
"lastCron" value: {{ hero.lastCron | formatDate }} @@ -36,6 +31,19 @@ ("auth.timestamps.loggedin" and "lastCron" dates are different).
+
+
+ Most recent cron: + {{ hero.auth.timestamps.loggedin | formatDate }} + ("auth.timestamps.loggedin") +
+ +
Time zone: {{ hero.preferences.timezoneOffset | formatTimeZone }} @@ -218,6 +226,10 @@ export default { await this.saveHero({ hero: this.hero, msg: 'API Token' }); this.tokenModified = true; }, + resetCron () { + this.hero.resetCron = true; + this.saveHero({ hero: this.hero, msg: 'Last Cron', clearData: true }); + }, }, }; diff --git a/website/client/src/components/admin-panel/user-support/index.vue b/website/client/src/components/admin-panel/user-support/index.vue index d94d6d44c4..8d156077f2 100644 --- a/website/client/src/components/admin-panel/user-support/index.vue +++ b/website/client/src/components/admin-panel/user-support/index.vue @@ -17,6 +17,10 @@ :reset-counter="resetCounter" /> + + +
+

+ Subscription, Monthly Perks +

+
+
+
+ Payment method: + {{ hero.purchased.plan.paymentMethod }} +
+
+ Payment schedule ("basic-earned" is monthly): + {{ hero.purchased.plan.planId }} +
+
+ Creation date: + {{ dateFormat(hero.purchased.plan.dateCreated) }} +
+
+ Termination date: + + {{ dateFormat(hero.purchased.plan.dateTerminated) }} + + None +
+
+ +
+
+ Months until renewal: + {{ hero.purchased.plan.consecutive.offset }} +
+
+ Next Mystic Hourglass: + {{ nextHourglassDate }} +
+
+ +
+
+ Gem cap: + {{ hero.purchased.plan.consecutive.gemCapExtra + 25 }} +
+
+ +
+
+ Additional credit (applied upon cancellation): + {{ hero.purchased.plan.extraMonths }} +
+
+ Mystery Items: + + + + {{ item }}, + + {{ item }} + + + + None + +
+ +
+
+
+ + + diff --git a/website/common/locales/en/settings.json b/website/common/locales/en/settings.json index eeca1cd565..3f8a2371bc 100644 --- a/website/common/locales/en/settings.json +++ b/website/common/locales/en/settings.json @@ -213,5 +213,6 @@ "transaction_release_mounts": "Released mounts", "transaction_reroll": "Used Fortify Potion", "transaction_subscription_perks": "From subscription perk", - "transaction_admin_update_balance": "Admin given" + "transaction_admin_update_balance": "Admin given", + "transaction_admin_update_hourglasses": "Admin updated" } diff --git a/website/server/controllers/api-v3/hall.js b/website/server/controllers/api-v3/hall.js index 2ee18a6044..456c62a396 100644 --- a/website/server/controllers/api-v3/hall.js +++ b/website/server/controllers/api-v3/hall.js @@ -273,6 +273,28 @@ api.updateHero = { hero.balance = updateData.balance; } + if (updateData.purchased && updateData.purchased.plan) { + if (updateData.purchased.plan.gemsBought) { + hero.purchased.plan.gemsBought = updateData.purchased.plan.gemsBought; + } + if (updateData.purchased.plan.consecutive) { + if (updateData.purchased.plan.consecutive.trinkets) { + await hero.updateHourglasses( + updateData.purchased.plan.consecutive.trinkets + - hero.purchased.plan.consecutive.trinkets, + 'admin_update_hourglasses', '', 'Updated by Habitica staff', + ); + hero.purchased.plan.consecutive.trinkets = updateData.purchased.plan.consecutive.trinkets; + } + if (updateData.purchased.plan.consecutive.gemCapExtra) { + hero.purchased.plan.consecutive.gemCapExtra = updateData.purchased.plan.consecutive.gemCapExtra; // eslint-disable-line max-len + } + if (updateData.purchased.plan.consecutive.count) { + hero.purchased.plan.consecutive.count = updateData.purchased.plan.consecutive.count; // eslint-disable-line max-len + } + } + } + // give them gems if they got an higher level // tier = level in this context let newTier = updateData.contributor && updateData.contributor.level; @@ -331,6 +353,13 @@ api.updateHero = { hero.apiToken = common.uuid(); } + if (updateData.resetCron) { + // Set last cron to yesterday. Quick approach so we don't need moment() for one line + const yesterday = new Date(new Date().setDate(new Date().getDate() - 1)); + hero.lastCron = yesterday; + hero.auth.timestamps.loggedin = yesterday; // so admin panel doesn't gripe about mismatch + } + const savedHero = await hero.save(); const heroJSON = savedHero.toJSON(); heroJSON.secret = savedHero.getSecretData(); diff --git a/website/server/models/transaction.js b/website/server/models/transaction.js index 56687f86c9..88a3ca8550 100644 --- a/website/server/models/transaction.js +++ b/website/server/models/transaction.js @@ -5,7 +5,7 @@ import baseModel from '../libs/baseModel'; const { Schema } = mongoose; export const currencies = ['gems', 'hourglasses']; -export const transactionTypes = ['buy_money', 'buy_gold', 'spend', 'gift_send', 'gift_receive', 'debug', 'create_challenge', 'create_bank_challenge', 'create_guild', 'change_class', 'rebirth', 'release_pets', 'release_mounts', 'reroll', 'contribution', 'subscription_perks', 'admin_update_balance']; +export const transactionTypes = ['buy_money', 'buy_gold', 'spend', 'gift_send', 'gift_receive', 'debug', 'create_challenge', 'create_bank_challenge', 'create_guild', 'change_class', 'rebirth', 'release_pets', 'release_mounts', 'reroll', 'contribution', 'subscription_perks', 'admin_update_balance', 'admin_update_hourglasses']; export const schema = new Schema({ currency: { $type: String, enum: currencies, required: true }, diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js index f339cff896..bb25eea9b5 100644 --- a/website/server/models/user/methods.js +++ b/website/server/models/user/methods.js @@ -577,3 +577,22 @@ schema.methods.updateBalance = async function updateBalance (amount, currentAmount: this.balance, }); }; + +schema.methods.updateHourglasses = async function updateHourglasses ( + amount, + transactionType, + reference, + referenceText, +) { + this.purchased.plan.consecutive.trinkets += amount; + + await Transaction.create({ + currency: 'hourglasses', + userId: this._id, + transactionType, + amount, + reference, + referenceText, + currentAmount: this.purchased.plan.consecutive.trinkets, + }); +};