summaryrefslogtreecommitdiff
path: root/billing/app/controllers
diff options
context:
space:
mode:
Diffstat (limited to 'billing/app/controllers')
-rw-r--r--billing/app/controllers/billing_base_controller.rb11
-rw-r--r--billing/app/controllers/credit_card_info_controller.rb34
-rw-r--r--billing/app/controllers/customer_controller.rb61
-rw-r--r--billing/app/controllers/payments_controller.rb46
-rw-r--r--billing/app/controllers/subscriptions_controller.rb45
5 files changed, 197 insertions, 0 deletions
diff --git a/billing/app/controllers/billing_base_controller.rb b/billing/app/controllers/billing_base_controller.rb
new file mode 100644
index 0000000..dc15194
--- /dev/null
+++ b/billing/app/controllers/billing_base_controller.rb
@@ -0,0 +1,11 @@
+class BillingBaseController < ApplicationController
+ before_filter :assign_user
+
+ helper 'billing'
+
+ # required for navigation to work.
+ def assign_user
+ @user = current_user
+ end
+
+end
diff --git a/billing/app/controllers/credit_card_info_controller.rb b/billing/app/controllers/credit_card_info_controller.rb
new file mode 100644
index 0000000..75865fe
--- /dev/null
+++ b/billing/app/controllers/credit_card_info_controller.rb
@@ -0,0 +1,34 @@
+class CreditCardInfoController < ApplicationController
+ before_filter :authorize, :set_user
+
+ def edit
+ @credit_card = Braintree::CreditCard.find(params[:id])
+ customer = Customer.find_by_user_id(current_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
+ @user = current_user
+ end
+
+end
diff --git a/billing/app/controllers/customer_controller.rb b/billing/app/controllers/customer_controller.rb
new file mode 100644
index 0000000..14ea8a7
--- /dev/null
+++ b/billing/app/controllers/customer_controller.rb
@@ -0,0 +1,61 @@
+class CustomerController < BillingBaseController
+ before_filter :authorize
+ def show
+ customer.with_braintree_data!
+ @default_cc = customer.default_credit_card #TODO not actually right way
+ @active_subscription = customer.subscriptions
+ @transactions = customer.braintree_customer.transactions
+ end
+
+ def new
+ if customer.has_payment_info?
+ redirect_to edit_customer_path(customer), :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
+ @tr_data = Braintree::TransparentRedirect.
+ create_customer_data(:redirect_url => confirm_customer_url)
+ end
+
+ def fetch_edit_transparent_redirect_data
+ 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 customer
+ @customer ||= Customer.find(params[:id]) if params[:id] # edit, show
+ @customer ||= Customer.find_by_user_id(current_user.id) # confirm
+ @customer ||= Customer.new(user: current_user)
+ # TODO will want case for admins, presumably
+ access_denied unless @customer.user == current_user
+ return @customer
+ end
+end
diff --git a/billing/app/controllers/payments_controller.rb b/billing/app/controllers/payments_controller.rb
new file mode 100644
index 0000000..224b78e
--- /dev/null
+++ b/billing/app/controllers/payments_controller.rb
@@ -0,0 +1,46 @@
+class PaymentsController < BillingBaseController
+ before_filter :authorize, :only => [:index]
+
+ def new
+ fetch_transparent_redirect
+ end
+
+ def confirm
+ @result = Braintree::TransparentRedirect.confirm(request.query_string)
+ if @result.success?
+ render :action => "confirm"
+ else
+ fetch_transparent_redirect
+ render :action => "new"
+ end
+ end
+
+ def index
+ customer = Customer.find_by_user_id(current_user.id)
+ braintree_data = Braintree::Customer.find(customer.braintree_customer_id)
+ # these will be ordered by created_at descending, per http://stackoverflow.com/questions/16425475/
+ @transactions = braintree_data.transactions
+ end
+
+ protected
+
+
+ def fetch_transparent_redirect
+ if @user = current_user #set user for navigation
+ if @customer = Customer.find_by_user_id(current_user.id)
+ @customer.with_braintree_data!
+ braintree_customer_id = @customer.braintree_customer_id
+ @default_cc = @customer.default_credit_card
+ else
+ # TODO: this requires user to add self to vault before making payment. Is that desired functionality?
+ redirect_to new_customer_path, :notice => 'Before making payment, please add your customer data'
+ end
+ end
+
+ # TODO: What is this supposed to do if braintree_customer_id was not set yet?
+ # Response: it can be used to make a payment that is not attributed to any customer (ie, a donation)
+ @tr_data = Braintree::TransparentRedirect.transaction_data redirect_url: confirm_payment_url,
+ transaction: { type: "sale", customer_id: braintree_customer_id, options: {submit_for_settlement: true } }
+ end
+
+end
diff --git a/billing/app/controllers/subscriptions_controller.rb b/billing/app/controllers/subscriptions_controller.rb
new file mode 100644
index 0000000..38dbff1
--- /dev/null
+++ b/billing/app/controllers/subscriptions_controller.rb
@@ -0,0 +1,45 @@
+class SubscriptionsController < BillingBaseController
+ before_filter :authorize
+ before_filter :fetch_subscription, :only => [:show, :destroy]
+ before_filter :confirm_no_active_subscription, :only => [:new, :create]
+
+ 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
+ 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] )
+ end
+
+ def destroy
+ @result = Braintree::Subscription.cancel params[:id]
+ end
+
+ def index
+ customer = Customer.find_by_user_id(current_user.id)
+ @subscriptions = customer.subscriptions(nil, false)
+ end
+
+ private
+
+ def fetch_subscription
+ @subscription = Braintree::Subscription.find params[:id]
+ @subscription_customer_id = @subscription.transactions.first.customer_details.id #all of subscriptions transactions should have same customer
+ @customer = Customer.find_by_user_id(current_user.id)
+ access_denied unless @customer and @customer.braintree_customer_id == @subscription_customer_id
+ # TODO: will presumably want to allow admins to view/cancel subscriptions for all users
+ end
+
+ def confirm_no_active_subscription
+ @customer = Customer.find_by_user_id(current_user.id)
+ if subscription = @customer.subscriptions # will return active subscription, if it exists
+ redirect_to subscription_path(subscription.id), :notice => 'You already have an active subscription'
+ end
+ end
+
+end