SubscriptionViewModelBuilder.coffee 3.1 KB

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