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