catarse_pagarme 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -257
  3. data/app/controllers/catarse_pagarme/application_controller.rb +6 -7
  4. data/app/controllers/catarse_pagarme/credit_cards_controller.rb +5 -5
  5. data/app/controllers/catarse_pagarme/notifications_controller.rb +6 -6
  6. data/app/controllers/catarse_pagarme/slip_controller.rb +6 -6
  7. data/app/helpers/catarse_pagarme/application_helper.rb +3 -3
  8. data/app/models/catarse_pagarme/credit_card_transaction.rb +1 -1
  9. data/app/models/catarse_pagarme/fee_calculator_concern.rb +12 -12
  10. data/app/models/catarse_pagarme/payment_concern.rb +9 -0
  11. data/app/models/catarse_pagarme/{contribution_delegator.rb → payment_delegator.rb} +17 -17
  12. data/app/models/catarse_pagarme/slip_transaction.rb +3 -2
  13. data/app/models/catarse_pagarme/transaction_base.rb +14 -13
  14. data/lib/catarse_pagarme/engine.rb +1 -1
  15. data/lib/catarse_pagarme/version.rb +1 -1
  16. data/spec/controllers/catarse_pagarme/credit_cards_controller_spec.rb +5 -5
  17. data/spec/controllers/catarse_pagarme/notifications_controller_spec.rb +11 -6
  18. data/spec/controllers/catarse_pagarme/slip_controller_spec.rb +6 -6
  19. data/spec/dummy/app/models/contribution.rb +1 -24
  20. data/spec/dummy/app/models/payment.rb +55 -0
  21. data/spec/dummy/app/models/payment_engines.rb +7 -0
  22. data/spec/helpers/catarse_pagarme/application_helper_spec.rb +2 -2
  23. data/spec/models/catarse_pagarme/credit_card_transaction_spec.rb +23 -23
  24. data/spec/models/catarse_pagarme/{contribution_delegator_spec.rb → payment_delegator_spec.rb} +28 -55
  25. data/spec/models/catarse_pagarme/slip_transaction_spec.rb +35 -29
  26. data/spec/support/factories.rb +16 -6
  27. metadata +8 -6
  28. data/app/models/catarse_pagarme/contribution_concern.rb +0 -9
@@ -0,0 +1,9 @@
1
+ module CatarsePagarme::PaymentConcern
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ def pagarme_delegator
6
+ CatarsePagarme::PaymentDelegator.new(self)
7
+ end
8
+ end
9
+ end
@@ -1,45 +1,45 @@
1
1
  module CatarsePagarme
2
- class ContributionDelegator
3
- attr_accessor :contribution, :transaction
2
+ class PaymentDelegator
3
+ attr_accessor :payment, :transaction
4
4
  include FeeCalculatorConcern
5
5
 
6
- def initialize(contribution)
6
+ def initialize(payment)
7
7
  configure_pagarme
8
- self.contribution = contribution
8
+ self.payment = payment
9
9
  end
10
10
 
11
11
  def change_status_by_transaction(transactin_status)
12
12
  case transactin_status
13
13
  when 'paid', 'authorized' then
14
- self.contribution.confirm unless self.contribution.confirmed?
14
+ self.payment.pay unless self.payment.paid?
15
15
  when 'refunded' then
16
- self.contribution.refund unless self.contribution.refunded?
16
+ self.payment.refund unless self.payment.refunded?
17
17
  when 'refused' then
18
- self.contribution.cancel unless self.contribution.canceled?
19
- when 'waiting_payment', 'processing' then
20
- self.contribution.waiting unless self.contribution.waiting_confirmation?
18
+ self.payment.refuse unless self.payment.refused?
21
19
  end
22
20
  end
23
21
 
24
22
  def update_fee
25
23
  fill_acquirer_data
26
- contribution.update_attributes({
27
- payment_service_fee: get_fee,
24
+ payment.update_attributes({
25
+ gateway_fee: get_fee,
28
26
  })
29
27
  end
30
28
 
31
29
  def fill_acquirer_data
32
- if !contribution.acquirer_name.present? || !contribution.acquirer_tid.present?
33
- contribution.update_attributes({
30
+ if payment.gateway_data.nil? || payment.gateway_data["acquirer_name"].nil? || payment.gateway_data["acquirer_tid"].nil?
31
+ data = payment.gateway_data || {}
32
+ payment.gateway_data = data.merge({
34
33
  acquirer_name: transaction.acquirer_name,
35
34
  acquirer_tid: transaction.tid,
36
35
  card_brand: transaction.try(:card_brand)
37
36
  })
37
+ payment.save
38
38
  end
39
39
  end
40
40
 
41
41
  def refund
42
- if contribution.is_credit_card?
42
+ if payment.is_credit_card?
43
43
  transaction.refund
44
44
  else
45
45
  transaction.refund(bank_account_attributes)
@@ -47,7 +47,7 @@ module CatarsePagarme
47
47
  end
48
48
 
49
49
  def value_for_transaction
50
- (self.contribution.value * 100).to_i
50
+ (self.payment.value * 100).to_i
51
51
  end
52
52
 
53
53
  def value_with_installment_tax(installment)
@@ -65,7 +65,7 @@ module CatarsePagarme
65
65
  end
66
66
 
67
67
  def transaction
68
- @transaction ||= ::PagarMe::Transaction.find_by_id(self.contribution.payment_id)
68
+ @transaction ||= ::PagarMe::Transaction.find_by_id(self.payment.gateway_id)
69
69
  end
70
70
 
71
71
  def get_installment(installment_number)
@@ -86,7 +86,7 @@ module CatarsePagarme
86
86
  protected
87
87
 
88
88
  def bank_account_attributes
89
- bank = contribution.user.bank_account
89
+ bank = payment.user.bank_account
90
90
 
91
91
  {
92
92
  bank_account: {
@@ -1,6 +1,6 @@
1
1
  module CatarsePagarme
2
2
  class SlipTransaction < TransactionBase
3
- def initialize(attributes, contribution)
3
+ def initialize(attributes, payment)
4
4
  super
5
5
  build_default_bank_account
6
6
  end
@@ -9,9 +9,10 @@ module CatarsePagarme
9
9
  update_user_bank_account
10
10
 
11
11
  self.transaction = PagarMe::Transaction.new(self.attributes)
12
+
12
13
  self.transaction.charge
13
14
 
14
- change_contribution_state
15
+ change_payment_state
15
16
 
16
17
  self.transaction
17
18
  end
@@ -1,18 +1,19 @@
1
1
  module CatarsePagarme
2
2
  class TransactionBase
3
- attr_accessor :attributes, :contribution,
3
+ attr_accessor :attributes, :payment,
4
4
  :transaction, :user
5
5
 
6
- def initialize(attributes, contribution)
6
+ def initialize(attributes, payment)
7
7
  self.attributes = attributes
8
- self.contribution = contribution
9
- self.user = contribution.user
8
+ self.payment = payment
9
+ self.user = payment.user
10
10
  end
11
11
 
12
- def change_contribution_state
13
- self.contribution.update_attributes(attributes_to_contribution)
12
+ def change_payment_state
13
+ self.payment.update_attributes(attributes_to_payment)
14
+ self.payment.save!
14
15
  delegator.update_fee
15
- self.contribution.payment_notifications.create(extra_data: self.transaction.to_json)
16
+ self.payment.payment_notifications.create(contribution_id: self.payment.contribution_id, extra_data: self.transaction.to_json)
16
17
  delegator.change_status_by_transaction(self.transaction.status)
17
18
  end
18
19
 
@@ -20,19 +21,19 @@ module CatarsePagarme
20
21
  PaymentType::CREDIT_CARD
21
22
  end
22
23
 
23
- def attributes_to_contribution
24
+ def attributes_to_payment
24
25
  {
25
- payment_choice: payment_method,
26
- payment_id: self.transaction.id,
27
- payment_method: 'Pagarme',
28
- slip_url: self.transaction.boleto_url,
26
+ payment_method: payment_method,
27
+ gateway_id: self.transaction.id,
28
+ gateway: 'Pagarme',
29
+ gateway_data: self.transaction.to_json,
29
30
  installments: (self.transaction.installments || 1),
30
31
  installment_value: (delegator.value_for_installment(self.transaction.installments || 0) / 100.0).to_f
31
32
  }
32
33
  end
33
34
 
34
35
  def delegator
35
- self.contribution.pagarme_delegator
36
+ self.payment.pagarme_delegator
36
37
  end
37
38
 
38
39
  end
@@ -3,7 +3,7 @@ module CatarsePagarme
3
3
  isolate_namespace CatarsePagarme
4
4
 
5
5
  config.to_prepare do
6
- ::Contribution.send(:include, CatarsePagarme::ContributionConcern)
6
+ ::Payment.send(:include, CatarsePagarme::PaymentConcern)
7
7
  end
8
8
  end
9
9
  end
@@ -1,3 +1,3 @@
1
1
  module CatarsePagarme
2
- VERSION = "2.5.1"
2
+ VERSION = "2.6.0"
3
3
  end
@@ -2,12 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe CatarsePagarme::CreditCardsController do
4
4
  before do
5
- PaymentEngines.stub(:find_payment).and_return(contribution)
6
5
  controller.stub(:current_user).and_return(user)
7
6
  end
8
7
 
9
8
  let(:project) { create(:project, goal: 10_000, state: 'online') }
10
9
  let(:contribution) { create(:contribution, value: 10, project: project) }
10
+ let(:payment) { contribution.payments.first }
11
11
 
12
12
  describe 'pay with credit card' do
13
13
  context 'without an user' do
@@ -15,17 +15,17 @@ describe CatarsePagarme::CreditCardsController do
15
15
 
16
16
  it 'should raise a error' do
17
17
  expect {
18
- post :create, { locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme' }
18
+ post :create, { locale: :pt, id: contribution.id, use_route: 'catarse_pagarme' }
19
19
  }.to raise_error('invalid user')
20
20
  end
21
21
  end
22
22
 
23
23
  context 'with an user' do
24
- let(:user) { contribution.user }
24
+ let(:user) { payment.user }
25
25
  context "with valid card data" do
26
26
  before do
27
27
  post :create, {
28
- locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme',
28
+ locale: :pt, id: contribution.id, use_route: 'catarse_pagarme',
29
29
  card_hash: sample_card_hash }
30
30
  end
31
31
 
@@ -37,7 +37,7 @@ describe CatarsePagarme::CreditCardsController do
37
37
  context 'with invalid card data' do
38
38
  before do
39
39
  post :create, {
40
- locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme', card_hash: "abcd" }
40
+ locale: :pt, id: contribution.id, use_route: 'catarse_pagarme', card_hash: "abcd" }
41
41
  end
42
42
 
43
43
  it 'payment_status should be failed' do
@@ -14,29 +14,34 @@ describe CatarsePagarme::NotificationsController do
14
14
  end
15
15
 
16
16
  let(:project) { create(:project, goal: 10_000, state: 'online') }
17
- let(:contribution) { create(:contribution, value: 10, project: project, payment_id: 'abcd') }
17
+ let(:contribution) { create(:contribution, value: 10, project: project) }
18
+ let(:payment) {
19
+ p = contribution.payments.first
20
+ p.update_attributes gateway_id: 'abcd'
21
+ p
22
+ }
18
23
  let(:credit_card) { create(:credit_card, subscription_id: '1542')}
19
24
 
20
25
  describe 'CREATE' do
21
- context "with invalid contribution" do
26
+ context "with invalid payment" do
22
27
  before do
23
28
  PaymentEngines.stub(:find_payment).and_return(nil)
24
29
  post :create, { locale: :pt, id: 'abcdfg', use_route: 'catarse_pagarme' }
25
30
  end
26
31
 
27
- it "should not found the contribution" do
32
+ it "should not found the payment" do
28
33
  expect(response.code.to_i).to eq(404)
29
34
  end
30
35
  end
31
36
 
32
- context "with valid contribution" do
37
+ context "with valid payment" do
33
38
  before do
34
- PaymentEngines.stub(:find_payment).and_return(contribution)
39
+ PaymentEngines.stub(:find_payment).and_return(payment)
35
40
  post :create, { locale: :pt, id: 'abcd', use_route: 'catarse_pagarme' }
36
41
  end
37
42
 
38
43
  it "should save an extra_data into payment_notifications" do
39
- expect(contribution.payment_notifications.size).to eq(1)
44
+ expect(payment.payment_notifications.size).to eq(1)
40
45
  end
41
46
 
42
47
  it "should return 200 status" do
@@ -2,13 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe CatarsePagarme::SlipController do
4
4
  before do
5
- PaymentEngines.stub(:find_payment).and_return(contribution)
6
5
  controller.stub(:current_user).and_return(user)
7
6
  Bank.create(name: 'foo', code: '123')
8
7
  end
9
8
 
10
9
  let(:project) { create(:project, goal: 10_000, state: 'online') }
11
10
  let(:contribution) { create(:contribution, value: 10, project: project) }
11
+ let(:payment) { contribution.payments.first }
12
12
  let(:credit_card) { create(:credit_card, subscription_id: '1542')}
13
13
 
14
14
  describe 'pay with slip' do
@@ -17,18 +17,18 @@ describe CatarsePagarme::SlipController do
17
17
 
18
18
  it 'should raise a error' do
19
19
  expect {
20
- post :create, { locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme' }
20
+ post :create, { locale: :pt, id: contribution.id, use_route: 'catarse_pagarme' }
21
21
  }.to raise_error('invalid user')
22
22
  end
23
23
  end
24
24
 
25
25
  context 'with an user' do
26
- let(:user) { contribution.user }
26
+ let(:user) { payment.user }
27
27
 
28
28
  context 'with valid bank account data' do
29
29
  before do
30
30
  post :create, {
31
- locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme',
31
+ locale: :pt, id: contribution.id, use_route: 'catarse_pagarme',
32
32
  user: { bank_account_attributes: {
33
33
  bank_id: Bank.first.id, agency: '1', agency_digit: '1', account: '1', account_digit: '1', owner_name: 'foo', owner_document: '1'
34
34
  } } }
@@ -44,10 +44,10 @@ describe CatarsePagarme::SlipController do
44
44
  end
45
45
 
46
46
  context 'with invalid bank account data' do
47
- let(:user) { contribution.user }
47
+ let(:user) { payment.user }
48
48
 
49
49
  before do
50
- post :create, { locale: :pt, project_id: project.id, contribution_id: contribution.id, use_route: 'catarse_pagarme', user: { bank_account_attributes: { owner_name: '' } } }
50
+ post :create, { locale: :pt, id: contribution.id, use_route: 'catarse_pagarme', user: { bank_account_attributes: { owner_name: '' } } }
51
51
  end
52
52
 
53
53
  it 'boleto_url should be nil' do
@@ -2,28 +2,5 @@ class Contribution < ActiveRecord::Base
2
2
  belongs_to :user
3
3
  belongs_to :project
4
4
  has_many :payment_notifications
5
-
6
- def confirmed?
7
- false
8
- end
9
-
10
- def update_current_billing_info
11
- end
12
-
13
- def confirm!
14
- true
15
- end
16
- alias :confirm :confirm!
17
-
18
- def waiting_confirmation?
19
- end
20
-
21
- def waiting
22
- end
23
-
24
- def cancel
25
- end
26
-
27
- def canceled?
28
- end
5
+ has_many :payments
29
6
  end
@@ -0,0 +1,55 @@
1
+ class Payment < ActiveRecord::Base
2
+ has_many :payment_notifications
3
+ belongs_to :contribution
4
+ delegate :user, :project, to: :contribution
5
+
6
+ validates_presence_of :state, :key, :gateway, :payment_method, :value, :installments, :installment_value
7
+ validate :value_should_be_equal_or_greater_than_pledge
8
+
9
+ before_validation do
10
+ self.key ||= SecureRandom.uuid
11
+ self.value ||= self.contribution.try(:value)
12
+ self.state = 'pending' # mock initial state for here we do not include the stat machine
13
+ end
14
+
15
+ def value_should_be_equal_or_greater_than_pledge
16
+ errors.add(:value, I18n.t("activerecord.errors.models.payment.attributes.value.invalid")) if self.contribution && self.value < self.contribution.value
17
+ end
18
+
19
+ def notification_template_for_failed_project
20
+ if slip_payment?
21
+ :contribution_project_unsuccessful_slip
22
+ else
23
+ :contribution_project_unsuccessful_credit_card
24
+ end
25
+ end
26
+
27
+ def refunded?
28
+ true
29
+ end
30
+
31
+ def paid?
32
+ true
33
+ end
34
+
35
+ def refused?
36
+ true
37
+ end
38
+
39
+ def refuse
40
+ end
41
+
42
+ def pay
43
+ end
44
+
45
+ def refund
46
+ end
47
+
48
+ def credits?
49
+ self.gateway == 'Credits'
50
+ end
51
+
52
+ def slip_payment?
53
+ self.payment_method == 'BoletoBancario'
54
+ end
55
+ end
@@ -1,2 +1,9 @@
1
1
  class PaymentEngines
2
+ def self.new_payment(attributes={})
3
+ Payment.new attributes
4
+ end
5
+
6
+ def self.find_contribution(id)
7
+ Contribution.find id
8
+ end
2
9
  end
@@ -7,10 +7,10 @@ describe CatarsePagarme::ApplicationHelper do
7
7
  CatarsePagarme.configuration.stub(:max_installments).and_return(6)
8
8
  end
9
9
 
10
- let(:contribution) { create(:contribution, value: 100) }
10
+ let(:payment) { create(:payment, value: 100) }
11
11
 
12
12
  context "#installments_for_select" do
13
- subject { installments_for_select(contribution) }
13
+ subject { installments_for_select(payment) }
14
14
  it { expect(subject.size).to eq(6) }
15
15
  it { expect(subject[0][0]).to eq('1x $100.00 ') }
16
16
  it { expect(subject[0][1]).to eq(1) }
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CatarsePagarme::CreditCardTransaction do
4
- let(:contribution) { create(:contribution, value: 100) }
4
+ let(:payment) { create(:payment, value: 100) }
5
5
 
6
6
  let(:pagarme_transaction) {
7
7
  double({
@@ -24,61 +24,61 @@ describe CatarsePagarme::CreditCardTransaction do
24
24
  card_expiration_month: '10',
25
25
  card_expiration_year: '19',
26
26
  card_cvv: '434',
27
- amount: contribution.pagarme_delegator.value_for_transaction,
27
+ amount: payment.pagarme_delegator.value_for_transaction,
28
28
  postback_url: 'http://test.foo',
29
29
  installments: 1
30
30
  }
31
31
  end
32
32
 
33
- let(:card_transaction) { CatarsePagarme::CreditCardTransaction.new(valid_attributes, contribution) }
33
+ let(:card_transaction) { CatarsePagarme::CreditCardTransaction.new(valid_attributes, payment) }
34
34
 
35
35
  before do
36
36
  PagarMe::Transaction.stub(:new).and_return(pagarme_transaction)
37
- CatarsePagarme::ContributionDelegator.any_instance.stub(:change_status_by_transaction).and_return(true)
37
+ CatarsePagarme::PaymentDelegator.any_instance.stub(:change_status_by_transaction).and_return(true)
38
38
  CatarsePagarme.configuration.stub(:credit_card_tax).and_return(0.01)
39
39
  end
40
40
 
41
41
  describe '#charge!' do
42
42
  describe 'with valid attributes' do
43
43
  before do
44
- contribution.should_receive(:update_attributes).at_least(1).and_call_original
44
+ payment.should_receive(:update_attributes).at_least(1).and_call_original
45
45
  PagarMe::Transaction.should_receive(:find_by_id).with(pagarme_transaction.id).and_return(pagarme_transaction)
46
- CatarsePagarme::ContributionDelegator.any_instance.should_receive(:change_status_by_transaction).with('paid')
46
+ CatarsePagarme::PaymentDelegator.any_instance.should_receive(:change_status_by_transaction).with('paid')
47
47
 
48
48
  card_transaction.charge!
49
- contribution.reload
49
+ payment.reload
50
50
  end
51
51
 
52
- it "should update contribution payment_id" do
53
- expect(contribution.payment_id).to eq('abcd')
52
+ it "should update payment payment_id" do
53
+ expect(payment.gateway_id).to eq('abcd')
54
54
  end
55
55
 
56
- it "should update contribution payment_service_fee" do
57
- expect(contribution.payment_service_fee.to_f).to eq(4.08)
56
+ it "should update payment payment_service_fee" do
57
+ expect(payment.gateway_fee.to_f).to eq(4.08)
58
58
  end
59
59
 
60
- it "should update contribution payment_method" do
61
- expect(contribution.payment_method).to eq('Pagarme')
60
+ it "should update payment payment_method" do
61
+ expect(payment.gateway).to eq('Pagarme')
62
62
  end
63
63
 
64
- it "should update contribution installments" do
65
- expect(contribution.installments).to eq(3)
64
+ it "should update payment installments" do
65
+ expect(payment.installments).to eq(3)
66
66
  end
67
67
 
68
- it "should update contribution payment_choice" do
69
- expect(contribution.payment_choice).to eq(CatarsePagarme::PaymentType::CREDIT_CARD)
68
+ it "should update payment payment_choice" do
69
+ expect(payment.payment_method).to eq(CatarsePagarme::PaymentType::CREDIT_CARD)
70
70
  end
71
71
 
72
- it "should update contribution acquirer_name" do
73
- expect(contribution.acquirer_name).to eq('stone')
72
+ it "should update payment acquirer_name" do
73
+ expect(payment.gateway_data["acquirer_name"]).to eq('stone')
74
74
  end
75
75
 
76
- it "should update contribution acquirer_tid" do
77
- expect(contribution.acquirer_tid).to eq('123123')
76
+ it "should update payment acquirer_tid" do
77
+ expect(payment.gateway_data["acquirer_tid"]).to eq('123123')
78
78
  end
79
79
 
80
- it "should update contribution installment_value" do
81
- expect(contribution.installment_value).to_not be_nil
80
+ it "should update payment installment_value" do
81
+ expect(payment.installment_value).to_not be_nil
82
82
  end
83
83
  end
84
84
  end