diff --git a/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee b/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee index d7144b0ba0..9f2847904b 100644 --- a/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee +++ b/services/web/app/coffee/Features/Subscription/LimitationsManager.coffee @@ -5,6 +5,7 @@ SubscriptionLocator = require("./SubscriptionLocator") Settings = require("settings-sharelatex") CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler") CollaboratorsInvitesHandler = require("../Collaborators/CollaboratorsInviteHandler") +V1SubscriptionManager = require("./V1SubscriptionManager") module.exports = LimitationsManager = allowedNumberOfCollaboratorsInProject: (project_id, callback) -> @@ -37,8 +38,10 @@ module.exports = LimitationsManager = return callback(err) if err? @userIsMemberOfGroupSubscription user, (err, isMember)=> return callback(err) if err? - logger.log user_id:user._id, isMember:isMember, hasSubscription:hasSubscription, "checking if user has subscription or is group member" - callback err, isMember or hasSubscription, subscription + @userHasV1SubscriptionOrTeam user, (err, hasV1Subscription)=> + return callback(err) if err? + logger.log {user_id:user._id, isMember, hasSubscription, hasV1Subscription}, "checking if user has subscription or is group member" + callback err, isMember or hasSubscription or hasV1Subscription, subscription userHasSubscription: (user, callback = (err, hasSubscription, subscription)->) -> logger.log user_id:user._id, "checking if user has subscription" @@ -55,6 +58,16 @@ module.exports = LimitationsManager = return callback(err) if err? callback err, subscriptions.length > 0, subscriptions + userHasV1SubscriptionOrTeam: (user, callback = (error, hasV1Subscription) ->) -> + V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscription = {}) -> + return callback(err) if err? + hasV1Subscription = false + if v1Subscription.has_subscription + hasV1Subscription = true + if (v1Subscription.teams or []).length > 0 + hasV1Subscription = true + return callback null, hasV1Subscription + teamHasReachedMemberLimit: (subscription) -> currentTotal = (subscription.member_ids or []).length + (subscription.teamInvites or []).length + diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee index c89545ac68..a01c855f14 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionController.coffee @@ -101,9 +101,9 @@ module.exports = SubscriptionController = logger.log user: user, "redirecting to plans" res.redirect "/user/subscription/plans" else - SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink) -> + SubscriptionViewModelBuilder.buildUsersSubscriptionViewModel user, (error, subscription, groupSubscriptions, billingDetailsLink, v1Subscription) -> return next(error) if error? - logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink}, "showing subscription dashboard" + logger.log {user, subscription, hasSubOrIsGroupMember, groupSubscriptions, billingDetailsLink, v1Subscription}, "showing subscription dashboard" plans = SubscriptionViewModelBuilder.buildViewModel() res.render "subscriptions/dashboard", title: "your_subscription" @@ -116,6 +116,7 @@ module.exports = SubscriptionController = user:user saved_billing_details: req.query.saved_billing_details? billingDetailsLink: billingDetailsLink + v1Subscription: v1Subscription userCustomSubscriptionPage: (req, res, next)-> user = AuthenticationController.getSessionUser(req) diff --git a/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee b/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee index e03a954b36..eee2c33f6b 100644 --- a/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee +++ b/services/web/app/coffee/Features/Subscription/SubscriptionViewModelBuilder.coffee @@ -4,6 +4,7 @@ PlansLocator = require("./PlansLocator") SubscriptionFormatters = require("./SubscriptionFormatters") LimitationsManager = require("./LimitationsManager") SubscriptionLocator = require("./SubscriptionLocator") +V1SubscriptionManager = require("./V1SubscriptionManager") logger = require('logger-sharelatex') _ = require("underscore") @@ -27,34 +28,37 @@ module.exports = SubscriptionLocator.getMemberSubscriptions user, (err, memberSubscriptions = []) -> return callback(err) if err? - if subscription? - return callback(error) if error? + V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscriptions) -> + return callback(err) if err? - plan = PlansLocator.findLocalPlanInSettings(subscription.planCode) + if subscription? + return callback(error) if error? - if !plan? - err = new Error("No plan found for planCode '#{subscription.planCode}'") - logger.error {user_id: user._id, err}, "error getting subscription plan for user" - return callback(err) + plan = PlansLocator.findLocalPlanInSettings(subscription.planCode) - RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)-> - tax = recurlySubscription?.tax_in_cents || 0 + if !plan? + err = new Error("No plan found for planCode '#{subscription.planCode}'") + logger.error {user_id: user._id, err}, "error getting subscription plan for user" + return callback(err) - callback null, { - admin_id:subscription.admin_id - name: plan.name - nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at) - state: recurlySubscription?.state - price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency - planCode: subscription.planCode - currency:recurlySubscription?.currency - taxRate:parseFloat(recurlySubscription?.tax_rate?._) - groupPlan: subscription.groupPlan - trial_ends_at:recurlySubscription?.trial_ends_at - }, memberSubscriptions, buildBillingDetails(recurlySubscription) + RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)-> + tax = recurlySubscription?.tax_in_cents || 0 - else - callback null, null, memberSubscriptions, null + callback null, { + admin_id:subscription.admin_id + name: plan.name + nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at) + state: recurlySubscription?.state + price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency + planCode: subscription.planCode + currency:recurlySubscription?.currency + taxRate:parseFloat(recurlySubscription?.tax_rate?._) + groupPlan: subscription.groupPlan + trial_ends_at:recurlySubscription?.trial_ends_at + }, memberSubscriptions, buildBillingDetails(recurlySubscription), v1Subscriptions + + else + callback null, null, memberSubscriptions, null, v1Subscriptions buildViewModel : -> plans = Settings.plans diff --git a/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee index e920b94f6c..dcf23a3453 100644 --- a/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee +++ b/services/web/app/coffee/Features/Subscription/V1SubscriptionManager.coffee @@ -32,6 +32,12 @@ module.exports = V1SubscriptionManager = url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/sync" }, callback + getSubscriptionsFromV1: (userId, callback=(err, subscriptions) ->) -> + V1SubscriptionManager._v1Request userId, { + method: 'GET', + url: (v1Id) -> "/api/v1/sharelatex/users/#{v1Id}/subscriptions" + }, callback + _v1Request: (userId, options, callback=(err, body)->) -> if !settings?.apis?.v1 return callback null, null diff --git a/services/web/app/views/subscriptions/dashboard.pug b/services/web/app/views/subscriptions/dashboard.pug index 0db4c05423..e6de2cee5c 100644 --- a/services/web/app/views/subscriptions/dashboard.pug +++ b/services/web/app/views/subscriptions/dashboard.pug @@ -103,18 +103,35 @@ block content +printPlans(plans.studentAccounts) +printPlans(plans.individualMonthlyPlans) +printPlans(plans.individualAnnualPlans) - + hr each groupSubscription in groupSubscriptions - if (user._id+'' != groupSubscription.admin_id._id+'') div p !{translate("member_of_group_subscription", {admin_email: "" + groupSubscription.admin_id.email + ""})} span - button.btn.btn-danger(ng-click="removeSelfFromGroup('"+groupSubscription.admin_id._id+"')") #{translate("leave_group")} + button.btn.btn-danger.text-capitalise(ng-click="removeSelfFromGroup('"+groupSubscription.admin_id._id+"')") #{translate("leave_group")} + hr -if(subscription.groupPlan && user._id+'' == subscription.admin_id+'') div a(href="/subscription/group").btn.btn-primary !{translate("manage_group")} + hr + + if v1Subscription.has_subscription + p + | You are subscribed to Overleaf through Overleaf v1 + p + a.btn.btn-primary(href=settings.overleaf.host+"/users/edit#status") Manage v1 Subscription + hr + + if v1Subscription.teams && v1Subscription.teams.length > 0 + for team in v1Subscription.teams + p + | You are a member of the Overleaf v1 team: #{team.name} + p + a.btn.btn-primary(href=settings.overleaf.host+"/teams") Manage v1 Team Membership + hr .card(ng-if="view == 'cancelation'") .page-header