eancom 1.4.0 → 2.0.0

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -3
  3. data/.gitlab-ci.yml +11 -13
  4. data/.ruby-version +1 -1
  5. data/Gemfile +2 -4
  6. data/Gemfile.lock +23 -103
  7. data/README.md +46 -0
  8. data/definitions/desadv/d01b.rb +139 -93
  9. data/definitions/desadv/d96a.rb +187 -101
  10. data/definitions/invoic/d01b.rb +559 -0
  11. data/definitions/invoic/d96a.rb +389 -0
  12. data/definitions/invrpt/d01b.rb +134 -0
  13. data/definitions/invrpt/d96a.rb +125 -0
  14. data/definitions/orders/d01b.rb +182 -0
  15. data/definitions/orders/d96b.rb +198 -0
  16. data/definitions/ordrsp/d01b.rb +251 -0
  17. data/definitions/ordrsp/d96b.rb +226 -0
  18. data/definitions/pricat/d01b.rb +225 -0
  19. data/definitions/pricat/d96b.rb +207 -0
  20. data/definitions/retann/d01b.rb +172 -0
  21. data/definitions/retann/d96b.rb +221 -0
  22. data/definitions/segments/ajt.rb +47 -0
  23. data/definitions/segments/alc.rb +128 -36
  24. data/definitions/segments/bgm.rb +128 -0
  25. data/definitions/segments/cdi.rb +39 -0
  26. data/definitions/segments/cnt.rb +4 -0
  27. data/definitions/segments/cta.rb +89 -0
  28. data/definitions/segments/cux.rb +9 -2
  29. data/definitions/segments/dgs.rb +34 -0
  30. data/definitions/segments/doc.rb +45 -0
  31. data/definitions/segments/dtm.rb +85 -1
  32. data/definitions/segments/efi.rb +67 -0
  33. data/definitions/segments/eqd.rb +37 -0
  34. data/definitions/segments/ftx.rb +24 -2
  35. data/definitions/segments/gin.rb +113 -0
  36. data/definitions/segments/imd.rb +5 -1
  37. data/definitions/segments/inv.rb +94 -0
  38. data/definitions/segments/lin.rb +23 -3
  39. data/definitions/segments/loc.rb +52 -4
  40. data/definitions/segments/moa.rb +86 -2
  41. data/definitions/segments/nad.rb +69 -9
  42. data/definitions/segments/pac.rb +12 -0
  43. data/definitions/segments/pat.rb +171 -0
  44. data/definitions/segments/pcd.rb +72 -0
  45. data/definitions/segments/pci.rb +110 -0
  46. data/definitions/segments/pgi.rb +6 -2
  47. data/definitions/segments/pia.rb +21 -21
  48. data/definitions/segments/pri.rb +21 -1
  49. data/definitions/segments/qty.rb +219 -5
  50. data/definitions/segments/rff.rb +51 -7
  51. data/definitions/segments/rte.rb +52 -0
  52. data/definitions/segments/tax.rb +17 -10
  53. data/definitions/segments/tdt.rb +24 -0
  54. data/definitions/segments/tod.rb +64 -0
  55. data/definitions/segments/tru.rb +34 -0
  56. data/definitions/segments/una.rb +7 -7
  57. data/definitions/segments/unb.rb +4 -4
  58. data/definitions/segments/unh.rb +70 -5
  59. data/definitions/segments/uns.rb +2 -2
  60. data/definitions/segments/unt.rb +2 -2
  61. data/definitions/slsrpt/d01b.rb +104 -100
  62. data/definitions/slsrpt/d96a.rb +104 -99
  63. data/eancom.gemspec +5 -8
  64. data/lib/eancom/edifact/document.rb +2 -2
  65. data/lib/eancom/edifact/footer.rb +1 -0
  66. data/lib/eancom/edifact/segment.rb +2 -2
  67. data/lib/eancom/edifact/segments/ajt.rb +32 -0
  68. data/lib/eancom/edifact/segments/ali.rb +2 -4
  69. data/lib/eancom/edifact/segments/bgm.rb +4 -3
  70. data/lib/eancom/edifact/segments/cdi.rb +30 -0
  71. data/lib/eancom/edifact/segments/cnt.rb +8 -1
  72. data/lib/eancom/edifact/segments/cps.rb +4 -1
  73. data/lib/eancom/edifact/segments/cta.rb +30 -0
  74. data/lib/eancom/edifact/segments/cux.rb +1 -1
  75. data/lib/eancom/edifact/segments/dgs.rb +31 -0
  76. data/lib/eancom/edifact/segments/doc.rb +30 -0
  77. data/lib/eancom/edifact/segments/dtm.rb +10 -6
  78. data/lib/eancom/edifact/segments/efi.rb +38 -0
  79. data/lib/eancom/edifact/segments/eqd.rb +30 -0
  80. data/lib/eancom/edifact/segments/ftx.rb +2 -2
  81. data/lib/eancom/edifact/segments/gin.rb +45 -0
  82. data/lib/eancom/edifact/segments/imd.rb +1 -1
  83. data/lib/eancom/edifact/segments/inv.rb +43 -0
  84. data/lib/eancom/edifact/segments/lin.rb +7 -3
  85. data/lib/eancom/edifact/segments/loc.rb +8 -5
  86. data/lib/eancom/edifact/segments/mea.rb +1 -0
  87. data/lib/eancom/edifact/segments/moa.rb +3 -3
  88. data/lib/eancom/edifact/segments/nad.rb +11 -6
  89. data/lib/eancom/edifact/segments/pac.rb +3 -1
  90. data/lib/eancom/edifact/segments/pat.rb +37 -0
  91. data/lib/eancom/edifact/segments/pcd.rb +33 -0
  92. data/lib/eancom/edifact/segments/pci.rb +40 -0
  93. data/lib/eancom/edifact/segments/pia.rb +1 -0
  94. data/lib/eancom/edifact/segments/pri.rb +0 -1
  95. data/lib/eancom/edifact/segments/qty.rb +9 -5
  96. data/lib/eancom/edifact/segments/rff.rb +8 -2
  97. data/lib/eancom/edifact/segments/rte.rb +33 -0
  98. data/lib/eancom/edifact/segments/tax.rb +7 -1
  99. data/lib/eancom/edifact/segments/tdt.rb +4 -1
  100. data/lib/eancom/edifact/segments/tod.rb +33 -0
  101. data/lib/eancom/edifact/segments/tru.rb +31 -0
  102. data/lib/eancom/edifact/segments/una.rb +2 -1
  103. data/lib/eancom/edifact/segments/unb.rb +4 -5
  104. data/lib/eancom/edifact/segments/unh.rb +6 -4
  105. data/lib/eancom/edifact/segments/uns.rb +3 -0
  106. data/lib/eancom/edifact/structure.rb +0 -1
  107. data/lib/eancom/edifact.rb +15 -1
  108. data/lib/eancom/factory.rb +1 -1
  109. data/lib/eancom/parser/document.rb +2 -10
  110. data/lib/eancom/version.rb +1 -1
  111. data/lib/eancom.rb +3 -1
  112. data/pricat.json +1 -0
  113. metadata +51 -52
  114. data/.rspec_status +0 -225
  115. data/.rubocop.yml +0 -2
@@ -1,17 +1,17 @@
1
1
  Eancom::Definition.create(name: 'D01B', type: :slsrpt) do |document, config|
2
2
  document.header do |header|
3
- header.segment Eancom::Edifact::UNA.new()
3
+ header.segment Eancom::Edifact::UNA.new
4
4
 
5
5
  header.segment Eancom::Edifact::UNB.new(
6
6
  syntax_identifier: 'UNOC',
7
7
  syntax_version_number: '3',
8
8
  interchange_sender_identification: config.header.interchange_sender_identification,
9
- sender_identifiction_code_qualifier: config.header.sender_identifiction_code_qualifier || '14',
9
+ sender_identifiction_code_qualifier: '14',
10
10
  interchange_recipient_identification: config.header.interchange_recipient_identification,
11
- recipient_identifiction_code_qualifier: config.header.recipient_identifiction_code_qualifier || '14',
11
+ recipient_identifiction_code_qualifier: '14',
12
12
  date: config.header.date,
13
13
  time: config.header.time,
14
- interchange_control_reference: config.header.interchange_control_reference,
14
+ interchange_control_reference: config.header.interchange_control_reference
15
15
  )
16
16
 
17
17
  header.segment Eancom::Edifact::UNH.new(
@@ -25,120 +25,120 @@ Eancom::Definition.create(name: 'D01B', type: :slsrpt) do |document, config|
25
25
  end
26
26
 
27
27
  document.body do |body|
28
-
29
- # Messages
30
28
  messages = config.body.messages
31
29
 
32
30
  messages.each do |message|
33
-
31
+ code_list_identification_code = if message.code_list_identification_code.nil?
32
+ ''
33
+ else
34
+ message.code_list_identification_code
35
+ end
34
36
  body.segment Eancom::Edifact::BGM.new(
35
- document_name_code: '73E',
36
- code_list_identification_code: '',
37
+ document_name_code: message.document_name_code,
38
+ code_list_identification_code: code_list_identification_code,
37
39
  code_list_responsible_agency_code: '9',
38
40
  document_identifier: message.document_identifier,
39
- message_function_code: '9'
41
+ message_function_code: message.message_function_code
40
42
  )
41
43
 
42
- # Document Date
43
- body.segment Eancom::Edifact::DTM.new(
44
- type: '137',
45
- date_time: message.document_message_date_time.date_time,
46
- format: '102'
47
- )
44
+ date_time_messages = message.date_time_messages
45
+ date_time_messages.each_with_index do |dtm, index|
46
+ next unless index == 0
48
47
 
49
- # Report Start Date
50
- if date_time = message.report_start_date.date_time
48
+ structure = Eancom.find_structure(tag: 'DTM')
49
+ key = dtm.identifier.intern.to_sym
51
50
  body.segment Eancom::Edifact::DTM.new(
52
- type: '90',
53
- date_time: date_time,
51
+ type: structure.dictionary_lookup(:type, dtm.identifier),
52
+ date_time: dtm[key].date_time,
54
53
  format: '102'
55
54
  )
56
55
  end
57
56
 
58
- # Report End Date
59
- if date_time = message.report_end_date.date_time
57
+ date_time_messages.each_with_index do |dtm, index|
58
+ next unless index == 1
59
+
60
+ structure = Eancom.find_structure(tag: 'DTM')
61
+ key = dtm.identifier.intern.to_sym
60
62
  body.segment Eancom::Edifact::DTM.new(
61
- type: '91',
62
- date_time: date_time,
63
+ type: structure.dictionary_lookup(:type, dtm.identifier),
64
+ date_time: dtm[key].date_time,
63
65
  format: '102'
64
66
  )
65
67
  end
66
68
 
67
- # Supplier
68
- if supplier = message.supplier
69
- code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
70
- structure = Eancom.find_structure(tag: 'NAD')
71
- structure.dictionary_lookup(
72
- :code_list_responsible_agancy_code_1,
73
- supplier.code_list_responsible_agancy_code_1
74
- )
75
- else
76
- '9'
77
- end
69
+ date_time_messages.each_with_index do |dtm, index|
70
+ next unless index == 2
71
+
72
+ structure = Eancom.find_structure(tag: 'DTM')
73
+ key = dtm.identifier.intern.to_sym
74
+ body.segment Eancom::Edifact::DTM.new(
75
+ type: structure.dictionary_lookup(:type, dtm.identifier),
76
+ date_time: dtm[key].date_time,
77
+ format: '102'
78
+ )
79
+ end
80
+
81
+ nads = message.nads
82
+ nads.each_with_index do |nad, index|
83
+ next unless index == 0
84
+
85
+ structure = Eancom.find_structure(tag: 'NAD')
86
+ key = nad.identifier.intern.to_sym
78
87
  body.segment Eancom::Edifact::NAD.new(
79
- party_function_code_qualifier: 'SU',
80
- party_identifier: supplier.party_identifier,
81
- code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
88
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
89
+ party_identifier: nad[key].party_identifier,
90
+ code_list_responsible_agency_code_1: '9'
82
91
  )
83
92
  end
84
93
 
85
- # Buyer
86
- if buyer = message.buyer
87
- code_list_responsible_agency_code_1 = if buyer.code_list_responsible_agancy_code_1
88
- structure = Eancom.find_structure(tag: 'NAD')
89
- structure.dictionary_lookup(
90
- :code_list_responsible_agancy_code_1,
91
- buyer.code_list_responsible_agancy_code_1
92
- )
93
- else
94
- '9'
95
- end
94
+ nads.each_with_index do |nad, index|
95
+ next unless index == 1
96
+
97
+ structure = Eancom.find_structure(tag: 'NAD')
98
+ key = nad.identifier.intern.to_sym
96
99
  body.segment Eancom::Edifact::NAD.new(
97
- party_function_code_qualifier: 'BY',
98
- party_identifier: buyer.party_identifier,
99
- code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
100
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
101
+ party_identifier: nad[key].party_identifier,
102
+ code_list_responsible_agency_code_1: '9'
100
103
  )
101
104
  end
102
105
 
103
106
  # Reference Currency
104
107
  if currency = message.currency
108
+ structure = Eancom.find_structure(tag: 'CUX')
105
109
  body.segment Eancom::Edifact::CUX.new(
106
110
  currency_identification_code_1: currency.currency_identification_code_1,
107
- currency_type_code_qualifier_1: '10',
108
- currency_usage_code_qualifier_1: '2'
111
+ currency_type_code_qualifier_1: structure.dictionary_lookup(:currency_type_code_qualifier_1,
112
+ currency.currency_type_code_qualifier_1),
113
+ currency_usage_code_qualifier_1: structure.dictionary_lookup(:currency_usage_code_qualifier_1,
114
+ currency.currency_usage_code_qualifier_1)
109
115
  )
110
116
  end
111
117
 
112
118
  # Location
113
119
  if location = message.location
114
- code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
115
- structure = Eancom.find_structure(tag: 'LOC')
116
- structure.dictionary_lookup(
117
- :code_list_responsible_agancy_code,
118
- location.code_list_responsible_agancy_code
119
- )
120
- else
121
- '9'
122
- end
123
-
120
+ structure = Eancom.find_structure(tag: 'LOC')
124
121
  body.segment Eancom::Edifact::LOC.new(
125
122
  code_list_identification_code: location.code_list_identification_code,
126
- code_list_responsible_agancy_code: code_list_responsible_agency_code,
127
- location_function_qualifier: '162',
123
+ code_list_responsible_agency_code: structure.dictionary_lookup(:code_list_responsible_agency_code, location.code_list_responsible_agency_code),
124
+ location_function_qualifier: structure.dictionary_lookup(:location_function_qualifier, location.location_function_qualifier),
128
125
  location_name_code: location.location_name_code
129
126
  )
130
127
  end
131
128
 
132
129
  # Sales Date
133
- if date_time = message.sales_date_and_or_time_and_or_period.date_time
130
+ date_time_messages.each_with_index do |dtm, index|
131
+ next unless index == 3
132
+
133
+ structure = Eancom.find_structure(tag: 'DTM')
134
+ key = dtm.identifier.intern.to_sym
134
135
  body.segment Eancom::Edifact::DTM.new(
135
- type: '356',
136
- date_time: date_time,
136
+ type: structure.dictionary_lookup(:type, dtm.identifier),
137
+ date_time: dtm[key].date_time,
137
138
  format: '102'
138
139
  )
139
140
  end
140
141
 
141
- # Items
142
142
  total_quantity = 0
143
143
 
144
144
  items = message.items
@@ -146,57 +146,61 @@ Eancom::Definition.create(name: 'D01B', type: :slsrpt) do |document, config|
146
146
  items.each_with_index do |item, index|
147
147
  total_quantity += item.quantity.to_i
148
148
 
149
+ structure = Eancom.find_structure(tag: 'LIN')
149
150
  body.segment Eancom::Edifact::LIN.new(
150
- line_item_identifier_1: "#{index + 1}",
151
+ line_item_identifier_1: (index + 1).to_s,
151
152
  item_identifier: item.ean,
152
- item_type_identification_code: 'SRV'
153
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code)
153
154
  )
154
155
 
155
- if transaction_reference_number = item.transaction_reference_number
156
+ references = item.references
157
+ references.each_with_index do |rff, index|
158
+ structure = Eancom.find_structure(tag: 'RFF')
159
+ key = rff.identifier.intern.to_sym
156
160
  body.segment Eancom::Edifact::RFF.new(
157
- reference_code_qualifier: 'TN',
158
- reference_identifier: transaction_reference_number.reference_identifier
161
+ reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier),
162
+ reference_identifier: rff[key].reference_identifier
159
163
  )
160
164
  end
161
165
 
162
166
  prices = item.prices
163
167
  prices.each do |price|
164
- if price = price.price
165
- structure = Eancom.find_structure(tag: 'PRI')
166
- body.segment Eancom::Edifact::PRI.new(
167
- price_amount: price.price_amount,
168
- price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
169
- price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code),
170
- price_type_code: price.price_type_code
171
- )
172
- end
168
+ next unless price = price.price
169
+
170
+ structure = Eancom.find_structure(tag: 'PRI')
171
+ body.segment Eancom::Edifact::PRI.new(
172
+ price_amount: price.price_amount,
173
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
174
+ price_specification_code: structure.dictionary_lookup(:price_specification_code,
175
+ price.price_specification_code),
176
+ price_type_code: price.price_type_code
177
+ )
173
178
  end
174
179
 
175
- # Quantity
176
- if statistical_sales_quantitiy = item.statistical_sales_quantitiy
180
+ qty = item.quantities
181
+ qty.each_with_index do |qty, index|
182
+ structure = Eancom.find_structure(tag: 'QTY')
183
+ key = qty.identifier.intern.to_sym
177
184
  body.segment Eancom::Edifact::QTY.new(
178
- quantity_type_code_qualifier: '153',
179
- quantity: statistical_sales_quantitiy.quantity
185
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
186
+ quantity: qty[key].quantity
180
187
  )
181
188
  end
182
189
  end
183
190
 
184
- body.segment Eancom::Edifact::UNS.new(
185
- section_identification: 'S'
186
- )
187
-
188
191
  body.segment Eancom::Edifact::UNT.new(
189
- number_of_segments_in_message: "#{document.total_segments + 2}",
190
- message_reference_number: config.header.message_reference_number,
192
+ number_of_segments_in_message: (document.total_segments + 2).to_s,
193
+ message_reference_number: config.header.message_reference_number
191
194
  )
192
195
  end
196
+ end
193
197
 
194
- document.footer do |footer|
198
+ document.footer do |footer|
199
+ messages = config.body.messages
195
200
 
196
- footer.segment Eancom::Edifact::UNZ.new(
197
- interchange_control_count: '1',
198
- interchange_control_reference: "#{config.header.interchange_control_reference}"
199
- )
200
- end
201
+ footer.segment Eancom::Edifact::UNZ.new(
202
+ interchange_control_count: messages.size.to_s,
203
+ interchange_control_reference: config.header.interchange_control_reference.to_s
204
+ )
201
205
  end
202
206
  end
@@ -1,17 +1,18 @@
1
1
  Eancom::Definition.create(name: 'D96A', type: :slsrpt) do |document, config|
2
+ # Creates a template for an slsrpt d01b formatted edifact document
2
3
  document.header do |header|
3
- header.segment Eancom::Edifact::UNA.new()
4
+ header.segment Eancom::Edifact::UNA.new
4
5
 
5
6
  header.segment Eancom::Edifact::UNB.new(
6
- syntax_identifier: config.header.syntax_identifier || 'UNOA',
7
- syntax_version_number: config.header.syntax_version_number || '2',
7
+ syntax_identifier: 'UNOA',
8
+ syntax_version_number: '2',
8
9
  interchange_sender_identification: config.header.interchange_sender_identification,
9
- sender_identifiction_code_qualifier: config.header.sender_identification_code_qualifier || '14',
10
+ sender_identifiction_code_qualifier: '14',
10
11
  interchange_recipient_identification: config.header.interchange_recipient_identification,
11
- recipient_identifiction_code_qualifier: config.header.recipient_identification_code_qualifier || '14',
12
+ recipient_identifiction_code_qualifier: '14',
12
13
  date: config.header.date,
13
14
  time: config.header.time,
14
- interchange_control_reference: config.header.interchange_control_reference,
15
+ interchange_control_reference: config.header.interchange_control_reference
15
16
  )
16
17
 
17
18
  header.segment Eancom::Edifact::UNH.new(
@@ -25,111 +26,106 @@ Eancom::Definition.create(name: 'D96A', type: :slsrpt) do |document, config|
25
26
  end
26
27
 
27
28
  document.body do |body|
28
-
29
29
  # Messages
30
30
  messages = config.body.messages
31
31
 
32
32
  messages.each do |message|
33
-
34
33
  body.segment Eancom::Edifact::BGM.new(
35
- document_name_code: '11',
36
- document_identifier: message.document_identifier,
37
- )
38
-
39
- # Document Date
40
- body.segment Eancom::Edifact::DTM.new(
41
- type: '137',
42
- date_time: message.document_message_date_time.date_time,
43
- format: '102'
34
+ document_name_code: message.document_name_code,
35
+ document_identifier: message.document_identifier
44
36
  )
45
37
 
46
- # Report Start Date
47
- if date_time = message.report_start_date.date_time
38
+ date_time_messages = message.date_time_messages
39
+ date_time_messages.each_with_index do |dtm, index|
40
+ next unless index == 0
41
+ structure = Eancom.find_structure(tag: 'DTM')
42
+ key = dtm.identifier.intern.to_sym
48
43
  body.segment Eancom::Edifact::DTM.new(
49
- type: '90',
50
- date_time: date_time,
44
+ type: structure.dictionary_lookup(:type, dtm.identifier),
45
+ date_time: dtm[key].date_time,
51
46
  format: '102'
52
47
  )
53
48
  end
54
49
 
55
- # Report End Date
56
- if date_time = message.report_end_date.date_time
57
- body.segment Eancom::Edifact::DTM.new(
58
- type: '91',
59
- date_time: date_time,
60
- format: '102'
61
- )
62
- end
50
+ date_time_messages.each_with_index do |dtm, index|
51
+ next unless index == 1
52
+ structure = Eancom.find_structure(tag: 'DTM')
53
+ key = dtm.identifier.intern.to_sym
54
+ body.segment Eancom::Edifact::DTM.new(
55
+ type: structure.dictionary_lookup(:type, dtm.identifier),
56
+ date_time: dtm[key].date_time,
57
+ format: '102'
58
+ )
59
+ end
60
+
61
+ date_time_messages.each_with_index do |dtm, index|
62
+ next unless index == 2
63
+ structure = Eancom.find_structure(tag: 'DTM')
64
+ key = dtm.identifier.intern.to_sym
65
+ body.segment Eancom::Edifact::DTM.new(
66
+ type: structure.dictionary_lookup(:type, dtm.identifier),
67
+ date_time: dtm[key].date_time,
68
+ format: '102'
69
+ )
70
+ end
71
+
63
72
 
64
73
  # Supplier
65
- if supplier = message.supplier
66
- code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
67
- structure = Eancom.find_structure(tag: 'NAD')
68
- structure.dictionary_lookup(
69
- :code_list_responsible_agancy_code_1,
70
- supplier.code_list_responsible_agancy_code_1
71
- )
72
- else
73
- '9'
74
- end
74
+ nads = message.nads
75
+ nads.each_with_index do |nad, index|
76
+ next unless index == 0
77
+
78
+ structure = Eancom.find_structure(tag: 'NAD')
79
+ key = nad.identifier.intern.to_sym
75
80
  body.segment Eancom::Edifact::NAD.new(
76
- party_function_code_qualifier: 'SU',
77
- party_identifier: supplier.party_identifier,
78
- code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
81
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
82
+ party_identifier: nad[key].party_identifier,
83
+ code_list_responsible_agency_code_1: '9'
79
84
  )
80
85
  end
81
86
 
82
87
  # Buyer
83
- if buyer = message.buyer
84
- code_list_responsible_agency_code_1 = if supplier.code_list_responsible_agancy_code_1
85
- structure = Eancom.find_structure(tag: 'NAD')
86
- structure.dictionary_lookup(
87
- :code_list_responsible_agancy_code_1,
88
- supplier.code_list_responsible_agancy_code_1
89
- )
90
- else
91
- '9'
92
- end
88
+ nads.each_with_index do |nad, index|
89
+ next unless index == 1
90
+
91
+ structure = Eancom.find_structure(tag: 'NAD')
92
+ key = nad.identifier.intern.to_sym
93
93
  body.segment Eancom::Edifact::NAD.new(
94
- party_function_code_qualifier: 'BY',
95
- party_identifier: buyer.party_identifier,
96
- code_list_responsible_agancy_code_1: code_list_responsible_agency_code_1
94
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
95
+ party_identifier: nad[key].party_identifier,
96
+ code_list_responsible_agency_code_1: '9'
97
97
  )
98
98
  end
99
99
 
100
100
  # Reference Currency
101
101
  if currency = message.currency
102
+ structure = Eancom.find_structure(tag: 'CUX')
102
103
  body.segment Eancom::Edifact::CUX.new(
103
104
  currency_identification_code_1: currency.currency_identification_code_1,
104
- currency_type_code_qualifier_1: '10',
105
- currency_usage_code_qualifier_1: '2'
105
+ currency_type_code_qualifier_1: structure.dictionary_lookup(:currency_type_code_qualifier_1,
106
+ currency.currency_type_code_qualifier_1),
107
+ currency_usage_code_qualifier_1: structure.dictionary_lookup(:currency_usage_code_qualifier_1, currency.currency_usage_code_qualifier_1)
106
108
  )
107
109
  end
108
110
 
109
111
  # Location
110
112
  if location = message.location
111
- code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
112
- structure = Eancom.find_structure(tag: 'LOC')
113
- structure.dictionary_lookup(
114
- :code_list_responsible_agancy_code,
115
- location.code_list_responsible_agancy_code
116
- )
117
- else
118
- '9'
119
- end
113
+ structure = Eancom.find_structure(tag: 'LOC')
120
114
  body.segment Eancom::Edifact::LOC.new(
121
115
  code_list_identification_code: location.code_list_identification_code,
122
- code_list_responsible_agancy_code: code_list_responsible_agency_code,
123
- location_function_qualifier: '150',
116
+ code_list_responsible_agency_code: structure.dictionary_lookup(:code_list_responsible_agency_code, location.code_list_responsible_agency_code),
117
+ location_function_qualifier: structure.dictionary_lookup(:location_function_qualifier, location.location_function_qualifier),
124
118
  location_name_code: location.location_name_code
125
119
  )
126
120
  end
127
121
 
128
- # Sales Date
129
- if date_time = message.sales_date_and_or_time_and_or_period.date_time
122
+ date_time_messages.each_with_index do |dtm, index|
123
+ next unless index == 3
124
+ structure = Eancom.find_structure(tag: 'DTM')
125
+ key = dtm.identifier.intern.to_sym
130
126
  body.segment Eancom::Edifact::DTM.new(
131
- type: '356',
132
- date_time: date_time,
127
+ type: structure.dictionary_lookup(:type, dtm.identifier),
128
+ date_time: dtm[key].date_time,
133
129
  format: '203'
134
130
  )
135
131
  end
@@ -142,53 +138,62 @@ Eancom::Definition.create(name: 'D96A', type: :slsrpt) do |document, config|
142
138
  items.each_with_index do |item, index|
143
139
  total_quantity += item.quantity.to_i
144
140
 
141
+ structure = Eancom.find_structure(tag: 'LIN')
145
142
  body.segment Eancom::Edifact::LIN.new(
146
- line_item_identifier_1: "#{index + 1}",
143
+ line_item_identifier_1: (index + 1).to_s,
147
144
  item_identifier: item.ean,
148
- item_type_identification_code: 'EN'
145
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code)
149
146
  )
150
147
 
151
- if transaction_reference_number = item.transaction_reference_number
148
+ references = item.references
149
+ references.each_with_index do |rff, index|
150
+ structure = Eancom.find_structure(tag: 'RFF')
151
+ key = rff.identifier.intern.to_sym
152
152
  body.segment Eancom::Edifact::RFF.new(
153
- reference_code_qualifier: 'TN',
154
- reference_identifier: transaction_reference_number.reference_identifier
153
+ reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier),
154
+ reference_identifier: rff[key].reference_identifier
155
155
  )
156
156
  end
157
157
 
158
158
  prices = item.prices
159
159
  prices.each do |price|
160
- if price = price.price
161
- structure = Eancom.find_structure(tag: 'PRI')
162
- body.segment Eancom::Edifact::PRI.new(
163
- price_amount: price.price_amount,
164
- price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
165
- price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code),
166
- price_type_code: price.price_type_code
167
- )
168
- end
160
+ next unless price = price.price
161
+
162
+ structure = Eancom.find_structure(tag: 'PRI')
163
+ body.segment Eancom::Edifact::PRI.new(
164
+ price_amount: price.price_amount,
165
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
166
+ price_specification_code: structure.dictionary_lookup(:price_specification_code,
167
+ price.price_specification_code),
168
+ price_type_code: price.price_type_code
169
+ )
169
170
  end
170
171
 
171
- # Quantity
172
- if minimum_production_batch = item.minimum_production_batch
172
+ qty = item.quantities
173
+ qty.each_with_index do |qty, index|
174
+ structure = Eancom.find_structure(tag: 'QTY')
175
+ key = qty.identifier.intern.to_sym
173
176
  body.segment Eancom::Edifact::QTY.new(
174
- quantity_type_code_qualifier: '160',
175
- quantity: minimum_production_batch.quantity,
176
- measurement_unit_code: 'PCE'
177
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
178
+ quantity: qty[key].quantity,
179
+ measurement_unit_code: structure.dictionary_lookup(:measurement_unit_code, qty.measurement_unit_code)
177
180
  )
178
181
  end
179
182
  end
180
183
 
181
184
  body.segment Eancom::Edifact::UNT.new(
182
- number_of_segments_in_message: "#{document.total_segments + 2}",
183
- message_reference_number: config.header.message_reference_number,
185
+ number_of_segments_in_message: (document.total_segments + 2).to_s,
186
+ message_reference_number: config.header.message_reference_number
184
187
  )
185
188
  end
189
+ end
186
190
 
187
- document.footer do |footer|
188
- footer.segment Eancom::Edifact::UNZ.new(
189
- interchange_control_count: '1',
190
- interchange_control_reference: "#{config.header.interchange_control_reference}"
191
- )
192
- end
191
+ document.footer do |footer|
192
+ messages = config.body.messages
193
+
194
+ footer.segment Eancom::Edifact::UNZ.new(
195
+ interchange_control_count: messages.size.to_s,
196
+ interchange_control_reference: config.header.interchange_control_reference.to_s
197
+ )
193
198
  end
194
199
  end
data/eancom.gemspec CHANGED
@@ -23,12 +23,9 @@ Gem::Specification.new do |spec|
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = ["lib"]
25
25
 
26
- spec.add_development_dependency 'pry'
27
- spec.add_development_dependency 'pry-nav'
28
- spec.add_development_dependency 'pry-remote'
29
- spec.add_development_dependency 'rake'
30
- spec.add_development_dependency 'rspec'
31
- spec.add_development_dependency 'rubocop'
32
- spec.add_development_dependency 'simplecov'
33
- spec.add_development_dependency 'timecop'
26
+ spec.add_development_dependency "pry"
27
+ spec.add_development_dependency "pry-remote"
28
+ spec.add_development_dependency "pry-nav"
29
+ spec.add_development_dependency "simplecov"
30
+ spec.add_development_dependency "timecop"
34
31
  end
@@ -2,8 +2,7 @@ module Eancom
2
2
  module Edifact
3
3
  class Document
4
4
 
5
- attr_accessor :header_element,
6
- :body_element, :footer_element
5
+ attr_accessor :header_element, :body_element, :footer_element
7
6
 
8
7
  def initialize
9
8
  @header_element = Header.new()
@@ -35,6 +34,7 @@ module Eancom
35
34
  @footer_element.segment(segment)
36
35
  end
37
36
 
37
+ # Should header and footer segments be added to total_segments?
38
38
  def total_segments
39
39
  total = 0
40
40
  total += @body_element.segments.count
@@ -1,6 +1,7 @@
1
1
  module Eancom
2
2
  module Edifact
3
3
  class Footer < DocumentElement
4
+ # Why is this module empty?
4
5
  end
5
6
  end
6
7
  end
@@ -12,7 +12,7 @@ module Eancom
12
12
 
13
13
  def self.initialize_by_components(structure, array)
14
14
  begin
15
- new(structure.build_hash(array))
15
+ new(**structure.build_hash(array))
16
16
  rescue StandardError => e
17
17
  raise SegmentParserError.new(
18
18
  "'Parser Error in structure #{structure.tag} with array #{array}.\n \
@@ -39,7 +39,7 @@ module Eancom
39
39
  end
40
40
 
41
41
  def to_s
42
- string = array.map do |e|
42
+ string = array.map do |e|
43
43
  e = e.compact
44
44
  next if e.empty?
45
45
  [e.join(component_delimiter)]