Class: Parsbank::TransactionVerify

Inherits:
Object
  • Object
show all
Defined in:
lib/parsbank/transaction_verify.rb

Class Method Summary collapse

Class Method Details

.fetch_amounts(args) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/parsbank/transaction_verify.rb', line 34

def self.fetch_amounts(args)
  [
    args.fetch(:crypto_amount, nil),
    args.fetch(:fiat_amount, nil),
    args.fetch(:real_amount, nil)
  ]
end

.fetch_bank(args) ⇒ Object



20
21
22
# File 'lib/parsbank/transaction_verify.rb', line 20

def self.fetch_bank(args)
  args.fetch(:bank)
end

.generate_callback_url(bank, _description) ⇒ Object



29
30
31
32
# File 'lib/parsbank/transaction_verify.rb', line 29

def self.generate_callback_url(bank, _description)
  selected_bank = Parsbank.available_gateways_list[bank]
  "#{selected_bank['callback_url'] || Parsbank.configuration.callback_url}&bank_name=#{bank}"
end

.initialize_transaction(args, description, fiat_amount, crypto_amount, bank, callback_url) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/parsbank/transaction_verify.rb', line 56

def self.initialize_transaction(args, description, fiat_amount, crypto_amount, bank, callback_url)
  model_class = Parsbank.configuration.model || 'Transaction'
  @transaction = Object.const_get(model_class).new(
    description: description,
    amount: fiat_amount || crypto_amount,
    gateway: bank,
    callback_url: callback_url,
    status: 'start',
    user_id: args.fetch(:user_id, nil),
    cart_id: args.fetch(:cart_id, nil),
    local_id: args.fetch(:local_id, nil),
    ip: args.fetch(:ip, nil)
  )
  @transaction.save

  @transaction
end

.process_bscbitcoin(transaction, description, crypto_amount, args) ⇒ Object



126
127
128
129
130
131
132
133
# File 'lib/parsbank/transaction_verify.rb', line 126

def self.process_bscbitcoin(transaction, description, crypto_amount, args)
  bscbitcoin = Parsbank::BscBitcoin.new(
    additional_data: description
  )
  convert_real_amount_to_assets if crypto_amount.nil? && args.key?(:real_amount)
  @result = bscbitcoin.generate_payment_address(amount: crypto_amount)
  transaction.update!(gateway_response: @result, unit: 'bitcoin')
end

.process_gateway(bank, transaction, description, callback_url, crypto_amount, fiat_amount, args) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/parsbank/transaction_verify.rb', line 74

def self.process_gateway(bank, transaction, description, callback_url, crypto_amount, fiat_amount, args)
  case bank
  when 'mellat'
    process_mellat(transaction, description, callback_url, fiat_amount)
  when 'zarinpal'
    process_zarinpal(transaction, description, callback_url, fiat_amount)
  when 'zibal'
    process_zibal(description, callback_url, fiat_amount)
  when 'bscbitcoin'
    process_bscbitcoin(transaction, description, crypto_amount, args)
  else
    raise "Unsupported gateway: #{bank}"
  end
end

.process_mellat(transaction, description, callback_url, fiat_amount) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/parsbank/transaction_verify.rb', line 89

def self.process_mellat(transaction, description, callback_url, fiat_amount)
  mellat = Parsbank::Mellat.new(
    amount: fiat_amount,
    additional_data: description,
    callback_url: callback_url,
    orderId: transaction.id
  )
  mellat.call
  transaction.update!(gateway_response: mellat.response, unit: 'irr')
  @result = mellat.redirect_form
end

.process_zarinpal(transaction, description, callback_url, fiat_amount) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/parsbank/transaction_verify.rb', line 101

def self.process_zarinpal(transaction, description, callback_url, fiat_amount)
  zarinpal = Parsbank::Zarinpal.new(
    amount: fiat_amount,
    additional_data: description,
    callback_url: callback_url
  )
  zarinpal.call
  transaction.update!(
    gateway_response: zarinpal.response,
    track_id: zarinpal.ref_id,
    unit: 'irt'
  )
  @result = zarinpal.redirect_form
end

.process_zibal(description, callback_url, fiat_amount) ⇒ Object



116
117
118
119
120
121
122
123
124
# File 'lib/parsbank/transaction_verify.rb', line 116

def self.process_zibal(description, callback_url, fiat_amount)
  zibal = Parsbank::Zibal.new(
    amount: fiat_amount,
    additional_data: description,
    callback_url: callback_url
  )
  zibal.call
  @result = zibal.redirect_form
end

.validate_amounts(bank, crypto_amount, fiat_amount, real_amount) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/parsbank/transaction_verify.rb', line 42

def self.validate_amounts(bank, crypto_amount, fiat_amount, real_amount)
  raise 'Amount fields are empty: crypto_amount OR fiat_amount OR real_amount' if [crypto_amount, fiat_amount,
                                                                                   real_amount].all?(&:nil?)

  tags = $SUPPORTED_PSP[bank]['tags']
  if tags.include?('crypto') && crypto_amount.nil? && real_amount.nil?
    raise "#{bank} needs crypto_amount or real_amount"
  end

  return unless tags.include?('rial') && fiat_amount.nil? && real_amount.nil?

  raise "#{bank} needs fiat_amount or real_amount"
end

.validate_bank(bank) ⇒ Object



24
25
26
27
# File 'lib/parsbank/transaction_verify.rb', line 24

def self.validate_bank(bank)
  selected_bank = Parsbank.available_gateways_list[bank]
  raise "Bank not enabled or not exists in #{Parsbank.configuration.secrets_path}: #{bank}" unless selected_bank
end

.validate_params(params) ⇒ Object



14
15
16
17
18
# File 'lib/parsbank/transaction_verify.rb', line 14

def self.validate_params(params)
  model_class = Parsbank.configuration.model || 'Transaction'
  tack_transaction = Object.const_get(model_class).find(params[:transaction_id].to_i)
  { status: 404, message: I18n.t('model.not_found') } unless tack_transaction.present?
end

.verify(args = {}) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/parsbank/transaction_verify.rb', line 5

def self.verify(args = {})
  validate_params(args.params)

  transaction = initialize_transaction(args, description, fiat_amount, crypto_amount, bank, callback_url)
  process_gateway(bank, transaction, description, callback_url, crypto_amount, fiat_amount, args)

  { transaction: transaction, html_form: @result }
end