eancom 0.1.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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +190 -5
  3. data/.gitlab-ci.yml +25 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile.lock +22 -18
  6. data/README.md +46 -0
  7. data/bin/console +3 -2
  8. data/definitions/desadv/d01b.rb +251 -0
  9. data/definitions/desadv/d96a.rb +208 -87
  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 +328 -0
  24. data/definitions/segments/ali.rb +93 -0
  25. data/definitions/segments/bgm.rb +395 -0
  26. data/definitions/segments/cav.rb +122 -0
  27. data/definitions/segments/cci.rb +136 -0
  28. data/definitions/segments/cdi.rb +39 -0
  29. data/definitions/segments/cnt.rb +82 -0
  30. data/definitions/segments/cps.rb +76 -0
  31. data/definitions/segments/cta.rb +89 -0
  32. data/definitions/segments/cux.rb +174 -0
  33. data/definitions/segments/dgs.rb +34 -0
  34. data/definitions/segments/doc.rb +45 -0
  35. data/definitions/segments/dtm.rb +243 -0
  36. data/definitions/segments/efi.rb +67 -0
  37. data/definitions/segments/eqd.rb +37 -0
  38. data/definitions/segments/ftx.rb +165 -0
  39. data/definitions/segments/gin.rb +113 -0
  40. data/definitions/segments/imd.rb +360 -0
  41. data/definitions/segments/inv.rb +94 -0
  42. data/definitions/segments/lin.rb +133 -0
  43. data/definitions/segments/loc.rb +137 -0
  44. data/definitions/segments/mea.rb +189 -0
  45. data/definitions/segments/moa.rb +228 -0
  46. data/definitions/segments/nad.rb +314 -0
  47. data/definitions/segments/pac.rb +262 -0
  48. data/definitions/segments/pat.rb +171 -0
  49. data/definitions/segments/pcd.rb +72 -0
  50. data/definitions/segments/pci.rb +110 -0
  51. data/definitions/segments/pgi.rb +152 -0
  52. data/definitions/segments/pia.rb +501 -0
  53. data/definitions/segments/pri.rb +208 -0
  54. data/definitions/segments/qty.rb +293 -0
  55. data/definitions/segments/rff.rb +210 -0
  56. data/definitions/segments/rte.rb +52 -0
  57. data/definitions/segments/tax.rb +266 -0
  58. data/definitions/segments/tdt.rb +278 -0
  59. data/definitions/segments/tod.rb +64 -0
  60. data/definitions/segments/tru.rb +34 -0
  61. data/definitions/segments/una.rb +85 -0
  62. data/definitions/segments/unb.rb +284 -0
  63. data/definitions/segments/unh.rb +183 -0
  64. data/definitions/segments/uns.rb +40 -0
  65. data/definitions/segments/unt.rb +48 -0
  66. data/definitions/segments/unz.rb +48 -0
  67. data/definitions/slsrpt/d01b.rb +206 -0
  68. data/definitions/slsrpt/d96a.rb +199 -0
  69. data/eancom.gemspec +2 -1
  70. data/lib/eancom.rb +61 -16
  71. data/lib/eancom/definition.rb +1 -1
  72. data/lib/eancom/edifact.rb +60 -13
  73. data/lib/eancom/edifact/body.rb +63 -0
  74. data/lib/eancom/edifact/composite.rb +38 -0
  75. data/lib/eancom/edifact/data.rb +108 -0
  76. data/lib/eancom/edifact/document.rb +43 -11
  77. data/lib/eancom/edifact/document_element.rb +26 -0
  78. data/lib/eancom/edifact/footer.rb +7 -0
  79. data/lib/eancom/edifact/header.rb +15 -0
  80. data/lib/eancom/edifact/item.rb +40 -0
  81. data/lib/eancom/edifact/message.rb +24 -16
  82. data/lib/eancom/edifact/segment.rb +131 -12
  83. data/lib/eancom/edifact/segments/ajt.rb +32 -0
  84. data/lib/eancom/edifact/segments/alc.rb +61 -0
  85. data/lib/eancom/edifact/segments/ali.rb +50 -0
  86. data/lib/eancom/edifact/segments/bgm.rb +46 -0
  87. data/lib/eancom/edifact/segments/cav.rb +47 -0
  88. data/lib/eancom/edifact/segments/cci.rb +53 -0
  89. data/lib/eancom/edifact/segments/cdi.rb +30 -0
  90. data/lib/eancom/edifact/segments/cnt.rb +40 -0
  91. data/lib/eancom/edifact/segments/cps.rb +33 -0
  92. data/lib/eancom/edifact/segments/cta.rb +30 -0
  93. data/lib/eancom/edifact/segments/cux.rb +60 -0
  94. data/lib/eancom/edifact/segments/dgs.rb +31 -0
  95. data/lib/eancom/edifact/segments/doc.rb +30 -0
  96. data/lib/eancom/edifact/segments/dtm.rb +47 -0
  97. data/lib/eancom/edifact/segments/efi.rb +38 -0
  98. data/lib/eancom/edifact/segments/eqd.rb +30 -0
  99. data/lib/eancom/edifact/segments/ftx.rb +63 -0
  100. data/lib/eancom/edifact/segments/gin.rb +45 -0
  101. data/lib/eancom/edifact/segments/imd.rb +69 -0
  102. data/lib/eancom/edifact/segments/inv.rb +43 -0
  103. data/lib/eancom/edifact/segments/lin.rb +47 -0
  104. data/lib/eancom/edifact/segments/loc.rb +46 -0
  105. data/lib/eancom/edifact/segments/mea.rb +54 -0
  106. data/lib/eancom/edifact/segments/moa.rb +45 -0
  107. data/lib/eancom/edifact/segments/nad.rb +112 -0
  108. data/lib/eancom/edifact/segments/pac.rb +56 -0
  109. data/lib/eancom/edifact/segments/pat.rb +37 -0
  110. data/lib/eancom/edifact/segments/pcd.rb +33 -0
  111. data/lib/eancom/edifact/segments/pci.rb +40 -0
  112. data/lib/eancom/edifact/segments/pgi.rb +45 -0
  113. data/lib/eancom/edifact/segments/pia.rb +108 -0
  114. data/lib/eancom/edifact/segments/pri.rb +53 -0
  115. data/lib/eancom/edifact/segments/qty.rb +44 -0
  116. data/lib/eancom/edifact/segments/rff.rb +47 -0
  117. data/lib/eancom/edifact/segments/rte.rb +33 -0
  118. data/lib/eancom/edifact/segments/tax.rb +78 -0
  119. data/lib/eancom/edifact/segments/tdt.rb +57 -0
  120. data/lib/eancom/edifact/segments/tod.rb +33 -0
  121. data/lib/eancom/edifact/segments/tru.rb +31 -0
  122. data/lib/eancom/edifact/segments/una.rb +52 -0
  123. data/lib/eancom/edifact/segments/unb.rb +68 -0
  124. data/lib/eancom/edifact/segments/unh.rb +50 -0
  125. data/lib/eancom/edifact/segments/uns.rb +32 -0
  126. data/lib/eancom/edifact/segments/unt.rb +28 -0
  127. data/lib/eancom/edifact/segments/unz.rb +28 -0
  128. data/lib/eancom/edifact/structure.rb +90 -0
  129. data/lib/eancom/factory.rb +9 -8
  130. data/lib/eancom/parser.rb +7 -0
  131. data/lib/eancom/parser/document.rb +60 -0
  132. data/lib/eancom/parser/segment.rb +71 -0
  133. data/lib/eancom/version.rb +1 -1
  134. data/pricat.json +1 -0
  135. metadata +141 -9
  136. data/lib/eancom/edifact/element.rb +0 -16
  137. data/lib/eancom/edifact/envelope.rb +0 -24
@@ -0,0 +1,225 @@
1
+ Eancom::Definition.create(name: 'D01B', type: :pricat) do |document, config|
2
+ document.header do |header|
3
+ header.segment Eancom::Edifact::UNA.new
4
+
5
+ header.segment Eancom::Edifact::UNB.new(
6
+ syntax_identifier: 'UNOC',
7
+ syntax_version_number: '3',
8
+ interchange_sender_identification: config.header.interchange_sender_identification,
9
+ sender_identifiction_code_qualifier: '14',
10
+ interchange_recipient_identification: config.header.interchange_recipient_identification,
11
+ recipient_identifiction_code_qualifier: '14',
12
+ date: config.header.date,
13
+ time: config.header.time,
14
+ interchange_control_reference: config.header.interchange_control_reference,
15
+ application_reference: config.header.application_reference,
16
+ interchange_agreement_identifier: config.header.interchange_agreement_identifier,
17
+ test_indicator: nil
18
+ )
19
+
20
+ header.segment Eancom::Edifact::UNH.new(
21
+ message_reference_number: config.header.message_reference_number,
22
+ message_type: config.header.message_type,
23
+ message_version_number: config.header.message_version_number,
24
+ message_release_number: config.header.message_release_number,
25
+ controlling_agency: config.header.controlling_agency,
26
+ association_assigned_code: config.header.association_assigned_code
27
+ )
28
+ end
29
+
30
+ document.body do |body|
31
+ messages = config.body.messages
32
+
33
+ messages.each do |message|
34
+ body.segment Eancom::Edifact::BGM.new(
35
+ document_name_code: message.document_name_code,
36
+ document_identifier: message.document_identifier,
37
+ message_function_code: message.message_function_code
38
+ )
39
+
40
+ date_time_messages = message.date_time_messages
41
+ date_time_messages.each_with_index do |dtm, index|
42
+ structure = Eancom.find_structure(tag: 'DTM')
43
+ key = dtm.identifier.intern.to_sym
44
+ body.segment Eancom::Edifact::DTM.new(
45
+ type: structure.dictionary_lookup(:type, dtm.identifier),
46
+ date_time: dtm[key].date_time,
47
+ format: '102'
48
+ )
49
+ end
50
+
51
+ nads = message.nads
52
+ nads.each_with_index do |nad, index|
53
+ next unless index == 0
54
+ structure = Eancom.find_structure(tag: 'NAD')
55
+ key = nad.identifier.intern.to_sym
56
+ body.segment Eancom::Edifact::NAD.new(
57
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
58
+ party_identifier: nad[key].party_identifier,
59
+ code_list_responsible_agency_code_1: '9'
60
+ )
61
+ end
62
+
63
+ nads.each_with_index do |nad, index|
64
+ next unless index == 1
65
+ structure = Eancom.find_structure(tag: 'NAD')
66
+ key = nad.identifier.intern.to_sym
67
+ body.segment Eancom::Edifact::NAD.new(
68
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
69
+ party_identifier: nad[key].party_identifier,
70
+ code_list_responsible_agency_code_1: '9'
71
+ )
72
+ end
73
+
74
+ structure = Eancom.find_structure(tag: 'CUX')
75
+ body.segment Eancom::Edifact::CUX.new(
76
+ currency_usage_code_qualifier_1: structure.dictionary_lookup(:currency_usage_code_qualifier_1, message.currency.currency_usage_code_qualifier_1),
77
+ currency_identification_code_1: message.currency.currency_identification_code_1,
78
+ currency_type_code_qualifier_1: structure.dictionary_lookup(:currency_type_code_qualifier_1,
79
+ message.currency.currency_type_code_qualifier_1)
80
+ )
81
+
82
+ structure = Eancom.find_structure(tag: 'PGI')
83
+ body.segment Eancom::Edifact::PGI.new(
84
+ product_group_type_code: structure.dictionary_lookup(:product_group_type_code, message.product_group_identifier)
85
+ )
86
+
87
+ total_quantity = 0
88
+
89
+ items = message.items
90
+ items.each_with_index do |item, index|
91
+ total_quantity += item.quantity.to_i
92
+
93
+ structure = Eancom.find_structure(tag: 'LIN')
94
+ body.segment Eancom::Edifact::LIN.new(
95
+ line_item_identifier_1: (index + 1).to_s,
96
+ item_identifier: item.ean,
97
+ action_request_notification_description_code: item.action_request_notification_description_code,
98
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code),
99
+ sub_line_indicator_code: item.sub_line_indicator_code,
100
+ line_item_identifier_2: item.line_item_identifier_2
101
+ )
102
+
103
+ if additional_product_id = item.additional_product_id
104
+ additional_product_id.each do |id|
105
+ next unless additional_information = id.additional_information
106
+
107
+ structure = Eancom.find_structure(tag: 'PIA')
108
+ body.segment Eancom::Edifact::PIA.new(
109
+ product_identifier_code_qualifier: additional_information.product_identifier_code_qualifier,
110
+ item_identifier_1: additional_information.item_identifier_1,
111
+ item_type_identification_code_1: structure.dictionary_lookup(:item_type_identification_code_1,
112
+ additional_information.item_type_identification_code_1),
113
+ code_list_responsible_agency_code_1: additional_information.code_list_identification_code_1
114
+ )
115
+ end
116
+ end
117
+
118
+ item_descriptions = item.item_descriptions
119
+ item_descriptions.each do |description|
120
+ structure = Eancom.find_structure(tag: 'IMD')
121
+ if description.item_description_code != ''
122
+ item_description_code = structure.dictionary_lookup(:item_description_code,
123
+ description.item_description_code)
124
+ else
125
+ item_description_code = ''
126
+ end
127
+ body.segment Eancom::Edifact::IMD.new(
128
+ description_format_code: structure.dictionary_lookup(:description_format_code,
129
+ description.description_format_code),
130
+ item_characteristic_code: structure.dictionary_lookup(:item_characteristic_code,
131
+ description.item_characteristic_code),
132
+ item_description_code: item_description_code,
133
+ code_list_identification_code_1: description.code_list_identification_code_1,
134
+ code_list_responsible_agency_code_1: structure.dictionary_lookup(:code_list_responsible_agency_code_1,
135
+ description.code_list_responsible_agency_code_1),
136
+ item_description_1: description.item_description_1,
137
+ language_name_code: description.language_name_code
138
+ )
139
+ end
140
+
141
+ date_time_messages = item.date_time_messages
142
+ date_time_messages.each_with_index do |dtm, index|
143
+ next unless index == 0
144
+ structure = Eancom.find_structure(tag: 'DTM')
145
+ key = dtm.identifier.intern.to_sym
146
+ body.segment Eancom::Edifact::DTM.new(
147
+ type: structure.dictionary_lookup(:type, dtm.identifier),
148
+ date_time: dtm[key].date_time,
149
+ format: '102'
150
+ )
151
+ end
152
+
153
+ date_time_messages.each_with_index do |dtm, index|
154
+ next unless index == 1
155
+ structure = Eancom.find_structure(tag: 'DTM')
156
+ key = dtm.identifier.intern.to_sym
157
+ body.segment Eancom::Edifact::DTM.new(
158
+ type: structure.dictionary_lookup(:type, dtm.identifier),
159
+ date_time: dtm[key].date_time,
160
+ format: '102'
161
+ )
162
+ end
163
+
164
+ if taxes = item.taxes
165
+ taxes.each do |tax|
166
+ next unless tax = tax.tax
167
+
168
+ structure = Eancom.find_structure(tag: 'TAX')
169
+ body.segment Eancom::Edifact::TAX.new(
170
+ duty_or_tax_or_fee_function_code_qualifier: '7',
171
+ duty_or_tax_or_fee_name_code: structure.dictionary_lookup(:duty_or_tax_or_fee_name_code,
172
+ tax.duty_or_tax_or_fee_name_code),
173
+ duty_or_tax_or_fee_account_code: tax.duty_or_tax_or_fee_account_code,
174
+ duty_tax_fee_rate_code: tax.duty_tax_fee_rate_code,
175
+ code_list_identification_code_3: tax.code_list_identification_code_3,
176
+ code_list_responsibility_agency_code_2: tax.code_list_responsibility_agency_code_2,
177
+ code_list_responsibility_agency_code_3: tax.code_list_responsibility_agency_code_3,
178
+ code_list_responsibility_agency_code_4: '21',
179
+ duty_or_tax_or_fee_category_code: structure.dictionary_lookup(:duty_or_tax_or_fee_category_code,
180
+ tax.duty_or_tax_or_fee_category_code)
181
+ )
182
+ end
183
+ end
184
+
185
+ prices = item.prices
186
+ prices.each do |price|
187
+ next unless price = price.price
188
+
189
+ structure = Eancom.find_structure(tag: 'PRI')
190
+ body.segment Eancom::Edifact::PRI.new(
191
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
192
+ price_amount: price.price_amount,
193
+ price_type_code: structure.dictionary_lookup(:price_type_code, price.price_type_code),
194
+ price_specification_code: structure.dictionary_lookup(:price_specification_code,
195
+ price.price_specification_code),
196
+ unit_price_basis_value: price.unit_price_basis_value,
197
+ measurment_unit_code: price.measurment_unit_code
198
+ )
199
+ end
200
+
201
+ qty = item.quantities
202
+ qty.each_with_index do |qty, index|
203
+ structure = Eancom.find_structure(tag: 'QTY')
204
+ key = qty.identifier.intern.to_sym
205
+ body.segment Eancom::Edifact::QTY.new(
206
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
207
+ quantity: qty[key].quantity
208
+ )
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ document.footer do |footer|
215
+
216
+ footer.segment Eancom::Edifact::UNT.new(
217
+ number_of_segments_in_message: (document.total_segments + 2).to_s,
218
+ message_reference_number: config.header.message_reference_number
219
+ )
220
+ footer.segment Eancom::Edifact::UNZ.new(
221
+ interchange_control_count: '1',
222
+ interchange_control_reference: config.header.interchange_control_reference
223
+ )
224
+ end
225
+ end
@@ -0,0 +1,207 @@
1
+ Eancom::Definition.create(name: 'D96A', type: :pricat) do |document, config|
2
+ document.header do |header|
3
+ header.segment Eancom::Edifact::UNA.new
4
+
5
+ header.segment Eancom::Edifact::UNB.new(
6
+ syntax_identifier: 'UNOC',
7
+ syntax_version_number: '3',
8
+ interchange_sender_identification: config.header.interchange_sender_identification,
9
+ sender_identifiction_code_qualifier: '14',
10
+ interchange_recipient_identification: config.header.interchange_recipient_identification,
11
+ recipient_identifiction_code_qualifier: '14',
12
+ date: config.header.date,
13
+ time: config.header.time,
14
+ interchange_control_reference: config.header.interchange_control_reference,
15
+ application_reference: config.header.application_reference,
16
+ interchange_agreement_identifier: config.header.interchange_agreement_identifier,
17
+ test_indicator: nil
18
+ )
19
+
20
+ header.segment Eancom::Edifact::UNH.new(
21
+ message_reference_number: config.header.message_reference_number,
22
+ message_type: config.header.message_type,
23
+ message_version_number: config.header.message_version_number,
24
+ message_release_number: config.header.message_release_number,
25
+ controlling_agency: config.header.controlling_agency,
26
+ association_assigned_code: config.header.association_assigned_code
27
+ )
28
+ end
29
+
30
+ document.body do |body|
31
+ messages = config.body.messages
32
+
33
+ messages.each do |message|
34
+ body.segment Eancom::Edifact::BGM.new(
35
+ document_name_code: message.document_name_code,
36
+ document_identifier: message.document_identifier,
37
+ message_function_code: message.message_function_code
38
+ )
39
+
40
+ date_time_messages = message.date_time_messages
41
+ date_time_messages.each_with_index do |dtm, index|
42
+ next unless index == 0
43
+ structure = Eancom.find_structure(tag: 'DTM')
44
+ key = dtm.identifier.intern.to_sym
45
+ body.segment Eancom::Edifact::DTM.new(
46
+ type: structure.dictionary_lookup(:type, dtm.identifier),
47
+ date_time: dtm[key].date_time,
48
+ format: '102'
49
+ )
50
+ end
51
+
52
+ date_time_messages.each_with_index do |dtm, index|
53
+ next unless index == 1
54
+ structure = Eancom.find_structure(tag: 'DTM')
55
+ key = dtm.identifier.intern.to_sym
56
+ body.segment Eancom::Edifact::DTM.new(
57
+ type: structure.dictionary_lookup(:type, dtm.identifier),
58
+ date_time: dtm[key].date_time,
59
+ format: '102'
60
+ )
61
+ end
62
+
63
+ date_time_messages.each_with_index do |dtm, index|
64
+ next unless index == 2
65
+ structure = Eancom.find_structure(tag: 'DTM')
66
+ key = dtm.identifier.intern.to_sym
67
+ body.segment Eancom::Edifact::DTM.new(
68
+ type: structure.dictionary_lookup(:type, dtm.identifier),
69
+ date_time: dtm[key].date_time,
70
+ format: '102'
71
+ )
72
+ end
73
+
74
+ nads = message.nads
75
+ nads.each_with_index do |nad, index|
76
+ next unless index == 0
77
+ structure = Eancom.find_structure(tag: 'NAD')
78
+ key = nad.identifier.intern.to_sym
79
+ body.segment Eancom::Edifact::NAD.new(
80
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
81
+ party_identifier: nad[key].party_identifier,
82
+ code_list_responsible_agency_code_1: '9'
83
+ )
84
+ end
85
+
86
+ nads.each_with_index do |nad, index|
87
+ next unless index == 1
88
+ structure = Eancom.find_structure(tag: 'NAD')
89
+ key = nad.identifier.intern.to_sym
90
+ body.segment Eancom::Edifact::NAD.new(
91
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
92
+ party_identifier: nad[key].party_identifier,
93
+ code_list_responsible_agency_code_1: '9'
94
+ )
95
+ end
96
+
97
+ if taxes = message.taxes
98
+ taxes.each do |tax|
99
+ next unless tax = tax.tax
100
+
101
+ structure = Eancom.find_structure(tag: 'TAX')
102
+ body.segment Eancom::Edifact::TAX.new(
103
+ duty_or_tax_or_fee_function_code_qualifier: '7',
104
+ duty_or_tax_or_fee_name_code: structure.dictionary_lookup(:duty_or_tax_or_fee_name_code,
105
+ tax.duty_or_tax_or_fee_name_code)
106
+ )
107
+ end
108
+ end
109
+
110
+ structure = Eancom.find_structure(tag: 'CUX')
111
+ body.segment Eancom::Edifact::CUX.new(
112
+ currency_usage_code_qualifier_1: structure.dictionary_lookup(:currency_usage_code_qualifier_1, message.currency.currency_usage_code_qualifier_1),
113
+ currency_identification_code_1: message.currency.currency_identification_code_1,
114
+ currency_type_code_qualifier_1: structure.dictionary_lookup(:currency_type_code_qualifier_1,
115
+ message.currency.currency_type_code_qualifier_1)
116
+ )
117
+
118
+ structure = Eancom.find_structure(tag: 'PGI')
119
+ body.segment Eancom::Edifact::PGI.new(
120
+ product_group_type_code: structure.dictionary_lookup(:product_group_type_code, message.product_group_identifier)
121
+ )
122
+
123
+ total_quantity = 0
124
+
125
+ items = message.items
126
+
127
+ items.each_with_index do |item, index|
128
+ total_quantity += item.quantity.to_i
129
+
130
+ structure = Eancom.find_structure(tag: 'LIN')
131
+ body.segment Eancom::Edifact::LIN.new(
132
+ line_item_identifier_1: (index + 1).to_s,
133
+ item_identifier: item.ean,
134
+ action_request_notification_description_code: item.action_request_notification_description_code,
135
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code),
136
+ sub_line_indicator_code: item.sub_line_indicator_code,
137
+ line_item_identifier_2: item.line_item_identifier_2
138
+ )
139
+
140
+ if additional_product_id = item.additional_product_id
141
+ additional_product_id.each do |id|
142
+ next unless additional_information = id.additional_information
143
+
144
+ structure = Eancom.find_structure(tag: 'PIA')
145
+ body.segment Eancom::Edifact::PIA.new(
146
+ product_identifier_code_qualifier: structure.dictionary_lookup(:product_identifier_code_qualifier, additional_information.product_identifier_code_qualifier),
147
+ item_identifier_1: additional_information.item_identifier_1,
148
+ item_type_identification_code_1: structure.dictionary_lookup(:item_type_identification_code_1,
149
+ additional_information.item_type_identification_code_1)
150
+ )
151
+ end
152
+ end
153
+
154
+ item_descriptions = item.item_descriptions
155
+ item_descriptions.each do |description|
156
+ structure = Eancom.find_structure(tag: 'IMD')
157
+ body.segment Eancom::Edifact::IMD.new(
158
+ description_format_code: structure.dictionary_lookup(:description_format_code,
159
+ description.description_format_code),
160
+ item_characteristic_code: structure.dictionary_lookup(:item_characteristic_code,
161
+ description.item_characteristic_code),
162
+ item_description_code: description.item_description_code,
163
+ code_list_identification_code_1: description.code_list_identification_code_1,
164
+ item_description_1: description.item_description_1
165
+ )
166
+ end
167
+
168
+ qty = item.quantities
169
+ qty.each_with_index do |qty, index|
170
+ structure = Eancom.find_structure(tag: 'QTY')
171
+ key = qty.identifier.intern.to_sym
172
+ body.segment Eancom::Edifact::QTY.new(
173
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
174
+ quantity: qty[key].quantity
175
+ )
176
+ end
177
+
178
+ prices = item.prices
179
+ prices.each do |price|
180
+ next unless price = price.price
181
+
182
+ structure = Eancom.find_structure(tag: 'PRI')
183
+ body.segment Eancom::Edifact::PRI.new(
184
+ price_code_qualifier: structure.dictionary_lookup(:price_code_qualifier, price.price_code_qualifier),
185
+ price_amount: price.price_amount,
186
+ price_type_code: structure.dictionary_lookup(:price_type_code, price.price_type_code),
187
+ price_specification_code: structure.dictionary_lookup(:price_specification_code,
188
+ price.price_specification_code)
189
+ )
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ document.footer do |footer|
196
+ messages = config.body.messages
197
+
198
+ footer.segment Eancom::Edifact::UNT.new(
199
+ number_of_segments_in_message: (document.total_segments + 2).to_s,
200
+ message_reference_number: config.header.message_reference_number
201
+ )
202
+ footer.segment Eancom::Edifact::UNZ.new(
203
+ interchange_control_count: messages.size.to_s,
204
+ interchange_control_reference: config.header.interchange_control_reference.to_s
205
+ )
206
+ end
207
+ end
@@ -0,0 +1,172 @@
1
+ Eancom::Definition.create(name: 'D01B', type: :retann) do |document, config|
2
+ document.header do |header|
3
+ header.segment Eancom::Edifact::UNA.new
4
+
5
+ header.segment Eancom::Edifact::UNB.new(
6
+ syntax_identifier: 'UNOC',
7
+ syntax_version_number: '3',
8
+ interchange_sender_identification: config.header.interchange_sender_identification,
9
+ sender_identifiction_code_qualifier: '14',
10
+ interchange_recipient_identification: config.header.interchange_recipient_identification,
11
+ recipient_identifiction_code_qualifier: '14',
12
+ date: config.header.date,
13
+ time: config.header.time,
14
+ interchange_control_reference: config.header.interchange_control_reference,
15
+ application_reference: config.header.application_reference,
16
+ interchange_agreement_identifier: config.header.interchange_agreement_identifier
17
+ )
18
+
19
+ header.segment Eancom::Edifact::UNH.new(
20
+ message_reference_number: config.header.message_reference_number,
21
+ message_type: config.header.message_type,
22
+ message_version_number: config.header.message_version_number,
23
+ message_release_number: config.header.message_release_number,
24
+ controlling_agency: config.header.controlling_agency,
25
+ association_assigned_code: config.header.association_assigned_code
26
+ )
27
+ end
28
+
29
+ document.body do |body|
30
+ messages = config.body.messages
31
+ messages.each do |message|
32
+ body.segment Eancom::Edifact::BGM.new(
33
+ document_name_code: message.document_name_code,
34
+ code_list_identification_code: '',
35
+ code_list_responsible_agency_code: '9',
36
+ document_identifier: message.document_identifier,
37
+ message_function_code: message.message_function_code
38
+ )
39
+
40
+ date_time_messages = message.date_time_messages
41
+ date_time_messages.each_with_index do |dtm, index|
42
+ next unless index == 0
43
+ structure = Eancom.find_structure(tag: 'DTM')
44
+ key = dtm.identifier.intern.to_sym
45
+ body.segment Eancom::Edifact::DTM.new(
46
+ type: structure.dictionary_lookup(:type, dtm.identifier),
47
+ date_time: dtm[key].date_time,
48
+ format: '102'
49
+ )
50
+ end
51
+
52
+ body.segment Eancom::Edifact::DOC.new(
53
+ document_name_code: config.header.document_name_code
54
+ )
55
+
56
+ references = message.references
57
+ references.each_with_index do |rff, index|
58
+ next unless index == 0
59
+ structure = Eancom.find_structure(tag: 'RFF')
60
+ key = rff.identifier.intern.to_sym
61
+ body.segment Eancom::Edifact::RFF.new(
62
+ reference_code_qualifier: structure.dictionary_lookup(:reference_code_qualifier, rff.identifier),
63
+ reference_identifier: rff[key].reference_identifier
64
+ )
65
+ end
66
+
67
+ date_time_messages.each_with_index do |dtm, index|
68
+ next unless index == 1
69
+ structure = Eancom.find_structure(tag: 'DTM')
70
+ key = dtm.identifier.intern.to_sym
71
+ body.segment Eancom::Edifact::DTM.new(
72
+ type: structure.dictionary_lookup(:type, dtm.identifier),
73
+ date_time: dtm[key].date_time,
74
+ format: '102'
75
+ )
76
+ end
77
+ nads = message.nads
78
+ nads.each_with_index do |nad, index|
79
+ next unless index == 0
80
+ structure = Eancom.find_structure(tag: 'NAD')
81
+ key = nad.identifier.intern.to_sym
82
+ body.segment Eancom::Edifact::NAD.new(
83
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
84
+ party_identifier: nad[key].party_identifier,
85
+ code_list_responsible_agency_code_1: '9'
86
+ )
87
+ end
88
+ structure = Eancom.find_structure(tag: 'LOC')
89
+ code_list_identification_code = if message.code_list_identification_code.nil?
90
+ ''
91
+ else
92
+ message.code_list_identification_code
93
+ end
94
+ body.segment Eancom::Edifact::LOC.new(
95
+ location_function_qualifier: structure.dictionary_lookup(:location_function_qualifier, message.location.location_function_qualifier),
96
+ location_name_code: message.location.location_name_code,
97
+ code_list_identification_code: code_list_identification_code,
98
+ code_list_responsible_agency_code: structure.dictionary_lookup(:code_list_responsible_agency_code,
99
+ message.location.code_list_responsible_agency_code)
100
+ )
101
+ nads = message.nads
102
+ nads.each_with_index do |nad, index|
103
+ next unless index == 1
104
+ structure = Eancom.find_structure(tag: 'NAD')
105
+ key = nad.identifier.intern.to_sym
106
+ body.segment Eancom::Edifact::NAD.new(
107
+ party_function_code_qualifier: structure.dictionary_lookup(:party_function_code_qualifier, nad.identifier),
108
+ party_identifier: nad[key].party_identifier,
109
+ code_list_responsible_agency_code_1: '9'
110
+ )
111
+ end
112
+
113
+ items = message.items
114
+ items.each_with_index do |item, index|
115
+
116
+ structure = Eancom.find_structure(tag: 'LIN')
117
+ body.segment Eancom::Edifact::LIN.new(
118
+ line_item_identifier_1: (index + 1).to_s,
119
+ item_identifier: item.ean,
120
+ item_type_identification_code: structure.dictionary_lookup(:item_type_identification_code, item.item_type_identification_code)
121
+ )
122
+ qty = item.quantities
123
+ qty.each_with_index do |qty, index|
124
+ structure = Eancom.find_structure(tag: 'QTY')
125
+ key = qty.identifier.intern.to_sym
126
+ body.segment Eancom::Edifact::QTY.new(
127
+ quantity_type_code_qualifier: structure.dictionary_lookup(:quantity_type_code_qualifier, qty.identifier),
128
+ quantity: qty[key].quantity
129
+ )
130
+ end
131
+
132
+ structure = Eancom.find_structure(tag: 'CDI')
133
+ body.segment Eancom::Edifact::CDI.new(
134
+ physical_or_logical_state_type_code_qualifier: structure.dictionary_lookup(
135
+ :physical_or_logical_state_type_code_qualifier, item.physical_or_logical_state_type_code_qualifier
136
+ )
137
+ )
138
+ end
139
+ end
140
+ end
141
+
142
+ document.footer do |footer|
143
+ footer.segment Eancom::Edifact::UNS.new(
144
+ section_identification: 'S'
145
+ )
146
+
147
+ messages = config.body.messages
148
+
149
+ messages.each do |message|
150
+ items = message.items
151
+ control_total_value = 0
152
+
153
+ items.each_with_index do |item, index|
154
+
155
+ next unless index == items.size - 1
156
+
157
+ counts = item.counts
158
+ counts.each_with_index do |cnt, index|
159
+ structure = Eancom.find_structure(tag: 'CNT')
160
+ footer.segment Eancom::Edifact::CNT.new(
161
+ control_total_type_code_quantifier: structure.dictionary_lookup(:control_total_type_code_quantifier, cnt.control_total_type_code_quantifier),
162
+ control_total_value: items.size.to_s
163
+ )
164
+ end
165
+ end
166
+ end
167
+ footer.segment Eancom::Edifact::UNT.new(
168
+ number_of_segments_in_message: (document.total_segments + 2).to_s,
169
+ message_reference_number: config.header.message_reference_number
170
+ )
171
+ end
172
+ end