SubscriptionViewModelBuilder.coffee 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. Settings = require('settings-sharelatex')
  2. RecurlyWrapper = require("./RecurlyWrapper")
  3. PlansLocator = require("./PlansLocator")
  4. SubscriptionFormatters = require("./SubscriptionFormatters")
  5. LimitationsManager = require("./LimitationsManager")
  6. SubscriptionLocator = require("./SubscriptionLocator")
  7. V1SubscriptionManager = require("./V1SubscriptionManager")
  8. logger = require('logger-sharelatex')
  9. _ = require("underscore")
  10. async = require('async')
  11. buildBillingDetails = (recurlySubscription) ->
  12. hostedLoginToken = recurlySubscription?.account?.hosted_login_token
  13. recurlySubdomain = Settings?.apis?.recurly?.subdomain
  14. if hostedLoginToken? && recurlySubdomain?
  15. return [
  16. "https://",
  17. recurlySubdomain,
  18. ".recurly.com/account/billing_info/edit?ht=",
  19. hostedLoginToken
  20. ].join("")
  21. module.exports =
  22. buildUsersSubscriptionViewModel: (user, callback = (error, data) ->) ->
  23. async.auto {
  24. personalSubscription: (cb) ->
  25. SubscriptionLocator.getUsersSubscription user, cb
  26. recurlySubscription: ['personalSubscription', (cb, {personalSubscription}) ->
  27. if !personalSubscription?.recurlySubscription_id? or personalSubscription?.recurlySubscription_id == ''
  28. return cb(null, null)
  29. RecurlyWrapper.getSubscription personalSubscription.recurlySubscription_id, includeAccount: true, cb
  30. ]
  31. plan: ['personalSubscription', (cb, {personalSubscription}) ->
  32. return cb() if !personalSubscription?
  33. plan = PlansLocator.findLocalPlanInSettings(personalSubscription.planCode)
  34. return cb(new Error("No plan found for planCode '#{personalSubscription.planCode}'")) if !plan?
  35. cb(null, plan)
  36. ]
  37. groupSubscriptions: (cb) ->
  38. SubscriptionLocator.getMemberSubscriptions user, cb
  39. v1Subscriptions: (cb) ->
  40. V1SubscriptionManager.getSubscriptionsFromV1 user._id, (error, subscriptions, v1Id) ->
  41. return cb(error) if error?
  42. # Only return one argument to async.auto, otherwise it returns an array
  43. cb(null, subscriptions)
  44. }, (err, results) ->
  45. return callback(err) if err?
  46. {personalSubscription, groupSubscriptions, v1Subscriptions, recurlySubscription, plan} = results
  47. groupSubscriptions ?= []
  48. v1Subscriptions ?= {}
  49. if personalSubscription?.toObject?
  50. # Downgrade from Mongoose object, so we can add a recurly and plan attribute
  51. personalSubscription = personalSubscription.toObject()
  52. if plan?
  53. personalSubscription.plan = plan
  54. if personalSubscription? and recurlySubscription?
  55. tax = recurlySubscription?.tax_in_cents || 0
  56. personalSubscription.recurly = {
  57. tax: tax
  58. taxRate: parseFloat(recurlySubscription?.tax_rate?._)
  59. billingDetailsLink: buildBillingDetails(recurlySubscription)
  60. price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency
  61. nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at)
  62. currency: recurlySubscription.currency
  63. state: recurlySubscription.state
  64. trialEndsAtFormatted: SubscriptionFormatters.formatDate(recurlySubscription?.trial_ends_at)
  65. trial_ends_at: recurlySubscription.trial_ends_at
  66. }
  67. callback null, {
  68. personalSubscription, groupSubscriptions, v1Subscriptions
  69. }
  70. buildViewModel : ->
  71. plans = Settings.plans
  72. allPlans = {}
  73. plans.forEach (plan)->
  74. allPlans[plan.planCode] = plan
  75. result =
  76. allPlans: allPlans
  77. result.personalAccount = _.find plans, (plan)->
  78. plan.planCode == "personal"
  79. result.studentAccounts = _.filter plans, (plan)->
  80. plan.planCode.indexOf("student") != -1
  81. result.groupMonthlyPlans = _.filter plans, (plan)->
  82. plan.groupPlan and !plan.annual
  83. result.groupAnnualPlans = _.filter plans, (plan)->
  84. plan.groupPlan and plan.annual
  85. result.individualMonthlyPlans = _.filter plans, (plan)->
  86. !plan.groupPlan and !plan.annual and plan.planCode != "personal" and plan.planCode.indexOf("student") == -1
  87. result.individualAnnualPlans = _.filter plans, (plan)->
  88. !plan.groupPlan and plan.annual and plan.planCode.indexOf("student") == -1
  89. return result