28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# File 'app/workers/workers/payments/check_status_worker.rb', line 28
def perform(external_charge_id, retry_check = 0)
charge = Externals::Omise::Charge.find_by omise_charge_id: external_charge_id
return if charge.blank?
transaction = charge.reservation.presence || charge.voucher_transaction.presence
return if transaction.blank?
if charge.voucher_transaction_id.present? && transaction.charges.success_scope.present? && transaction.vouchers.where(active: false).blank?
return
end
return if charge.reservation_id.present? && !charge.reservation.is_temporary? && transaction.charges.success_scope.present?
return if charge&.reservation.present? && charge&.reservation&.payment_provider != 'gb_primepay'
check_status = ::GbPrimepay::CheckStatus.new
ref_no = charge.reference_no.presence || charge.reservation_id
check_status.check(ref_no)
data = check_status.data
retry_check += 1
if check_status.invalid_card?
BUSINESS_LOGGER.error('Stop retrying because resultCode is invalid card', {
external_charge_id: external_charge_id,
retry_check: retry_check,
charge: charge,
transaction: transaction,
reference_no: ref_no,
data: data,
})
return
end
if retry_check >= LIMIT_RETRY_CHECK
BUSINESS_LOGGER.error('Booking payment status has reached the limit, user might did not pay', {
external_charge_id: external_charge_id,
retry_check: retry_check,
charge: charge,
transaction: transaction,
reference_no: ref_no,
data: data,
})
return
end
if check_status.success? && data.present?
success_payment = if data.is_a?(Array)
data.select { |txn| txn['status'] == 'S' || txn['status'] == 'A' }.first
elsif data['status'] == 'S' || data['status'] == 'A'
data
end
if success_payment.blank?
Workers::Payments::CheckStatusWorker.perform_in(RETRY_EVERY, external_charge_id, retry_check)
return
end
charge_id = success_payment['gbpReferenceNo']
service = if charge.reservation_id.present?
MarkReservationAsPaidService.new(charge_id, charge_id, ref_no)
elsif charge.voucher_transaction_id.present?
MarkVoucherTransactionAsPaidService.new(charge_id, charge_id, ref_no)
else
raise NotImplementedError
end
unless service.execute!
HH_LOGGER.error(service.error_message_simple, {
id: transaction.id,
transaction: charge_id,
transaction_type: charge.reservation_id.present? ? 'Reservation' : 'Voucher',
})
raise
end
else
Workers::Payments::CheckStatusWorker.perform_in(RETRY_EVERY, external_charge_id, retry_check)
end
rescue Faraday::TimeoutError
self.class.perform_in(rand(1..5).minutes, external_charge_id, retry_check)
end
|