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,131 @@
1
+ #!/usr/bin/env ruby
2
+ # :include: ../AuthorCopyright
3
+
4
+ # Load path magic...
5
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
6
+
7
+ require 'test/unit'
8
+
9
+ require 'edi4r'
10
+ require 'edi4r/edifact'
11
+
12
+ # require "rubygems"
13
+ # require_gem "edi4r"
14
+ # require_gem "edi4r-tdid"
15
+
16
+ class Tutorial_Tests < Test::Unit::TestCase
17
+
18
+ def test_tutorial_samples
19
+ ic = ic2 = nil
20
+ assert_nothing_raised do
21
+ ic = EDI::E::Interchange.new
22
+ ic2 = EDI::E::Interchange.new( :version => 3, :charset => 'UNOB' )
23
+ end
24
+ assert_equal( ic.to_s, ic2.to_s )
25
+
26
+ msg = msg1 = nil
27
+ assert_nothing_raised do
28
+ msg1 = ic.new_message
29
+ msg = ic.new_message(:msg_type=>'ORDERS', :version=>'D', :release=>'96A',
30
+ :resp_agency=>'UN' )
31
+ end
32
+
33
+ assert_raise(EDI::EDILookupError) { ic.add( msg ) }
34
+ assert_nothing_raised { ic.add( msg, false ) }
35
+
36
+
37
+ assert_nothing_raised do
38
+ seg = msg.new_segment( 'BGM' )
39
+ msg.add( seg )
40
+ end
41
+ assert_equal( 1, msg.size )
42
+
43
+ order_number = nil
44
+ assert_nothing_raised do
45
+ bgm = msg.new_segment( 'BGM' )
46
+ bgm.d1004 = '123456ABC'
47
+ bgm.cC002.d1001 = 220
48
+
49
+ cde = bgm.cC002
50
+ order_number = bgm.d1004 if cde.d1001 == 220
51
+ end
52
+ assert_equal( '123456ABC', order_number )
53
+
54
+
55
+ assert_nothing_raised do
56
+ seg = msg.new_segment('PIA')
57
+ cde_list = seg.aC212
58
+ cde_list[0].d7140 = '54321'
59
+ cde_list[0].d7143 = 'SA'
60
+ cde_list[0].d3055 = 91
61
+ cde_list[1].d7140 = '12356' # etc
62
+
63
+ seg = msg.new_segment('NAD')
64
+ seg.cC080.a3036[0].value = 'E. X. Ample'
65
+ seg.cC080.a3036[1].value = 'Sales dept.'
66
+ end
67
+
68
+
69
+ assert_nothing_raised do
70
+ ic.header.cS002.d0004 = '1234567'
71
+ ic.header.d0035 = 1
72
+ ic.show_una = false
73
+ ic.show_una = true
74
+ end
75
+ assert_equal( 'UNA:+.? \'', ic.una.to_s )
76
+
77
+ assert_nothing_raised do
78
+ pri = msg.parse_segment("PRI+AAA:123::LIU", 'PRI')
79
+ pri.cC509.d5118 = 30.1
80
+ assert_equal( "PRI+AAA:30.1::LIU", pri.to_s )
81
+ ic.una.decimal_sign = ?,
82
+ assert_equal( "PRI+AAA:30,1::LIU", pri.to_s )
83
+ ic.una.ce_sep = ?/
84
+ assert_equal( "PRI+AAA/30,1//LIU", pri.to_s )
85
+ end
86
+
87
+ assert_raise(EDI::EDILookupError) {ic.validate}
88
+
89
+ ic = nil
90
+ assert_nothing_raised do
91
+ File.open("remadv101.edi") {|hnd| ic = EDI::E::Interchange.parse( hnd )}
92
+
93
+ ic.each do |msg|
94
+
95
+ msg.each do |seg|
96
+ seg_name = seg.name
97
+ seg_name += ' ' + seg.sg_name if seg.sg_name
98
+ case seg_name
99
+ when "BGM"
100
+ # do this ...
101
+ when "DTM"
102
+ # do that ...
103
+ when 'NAD SG2'
104
+ # react only if NAD occurs in segment group 2
105
+
106
+ # ... etc., finally:
107
+ default
108
+ raise "Segment #{seg_name}: Not accounted for!"
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ n=0
115
+ assert_nothing_raised {n = ic.validate}
116
+ assert_equal( 0, n )
117
+
118
+ second_msg = ic[1]
119
+ last_msg = ic.last
120
+ d = last_msg['DTM'] # Array of all DTM segments, any segment group
121
+ assert( d. is_a?( Array ) )
122
+ d = msg.find_all {|seg| seg.name == 'DTM' && seg.sg_name == 'SG4'}
123
+ assert_equal( 11, d.size )
124
+
125
+ doc1 = last_msg['DOC'].first
126
+ assert_equal( 12, doc1.children.size )
127
+ assert_equal( 13, doc1.children_and_self.size )
128
+ assert_equal( 15, doc1.descendants.size )
129
+ assert_equal( 16, doc1.descendants_and_self.size )
130
+ end
131
+ end
@@ -0,0 +1,408 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Mapping demo: Outbound, from inhouse to EANCOM
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
10
+ # Comments:
11
+ #
12
+ # Inhouse and output format were selected, because they represent typical
13
+ # data structures and tasks for users, and because documentation of
14
+ # these formats is freely available.
15
+ #
16
+ # $Id: webedi2eancom.rb,v 1.1 2006/05/28 16:08:48 werntges Exp $
17
+ #
18
+ # Author: Heinz W. Werntges (edi@informatik.fh-wiesbaden.de)
19
+ #
20
+ # License: This code is put under the Ruby license
21
+ #
22
+ # Copyright (c) 2006 Heinz W. Werntges, FH Wiesbaden
23
+ #
24
+
25
+ # Include statement during test setup:
26
+
27
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
28
+ require 'edi4r'
29
+ require 'edi4r/edifact'
30
+
31
+ # Regular include statements:
32
+
33
+ #require "rubygems"
34
+ #require_gem "edi4r"
35
+ #require "edi4r/edifact"
36
+
37
+
38
+
39
+ class WebEDI_to_EANCOM02_Map_ORDERS
40
+ include EDI
41
+
42
+ # Mengeneinheit_cvt = {'STK' => 'PCE', 'KG' => 'KGM'}
43
+ # UNBsender_cvt = {'10' => '4333099000009', # Kaufhof ILN
44
+ # '1034' => '(C+C ILN)',
45
+ # '1037' => '(extra ILN)',
46
+ # '1063' => '(real,- ILN)',
47
+ # # etc.
48
+ # }
49
+
50
+ attr_accessor :with_rff_va
51
+ #
52
+ # Variable names for header record, derived from original documentation
53
+ # Adaptations:
54
+ # lower-case names, no umlaut chars, uniqueness of name (see "ust-id")
55
+ #
56
+
57
+ def processHeader( line )
58
+ bestellung, satzartkennung, iln_lieferanschrift, iln_kaeufer,
59
+ bestellnummer, releasenummer,
60
+ iln_lieferant, lieferantennummer, ust_id_lieferant,
61
+ abteilung_beim_kaeufer, ust_id_kaeufer,
62
+ iln_rechnungsempfaenger, abteilung_beim_rechnungsempfaenger, ust_id_re,
63
+ abteilung_der_lieferanschrift,
64
+ iln_endempfaenger, abteilung_beim_endempfaenger,
65
+ datum_der_bestellung, lieferdatum_gefordert, pick_up_datum,
66
+ waehrung, nr_der_werbeaktion, von_um, bis, _others = line.split(';')
67
+
68
+ raise "Header line mismatch: Too many fields" unless _others.nil?
69
+
70
+ # Store for consistency checks at line item level:
71
+ @unique_document_id=[iln_lieferanschrift, iln_kaeufer, bestellnummer]
72
+
73
+ unb = @ic.header
74
+ unb.cS002.d0004 = iln_kaeufer
75
+ unb.cS002.d0007 = 14
76
+ unb.cS003.d0010 = iln_lieferant
77
+ unb.cS003.d0007 = 14
78
+ # unb.d0035 = '1' if whatever ...
79
+
80
+ bgm = @msg.new_segment("BGM")
81
+ bgm.cC002.d1001 = bestellung # expected: '220'
82
+ bgm.cC106.d1004 = bestellnummer
83
+ bgm.d1225 = 9
84
+ @msg.add(bgm)
85
+
86
+ raise "Mandatory element missing: datum_der_bestellung" if datum_der_bestellung.empty?
87
+ dtm = @msg.new_segment("DTM")
88
+ dtm.cC507.d2005 = 137
89
+ dtm.cC507.d2380 = datum_der_bestellung
90
+ dtm.cC507.d2379 = 102
91
+ @msg.add(dtm)
92
+
93
+ unless lieferdatum_gefordert.empty?
94
+ dtm = @msg.new_segment("DTM")
95
+ dtm.cC507.d2005 = 2
96
+ lieferdatum_gefordert =~ /(\d\d\d\d)(\d\d)(\d\d)/
97
+ date = $1+$2+$3 # showing off a bit here...
98
+ if von_um.empty? and bis.empty?
99
+ dtm.cC507.d2380 = date
100
+ dtm.cC507.d2379 = 102
101
+ elsif bis.empty?
102
+ raise "Format error in 'von_um'" unless von_um =~ /\d*(\d\d\d\d)$/
103
+ dtm.cC507.d2380 = date+$1
104
+ dtm.cC507.d2379 = 203
105
+ else
106
+ raise "Format error in 'von_um'" unless von_um =~ /\d*(\d\d\d\d)$/
107
+ von = $1
108
+ raise "Format error in 'bis'" unless bis =~ /\d*(\d\d\d\d)$/
109
+ bis = $1
110
+ dtm.cC507.d2380 = date+von+date+bis
111
+ dtm.cC507.d2379 = 719
112
+ end
113
+ @msg.add(dtm)
114
+ end
115
+
116
+ unless pick_up_datum.empty?
117
+ dtm = @msg.new_segment("DTM")
118
+ dtm.cC507.d2005 = '200'
119
+ dtm.cC507.d2380 = pick_up_datum
120
+ dtm.cC507.d2379 = '102'
121
+ @msg.add(dtm)
122
+ end
123
+
124
+ unless nr_der_werbeaktion.empty?
125
+ rff = @msg.new_segment("RFF")
126
+ cde = rff.cC506
127
+ cde.d1153 = 'PD'
128
+ cde.d1154 = nr_der_werbeaktion
129
+ @msg.add(rff)
130
+ end
131
+
132
+ # Use a loop for the NAD group
133
+
134
+ [ [iln_lieferant, 'SU', nil, nil, lieferantennummer, ust_id_lieferant],
135
+ [iln_kaeufer, 'BY', abteilung_beim_kaeufer, 'PD', nil, ust_id_kaeufer],
136
+ [iln_rechnungsempfaenger, 'IV', abteilung_beim_rechnungsempfaenger, 'OC', nil, ust_id_re],
137
+ [iln_lieferanschrift, 'DP', abteilung_der_lieferanschrift, 'DL', nil, nil],
138
+ [iln_endempfaenger, 'UC', abteilung_beim_endempfaenger, 'GR', nil, nil]
139
+ ].each do |nad_params|
140
+ iln, qu, dept, qu_dept, no, ust_id = nad_params
141
+
142
+ raise "Mandatory ILN missing for #{qu}" if iln.nil? or iln.empty?
143
+ nad = @msg.new_segment("NAD")
144
+ nad.d3035 = qu
145
+ cde = nad.cC082
146
+ cde.d3039 = iln
147
+ cde.d3055 = '9'
148
+ @msg.add(nad)
149
+
150
+ # Special treatment - depending segments - in some cases:
151
+
152
+ if qu=='SU' and no and !no.empty?
153
+ rff = @msg.new_segment("RFF")
154
+ cde = rff.cC506
155
+ cde.d1153 = 'YC1'
156
+ cde.d1154 = no
157
+ @msg.add(rff)
158
+ end
159
+
160
+ if with_rff_va
161
+ # ust_id: reserved for INVOIC ?!
162
+ unless ust_id.nil?
163
+ rff = @msg.new_segment("RFF")
164
+ cde = rff.cC506
165
+ cde.d1153 = 'VA'
166
+ cde.d1154 = ust_id
167
+ @msg.add(rff)
168
+ end
169
+ end
170
+
171
+ if dept and !dept.empty?
172
+ cta = @msg.new_segment("CTA")
173
+ cta.d3139 = qu_dept
174
+ cta.cC056.d3413 = dept
175
+ @msg.add(cta)
176
+ end
177
+
178
+ end
179
+
180
+ unless waehrung.empty?
181
+ seg = @msg.new_segment("CUX")
182
+ cde = seg.aC504.first # [0]
183
+ cde.d6347 = '2'
184
+ cde.d6345 = waehrung
185
+ cde.d6343 = '9'
186
+ @msg.add(seg)
187
+ end
188
+
189
+ end
190
+
191
+
192
+ def processItem( line )
193
+
194
+ bestellung, satzartkennung, iln_lieferanschrift, iln_kaeufer,
195
+ bestellnummer,
196
+ positionsnummer, ean, artikelbezeichnung, farbe, groesse,
197
+ lieferantenartikelnummer, kaeuferartikelnummer,
198
+ bestellmenge, einheit, preisbezugseinheit, ek, vk = line.split(';')
199
+
200
+ # Consistency check
201
+ if @unique_document_id != [iln_lieferanschrift, iln_kaeufer, bestellnummer]
202
+ puts @unique_document_id
203
+ puts [iln_lieferanschrift, iln_kaeufer, bestellnummer]
204
+ raise "Item does not match header!"
205
+ end
206
+
207
+ # LIN
208
+ lin = @msg.new_segment("LIN")
209
+ lin.d1082 = positionsnummer
210
+ lin.cC212.d7140 = ean
211
+ lin.cC212.d7143 = "SRV" unless ean.empty?
212
+ @msg.add(lin)
213
+
214
+ #PIA
215
+ if ean.empty?
216
+ raise "Mandatory article id missing" if lieferantenartikelnummer.empty?
217
+ pia = @msg.new_segment("PIA")
218
+ pia.d4347 = '5'
219
+ cde = pia.cC212[0]
220
+ cde.d7140 = lieferantenartikelnummer
221
+ cde.d7143 = 'SA'
222
+ cde.d3055 = '91'
223
+ end
224
+
225
+ unless kaeuferartikelnummer.empty? and lieferantenartikelnummer.empty?
226
+ pia = @msg.new_segment("PIA")
227
+ pia.d4347 = '1'
228
+ cde = pia.aC212[0]
229
+ if !lieferantenartikelnummer.empty?
230
+ cde.d7140 = lieferantenartikelnummer
231
+ cde.d7143 = 'SA'
232
+ cde.d3055 = '91'
233
+ if !kaeuferartikelnummer.empty?
234
+ cde = pia.aC212[1]
235
+ cde.d7140 = kaeuferartikelnummer
236
+ cde.d7143 = 'IN'
237
+ cde.d3055 = '92'
238
+ end
239
+ else
240
+ cde.d7140 = lieferantenartikelnummer
241
+ cde.d7143 = 'BP'
242
+ cde.d3055 = '92'
243
+ end
244
+ @msg.add(pia)
245
+ end
246
+
247
+ # IMD
248
+ unless artikelbezeichnung.empty?
249
+ imd = @msg.new_segment("IMD")
250
+ imd.d7077 = 'A'
251
+ imd.cC273.a7008[0].value = artikelbezeichnung
252
+ @msg.add(imd)
253
+ end
254
+
255
+ unless farbe.empty?
256
+ imd = @msg.new_segment("IMD")
257
+ imd.d7077 = 'F'
258
+ imd.cC272.d7081 = '35'
259
+ imd.cC273.a7008[0].value = farbe
260
+ @msg.add(imd)
261
+ end
262
+
263
+ unless groesse.empty?
264
+ imd = @msg.new_segment("IMD")
265
+ imd.d7077 = 'F'
266
+ imd.cC272.d7081 = '98'
267
+ imd.cC273.a7008[0].value = groesse
268
+ @msg.add(imd)
269
+ end
270
+
271
+ # QTY
272
+ qty = @msg.new_segment("QTY")
273
+ cde = qty.cC186
274
+ cde.d6063 = '21'
275
+ cde.d6060 = bestellmenge.to_i
276
+ cde.d6411 = einheit unless einheit == 'PCE' # Mengeneinheit_cvt[masseinh_menge]
277
+ cde.root = @ic
278
+ @msg.add(qty)
279
+
280
+ # PRI
281
+ [[ek,'AAA'], [vk, 'AAE']].each do |params|
282
+ preis, qu = params
283
+ unless preis.empty?
284
+ pri = @msg.new_segment("PRI")
285
+ cde = pri.cC509
286
+ cde.d5125 = qu
287
+ cde.d5118 = preis.sub(/,/,'.').to_f # decimal sign adjustment
288
+ if qu == 'AAA'
289
+ cde.d5387 = 'LIU'
290
+ else
291
+ cde.d5387 = 'SRP'
292
+ cde.d5284 = preisbezugseinheit
293
+ # cde.d6411 = 'PCE' ??
294
+ end
295
+ @msg.add(pri)
296
+ end
297
+ end
298
+
299
+ end
300
+
301
+
302
+ def wrapup_msg # Fine as long as we don't create a summary section
303
+ return if @msg.nil?
304
+ uns = @msg.new_segment("UNS")
305
+ uns.d0081 = 'S'
306
+ @msg.add(uns)
307
+ @ic.add(@msg)
308
+ @msg = nil
309
+ end
310
+
311
+ # Dispatcher
312
+ #
313
+ # Call specialized mapping methods, depending on record type
314
+ #
315
+ def processLine( line )
316
+ case line
317
+ when /^#.*/ # Skip comment lines
318
+
319
+ when /^220;100;.*/ # Header: Triggers a new message
320
+ wrapup_msg
321
+ params = {
322
+ :msg_type => 'ORDERS',
323
+ :version => 'D',
324
+ :release => '01B',
325
+ :resp_agency => 'UN',
326
+ :assigned_code => 'EAN010'
327
+ }
328
+ @msg = @ic.new_message( params )
329
+ processHeader( line.chomp )
330
+
331
+ when /^220;200;.*/ # Item: Requires a message to add to
332
+ raise "Illegal state: Item before header?" if @msg == nil
333
+ processItem(line.chomp)
334
+
335
+ when /^\W*$/ # EOF: Add message to interchange
336
+ wrapup_msg
337
+
338
+ else
339
+ print "Illegal line: #{line}\n"
340
+ wrapup_msg
341
+ end
342
+ end
343
+
344
+
345
+ def initialize(interchange)
346
+ @msg = nil
347
+ @with_rf_va = false
348
+ @ic = interchange
349
+ end
350
+
351
+ def validate
352
+ @ic.validate
353
+ end
354
+
355
+ def write(hnd)
356
+ @ic.write(hnd)
357
+ end
358
+ end # class WebEDI_to_EANCOM02_Mapper
359
+
360
+
361
+ #
362
+ # MAIN
363
+ #
364
+
365
+ # We assume that all input is subject to the same mapping code,
366
+ # and that all resulting messages go into the same interchange.
367
+ #
368
+ # Sender and recipient code of this interchange's UNB segment
369
+ # are determined by buyer and supplier of one of the messages.
370
+ #
371
+ # In "real live", you may have to sort input documents according
372
+ # to message type, sender/recipient, and required mapping code.
373
+
374
+ ic = EDI::E::Interchange.new({:show_una => true,
375
+ :charset => 'UNOC',
376
+ :version => 3,
377
+ :interchange_control_reference => Time.now.to_f.to_s[0...14] ,
378
+ # :application_reference => 'EANCOM' ,
379
+ # :output_mode => :verbatim,
380
+ # :acknowledgment_request => true,
381
+ :interchange_agreement_id => 'EANCOM'+'' , # your ref here!
382
+ :test_indicator => 1,
383
+ })
384
+
385
+ with_rff_va = false
386
+
387
+ while ARGV[0] =~ /^-(\w)/
388
+ opt = ARGV.shift
389
+ case $1
390
+ when 'v' # verbose mode - here: use formatted output
391
+ ic.output_mode = :indented
392
+ when 'a'
393
+ with_rff_va = true
394
+ else
395
+ raise "Option not supported: #{opt}"
396
+ end
397
+ end
398
+
399
+ map = WebEDI_to_EANCOM02_Map_ORDERS.new( ic )
400
+ map.with_rff_va = with_rff_va
401
+
402
+ while (line=gets)
403
+ map.processLine( line )
404
+ end
405
+ map.wrapup_msg
406
+ ic.validate
407
+ $stdout.write ic
408
+ # ic.inspect