Bind specific invoice when paid via Banklink / EveryPay

Fix styling issues

Move redundant logic to shared base
This commit is contained in:
Karl Erik Õunapuu 2020-01-31 12:56:58 +02:00
parent cbbfbae99e
commit 0cf2ff92a3
7 changed files with 50 additions and 14 deletions

View file

@ -27,6 +27,8 @@ class Registrar
opts = { response: params }
@payment = ::PaymentOrders.create_with_type(params[:bank], invoice, opts)
if @payment.valid_response_from_intermediary? && @payment.settled_payment?
Rails.logger.info("User paid invoice ##{invoice.number} successfully")
@payment.complete_transaction
if invoice.paid?

View file

@ -48,6 +48,7 @@ class BankTransaction < ApplicationRecord
end
invoice = Invoice.find_by(number: invoice_no)
@registrar = invoice.buyer
unless invoice
errors.add(:base, I18n.t('invoice_was_not_found'))

View file

@ -51,11 +51,7 @@ module PaymentOrders
def complete_transaction
return unless valid_successful_transaction?
transaction = BankTransaction.find_by(
description: invoice.order,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction = compose_or_find_transaction
transaction.sum = response['VK_AMOUNT']
transaction.bank_reference = response['VK_T_NO']
@ -65,7 +61,12 @@ module PaymentOrders
transaction.paid_at = Time.parse(response["VK_T_DATETIME"])
transaction.save!
transaction.autobind_invoice
transaction.bind_invoice(invoice.number)
if transaction.errors.empty?
Rails.logger.info("Invoice ##{invoice.number} was marked as paid")
else
Rails.logger.error("Failed to bind invoice ##{invoice.number}")
end
end
def settled_payment?

View file

@ -26,6 +26,32 @@ module PaymentOrders
transaction.save!
end
def compose_or_find_transaction
transaction = BankTransaction.find_by(base_transaction_params)
# Transaction already autobinded (possibly) invalid invoice
if transaction.binded?
Rails.logger.info("Transaction #{transaction.id} is already binded")
Rails.logger.info('Creating new BankTransaction record.')
transaction = new_base_transaction
end
transaction
end
def new_base_transaction
BankTransaction.new(base_transaction_params)
end
def base_transaction_params
{
description: invoice.order,
currency: invoice.currency,
iban: invoice.seller_iban,
}
end
def form_url
ENV["payments_#{type}_url"]
end

View file

@ -20,6 +20,7 @@ module PaymentOrders
def valid_response_from_intermediary?
return false unless response
valid_hmac? && valid_amount? && valid_account?
end
@ -30,18 +31,19 @@ module PaymentOrders
def complete_transaction
return unless valid_response_from_intermediary? && settled_payment?
transaction = BankTransaction.find_by(
description: invoice.order,
currency: invoice.currency,
iban: invoice.seller_iban
)
transaction = compose_or_find_transaction
transaction.sum = response[:amount]
transaction.paid_at = Date.strptime(response[:timestamp], '%s')
transaction.buyer_name = response[:cc_holder_name]
transaction.save!
transaction.autobind_invoice
transaction.bind_invoice(invoice.number)
if transaction.errors.empty?
Rails.logger.info("Invoice ##{invoice.number} marked as paid")
else
Rails.logger.error("Failed to bind invoice ##{invoice.number}")
end
end
private

View file

@ -114,7 +114,9 @@ class BankLinkTest < ActiveSupport::TestCase
mock_transaction.expect(:paid_at= , Date.parse('2018-04-01 00:30:00 +0300'), [Time.parse('2018-04-01T00:30:00+0300')])
mock_transaction.expect(:buyer_name=, 'John Doe', ['John Doe'])
mock_transaction.expect(:save!, true)
mock_transaction.expect(:autobind_invoice, AccountActivity.new)
mock_transaction.expect(:binded?, false)
mock_transaction.expect(:bind_invoice, AccountActivity.new, [1])
mock_transaction.expect(:errors, [])
BankTransaction.stub(:find_by, mock_transaction) do
@completed_bank_link.complete_transaction

View file

@ -72,7 +72,9 @@ class EveryPayTest < ActiveSupport::TestCase
mock_transaction.expect(:paid_at= , Date.strptime('1524136727', '%s'), [Date.strptime('1524136727', '%s')])
mock_transaction.expect(:buyer_name=, 'John Doe', ['John Doe'])
mock_transaction.expect(:save!, true)
mock_transaction.expect(:autobind_invoice, AccountActivity.new)
mock_transaction.expect(:binded?, false)
mock_transaction.expect(:bind_invoice, AccountActivity.new, [1])
mock_transaction.expect(:errors, [])
BankTransaction.stub(:find_by, mock_transaction) do
@every_pay.complete_transaction