SubscriptionViewModelBuilder.coffee 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. buildBillingDetails = (recurlySubscription) ->
  11. hostedLoginToken = recurlySubscription?.account?.hosted_login_token
  12. recurlySubdomain = Settings?.apis?.recurly?.subdomain
  13. if hostedLoginToken? && recurlySubdomain?
  14. return [
  15. "https://",
  16. recurlySubdomain,
  17. ".recurly.com/account/billing_info/edit?ht=",
  18. hostedLoginToken
  19. ].join("")
  20. module.exports =
  21. buildUsersSubscriptionViewModel: (user, callback = (error, subscription, memberSubscriptions, billingDetailsLink) ->) ->
  22. SubscriptionLocator.getUsersSubscription user, (err, subscription) ->
  23. return callback(err) if err?
  24. SubscriptionLocator.getMemberSubscriptions user, (err, memberSubscriptions = []) ->
  25. return callback(err) if err?
  26. V1SubscriptionManager.getSubscriptionsFromV1 user._id, (err, v1Subscriptions) ->
  27. return callback(err) if err?
  28. if subscription?
  29. return callback(error) if error?
  30. plan = PlansLocator.findLocalPlanInSettings(subscription.planCode)
  31. if !plan?
  32. err = new Error("No plan found for planCode '#{subscription.planCode}'")
  33. logger.error {user_id: user._id, err}, "error getting subscription plan for user"
  34. return callback(err)
  35. RecurlyWrapper.getSubscription subscription.recurlySubscription_id, includeAccount: true, (err, recurlySubscription)->
  36. tax = recurlySubscription?.tax_in_cents || 0
  37. callback null, {
  38. admin_id:subscription.admin_id
  39. name: plan.name
  40. nextPaymentDueAt: SubscriptionFormatters.formatDate(recurlySubscription?.current_period_ends_at)
  41. state: recurlySubscription?.state
  42. price: SubscriptionFormatters.formatPrice (recurlySubscription?.unit_amount_in_cents + tax), recurlySubscription?.currency
  43. planCode: subscription.planCode
  44. currency:recurlySubscription?.currency
  45. taxRate:parseFloat(recurlySubscription?.tax_rate?._)
  46. groupPlan: subscription.groupPlan
  47. trial_ends_at:recurlySubscription?.trial_ends_at
  48. }, memberSubscriptions, buildBillingDetails(recurlySubscription), v1Subscriptions
  49. else
  50. callback null, null, memberSubscriptions, null, v1Subscriptions
  51. buildViewModel : ->
  52. plans = Settings.plans
  53. allPlans = {}
  54. plans.forEach (plan)->
  55. allPlans[plan.planCode] = plan
  56. result =
  57. allPlans: allPlans
  58. result.personalAccount = _.find plans, (plan)->
  59. plan.planCode == "personal"
  60. result.studentAccounts = _.filter plans, (plan)->
  61. plan.planCode.indexOf("student") != -1
  62. result.groupMonthlyPlans = _.filter plans, (plan)->
  63. plan.groupPlan and !plan.annual
  64. result.groupAnnualPlans = _.filter plans, (plan)->
  65. plan.groupPlan and plan.annual
  66. result.individualMonthlyPlans = _.filter plans, (plan)->
  67. !plan.groupPlan and !plan.annual and plan.planCode != "personal" and plan.planCode.indexOf("student") == -1
  68. result.individualAnnualPlans = _.filter plans, (plan)->
  69. !plan.groupPlan and plan.annual and plan.planCode.indexOf("student") == -1
  70. return result