rbedi 0.0.0 → 0.0.1
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 +4 -4
- data/bin/edi +897 -0
- data/lib/rbedi/codes/aaa.rb +437 -0
- data/lib/rbedi/codes/ak1.rb +278 -0
- data/lib/rbedi/codes/ak2.rb +336 -0
- data/lib/rbedi/codes/ak9.rb +55 -0
- data/lib/rbedi/codes/bht.rb +706 -0
- data/lib/rbedi/codes/codeset.rb +27 -0
- data/lib/rbedi/codes/dmg.rb +1583 -0
- data/lib/rbedi/codes/dtp.rb +1342 -0
- data/lib/rbedi/codes/eb.rb +1511 -0
- data/lib/rbedi/codes/eq.rb +286 -0
- data/lib/rbedi/codes/ge.rb +14 -0
- data/lib/rbedi/codes/gs.rb +287 -0
- data/lib/rbedi/codes/hl.rb +273 -0
- data/lib/rbedi/codes/iea.rb +14 -0
- data/lib/rbedi/codes/ik3.rb +32 -0
- data/lib/rbedi/codes/ik4.rb +37 -0
- data/lib/rbedi/codes/ik5.rb +56 -0
- data/lib/rbedi/codes/isa.rb +137 -0
- data/lib/rbedi/codes/le.rb +13 -0
- data/lib/rbedi/codes/ls.rb +13 -0
- data/lib/rbedi/codes/msg.rb +25 -0
- data/lib/rbedi/codes/n3.rb +14 -0
- data/lib/rbedi/codes/n4.rb +706 -0
- data/lib/rbedi/codes/nm1.rb +1916 -0
- data/lib/rbedi/codes/per.rb +308 -0
- data/lib/rbedi/codes/ref.rb +1749 -0
- data/lib/rbedi/codes/se.rb +14 -0
- data/lib/rbedi/codes/segment_names.rb +44 -0
- data/lib/rbedi/codes/st.rb +336 -0
- data/lib/rbedi/codes/trn.rb +22 -0
- data/lib/rbedi/codes.rb +8 -0
- data/lib/rbedi/edi_date_time.rb +69 -0
- data/lib/rbedi/functional_group.rb +52 -0
- data/lib/rbedi/non_existent_element_error.rb +4 -0
- data/lib/rbedi/parser.rb +102 -0
- data/lib/rbedi/segment.rb +114 -0
- data/lib/rbedi/transaction_envelope.rb +77 -0
- data/lib/rbedi/transaction_set.rb +40 -0
- data/lib/rbedi.rb +20 -4
- metadata +79 -10
@@ -0,0 +1,114 @@
|
|
1
|
+
module RBEDI
|
2
|
+
class Segment
|
3
|
+
def initialize(segment_name, segment_elements={})
|
4
|
+
@segment_name = get_raw_segment_name(segment_name)
|
5
|
+
@separator = segment_elements.delete(:_separator)
|
6
|
+
|
7
|
+
begin
|
8
|
+
@codes_class = Codes.const_get(@segment_name)
|
9
|
+
rescue NameError
|
10
|
+
@codes_class = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
@segment_elements = []
|
14
|
+
segment_elements.each do |k, v|
|
15
|
+
self[k] = v
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
([@segment_name] + @segment_elements).join(Codes::ELEMENT_SEPARATOR) + Codes::SEGMENT_TERMINATOR
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](element)
|
24
|
+
return get_raw_element(element) unless @codes_class
|
25
|
+
|
26
|
+
element_pos = get_element_pos(element)
|
27
|
+
|
28
|
+
raise NonExistentElementError, "Element `#{element}' does not exist for segment `#{raw_segment_name}'" unless element_pos
|
29
|
+
|
30
|
+
code = @codes_class.code(element_pos, get_raw_element(element_pos))
|
31
|
+
|
32
|
+
raw_element = get_raw_element(element_pos)
|
33
|
+
|
34
|
+
return nil unless raw_element
|
35
|
+
|
36
|
+
if @separator
|
37
|
+
raw_element_arr = raw_element.split(@separator)
|
38
|
+
raw_element_arr.map! do |i|
|
39
|
+
c = @codes_class.code(element_pos, i)
|
40
|
+
c.nil? ? i : c
|
41
|
+
end
|
42
|
+
|
43
|
+
return raw_element_arr unless raw_element_arr.length == 1
|
44
|
+
end
|
45
|
+
|
46
|
+
code.nil? ? raw_element : code
|
47
|
+
end
|
48
|
+
|
49
|
+
def []=(element, value)
|
50
|
+
return set_raw_element(element, (value.is_a?(Array) && @separator) ? value.join(@separator) : value.to_s) unless @codes_class
|
51
|
+
|
52
|
+
element_pos = get_element_pos(element)
|
53
|
+
|
54
|
+
raise NonExistentElementError, "Element `#{element}' does not exist for segment `#{raw_segment_name}'" unless element_pos
|
55
|
+
|
56
|
+
if @separator && value.is_a?(Array)
|
57
|
+
value.map! do |i|
|
58
|
+
if i.is_a?(String)
|
59
|
+
i
|
60
|
+
else
|
61
|
+
c = @codes_class.code(element_pos, i)
|
62
|
+
c.nil? ? i : c
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
set_raw_element(element_pos, value.join(@separator))
|
67
|
+
else
|
68
|
+
return set_raw_element(element_pos, value) if value.is_a?(String)
|
69
|
+
code = @codes_class.code(element_pos, value)
|
70
|
+
set_raw_element(element_pos, code.nil? ? value : code)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def segment_type
|
75
|
+
Codes::SegmentNames.segment_name(raw_segment_name) || raw_segment_name
|
76
|
+
end
|
77
|
+
|
78
|
+
def raw_segment_name
|
79
|
+
@segment_name
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_raw_element(n)
|
83
|
+
@segment_elements[n - 1]
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_raw_element(n, v)
|
87
|
+
@segment_elements[n - 1] = v
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.parse(segment, separator:nil)
|
91
|
+
elements = segment.delete_suffix("~").split(Codes::ELEMENT_SEPARATOR)
|
92
|
+
segment = new(elements[0])
|
93
|
+
elements[1..-1].each_with_index do |e, i|
|
94
|
+
segment.set_raw_element(i+1, e)
|
95
|
+
end
|
96
|
+
segment.separator = separator
|
97
|
+
return segment
|
98
|
+
end
|
99
|
+
|
100
|
+
attr_accessor :segment_elements, :separator
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def get_element_pos(element)
|
105
|
+
return @codes_class::SEGMENT_POSITIONS.key(element) unless element.is_a?(Integer)
|
106
|
+
return element
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_raw_segment_name(name)
|
110
|
+
return Codes::SegmentNames.segment_name(name) unless name.is_a?(String)
|
111
|
+
return name
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module RBEDI
|
2
|
+
class TransactionEnvelope
|
3
|
+
def initialize(
|
4
|
+
interchange_sender_id_qualifier: :mutually_defined,
|
5
|
+
interchange_sender_id:,
|
6
|
+
interchange_receiver_id_qualifier: :mutually_defined,
|
7
|
+
interchange_receiver_id:,
|
8
|
+
functional_groups: [],
|
9
|
+
interchange_control_number:,
|
10
|
+
date_time: DateTime.now,
|
11
|
+
repetition_separator: ?^,
|
12
|
+
component_element_separator: ?:,
|
13
|
+
interchange_usage_indicator: :production,
|
14
|
+
authorization_information_qualifier: :no_authorization_information_present,
|
15
|
+
authorization_information: " " * 10,
|
16
|
+
security_information_qualifier: :no_security_information_present,
|
17
|
+
security_information: " " * 10,
|
18
|
+
acknowledgement_requested: false
|
19
|
+
)
|
20
|
+
@interchange_sender_id = interchange_sender_id
|
21
|
+
@interchange_receiver_id = interchange_receiver_id
|
22
|
+
@interchange_sender_id_qualifier = interchange_sender_id_qualifier
|
23
|
+
@interchange_receiver_id_qualifier = interchange_receiver_id_qualifier
|
24
|
+
@authorization_information_qualifier = authorization_information_qualifier
|
25
|
+
@authorization_information = authorization_information
|
26
|
+
@security_information_qualifier = security_information_qualifier
|
27
|
+
@security_information = security_information
|
28
|
+
@repetition_separator = repetition_separator
|
29
|
+
@component_element_separator = component_element_separator
|
30
|
+
@interchange_control_number = "%09d" % interchange_control_number
|
31
|
+
@acknowledgement_requested = acknowledgement_requested
|
32
|
+
@date_time = EDIDateTime.new(date_time)
|
33
|
+
@functional_groups = functional_groups
|
34
|
+
@interchange_usage_indicator = interchange_usage_indicator
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
header.to_s +
|
39
|
+
@functional_groups.map(&:to_s).join +
|
40
|
+
trailer.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
def header
|
44
|
+
Segment.new(
|
45
|
+
:interchange_control_header,
|
46
|
+
authorization_information_qualifier: @authorization_information_qualifier,
|
47
|
+
authorization_information: @authorization_information,
|
48
|
+
security_information_qualifier: @security_information_qualifier,
|
49
|
+
security_information: @security_information,
|
50
|
+
interchange_sender_id_qualifier: @interchange_sender_id_qualifier,
|
51
|
+
interchange_receiver_id_qualifier: @interchange_receiver_id_qualifier,
|
52
|
+
interchange_sender_id: @interchange_sender_id.ljust(15),
|
53
|
+
interchange_receiver_id: @interchange_receiver_id.ljust(15),
|
54
|
+
interchange_date: @date_time.yymmdd,
|
55
|
+
interchange_time: @date_time.hhmm,
|
56
|
+
repetition_separator: @repetition_separator,
|
57
|
+
interchange_control_version_number: Codes::INTERCHANGE_CONTROL_VERSION_NUMBER,
|
58
|
+
interchange_control_number: @interchange_control_number,
|
59
|
+
acknowledgement_requested: @acknowledgement_requested,
|
60
|
+
interchange_usage_indicator: @interchange_usage_indicator,
|
61
|
+
component_element_separator: @component_element_separator
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
def trailer
|
66
|
+
Segment.new(
|
67
|
+
:interchange_control_trailer,
|
68
|
+
functional_group_count: @functional_groups.length,
|
69
|
+
interchange_control_number: @interchange_control_number
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
attr_accessor :interchange_sender_id, :interchange_sender_id_qualifier, :interchange_receiver_id, :interchange_receiver_id_qualifier,
|
74
|
+
:repetition_separator, :component_element_separator, :date_time, :interchange_control_number, :acknowledgement_requested, :authorization_information_qualifier,
|
75
|
+
:authorization_information, :security_information_qualifier, :security_information, :functional_groups, :interchange_usage_indicator
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module RBEDI
|
2
|
+
class TransactionSet
|
3
|
+
include Codes
|
4
|
+
|
5
|
+
def initialize(
|
6
|
+
transaction_set_control_number:,
|
7
|
+
segments: [],
|
8
|
+
transaction_set_identifier_code:
|
9
|
+
)
|
10
|
+
@transaction_set_control_number = "%04d" % transaction_set_control_number
|
11
|
+
@transaction_set_identifier_code = transaction_set_identifier_code
|
12
|
+
@segments = segments
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
header.to_s +
|
17
|
+
@segments.map(&:to_s).join +
|
18
|
+
trailer.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def header
|
22
|
+
Segment.new(
|
23
|
+
:transaction_set_header,
|
24
|
+
transaction_set_identifier_code: @transaction_set_identifier_code,
|
25
|
+
transaction_set_control_number: @transaction_set_control_number,
|
26
|
+
implementation_convention_reference: Codes::VERSION_CODE
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
def trailer
|
31
|
+
Segment.new(
|
32
|
+
:transaction_set_trailer,
|
33
|
+
segments_count: @segments.length + 2,
|
34
|
+
transaction_set_control_number: @transaction_set_control_number
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_accessor :transaction_set_control_number, :transaction_set_identifier_code, :segments
|
39
|
+
end
|
40
|
+
end
|
data/lib/rbedi.rb
CHANGED
@@ -1,9 +1,25 @@
|
|
1
1
|
module RBEDI
|
2
|
-
@@files = [
|
3
|
-
|
2
|
+
@@files = [
|
3
|
+
"codes.rb",
|
4
|
+
"codes/codeset.rb",
|
5
|
+
"codes/segment_names.rb",
|
6
|
+
"edi_date_time.rb",
|
7
|
+
"functional_group.rb",
|
8
|
+
"parser.rb",
|
9
|
+
"segment.rb",
|
10
|
+
"transaction_envelope.rb",
|
11
|
+
"transaction_set.rb",
|
12
|
+
"non_existent_element_error.rb",
|
13
|
+
]
|
14
|
+
require_relative "rbedi/codes/segment_names.rb"
|
15
|
+
Codes::SegmentNames::SEGMENT_NAMES.keys.each do |s|
|
16
|
+
@@files << "codes/#{s.downcase}.rb"
|
17
|
+
end
|
18
|
+
@@files.uniq!
|
19
|
+
@@exe = ["edi"]
|
4
20
|
|
5
21
|
def self.version
|
6
|
-
"0.0.
|
22
|
+
"0.0.1"
|
7
23
|
end
|
8
24
|
|
9
25
|
def self.executables
|
@@ -24,7 +40,7 @@ module RBEDI
|
|
24
40
|
end
|
25
41
|
|
26
42
|
# Additional Requires
|
27
|
-
|
43
|
+
require "date"
|
28
44
|
|
29
45
|
RBEDI.file_paths(relative:true).each do |f|
|
30
46
|
require_relative f
|
metadata
CHANGED
@@ -1,27 +1,96 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbedi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Lee
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2024-09-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: argparse
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rbtext
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.5
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.5
|
41
|
+
description: RBEDI provides an easy API to create, read, and edit X12 EDI files. Currently,
|
42
|
+
only X12 5010 HIPAA 270/271 transaction sets are completely implemented.
|
14
43
|
email: matthias@matthiasclee.com
|
15
|
-
executables:
|
44
|
+
executables:
|
45
|
+
- edi
|
16
46
|
extensions: []
|
17
47
|
extra_rdoc_files: []
|
18
48
|
files:
|
49
|
+
- bin/edi
|
19
50
|
- lib/rbedi.rb
|
20
|
-
|
51
|
+
- lib/rbedi/codes.rb
|
52
|
+
- lib/rbedi/codes/aaa.rb
|
53
|
+
- lib/rbedi/codes/ak1.rb
|
54
|
+
- lib/rbedi/codes/ak2.rb
|
55
|
+
- lib/rbedi/codes/ak9.rb
|
56
|
+
- lib/rbedi/codes/bht.rb
|
57
|
+
- lib/rbedi/codes/codeset.rb
|
58
|
+
- lib/rbedi/codes/dmg.rb
|
59
|
+
- lib/rbedi/codes/dtp.rb
|
60
|
+
- lib/rbedi/codes/eb.rb
|
61
|
+
- lib/rbedi/codes/eq.rb
|
62
|
+
- lib/rbedi/codes/ge.rb
|
63
|
+
- lib/rbedi/codes/gs.rb
|
64
|
+
- lib/rbedi/codes/hl.rb
|
65
|
+
- lib/rbedi/codes/iea.rb
|
66
|
+
- lib/rbedi/codes/ik3.rb
|
67
|
+
- lib/rbedi/codes/ik4.rb
|
68
|
+
- lib/rbedi/codes/ik5.rb
|
69
|
+
- lib/rbedi/codes/isa.rb
|
70
|
+
- lib/rbedi/codes/le.rb
|
71
|
+
- lib/rbedi/codes/ls.rb
|
72
|
+
- lib/rbedi/codes/msg.rb
|
73
|
+
- lib/rbedi/codes/n3.rb
|
74
|
+
- lib/rbedi/codes/n4.rb
|
75
|
+
- lib/rbedi/codes/nm1.rb
|
76
|
+
- lib/rbedi/codes/per.rb
|
77
|
+
- lib/rbedi/codes/ref.rb
|
78
|
+
- lib/rbedi/codes/se.rb
|
79
|
+
- lib/rbedi/codes/segment_names.rb
|
80
|
+
- lib/rbedi/codes/st.rb
|
81
|
+
- lib/rbedi/codes/trn.rb
|
82
|
+
- lib/rbedi/edi_date_time.rb
|
83
|
+
- lib/rbedi/functional_group.rb
|
84
|
+
- lib/rbedi/non_existent_element_error.rb
|
85
|
+
- lib/rbedi/parser.rb
|
86
|
+
- lib/rbedi/segment.rb
|
87
|
+
- lib/rbedi/transaction_envelope.rb
|
88
|
+
- lib/rbedi/transaction_set.rb
|
89
|
+
homepage: https://matthiasclee.github.io/rbedi/
|
21
90
|
licenses:
|
22
91
|
- CC-BY-NC-SA-4.0
|
23
92
|
metadata: {}
|
24
|
-
post_install_message:
|
93
|
+
post_install_message:
|
25
94
|
rdoc_options: []
|
26
95
|
require_paths:
|
27
96
|
- lib
|
@@ -36,8 +105,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
36
105
|
- !ruby/object:Gem::Version
|
37
106
|
version: '0'
|
38
107
|
requirements: []
|
39
|
-
rubygems_version: 3.
|
40
|
-
signing_key:
|
108
|
+
rubygems_version: 3.4.19
|
109
|
+
signing_key:
|
41
110
|
specification_version: 4
|
42
111
|
summary: Interface to interact with X12 EDI files
|
43
112
|
test_files: []
|