edi4r 0.9.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. data/AuthorCopyright +10 -0
  2. data/COPYING +56 -0
  3. data/ChangeLog +106 -0
  4. data/README +66 -0
  5. data/TO-DO +35 -0
  6. data/Tutorial +609 -0
  7. data/VERSION +1 -0
  8. data/bin/edi2xml.rb +103 -0
  9. data/bin/editool.rb +151 -0
  10. data/bin/xml2edi.rb +50 -0
  11. data/data/edifact/iso9735/SDCD.10000.csv +10 -0
  12. data/data/edifact/iso9735/SDCD.20000.csv +10 -0
  13. data/data/edifact/iso9735/SDCD.30000.csv +11 -0
  14. data/data/edifact/iso9735/SDCD.40000.csv +31 -0
  15. data/data/edifact/iso9735/SDCD.40100.csv +31 -0
  16. data/data/edifact/iso9735/SDED.10000.csv +37 -0
  17. data/data/edifact/iso9735/SDED.20000.csv +37 -0
  18. data/data/edifact/iso9735/SDED.30000.csv +43 -0
  19. data/data/edifact/iso9735/SDED.40000.csv +129 -0
  20. data/data/edifact/iso9735/SDED.40100.csv +130 -0
  21. data/data/edifact/iso9735/SDMD.10000.csv +0 -0
  22. data/data/edifact/iso9735/SDMD.20000.csv +0 -0
  23. data/data/edifact/iso9735/SDMD.30000.csv +6 -0
  24. data/data/edifact/iso9735/SDMD.40000.csv +17 -0
  25. data/data/edifact/iso9735/SDMD.40100.csv +17 -0
  26. data/data/edifact/iso9735/SDSD.10000.csv +8 -0
  27. data/data/edifact/iso9735/SDSD.20000.csv +8 -0
  28. data/data/edifact/iso9735/SDSD.30000.csv +12 -0
  29. data/data/edifact/iso9735/SDSD.40000.csv +34 -0
  30. data/data/edifact/iso9735/SDSD.40100.csv +34 -0
  31. data/data/edifact/untdid/EDCD.d01b.csv +200 -0
  32. data/data/edifact/untdid/EDCD.d96a.csv +161 -0
  33. data/data/edifact/untdid/EDED.d01b.csv +641 -0
  34. data/data/edifact/untdid/EDED.d96a.csv +462 -0
  35. data/data/edifact/untdid/EDMD.d01b.csv +3419 -0
  36. data/data/edifact/untdid/EDMD.d96a.csv +2144 -0
  37. data/data/edifact/untdid/EDSD.d01b.csv +158 -0
  38. data/data/edifact/untdid/EDSD.d96a.csv +127 -0
  39. data/data/edifact/untdid/IDCD.d01b.csv +95 -0
  40. data/data/edifact/untdid/IDMD.d01b.csv +238 -0
  41. data/data/edifact/untdid/IDSD.d01b.csv +75 -0
  42. data/lib/edi4r.rb +928 -0
  43. data/lib/edi4r/diagrams.rb +567 -0
  44. data/lib/edi4r/edi4r-1.2.dtd +20 -0
  45. data/lib/edi4r/edifact-rexml.rb +221 -0
  46. data/lib/edi4r/edifact.rb +1627 -0
  47. data/lib/edi4r/rexml.rb +256 -0
  48. data/lib/edi4r/standards.rb +495 -0
  49. data/test/eancom2webedi.rb +380 -0
  50. data/test/groups.edi +1 -0
  51. data/test/in1.edi +1 -0
  52. data/test/in1.inh +3 -0
  53. data/test/in2.edi +1 -0
  54. data/test/in2.xml +350 -0
  55. data/test/test_basics.rb +209 -0
  56. data/test/test_edi_split.rb +53 -0
  57. data/test/test_loopback.rb +21 -0
  58. data/test/test_minidemo.rb +84 -0
  59. data/test/test_rexml.rb +98 -0
  60. data/test/test_tut_examples.rb +131 -0
  61. data/test/webedi2eancom.rb +408 -0
  62. metadata +110 -0
@@ -0,0 +1,380 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Mapping demo: Inbound, from EANCOM to inhouse
4
+ #
5
+ # Inhouse format: GS1 Germany's WebEDI ASCII interface for ORDERS
6
+ # Output format: EANCOM'02 ORDERS, according to GS1 Germany'
7
+ # recommendations for application
8
+ # (EDI-Anwendungsempfehlungen V 2.0 (ORDERS) in EANCOM 2002 S3)
9
+ # and the general EANCOM 2002 (ORDERS) documentation including
10
+ # change requests.
11
+ # Comments:
12
+ #
13
+ # Inhouse and output format were selected, because they represent typical
14
+ # data structures and tasks for users, and because documentation of
15
+ # these formats is freely available.
16
+ #
17
+ # $Id: eancom2webedi.rb,v 1.2 2006/07/03 20:20:09 werntges Exp $
18
+ #
19
+ # Author: Heinz W. Werntges (edi@informatik.fh-wiesbaden.de)
20
+ #
21
+ # License: This code is put under the Ruby license
22
+ #
23
+ # Copyright (c) 2006 Heinz W. Werntges, FH Wiesbaden
24
+ #
25
+
26
+ # Include statement during test setup:
27
+
28
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
29
+ require 'edi4r'
30
+ require 'edi4r/edifact'
31
+
32
+ # Regular include statements:
33
+
34
+ #require "rubygems"
35
+ #require_gem "edi4r"
36
+ #require "edi4r/edifact"
37
+
38
+
39
+ HeaderRec = Struct.new('HeaderRec',
40
+ :bestellung, :satzartkennung, :iln_lieferanschrift, :iln_kaeufer,
41
+ :bestellnummer, :releasenummer,
42
+ :iln_lieferant, :lieferantennummer, :ust_id_lieferant,
43
+ :abteilung_beim_kaeufer, :ust_id_kaeufer,
44
+ :iln_rechnungsempfaenger, :abteilung_beim_rechnungsempfaenger, :ust_id_re,
45
+ :abteilung_der_lieferanschrift,
46
+ :iln_endempfaenger, :abteilung_beim_endempfaenger,
47
+ :datum_der_bestellung, :lieferdatum_gefordert, :pick_up_datum,
48
+ :waehrung, :nr_der_werbeaktion, :von_um, :bis
49
+ )
50
+
51
+ class Struct::HeaderRec
52
+
53
+ def initialize
54
+ self.satzartkennung = '100'
55
+ self.releasenummer = '11'
56
+ end
57
+
58
+ def to_s
59
+ [ bestellung, satzartkennung, iln_lieferanschrift, iln_kaeufer,
60
+ bestellnummer, releasenummer,
61
+ iln_lieferant, lieferantennummer, ust_id_lieferant,
62
+ abteilung_beim_kaeufer, ust_id_kaeufer,
63
+ iln_rechnungsempfaenger, abteilung_beim_rechnungsempfaenger, ust_id_re,
64
+ abteilung_der_lieferanschrift,
65
+ iln_endempfaenger, abteilung_beim_endempfaenger,
66
+ datum_der_bestellung, lieferdatum_gefordert, pick_up_datum,
67
+ waehrung, nr_der_werbeaktion, von_um, bis, '' ].join(';')
68
+ end
69
+ end
70
+
71
+
72
+ ItemRec = Struct.new('ItemRec',
73
+ :bestellung, :satzartkennung, :iln_lieferanschrift, :iln_kaeufer,
74
+ :bestellnummer,
75
+ :positionsnummer, :ean, :artikelbezeichnung, :farbe, :groesse,
76
+ :lieferantenartikelnummer, :kaeuferartikelnummer,
77
+ :bestellmenge, :einheit, :preisbezugseinheit, :ek, :vk
78
+ )
79
+
80
+ class Struct::ItemRec
81
+
82
+ def initialize( header )
83
+ self.bestellung = header.bestellung
84
+ self.satzartkennung = '200'
85
+ self.iln_lieferanschrift = header.iln_lieferanschrift
86
+ self.iln_kaeufer = header.iln_kaeufer
87
+ self.bestellnummer = header.bestellnummer
88
+ end
89
+
90
+ def to_s
91
+ [ bestellung, satzartkennung, iln_lieferanschrift, iln_kaeufer,
92
+ bestellnummer,
93
+ positionsnummer, ean, artikelbezeichnung, farbe, groesse,
94
+ lieferantenartikelnummer, kaeuferartikelnummer,
95
+ bestellmenge, einheit, preisbezugseinheit, ek, vk, '' ].join(';')
96
+ end
97
+ end
98
+
99
+
100
+ class Inhouse_Data
101
+
102
+ # Add some constants that cannot be retrieved from EDIFACT
103
+
104
+ def initialize
105
+ @headers_since_last_item = 0
106
+ @items_since_last_header = 0
107
+ @records = []
108
+ end
109
+
110
+ # Expect/ensure (HeaderRec, ItemRec+)+
111
+
112
+ def add( record )
113
+ case record.class.to_s
114
+ when 'Struct::HeaderRec'
115
+ raise "ItemRec missing" if @headers_since_last_item > 0
116
+ @headers_since_last_item += 1
117
+ @items_since_last_header = 0
118
+ when 'Struct::ItemRec'
119
+ raise "HeaderRec missing" if @items_since_last_header == 0 and @headers_since_last_item == 0
120
+ raise "Data inconsistent" if @items_since_last_header > 0 and @headers_since_last_item > 0
121
+ @headers_since_last_item = 0
122
+ @items_since_last_header += 1
123
+ else
124
+ raise "Illegal object: class = #{record.class}"
125
+ end
126
+ @records << record
127
+ end
128
+
129
+
130
+ def to_s
131
+ raise "ItemRec missing" if @headers_since_last_item > 0
132
+ @records.inject('') {|s, rec| s << rec.to_s << "\r\n"}
133
+ end
134
+ end
135
+
136
+
137
+ class Inbound_Mapper
138
+ include EDI
139
+
140
+ def map_header_segments( msg, recs )
141
+ header = HeaderRec.new
142
+ msg.each do |seg|
143
+ seg_name = seg.name
144
+ seg_name += ' ' + seg.sg_name if seg.sg_name
145
+ case seg_name
146
+ when 'UNH'
147
+
148
+ when 'BGM'
149
+ header.bestellung = seg.cC002.d1001
150
+ header.bestellnummer = seg.cC106.d1004
151
+
152
+ # Demo of add-ons "edifact" and "format" to class Time
153
+ when 'DTM'
154
+ c507 = seg.cC507
155
+ case dtfnc=c507.d2005
156
+ when '137'
157
+ header.datum_der_bestellung = Time.edifact(c507.d2380, c507.d2379)
158
+ header.datum_der_bestellung.format='102'
159
+ when '2'
160
+ if (dtfmt=c507.d2379)=='719'
161
+ seg.cC507.d2380 =~ /(\d{8})(\d{4})(\d{8})(\d{4})/
162
+ raise "Delivery date: Start and end day must be equal" if $1 != $3
163
+ header.lieferdatum_gefordert = $1
164
+ header.von_um = $2
165
+ header.bis = $4 unless $4.empty?
166
+ else
167
+ header.lieferdatum_gefordert = Time.edifact(c507.d2380, c507.d2379)
168
+ header.lieferdatum_gefordert.format='102'
169
+ end
170
+ when '200'
171
+ header.pickup_datum = Time.edifact(c507.d2380, c507.d2379)
172
+ header.pickup_datum.format='102'
173
+ else
174
+ raise "Wrong function in DTM: #{dtfnc}. Expected: 2, 137, 200!"
175
+ end
176
+
177
+ when 'RFF SG1'
178
+ cde = seg.cC506
179
+ case cde.d1153
180
+ when 'PD'
181
+ header.nr_der_werbeaktion = cde.d1154
182
+ else
183
+ raise "Unsupported qualifier in RFF: #{cde.d1153}. Expected: PD!"
184
+ end
185
+
186
+ # Demo: Delegate mapping of a whole SG to some other module
187
+ when 'NAD SG2'
188
+ map_nad_sg2( seg.children_and_self, header ) # skipping segment COM...
189
+ when /\w\w\w SG[235]/
190
+ # ignore - handled by map_nad_sg2() where appropriate
191
+
192
+ when 'CUX SG7'
193
+ cde = seg.aC504[0]
194
+ raise "Only '2' expected in DE 6347" if cde.d6347 != '2'
195
+ raise "Only '9' expected in DE 6343" if cde.d6343 != '9'
196
+ header.waehrung = cde.d6345
197
+
198
+ # NOTE: We *could* have treated items (LIN SG28) also here, like NAD,
199
+ # but we put them into another method to keep things more modular.
200
+
201
+ when 'UNS'
202
+ # ignore
203
+
204
+ else
205
+ raise "Unsupported segment/group: #{seg_name}!"
206
+ end
207
+ end
208
+ recs.add header
209
+ header
210
+ end # map_header_segments
211
+
212
+
213
+ def map_nad_sg2( segs, header )
214
+ function, gln, additional_id, vat_id, p_dept, order_contact, delivery_contact, gr_contact = nil
215
+ segs.each do |seg|
216
+ seg_name = seg.name
217
+ seg_name += ' ' + seg.sg_name unless seg.sg_name.empty?
218
+ case seg_name
219
+ when 'NAD SG2'
220
+ function = seg.d3035 or raise "Mandatory NAD/3035 empty"
221
+ gln = seg.cC082.d3039
222
+ raise "GLN missing or not properly qualified" if gln.nil? or gln.empty? or seg.cC082.d3055 != '9'
223
+
224
+ when 'RFF SG3'
225
+ cde = seg.cC506
226
+ if cde.d1153=='YC1'
227
+ additional_id = cde.d1154
228
+ elsif cde.d1153=='VA'
229
+ vat_id = cde.d1154
230
+ else
231
+ raise "RFF SG3: Qualifier in 1153 not supported: #{cde.d1153}"
232
+ end
233
+
234
+ when 'CTA SG5'
235
+ case seg.d3139
236
+ when 'PD'
237
+ p_dept = seg.cC056.d3413
238
+ when 'OC'
239
+ order_contact = seg.cC056.d3413
240
+ when 'DL'
241
+ delivery_contact = seg.cC056.d3413
242
+ when 'GR'
243
+ gr_contact = seg.cC056.d3413
244
+ else
245
+ raise "CTA SG5: Qualifier in 3139 not supported: #{seg.d3139}"
246
+ end
247
+
248
+ else
249
+ raise "Unsupported segment: #{seg_name}"
250
+ end
251
+ end
252
+
253
+ case function
254
+ when 'SU'
255
+ header.iln_lieferant = gln
256
+ header.lieferantennummer = additional_id
257
+ header.ust_id_lieferant = vat_id
258
+ when 'BY'
259
+ header.iln_kaeufer = gln
260
+ header.ust_id_kaeufer = vat_id
261
+ header.abteilung_beim_kaeufer = p_dept
262
+ when 'IV'
263
+ header.iln_rechnungsempfaenger = gln
264
+ header.ust_id_re = vat_id
265
+ header.abteilung_beim_rechnungsempfaenger = order_contact
266
+ when 'DP'
267
+ header.iln_lieferanschrift = gln
268
+ header.abteilung_der_lieferanschrift = delivery_contact
269
+ when 'UC'
270
+ header.iln_endempfaenger = gln
271
+ header.abteilung_beim_endempfaenger = gr_contact
272
+ else
273
+ raise "Unsupported function: #{function}"
274
+ end
275
+ end
276
+
277
+
278
+ def map_item_segments( segs, recs, header )
279
+ item = ItemRec.new( header )
280
+ segs.each do |seg|
281
+ seg_name = seg.name
282
+ seg_name += ' ' + seg.sg_name if seg.sg_name
283
+ case seg_name
284
+ when 'LIN SG28'
285
+ item.positionsnummer = seg.d1082
286
+ item.ean = seg.cC212.d7140
287
+ raise "Mandatory qual. SRV missing in 7143" unless seg.cC212.d7143=='SRV'
288
+
289
+ when 'PIA SG28'
290
+ raise "PIA SG28 / 4347: Only '1' allowed here" unless seg.d4347=='1'
291
+ seg.aC212[0..1].each do |cde|
292
+ case cde.d7143
293
+ when 'IN'
294
+ item.kaeuferartikelnummer = cde.d7140
295
+ raise "PIA SG28/C212/3055: Only '92' allowed here" unless cde.d3055=='92'
296
+ when 'SA'
297
+ item.lieferantenartikelnummer = cde.d7140
298
+ raise "PIA SG28/C212/3055: Only '91' allowed here" unless cde.d3055=='91'
299
+ else
300
+ raise "PIA SG28: Qualifier in 7143 not supported: #{cde.d7143}"
301
+ end
302
+ end
303
+
304
+ when 'IMD SG28'
305
+ if seg.d7077=='A'
306
+ item.artikelbezeichnung = seg.cC273.a7008[0]
307
+ elsif seg.d7077=='F'
308
+ if seg.cC272.d7081 == '35'
309
+ item.farbe = seg.cC273.a7008[0]
310
+ elsif seg.cC272.d7081 == '98'
311
+ item.groesse = seg.cC273.a7008[0]
312
+ else
313
+ raise "IMD SG28/C272/7081: Only '35' or '98' allowed here"
314
+ end
315
+ end
316
+
317
+ when 'QTY SG28'
318
+ cde = seg.cC186
319
+ raise "QTY SG28/C186/6063: Only '21' allowed here" unless cde.d6063=='21'
320
+ item.bestellmenge = cde.d6060 or raise "Mandatory DE missing: 6060"
321
+ item.einheit = cde.d6411 || 'PCE'
322
+
323
+ when 'PRI SG32'
324
+ case (cde = seg.cC509).d5125
325
+ when 'AAA'
326
+ item.ek = cde.d5118
327
+ raise "5387 must bei 'LIU' here!" unless cde.d5387=='LIU'
328
+
329
+ when 'AAE'
330
+ item.vk = cde.d5118
331
+ raise "5387 must bei 'SRP' here!" unless cde.d5387=='SRP'
332
+ item.preisbezugseinheit = cde.d5284 || '1'
333
+
334
+ else
335
+ raise "PRI SG32: Qualifier in 5125 not supported: #{cde.d5125}"
336
+ end
337
+
338
+ else
339
+ raise "Unsupported segment/group: #{seg_name}!"
340
+ end
341
+ end
342
+ recs.add item
343
+ end
344
+
345
+ end # class Inbound_Mapper
346
+
347
+
348
+ #
349
+ # MAIN
350
+ #
351
+
352
+ # We assume that all input is subject to the same mapping code,
353
+ # and that all resulting messages go into the same inhouse file.
354
+ #
355
+ # Sender and recipient code of this interchange's UNB segment
356
+ # should match buyer and supplier of all messages.
357
+ #
358
+
359
+ if ARGV.empty?
360
+ ic = EDI::E::Interchange.parse($stdin)
361
+ else
362
+ File.open(ARGV[0]) {|hnd| ic = EDI::E::Interchange.parse(hnd)}
363
+ end
364
+ sender_id = ic.header.cS002.d0004
365
+ recipient_id = ic.header.cS003.d0010
366
+
367
+ recs = Inhouse_Data.new
368
+ mapper = Inbound_Mapper.new
369
+ ic.each do |msg|
370
+
371
+ header = mapper.map_header_segments( msg, recs )
372
+ raise "sender id mismatch" if sender_id != header.iln_kaeufer
373
+ raise "recipient id mismatch" if recipient_id != header.iln_lieferant
374
+
375
+ msg.find_all {|seg| seg.name=='LIN' && seg.sg_name=='SG28'}.each do |lin|
376
+ mapper.map_item_segments( lin.descendants_and_self, recs, header )
377
+ end
378
+
379
+ end
380
+ $stdout.write recs
@@ -0,0 +1 @@
1
+ UNA:+.? 'UNB+UNOB:3+sender+recipient+060801:1327+1'UNG+ORDERS+sender-g+recipient-g+060801:1327+1+UN+D:96A'UNE+0+1'UNG+ORDERS+sender+recipient+060801:1327+5+UN+D:96A'UNH+1+ORDERS:D:96A:UN'BGM++220'DTM+137:20060703:102'UNS+S'UNT+5+1'UNE+1+5'UNG+INVOIC+sender+recipient+060801:1327+3+UN+D:01B:EAN010'UNH+1+INVOIC:D:01B:UN:EAN010'BGM+380'DTM+137:20060801132728:204'UNS+S'MOA+86:0'UNT+6+1'UNE+1+3'UNZ+3+1'
@@ -0,0 +1 @@
1
+ UNA:+.? 'UNB+UNOC:3+2965197100002:14+2165197000009:14+060501:1611+1146492687.229+++++EANCOM+1'UNH+1+ORDERS:D:01B:UN:EAN010'BGM+220+12345+9'DTM+137:20040712:102'DTM+2:200404141245200404141420:719'RFF+PD:4712'NAD+SU+2165197000009::9'RFF+YC1:23456'RFF+VA:DE1234512345'NAD+BY+2965197100002::9'RFF+VA:DE1234512345'CTA+PD+1144'NAD+IV+2965197400003::9'RFF+VA:DE1234512346'CTA+OC+223'NAD+DP+2965197200009::9'CTA+DL+6677'NAD+UC+2965197300006::9'CTA+GR+9876'CUX+2:EUR:9'LIN+1++2165197000016:SRV'PIA+1+JEBL5023:SA::91+BLJE50:IN::92'IMD+A++:::Jeans?+mehr'IMD+F+35+:::Blau'IMD+F+98+:::50'QTY+21:10'PRI+AAA:30.0::LIU'PRI+AAE:99,0::SRP:1'LIN+2++2165197000023:SRV'PIA+1+JEBL5223:SA::91+BLJE52:IN::92'IMD+A++:::Jeans'IMD+F+35+:::Blau'IMD+F+98+:::52'QTY+21:10'PRI+AAA:40::LIU'PRI+AAE:120::SRP:1'UNS+S'UNT+37+1'UNZ+1+1146492687.229'
@@ -0,0 +1,3 @@
1
+ 220;100;2965197200009;2965197100002;12345;11;2165197000009;23456;DE1234512345;1144;DE1234512345;2965197400003;223;DE1234512346;6677;2965197300006;9876;20040712;20040414;;EUR;4712;1245;1420;
2
+ 220;200;2965197200009;2965197100002;12345;1;2165197000016;Jeans;Blau;50;JEBL5023;BLJE50;10;PCE;1;30;99;
3
+ 220;200;2965197200009;2965197100002;12345;2;2165197000023;Jeans;Blau;52;JEBL5223;BLJE52;10;PCE;1;40;120;
@@ -0,0 +1 @@
1
+ UNA:+.? 'UNB+UNOC:3+2965197100002:14+2165197000009:14+060501:1611+1146492687.229+++++EANCOM+1'UNH+1+ORDERS:D:01B:UN:EAN010'BGM+220+12345+9'DTM+137:20040712:102'DTM+2:200404141245200404141420:719'RFF+PD:4712'NAD+SU+2165197000009::9'RFF+YC1:23456'RFF+VA:DE1234512345'NAD+BY+2965197100002::9'RFF+VA:DE1234512345'CTA+PD+1144'NAD+IV+2965197400003::9'RFF+VA:DE1234512346'CTA+OC+223'NAD+DP+2965197200009::9'CTA+DL+6677'NAD+UC+2965197300006::9'CTA+GR+9876'CUX+2:EUR:9'LIN+1++2165197000016:SRV'PIA+1+JEBL5023:SA::91++BLJE50:IN::92'IMD+A++:::Jeans?+mehr'IMD+F+35+:::Blau'IMD+F+98+:::50'QTY+21:10'PRI+AAA:30.0::LIU'PRI+AAE:99,0::SRP:1'LIN+2++2165197000023:SRV'PIA+1+JEBL5223:SA::91+BLJE52:IN::92'IMD+A++:::Jeans'IMD+F+35+:::Blau'IMD+F+98+:::52'QTY+21:10'PRI+AAA:40::LIU'PRI+AAE:120::SRP:1'UNS+S'UNT+37+1'UNZ+1+1146492687.229'
@@ -0,0 +1,350 @@
1
+ <?xml version='1.0'?>
2
+ <!DOCTYPE Interchange PUBLIC
3
+ '-//FH Wiesbaden FB DCSM//DTD XML Representation of EDI data V1.1//EN'
4
+ 'http://edi01.informatik.fh-wiesbaden.de/edi4r/edi4r-1.1.dtd'>
5
+ <Interchange version='3' standard_key='E'>
6
+ <Header>
7
+ <Segment name='UNB'>
8
+ <CDE name='S001'>
9
+ <DE name='0001'>UNOC</DE>
10
+ <DE name='0002'>3</DE>
11
+ </CDE>
12
+ <CDE name='S002'>
13
+ <DE name='0004'>2965197100002</DE>
14
+ <DE name='0007'>14</DE>
15
+ </CDE>
16
+ <CDE name='S003'>
17
+ <DE name='0010'>2165197000009</DE>
18
+ <DE name='0007'>14</DE>
19
+ </CDE>
20
+ <CDE name='S004'>
21
+ <DE name='0017'>060501</DE>
22
+ <DE name='0019'>1611</DE>
23
+ </CDE>
24
+ <DE name='0020'>1146492687.229</DE>
25
+ <DE name='0032'>EANCOM</DE>
26
+ <DE name='0035'>1</DE>
27
+ </Segment>
28
+ <Parameter name='UNA'>UNA:+.? &apos;</Parameter>
29
+ </Header>
30
+ <Message>
31
+ <Header>
32
+ <Segment name='UNH'>
33
+ <DE name='0062'>1</DE>
34
+ <CDE name='S009'>
35
+ <DE name='0065'>ORDERS</DE>
36
+ <DE name='0052'>D</DE>
37
+ <DE name='0054'>01B</DE>
38
+ <DE name='0051'>UN</DE>
39
+ <DE name='0057'>EAN010</DE>
40
+ </CDE>
41
+ </Segment>
42
+ </Header>
43
+ <Segment name='BGM'>
44
+ <CDE name='C002'>
45
+ <DE name='1001'>220</DE>
46
+ </CDE>
47
+ <CDE name='C106'>
48
+ <DE name='1004'>12345</DE>
49
+ </CDE>
50
+ <DE name='1225'>9</DE>
51
+ </Segment>
52
+ <Segment name='DTM'>
53
+ <CDE name='C507'>
54
+ <DE name='2005'>137</DE>
55
+ <DE name='2380'>20040712</DE>
56
+ <DE name='2379'>102</DE>
57
+ </CDE>
58
+ </Segment>
59
+ <Segment name='DTM'>
60
+ <CDE name='C507'>
61
+ <DE name='2005'>2</DE>
62
+ <DE name='2380'>200404141245200404141420</DE>
63
+ <DE name='2379'>719</DE>
64
+ </CDE>
65
+ </Segment>
66
+ <SegmentGroup name='SG1'>
67
+ <Segment name='RFF'>
68
+ <CDE name='C506'>
69
+ <DE name='1153'>PD</DE>
70
+ <DE name='1154'>4712</DE>
71
+ </CDE>
72
+ </Segment>
73
+ </SegmentGroup>
74
+ <SegmentGroup name='SG2'>
75
+ <Segment name='NAD'>
76
+ <DE name='3035'>SU</DE>
77
+ <CDE name='C082'>
78
+ <DE name='3039'>2165197000009</DE>
79
+ <DE name='3055'>9</DE>
80
+ </CDE>
81
+ </Segment>
82
+ <SegmentGroup name='SG3'>
83
+ <Segment name='RFF'>
84
+ <CDE name='C506'>
85
+ <DE name='1153'>YC1</DE>
86
+ <DE name='1154'>23456</DE>
87
+ </CDE>
88
+ </Segment>
89
+ </SegmentGroup>
90
+ <SegmentGroup name='SG3'>
91
+ <Segment name='RFF'>
92
+ <CDE name='C506'>
93
+ <DE name='1153'>VA</DE>
94
+ <DE name='1154'>DE1234512345</DE>
95
+ </CDE>
96
+ </Segment>
97
+ </SegmentGroup>
98
+ </SegmentGroup>
99
+ <SegmentGroup name='SG2'>
100
+ <Segment name='NAD'>
101
+ <DE name='3035'>BY</DE>
102
+ <CDE name='C082'>
103
+ <DE name='3039'>2965197100002</DE>
104
+ <DE name='3055'>9</DE>
105
+ </CDE>
106
+ </Segment>
107
+ <SegmentGroup name='SG3'>
108
+ <Segment name='RFF'>
109
+ <CDE name='C506'>
110
+ <DE name='1153'>VA</DE>
111
+ <DE name='1154'>DE1234512345</DE>
112
+ </CDE>
113
+ </Segment>
114
+ </SegmentGroup>
115
+ <SegmentGroup name='SG5'>
116
+ <Segment name='CTA'>
117
+ <DE name='3139'>PD</DE>
118
+ <CDE name='C056'>
119
+ <DE name='3413'>1144</DE>
120
+ </CDE>
121
+ </Segment>
122
+ </SegmentGroup>
123
+ </SegmentGroup>
124
+ <SegmentGroup name='SG2'>
125
+ <Segment name='NAD'>
126
+ <DE name='3035'>IV</DE>
127
+ <CDE name='C082'>
128
+ <DE name='3039'>2965197400003</DE>
129
+ <DE name='3055'>9</DE>
130
+ </CDE>
131
+ </Segment>
132
+ <SegmentGroup name='SG3'>
133
+ <Segment name='RFF'>
134
+ <CDE name='C506'>
135
+ <DE name='1153'>VA</DE>
136
+ <DE name='1154'>DE1234512346</DE>
137
+ </CDE>
138
+ </Segment>
139
+ </SegmentGroup>
140
+ <SegmentGroup name='SG5'>
141
+ <Segment name='CTA'>
142
+ <DE name='3139'>OC</DE>
143
+ <CDE name='C056'>
144
+ <DE name='3413'>223</DE>
145
+ </CDE>
146
+ </Segment>
147
+ </SegmentGroup>
148
+ </SegmentGroup>
149
+ <SegmentGroup name='SG2'>
150
+ <Segment name='NAD'>
151
+ <DE name='3035'>DP</DE>
152
+ <CDE name='C082'>
153
+ <DE name='3039'>2965197200009</DE>
154
+ <DE name='3055'>9</DE>
155
+ </CDE>
156
+ </Segment>
157
+ <SegmentGroup name='SG5'>
158
+ <Segment name='CTA'>
159
+ <DE name='3139'>DL</DE>
160
+ <CDE name='C056'>
161
+ <DE name='3413'>6677</DE>
162
+ </CDE>
163
+ </Segment>
164
+ </SegmentGroup>
165
+ </SegmentGroup>
166
+ <SegmentGroup name='SG2'>
167
+ <Segment name='NAD'>
168
+ <DE name='3035'>UC</DE>
169
+ <CDE name='C082'>
170
+ <DE name='3039'>2965197300006</DE>
171
+ <DE name='3055'>9</DE>
172
+ </CDE>
173
+ </Segment>
174
+ <SegmentGroup name='SG5'>
175
+ <Segment name='CTA'>
176
+ <DE name='3139'>GR</DE>
177
+ <CDE name='C056'>
178
+ <DE name='3413'>9876</DE>
179
+ </CDE>
180
+ </Segment>
181
+ </SegmentGroup>
182
+ </SegmentGroup>
183
+ <SegmentGroup name='SG7'>
184
+ <Segment name='CUX'>
185
+ <CDE name='C504'>
186
+ <DE name='6347'>2</DE>
187
+ <DE name='6345'>EUR</DE>
188
+ <DE name='6343'>9</DE>
189
+ </CDE>
190
+ </Segment>
191
+ </SegmentGroup>
192
+ <SegmentGroup name='SG28'>
193
+ <Segment name='LIN'>
194
+ <DE name='1082'>1</DE>
195
+ <CDE name='C212'>
196
+ <DE name='7140'>2165197000016</DE>
197
+ <DE name='7143'>SRV</DE>
198
+ </CDE>
199
+ </Segment>
200
+ <Segment name='PIA'>
201
+ <DE name='4347'>1</DE>
202
+ <CDE name='C212'>
203
+ <DE name='7140'>JEBL5023</DE>
204
+ <DE name='7143'>SA</DE>
205
+ <DE name='3055'>91</DE>
206
+ </CDE>
207
+ <CDE name='C212' instance='3'>
208
+ <DE name='7140'>BLJE50</DE>
209
+ <DE name='7143'>IN</DE>
210
+ <DE name='3055'>92</DE>
211
+ </CDE>
212
+ </Segment>
213
+ <Segment name='IMD'>
214
+ <DE name='7077'>A</DE>
215
+ <CDE name='C273'>
216
+ <DE name='7008'>Jeans+mehr</DE>
217
+ </CDE>
218
+ </Segment>
219
+ <Segment name='IMD'>
220
+ <DE name='7077'>F</DE>
221
+ <CDE name='C272'>
222
+ <DE name='7081'>35</DE>
223
+ </CDE>
224
+ <CDE name='C273'>
225
+ <DE name='7008'>Blau</DE>
226
+ </CDE>
227
+ </Segment>
228
+ <Segment name='IMD'>
229
+ <DE name='7077'>F</DE>
230
+ <CDE name='C272'>
231
+ <DE name='7081'>98</DE>
232
+ </CDE>
233
+ <CDE name='C273'>
234
+ <DE name='7008'>50</DE>
235
+ </CDE>
236
+ </Segment>
237
+ <Segment name='QTY'>
238
+ <CDE name='C186'>
239
+ <DE name='6063'>21</DE>
240
+ <DE name='6060'>10</DE>
241
+ </CDE>
242
+ </Segment>
243
+ <SegmentGroup name='SG32'>
244
+ <Segment name='PRI'>
245
+ <CDE name='C509'>
246
+ <DE name='5125'>AAA</DE>
247
+ <DE name='5118'>30</DE>
248
+ <DE name='5387'>LIU</DE>
249
+ </CDE>
250
+ </Segment>
251
+ </SegmentGroup>
252
+ <SegmentGroup name='SG32'>
253
+ <Segment name='PRI'>
254
+ <CDE name='C509'>
255
+ <DE name='5125'>AAE</DE>
256
+ <DE name='5118'>99</DE>
257
+ <DE name='5387'>SRP</DE>
258
+ <DE name='5284'>1</DE>
259
+ </CDE>
260
+ </Segment>
261
+ </SegmentGroup>
262
+ </SegmentGroup>
263
+ <SegmentGroup name='SG28'>
264
+ <Segment name='LIN'>
265
+ <DE name='1082'>2</DE>
266
+ <CDE name='C212'>
267
+ <DE name='7140'>2165197000023</DE>
268
+ <DE name='7143'>SRV</DE>
269
+ </CDE>
270
+ </Segment>
271
+ <Segment name='PIA'>
272
+ <DE name='4347'>1</DE>
273
+ <CDE name='C212'>
274
+ <DE name='7140'>JEBL5223</DE>
275
+ <DE name='7143'>SA</DE>
276
+ <DE name='3055'>91</DE>
277
+ </CDE>
278
+ <CDE name='C212' instance='2'>
279
+ <DE name='7140'>BLJE52</DE>
280
+ <DE name='7143'>IN</DE>
281
+ <DE name='3055'>92</DE>
282
+ </CDE>
283
+ </Segment>
284
+ <Segment name='IMD'>
285
+ <DE name='7077'>A</DE>
286
+ <CDE name='C273'>
287
+ <DE name='7008'>Jeans</DE>
288
+ </CDE>
289
+ </Segment>
290
+ <Segment name='IMD'>
291
+ <DE name='7077'>F</DE>
292
+ <CDE name='C272'>
293
+ <DE name='7081'>35</DE>
294
+ </CDE>
295
+ <CDE name='C273'>
296
+ <DE name='7008'>Blau</DE>
297
+ </CDE>
298
+ </Segment>
299
+ <Segment name='IMD'>
300
+ <DE name='7077'>F</DE>
301
+ <CDE name='C272'>
302
+ <DE name='7081'>98</DE>
303
+ </CDE>
304
+ <CDE name='C273'>
305
+ <DE name='7008'>52</DE>
306
+ </CDE>
307
+ </Segment>
308
+ <Segment name='QTY'>
309
+ <CDE name='C186'>
310
+ <DE name='6063'>21</DE>
311
+ <DE name='6060'>10</DE>
312
+ </CDE>
313
+ </Segment>
314
+ <SegmentGroup name='SG32'>
315
+ <Segment name='PRI'>
316
+ <CDE name='C509'>
317
+ <DE name='5125'>AAA</DE>
318
+ <DE name='5118'>40</DE>
319
+ <DE name='5387'>LIU</DE>
320
+ </CDE>
321
+ </Segment>
322
+ </SegmentGroup>
323
+ <SegmentGroup name='SG32'>
324
+ <Segment name='PRI'>
325
+ <CDE name='C509'>
326
+ <DE name='5125'>AAE</DE>
327
+ <DE name='5118'>120</DE>
328
+ <DE name='5387'>SRP</DE>
329
+ <DE name='5284'>1</DE>
330
+ </CDE>
331
+ </Segment>
332
+ </SegmentGroup>
333
+ </SegmentGroup>
334
+ <Segment name='UNS'>
335
+ <DE name='0081'>S</DE>
336
+ </Segment>
337
+ <Trailer>
338
+ <Segment name='UNT'>
339
+ <DE name='0074'>37</DE>
340
+ <DE name='0062'>1</DE>
341
+ </Segment>
342
+ </Trailer>
343
+ </Message>
344
+ <Trailer>
345
+ <Segment name='UNZ'>
346
+ <DE name='0036'>1</DE>
347
+ <DE name='0020'>1146492687.229</DE>
348
+ </Segment>
349
+ </Trailer>
350
+ </Interchange>