xmlconv2 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/History.txt +6 -0
  2. data/LICENCE.txt +339 -0
  3. data/Manifest.txt +107 -0
  4. data/README.txt +25 -0
  5. data/Rakefile +28 -0
  6. data/bin/admin +65 -0
  7. data/bin/xmlconvd +19 -0
  8. data/data/grammar/i2.grammar +73 -0
  9. data/src/conversion/bdd_geh.rb +281 -0
  10. data/src/conversion/bdd_i2.rb +102 -0
  11. data/src/conversion/bdd_xml.rb +242 -0
  12. data/src/conversion/geh_bdd.rb +165 -0
  13. data/src/conversion/i2_bdd.rb +271 -0
  14. data/src/conversion/xml_bdd.rb +125 -0
  15. data/src/custom/lookandfeel.rb +47 -0
  16. data/src/i2/address.rb +33 -0
  17. data/src/i2/date.rb +37 -0
  18. data/src/i2/document.rb +26 -0
  19. data/src/i2/header.rb +24 -0
  20. data/src/i2/order.rb +44 -0
  21. data/src/i2/parser.rb +25 -0
  22. data/src/i2/position.rb +37 -0
  23. data/src/i2/record.rb +11 -0
  24. data/src/model/address.rb +20 -0
  25. data/src/model/agreement.rb +10 -0
  26. data/src/model/bdd.rb +26 -0
  27. data/src/model/bsr.rb +16 -0
  28. data/src/model/delivery.rb +15 -0
  29. data/src/model/delivery_item.rb +18 -0
  30. data/src/model/freetext_container.rb +26 -0
  31. data/src/model/id_container.rb +15 -0
  32. data/src/model/invoice.rb +18 -0
  33. data/src/model/invoice_item.rb +11 -0
  34. data/src/model/item.rb +19 -0
  35. data/src/model/item_container.rb +15 -0
  36. data/src/model/name.rb +27 -0
  37. data/src/model/part_info.rb +10 -0
  38. data/src/model/part_info_container.rb +15 -0
  39. data/src/model/party.rb +23 -0
  40. data/src/model/party_container.rb +20 -0
  41. data/src/model/price.rb +10 -0
  42. data/src/model/price_container.rb +18 -0
  43. data/src/model/transaction.rb +28 -0
  44. data/src/state/global.rb +28 -0
  45. data/src/state/global_predefine.rb +11 -0
  46. data/src/state/login.rb +38 -0
  47. data/src/state/transaction.rb +13 -0
  48. data/src/state/transactions.rb +130 -0
  49. data/src/util/application.rb +143 -0
  50. data/src/util/destination.rb +130 -0
  51. data/src/util/invoicer.rb +72 -0
  52. data/src/util/known_user.rb +16 -0
  53. data/src/util/polling_manager.rb +78 -0
  54. data/src/util/session.rb +23 -0
  55. data/src/util/transaction.rb +105 -0
  56. data/src/util/validator.rb +20 -0
  57. data/src/view/foot.rb +27 -0
  58. data/src/view/head.rb +13 -0
  59. data/src/view/login.rb +36 -0
  60. data/src/view/navigation.rb +30 -0
  61. data/src/view/navigationlink.rb +21 -0
  62. data/src/view/pager.rb +73 -0
  63. data/src/view/preformatted.rb +39 -0
  64. data/src/view/template.rb +17 -0
  65. data/src/view/transaction.rb +42 -0
  66. data/src/view/transactions.rb +90 -0
  67. data/test/mock.rb +149 -0
  68. data/test/suite.rb +16 -0
  69. data/test/test_conversion/bdd_geh.rb +533 -0
  70. data/test/test_conversion/bdd_i2.rb +314 -0
  71. data/test/test_conversion/bdd_xml.rb +556 -0
  72. data/test/test_conversion/geh_bdd.rb +372 -0
  73. data/test/test_conversion/i2_bdd.rb +804 -0
  74. data/test/test_conversion/xml_bdd.rb +203 -0
  75. data/test/test_i2/address.rb +88 -0
  76. data/test/test_i2/date.rb +49 -0
  77. data/test/test_i2/document.rb +62 -0
  78. data/test/test_i2/header.rb +39 -0
  79. data/test/test_i2/order.rb +94 -0
  80. data/test/test_i2/parser.rb +309 -0
  81. data/test/test_i2/position.rb +65 -0
  82. data/test/test_integration/geh_i2.rb +312 -0
  83. data/test/test_integration/i2_geh.rb +449 -0
  84. data/test/test_integration/i2_xml.rb +162 -0
  85. data/test/test_integration/xml_i2.rb +254 -0
  86. data/test/test_model/address.rb +35 -0
  87. data/test/test_model/agreement.rb +22 -0
  88. data/test/test_model/bdd.rb +55 -0
  89. data/test/test_model/bsr.rb +38 -0
  90. data/test/test_model/delivery.rb +79 -0
  91. data/test/test_model/delivery_item.rb +52 -0
  92. data/test/test_model/freetext_container.rb +45 -0
  93. data/test/test_model/invoice.rb +65 -0
  94. data/test/test_model/invoice_item.rb +41 -0
  95. data/test/test_model/name.rb +57 -0
  96. data/test/test_model/part_info.rb +24 -0
  97. data/test/test_model/party.rb +96 -0
  98. data/test/test_model/price.rb +24 -0
  99. data/test/test_util/application.rb +168 -0
  100. data/test/test_util/destination.rb +197 -0
  101. data/test/test_util/invoicer.rb +36 -0
  102. data/test/test_util/polling_manager.rb +111 -0
  103. data/test/test_util/transaction.rb +129 -0
  104. data/user-stories/UserStories_XmlConv2.txt +381 -0
  105. data/user-stories/doku/ABB.incoming.HTTP.invoice.xml +315 -0
  106. data/user-stories/doku/ABB.received.xml +259 -0
  107. data/user-stories/doku/BO_OrderProcessing.sxw +0 -0
  108. metadata +195 -0
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+ # BddI2 -- xmlconv2 -- 02.06.2004 -- hwyss@ywesee.com
3
+
4
+ require 'i2/document'
5
+ require 'i2/address'
6
+ require 'i2/position'
7
+
8
+ module XmlConv
9
+ module Conversion
10
+ class BddI2
11
+ I2_ADDR_CODES = {
12
+ 'BillTo' => :buyer,
13
+ 'Employee' => :employee,
14
+ 'ShipTo' => :delivery,
15
+ }
16
+ I2_DELIVERY_CODES = {
17
+ 'wird abgeholt' => :pickup,
18
+ 'werkslieferung' => :delivery,
19
+ 'camion' => :camion,
20
+ }
21
+ class << self
22
+ def convert(bdd)
23
+ doc = I2::Document.new
24
+ header = I2::Header.new
25
+ doc.header = header
26
+ bdd.deliveries.each { |delivery|
27
+ _doc_add_delivery(doc, delivery)
28
+ }
29
+ doc
30
+ end
31
+ def _doc_add_delivery(doc, delivery)
32
+ order = I2::Order.new
33
+ order.sender_id = delivery.bsr_id
34
+ # customer_id is in reality the delivery_id assigned by the
35
+ # customer - the slight confusion is due to automatic naming
36
+ order.delivery_id = delivery.customer_id
37
+ order.add_date(I2::Date.from_date(::Date.today))
38
+ if(customer = delivery.customer)
39
+ _order_add_customer(order, customer)
40
+ end
41
+ if(agreement = delivery.agreement)
42
+ order.terms_cond = I2_DELIVERY_CODES[agreement.terms_cond]
43
+ end
44
+ delivery.items.each { |item|
45
+ _order_add_item(order, item)
46
+ }
47
+ doc.add_order(order)
48
+ end
49
+ def _address_add_bdd_addr(address, bdd_addr)
50
+ if(bdd_addr.size < 2)
51
+ bdd_addr.lines.each_with_index { |line, idx|
52
+ address.send("street#{idx.next}=", line)
53
+ }
54
+ else
55
+ ln1, ln2, ln3 = bdd_addr.lines
56
+ address.name2 = ln1
57
+ address.street1 = ln2
58
+ address.street2 = ln3 unless(ln3.nil?)
59
+ end
60
+ address.city = bdd_addr.city
61
+ address.zip_code = bdd_addr.zip_code
62
+ end
63
+ def _order_add_customer(order, customer)
64
+ customer.parties.each { |party|
65
+ _order_add_party(order, party)
66
+ }
67
+ end
68
+ def _order_add_party(order, party)
69
+ address = I2::Address.new
70
+ address.party_id = party.acc_id
71
+ if(name = party.name)
72
+ address.name1 = name.to_s
73
+ end
74
+ if(code = I2_ADDR_CODES[party.role])
75
+ address.code = code
76
+ end
77
+ if(bdd_addr = party.address)
78
+ _address_add_bdd_addr(address, bdd_addr)
79
+ end
80
+ order.add_address(address)
81
+ end
82
+ def _order_add_item(order, item)
83
+ position = I2::Position.new
84
+ position.number = item.line_no
85
+ position.article_ean = item.et_nummer_id
86
+ if(id = item.customer_id)
87
+ position.customer_id = id
88
+ end
89
+ position.qty = item.qty
90
+ position.unit = item.unit
91
+ if(date = item.delivery_date)
92
+ position.delivery_date = I2::Date.from_date(date)
93
+ end
94
+ if(price = item.get_price('NettoPreis'))
95
+ position.price = price.amount
96
+ end
97
+ order.add_position(position)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,242 @@
1
+ #!/usr/bin/env ruby
2
+ # BddXml -- xmlconv2 -- 21.06.2004 -- hwyss@ywesee.com
3
+
4
+ require 'rexml/document'
5
+
6
+ module XmlConv
7
+ module Conversion
8
+ class BddXml
9
+ class << self
10
+ def convert(bdd)
11
+ skeleton = <<-EOS
12
+ <?xml version="1.0" encoding="UTF-8"?>
13
+ <!DOCTYPE BDD SYSTEM "ABB BDD.dtd">
14
+ <BDD />
15
+ EOS
16
+ doc = REXML::Document.new(skeleton)
17
+ _xml_add_bdd_bsr(doc.root, bdd.bsr)
18
+ bdd.deliveries.each { |delivery|
19
+ _xml_add_bdd_delivery(doc.root, delivery)
20
+ }
21
+ bdd.invoices.each { |invoice|
22
+ _xml_add_bdd_invoice(doc.root, invoice)
23
+ }
24
+ doc
25
+ end
26
+ def _xml_add_bdd_address(xml_elm, address)
27
+ xml_addr = REXML::Element.new('Address')
28
+ address.lines.each { |line|
29
+ xml_line = REXML::Element.new('AddressLine')
30
+ xml_line.text = line
31
+ xml_addr.add_element(xml_line)
32
+ }
33
+ if(city = address.city)
34
+ xml_city = REXML::Element.new('City')
35
+ xml_city.text = city
36
+ xml_addr.add_element(xml_city)
37
+ end
38
+ if(zip_code = address.zip_code)
39
+ xml_zip = REXML::Element.new('ZipCode')
40
+ domain = address.country || 'CH'
41
+ xml_zip.add_attribute('Domain', domain)
42
+ xml_zip.text = zip_code
43
+ xml_addr.add_element(xml_zip)
44
+ end
45
+ xml_elm.add_element(xml_addr)
46
+ end
47
+ def _xml_add_bdd_agreement(xml_elm, agreement)
48
+ if(terms_cond = agreement.terms_cond)
49
+ xml_agreement = REXML::Element.new('Agreement')
50
+ terms = REXML::Element.new('TermsCond')
51
+ terms.text = terms_cond
52
+ xml_agreement.add_element(terms)
53
+ xml_elm.add_element(xml_agreement)
54
+ end
55
+ end
56
+ def _xml_add_bdd_bsr(xml_bdd, bsr)
57
+ xml_bsr = REXML::Element.new('BSR')
58
+ timestamp = REXML::Element.new('Timestamp')
59
+ time = bsr.timestamp || Time.now
60
+ zone = sprintf("%+i", time.gmtoff / 3600)
61
+ timestamp.add_attribute('Zone', zone)
62
+ timestamp.text = time.strftime('%Y%m%d%H%M%S')
63
+ xml_bsr.add_element(timestamp)
64
+ verb = REXML::Element.new('Verb')
65
+ verb.text = bsr.verb || 'Return'
66
+ xml_bsr.add_element(verb)
67
+ noun = REXML::Element.new('Noun')
68
+ noun.text = bsr.noun || 'Status'
69
+ xml_bsr.add_element(noun)
70
+ bsr.parties.each { |party|
71
+ _xml_add_bdd_party(xml_bsr, party)
72
+ }
73
+ xml_bdd.add_element(xml_bsr)
74
+ end
75
+ def _xml_add_bdd_delivery(xml_bdd, delivery)
76
+ xml_delivery = REXML::Element.new('Delivery')
77
+ _xml_assemble_bdd_transaction(xml_delivery, delivery)
78
+ xml_bdd.add_element(xml_delivery)
79
+ end
80
+ def _xml_add_bdd_invoice(xml_bdd, invoice)
81
+ xml_invoice = REXML::Element.new('Invoice')
82
+ if(invoice_id = invoice.invoice_id)
83
+ domain, idstr = invoice_id
84
+ _xml_add_domain_id(xml_invoice, domain, idstr, 'InvoiceId')
85
+ end
86
+ if(delivery_id = invoice.delivery_id)
87
+ domain, idstr = delivery_id
88
+ _xml_add_domain_id(xml_invoice, domain, idstr, 'DeliveryId')
89
+ end
90
+ _xml_assemble_bdd_transaction(xml_invoice, invoice)
91
+ xml_bdd.add_element(xml_invoice)
92
+ end
93
+ def _xml_add_bdd_name(xml_elm, name)
94
+ xml_name = REXML::Element.new('Name')
95
+ if(name.text)
96
+ xml_name.text = name.to_s
97
+ else
98
+ if(first = name.first)
99
+ xml_first = REXML::Element.new('FirstName')
100
+ xml_first.text = first
101
+ xml_name.add_element(xml_first)
102
+ end
103
+ if(last = name.last)
104
+ xml_last = REXML::Element.new('LastName')
105
+ xml_last.text = last
106
+ xml_name.add_element(xml_last)
107
+ end
108
+ end
109
+ xml_elm.add_element(xml_name)
110
+ end
111
+ def _xml_add_bdd_party(xml_elm, party)
112
+ xml_party = REXML::Element.new('Party')
113
+ xml_party.add_attribute('Version', '2')
114
+ xml_party.add_attribute('Role', party.role)
115
+ party.ids.each { |domain, idstr|
116
+ _xml_add_domain_id(xml_party, domain, idstr, 'PartyId')
117
+ }
118
+ if(name = party.name)
119
+ _xml_add_bdd_name(xml_party, name)
120
+ end
121
+ if(addr = party.address)
122
+ _xml_add_bdd_address(xml_party, addr)
123
+ end
124
+ party.parties.each { |subdiv|
125
+ _xml_add_bdd_party(xml_party, subdiv)
126
+ }
127
+ xml_elm.add_element(xml_party)
128
+ end
129
+ def _xml_add_delivery_item(xml_delivery, item)
130
+ xml_item = _xml_add_item(xml_delivery, item, 'DeliveryItem')
131
+ if((date = item.delivery_date) && date.respond_to?(:strftime))
132
+ xml_date = REXML::Element.new('DeliveryDate')
133
+ xml_date.text = date.strftime('%Y%m%d')
134
+ xml_item.add_element(xml_date)
135
+ end
136
+ end
137
+ def _xml_add_domain_id(xml_elm, domain, idstr, idname)
138
+ xml_id = REXML::Element.new(idname)
139
+ xml_id.add_attribute('Domain', domain)
140
+ xml_id.text = idstr
141
+ xml_elm.add_element(xml_id)
142
+ end
143
+ def _xml_add_free_text(xml_elm, free_text)
144
+ xml_text = REXML::Element.new('FreeText')
145
+ if(type = free_text.type)
146
+ xml_text.add_attribute('Type', type)
147
+ end
148
+ xml_text.text = free_text.to_s
149
+ xml_elm.add_element(xml_text)
150
+ end
151
+ def _xml_add_invoice_item(xml_invoice, item)
152
+ _xml_add_item(xml_invoice, item, 'InvoiceItem')
153
+ end
154
+ def _xml_add_item(xml_elm, item, tag)
155
+ xml_item = REXML::Element.new(tag)
156
+ _xml_add_item_line_no(xml_item, item.line_no)
157
+ _xml_add_item_part_id(xml_item, item)
158
+ xml_qty = REXML::Element.new('Qty')
159
+ xml_qty.text = item.qty
160
+ xml_item.add_element(xml_qty)
161
+ item.prices.each { |price|
162
+ _xml_add_item_price(xml_item, price)
163
+ }
164
+ if(free_text = item.free_text)
165
+ _xml_add_free_text(xml_item, free_text)
166
+ end
167
+ xml_elm.add_element(xml_item)
168
+ xml_item
169
+ end
170
+ def _xml_add_item_line_no(xml_item, line_no)
171
+ if(line_no)
172
+ xml_line_no = REXML::Element.new('LineNo')
173
+ xml_line_no.text = line_no
174
+ xml_item.add_element(xml_line_no)
175
+ end
176
+ end
177
+ def _xml_add_item_part_id(xml_item, item)
178
+ ids = item.ids
179
+ part_infos = item.part_infos
180
+ unless(ids.empty? && part_infos.empty?)
181
+ xml_id = REXML::Element.new('PartId')
182
+ ids.each { |domain, idstr|
183
+ _xml_add_domain_id(xml_id, domain, idstr, 'IdentNo')
184
+ }
185
+ unless(part_infos.empty?)
186
+ xml_info = REXML::Element.new('PartInfo')
187
+ part_infos.each { |part_info|
188
+ xml_value = REXML::Element.new('Value')
189
+ xml_value.add_attribute('Dimension', part_info.dimension)
190
+ xml_value.text = part_info.value
191
+ xml_info.add_element(xml_value)
192
+ }
193
+ xml_id.add_element(xml_info)
194
+ end
195
+ xml_item.add_element(xml_id)
196
+ end
197
+ end
198
+ def _xml_add_item_price(xml_item, price)
199
+ xml_price = REXML::Element.new('Price')
200
+ xml_price.add_attribute('Purpose', price.purpose)
201
+ xml_price.text = sprintf('%1.2f', price.amount)
202
+ xml_item.add_element(xml_price)
203
+ end
204
+ def _xml_add_item_status(xml_item, trans)
205
+ status = REXML::Element.new('Status')
206
+ status.text = trans.status
207
+ if((date = trans.status_date) && date.respond_to?(:strftime))
208
+ fmt = "%Y%m%d"
209
+ if(date.is_a?(Time))
210
+ fmt << "%H%M%S"
211
+ end
212
+ status.add_attribute('Date', date.strftime(fmt))
213
+ end
214
+ xml_item.add_element(status)
215
+ end
216
+ def _xml_assemble_bdd_transaction(xml_trans, trans)
217
+ _xml_add_item_status(xml_trans, trans)
218
+ name = xml_trans.name
219
+ trans.ids.each { |domain, idstr|
220
+ _xml_add_domain_id(xml_trans, domain, idstr, name + 'Id')
221
+ }
222
+ trans.parties.each { |party|
223
+ _xml_add_bdd_party(xml_trans, party)
224
+ }
225
+ method = "_xml_add_#{name}_item".downcase
226
+ trans.items.each { |item|
227
+ self.send(method, xml_trans, item)
228
+ }
229
+ trans.prices.each { |price|
230
+ _xml_add_item_price(xml_trans, price)
231
+ }
232
+ if(free_text = trans.free_text)
233
+ _xml_add_free_text(xml_trans, free_text)
234
+ end
235
+ if(agreement = trans.agreement)
236
+ _xml_add_bdd_agreement(xml_trans, agreement)
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env ruby
2
+ # GehBdd -- xmlconv2 -- 17.05.2006 -- hwyss@ywesee.com
3
+
4
+ require 'rexml/document'
5
+ require 'model/address'
6
+ require 'model/agreement'
7
+ require 'model/bdd'
8
+ require 'model/bsr'
9
+ require 'model/delivery'
10
+ require 'model/delivery_item'
11
+ require 'model/name'
12
+ require 'model/party'
13
+ require 'model/price'
14
+
15
+ module XmlConv
16
+ module Conversion
17
+ class GehBdd
18
+ class << self
19
+ def convert(xml_document)
20
+ bdd = Model::Bdd.new
21
+ _bdd_add_xml_delivery(bdd, xml_document)
22
+ bdd
23
+ end
24
+ def parse(xml_src)
25
+ REXML::Document.new(xml_src)
26
+ end
27
+ def _bdd_add_xml_delivery(bdd, xml_document)
28
+ delivery = Model::Delivery.new
29
+ xml_header = REXML::XPath.first(xml_document,
30
+ 'OrderRequest/OrderRequestHeader')
31
+ _bdd_add_xml_header(bdd, xml_header)
32
+ _delivery_add_xml_header(delivery, xml_header)
33
+ if(xml_terms = REXML::XPath.first(xml_header,
34
+ '//TermsOfDeliveryFunctionCodedOther'))
35
+ agreement = Model::Agreement.new
36
+ agreement.terms_cond = _latin1(xml_terms.text).downcase
37
+ delivery.agreement = agreement
38
+ end
39
+ REXML::XPath.each(xml_document, 'OrderRequest//ItemDetail') { |xml_item|
40
+ _delivery_add_xml_item(delivery, xml_item)
41
+ }
42
+ delivery.bsr = bdd.bsr
43
+ bdd.add_delivery(delivery)
44
+ delivery
45
+ end
46
+ def _bdd_add_xml_header(bdd, xml_header)
47
+ bsr = Model::Bsr.new
48
+ xml_party = REXML::XPath.first(xml_header, '//BuyerParty/Party')
49
+ if(xml_id = REXML::XPath.first(xml_party, '//PartyID/Identifier/Ident'))
50
+ party = Model::Party.new
51
+ # ACC: ABB-Customer Domain
52
+ party.role = 'Customer'
53
+ party.add_id('ACC', _latin1(xml_id.text))
54
+ bsr.add_party(party)
55
+ end
56
+ bdd.bsr = bsr
57
+ end
58
+ def _container_add_xml_id(container, xml_id, domain)
59
+ domain = _latin1(xml_id.attribute('Domain').value)
60
+ value = _latin1(xml_id.text)
61
+ container.add_id(domain, value)
62
+ end
63
+ def _container_add_xml_party(container, xml_party, role)
64
+ party = Model::Party.new
65
+ party.role = role
66
+ if(xml_id = REXML::XPath.first(xml_party, 'PartyID//Ident'))
67
+ party.add_id('ACC', _latin1(xml_id.text))
68
+ end
69
+ if(xml_address = REXML::XPath.first(xml_party, 'NameAddress'))
70
+ _party_add_xml_address(party, xml_address)
71
+ if(xml_name = REXML::XPath.first(xml_address, 'Name1'))
72
+ _party_add_xml_name(party, xml_name)
73
+ end
74
+ end
75
+ if(xml_name = REXML::XPath.first(xml_party, 'OrderContact//ContactName'))
76
+ employee = Model::Party.new
77
+ employee.role = 'Employee'
78
+ _party_add_xml_name(employee, xml_name)
79
+ party.add_party(employee)
80
+ end
81
+ container.add_party(party)
82
+ party
83
+ end
84
+ def _delivery_add_xml_header(delivery, xml_header)
85
+ xml_id = REXML::XPath.first(xml_header,
86
+ 'OrderRequestNumber/BuyerOrderRequestNumber')
87
+ delivery.add_id('Customer', _latin1(xml_id.text))
88
+ xml_buyer = REXML::XPath.first(xml_header,
89
+ 'OrderRequestParty//BuyerParty/Party')
90
+ customer = _container_add_xml_party(delivery, xml_buyer, 'Customer')
91
+ _container_add_xml_party(customer, xml_buyer, 'BillTo')
92
+ if(xml_location = REXML::XPath.first(xml_header,
93
+ 'OrderTermsOfDelivery//TermsOfDelivery/Location'))
94
+ _container_add_xml_party(customer, xml_location, 'ShipTo')
95
+ end
96
+ xml_seller = REXML::XPath.first(xml_header,
97
+ 'OrderRequestParty//SellerParty/Party')
98
+ _container_add_xml_party(delivery, xml_seller, 'Seller')
99
+ end
100
+ def _delivery_add_xml_item(delivery, xml_item)
101
+ item = Model::DeliveryItem.new
102
+ xml_line_no = REXML::XPath.first(xml_item,
103
+ 'BaseItemDetail//LineItemNum/*ItemNum')
104
+ item.line_no = _latin1(xml_line_no.text)
105
+ =begin # I'm not sure which Id is which..
106
+ if(xml_id = REXML::XPath.first(xml_item, 'BaseItemDetail//AgencyCoded'))
107
+ item.add_id('ET-NUMMER', _latin1(xml_id.text))
108
+ end
109
+ =end
110
+ if(xml_id = REXML::XPath.first(xml_item,
111
+ 'BaseItemDetail//SellerPartNumberPartID'))
112
+ #item.add_id('Seller', _latin1(xml_id.text))
113
+ item.add_id('ET-NUMMER', _latin1(xml_id.text))
114
+ end
115
+ if(xml_id = REXML::XPath.first(xml_item,
116
+ 'BaseItemDetail//BuyerPartNumberPartID'))
117
+ item.add_id('LIEFERANTENARTIKEL', _latin1(xml_id.text))
118
+ end
119
+ xml_qty = REXML::XPath.first(xml_item, 'BaseItemDetail//QuantityValue')
120
+ item.qty = _latin1(xml_qty.text)
121
+ if(xml_unit = REXML::XPath.first(xml_item, 'BaseItemDetail//UOMCoded'))
122
+ item.unit = _latin1(xml_unit.text)
123
+ end
124
+ if(xml_date = REXML::XPath.first(xml_item,
125
+ 'DeliveryDetail//RequestedDeliveryDate'))
126
+ raw = _latin1(xml_date.text)
127
+ item.delivery_date = begin
128
+ Date.parse(raw)
129
+ rescue
130
+ Date.today
131
+ end
132
+ end
133
+ if(xml_price = REXML::XPath.first(xml_item, 'PricingDetail//UnitPriceValue'))
134
+ price = Model::Price.new
135
+ price.purpose = 'NettoPreis'
136
+ price.amount = _latin1(xml_price.text)
137
+ item.add_price(price)
138
+ end
139
+ delivery.add_item(item)
140
+ end
141
+ def _latin1(str)
142
+ Iconv.iconv('ISO-8859-1', 'UTF8', str).first.strip
143
+ rescue
144
+ str
145
+ end
146
+ def _party_add_xml_address(party, xml_address)
147
+ address = Model::Address.new
148
+ REXML::XPath.each(xml_address, 'Street') { |xml_addr_line|
149
+ address.add_line(_latin1(xml_addr_line.text))
150
+ }
151
+ xml_city = REXML::XPath.first(xml_address, 'City')
152
+ address.city = _latin1(xml_city.text)
153
+ xml_zip_code = REXML::XPath.first(xml_address, 'PostalCode')
154
+ address.zip_code = _latin1(xml_zip_code.text)
155
+ party.address = address
156
+ end
157
+ def _party_add_xml_name(party, xml_name)
158
+ name = Model::Name.new
159
+ name.last = _latin1(xml_name.text)
160
+ party.name = name
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end