From cf553009bf190b31429e7910acf11be4e310c1a9 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sun, 5 Feb 2017 14:42:51 -0600 Subject: [PATCH] jamtrack price change --- db/manifest | 3 +- db/up/jam_track_download_rights.sql | 8 + .../user_mailer/welcome_message.html.erb | 2 +- ruby/lib/jam_ruby/jam_track_importer.rb | 1 + ruby/lib/jam_ruby/models/gift_card_type.rb | 6 +- ruby/lib/jam_ruby/models/jam_track.rb | 50 +++- .../models/lesson_package_purchase.rb | 4 +- .../jam_ruby/models/lesson_package_type.rb | 5 +- ruby/lib/jam_ruby/models/posa_card_type.rb | 6 +- ruby/lib/jam_ruby/models/sale.rb | 35 ++- ruby/lib/jam_ruby/models/sale_line_item.rb | 1 + ruby/lib/jam_ruby/models/shopping_cart.rb | 40 ++- ruby/spec/factories.rb | 1 + ruby/spec/jam_ruby/models/sale_spec.rb | 2 +- .../jam_ruby/models/shopping_cart_spec.rb | 10 +- .../assets/javascripts/helpBubbleHelper.js | 31 +++ .../JamTrackFilterScreen.js.jsx.coffee | 44 ++- .../JamTrackSearchScreen.js.jsx.coffee | 44 ++- .../PopupJamTrackPlayer.js.jsx.coffee | 44 +++ .../PopupMediaControls.js.jsx.coffee | 45 ++- ...ssAffiliateLandingBottomPage.js.jsx.coffee | 2 +- .../landing/JamTrackCta.js.jsx.coffee | 2 +- .../landing/JamTrackLandingPage.js.jsx.coffee | 4 +- .../ProductJamBlasterBottomPage.js.jsx.coffee | 2 +- .../stylesheets/client/jamtrackSearch.scss | 14 +- .../controllers/api_jam_tracks_controller.rb | 17 +- .../api_shopping_carts_controller.rb | 2 +- web/app/views/api_jam_tracks/show.rabl | 6 +- .../views/api_jam_tracks/show_for_client.rabl | 4 + .../views/api_jam_tracks/show_for_mobile.rabl | 6 +- .../api_jam_tracks/show_jam_track_right.rabl | 2 +- web/app/views/clients/_help.html.slim | 9 + web/app/views/layouts/web.html.erb | 2 +- web/app/views/users/_downloads.html.slim | 2 +- web/config/routes.rb | 2 +- .../api_jamblasters_controller_spec.rb | 73 +++++ web/spec/factories.rb | 3 +- web/spec/features/checkout_spec.rb | 260 ++++++++++++------ web/spec/features/individual_jamtrack_spec.rb | 2 +- web/spec/features/jam_track_searching_spec.rb | 6 +- 40 files changed, 656 insertions(+), 146 deletions(-) create mode 100644 db/up/jam_track_download_rights.sql diff --git a/db/manifest b/db/manifest index 1d0a3f17f..cf77ffe95 100755 --- a/db/manifest +++ b/db/manifest @@ -371,4 +371,5 @@ retailers_v2.sql retailer_interest.sql connection_role.sql retailer_payment_split.sql -teacher_distribution_fields.sql \ No newline at end of file +teacher_distribution_fields.sql +jam_track_download_rights.sql \ No newline at end of file diff --git a/db/up/jam_track_download_rights.sql b/db/up/jam_track_download_rights.sql new file mode 100644 index 000000000..422178858 --- /dev/null +++ b/db/up/jam_track_download_rights.sql @@ -0,0 +1,8 @@ +ALTER TABLE jam_tracks ADD COLUMN download_price numeric; +UPDATE jam_tracks SET download_price = 4.99; +ALTER TABLE jam_track_rights ADD COLUMN can_download BOOLEAN NOT NULL DEFAULT FALSE; +UPDATE jam_track_rights SET can_download = TRUE; +ALTER TABLE shopping_carts ADD COLUMN variant VARCHAR; +UPDATE shopping_carts set variant = 'stream' where cart_type = 'JamTrack'; +ALTER TABLE sale_line_items ADD COLUMN variant VARCHAR; +UPDATE sale_line_items set variant = 'full'; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb index 8607f7bd5..86f30742f 100644 --- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb +++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb @@ -42,7 +42,7 @@ yourself playing along with the rest of the band in audio or video, and more. Get your first - JamTrack free to try one out! After that they are just $1.99 each. Click here for more + JamTrack free to try one out! After that they are just $1.99/$4.99 each. Click here for more information on how you can use JamTracks in your browser, in our free Mac or Windows diff --git a/ruby/lib/jam_ruby/jam_track_importer.rb b/ruby/lib/jam_ruby/jam_track_importer.rb index 21ce287c4..8c846c5c4 100644 --- a/ruby/lib/jam_ruby/jam_track_importer.rb +++ b/ruby/lib/jam_ruby/jam_track_importer.rb @@ -868,6 +868,7 @@ module JamRuby jam_track.genres = determine_genres(metadata) jam_track.language = determine_language(metadata) jam_track.price = 1.99 + jam_track.download_price = 4.99 jam_track.reproduction_royalty_amount = nil jam_track.reproduction_royalty = true jam_track.public_performance_royalty = true diff --git a/ruby/lib/jam_ruby/models/gift_card_type.rb b/ruby/lib/jam_ruby/models/gift_card_type.rb index 8294dbfed..192a9438e 100644 --- a/ruby/lib/jam_ruby/models/gift_card_type.rb +++ b/ruby/lib/jam_ruby/models/gift_card_type.rb @@ -28,6 +28,10 @@ module JamRuby sale_display end + def variant_price(variant = nil) + price + end + def price if card_type == JAM_TRACKS_5 10.00 @@ -39,7 +43,7 @@ module JamRuby end - def sale_display + def sale_display(variant = nil) if card_type == JAM_TRACKS_5 'JamTracks Gift Card (5)' elsif card_type == JAM_TRACKS_10 diff --git a/ruby/lib/jam_ruby/models/jam_track.rb b/ruby/lib/jam_ruby/models/jam_track.rb index dd3d3fdcc..d70e4e8c1 100644 --- a/ruby/lib/jam_ruby/models/jam_track.rb +++ b/ruby/lib/jam_ruby/models/jam_track.rb @@ -161,9 +161,22 @@ module JamRuby true end - def sale_display - "JamTrack: " + name + def sale_display(variant = nil) + if variant == ShoppingCart::JAMTRACK_FULL + variant_desc = 'FULL' + elsif variant == ShoppingCart::JAMTRACK_DOWNLOAD + variant_desc = 'UPRGADE' + elsif variant == ShoppingCart::JAMTRACK_STREAM + variant_desc = 'FOR USE ONLY WITHIN APP' + else + variant_desc = 'UNKNOWN' + end + + + "JamTrack: #{name} - #{variant_desc}" end + + def duplicate_positions? counter = {} jam_track_tracks.each do |track| @@ -504,14 +517,43 @@ module JamRuby owners.include?(user) end - def right_for_user(user) - jam_track_rights.where("user_id=?", user).first + def right_for_user(user, variant = nil) + + query = jam_track_rights.where("user_id=?", user) + + if variant + if variant == ShoppingCart::JAMTRACK_DOWNLOAD + query = query.where('can_download', true) + elsif variant == ShoppingCart::JAMTRACK_FULL + query = query.where('can_download', true) + elsif variant == ShoppingCart::JAMTRACK_STREAM + + else + throw 'unknown variant ' + variant + end + end + query.first end + def mixdowns_for_user(user) JamTrackMixdown.where(user_id: user.id).where(jam_track_id: self.id) end + def upgrade_price + variant_price('download') + end + + def variant_price(variant) + if variant == 'full' + download_price + elsif variant == 'download' + download_price - price + else + price + end + end + def short_plan_code prefix = 'jamtrack-' plan_code[prefix.length..-1] diff --git a/ruby/lib/jam_ruby/models/lesson_package_purchase.rb b/ruby/lib/jam_ruby/models/lesson_package_purchase.rb index f7f47bfc7..80ec5c670 100644 --- a/ruby/lib/jam_ruby/models/lesson_package_purchase.rb +++ b/ruby/lib/jam_ruby/models/lesson_package_purchase.rb @@ -116,7 +116,7 @@ module JamRuby teacher_dist = TeacherDistribution.create_for_lesson_package_purchase(purchase, false, (teacher_split / 100.0).round(2), retailer_rate) purchase.teacher_distributions << teacher_dist # price should always match the teacher_distribution, if there is one - purchase.price = teacher_dist.real_distribution_in_cents / 100 + purchase.price = teacher_dist.amount_in_cents / 100 end if retailer_split && retailer_split > 0 @@ -130,7 +130,7 @@ module JamRuby teacher_dist = TeacherDistribution.create_for_lesson_package_purchase(purchase, false) purchase.teacher_distributions << teacher_dist # price should always match the teacher_distribution, if there is one - purchase.price = teacher_dist.real_distribution_in_cents / 100 + purchase.price = teacher_dist.amount_in_cents / 100 if lesson_booking.school_on_school_payment? teacher_dist = TeacherDistribution.create_for_lesson_package_purchase(purchase, true) diff --git a/ruby/lib/jam_ruby/models/lesson_package_type.rb b/ruby/lib/jam_ruby/models/lesson_package_type.rb index 196e67ccd..5424763fd 100644 --- a/ruby/lib/jam_ruby/models/lesson_package_type.rb +++ b/ruby/lib/jam_ruby/models/lesson_package_type.rb @@ -102,10 +102,13 @@ module JamRuby end - def sale_display + def sale_display(variant = nil) name end + def variant_price(variant = nil) + price + end def plan_code if package_type == SINGLE_FREE "lesson-package-single-free" diff --git a/ruby/lib/jam_ruby/models/posa_card_type.rb b/ruby/lib/jam_ruby/models/posa_card_type.rb index fb2c70e78..570442609 100644 --- a/ruby/lib/jam_ruby/models/posa_card_type.rb +++ b/ruby/lib/jam_ruby/models/posa_card_type.rb @@ -36,6 +36,10 @@ module JamRuby sale_display end + def variant_price(variant = nil) + price + end + def price if card_type == JAM_TRACKS_5 10.00 @@ -49,7 +53,7 @@ module JamRuby end - def sale_display + def sale_display(variant = nil) if card_type == JAM_TRACKS_5 'JamTracks Card (5)' elsif card_type == JAM_TRACKS_10 diff --git a/ruby/lib/jam_ruby/models/sale.rb b/ruby/lib/jam_ruby/models/sale.rb index 96740502b..1d9ccc15f 100644 --- a/ruby/lib/jam_ruby/models/sale.rb +++ b/ruby/lib/jam_ruby/models/sale.rb @@ -118,8 +118,24 @@ module JamRuby price_info end - def self.ios_purchase(current_user, jam_track, receipt, price_data) - jam_track_right = nil + def self.ios_purchase(current_user, jam_track, receipt, price_data, variant) + + if variant.nil? + variant = ShoppingCart::JAMTRACK_STREAM + end + + # see if we should bail because we already own these rights + jam_track_right = jam_track.right_for_user(current_user) + + if !jam_track_right.nil? && jam_track_right.can_download + # if the user already has full rights to the JamTrack, there is nothing else to do in this path + return jam_track_right + end + + if !jam_track_right.can_download && variant == ShoppingCart::JAMTRACK_STREAM + # if the user does have the track, but isn't upgrading it, bail + return jam_track_right + end # everything needs to go into a transaction! If anything goes wrong, we need to raise an exception to break it Sale.transaction do @@ -158,6 +174,11 @@ module JamRuby jam_track_right.redeemed = using_free_credit jam_track_right.version = jam_track.version end + + if variant == ShoppingCart::JAMTRACK_DOWNLOAD || variant == ShoppingCart::JAMTRACK_FULL + jam_track_right.can_download = true + jam_track_right.save + end end jam_track_right @@ -607,7 +628,8 @@ module JamRuby if shopping_cart.is_jam_track? jam_track = cart_product - if jam_track.right_for_user(current_user) + + if jam_track.right_for_user(current_user, shopping_cart.variant) # if the user already owns the JamTrack, we should just skip this cart item, and destroy it # if this occurs, we have to reload every shopping_cart as we iterate. so, we do at the top of the loop ShoppingCart.remove_jam_track_from_cart(current_user, shopping_cart) @@ -663,6 +685,13 @@ module JamRuby jam_track_right.version = jam_track.version end + + # deal with variant behavior + if shopping_cart.purchasing_downloadable_rights? + jam_track_right.can_download = true + jam_track_right.save + end + # also if the purchase was a free one, then: # first, mark the free has_redeemable_jamtrack field if that's still true # and if still they have more free things, then redeem the giftable_jamtracks diff --git a/ruby/lib/jam_ruby/models/sale_line_item.rb b/ruby/lib/jam_ruby/models/sale_line_item.rb index eb053e144..b7f45f53d 100644 --- a/ruby/lib/jam_ruby/models/sale_line_item.rb +++ b/ruby/lib/jam_ruby/models/sale_line_item.rb @@ -175,6 +175,7 @@ module JamRuby sale_line_item = SaleLineItem.new sale_line_item.product_type = shopping_cart.cart_type + sale_line_item.variant = shopping_cart.variant sale_line_item.unit_price = product_info[:price] sale_line_item.quantity = product_info[:quantity] sale_line_item.free = product_info[:marked_for_redeem] diff --git a/ruby/lib/jam_ruby/models/shopping_cart.rb b/ruby/lib/jam_ruby/models/shopping_cart.rb index d9bc80a87..035e4f559 100644 --- a/ruby/lib/jam_ruby/models/shopping_cart.rb +++ b/ruby/lib/jam_ruby/models/shopping_cart.rb @@ -10,6 +10,11 @@ module JamRuby PURCHASE_REASONS = [PURCHASE_NORMAL, PURCHASE_FREE, PURCHASE_FREE_CREDIT] + JAMTRACK_FULL = 'full' + JAMTRACK_STREAM = 'stream' + JAMTRACK_DOWNLOAD = 'download' + JAMTRACK_VARIANTS = ['full', 'stream', 'download'] + attr_accessible :quantity, :cart_type, :product_info attr_accessor :skip_mix_check @@ -22,13 +27,15 @@ module JamRuby validates :cart_type, presence: true validates :cart_class_name, presence: true validates :marked_for_redeem, numericality: {only_integer: true} + validates :variant, inclusion: {in: [nil, JAMTRACK_FULL, JAMTRACK_STREAM, JAMTRACK_DOWNLOAD]} + #validate :not_mixed default_scope { order('created_at DESC') } def product_info(instance = nil) product = self.cart_product - data = {type: cart_type, name: product.name, price: product.price, product_id: cart_id, plan_code: product.plan_code, real_price: real_price(product), total_price: total_price(product), quantity: quantity, marked_for_redeem: marked_for_redeem, free: free?, sales_region: product.sales_region, sale_display:product.sale_display, allow_free: allow_free(product)} unless product.nil? + data = {type: cart_type, name: product.name, price: product.variant_price(variant), product_id: cart_id, plan_code: product.plan_code, real_price: real_price(product), total_price: total_price(product), quantity: quantity, marked_for_redeem: marked_for_redeem, free: free?, sales_region: product.sales_region, sale_display:product.sale_display(variant), allow_free: allow_free(product)} unless product.nil? if data && instance data.merge!(instance.product_info) end @@ -37,12 +44,16 @@ module JamRuby # multiply quantity by price def total_price(product) - quantity * product.price + quantity * product.variant_price(variant) + end + + def purchasing_downloadable_rights? + is_jam_track? && (variant == ShoppingCart::JAMTRACK_DOWNLOAD || variant == ShoppingCart::JAMTRACK_FULL) end # multiply (quantity - redeemable) by price def real_price(product) - (quantity - marked_for_redeem) * product.price + (quantity - marked_for_redeem) * product.variant_price(variant) end def allow_free(product) @@ -101,7 +112,7 @@ module JamRuby end end - def self.create user, product, quantity = 1, mark_redeem = false + def self.create(user, product, quantity = 1, mark_redeem = false, variant = nil) cart = ShoppingCart.new if user.is_a?(User) @@ -111,6 +122,14 @@ module JamRuby end cart.cart_type = product.class::PRODUCT_TYPE + + if cart.cart_type == JamTrack::PRODUCT_TYPE && variant.nil? + cart.variant = JAMTRACK_STREAM # default to jamtrack 'stream' + else + cart.variant = variant + end + + cart.cart_class_name = product.class.name cart.cart_id = product.id cart.quantity = quantity @@ -158,9 +177,9 @@ module JamRuby shopping_carts.each do |shopping_cart| if shopping_cart.is_jam_track? mark_redeem = ShoppingCart.user_has_redeemable_jam_track?(user) - cart = ShoppingCart.create(user, shopping_cart.cart_product, shopping_cart.quantity, mark_redeem) + cart = ShoppingCart.create(user, shopping_cart.cart_product, shopping_cart.quantity, mark_redeem, shopping_cart.variant) else - cart = ShoppingCart.create(user, shopping_cart.cart_product, shopping_cart.quantity, false) + cart = ShoppingCart.create(user, shopping_cart.cart_product, shopping_cart.quantity, false, shopping_cart.variant) end end @@ -201,8 +220,13 @@ module JamRuby end # adds a jam_track to cart, checking for promotions - def self.add_jam_track_to_cart(any_user, jam_track, clear:false) + def self.add_jam_track_to_cart(any_user, jam_track, variant = JAMTRACK_FULL) cart = nil + + if variant.nil? + variant = JAMTRACK_FULL + end + ShoppingCart.transaction do # if clear @@ -213,7 +237,7 @@ module JamRuby end mark_redeem = jam_track.allow_free ? ShoppingCart.user_has_redeemable_jam_track?(any_user) : false - cart = ShoppingCart.create(any_user, jam_track, 1, mark_redeem) + cart = ShoppingCart.create(any_user, jam_track, 1, mark_redeem, variant) end any_user.reload cart diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 59803b48d..462a9aa45 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -784,6 +784,7 @@ FactoryGirl.define do sequence(:publisher) { |n| "publisher-#{n}" } sales_region 'United States' price 1.99 + download_price 4.99 reproduction_royalty true public_performance_royalty true reproduction_royalty_amount 0.999 diff --git a/ruby/spec/jam_ruby/models/sale_spec.rb b/ruby/spec/jam_ruby/models/sale_spec.rb index a0d8077d3..4c8b45dc8 100644 --- a/ruby/spec/jam_ruby/models/sale_spec.rb +++ b/ruby/spec/jam_ruby/models/sale_spec.rb @@ -486,7 +486,7 @@ describe Sale do purchase= adjustments[0] purchase.unit_amount_in_cents.should eq((jamtrack.price * 100).to_i) purchase.accounting_code.should eq(ShoppingCart::PURCHASE_NORMAL) - purchase.description.should eq("JamTrack: " + jamtrack.name) + purchase.description.should eq("JamTrack: " + jamtrack.name + '- FOR USE ONLY WITHIN APP') purchase.state.should eq('invoiced') purchase.uuid.should eq(sale_line_item.recurly_adjustment_uuid) diff --git a/ruby/spec/jam_ruby/models/shopping_cart_spec.rb b/ruby/spec/jam_ruby/models/shopping_cart_spec.rb index 15cfdfd2d..7ac7911be 100644 --- a/ruby/spec/jam_ruby/models/shopping_cart_spec.rb +++ b/ruby/spec/jam_ruby/models/shopping_cart_spec.rb @@ -32,11 +32,11 @@ describe ShoppingCart do end it "allows mix of free and not free stuff" do - cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track, clear: true) + cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track) cart1.should_not be_nil cart1.errors.any?.should be_false user.reload - cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track, clear: true) + cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track) cart2.errors.any?.should be_false user.reload user.shopping_carts.length.should eq(1) @@ -44,7 +44,7 @@ describe ShoppingCart do cart3.errors.any?.should be_false user.reload user.shopping_carts.length.should eq(2) - cart4 = ShoppingCart.add_jam_track_to_cart(user, jam_track2, clear: true) + cart4 = ShoppingCart.add_jam_track_to_cart(user, jam_track2) cart4.errors.any?.should be_false user.reload user.shopping_carts.length.should eq(3) @@ -70,12 +70,12 @@ describe ShoppingCart do it "removes redeemable item to shopping cart (maintains only one in cart)" do user.has_redeemable_jamtrack.should be_true - cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track, clear: true) + cart1 = ShoppingCart.add_jam_track_to_cart(user, jam_track) cart1.should_not be_nil cart1.errors.any?.should be_false cart1.marked_for_redeem.should eq(1) user.reload - cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track2, clear: true) + cart2 = ShoppingCart.add_jam_track_to_cart(user, jam_track2) cart2.should_not be_nil cart2.errors.any?.should be_false cart2.marked_for_redeem.should eq(1) diff --git a/web/app/assets/javascripts/helpBubbleHelper.js b/web/app/assets/javascripts/helpBubbleHelper.js index ae5713c90..4ada2663c 100644 --- a/web/app/assets/javascripts/helpBubbleHelper.js +++ b/web/app/assets/javascripts/helpBubbleHelper.js @@ -188,6 +188,37 @@ return context.JK.prodBubble($element, 'teacher-profile', {}, bigHelpDarkOptions({spikeGirth:0, spikeLength: 0, duration:10000, offsetParent:$offsetParent, width:385, positions:['top', 'right', 'bottom']})) } + helpBubble.jamtrackVariants = function($element, $offsetParent) { + var offer = function() { + console.log("jamtrackVariant turn off") + $element.btOff() + $offsetParent.off('click', offer) + } + + var bubble = context.JK.prodBubble($element, 'jamtrack-variants', {}, bigHelpDarkOptions({clickAnywhereToClose: true, spikeGirth:0, spikeLength: 0, duration:20000, positions:['bottom', 'right', 'left'], offsetParent: $offsetParent})) + setTimeout(function() { + $offsetParent.on('click', offer) + }, 1) + + return bubble + } + + helpBubble.jamtrackUpgrade = function($element, $offsetParent) { + var offer = function() { + console.log("jamtrackUpgrade turn off") + $element.btOff() + $offsetParent.off('click', offer) + } + + var bubble = context.JK.prodBubble($element, 'jamtrack-upgrade', {}, bigHelpDarkOptions({clickAnywhereToClose: true, spikeGirth:0, spikeLength: 0, duration:20000, positions:['bottom', 'right', 'left'], offsetParent: $offsetParent})) + setTimeout(function() { + $offsetParent.on('click', offer) + }, 1) + + return bubble + } + + helpBubble.showUseRemainingTestDrives = function($element, $offsetParent, user, callback) { return context.JK.onceBubble($element, 'side-remaining-test-drives', user, {offsetParent:$offsetParent, width:260, positions:['right'], postShow: function(container) { diff --git a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee index b5500904e..d759547a7 100644 --- a/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackFilterScreen.js.jsx.coffee @@ -73,13 +73,37 @@ MIX_MODES = context.JK.MIX_MODES actionBtn = null if jamtrack.purchased - actionBtn = `PURCHASED` + if jamtrack.can_download + actionBtn = `PURCHASED` + else + priceNotice = `
$ {Number(jamtrack.upgrade_price).toFixed(2)}
` + actionBtn = `
+
+ {priceNotice} + UPGRADE TO FULL +
+ HELP +
` + + else if jamtrack.is_free - actionBtn = `GET IT FREE!` + actionBtn = `GET IT FREE!` else if jamtrack.added_cart actionBtn = `ALREADY IN CART` else - actionBtn = `ADD TO CART` + priceNotice = `
$ {jamtrack.price}
` + fullPriceNotice = `
$ {jamtrack.download_price}
` + actionBtn = `
+
+ {priceNotice} + ADD TO CART +
+
+ {fullPriceNotice} + ADD TO CART (FULL) +
+ HELP +
` availabilityNotice = null if jamtrack.sales_region==context.JK.AVAILABILITY_US @@ -114,7 +138,6 @@ MIX_MODES = context.JK.MIX_MODES
-
$ {jamtrack.price}
{actionBtn} {availabilityNotice}
@@ -300,6 +323,7 @@ MIX_MODES = context.JK.MIX_MODES e.preventDefault() $target = $(e.target) params = id: $target.attr('data-jamtrack-id') + params.variant = $target.attr('data-variant') isFree = $(e.target).is('.is_free') @rest.addJamtrackToShoppingCart(params).done((response) => @@ -322,6 +346,18 @@ MIX_MODES = context.JK.MIX_MODES $parent.find('.jamtrack-add-cart').on 'click', @addToCartJamtrack $parent.find('.license-us-why').on 'click', @licenseUSWhy $parent.find('.jamtrack-detail-btn').on 'click', @toggleExpanded + $parent.find('.jamtrack-variant-help').on 'click', @showVariantHelp + $parent.find('.jamtrack-upgrade-help').on 'click', @showUpgradeHelp + + showVariantHelp: (e) -> + $screen = $('#jamtrackFilter') + e.preventDefault() + context.JK.HelpBubbleHelper.jamtrackVariants($(e.target), $screen) + + showUpgradeHelp: (e) -> + $screen = $('#jamtrackFilter') + e.preventDefault() + context.JK.HelpBubbleHelper.jamtrackUpgrade($(e.target), $screen) toggleExpanded:(e) -> e.preventDefault() diff --git a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee index b7f62b7f8..4653ed190 100644 --- a/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/JamTrackSearchScreen.js.jsx.coffee @@ -95,13 +95,37 @@ MIX_MODES = context.JK.MIX_MODES actionBtn = null if jamtrack.purchased - actionBtn = `PURCHASED` + if jamtrack.can_download + actionBtn = `PURCHASED` + else + priceNotice = `
$ {Number(jamtrack.upgrade_price).toFixed(2)}
` + actionBtn = `
+
+ {priceNotice} + UPGRADE TO FULL +
+ HELP +
` + + else if jamtrack.is_free - actionBtn = `GET IT FREE!` + actionBtn = `GET IT FREE!` else if jamtrack.added_cart actionBtn = `ALREADY IN CART` else - actionBtn = `ADD TO CART` + priceNotice = `
$ {jamtrack.price}
` + fullPriceNotice = `
$ {jamtrack.download_price}
` + actionBtn = `
+
+ {priceNotice} + ADD TO CART +
+
+ {fullPriceNotice} + ADD TO CART (FULL) +
+ HELP +
` availabilityNotice = null if jamtrack.sales_region==context.JK.AVAILABILITY_US @@ -136,7 +160,6 @@ MIX_MODES = context.JK.MIX_MODES
-
$ {jamtrack.price}
{actionBtn} {availabilityNotice}
@@ -440,6 +463,7 @@ MIX_MODES = context.JK.MIX_MODES e.preventDefault() $target = $(e.target) params = id: $target.attr('data-jamtrack-id') + params.variant = $target.attr('data-variant') isFree = $(e.target).is('.is_free') @rest.addJamtrackToShoppingCart(params).done((response) => @@ -475,6 +499,18 @@ MIX_MODES = context.JK.MIX_MODES $parent.find('.jamtrack-add-cart').on 'click', @addToCartJamtrack $parent.find('.license-us-why').on 'click', @licenseUSWhy $parent.find('.jamtrack-detail-btn').on 'click', @toggleExpanded + $parent.find('.jamtrack-variant-help').on 'click', @showVariantHelp + $parent.find('.jamtrack-upgrade-help').on 'click', @showUpgradeHelp + + showVariantHelp: (e) -> + $screen = $('#jamtrackSearch') + e.preventDefault() + context.JK.HelpBubbleHelper.jamtrackVariants($(e.target), $screen) + + showUpgradeHelp: (e) -> + $screen = $('#jamtrackSearch') + e.preventDefault() + context.JK.HelpBubbleHelper.jamtrackUpgrade($(e.target), $screen) toggleExpanded:(e) -> e.preventDefault() diff --git a/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee index 6e158139e..2a5411a8f 100644 --- a/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupJamTrackPlayer.js.jsx.coffee @@ -592,6 +592,37 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) # make this package the active one JamTrackPlayerActions.openStem(selectedTrackId) + addUpgradeToCart: (jamtrack) -> + console.log("adding upgrade to cart") + + params = {id: jamtrack.id, variant: 'download'} + + rest.addJamtrackToShoppingCart(params).done((response) => + console.log("added item to shopping cart. fast_redeem? " + response.fast_redeem) + if response.fast_reedem + if context.JK.currentUserId? + window.open('/client#/redeemComplete') + else + window.open('/client#/redeemSignup') + else + window.open('/client#/shoppingCart') + + ).fail(((jqxhr) => + + handled = false + if jqxhr.status == 422 + body = JSON.parse(jqxhr.responseText) + if body.errors?.cart_id?[0] == 'has already been taken' + console.log("already taken, just show shopping cart") + window.open('/client#/shoppingCart') + return + else if body.errors && body.errors.base + handled = true + alert("You can not have a mix of free and non-free items in your shopping cart.\n\nIf you want to add this new item to your shopping cart, then clear out all current items by clicking on the shopping cart icon and clicking 'delete' next to each item.") + if !handled + alert("Error adding to shoppig cart. " + jqxhr.responseText) + )) + downloadStem: (e) -> if @verificationCheck() e.preventDefault() @@ -601,6 +632,12 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) selectedTrackId = $select.val() + if !@state.jamTrackState.jamTrack.can_download + e.preventDefault() + if confirm("You have not purchased the rights to download a JamTrack. Add them to your shopping cart?") + @addUpgradeToCart(@state.jamTrackState.jamTrack) + return + if !selectedTrackId? || selectedTrackId == '' e.preventDefault() alert("You must select a track in order to download and also click the folder icon.") @@ -658,6 +695,13 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) e.preventDefault() return + if !@state.jamTrackState.jamTrack.can_download + e.preventDefault() + if confirm("You have not purchased the rights to download a JamTrack. Add them to your shopping cart?") + @addUpgradeToCart(@state.jamTrackState.jamTrack) + + return + if /iPhone|iPad|iPod/i.test(navigator.userAgent) # fall through diff --git a/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee b/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee index 63da519aa..4f845d8df 100644 --- a/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/PopupMediaControls.js.jsx.coffee @@ -1,7 +1,7 @@ context = window logger = context.JK.logger ReactCSSTransitionGroup = React.addons.CSSTransitionGroup; - +rest = context.JK.Rest() mixins = [] @@ -523,12 +523,49 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) return if @verificationCheck() + if !@state.jamTrackState.jamTrack.can_download + e.preventDefault() + if confirm("You have not purchased the rights to download a JamTrack. Add them to your shopping cart?") + @addUpgradeToCart(@state.jamTrackState.jamTrack) + return + new window.Fingerprint2().get((result, components) => ( redirectTo = "/api/jamtracks/#{jamTrack.id}/stems/master/download.mp3?file_type=mp3&download=1&mark=#{result}" redirectTo = encodeURIComponent(redirectTo) AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + "/signin?redirect-to=#{redirectTo}") )) + addUpgradeToCart: (jamtrack) -> + console.log("adding upgrade to cart") + + params = {id: jamtrack.id, variant: 'download'} + + rest.addJamtrackToShoppingCart(params).done((response) => + console.log("added item to shopping cart. fast_redeem? " + response.fast_redeem) + if response.fast_reedem + if context.JK.currentUserId? + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + '/client#/redeemComplete') + else + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + '/client#/redeemSignup') + else + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + '/client#/shoppingCart') + + ).fail(((jqxhr) => + + handled = false + if jqxhr.status == 422 + body = JSON.parse(jqxhr.responseText) + if body.errors?.cart_id?[0] == 'has already been taken' + console.log("already taken, just show shopping cart") + AppActions.openExternalUrl(window.location.protocol + '//' + window.location.host + '/client#/shoppingCart') + return + else if body.errors && body.errors.base + handled = true + alert("You can not have a mix of free and non-free items in your shopping cart.\n\nIf you want to add this new item to your shopping cart, then clear out all current items by clicking on the shopping cart icon and clicking 'delete' next to each item.") + if !handled + alert("Error adding to shoppig cart. " + jqxhr.responseText) + )) + stemChanged:() -> stemDownload: (e) -> e.preventDefault() @@ -537,6 +574,12 @@ mixins.push(Reflux.listenTo(UserStore, 'onUserChanged')) $select = $(this.getDOMNode()).find('.active-stem-select') + if !@state.jamTrackState.jamTrack.can_download + e.preventDefault() + if confirm("You have not purchased the rights to download a JamTrack. Add them to your shopping cart?") + @addUpgradeToCart(@state.jamTrackState.jamTrack) + return + selectedTrackId = $select.val() if !selectedTrackId? || selectedTrackId == '' diff --git a/web/app/assets/javascripts/react-components/landing/JamClassAffiliateLandingBottomPage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/JamClassAffiliateLandingBottomPage.js.jsx.coffee index 204353571..5ae864747 100644 --- a/web/app/assets/javascripts/react-components/landing/JamClassAffiliateLandingBottomPage.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/JamClassAffiliateLandingBottomPage.js.jsx.coffee @@ -98,7 +98,7 @@ rest = context.JK.Rest()
  • And more…
  • - JamTracks sell for $1.99 each. Musicians love to play with these, and typically buy a few at a + JamTracks sell for $1.99 each ($4.99 to include ability to download). Musicians love to play with these, and typically buy a few at a time. Imagine that you are selling a set of guitar strings to an electric guitar player. As a diff --git a/web/app/assets/javascripts/react-components/landing/JamTrackCta.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/JamTrackCta.js.jsx.coffee index 490751fd5..1d2cdea72 100644 --- a/web/app/assets/javascripts/react-components/landing/JamTrackCta.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/JamTrackCta.js.jsx.coffee @@ -72,7 +72,7 @@ rest = context.JK.Rest() {img} - $1.99 value + #{this.props.jam_track.download_price} value


    diff --git a/web/app/assets/javascripts/react-components/landing/JamTrackLandingPage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/JamTrackLandingPage.js.jsx.coffee index b3a19c414..0ccbe995e 100644 --- a/web/app/assets/javascripts/react-components/landing/JamTrackLandingPage.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/JamTrackLandingPage.js.jsx.coffee @@ -35,10 +35,10 @@ rest = context.JK.Rest() if loggedIn loggedInCtaButton = `` if !@isFree() - loggedInPriceAdvisory = `
    ${this.props.jam_track.price}
    ` + loggedInPriceAdvisory = `
    ${this.props.jam_track.download_price}
    ` else if !@isFree() - loggedOutPriceAdvisory = `
    ${this.props.jam_track.price}
    ` + loggedOutPriceAdvisory = `
    ${this.props.jam_track.download_price}
    ` if this.state.loginErrors? for key, value of this.state.loginErrors diff --git a/web/app/assets/javascripts/react-components/landing/ProductJamBlasterBottomPage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/ProductJamBlasterBottomPage.js.jsx.coffee index 44fae616f..a56e46588 100644 --- a/web/app/assets/javascripts/react-components/landing/ProductJamBlasterBottomPage.js.jsx.coffee +++ b/web/app/assets/javascripts/react-components/landing/ProductJamBlasterBottomPage.js.jsx.coffee @@ -108,7 +108,7 @@ context = window