Class: CodinRep::GetRecords

Inherits:
Command
  • Object
show all
Defined in:
lib/codin_rep/get_records.rb

Direct Known Subclasses

GetAfdHeader

Defined Under Namespace

Classes: UnknownAfdRecord

Constant Summary collapse

START_COMMAND =
"PGREP0289".freeze
NEXT_RECORD_COMMAND =
"PGREP009,".freeze
START_HEADER =
'REP0029['.freeze
END_HEADER =
'REP0029]'.freeze
AFD_DATA_START_HEADER =
'REP3029'.freeze
AFD_DATA_CONTINUATION_HEADER =
'REP0379'.freeze
AFD_DATA_ONLY_HEADER =
'REP2359'.freeze
AFD_DATA_END_HEADER =
'REP0909'.freeze
HEADER_SIZE =
8
AFD_SIZES_BY_TYPE =
{
  '1' => 233,
  '2' => 300,
  '3' => 35,
  '4' => 35,
  '5' => 88
}.freeze

Constants inherited from Command

Command::COMMAND_PREFIX

Instance Method Summary collapse

Methods inherited from Command

#check_response_header, #generate_command_payload, #generate_header, #get_data_from_response_payload, #get_max_attempts, #get_timeout_time, #should_close_connection?

Constructor Details

#initialize(first_id, *args) ⇒ GetRecords

Returns a new instance of GetRecords.



53
54
55
56
57
# File 'lib/codin_rep/get_records.rb', line 53

def initialize(first_id, *args)
  super(*args)
  @first_id = first_id.to_i
  @first_id = 1 if @first_id < 1
end

Instance Method Details

#executeObject



59
60
61
62
63
64
65
66
67
68
# File 'lib/codin_rep/get_records.rb', line 59

def execute
  @command_data = get_first_command
  @response = ""
  @parser = AfdParser.new(false)
  @records = []

  get_afd_records

  return @parser
end

#get_afd_data_type_size(partial_data) ⇒ Object



135
136
137
138
139
140
141
142
143
144
# File 'lib/codin_rep/get_records.rb', line 135

def get_afd_data_type_size(partial_data)
  if partial_data.size < 17
    expected_size = 17
  else
    afd_record_id = partial_data[16]
    expected_size = AFD_SIZES_BY_TYPE[afd_record_id]
    raise UnknownAfdRecord.new(afd_record_id) if expected_size.nil?
  end
  expected_size
end

#get_afd_recordsObject



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
# File 'lib/codin_rep/get_records.rb', line 70

def get_afd_records
  begin
    while !@command_data.match(/^#{NEXT_RECORD_COMMAND}/) || @response != END_HEADER
      @response = communicate!
      current_record = nil
      if @has_response_payload
        raw_record = get_response_payload
        current_record = @parser.parse_line(raw_record, nil)
      end
      @records << current_record

      @command_data = NEXT_RECORD_COMMAND
    end
  ensure
    @communication.close if @communication
  end

  afd_start_date = @parser.first_creation_date
  afd_end_date = @parser.last_creation_date

  employer_command = CodinRep::GetAfdHeader.new(@host_address, @tcp_port)
  employer = employer_command.execute

  @parser.create_header(employer.employer_type, employer.employer_document,
                        employer.employer_cei, employer.employer_name,
                        employer.rep_serial_number, afd_start_date,
                        afd_end_date, Time.now)
  @parser.create_trailer
end

#get_expected_response_sizeObject



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
# File 'lib/codin_rep/get_records.rb', line 100

def get_expected_response_size
  proc do |partial_data|
    @has_response_payload = true
    case partial_data
    when START_HEADER
      @has_response_payload = false
      expected_size = 0
    when END_HEADER
      @has_response_payload = false
      expected_size = 0
    when /^#{AFD_DATA_START_HEADER}/
      @start_header_received = true
      expected_size = HEADER_SIZE + get_afd_data_type_size(partial_data)
    when /^#{AFD_DATA_ONLY_HEADER}/
      @start_header_received = true
      expected_size = HEADER_SIZE + get_afd_data_type_size(partial_data)
    when /^#{AFD_DATA_CONTINUATION_HEADER}/
      expected_size = HEADER_SIZE + get_afd_data_type_size(partial_data)
    when /^#{AFD_DATA_END_HEADER}/
      @end_header_received = true
      expected_size = HEADER_SIZE + get_afd_data_type_size(partial_data)
    else
      if partial_data.size < HEADER_SIZE
        # new command, get only the header:
        expected_size = HEADER_SIZE
      else
        header = partial_data[0..(HEADER_SIZE-1)]
        command_name = self.class.name.split('::')[1]
        raise UnknownHeader.new(header, command_name)
      end
    end
    expected_size
  end
end

#get_first_commandObject



150
151
152
# File 'lib/codin_rep/get_records.rb', line 150

def get_first_command
  "#{START_COMMAND}#{@first_id.to_s.rjust(9, '0')}99999999"
end

#get_response_payloadObject



146
147
148
# File 'lib/codin_rep/get_records.rb', line 146

def get_response_payload
  @response_payload = @response[7..-1]
end