eancom 1.6.3 → 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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -4
  3. data/.gitlab-ci.yml +11 -13
  4. data/.ruby-version +1 -1
  5. data/Gemfile +2 -4
  6. data/Gemfile.lock +21 -103
  7. data/README.md +46 -0
  8. data/definitions/desadv/d01b.rb +134 -87
  9. data/definitions/desadv/d96a.rb +145 -82
  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 +122 -2
  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 +75 -20
  32. data/definitions/segments/efi.rb +67 -0
  33. data/definitions/segments/eqd.rb +37 -0
  34. data/definitions/segments/ftx.rb +22 -8
  35. data/definitions/segments/gin.rb +113 -0
  36. data/definitions/segments/imd.rb +9 -13
  37. data/definitions/segments/inv.rb +94 -0
  38. data/definitions/segments/lin.rb +24 -4
  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 +9 -92
  45. data/definitions/segments/pci.rb +110 -0
  46. data/definitions/segments/pgi.rb +7 -3
  47. data/definitions/segments/pia.rb +21 -29
  48. data/definitions/segments/pri.rb +25 -13
  49. data/definitions/segments/qty.rb +204 -2
  50. data/definitions/segments/rff.rb +49 -13
  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 +8 -8
  57. data/definitions/segments/unb.rb +4 -7
  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 +132 -128
  62. data/definitions/slsrpt/d96a.rb +132 -129
  63. data/eancom.gemspec +5 -8
  64. data/lib/eancom/edifact/body.rb +37 -18
  65. data/lib/eancom/edifact/document.rb +20 -16
  66. data/lib/eancom/edifact/footer.rb +1 -0
  67. data/lib/eancom/edifact/item.rb +1 -1
  68. data/lib/eancom/edifact/message.rb +7 -39
  69. data/lib/eancom/edifact/segment.rb +9 -11
  70. data/lib/eancom/edifact/segments/ajt.rb +32 -0
  71. data/lib/eancom/edifact/segments/ali.rb +2 -4
  72. data/lib/eancom/edifact/segments/bgm.rb +4 -3
  73. data/lib/eancom/edifact/segments/cdi.rb +30 -0
  74. data/lib/eancom/edifact/segments/cnt.rb +8 -1
  75. data/lib/eancom/edifact/segments/cps.rb +4 -1
  76. data/lib/eancom/edifact/segments/cta.rb +30 -0
  77. data/lib/eancom/edifact/segments/cux.rb +1 -1
  78. data/lib/eancom/edifact/segments/dgs.rb +31 -0
  79. data/lib/eancom/edifact/segments/doc.rb +30 -0
  80. data/lib/eancom/edifact/segments/dtm.rb +10 -6
  81. data/lib/eancom/edifact/segments/efi.rb +38 -0
  82. data/lib/eancom/edifact/segments/eqd.rb +30 -0
  83. data/lib/eancom/edifact/segments/ftx.rb +2 -2
  84. data/lib/eancom/edifact/segments/gin.rb +45 -0
  85. data/lib/eancom/edifact/segments/imd.rb +1 -1
  86. data/lib/eancom/edifact/segments/inv.rb +43 -0
  87. data/lib/eancom/edifact/segments/lin.rb +7 -4
  88. data/lib/eancom/edifact/segments/loc.rb +8 -9
  89. data/lib/eancom/edifact/segments/mea.rb +1 -0
  90. data/lib/eancom/edifact/segments/moa.rb +3 -3
  91. data/lib/eancom/edifact/segments/nad.rb +11 -6
  92. data/lib/eancom/edifact/segments/pac.rb +3 -1
  93. data/lib/eancom/edifact/segments/pat.rb +37 -0
  94. data/lib/eancom/edifact/segments/pcd.rb +6 -17
  95. data/lib/eancom/edifact/segments/pci.rb +40 -0
  96. data/lib/eancom/edifact/segments/pia.rb +1 -0
  97. data/lib/eancom/edifact/segments/pri.rb +0 -1
  98. data/lib/eancom/edifact/segments/qty.rb +9 -5
  99. data/lib/eancom/edifact/segments/rff.rb +8 -2
  100. data/lib/eancom/edifact/segments/rte.rb +33 -0
  101. data/lib/eancom/edifact/segments/tax.rb +7 -1
  102. data/lib/eancom/edifact/segments/tdt.rb +4 -1
  103. data/lib/eancom/edifact/segments/tod.rb +33 -0
  104. data/lib/eancom/edifact/segments/tru.rb +31 -0
  105. data/lib/eancom/edifact/segments/una.rb +2 -1
  106. data/lib/eancom/edifact/segments/unb.rb +4 -5
  107. data/lib/eancom/edifact/segments/unh.rb +6 -4
  108. data/lib/eancom/edifact/segments/uns.rb +4 -1
  109. data/lib/eancom/edifact/structure.rb +0 -1
  110. data/lib/eancom/edifact.rb +15 -4
  111. data/lib/eancom/factory.rb +1 -1
  112. data/lib/eancom/parser/document.rb +3 -16
  113. data/lib/eancom/parser/segment.rb +9 -10
  114. data/lib/eancom/version.rb +1 -3
  115. data/lib/eancom.rb +3 -1
  116. data/pricat.json +1 -0
  117. metadata +45 -51
  118. data/.rubocop.yml +0 -2
  119. data/.tool-versions +0 -1
  120. data/definitions/segments/qvr.rb +0 -140
  121. data/lib/eancom/edifact/location.rb +0 -56
  122. data/lib/eancom/edifact/segments/qvr.rb +0 -50
@@ -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,178 +25,182 @@ 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
47
+
48
+ structure = Eancom.find_structure(tag: 'DTM')
49
+ key = dtm.identifier.intern.to_sym
50
+ body.segment Eancom::Edifact::DTM.new(
51
+ type: structure.dictionary_lookup(:type, dtm.identifier),
52
+ date_time: dtm[key].date_time,
53
+ format: '102'
54
+ )
55
+ end
56
+
57
+ date_time_messages.each_with_index do |dtm, index|
58
+ next unless index == 1
48
59
 
49
- # Report Start Date
50
- if date_time = message.report_start_date.date_time
60
+ structure = Eancom.find_structure(tag: 'DTM')
61
+ key = dtm.identifier.intern.to_sym
51
62
  body.segment Eancom::Edifact::DTM.new(
52
- type: '90',
53
- date_time: date_time,
63
+ type: structure.dictionary_lookup(:type, dtm.identifier),
64
+ date_time: dtm[key].date_time,
54
65
  format: '102'
55
66
  )
56
67
  end
57
68
 
58
- # Report End Date
59
- if date_time = message.report_end_date.date_time
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
60
74
  body.segment Eancom::Edifact::DTM.new(
61
- type: '91',
62
- date_time: date_time,
75
+ type: structure.dictionary_lookup(:type, dtm.identifier),
76
+ date_time: dtm[key].date_time,
63
77
  format: '102'
64
78
  )
65
79
  end
66
80
 
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
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)
115
+ )
116
+ end
117
+
118
+ # Location
119
+ if location = message.location
120
+ structure = Eancom.find_structure(tag: 'LOC')
121
+ body.segment Eancom::Edifact::LOC.new(
122
+ code_list_identification_code: location.code_list_identification_code,
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),
125
+ location_name_code: location.location_name_code
126
+ )
127
+ end
128
+
129
+ # Sales Date
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
135
+ body.segment Eancom::Edifact::DTM.new(
136
+ type: structure.dictionary_lookup(:type, dtm.identifier),
137
+ date_time: dtm[key].date_time,
138
+ format: '102'
109
139
  )
110
140
  end
111
141
 
112
- item_counter = 0
113
-
114
- message.locations.each do |location_group|
115
- if location = location_group.location
116
- code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
117
- structure = Eancom.find_structure(tag: 'LOC')
118
- structure.dictionary_lookup(
119
- :code_list_responsible_agancy_code,
120
- location.code_list_responsible_agancy_code
121
- )
122
- else
123
- '9'
124
- end
125
-
126
- body.segment Eancom::Edifact::LOC.new(
127
- code_list_identification_code: location.code_list_identification_code,
128
- code_list_responsible_agancy_code: code_list_responsible_agency_code,
129
- location_function_qualifier: '162',
130
- location_name_code: location.location_name_code
142
+ total_quantity = 0
143
+
144
+ items = message.items
145
+
146
+ items.each_with_index do |item, index|
147
+ total_quantity += item.quantity.to_i
148
+
149
+ structure = Eancom.find_structure(tag: 'LIN')
150
+ body.segment Eancom::Edifact::LIN.new(
151
+ line_item_identifier_1: (index + 1).to_s,
152
+ item_identifier: item.ean,
153
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code)
154
+ )
155
+
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
160
+ body.segment Eancom::Edifact::RFF.new(
161
+ reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier),
162
+ reference_identifier: rff[key].reference_identifier
131
163
  )
132
164
  end
133
165
 
134
- # Sales Date
135
- if date_time = location_group.sales_date_and_or_time_and_or_period&.date_time
136
- body.segment Eancom::Edifact::DTM.new(
137
- type: '356',
138
- date_time: date_time,
139
- format: '102'
166
+ prices = item.prices
167
+ prices.each do |price|
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
140
177
  )
141
178
  end
142
179
 
143
- # Items
144
- location_group.items.each do |item|
145
- item_counter += 1
146
-
147
- body.segment Eancom::Edifact::LIN.new(
148
- line_item_identifier_1: item_counter.to_s,
149
- item_identifier: item.ean,
150
- item_type_identification_code: 'SRV'
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
184
+ body.segment Eancom::Edifact::QTY.new(
185
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
186
+ quantity: qty[key].quantity
151
187
  )
152
-
153
- if transaction_reference_number = item.transaction_reference_number
154
- body.segment Eancom::Edifact::RFF.new(
155
- reference_code_qualifier: 'TN',
156
- reference_identifier: transaction_reference_number.reference_identifier
157
- )
158
- end
159
-
160
- prices = item.prices
161
- prices.each do |price_group|
162
- if price = price_group.price
163
- structure = Eancom.find_structure(tag: 'PRI')
164
- body.segment Eancom::Edifact::PRI.new(
165
- price_amount: price.price_amount,
166
- price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
167
- price_specification_code: structure.dictionary_lookup(:price_specification_code, price.price_specification_code),
168
- price_type_code: price.price_type_code
169
- )
170
- end
171
- end
172
-
173
- # Quantity
174
- if statistical_sales_quantitiy = item.statistical_sales_quantitiy
175
- body.segment Eancom::Edifact::QTY.new(
176
- quantity_type_code_qualifier: '153',
177
- quantity: statistical_sales_quantitiy.quantity
178
- )
179
- end
180
188
  end
181
189
  end
182
190
 
183
-
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,172 +26,174 @@ 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,
34
+ document_name_code: message.document_name_code,
35
+ document_identifier: message.document_identifier
37
36
  )
38
37
 
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'
44
- )
45
-
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)
108
+ )
109
+ end
110
+
111
+ # Location
112
+ if location = message.location
113
+ structure = Eancom.find_structure(tag: 'LOC')
114
+ body.segment Eancom::Edifact::LOC.new(
115
+ code_list_identification_code: location.code_list_identification_code,
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),
118
+ location_name_code: location.location_name_code
119
+ )
120
+ end
121
+
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
126
+ body.segment Eancom::Edifact::DTM.new(
127
+ type: structure.dictionary_lookup(:type, dtm.identifier),
128
+ date_time: dtm[key].date_time,
129
+ format: '203'
106
130
  )
107
131
  end
108
132
 
109
- item_counter = 0
110
-
111
- message.locations.each do |location_group|
112
-
113
- # Location
114
- if location = location_group.location
115
- code_list_responsible_agency_code = if location.code_list_responsible_agancy_code
116
- structure = Eancom.find_structure(tag: 'LOC')
117
- structure.dictionary_lookup(
118
- :code_list_responsible_agancy_code,
119
- location.code_list_responsible_agancy_code
120
- )
121
- else
122
- '9'
123
- end
124
- body.segment Eancom::Edifact::LOC.new(
125
- code_list_identification_code: location.code_list_identification_code,
126
- code_list_responsible_agancy_code: code_list_responsible_agency_code,
127
- location_function_qualifier: '150',
128
- location_name_code: location.location_name_code
133
+ # Items
134
+ total_quantity = 0
135
+
136
+ items = message.items
137
+
138
+ items.each_with_index do |item, index|
139
+ total_quantity += item.quantity.to_i
140
+
141
+ structure = Eancom.find_structure(tag: 'LIN')
142
+ body.segment Eancom::Edifact::LIN.new(
143
+ line_item_identifier_1: (index + 1).to_s,
144
+ item_identifier: item.ean,
145
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code)
146
+ )
147
+
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
+ body.segment Eancom::Edifact::RFF.new(
153
+ reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier),
154
+ reference_identifier: rff[key].reference_identifier
129
155
  )
130
156
  end
131
157
 
132
- # Sales Date
133
- if date_time = location_group.sales_date_and_or_time_and_or_period&.date_time
134
- body.segment Eancom::Edifact::DTM.new(
135
- type: '356',
136
- date_time: date_time,
137
- format: '203'
158
+ prices = item.prices
159
+ prices.each do |price|
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
138
169
  )
139
170
  end
140
171
 
141
- # Items
142
- location_group.items.each do |item|
143
- item_counter += 1
144
-
145
- body.segment Eancom::Edifact::LIN.new(
146
- line_item_identifier_1: item_counter.to_s,
147
- item_identifier: item.ean,
148
- item_type_identification_code: 'EN'
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
176
+ body.segment Eancom::Edifact::QTY.new(
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)
149
180
  )
150
-
151
- if transaction_reference_number = item.transaction_reference_number
152
- body.segment Eancom::Edifact::RFF.new(
153
- reference_code_qualifier: 'TN',
154
- reference_identifier: transaction_reference_number.reference_identifier
155
- )
156
- end
157
-
158
- prices = item.prices
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
169
- end
170
-
171
- # Quantity
172
- if minimum_production_batch = item.minimum_production_batch
173
- body.segment Eancom::Edifact::QTY.new(
174
- quantity_type_code_qualifier: '160',
175
- quantity: minimum_production_batch.quantity,
176
- measurement_unit_code: 'PCE'
177
- )
178
- end
179
181
  end
180
182
  end
181
183
 
182
-
183
184
  body.segment Eancom::Edifact::UNT.new(
184
- number_of_segments_in_message: "#{document.total_segments + 2}",
185
- 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
186
187
  )
187
188
  end
189
+ end
188
190
 
189
- document.footer do |footer|
190
- footer.segment Eancom::Edifact::UNZ.new(
191
- interchange_control_count: '1',
192
- interchange_control_reference: "#{config.header.interchange_control_reference}"
193
- )
194
- 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
+ )
195
198
  end
196
199
  end