mirror of
https://github.com/internetee/registry.git
synced 2025-06-10 14:44:47 +02:00
Bind specific invoice when paid via Banklink / EveryPay
Fix styling issues Move redundant logic to shared base
This commit is contained in:
parent
cbbfbae99e
commit
0cf2ff92a3
7 changed files with 50 additions and 14 deletions
|
@ -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?
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue