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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/bin/edi +897 -0
  3. data/lib/rbedi/codes/aaa.rb +437 -0
  4. data/lib/rbedi/codes/ak1.rb +278 -0
  5. data/lib/rbedi/codes/ak2.rb +336 -0
  6. data/lib/rbedi/codes/ak9.rb +55 -0
  7. data/lib/rbedi/codes/bht.rb +706 -0
  8. data/lib/rbedi/codes/codeset.rb +27 -0
  9. data/lib/rbedi/codes/dmg.rb +1583 -0
  10. data/lib/rbedi/codes/dtp.rb +1342 -0
  11. data/lib/rbedi/codes/eb.rb +1511 -0
  12. data/lib/rbedi/codes/eq.rb +286 -0
  13. data/lib/rbedi/codes/ge.rb +14 -0
  14. data/lib/rbedi/codes/gs.rb +287 -0
  15. data/lib/rbedi/codes/hl.rb +273 -0
  16. data/lib/rbedi/codes/iea.rb +14 -0
  17. data/lib/rbedi/codes/ik3.rb +32 -0
  18. data/lib/rbedi/codes/ik4.rb +37 -0
  19. data/lib/rbedi/codes/ik5.rb +56 -0
  20. data/lib/rbedi/codes/isa.rb +137 -0
  21. data/lib/rbedi/codes/le.rb +13 -0
  22. data/lib/rbedi/codes/ls.rb +13 -0
  23. data/lib/rbedi/codes/msg.rb +25 -0
  24. data/lib/rbedi/codes/n3.rb +14 -0
  25. data/lib/rbedi/codes/n4.rb +706 -0
  26. data/lib/rbedi/codes/nm1.rb +1916 -0
  27. data/lib/rbedi/codes/per.rb +308 -0
  28. data/lib/rbedi/codes/ref.rb +1749 -0
  29. data/lib/rbedi/codes/se.rb +14 -0
  30. data/lib/rbedi/codes/segment_names.rb +44 -0
  31. data/lib/rbedi/codes/st.rb +336 -0
  32. data/lib/rbedi/codes/trn.rb +22 -0
  33. data/lib/rbedi/codes.rb +8 -0
  34. data/lib/rbedi/edi_date_time.rb +69 -0
  35. data/lib/rbedi/functional_group.rb +52 -0
  36. data/lib/rbedi/non_existent_element_error.rb +4 -0
  37. data/lib/rbedi/parser.rb +102 -0
  38. data/lib/rbedi/segment.rb +114 -0
  39. data/lib/rbedi/transaction_envelope.rb +77 -0
  40. data/lib/rbedi/transaction_set.rb +40 -0
  41. data/lib/rbedi.rb +20 -4
  42. 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 = [] # All gem files
3
- @@exe = [] # All executables
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.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.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-06-12 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Interface to interact with X12 EDI files
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
- homepage: https://github.com/Matthiasclee/rbedi
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.1.6
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: []