Class: Transmission::UserSet::Reply

Inherits:
Bankserv::Set
  • Object
show all
Defined in:
lib/bankserv/transmission/set/reply.rb

Instance Method Summary collapse

Methods inherited from Bankserv::Set

#base_set, #build_header, #build_trailer, #contained_sets, #decorate_records, from_hash, #get_document, #header, #number_of_records, #parent, partial_class_name, #rec_status, #record_with_sequence_number, #set_type, #to_hash, #trailer, #transactions

Instance Method Details

#processObject



7
8
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
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/bankserv/transmission/set/reply.rb', line 7

def process
  input_document = Bankserv::InputDocument.for_user_ref(self.set.document.user_ref)
  #service = Bankserv::Service.active.select {|s| s.config[:user_code] == self.records.first.data[:user_code]}.last
  service = Bankserv::Service.active.select {|s| s.client_code.to_i.to_s == self.records.first.data[:user_code]}.last

  rejections = []
  records_with_errors = []
  reply_file_rejected = false

  transactions.each do |transaction|
    case transaction.record_type
    when "transmission_status"
      # document = Bankserv::InputDocument.for_transmission_number(transaction.data[:transmission_number])
      # document = Bankserv::InputDocument.for_user_ref(transaction.data[:th_for_use_of_ld_user])
      input_document.reply_status = transaction.data[:transmission_status]
      input_document.save!

      if input_document.accepted?
        service.config[:transmission_number] = (transaction.data[:transmission_number].to_i + 1).to_s
        service.save!
        # service.reload
        Bankserv::Service.for_client_code(input_document.client_code).active.each do |c_service|
         c_service.config[:transmission_number] = (transaction.data[:transmission_number].to_i + 1).to_s
         c_service.save!
        end
      end
      
    when "transmission_rejected_reason"
      reply_file_rejected = true

      input_document.error = {
        code: transaction.data[:error_code],
        message: transaction.data[:error_message]
      }

      if service.is_a?(Bankserv::CreditService) && transaction.data[:error_code] == "6"
        # transmission number is incorrect, fetch the last accepted input file trans number and increment by 1
        last_successful_submission = Bankserv::Document.where(type: 'input', client_code: service.client_code, reply_status: "ACCEPTED").last
        service.config[:transmission_number] = (last_successful_submission.transmission_number.to_i + 1).to_s
        service.save!
      end
      
      input_document.save!
    when "ahv_status"
      # set = document.set_with_generation_number(transaction.data[:user_code_generation_number])
      set = input_document.set_with_dept_code(transaction.data[:user_code_generation_number])
      set.reply_status = transaction.data[:user_set_status]
      set.save!
    when "eft_status"
      set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
      set.reply_status = transaction.data[:user_set_status]
      set.save!

      if reply_file_rejected
        rejections << transaction

        if service.is_a? Bankserv::CreditService
          set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
          next if set.contra_records.empty?
          user_ref = set.contra_records.first.data[:user_ref].match(/CONTRA([0-9]*)/)[1]
          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id

          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.renew!
          end
        end

      end
    when "accepted_report_reply"
      # what do we do here.. what is an accepted report reply?
      if transaction.data[:accepted_report_transaction][4,2] == "12" # Contra record
        if service.is_a? Bankserv::CreditService
          user_ref = transaction.data[:accepted_report_transaction].match(/CONTRA([0-9]*)/)[1]

          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id
          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.accept!
          end
        end
      end
    when "rejected_message"

      if transaction.data[:error_message].starts_with?("*** HOMING BRANCH INVALID")
        set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])

        if set.reply_status == 'ACCEPTED'
          user_ref = set.contra_records.first.data[:user_ref].match(/CONTRA([0-9]*)/)[1]
          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id

          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.warning!([{error_code: "80", error_message: transaction.data[:error_message]}])
          end
        end
 
        next
      end

      if transaction.data[:error_message].starts_with?("*** WARNING ONLY")
        # Warning only
        set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
        record = set.record_with_sequence_number(transaction.data[:user_sequence_number])

        if service.is_a? Bankserv::CreditService
          next if set.contra_records.empty?

          set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
          user_ref = set.contra_records.first.data[:user_ref].match(/CONTRA([0-9]*)/)[1]
          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id

          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.warning!([{error_code: "80", error_message: transaction.data[:error_message]}])
          end
        end

        next
      end
      rejections << transaction

      if transaction.data[:user_sequence_number].to_i > 0
        set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
        record = set.record_with_sequence_number(transaction.data[:user_sequence_number])

        if record.error.nil?
          record.error = [{
            code: transaction.data[:error_code],
            message: transaction.data[:error_message]
          }]
        else
          record.error << {
            code: transaction.data[:error_code],
            message: transaction.data[:error_message]
          }
        end

        record.save!

        if service.is_a? Bankserv::CreditService
          next if set.contra_records.empty?

          set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
          user_ref = set.contra_records.first.data[:user_ref].match(/CONTRA([0-9]*)/)[1]
          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id

          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.reject!(record.error)
          end
        end
        
        records_with_errors << record
      else
        # Only 1 error due to a transaction above it failing. We can requeue this transaction to be processed again

        if service.is_a? Bankserv::CreditService
          set = input_document.set_with_generation_number(transaction.data[:user_code_generation_number])
          user_ref = set.contra_records.first.data[:user_ref].match(/CONTRA([0-9]*)/)[1]
          request_id = Bankserv::Credit.where(user_ref: user_ref)[0].bankserv_request_id

          Bankserv::Credit.where(bankserv_request_id: request_id).each do |credit|
            credit.renew!
          end
        end
      end
    end
  end

  unless rejections.empty?
    service.config[:generation_number] = rejections.first.data[:user_code_generation_number].to_i
    unless rejections.first.data.has_key?(:user_sequence_number) # Transmission number out of sequence, reset to 1
      service.config[:sequence_number] = 1
    else
      service.config[:sequence_number] = rejections.first.data[:user_sequence_number].to_i
    end
    service.save!
  end
end