diff --git a/Gemfile b/Gemfile index f6445e486..85fd26a0c 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,9 @@ gem 'rails', '~> 4.2.3' gem 'rails-api' gem 'spring', :group => :development +# payments +gem 'stripe' + # persistance gem 'pg' gem 'foreigner' diff --git a/Gemfile.lock b/Gemfile.lock index 0fcda718d..ee0e3e67f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -83,6 +83,8 @@ GEM rails (< 6) diff-lcs (1.2.5) docile (1.1.5) + domain_name (0.5.20160310) + unf (>= 0.0.5, < 1.0.0) erubis (2.7.0) factory_girl (4.5.0) activesupport (>= 3.0.0) @@ -99,6 +101,8 @@ GEM activesupport (>= 3) hashie (3.4.2) highline (1.7.2) + http-cookie (1.0.2) + domain_name (~> 0.5) i18n (0.7.0) json (1.8.3) loofah (2.0.2) @@ -126,6 +130,7 @@ GEM net-ssh (2.9.2) net-ssh-gateway (1.2.0) net-ssh (>= 2.6.5) + netrc (0.11.0) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) omniauth (1.2.2) @@ -192,6 +197,10 @@ GEM redcarpet (3.3.3) responders (2.1.0) railties (>= 4.2.0, < 5) + rest-client (1.8.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 3.0) + netrc (~> 0.7) rspec-core (3.3.1) rspec-support (~> 3.3.0) rspec-expectations (3.3.0) @@ -227,12 +236,17 @@ GEM actionpack (>= 3.0) activesupport (>= 3.0) sprockets (>= 2.8, < 4.0) + stripe (1.41.0) + rest-client (~> 1.4) thor (0.19.1) thread_safe (0.3.5) tilt (2.0.1) timecop (0.7.4) tzinfo (1.2.2) thread_safe (~> 0.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.2) warden (1.2.6) rack (>= 1.0) @@ -274,4 +288,5 @@ DEPENDENCIES simplecov sinatra spring + stripe timecop diff --git a/app/controllers/buckets_controller.rb b/app/controllers/buckets_controller.rb index 809f4c25d..a67c1f3a4 100644 --- a/app/controllers/buckets_controller.rb +++ b/app/controllers/buckets_controller.rb @@ -60,6 +60,6 @@ def bucket_params_create end def bucket_params_update - params.require(:bucket).permit(:name, :description, :target) + params.require(:bucket).permit(:name, :description, :target, :status) end end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 36b1aaf50..a4ea778d5 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -31,8 +31,41 @@ def update render json: [group] end + api :POST, '/groups/:id/add_customer', 'Add a credit card that pays for the group' + def add_customer + group = Group.find(params[:id]) + if current_user.is_admin_for(group) + group.add_customer(current_user.email) + render json: [group] + else + render nothing: true, status: 403 + end + end + + api :POST, '/groups/:id/add_card', 'Add a credit card that pays for the group' + def add_card + group = Group.find(params[:id]) + if current_user.is_admin_for?(group) + group.add_card(params[:stripeEmail], params[:stripeToken]) + render status: 200, nothing: true + else + render status: 403, nothing: true + end + end + + api :POST, '/groups/:id/extend_trial', 'Extend the group trial by 30 days' + def extend_trial + group = Group.find(params[:id]) + if current_user.is_admin_for?(group) + group.extend_trial() + render status: 200, nothing: true + else + render status: 403, nothing: true + end + end + private def group_params - params.require(:group).permit(:name, :currency_code) + params.require(:group).permit(:name, :currency_code, :plan) end end diff --git a/app/controllers/memberships_controller.rb b/app/controllers/memberships_controller.rb index 5df30ca48..1b866c759 100644 --- a/app/controllers/memberships_controller.rb +++ b/app/controllers/memberships_controller.rb @@ -82,7 +82,7 @@ def upload_review private def membership_params - params.require(:membership).permit(:is_admin) + params.require(:membership).permit(:is_admin, :closed_admin_help_card_at, :closed_member_help_card_at) end def membership diff --git a/app/models/group.rb b/app/models/group.rb index d4a9b495c..0820a750a 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -16,6 +16,37 @@ def add_admin(user) end end + def add_customer(email) + customer = Stripe::Customer.create( + :description => "Customer for Group " + self.id.to_s, + :email => email, + :plan => 1 + ) + self.customer_id = customer.id + self.trial_end = Time.at(customer.subscriptions.data[0].trial_end) + self.plan = "paid" + self.save + end + + def add_card(email, token) + customer = Stripe::Customer.retrieve(self.customer_id) + customer.source = token + customer.email = email + customer.save + end + + def extend_trial + # the number of seconds in thirty days + thirty_days = 60 * 24 * 30 + + customer = Stripe::Customer.retrieve(self.customer_id) + sub = Stripe::Subscription.retrieve(customer.subscriptions.data[0].id) + sub.trial_end = sub.trial_end + thirty_days + sub.save + self.trial_end = Time.at(sub.trial_end) + self.save + end + def add_member(user) memberships.create!(member: user, is_admin: false) end @@ -28,6 +59,10 @@ def formatted_balance Money.new(balance * 100, currency_code).format end + def is_launched + members.any? && allocations.any? + end + def last_activity_at last_bucket = buckets.order(updated_at: :desc).limit(1).first last_bucket_updated_at = last_bucket ? last_bucket.updated_at : nil diff --git a/app/serializers/group_serializer.rb b/app/serializers/group_serializer.rb index 93a29889c..8b2180a91 100644 --- a/app/serializers/group_serializer.rb +++ b/app/serializers/group_serializer.rb @@ -4,5 +4,8 @@ class GroupSerializer < ActiveModel::Serializer :name, :balance, :currency_symbol, - :currency_code + :currency_code, + :is_launched, + :plan, + :trial_end end diff --git a/app/serializers/membership_serializer.rb b/app/serializers/membership_serializer.rb index eabd883f2..edc074f6a 100644 --- a/app/serializers/membership_serializer.rb +++ b/app/serializers/membership_serializer.rb @@ -5,7 +5,9 @@ class MembershipSerializer < ActiveModel::Serializer :created_at, :balance, :archived_at, - :raw_balance + :raw_balance, + :closed_admin_help_card_at, + :closed_member_help_card_at has_one :member, serializer: UserSerializer, root: 'users' has_one :group, serializer: GroupSerializer, root: 'groups' diff --git a/app/views/user_mailer/recent_activity_partials/_funded_buckets_user_authored.html.erb b/app/views/user_mailer/recent_activity_partials/_funded_buckets_user_authored.html.erb index 44eacf4d3..ed8b685c8 100644 --- a/app/views/user_mailer/recent_activity_partials/_funded_buckets_user_authored.html.erb +++ b/app/views/user_mailer/recent_activity_partials/_funded_buckets_user_authored.html.erb @@ -8,7 +8,7 @@