diff options
author | azul <azul@leap.se> | 2015-10-19 11:19:43 +0200 |
---|---|---|
committer | azul <azul@leap.se> | 2015-10-19 11:19:43 +0200 |
commit | 04302654c223dba1c9a06922afaa7462966ea122 (patch) | |
tree | edd493015ce03bb1fb80cc61aa3076fdf8fc467f /engines/billing/app/controllers | |
parent | c2cc1a48a4faeff4088cdf5f56e6b0382acfb346 (diff) | |
parent | 8abadb0fe7618e978d9d297ce62fb6c0228c7191 (diff) |
Merge pull request #198 from claucece/develop
Braintree_implementation
Diffstat (limited to 'engines/billing/app/controllers')
6 files changed, 105 insertions, 157 deletions
diff --git a/engines/billing/app/controllers/billing_admin_controller.rb b/engines/billing/app/controllers/billing_admin_controller.rb index e11d4ee..23740d6 100644 --- a/engines/billing/app/controllers/billing_admin_controller.rb +++ b/engines/billing/app/controllers/billing_admin_controller.rb @@ -1,6 +1,9 @@ class BillingAdminController < BillingBaseController before_filter :require_admin + #not sure if this controller is still needed. Admin can easly acess + #braintree's dashboard and check subscriptions. Don't know if everything + #should be 'self contained' in web_app"" def show br_atleast_90_days = Braintree::Subscription.search do |search| diff --git a/engines/billing/app/controllers/billing_base_controller.rb b/engines/billing/app/controllers/billing_base_controller.rb index 0453677..c343938 100644 --- a/engines/billing/app/controllers/billing_base_controller.rb +++ b/engines/billing/app/controllers/billing_base_controller.rb @@ -13,6 +13,9 @@ class BillingBaseController < ApplicationController elsif params[:id] @user = User.find(params[:id]) else + #not sure if this is still needed. Donations work with either customer or + #anonymous_user. Subscriptions work with customer. Customer belongs to + #user. # TODO # hacky, what are cases where @user hasn't yet been set? certainly some cases with subscriptions and payments @user = current_user diff --git a/engines/billing/app/controllers/credit_card_info_controller.rb b/engines/billing/app/controllers/credit_card_info_controller.rb deleted file mode 100644 index fbaa6f1..0000000 --- a/engines/billing/app/controllers/credit_card_info_controller.rb +++ /dev/null @@ -1,35 +0,0 @@ -class CreditCardInfoController < ApplicationController - before_filter :require_login, :set_user - - def edit - @credit_card = Braintree::CreditCard.find(params[:id]) - customer = Customer.find_by_user_id(@user.id) - if customer and customer.braintree_customer_id == @credit_card.customer_id - @tr_data = Braintree::TransparentRedirect. - update_credit_card_data(:redirect_url => confirm_credit_card_info_url, - :payment_method_token => @credit_card.token) - else - access_denied - end - - end - - def confirm - @result = Braintree::TransparentRedirect.confirm(request.query_string) - if @result.success? - render :action => "confirm" - else - @credit_card = Braintree::CreditCard.find(@result.params[:payment_method_token]) - render :action => "edit" - end - end - - - private - - def set_user - # this assumes anybody, even an admin, will not access for another user. - @user = current_user - end - -end diff --git a/engines/billing/app/controllers/customer_controller.rb b/engines/billing/app/controllers/customer_controller.rb deleted file mode 100644 index 6cbcb44..0000000 --- a/engines/billing/app/controllers/customer_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class CustomerController < BillingBaseController - before_filter :require_login, :fetch_customer - - def show - if @customer - @customer.with_braintree_data! - @default_cc = @customer.default_credit_card - @active_subscription = @customer.subscriptions - @transactions = @customer.braintree_customer.transactions - end - end - - def new - if @customer.has_payment_info? - redirect_to edit_customer_path(@user), :notice => 'Here is your saved customer data' - else - fetch_new_transparent_redirect_data - end - end - - def edit - fetch_edit_transparent_redirect_data - end - - def confirm - @result = Braintree::TransparentRedirect.confirm(request.query_string) - if @result.success? - @customer.braintree_customer = @result.customer - @customer.save - render :action => "confirm" - elsif @customer.has_payment_info? - fetch_edit_transparent_redirect_data - render :action => "edit" - else - fetch_new_transparent_redirect_data - render :action => "new" - end - end - - protected - - def fetch_new_transparent_redirect_data - access_denied unless @user == current_user # admins cannot do this for others - @tr_data = Braintree::TransparentRedirect. - create_customer_data(:redirect_url => confirm_customer_url) - end - - def fetch_edit_transparent_redirect_data - access_denied unless @user == current_user # admins cannot do this for others - @customer.with_braintree_data! - @default_cc = @customer.default_credit_card - @tr_data = Braintree::TransparentRedirect. - update_customer_data(:redirect_url => confirm_customer_url, - :customer_id => @customer.braintree_customer_id) ##?? - end - - def fetch_customer - @customer = Customer.find_by_user_id(@user.id) - if @user == current_user - @customer ||= Customer.new(user: @user) - end - access_denied unless (@customer and (@customer.user == current_user)) or admin? - end -end diff --git a/engines/billing/app/controllers/payments_controller.rb b/engines/billing/app/controllers/payments_controller.rb index fce6570..871f1b4 100644 --- a/engines/billing/app/controllers/payments_controller.rb +++ b/engines/billing/app/controllers/payments_controller.rb @@ -2,19 +2,14 @@ class PaymentsController < BillingBaseController before_filter :require_login, :only => [:index] def new - fetch_transparent_redirect - end - - def confirm - @result = Braintree::TransparentRedirect.confirm(request.query_string) - if @result.success? - render :action => "confirm" + if current_user.has_payment_info? + @client_token = Braintree::ClientToken.generate(customer_id: current_user.braintree_customer_id) else - fetch_transparent_redirect - render :action => "new" - end + @client_token = Braintree::ClientToken.generate + end end +# not sure if this should be kept def index access_denied unless admin? or (@user == current_user) customer = Customer.find_by_user_id(@user.id) @@ -23,12 +18,49 @@ class PaymentsController < BillingBaseController @transactions = braintree_data.transactions end - protected + def confirm + make_transaction + if @result.success? + flash[:success] = I18n.t(:donation_sucess) + else + flash[:error] = I18n.t(:donation_not_sucess) + end + redirect_to action: :new, locale: params[:locale] + end - def fetch_transparent_redirect - @tr_data = Braintree::TransparentRedirect.transaction_data redirect_url: confirm_payment_url, - transaction: { type: "sale", options: {submit_for_settlement: true } } + private + def make_transaction + if current_user.has_payment_info? + transact_without_user_info + elsif current_user.is_anonymous? + transact_without_user_info + else + transact_with_user_info + end end + def transact_with_user_info + @result = Braintree::Transaction.sale( + amount: params[:amount], + payment_method_nonce: params[:payment_method_nonce], + customer: { + first_name: params[:first_name], + last_name: params[:last_name], + company: params[:company], + email: current_user.email, + phone: params[:phone] + }, + options: { + store_in_vault: true + }) + current_user.update_attributes(braintree_customer_id: @result.transaction.customer_details.id) if @result.success? + end + + def transact_without_user_info + @result = Braintree::Transaction.sale( + amount: params[:amount], + payment_method_nonce: params[:payment_method_nonce], + ) + end end diff --git a/engines/billing/app/controllers/subscriptions_controller.rb b/engines/billing/app/controllers/subscriptions_controller.rb index f066b3c..1d29cac 100644 --- a/engines/billing/app/controllers/subscriptions_controller.rb +++ b/engines/billing/app/controllers/subscriptions_controller.rb @@ -1,63 +1,72 @@ class SubscriptionsController < BillingBaseController before_filter :require_login - before_filter :fetch_subscription, :only => [:show, :destroy] - before_filter :confirm_cancel_subscription, :only => [:destroy] - before_filter :confirm_self_or_admin, :only => [:index] - before_filter :confirm_no_pending_active_pastdue_subscription, :only => [:new, :create] - # for now, admins cannot create or destroy subscriptions for others: - before_filter :confirm_self, :only => [:new, :create] + before_filter :assign_user + before_filter :confirm_cancel_subscription, only: [:destroy] + before_filter :generate_client_token, only: [:show] + before_filter :get_braintree_customer, only: [:subscribe] - def new - # don't show link to subscribe if they are already subscribed? - credit_card = @customer.default_credit_card #safe to assume default? - @payment_method_token = credit_card.token - @plans = Braintree::Plan.all + def index + if @user.subscription_id + @subscription = Braintree::Subscription.find @user.subscription_id + @plan = Braintree::Plan.all.select{ |plan| plan.id == @subscription.plan_id }.first + else + @subscriptions = Braintree::Plan.all + end end - # show has no content, so not needed at this point. - - def create - @result = Braintree::Subscription.create( :payment_method_token => params[:payment_method_token], :plan_id => params[:plan_id] ) - #if you want to test pastdue, can add :price => '2001', :trial_period => true,:trial_duration => 1,:trial_duration_unit => "day" and then wait a day + def show + @plan = Braintree::Plan.all.select{ |plan| plan.id == params[:id] }.first end - def destroy - @result = Braintree::Subscription.cancel params[:id] + def subscribe + @result = Braintree::Subscription.create(payment_method_token: @customer.payment_methods.first.token, + plan_id: params[:id]) + if @result.success? + @user.update_attributes subscription_id: @result.subscription.id + flash[:success] = I18n.t(:subscription_sucess) + else + flash[:error] = I18n.t(:subscription_not_sucess) + end + redirect_to action: :index, locale: params[:locale] end - def index - customer = Customer.find_by_user_id(@user.id) - @subscriptions = customer.subscriptions(nil, false) + def unsubscribe + @result = Braintree::Subscription.cancel(@user.subscription_id) + if @result.success? + @user.update_attributes subscription_id: nil + flash[:success] = I18n.t(:unsubscription_sucess) + else + flash[:error] = I18n.t(:unsubscription_not_sucess) + end + redirect_to action: :index, locale: params[:locale] end private - - def fetch_subscription - @subscription = Braintree::Subscription.find params[:id] - @credit_card = Braintree::CreditCard.find @subscription.payment_method_token - @subscription_customer_id = @credit_card.customer_id - current_user_customer = Customer.find_by_user_id(current_user.id) - access_denied unless admin? or (current_user_customer and current_user_customer.braintree_customer_id == @subscription_customer_id) - - end - - def confirm_cancel_subscription - access_denied unless view_context.allow_cancel_subscription(@subscription) + def assign_user + @user = current_user end - def confirm_no_pending_active_pastdue_subscription - @customer = Customer.find_by_user_id(@user.id) - if subscription = @customer.subscriptions # will return pending, active or pastdue subscription, if it exists - redirect_to user_subscription_path(@user, subscription.id), :notice => 'You already have a subscription' + def generate_client_token + if current_user.braintree_customer_id + @client_token = Braintree::ClientToken.generate(customer_id: current_user.braintree_customer_id) + else + @client_token = Braintree::ClientToken.generate end end - def confirm_self - @user == current_user - end - - def confirm_self_or_admin - access_denied unless confirm_self or admin? + def get_braintree_customer + if current_user.braintree_customer_id + @customer = Braintree::Customer.find(current_user.braintree_customer_id) + else + @customer = Braintree::Customer.create( + payment_method_nonce: params[:payment_method_nonce], + first_name: params[:first_name], + last_name: params[:last_name], + company: params[:company], + email: current_user.email, + phone: params[:phone] + ).customer + current_user.update_attributes braintree_customer_id: @customer.id + end end - end |