cqm-reports 3.0.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ab383c8a8cbc82410448739f891fc5c96cd0ae8
4
- data.tar.gz: 62734f201648d065ea3bec1903f34d1c7005443b
3
+ metadata.gz: f221e687f62214c36812fd10c6f805bd4c8318d0
4
+ data.tar.gz: 8ced778300575e57e368770bc705f8e5cc4f4d3d
5
5
  SHA512:
6
- metadata.gz: 941d46cc062b4cb2d70a7f11438363b3af6a0ba7a21491ed451c37f61778445ad8e2375b055a5db54c8b90f365b7d52cd9fa7ce262eea8b20727ae42f7043310
7
- data.tar.gz: 13c9d7aca7e2497f47e66919b54926f33bd6fd4d2714aadbde204d24072f23e95aa0fbad63458572e4c776c0dac9caa67fae2dc3efa063d7f340d618eea4cd3f
6
+ metadata.gz: d4056e6d8f4e26ad6247fa558511d5ce0aad9bc61ca0ecd7c31ec69f160b4c555ced11b5fdfc3ce0e518165de92b2efbd2538bde2d73128035a84e7fa06ddc8e
7
+ data.tar.gz: 33d50e677dcb99de986b9d0a9e4423530fdbed178b99bb0a6512eedf41d4bcf0e8a0eeeb9a936a6035419914f0089fa7de8c1435bdd40971bdbc6861666bcd32
data/Gemfile CHANGED
@@ -27,6 +27,5 @@ group :test do
27
27
  gem 'minitest', '~> 5.3'
28
28
  gem 'minitest-reporters'
29
29
  gem 'awesome_print', :require => 'ap'
30
- gem 'cqm-validators', git: 'https://github.com/projecttacoma/cqm-validators', branch: 'master'
31
30
  gem 'nokogiri-diff'
32
31
  end
data/README.md CHANGED
@@ -24,7 +24,7 @@ Importing QRDA
24
24
  A QRDA document can be imported into a CQM::Patient (defined in [cqm-models](https://github.com/projecttacoma/cqm-models)) using the following commands.
25
25
 
26
26
  doc = Nokogiri::XML(file)
27
- patient = QRDA::Cat1::PatientImporter.instance.parse_cat1(doc)
27
+ patient, warnings = QRDA::Cat1::PatientImporter.instance.parse_cat1(doc)
28
28
 
29
29
  Exporting QRDA Category I
30
30
  ==========
@@ -19,7 +19,6 @@ require_relative 'html-export/qdm-patient/qdm_patient.rb'
19
19
  require_relative 'qrda-export/catI-r5/qrda1_r5.rb'
20
20
  require_relative 'qrda-export/catIII-r2-1/qrda3_r21.rb'
21
21
 
22
- require_relative 'qrda-import/entry_package.rb'
23
22
  require_relative 'qrda-import/cda_identifier.rb'
24
23
  require_relative 'qrda-import/narrative_reference_handler.rb'
25
24
  require_relative 'qrda-import/entry_finder.rb'
@@ -24,7 +24,7 @@
24
24
  <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Date of birth</span></div>
25
25
  <div class="div-table-head">{{{birthdate}}}</div>
26
26
  <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Date of expiration</span></div>
27
- <div class="div-table-head"></div>
27
+ <div class="div-table-head">{{{expiration}}}</div>
28
28
  </div>
29
29
  <div class="div-head-row patient_narr_tr panel panel-default patient-details">
30
30
  <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Race</span></div>
@@ -39,8 +39,10 @@
39
39
  <div class="div-table-head">{{{mrn}}} Cypress</div>
40
40
  </div>
41
41
  <div class="div-head-row patient_narr_tr panel panel-default patient-details">
42
- <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Contact info</span></div>
43
- <div class="div-table-head"></div>
42
+ <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Address</span></div>
43
+ <div class="div-table-head">{{{patient_addresses}}}</div>
44
+ <div class="div-table-head patient_narr_th panel-heading"><span class="td_label">Telecom</span></div>
45
+ <div class="div-table-head">{{{patient_telecoms}}}</div>
44
46
  </div>
45
47
  </div>
46
48
  </div>
@@ -9,6 +9,36 @@ class QdmPatient < Mustache
9
9
  @include_style = include_style
10
10
  @patient = patient
11
11
  @qdmPatient = patient.qdmPatient
12
+ @patient_addresses = patient['addresses']
13
+ @patient_telecoms = patient['telecoms']
14
+ end
15
+
16
+ def patient_addresses
17
+ @patient_addresses ||= [CQM::Address.new(
18
+ use: 'HP',
19
+ street: ['202 Burlington Rd.'],
20
+ city: 'Bedford',
21
+ state: 'MA',
22
+ zip: '01730',
23
+ country: 'US'
24
+ )]
25
+ address_str = ""
26
+ @patient_addresses.each do |address|
27
+ # create formatted address
28
+ address_str += "<address>"
29
+ address['street'].each { |street| address_str += "#{street}<br>" }
30
+ address_str += "#{address['city']}, #{address['state']} #{address['zip']}<br> #{address['country']} </address>"
31
+ end
32
+ address_str
33
+ end
34
+
35
+ def patient_telecoms
36
+ @patient_telecoms ||= [CQM::Telecom.new(
37
+ use: 'HP',
38
+ value: '555-555-2003'
39
+ )]
40
+ # create formatted telecoms
41
+ @patient_telecoms.map { |telecom| "(#{telecom['use']}) #{telecom['value']}" }.join("<br>")
12
42
  end
13
43
 
14
44
  def include_style?
@@ -25,7 +55,7 @@ class QdmPatient < Mustache
25
55
  end
26
56
 
27
57
  def unit_string
28
- return "#{self['value']} " unless self['unit']
58
+ return "#{self['value']} " if !self['unit'] || self['unit'] == '1'
29
59
  "#{self['value']} #{self['unit']}"
30
60
  end
31
61
 
@@ -16,16 +16,19 @@ module Qrda
16
16
 
17
17
  def provider_npi
18
18
  return nil unless self['ids']
19
+
19
20
  self['ids'].map { |id| id if id['namingSystem'] == '2.16.840.1.113883.4.6' }.compact
20
21
  end
21
22
 
22
23
  def provider_tin
23
24
  return nil unless self['ids']
25
+
24
26
  self['ids'].map { |id| id if id['namingSystem'] == '2.16.840.1.113883.4.2' }.compact
25
27
  end
26
28
 
27
29
  def provider_ccn
28
30
  return nil unless self['ids']
31
+
29
32
  self['ids'].map { |id| id if id['namingSystem'] == '2.16.840.1.113883.4.336' }.compact
30
33
  end
31
34
 
@@ -40,6 +43,42 @@ module Qrda
40
43
  def given_name
41
44
  self['givenNames'].join(' ')
42
45
  end
46
+
47
+ def gender
48
+ gender_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicSex" }
49
+ return if gender_elements.empty?
50
+ gender_elements.first.dataElementCodes.first['code']
51
+ end
52
+
53
+ def birthdate
54
+ birthdate_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicBirthdate" }
55
+ return "None" if birthdate_elements.empty?
56
+ birthdate_elements.first['birthDatetime']
57
+ end
58
+
59
+ def expiration
60
+ expired_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicExpired" }
61
+ return "None" if expired_elements.empty?
62
+ expired_elements.first['expiredDatetime']
63
+ end
64
+
65
+ def race
66
+ race_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicRace" }
67
+ return if race_elements.empty?
68
+ race_elements.first.dataElementCodes.first['code']
69
+ end
70
+
71
+ def ethnic_group
72
+ ethnic_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicEthnicity" }
73
+ return if ethnic_elements.empty?
74
+ ethnic_elements.first.dataElementCodes.first['code']
75
+ end
76
+
77
+ def payer
78
+ payer_elements = @qdmPatient.dataElements.select { |de| de._type == "QDM::PatientCharacteristicPayer" }
79
+ return if payer_elements.empty?
80
+ payer_elements.first.dataElementCodes.first['code']
81
+ end
43
82
  end
44
83
  end
45
84
  end
@@ -1,7 +1,7 @@
1
1
  module QRDA
2
2
  module Cat1
3
3
  class SectionImporter
4
- attr_accessor :check_for_usable, :status_xpath, :code_xpath
4
+ attr_accessor :check_for_usable, :status_xpath, :code_xpath, :warnings
5
5
 
6
6
  def initialize(entry_finder)
7
7
  @entry_finder = entry_finder
@@ -9,6 +9,7 @@ module QRDA
9
9
  @entry_id_map = {}
10
10
  @check_for_usable = true
11
11
  @entry_class = QDM::DataElement
12
+ @warnings = []
12
13
  end
13
14
 
14
15
  # Traverses an HL7 CDA document passed in and creates an Array of Entry
@@ -112,6 +113,19 @@ module QRDA
112
113
  low_time = Time.parse(parent_element.at_xpath("#{interval_xpath}/cda:center")['value'])
113
114
  high_time = Time.parse(parent_element.at_xpath("#{interval_xpath}/cda:center")['value'])
114
115
  end
116
+ if low_time && high_time && low_time > high_time
117
+ # pass warning: current code continues as expected, but adds warning
118
+ id_attr = parent_element.at_xpath(".//cda:id").attributes
119
+ qrda_type = @entry_class.to_s.split("::")[1]
120
+ @warnings << ValidationError.new(message: "Interval with low time after high time. Located in element with QRDA type: #{qrda_type} and id: #{id_attr['root']&.value}(root), #{id_attr['extension']&.value}(extension).",
121
+ location: parent_element.path)
122
+ end
123
+ if low_time.nil? && high_time.nil?
124
+ id_attr = parent_element.at_xpath(".//cda:id").attributes
125
+ qrda_type = @entry_class.to_s.split("::")[1]
126
+ @warnings << ValidationError.new(message: "Interval with nullFlavor low time and nullFlavor high time. Located in element with QRDA type: #{qrda_type} and id: #{id_attr['root']&.value}(root), #{id_attr['extension']&.value if id_attr['extension']}(extension).",
127
+ location: parent_element.path)
128
+ end
115
129
  QDM::Interval.new(low_time, high_time).shift_dates(0)
116
130
  end
117
131
 
@@ -167,6 +181,10 @@ module QRDA
167
181
  elsif value_element['code'].present?
168
182
  return code_if_present(value_element)
169
183
  elsif value_element.text.present?
184
+ id_attr = value_element.parent.at_xpath(".//cda:id").attributes
185
+ qrda_type = @entry_class.to_s.split("::")[1]
186
+ @warnings << ValidationError.new(message: "Value with string type found. When possible, it's best practice to use a coded value or scalar. Located in element with QRDA type: #{qrda_type} and id: #{id_attr['root']&.value}(root), #{id_attr['extension']&.value}(extension).",
187
+ location: value_element.path)
170
188
  return value_element.text
171
189
  end
172
190
  end
@@ -194,8 +212,17 @@ module QRDA
194
212
  def extract_negated_code(parent_element, entry)
195
213
  code_elements = parent_element.xpath(@code_xpath)
196
214
  code_elements.each do |code_element|
197
- if code_element['nullFlavor'] == 'NA' && code_element['sdtc:valueSet']
198
- entry.dataElementCodes = [{ code: code_element['sdtc:valueSet'], system: '1.2.3.4.5.6.7.8.9.10' }]
215
+ if code_element['nullFlavor'] == 'NA'
216
+ if code_element['sdtc:valueSet']
217
+ entry.dataElementCodes = [{ code: code_element['sdtc:valueSet'], system: '1.2.3.4.5.6.7.8.9.10' }]
218
+ else
219
+ # negated code is nullFlavored with no valueset
220
+ entry.dataElementCodes = [{ code: "NA", system: '1.2.3.4.5.6.7.8.9.10' }]
221
+ id_attr = parent_element.at_xpath(".//cda:id").attributes
222
+ qrda_type = @entry_class.to_s.split("::")[1]
223
+ @warnings << ValidationError.new(message: "Negated code element contains nullFlavor code but no valueset. Located in element with QRDA type: #{qrda_type} and id: #{id_attr['root']&.value}(root), #{id_attr['extension']&.value}(extension).",
224
+ location: parent_element.path)
225
+ end
199
226
  end
200
227
  end
201
228
  end
@@ -12,70 +12,71 @@ module QRDA
12
12
  def initialize
13
13
  # This differs from other HDS patient importers in that sections can have multiple importers
14
14
  @data_element_importers = []
15
- @data_element_importers << generate_importer(AdverseEventImporter)
16
- @data_element_importers << generate_importer(AllergyIntoleranceImporter)
17
- @data_element_importers << generate_importer(AssessmentOrderImporter)
18
- @data_element_importers << generate_importer(AssessmentPerformedImporter)
19
- @data_element_importers << generate_importer(AssessmentRecommendedImporter)
20
- @data_element_importers << generate_importer(CommunicationPerformedImporter)
21
- @data_element_importers << generate_importer(DeviceAppliedImporter)
22
- @data_element_importers << generate_importer(DeviceOrderImporter)
23
- @data_element_importers << generate_importer(DeviceRecommendedImporter)
24
- @data_element_importers << generate_importer(DiagnosisImporter)
25
- @data_element_importers << generate_importer(DiagnosticStudyOrderImporter)
26
- @data_element_importers << generate_importer(DiagnosticStudyPerformedImporter)
27
- @data_element_importers << generate_importer(DiagnosticStudyRecommendedImporter)
28
- @data_element_importers << generate_importer(EncounterOrderImporter)
29
- @data_element_importers << generate_importer(EncounterPerformedImporter)
30
- @data_element_importers << generate_importer(EncounterRecommendedImporter)
31
- @data_element_importers << generate_importer(FamilyHistoryImporter)
32
- @data_element_importers << generate_importer(ImmunizationAdministeredImporter)
33
- @data_element_importers << generate_importer(ImmunizationOrderImporter)
34
- @data_element_importers << generate_importer(InterventionOrderImporter)
35
- @data_element_importers << generate_importer(InterventionPerformedImporter)
36
- @data_element_importers << generate_importer(InterventionRecommendedImporter)
37
- @data_element_importers << generate_importer(LaboratoryTestOrderImporter)
38
- @data_element_importers << generate_importer(LaboratoryTestPerformedImporter)
39
- @data_element_importers << generate_importer(LaboratoryTestRecommendedImporter)
40
- @data_element_importers << generate_importer(MedicationActiveImporter)
41
- @data_element_importers << generate_importer(MedicationAdministeredImporter)
42
- @data_element_importers << generate_importer(MedicationDischargeImporter)
43
- @data_element_importers << generate_importer(MedicationDispensedImporter)
44
- @data_element_importers << generate_importer(MedicationOrderImporter)
45
- @data_element_importers << generate_importer(PatientCareExperienceImporter)
46
- @data_element_importers << generate_importer(PatientCharacteristicClinicalTrialParticipantImporter)
47
- @data_element_importers << generate_importer(PatientCharacteristicExpiredImporter)
48
- @data_element_importers << generate_importer(PatientCharacteristicPayerImporter)
49
- @data_element_importers << generate_importer(PhysicalExamOrderImporter)
50
- @data_element_importers << generate_importer(PhysicalExamPerformedImporter)
51
- @data_element_importers << generate_importer(PhysicalExamRecommendedImporter)
52
- @data_element_importers << generate_importer(ProcedureOrderImporter)
53
- @data_element_importers << generate_importer(ProcedurePerformedImporter)
54
- @data_element_importers << generate_importer(ProcedureRecommendedImporter)
55
- @data_element_importers << generate_importer(ProgramParticipationImporter)
56
- @data_element_importers << generate_importer(ProviderCareExperienceImporter)
57
- @data_element_importers << generate_importer(RelatedPersonImporter)
58
- @data_element_importers << generate_importer(SubstanceAdministeredImporter)
59
- @data_element_importers << generate_importer(SubstanceOrderImporter)
60
- @data_element_importers << generate_importer(SubstanceRecommendedImporter)
61
- @data_element_importers << generate_importer(SymptomImporter)
62
- end
15
+ @data_element_importers << AdverseEventImporter.new
16
+ @data_element_importers << AllergyIntoleranceImporter.new
17
+ @data_element_importers << AssessmentOrderImporter.new
18
+ @data_element_importers << AssessmentPerformedImporter.new
19
+ @data_element_importers << AssessmentRecommendedImporter.new
20
+ @data_element_importers << CommunicationPerformedImporter.new
21
+ @data_element_importers << DeviceAppliedImporter.new
22
+ @data_element_importers << DeviceOrderImporter.new
23
+ @data_element_importers << DeviceRecommendedImporter.new
24
+ @data_element_importers << DiagnosisImporter.new
25
+ @data_element_importers << DiagnosticStudyOrderImporter.new
26
+ @data_element_importers << DiagnosticStudyPerformedImporter.new
27
+ @data_element_importers << DiagnosticStudyRecommendedImporter.new
28
+ @data_element_importers << EncounterOrderImporter.new
29
+ @data_element_importers << EncounterPerformedImporter.new
30
+ @data_element_importers << EncounterRecommendedImporter.new
31
+ @data_element_importers << FamilyHistoryImporter.new
32
+ @data_element_importers << ImmunizationAdministeredImporter.new
33
+ @data_element_importers << ImmunizationOrderImporter.new
34
+ @data_element_importers << InterventionOrderImporter.new
35
+ @data_element_importers << InterventionPerformedImporter.new
36
+ @data_element_importers << InterventionRecommendedImporter.new
37
+ @data_element_importers << LaboratoryTestOrderImporter.new
38
+ @data_element_importers << LaboratoryTestPerformedImporter.new
39
+ @data_element_importers << LaboratoryTestRecommendedImporter.new
40
+ @data_element_importers << MedicationActiveImporter.new
41
+ @data_element_importers << MedicationAdministeredImporter.new
42
+ @data_element_importers << MedicationDischargeImporter.new
43
+ @data_element_importers << MedicationDispensedImporter.new
44
+ @data_element_importers << MedicationOrderImporter.new
45
+ @data_element_importers << PatientCareExperienceImporter.new
46
+ @data_element_importers << PatientCharacteristicClinicalTrialParticipantImporter.new
47
+ @data_element_importers << PatientCharacteristicExpiredImporter.new
48
+ @data_element_importers << PatientCharacteristicPayerImporter.new
49
+ @data_element_importers << PhysicalExamOrderImporter.new
50
+ @data_element_importers << PhysicalExamPerformedImporter.new
51
+ @data_element_importers << PhysicalExamRecommendedImporter.new
52
+ @data_element_importers << ProcedureOrderImporter.new
53
+ @data_element_importers << ProcedurePerformedImporter.new
54
+ @data_element_importers << ProcedureRecommendedImporter.new
55
+ @data_element_importers << ProgramParticipationImporter.new
56
+ @data_element_importers << ProviderCareExperienceImporter.new
57
+ @data_element_importers << RelatedPersonImporter.new
58
+ @data_element_importers << SubstanceAdministeredImporter.new
59
+ @data_element_importers << SubstanceOrderImporter.new
60
+ @data_element_importers << SubstanceRecommendedImporter.new
61
+ @data_element_importers << SymptomImporter.new
62
+ end
63
63
 
64
64
  def parse_cat1(doc)
65
65
  patient = CQM::Patient.new
66
+ warnings = []
66
67
  entry_id_map = {}
67
- import_data_elements(patient, doc, entry_id_map)
68
+ import_data_elements(patient, doc, entry_id_map, warnings)
68
69
  normalize_references(patient, entry_id_map)
69
70
  get_demographics(patient, doc)
70
- patient
71
+ [patient, warnings]
71
72
  end
72
73
 
73
- def import_data_elements(patient, doc, entry_id_map)
74
+ def import_data_elements(patient, doc, entry_id_map, warnings = [])
74
75
  context = doc.xpath("/cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section[cda:templateId/@root = '2.16.840.1.113883.10.20.24.2.1']")
75
76
  nrh = NarrativeReferenceHandler.new
76
77
  nrh.build_id_map(doc)
77
- @data_element_importers.each do |entry_package|
78
- data_elements, id_map = entry_package.package_entries(context, nrh)
78
+ @data_element_importers.each do |importer|
79
+ data_elements, id_map = importer.create_entries(context, nrh)
79
80
  new_data_elements = []
80
81
 
81
82
  id_map.each_value do |elem_ids|
@@ -92,7 +93,7 @@ module QRDA
92
93
  unique_element_keys << key_elements_for_determining_encounter_uniqueness(data_element)
93
94
 
94
95
  # Loop through all other data elements with the same id
95
- elem_ids[1,elem_ids.length].each do |dup_id|
96
+ elem_ids[1,elem_ids.length].each do |dup_id|
96
97
  dup_element = data_elements.find { |de| de.id == dup_id }
97
98
  dup_element_keys = key_elements_for_determining_encounter_uniqueness(dup_element)
98
99
  # See if a previously selected data element shared all of the keys files
@@ -107,6 +108,9 @@ module QRDA
107
108
 
108
109
  patient.qdmPatient.dataElements << new_data_elements
109
110
  entry_id_map.merge!(id_map)
111
+ warnings.concat(importer.warnings)
112
+ # reset warnings after they're captured so that the importer can be re-used
113
+ importer.warnings = []
110
114
  end
111
115
  end
112
116
 
@@ -136,12 +140,6 @@ module QRDA
136
140
  data_element.relatedTo = relations_to_add.map(&:to_s)
137
141
  end
138
142
  end
139
-
140
- private
141
-
142
- def generate_importer(importer_class)
143
- EntryPackage.new(importer_class.new)
144
- end
145
143
  end
146
144
  end
147
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cqm-reports
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - The MITRE Corporation
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-09 00:00:00.000000000 Z
11
+ date: 2020-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cqm-models
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: cqm-validators
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.0.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: mustache
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -314,7 +328,6 @@ files:
314
328
  - lib/qrda-import/data-element-importers/substance_recommended_importer.rb
315
329
  - lib/qrda-import/data-element-importers/symptom_importer.rb
316
330
  - lib/qrda-import/entry_finder.rb
317
- - lib/qrda-import/entry_package.rb
318
331
  - lib/qrda-import/narrative_reference_handler.rb
319
332
  - lib/qrda-import/patient_importer.rb
320
333
  - lib/util/code_system_helper.rb
@@ -1,16 +0,0 @@
1
- module QRDA
2
- module Cat1
3
- class EntryPackage
4
-
5
- attr_accessor :importer_type
6
-
7
- def initialize(type)
8
- self.importer_type = type
9
- end
10
-
11
- def package_entries(doc, nrh)
12
- importer_type.create_entries(doc, nrh)
13
- end
14
- end
15
- end
16
- end