Class: Workers::Payments::CheckPaymentWorker

Inherits:
ApplicationWorker show all
Defined in:
app/workers/workers/payments/check_payment_worker.rb

Overview

kadang2 ada kasus dimana user mencet tombol cancel tp pembayarannya tetep lanjut, jadi kita perlu balikin status reservation nya jadi pending_arrival

Instance Method Summary collapse

Methods inherited from ApplicationWorker

unlimited_retry

Instance Method Details

#perform(transaction_type, transaction_id) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
# File 'app/workers/workers/payments/check_payment_worker.rb', line 9

def perform(transaction_type, transaction_id)
  transaction = transaction_type.to_s.camelize.constantize.find_by(id: transaction_id)
  return if transaction.blank?
  return unless transaction.cancelled? && transaction.paid_charges.present?

  latest_pending_charge = transaction.pending_charges.where(status: 'pending').order(created_at: :desc).first
  return if latest_pending_charge.blank?

  check_status = GbPrimepay::CheckStatus.new
  check_status.check(latest_pending_charge.omise_charge_id)
  data = check_status.data

  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

    return if success_payment.blank?

    charge_id = success_payment['gbpReferenceNo']
    service = PaymentProcessService::MarkAsPaid.new(charge_id, charge_id)

    unless service.execute!
      HH_LOGGER.error(service.error_message_simple, {
                        id: transaction.id,
                        transaction: charge_id,
                        transaction_type: 'TicketTransaction',
                      })
      raise
    end

    case transaction_type.to_sym
    when :ticket_transaction
      transaction.ticket_bundles.includes(:ticket_group).each do |ticket_bundle|
        ticket_group = ticket_bundle.ticket_group
        if ticket_group.oversold?
          # case when create booking quota still available and then payment cancelled (quota restored)
          # but system check payment success and quota not available anymore

          HH_LOGGER.error('System re-mark as paid but the VIM quantity is not available anymore',
                          ticket_group: ticket_group.attributes,
                          transaction: transaction.attributes)
        end
      end
    else
      raise NotImplementedError
    end
    transaction.audit_comment = 'activate again booking because paid'
    if transaction.respond_to?(:mark_as_valid_reservation!)
      transaction.mark_as_valid_reservation!
    else
      transaction.active = true
      transaction.for_locking_system = false
    end
    transaction.save!
  end
end