overleaf/services/web/public/coffee/main/new-subscription.coffee
Jessica Lawshe 5b5ece37a5 Handle sixpack timeouts and include variant in metabase segmentation
Render default when sixpack timesout

Only convert when variant exists

Use Angular cookies module to add variant cookie, which is used on the new subscription page.
2018-08-17 10:29:45 -05:00

239 lines
No EOL
13 KiB
CoffeeScript

define [
"base",
"directives/creditCards"
"libs/recurly-4.8.5"
], (App)->
App.controller "NewSubscriptionController", ($scope, MultiCurrencyPricing, abTestManager, $http, sixpack, event_tracking, ccUtils, ipCookie)->
throw new Error("Recurly API Library Missing.") if typeof recurly is "undefined"
$scope.currencyCode = MultiCurrencyPricing.currencyCode
$scope.plans = MultiCurrencyPricing.plans
$scope.planCode = window.plan_code
$scope.plansVariant = ipCookie('plansVariant')
$scope.switchToStudent = ()->
currentPlanCode = window.plan_code
planCode = currentPlanCode.replace('collaborator', 'student')
event_tracking.sendMB 'subscription-form-switch-to-student', { plan: window.plan_code, variant: $scope.plansVariant }
window.location = "/user/subscription/new?planCode=#{planCode}&currency=#{$scope.currencyCode}&cc=#{$scope.data.coupon}"
event_tracking.sendMB "subscription-form", { plan : window.plan_code, variant: $scope.plansVariant }
$scope.paymentMethod =
value: "credit_card"
$scope.data =
first_name: ""
last_name: ""
postal_code: ""
address1 : ""
address2 : ""
state:""
city:""
country:window.countryCode
coupon: window.couponCode
$scope.validation = {}
$scope.processing = false
recurly.configure
publicKey: window.recurlyApiKey
style:
all:
fontFamily: '"Open Sans", sans-serif',
fontSize: '16px',
fontColor: '#7a7a7a'
month:
placeholder: 'MM'
year:
placeholder: 'YY'
cvv:
placeholder: 'CVV'
pricing = recurly.Pricing()
window.pricing = pricing
initialPricing = pricing
.plan(window.plan_code, { quantity: 1 })
.address({country: $scope.data.country})
.tax({tax_code: 'digital', vat_number: ''})
.currency($scope.currencyCode)
.coupon($scope.data.coupon)
.done()
pricing.on "change", =>
$scope.planName = pricing.items.plan.name
$scope.price = pricing.price
$scope.trialLength = pricing.items.plan.trial?.length
$scope.monthlyBilling = pricing.items.plan.period.length == 1
if pricing.items?.coupon?.discount?.type == "percent"
basePrice = parseInt(pricing.price.base.plan.unit)
$scope.normalPrice = basePrice
if pricing.items.coupon.applies_for_months > 0 and pricing.items.coupon?.discount?.rate and pricing.items.coupon?.applies_for_months?
$scope.discountMonths = pricing.items.coupon?.applies_for_months
$scope.discountRate = pricing.items.coupon?.discount?.rate * 100
if pricing.price?.taxes[0]?.rate?
$scope.normalPrice += (basePrice * pricing.price.taxes[0].rate)
$scope.$apply()
$scope.applyCoupon = ->
pricing.coupon($scope.data.coupon).done()
$scope.applyVatNumber = ->
pricing.tax({tax_code: 'digital', vat_number: $scope.data.vat_number}).done()
$scope.changeCurrency = (newCurrency)->
$scope.currencyCode = newCurrency
pricing.currency(newCurrency).done()
$scope.inputHasError = inputHasError = (formItem) ->
if !formItem?
return false
return (formItem.$touched && formItem.$invalid)
$scope.isFormValid = isFormValid = (form) ->
if $scope.paymentMethod.value == 'paypal'
return $scope.data.country != ""
else
return form.$valid
$scope.updateCountry = ->
pricing.address({country:$scope.data.country}).done()
$scope.setPaymentMethod = setPaymentMethod = (method) ->
$scope.paymentMethod.value = method;
$scope.validation.errorFields = {}
$scope.genericError = ""
completeSubscription = (err, recurly_token_id) ->
$scope.validation.errorFields = {}
if err?
event_tracking.sendMB "subscription-error", err
# We may or may not be in a digest loop here depending on
# whether recurly could do validation locally, so do it async
$scope.$evalAsync () ->
$scope.processing = false
$scope.genericError = err.message
_.each err.fields, (field)-> $scope.validation.errorFields[field] = true
else
postData =
_csrf: window.csrfToken
recurly_token_id:recurly_token_id.id
subscriptionDetails:
currencyCode:pricing.items.currency
plan_code:pricing.items.plan.code
coupon_code:pricing.items?.coupon?.code || ""
isPaypal: $scope.paymentMethod.value == 'paypal'
address:
address1: $scope.data.address1
address2: $scope.data.address2
country: $scope.data.country
state: $scope.data.state
postal_code: $scope.data.postal_code
event_tracking.sendMB "subscription-form-submitted", {
currencyCode : postData.subscriptionDetails.currencyCode,
plan_code : postData.subscriptionDetails.plan_code,
coupon_code : postData.subscriptionDetails.coupon_code,
isPaypal : postData.subscriptionDetails.isPaypal,
variant : $scope.plansVariant
}
$http.post("/user/subscription/create", postData)
.then ()->
event_tracking.sendMB "subscription-submission-success", { variant: $scope.plansVariant }
window.location.href = "/user/subscription/thank-you"
.catch ()->
$scope.processing = false
$scope.genericError = "Something went wrong processing the request"
$scope.submit = ->
$scope.processing = true
if $scope.paymentMethod.value == 'paypal'
opts = { description: $scope.planName }
recurly.paypal opts, completeSubscription
else
recurly.token $scope.data, completeSubscription
$scope.countries = [
{code:'AF',name:'Afghanistan'},{code:'AL',name:'Albania'},{code:'DZ',name:'Algeria'},{code:'AS',name:'American Samoa'},
{code:'AD',name:'Andorra'},{code:'AO',name:'Angola'},{code:'AI',name:'Anguilla'},{code:'AQ',name:'Antarctica'},
{code:'AG',name:'Antigua and Barbuda'},{code:'AR',name:'Argentina'},{code:'AM',name:'Armenia'},{code:'AW',name:'Aruba'},
{code:'AC',name:'Ascension Island'},{code:'AU',name:'Australia'},{code:'AT',name:'Austria'},{code:'AZ',name:'Azerbaijan'},
{code:'BS',name:'Bahamas'},{code:'BH',name:'Bahrain'},{code:'BD',name:'Bangladesh'},{code:'BB',name:'Barbados'},
{code:'BE',name:'Belgium'},{code:'BZ',name:'Belize'},{code:'BJ',name:'Benin'},{code:'BM',name:'Bermuda'},
{code:'BT',name:'Bhutan'},{code:'BO',name:'Bolivia'},{code:'BA',name:'Bosnia and Herzegovina'},{code:'BW',name:'Botswana'},
{code:'BV',name:'Bouvet Island'},{code:'BR',name:'Brazil'},{code:'BQ',name:'British Antarctic Territory'},
{code:'IO',name:'British Indian Ocean Territory'},{code:'VG',name:'British Virgin Islands'},{code:'BN',name:'Brunei'},
{code:'BG',name:'Bulgaria'},{code:'BF',name:'Burkina Faso'},{code:'BI',name:'Burundi'},{code:'KH',name:'Cambodia'},
{code:'CM',name:'Cameroon'},{code:'CA',name:'Canada'},{code:'IC',name:'Canary Islands'},
{code:'CT',name:'Canton and Enderbury Islands'},{code:'CV',name:'Cape Verde'},{code:'KY',name:'Cayman Islands'},
{code:'CF',name:'Central African Republic'},{code:'EA',name:'Ceuta and Melilla'},{code:'TD',name:'Chad'},
{code:'CL',name:'Chile'},{code:'CN',name:'China'},{code:'CX',name:'Christmas Island'},{code:'CP',name:'Clipperton Island'},
{code:'CC',name:'Cocos [Keeling] Islands'},{code:'CO',name:'Colombia'},{code:'KM',name:'Comoros'},{code:'CD',name:'Congo [DRC]'},
{code:'CK',name:'Cook Islands'},{code:'CR',name:'Costa Rica'},{code:'HR',name:'Croatia'},{code:'CU',name:'Cuba'},
{code:'CY',name:'Cyprus'},{code:'CZ',name:'Czech Republic'},{code:'DK',name:'Denmark'},{code:'DG',name:'Diego Garcia'},
{code:'DJ',name:'Djibouti'},{code:'DM',name:'Dominica'},{code:'DO',name:'Dominican Republic'},
{code:'NQ',name:'Dronning Maud Land'},{code:'TL',name:'East Timor'},{code:'EC',name:'Ecuador'},{code:'EG',name:'Egypt'},
{code:'SV',name:'El Salvador'},{code:'EE',name:'Estonia'},{code:'ET',name:'Ethiopia'},
{code:'FK',name:'Falkland Islands [Islas Malvinas]'},{code:'FO',name:'Faroe Islands'},{code:'FJ',name:'Fiji'},
{code:'FI',name:'Finland'},{code:'FR',name:'France'},{code:'GF',name:'French Guiana'},{code:'PF',name:'French Polynesia'},
{code:'TF',name:'French Southern Territories'},{code:'FQ',name:'French Southern and Antarctic Territories'},
{code:'GA',name:'Gabon'},{code:'GM',name:'Gambia'},{code:'GE',name:'Georgia'},{code:'DE',name:'Germany'},
{code:'GH',name:'Ghana'},{code:'GI',name:'Gibraltar'},{code:'GR',name:'Greece'},{code:'GL',name:'Greenland'},
{code:'GD',name:'Grenada'},{code:'GP',name:'Guadeloupe'},{code:'GU',name:'Guam'},{code:'GT',name:'Guatemala'},
{code:'GG',name:'Guernsey'},{code:'GW',name:'Guinea-Bissau'},{code:'GY',name:'Guyana'},{code:'HT',name:'Haiti'},
{code:'HM',name:'Heard Island and McDonald Islands'},{code:'HN',name:'Honduras'},{code:'HK',name:'Hong Kong'},
{code:'HU',name:'Hungary'},{code:'IS',name:'Iceland'},{code:'IN',name:'India'},{code:'ID',name:'Indonesia'},
{code:'IE',name:'Ireland'},{code:'IM',name:'Isle of Man'},{code:'IL',name:'Israel'},{code:'IT',name:'Italy'},
{code:'JM',name:'Jamaica'},{code:'JP',name:'Japan'},{code:'JE',name:'Jersey'},{code:'JT',name:'Johnston Island'},
{code:'JO',name:'Jordan'},{code:'KZ',name:'Kazakhstan'},{code:'KE',name:'Kenya'},{code:'KI',name:'Kiribati'},
{code:'KW',name:'Kuwait'},{code:'KG',name:'Kyrgyzstan'},{code:'LA',name:'Laos'},{code:'LV',name:'Latvia'},
{code:'LS',name:'Lesotho'},{code:'LY',name:'Libya'},{code:'LI',name:'Liechtenstein'},{code:'LT',name:'Lithuania'},
{code:'LU',name:'Luxembourg'},{code:'MO',name:'Macau'},{code:'MK',name:'Macedonia [FYROM]'},{code:'MG',name:'Madagascar'},
{code:'MW',name:'Malawi'},{code:'MY',name:'Malaysia'},{code:'MV',name:'Maldives'},{code:'ML',name:'Mali'},
{code:'MT',name:'Malta'},{code:'MH',name:'Marshall Islands'},{code:'MQ',name:'Martinique'},{code:'MR',name:'Mauritania'},
{code:'MU',name:'Mauritius'},{code:'YT',name:'Mayotte'},{code:'FX',name:'Metropolitan France'},{code:'MX',name:'Mexico'},
{code:'FM',name:'Micronesia'},{code:'MI',name:'Midway Islands'},{code:'MD',name:'Moldova'},{code:'MC',name:'Monaco'},
{code:'MN',name:'Mongolia'},{code:'ME',name:'Montenegro'},{code:'MS',name:'Montserrat'},{code:'MA',name:'Morocco'},
{code:'MZ',name:'Mozambique'},{code:'NA',name:'Namibia'},{code:'NR',name:'Nauru'},{code:'NP',name:'Nepal'},
{code:'NL',name:'Netherlands'},{code:'AN',name:'Netherlands Antilles'},{code:'NT',name:'Neutral Zone'},
{code:'NC',name:'New Caledonia'},{code:'NZ',name:'New Zealand'},{code:'NI',name:'Nicaragua'},{code:'NE',name:'Niger'},
{code:'NG',name:'Nigeria'},{code:'NU',name:'Niue'},{code:'NF',name:'Norfolk Island'},{code:'VD',name:'North Vietnam'},
{code:'MP',name:'Northern Mariana Islands'},{code:'NO',name:'Norway'},{code:'OM',name:'Oman'},
{code:'QO',name:'Outlying Oceania'},{code:'PC',name:'Pacific Islands Trust Territory'},{code:'PK',name:'Pakistan'},
{code:'PW',name:'Palau'},{code:'PS',name:'Palestinian Territories'},{code:'PA',name:'Panama'},{code:'PZ',name:'Panama Canal Zone'},
{code:'PY',name:'Paraguay'},{code:'YD',name:'People's Democratic Republic of Yemen'},{code:'PE',name:'Peru'},
{code:'PH',name:'Philippines'},{code:'PN',name:'Pitcairn Islands'},{code:'PL',name:'Poland'},{code:'PT',name:'Portugal'},
{code:'PR',name:'Puerto Rico'},{code:'QA',name:'Qatar'},{code:'RO',name:'Romania'},{code:'RU',name:'Russia'},
{code:'RW',name:'Rwanda'},{code:'RE',name:'Réunion'},{code:'BL',name:'Saint Barthélemy'},
{code:'SH',name:'Saint Helena'},{code:'KN',name:'Saint Kitts and Nevis'},{code:'LC',name:'Saint Lucia'},
{code:'MF',name:'Saint Martin'},{code:'PM',name:'Saint Pierre and Miquelon'},{code:'VC',name:'Saint Vincent and the Grenadines'},
{code:'WS',name:'Samoa'},{code:'SM',name:'San Marino'},{code:'SA',name:'Saudi Arabia'},{code:'SN',name:'Senegal'},
{code:'RS',name:'Serbia'},{code:'CS',name:'Serbia and Montenegro'},{code:'SC',name:'Seychelles'},{code:'SL',name:'Sierra Leone'},
{code:'SG',name:'Singapore'},{code:'SK',name:'Slovakia'},{code:'SI',name:'Slovenia'},{code:'SB',name:'Solomon Islands'},
{code:'ZA',name:'South Africa'},{code:'GS',name:'South Georgia and the South Sandwich Islands'},{code:'KR',name:'South Korea'},
{code:'ES',name:'Spain'},{code:'LK',name:'Sri Lanka'},{code:'SR',name:'Suriname'},{code:'SJ',name:'Svalbard and Jan Mayen'},
{code:'SZ',name:'Swaziland'},{code:'SE',name:'Sweden'},{code:'CH',name:'Switzerland'},
{code:'ST',name:'São Tomé and Príncipe'},{code:'TW',name:'Taiwan'},{code:'TJ',name:'Tajikistan'},
{code:'TZ',name:'Tanzania'},{code:'TH',name:'Thailand'},{code:'TG',name:'Togo'},{code:'TK',name:'Tokelau'},{code:'TO',name:'Tonga'},
{code:'TT',name:'Trinidad and Tobago'},{code:'TA',name:'Tristan da Cunha'},{code:'TN',name:'Tunisia'},{code:'TR',name:'Turkey'},
{code:'TM',name:'Turkmenistan'},{code:'TC',name:'Turks and Caicos Islands'},{code:'TV',name:'Tuvalu'},
{code:'UM',name:'U.S. Minor Outlying Islands'},{code:'PU',name:'U.S. Miscellaneous Pacific Islands'},
{code:'VI',name:'U.S. Virgin Islands'},{code:'UG',name:'Uganda'},{code:'UA',name:'Ukraine'},{code:'AE',name:'United Arab Emirates'},
{code:'GB',name:'United Kingdom'},{code:'US',name:'United States'},{code:'UY',name:'Uruguay'},{code:'UZ',name:'Uzbekistan'},
{code:'VU',name:'Vanuatu'},{code:'VA',name:'Vatican City'},{code:'VE',name:'Venezuela'},{code:'VN',name:'Vietnam'},
{code:'WK',name:'Wake Island'},{code:'WF',name:'Wallis and Futuna'},{code:'EH',name:'Western Sahara'},{code:'YE',name:'Yemen'},
{code:'ZM',name:'Zambia'},{code:'AX',name:'Åland Islandscode:'}
]