simple_hl7_parser 1.0.0 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.ruby-version +1 -1
- data/README.md +42 -5
- data/lib/simple_hl7_parser/hl7.rb +7 -3
- data/lib/simple_hl7_parser/segments/msh_segment.rb +29 -0
- data/lib/simple_hl7_parser/segments/obr_segment.rb +19 -0
- data/lib/simple_hl7_parser/segments/obx_segment.rb +27 -0
- data/lib/simple_hl7_parser/segments/orc_segment.rb +34 -0
- data/lib/simple_hl7_parser/segments/pid_segment.rb +39 -0
- data/lib/simple_hl7_parser/segments/segment.rb +31 -0
- data/lib/simple_hl7_parser/version.rb +1 -1
- data/simple_hl7_parser.gemspec +1 -1
- metadata +14 -10
- data/lib/simple_hl7_parser/segment.rb +0 -163
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f651504ba00aa33a0bbc76166799703bc1183d7eb0b0adb601d8cd079536db07
|
4
|
+
data.tar.gz: b003476b62af26af208fcf4274ffb0c059de703d30d1f0e04cec5940e9fe4b08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38c21d5c21f2fd31a8b81686f72e6d16c8921e78a70927971505dc6a2150b0b0204702d0f33c9f5e1140fbfd9f1515a45c338134ebce6b5439ee593052d10a7f
|
7
|
+
data.tar.gz: 648aaba4808d1be6bd47dff3d53fe31f6c8e9d6f6afac8f47bbbc899b261fd3ec4555f431055a4132a64fbee71740572c0d6b0fa0999f134ff18ccd43e84addb
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
3.1.0
|
data/README.md
CHANGED
@@ -38,16 +38,53 @@ msg.obx.first.observation_value #=> "^182"
|
|
38
38
|
msg.obx.first.units #=> "mg/dl"
|
39
39
|
```
|
40
40
|
|
41
|
-
##
|
41
|
+
## Contributing
|
42
42
|
|
43
|
-
|
43
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/sufyanadam/simple_hl7_parser. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
44
44
|
|
45
|
-
|
45
|
+
### Adding support for a HL7 Segment
|
46
46
|
|
47
|
-
|
47
|
+
Just create a class under the `SimpleHL7Parser` module namespace called
|
48
|
+
`XXXSegment` (where `XXX` is a segment name, such as `PID`), include the
|
49
|
+
`Segment` module and define a column map. That's it! It's that simple; hence
|
50
|
+
the name `SimpleHL7Parser`.
|
48
51
|
|
49
|
-
|
52
|
+
The column map is a map of `segment_attribute => position_number`. For example,
|
53
|
+
the `placer_order_number` is the third element in the `OBR` segment. So the
|
54
|
+
column map would define `{placer_order_number: 2}`. The `segment_attribute`
|
55
|
+
part of the column map becomes the name of the function you can call to
|
56
|
+
retrieve the value of the attribute at the position it maps to.
|
57
|
+
|
58
|
+
The example below demonstrates how `SimpleHL7Parser` currently
|
59
|
+
supports parsing the `OBR` HL7 segment in Ruby:
|
60
|
+
|
61
|
+
Example:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
# Extending SimpleHL7Parser to support another
|
65
|
+
# HL7 Segment
|
66
|
+
require 'simple_hl7_parser/segments/segment'
|
67
|
+
|
68
|
+
module SimpleHL7Parser
|
69
|
+
class OBRSegment
|
70
|
+
include Segment
|
71
|
+
|
72
|
+
COLUMN_MAP = {
|
73
|
+
set_id: 1,
|
74
|
+
placer_order_number: 2,
|
75
|
+
filler_order_number: 3,
|
76
|
+
universal_service_id: 4,
|
77
|
+
priority: 5,
|
78
|
+
requested_date_time: 6,
|
79
|
+
observation_date_time: 7,
|
80
|
+
observation_end_date_time: 8,
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
```
|
50
85
|
|
86
|
+
After adding support for a new segment, add a test that demonstrates
|
87
|
+
it works correctly and make a pull request :)
|
51
88
|
|
52
89
|
## License
|
53
90
|
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'simple_hl7_parser/hl7_message'
|
2
|
+
require 'simple_hl7_parser/segments/msh_segment'
|
3
|
+
require 'simple_hl7_parser/segments/pid_segment'
|
4
|
+
require 'simple_hl7_parser/segments/orc_segment'
|
5
|
+
require 'simple_hl7_parser/segments/obr_segment'
|
6
|
+
require 'simple_hl7_parser/segments/obx_segment'
|
3
7
|
|
4
8
|
module SimpleHL7Parser
|
5
9
|
class HL7
|
@@ -16,7 +20,7 @@ module SimpleHL7Parser
|
|
16
20
|
segments = hl7.split("\n").map do |line|
|
17
21
|
segment_data = line.split('|')
|
18
22
|
segment_type = segment_data.first
|
19
|
-
current_parent_obr = nil unless %w[OBR OBX].include?(segment_type)
|
23
|
+
current_parent_obr = nil unless %w[OBR OBX NTE].include?(segment_type)
|
20
24
|
|
21
25
|
if klass = SEGMENT_MAP[segment_type.to_sym]
|
22
26
|
if segment_type == 'OBR'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'simple_hl7_parser/segments/segment'
|
2
|
+
|
3
|
+
module SimpleHL7Parser
|
4
|
+
class MSHSegment
|
5
|
+
include Segment
|
6
|
+
|
7
|
+
COLUMN_MAP = {
|
8
|
+
field_separator: 1,
|
9
|
+
sending_application: 2,
|
10
|
+
sending_facility: 3,
|
11
|
+
receiving_application: 4,
|
12
|
+
receiving_facility: 5,
|
13
|
+
date_time_of_message: 6,
|
14
|
+
security: 7,
|
15
|
+
message_type: 8,
|
16
|
+
message_control_id: 9,
|
17
|
+
processing_id: 10,
|
18
|
+
version_id: 11,
|
19
|
+
sequence_number: 12,
|
20
|
+
continuation_pointer: 13,
|
21
|
+
accept_acknowledgment_type: 14,
|
22
|
+
application_acknowledgment_type: 15,
|
23
|
+
country_code: 16,
|
24
|
+
character_set: 17,
|
25
|
+
principal_language_of_message: 18,
|
26
|
+
alternate_character_set_handling_Scheme: 19,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'simple_hl7_parser/segments/segment'
|
2
|
+
|
3
|
+
module SimpleHL7Parser
|
4
|
+
class OBRSegment
|
5
|
+
include Segment
|
6
|
+
|
7
|
+
COLUMN_MAP = {
|
8
|
+
set_id: 1,
|
9
|
+
placer_order_number: 2,
|
10
|
+
filler_order_number: 3,
|
11
|
+
universal_service_id: 4,
|
12
|
+
priority: 5,
|
13
|
+
requested_date_time: 6,
|
14
|
+
observation_date_time: 7,
|
15
|
+
observation_end_date_time: 8,
|
16
|
+
specimen_received_date_time: 14,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'simple_hl7_parser/segments/segment'
|
2
|
+
|
3
|
+
module SimpleHL7Parser
|
4
|
+
class OBXSegment
|
5
|
+
include Segment
|
6
|
+
|
7
|
+
COLUMN_MAP = {
|
8
|
+
set_id: 1,
|
9
|
+
value_type: 2,
|
10
|
+
observation_identifier: 3,
|
11
|
+
observation_sub_id: 4,
|
12
|
+
observation_value: 5,
|
13
|
+
units: 6,
|
14
|
+
references_range: 7,
|
15
|
+
abnormal_flags: 8,
|
16
|
+
probability: 9,
|
17
|
+
nature_of_abnormal_test: 10,
|
18
|
+
observation_result_status: 11,
|
19
|
+
date_last_obs_normal_values: 12,
|
20
|
+
user_defined_access_checks: 13,
|
21
|
+
date_time_of_the_observation: 14,
|
22
|
+
producer_id: 15,
|
23
|
+
responsible_observer: 16,
|
24
|
+
observation_method: 17,
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'simple_hl7_parser/segments/segment'
|
2
|
+
|
3
|
+
module SimpleHL7Parser
|
4
|
+
class ORCSegment
|
5
|
+
include Segment
|
6
|
+
|
7
|
+
COLUMN_MAP = {
|
8
|
+
order_control: 1,
|
9
|
+
placer_order_number: 2,
|
10
|
+
filler_order_number: 3,
|
11
|
+
placer_group_number: 4,
|
12
|
+
order_status: 5,
|
13
|
+
response_flag: 6,
|
14
|
+
quantity_timing: 7,
|
15
|
+
parent_order: 8,
|
16
|
+
date_time_of_transaction: 9,
|
17
|
+
entered_by: 10,
|
18
|
+
verified_by: 11,
|
19
|
+
ordering_provider: 12,
|
20
|
+
enterer_s_location: 13,
|
21
|
+
call_back_phone_number: 14,
|
22
|
+
order_effective_date_time: 15,
|
23
|
+
order_control_code_reason: 16,
|
24
|
+
entering_organization: 17,
|
25
|
+
entering_device: 18,
|
26
|
+
action_by: 19,
|
27
|
+
advanced_beneficiary_notice_code: 20,
|
28
|
+
ordering_facility_name: 21,
|
29
|
+
ordering_facility_address: 22,
|
30
|
+
ordering_facility_phone_number: 23,
|
31
|
+
ordering_provider_address: 24,
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'simple_hl7_parser/segments/segment'
|
2
|
+
|
3
|
+
module SimpleHL7Parser
|
4
|
+
class PIDSegment
|
5
|
+
include Segment
|
6
|
+
|
7
|
+
COLUMN_MAP = {
|
8
|
+
patient_id: 2,
|
9
|
+
patient_identifier_list: 3,
|
10
|
+
alternae_patient_id: 4,
|
11
|
+
patientname: 5,
|
12
|
+
mother_maiden_name: 6,
|
13
|
+
date_of_birth: 7,
|
14
|
+
sex: 8,
|
15
|
+
patientalias: 9,
|
16
|
+
race: 10,
|
17
|
+
patient_address: 11,
|
18
|
+
county_ode: 12,
|
19
|
+
phone_nmber_home: 13,
|
20
|
+
phone_nmber_business: 14,
|
21
|
+
primary_language: 15,
|
22
|
+
marital_status: 16,
|
23
|
+
religion: 17,
|
24
|
+
patient_account_number: 18,
|
25
|
+
ssn_numer_patient: 19,
|
26
|
+
driver_license_number_patient: 20,
|
27
|
+
mothers_identifier: 21,
|
28
|
+
ethnic_roup: 22,
|
29
|
+
birth_pace: 23,
|
30
|
+
multiple_birth_indicator: 24,
|
31
|
+
birth_oder: 25,
|
32
|
+
citizenhip: 26,
|
33
|
+
veteran_military_status: 27,
|
34
|
+
nationaity: 28,
|
35
|
+
patient_death_date_and_time: 29,
|
36
|
+
patient_death_indicator: 30,
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module SimpleHL7Parser
|
2
|
+
module Segment
|
3
|
+
attr_reader :segment_array, :obr
|
4
|
+
|
5
|
+
def initialize(segment_array, obr = nil)
|
6
|
+
@segment_array = segment_array
|
7
|
+
@obr = obr
|
8
|
+
end
|
9
|
+
|
10
|
+
def segment_type
|
11
|
+
segment_array.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing(symbol, *args, &block)
|
15
|
+
if symbol.to_s.include?('?')
|
16
|
+
return "#{segment_type}?".to_sym == symbol.upcase
|
17
|
+
end
|
18
|
+
|
19
|
+
if self.class::COLUMN_MAP[symbol]
|
20
|
+
segment_array[self.class::COLUMN_MAP[symbol]]
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def respond_to_missing?(symbol, include_private = false)
|
27
|
+
"#{segment_type}?".to_sym == symbol.upcase? ||
|
28
|
+
segment_array[self.class::COLUMN_MAP[symbol]] || super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/simple_hl7_parser.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ["lib"]
|
32
32
|
|
33
|
-
spec.add_development_dependency "bundler", "~>
|
33
|
+
spec.add_development_dependency "bundler", "~> 2.3"
|
34
34
|
spec.add_development_dependency "rake", "~> 10.0"
|
35
35
|
spec.add_development_dependency "rspec", "~> 3.0"
|
36
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_hl7_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sufyan Adam
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,7 +73,12 @@ files:
|
|
73
73
|
- lib/simple_hl7_parser.rb
|
74
74
|
- lib/simple_hl7_parser/hl7.rb
|
75
75
|
- lib/simple_hl7_parser/hl7_message.rb
|
76
|
-
- lib/simple_hl7_parser/
|
76
|
+
- lib/simple_hl7_parser/segments/msh_segment.rb
|
77
|
+
- lib/simple_hl7_parser/segments/obr_segment.rb
|
78
|
+
- lib/simple_hl7_parser/segments/obx_segment.rb
|
79
|
+
- lib/simple_hl7_parser/segments/orc_segment.rb
|
80
|
+
- lib/simple_hl7_parser/segments/pid_segment.rb
|
81
|
+
- lib/simple_hl7_parser/segments/segment.rb
|
77
82
|
- lib/simple_hl7_parser/version.rb
|
78
83
|
- simple_hl7_parser.gemspec
|
79
84
|
homepage: https://github.com/sufyanadam/simple_hl7_parser
|
@@ -81,7 +86,7 @@ licenses:
|
|
81
86
|
- MIT
|
82
87
|
metadata:
|
83
88
|
allowed_push_host: https://rubygems.org
|
84
|
-
post_install_message:
|
89
|
+
post_install_message:
|
85
90
|
rdoc_options: []
|
86
91
|
require_paths:
|
87
92
|
- lib
|
@@ -96,9 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
101
|
- !ruby/object:Gem::Version
|
97
102
|
version: '0'
|
98
103
|
requirements: []
|
99
|
-
|
100
|
-
|
101
|
-
signing_key:
|
104
|
+
rubygems_version: 3.3.3
|
105
|
+
signing_key:
|
102
106
|
specification_version: 4
|
103
107
|
summary: Simple, extensible HL7 message parser
|
104
108
|
test_files: []
|
@@ -1,163 +0,0 @@
|
|
1
|
-
module SimpleHL7Parser
|
2
|
-
module Segment
|
3
|
-
attr_reader :segment_array, :obr
|
4
|
-
|
5
|
-
def initialize(segment_array, obr = nil)
|
6
|
-
@segment_array = segment_array
|
7
|
-
@obr = obr
|
8
|
-
end
|
9
|
-
|
10
|
-
def segment_type
|
11
|
-
segment_array.first
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(symbol, *args, &block)
|
15
|
-
if symbol.to_s.include?('?')
|
16
|
-
return "#{segment_type}?".to_sym == symbol.upcase
|
17
|
-
end
|
18
|
-
|
19
|
-
if self.class::COLUMN_MAP[symbol]
|
20
|
-
segment_array[self.class::COLUMN_MAP[symbol]]
|
21
|
-
else
|
22
|
-
super
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def respond_to_missing?(symbol, include_private = false)
|
27
|
-
"#{segment_type}?".to_sym == symbol.upcase? ||
|
28
|
-
segment_array[self.class::COLUMN_MAP[symbol]] || super
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class MSHSegment
|
33
|
-
include Segment
|
34
|
-
|
35
|
-
COLUMN_MAP = {
|
36
|
-
field_separator: 1,
|
37
|
-
sending_application: 2,
|
38
|
-
sending_facility: 3,
|
39
|
-
receiving_application: 4,
|
40
|
-
receiving_facility: 5,
|
41
|
-
date_time_of_message: 6,
|
42
|
-
security: 7,
|
43
|
-
message_type: 8,
|
44
|
-
message_control_id: 9,
|
45
|
-
processing_id: 10,
|
46
|
-
version_id: 11,
|
47
|
-
sequence_number: 12,
|
48
|
-
continuation_pointer: 13,
|
49
|
-
accept_acknowledgment_type: 14,
|
50
|
-
application_acknowledgment_type: 15,
|
51
|
-
country_code: 16,
|
52
|
-
character_set: 17,
|
53
|
-
principal_language_of_message: 18,
|
54
|
-
alternate_character_set_handling_Scheme: 19,
|
55
|
-
}
|
56
|
-
end
|
57
|
-
|
58
|
-
class PIDSegment
|
59
|
-
include Segment
|
60
|
-
|
61
|
-
COLUMN_MAP = {
|
62
|
-
patient_id: 2,
|
63
|
-
patient_identifier_list: 3,
|
64
|
-
alternae_patient_id: 4,
|
65
|
-
patientname: 5,
|
66
|
-
mother_maiden_name: 6,
|
67
|
-
date_of_birth: 7,
|
68
|
-
sex: 8,
|
69
|
-
patientalias: 9,
|
70
|
-
race: 10,
|
71
|
-
patient_address: 11,
|
72
|
-
county_ode: 12,
|
73
|
-
phone_nmber_home: 13,
|
74
|
-
phone_nmber_business: 14,
|
75
|
-
primary_language: 15,
|
76
|
-
marital_status: 16,
|
77
|
-
religion: 17,
|
78
|
-
patient_account_number: 18,
|
79
|
-
ssn_numer_patient: 19,
|
80
|
-
driver_license_number_patient: 20,
|
81
|
-
mothers_identifier: 21,
|
82
|
-
ethnic_roup: 22,
|
83
|
-
birth_pace: 23,
|
84
|
-
multiple_birth_indicator: 24,
|
85
|
-
birth_oder: 25,
|
86
|
-
citizenhip: 26,
|
87
|
-
veteran_military_status: 27,
|
88
|
-
nationaity: 28,
|
89
|
-
patient_death_date_and_time: 29,
|
90
|
-
patient_death_indicator: 30,
|
91
|
-
}
|
92
|
-
end
|
93
|
-
|
94
|
-
class ORCSegment
|
95
|
-
include Segment
|
96
|
-
|
97
|
-
COLUMN_MAP = {
|
98
|
-
order_control: 1,
|
99
|
-
placer_order_number: 2,
|
100
|
-
filler_order_number: 3,
|
101
|
-
placer_group_number: 4,
|
102
|
-
order_status: 5,
|
103
|
-
response_flag: 6,
|
104
|
-
quantity_timing: 7,
|
105
|
-
parent_order: 8,
|
106
|
-
date_time_of_transaction: 9,
|
107
|
-
entered_by: 10,
|
108
|
-
verified_by: 11,
|
109
|
-
ordering_provider: 12,
|
110
|
-
enterer_s_location: 13,
|
111
|
-
call_back_phone_number: 14,
|
112
|
-
order_effective_date_time: 15,
|
113
|
-
order_control_code_reason: 16,
|
114
|
-
entering_organization: 17,
|
115
|
-
entering_device: 18,
|
116
|
-
action_by: 19,
|
117
|
-
advanced_beneficiary_notice_code: 20,
|
118
|
-
ordering_facility_name: 21,
|
119
|
-
ordering_facility_address: 22,
|
120
|
-
ordering_facility_phone_number: 23,
|
121
|
-
ordering_provider_address: 24,
|
122
|
-
}
|
123
|
-
end
|
124
|
-
|
125
|
-
class OBRSegment
|
126
|
-
include Segment
|
127
|
-
|
128
|
-
COLUMN_MAP = {
|
129
|
-
set_id: 1,
|
130
|
-
placer_order_number: 2,
|
131
|
-
filler_order_number: 3,
|
132
|
-
universal_service_id: 4,
|
133
|
-
priority: 5,
|
134
|
-
requested_date_time: 6,
|
135
|
-
observation_date_time: 7,
|
136
|
-
observation_end_date_time: 8,
|
137
|
-
}
|
138
|
-
end
|
139
|
-
|
140
|
-
class OBXSegment
|
141
|
-
include Segment
|
142
|
-
|
143
|
-
COLUMN_MAP = {
|
144
|
-
set_id: 1,
|
145
|
-
value_type: 2,
|
146
|
-
observation_identifier: 3,
|
147
|
-
observation_sub_id: 4,
|
148
|
-
observation_value: 5,
|
149
|
-
units: 6,
|
150
|
-
references_range: 7,
|
151
|
-
abnormal_flags: 8,
|
152
|
-
probability: 9,
|
153
|
-
nature_of_abnormal_test: 10,
|
154
|
-
observation_result_status: 11,
|
155
|
-
date_last_obs_normal_values: 12,
|
156
|
-
user_defined_access_checks: 13,
|
157
|
-
date_time_of_the_observation: 14,
|
158
|
-
producer_id: 15,
|
159
|
-
responsible_observer: 16,
|
160
|
-
observation_method: 17,
|
161
|
-
}
|
162
|
-
end
|
163
|
-
end
|