From 5faeb82d17b665459cda0b52b5a69d0c9f99cd94 Mon Sep 17 00:00:00 2001 From: Matt Lott Date: Thu, 27 Aug 2015 06:28:25 -0700 Subject: [PATCH] Extend terminal sub with year sub purchase --- app/locale/en.coffee | 1 + .../account/subscription-sale-view.sass | 2 + .../account/subscription-sale-view.jade | 3 +- app/views/account/SubscriptionSaleView.coffee | 1 + server/payments/subscription_handler.coffee | 10 +- .../functional/subscription.spec.coffee | 101 ++++++++++++++++++ 6 files changed, 114 insertions(+), 4 deletions(-) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index fcce3997a..83d5a12ca 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -444,6 +444,7 @@ sale_button_title: "Save 35% when you purchase a 1 year subscription" sale_click_here: "Click Here" sale_ends: "Ends" + sale_extended: "*Existing subscriptions will be extended by 1 year." sale_feature_here: "Here's what you'll get:" sale_feature4: "42,000 bonus gems awarded immediately!" sale_continue: "Ready to continue adventuring?" diff --git a/app/styles/account/subscription-sale-view.sass b/app/styles/account/subscription-sale-view.sass index 779a1b5c4..6d9c39d5c 100644 --- a/app/styles/account/subscription-sale-view.sass +++ b/app/styles/account/subscription-sale-view.sass @@ -24,5 +24,7 @@ -moz-transform: rotate(330deg) /* Firefox */ -webkit-transform: rotate(330deg) /* Safari and Chrome */ -o-transform: rotate(330deg) /* Opera */ + .sub-extended + font-size: 12px #pay-button font-size: 18px diff --git a/app/templates/account/subscription-sale-view.jade b/app/templates/account/subscription-sale-view.jade index 20f2d579c..a59e7f1ef 100644 --- a/app/templates/account/subscription-sale-view.jade +++ b/app/templates/account/subscription-sale-view.jade @@ -12,7 +12,7 @@ block content a(href="/account/subscription", data-i18n="account.subscription") li.active(data-i18n="account.sale") Sale - if me.hasSubscription() + if hasSubscription h1(data-i18n="subscribe.sale_already_subscribed") span.spr(data-i18n="subscribe.sale_continue") a(href="/play", data-i18n="subscribe.sale_click_here") @@ -43,6 +43,7 @@ block content li.feature-description(data-i18n="[html]subscribe.sale_feature4") li.feature-description(data-i18n="subscribe.feature5") li.feature-description(data-i18n="[html]subscribe.feature7") + div.sub-extended(data-i18n="subscribe.sale_extended") br p.center button.btn.btn-success#pay-button #{payButtonText} diff --git a/app/views/account/SubscriptionSaleView.coffee b/app/views/account/SubscriptionSaleView.coffee index cdaaa964d..1f1820b78 100644 --- a/app/views/account/SubscriptionSaleView.coffee +++ b/app/views/account/SubscriptionSaleView.coffee @@ -33,6 +33,7 @@ module.exports = class SubscriptionSaleView extends RootView getRenderData: -> c = super() + c.hasSubscription = me.get('stripe')?.sponsorID or me.get('stripe')?.subscriptionID c.heroes = @heroes.models c.payButtonText = @payButtonText c.saleEndDate = @saleEndDate diff --git a/server/payments/subscription_handler.coffee b/server/payments/subscription_handler.coffee index 681d5165b..f8eb8a5ce 100644 --- a/server/payments/subscription_handler.coffee +++ b/server/payments/subscription_handler.coffee @@ -119,7 +119,8 @@ class SubscriptionHandler extends Handler purchaseYearSale: (req, res) -> return @sendForbiddenError(res) unless req.user? - return @sendForbiddenError(res) if req.user?.hasSubscription() + return @sendForbiddenError(res) if req.user?.get('stripe')?.sponsorID + return @sendForbiddenError(res) if req.user?.get('stripe')?.subscriptionID StripeUtils.getCustomer req.user, req.body.stripe?.token, (err, customer) => if err @@ -143,9 +144,12 @@ class SubscriptionHandler extends Handler return @sendDatabaseError(res, err) # Add terminal subscription to User - endDate = new Date() - endDate.setUTCFullYear(endDate.getUTCFullYear() + 1) stripeInfo = _.cloneDeep(req.user.get('stripe') ? {}) + endDate = new Date() + if _.isString(stripeInfo.free) and new Date() < new Date(stripeInfo.free) + # Extend end date by remaining terminal subscription + endDate = new Date(stripeInfo.free) + endDate.setUTCFullYear(endDate.getUTCFullYear() + 1) stripeInfo.free = endDate.toISOString().substring(0, 10) req.user.set('stripe', stripeInfo) diff --git a/test/server/functional/subscription.spec.coffee b/test/server/functional/subscription.spec.coffee index a51200e2e..22faa4f6b 100644 --- a/test/server/functional/subscription.spec.coffee +++ b/test/server/functional/subscription.spec.coffee @@ -1400,3 +1400,104 @@ describe 'Subscriptions', -> expect(payment).toBeDefined() expect(payment.get('gems')).toEqual(3500*12) done() + + it 'year_sale when stripe.free === true', (done) -> + stripe.tokens.create { + card: { number: '4242424242424242', exp_month: 12, exp_year: 2020, cvc: '123' } + }, (err, token) -> + loginNewUser (user1) -> + user1.set('stripe', {free: true}) + user1.save (err, user1) -> + expect(err).toBeNull() + expect(user1.get('stripe')?.free).toEqual(true) + requestBody = + stripe: + token: token.id + timestamp: new Date() + request.put {uri: "#{subscriptionURL}/-/year_sale", json: requestBody, headers: headers }, (err, res) -> + expect(err).toBeNull() + expect(res.statusCode).toBe(200) + User.findById user1.id, (err, user1) -> + expect(err).toBeNull() + stripeInfo = user1.get('stripe') + expect(stripeInfo).toBeDefined() + return done() unless stripeInfo + endDate = new Date() + endDate.setUTCFullYear(endDate.getUTCFullYear() + 1) + expect(stripeInfo.free).toEqual(endDate.toISOString().substring(0, 10)) + expect(stripeInfo.customerID).toBeDefined() + expect(user1.get('purchased')?.gems).toEqual(3500*12) + Payment.findOne 'stripe.customerID': stripeInfo.customerID, (err, payment) -> + expect(err).toBeNull() + expect(payment).toBeDefined() + expect(payment.get('gems')).toEqual(3500*12) + done() + + it 'year_sale when stripe.free < today', (done) -> + stripe.tokens.create { + card: { number: '4242424242424242', exp_month: 12, exp_year: 2020, cvc: '123' } + }, (err, token) -> + loginNewUser (user1) -> + endDate = new Date() + endDate.setUTCFullYear(endDate.getUTCFullYear() - 1) + user1.set('stripe', {free: endDate.toISOString().substring(0, 10)}) + user1.save (err, user1) -> + expect(err).toBeNull() + expect(user1.get('stripe')?.free).toEqual(endDate.toISOString().substring(0, 10)) + requestBody = + stripe: + token: token.id + timestamp: new Date() + request.put {uri: "#{subscriptionURL}/-/year_sale", json: requestBody, headers: headers }, (err, res) -> + expect(err).toBeNull() + expect(res.statusCode).toBe(200) + User.findById user1.id, (err, user1) -> + expect(err).toBeNull() + stripeInfo = user1.get('stripe') + expect(stripeInfo).toBeDefined() + return done() unless stripeInfo + endDate = new Date() + endDate.setUTCFullYear(endDate.getUTCFullYear() + 1) + expect(stripeInfo.free).toEqual(endDate.toISOString().substring(0, 10)) + expect(stripeInfo.customerID).toBeDefined() + expect(user1.get('purchased')?.gems).toEqual(3500*12) + Payment.findOne 'stripe.customerID': stripeInfo.customerID, (err, payment) -> + expect(err).toBeNull() + expect(payment).toBeDefined() + expect(payment.get('gems')).toEqual(3500*12) + done() + + it 'year_sale when stripe.free > today', (done) -> + stripe.tokens.create { + card: { number: '4242424242424242', exp_month: 12, exp_year: 2020, cvc: '123' } + }, (err, token) -> + loginNewUser (user1) -> + endDate = new Date() + endDate.setUTCDate(endDate.getUTCDate() + 5) + user1.set('stripe', {free: endDate.toISOString().substring(0, 10)}) + user1.save (err, user1) -> + expect(err).toBeNull() + expect(user1.get('stripe')?.free).toEqual(endDate.toISOString().substring(0, 10)) + requestBody = + stripe: + token: token.id + timestamp: new Date() + request.put {uri: "#{subscriptionURL}/-/year_sale", json: requestBody, headers: headers }, (err, res) -> + expect(err).toBeNull() + expect(res.statusCode).toBe(200) + User.findById user1.id, (err, user1) -> + expect(err).toBeNull() + stripeInfo = user1.get('stripe') + expect(stripeInfo).toBeDefined() + return done() unless stripeInfo + endDate = new Date() + endDate.setUTCFullYear(endDate.getUTCFullYear() + 1) + endDate.setUTCDate(endDate.getUTCDate() + 5) + expect(stripeInfo.free).toEqual(endDate.toISOString().substring(0, 10)) + expect(stripeInfo.customerID).toBeDefined() + expect(user1.get('purchased')?.gems).toEqual(3500*12) + Payment.findOne 'stripe.customerID': stripeInfo.customerID, (err, payment) -> + expect(err).toBeNull() + expect(payment).toBeDefined() + expect(payment.get('gems')).toEqual(3500*12) + done()