summaryrefslogtreecommitdiff
path: root/engines/billing/app/controllers
diff options
context:
space:
mode:
authorazul <azul@leap.se>2015-10-19 11:19:43 +0200
committerazul <azul@leap.se>2015-10-19 11:19:43 +0200
commit04302654c223dba1c9a06922afaa7462966ea122 (patch)
treeedd493015ce03bb1fb80cc61aa3076fdf8fc467f /engines/billing/app/controllers
parentc2cc1a48a4faeff4088cdf5f56e6b0382acfb346 (diff)
parent8abadb0fe7618e978d9d297ce62fb6c0228c7191 (diff)
Merge pull request #198 from claucece/develop
Braintree_implementation
Diffstat (limited to 'engines/billing/app/controllers')
-rw-r--r--engines/billing/app/controllers/billing_admin_controller.rb3
-rw-r--r--engines/billing/app/controllers/billing_base_controller.rb3
-rw-r--r--engines/billing/app/controllers/credit_card_info_controller.rb35
-rw-r--r--engines/billing/app/controllers/customer_controller.rb64
-rw-r--r--engines/billing/app/controllers/payments_controller.rb60
-rw-r--r--engines/billing/app/controllers/subscriptions_controller.rb97
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