diff --git a/app/controllers/registrar/payments_controller.rb b/app/controllers/registrar/payments_controller.rb index 5be0d6562..8df9bb046 100644 --- a/app/controllers/registrar/payments_controller.rb +++ b/app/controllers/registrar/payments_controller.rb @@ -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? diff --git a/app/models/bank_transaction.rb b/app/models/bank_transaction.rb index d2f8bb66b..cb9aebc5e 100644 --- a/app/models/bank_transaction.rb +++ b/app/models/bank_transaction.rb @@ -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')) diff --git a/app/models/payment_orders/bank_link.rb b/app/models/payment_orders/bank_link.rb index e568da0df..1e4c2785a 100644 --- a/app/models/payment_orders/bank_link.rb +++ b/app/models/payment_orders/bank_link.rb @@ -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? diff --git a/app/models/payment_orders/base.rb b/app/models/payment_orders/base.rb index cf0293025..772f33ba5 100644 --- a/app/models/payment_orders/base.rb +++ b/app/models/payment_orders/base.rb @@ -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 diff --git a/app/models/payment_orders/every_pay.rb b/app/models/payment_orders/every_pay.rb index b4ddcdf29..a866ba972 100644 --- a/app/models/payment_orders/every_pay.rb +++ b/app/models/payment_orders/every_pay.rb @@ -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 diff --git a/test/models/payment_orders/bank_link_test.rb b/test/models/payment_orders/bank_link_test.rb index f1069819c..002f488b9 100644 --- a/test/models/payment_orders/bank_link_test.rb +++ b/test/models/payment_orders/bank_link_test.rb @@ -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 diff --git a/test/models/payment_orders/every_pay_test.rb b/test/models/payment_orders/every_pay_test.rb index 202efc1b7..81e077b23 100644 --- a/test/models/payment_orders/every_pay_test.rb +++ b/test/models/payment_orders/every_pay_test.rb @@ -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