xmlconv2 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 (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
data/README.txt ADDED
@@ -0,0 +1,25 @@
1
+ = xmlconv2
2
+
3
+ * http://scm.ywesee.com/?p=xmlconv2/.git;a=summary
4
+
5
+ == DESCRIPTION:
6
+
7
+ Converts XML files to flat files. Works nicely with i2.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Sometimes hangs.
12
+
13
+ == INSTALL:
14
+
15
+ * sudo gem install xmlconv2
16
+
17
+ == DEVELOPERS:
18
+
19
+ * Masaomi Hatakeyama
20
+ * Zeno R.R. Davatz
21
+ * Hannes Wyss (up to Version 1.0)
22
+
23
+ == LICENSE:
24
+
25
+ * GPLv2
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ # Hoe.plugin :compiler
7
+ # Hoe.plugin :cucumberfeatures
8
+ # Hoe.plugin :gem_prelude_sucks
9
+ # Hoe.plugin :inline
10
+ # Hoe.plugin :inline
11
+ # Hoe.plugin :manifest
12
+ # Hoe.plugin :newgem
13
+ # Hoe.plugin :racc
14
+ # Hoe.plugin :rubyforge
15
+ # Hoe.plugin :rubyforge
16
+ # Hoe.plugin :website
17
+
18
+ Hoe.spec 'xmlconv2' do
19
+ # HEY! If you fill these out in ~/.hoe_template/Rakefile.erb then
20
+ # you'll never have to touch them again!
21
+ # (delete this comment too, of course)
22
+
23
+ developer('Masaomi Hatakeyama, Zeno R.R. Davatz', 'mhatakeyama@ywesee.com, zdavatz@ywesee.com')
24
+
25
+ # self.rubyforge_name = 'xmlconv2x' # if different than 'xmlconv2'
26
+ end
27
+
28
+ # vim: syntax=ruby
data/bin/admin ADDED
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ # Admin -- xmlconv -- 09.07.2003 -- hwyss@ywesee.com
3
+
4
+ $: << File.expand_path('..', File.dirname(__FILE__))
5
+ $: << File.expand_path('../src', File.dirname(__FILE__))
6
+
7
+ require 'util/application'
8
+ require 'etc/config'
9
+ require 'readline'
10
+ include Readline
11
+
12
+ Kernel.trap('INT') {
13
+ if($current.respond_to?(:exit))
14
+ $current.exit
15
+ $current = nil
16
+ else
17
+ puts "<ctrl-c> is used to kill admin-threads."
18
+ puts "Type <quit> or <exit> to exit."
19
+ end
20
+ }
21
+
22
+ prompt = 'xmlconv> '
23
+ DRb.start_service
24
+ xmlconv = DRbObject.new(nil, XmlConv::SERVER_URI)
25
+ last_error = nil
26
+ priority = -1
27
+ while(line = readline(prompt, true))
28
+ result = ''
29
+ result.extend(DRb::DRbUndumped)
30
+ line.strip!
31
+ $stdout.print "-> "
32
+ case line.downcase
33
+ when 'exit', 'quit'
34
+ $stdout.puts 'Goodbye'
35
+ break
36
+ when 'bt', 'backtrace'
37
+ if last_error.respond_to?(:backtrace)
38
+ $stdout.puts last_error.backtrace
39
+ else
40
+ $stdout.puts 'No Error'
41
+ end
42
+ when /^last_error/
43
+ begin
44
+ $stdout.puts eval(line)
45
+ rescue Exception => last_error
46
+ $stdout.puts last_error
47
+ end
48
+ when /sp\s+(-?\d+)/, /set_priority\s+(-?\d+)/
49
+ priority = $~[1].to_i
50
+ $stdout.puts "setting Priority to #{priority}"
51
+ else
52
+ begin
53
+ bgflag = line.slice!(/\s*\&\s*$/)
54
+ $current = xmlconv._admin(line, result, priority)
55
+ unless(bgflag)
56
+ $current.join
57
+ end
58
+ $stdout.puts result
59
+ rescue Exception => last_error
60
+ $stdout.puts last_error
61
+ end
62
+ end
63
+ $current = nil
64
+ $stdout.flush
65
+ end
data/bin/xmlconvd ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ # XmlConv -- xmlconv2 -- 07.06.2004 -- hwyss@ywesee.com
3
+
4
+ $: << File.expand_path('../src', File.dirname(__FILE__))
5
+ $: << File.expand_path('..', File.dirname(__FILE__))
6
+
7
+ require 'drb/drb'
8
+ require 'util/application'
9
+ require 'etc/config'
10
+ require 'etc/access'
11
+
12
+ $0 = "XmlConv2"
13
+
14
+ xmlconv = XmlConvApp.new
15
+
16
+ DRb.start_service(XmlConv::SERVER_URI, xmlconv)
17
+ puts 'drb-service started'
18
+
19
+ DRb.thread.join
@@ -0,0 +1,73 @@
1
+ Grammar I2
2
+ Tokens
3
+ BLANK = /\s+/ [:Skip]
4
+ QUOTE = /"/
5
+ CHAR = /[^"]+/
6
+ Productions
7
+ Document -> Record+
8
+ [: records]
9
+ Record -> Header
10
+ [^: record]
11
+ | Commission
12
+ [^: record]
13
+ | Address
14
+ [^: record]
15
+ | HeaderText
16
+ [^: record]
17
+ | Position
18
+ [^: record]
19
+ | PositionText
20
+ [^: record]
21
+ | Footer
22
+ [^: record]
23
+ Header -> QUOTE "00" QUOTE
24
+ Field Field Field Field Field Field
25
+ [: _, rtype, _,
26
+ sender, recipient, date, time, mtype, test]
27
+ Commission -> QUOTE "01" QUOTE
28
+ Field Field Field Field Field
29
+ Field Field
30
+ [: _, rtype, _,
31
+ btype, receipt, rdate, reference, commission,
32
+ contact, employee]
33
+ Address -> QUOTE "02" QUOTE
34
+ Field Field Field Field Field Field Field
35
+ [: _, rtype, _,
36
+ atype, name1, name2, street, city, code, country]
37
+ HeaderText -> QUOTE "05" QUOTE Field
38
+ [: _, rtype, _, text]
39
+ Position -> QUOTE "10" QUOTE
40
+ Field Field Field
41
+ Field Field Field
42
+ Field Field Field
43
+ Field Field
44
+ Field Field
45
+ [: _, rtype, _,
46
+ lineno, eancode, buyercode,
47
+ qty, ddate, pricenettopce,
48
+ pricenetto, discountpce, discount,
49
+ extradiscountpce, extradiscount,
50
+ pricebruttopce, pricebrutto]
51
+ | QUOTE "10" QUOTE
52
+ Field Field Field
53
+ Field Field Field
54
+ Field Field Field
55
+ Field Field Field
56
+ Field Field
57
+ [: _, rtype, _,
58
+ lineno, eancode, buyercode,
59
+ qty, pricenettopce, pricenetto,
60
+ discountpce, discount, extradiscountpce,
61
+ extradiscount, pricebruttopce, pricebrutto,
62
+ origin, customs]
63
+ PositionText-> QUOTE "15" QUOTE Field
64
+ [: _, rtype, _, text]
65
+ Footer -> QUOTE "90" QUOTE
66
+ Field Field Field
67
+ Field Field
68
+ [: _, rtype, _,
69
+ pricenetto, vatpercent, vatamount,
70
+ pricebrutto, agreement]
71
+ Field -> QUOTE CHAR QUOTE
72
+ [^: _, field, _]
73
+ | QUOTE QUOTE
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env ruby
2
+ # Conversion::BddGeh -- xmlconv2 -- 18.05.2006 -- hwyss@ywesee.com
3
+
4
+ require 'rexml/document'
5
+
6
+ module XmlConv
7
+ module Conversion
8
+ class BddGeh
9
+ class << self
10
+ SELLER_ID = 663 # DTSTTCPW-approach. Could also be passed in, e.g. from the
11
+ # PollingMission
12
+ def convert(bdd)
13
+ docs = []
14
+ bdd.deliveries.each { |delivery|
15
+ skeleton = <<-EOS
16
+ <?xml version="1.0" encoding="UTF-8"?>
17
+ <OrderResponse />
18
+ EOS
19
+ doc = REXML::Document.new(skeleton)
20
+ _xml_add_bdd_delivery(doc.root, delivery)
21
+ docs.push(doc)
22
+ }
23
+ bdd.invoices.each { |invoice|
24
+ skeleton = <<-EOS
25
+ <?xml version="1.0" encoding="UTF-8"?>
26
+ <Invoice />
27
+ EOS
28
+ doc = REXML::Document.new(skeleton)
29
+ _xml_add_bdd_invoice(doc.root, invoice)
30
+ docs.push(doc)
31
+ }
32
+ docs
33
+ end
34
+ def _utf8(str)
35
+ Iconv.iconv('UTF8', 'ISO-8859-1', str).first.strip
36
+ rescue
37
+ str
38
+ end
39
+ def _xml_add_base_item_detail(xml_item, item, type=:order_response)
40
+ tag = case type
41
+ when :invoice
42
+ 'InvoiceBaseItemDetail'
43
+ else
44
+ 'BaseItemDetail'
45
+ end
46
+ xml_base = REXML::Element.new(tag)
47
+ _xml_add_item_line_no(xml_base, item.line_no)
48
+ _xml_add_item_part_id(xml_base, item)
49
+ _xml_add_item_quantity(xml_base, item)
50
+ xml_item.add_element(xml_base)
51
+ end
52
+ def _xml_add_bdd_delivery(xml_root, delivery)
53
+ _xml_add_delivery_header(xml_root, delivery)
54
+ _xml_add_bdd_detail(xml_root, delivery)
55
+ end
56
+ def _xml_add_bdd_detail(xml_root, delivery)
57
+ xml_detail = _xml_element("OrderResponseDetail")
58
+ xml_list = _xml_element('ListOfOrderResponseItemDetail')
59
+ delivery.items.each { |item|
60
+ _xml_add_item(xml_list, item)
61
+ }
62
+ xml_detail.add_element(xml_list)
63
+ xml_root.add_element(xml_detail)
64
+ end
65
+ def _xml_add_bdd_invoice(xml_root, invoice)
66
+ _xml_add_invoice_header(xml_root, invoice)
67
+ _xml_add_invoice_detail(xml_root, invoice)
68
+ _xml_add_invoice_summary(xml_root, invoice)
69
+ end
70
+ def _xml_add_bdd_party(xml_container, party, employee=nil)
71
+ role = party.role
72
+ case role
73
+ when 'Customer'
74
+ party.parties.each { |part|
75
+ _xml_add_bdd_party(xml_container, part, party.employee)
76
+ }
77
+ when 'BillTo'
78
+ _xml_add_party(xml_container, party, employee, 'BuyerParty')
79
+ when 'Employee'
80
+ else
81
+ _xml_add_party(xml_container, party, employee, sprintf("%sParty", role))
82
+ end
83
+ end
84
+ def _xml_add_party(xml_container, party, employee, tagname)
85
+ xml_name_party = _xml_element(tagname)
86
+ xml_party = _xml_element('Party')
87
+ if(pid = party.party_id)
88
+ xml_party.add_element(_xml_nested_text(pid, 'PartyID', 'Identifier',
89
+ 'Ident'))
90
+ end
91
+ if(addr = party.address)
92
+ _xml_add_name_address(xml_party, addr)
93
+ end
94
+ if(employee)
95
+ xml_party.add_element(_xml_nested_text(employee.name.to_s,
96
+ 'OrderContact', 'Contact', 'ContactName'))
97
+ end
98
+ xml_name_party.add_element(xml_party)
99
+ xml_container.add_element(xml_name_party)
100
+ end
101
+ def _xml_add_delivery_detail(xml_item, item)
102
+ if(date = item.delivery_date)
103
+ xml_item.add_element(_xml_nested_text(date.strftime('%Y%m%d'),
104
+ 'DeliveryDetail', 'ListOfScheduleLine',
105
+ 'ScheduleLine', 'RequestedDeliveryDate'))
106
+ end
107
+ end
108
+ def _xml_add_delivery_header(xml_root, delivery)
109
+ xml_header = _xml_element("OrderResponseHeader")
110
+ xml_header.add_element(_xml_nested_text(delivery.reference_id,
111
+ "OrderResponseNumber", "BuyerOrderResponseNumber"))
112
+ xml_header.add_element(_xml_nested_text(delivery.customer_id,
113
+ 'OrderReference', 'Reference', 'RefNum'))
114
+ if(date = delivery.status_date)
115
+ str = date.strftime('%Y%m%d%H%M%S')
116
+ xml_header.add_element(_xml_nested_text(str, 'OrderResponseIssueDate'))
117
+ end
118
+ if((seller = delivery.seller) && !seller.party_id)
119
+ seller.add_id('ACC', SELLER_ID)
120
+ end
121
+ delivery.parties.each { |party|
122
+ _xml_add_bdd_party(xml_header, party)
123
+ }
124
+ xml_root.add_element(xml_header)
125
+ end
126
+ def _xml_add_invoice_detail(xml_root, invoice)
127
+ xml_detail = _xml_element('InvoiceDetail')
128
+ xml_list = _xml_element('ListOfInvoiceItemDetail')
129
+ invoice.items.each { |item|
130
+ _xml_add_invoice_item(xml_list, item)
131
+ }
132
+ xml_detail.add_element(xml_list)
133
+ xml_root.add_element(xml_detail)
134
+ end
135
+ def _xml_add_invoice_header(xml_root, invoice)
136
+ xml_header = _xml_element('InvoiceHeader')
137
+ xml_header.add_element(_xml_nested_text(invoice.invoice_id.last,
138
+ 'InvoiceNumber', 'Reference', 'RefNum'))
139
+ if(date = invoice.status_date)
140
+ xml_header.add_element(_xml_nested_text(date.strftime('%Y%m%d%H%M%S'),
141
+ 'InvoiceIssueDate'))
142
+ end
143
+ _xml_add_invoice_references(xml_header, invoice)
144
+ if(party = invoice.seller)
145
+ unless(party.party_id)
146
+ party.add_id('ACC', SELLER_ID)
147
+ end
148
+ _xml_add_bdd_party(xml_header, party)
149
+ end
150
+ xml_root.add_element(xml_header)
151
+ end
152
+ def _xml_add_invoice_item(xml_elm, item)
153
+ xml_item = _xml_element('InvoiceItemDetail')
154
+ _xml_add_base_item_detail(xml_item, item, :invoice)
155
+ _xml_add_pricing_detail(xml_item, item, :invoice)
156
+ xml_elm.add_element(xml_item)
157
+ xml_item
158
+ end
159
+ def _xml_add_invoice_references(xml_header, invoice)
160
+ xml_refs = _xml_element('InvoiceReferences')
161
+ xml_refs.add_element(_xml_nested_text(invoice.customer_id,
162
+ 'PurchaseOrderReference', 'PurchaseOrderNumber',
163
+ 'Reference', 'RefNum'))
164
+ xml_header.add_element(xml_refs)
165
+ end
166
+ def _xml_add_invoice_summary(xml_root, invoice)
167
+ xml_summary = _xml_nested_text(invoice.items.size, 'InvoiceSummary',
168
+ 'NumberOfLines')
169
+ xml_totals = _xml_element('InvoiceTotals')
170
+ if(price = invoice.get_price('SummePositionen'))
171
+ xml_net = _xml_nested_text(sprintf('%1.2f', price.amount),
172
+ 'NetValue', 'MonetaryValue', 'MonetaryAmount')
173
+ xml_totals.add_element(xml_net)
174
+ end
175
+ if(price = invoice.get_price('Mehrwertsteuer'))
176
+ xml_tax = _xml_nested_text(sprintf('%1.2f', price.amount),
177
+ 'TotalTax', 'MonetaryValue', 'MonetaryAmount')
178
+ xml_totals.add_element(xml_tax)
179
+ end
180
+ if(price = invoice.get_price('Endbetrag'))
181
+ xml_total = _xml_nested_text(sprintf('%1.2f', price.amount),
182
+ 'TotalAmountPlusTax', 'MonetaryValue',
183
+ 'MonetaryAmount')
184
+ xml_totals.add_element(xml_total)
185
+ end
186
+ xml_summary.add_element(xml_totals)
187
+ xml_root.add_element(xml_summary)
188
+ end
189
+ def _xml_add_item(xml_elm, item)
190
+ xml_item = _xml_element('OrderResponseItemDetail')
191
+ _xml_add_base_item_detail(xml_item, item)
192
+ _xml_add_pricing_detail(xml_item, item)
193
+ _xml_add_delivery_detail(xml_item, item)
194
+ xml_elm.add_element(xml_item)
195
+ xml_item
196
+ end
197
+ def _xml_add_item_line_no(xml_item, line_no)
198
+ xml_item.add_element(_xml_nested_text(line_no, 'LineItemNum',
199
+ 'BuyerLineItemNum'))
200
+ end
201
+ def _xml_add_item_part_id(xml_item, item)
202
+ xml_ids = _xml_element('ItemIdentifiers')
203
+ xml_pns = _xml_element('PartNumbers')
204
+ item.ids.each { |domain, idstr|
205
+ tagname = case domain
206
+ when 'ET-Nummer'
207
+ 'BuyerPartNumber'
208
+ else
209
+ 'SellerPartNumber'
210
+ end
211
+ xml_pns.add_element(_xml_nested_text(idstr, tagname, 'PartNum', 'PartID'))
212
+ }
213
+ xml_ids.add_element(xml_pns)
214
+ xml_item.add_element(xml_ids)
215
+ end
216
+ def _xml_add_item_quantity(xml_item, item)
217
+ xml_total = _xml_element('TotalQuantity')
218
+ xml_qty = _xml_nested_text(item.qty, 'Quantity', 'QuantityValue')
219
+ xml_qty.add_element(_xml_nested_text('EA', 'UnitOfMeasurement', 'UOMCoded'))
220
+ xml_total.add_element(xml_qty)
221
+ xml_item.add_element(xml_total)
222
+ end
223
+ def _xml_add_name_address(xml_party, addr)
224
+ xml_name_address = _xml_element('NameAddress')
225
+ lines = addr.lines.dup
226
+ street = lines.pop
227
+ name = lines.shift
228
+ xml_name_address.add_element(_xml_nested_text(name.to_s, 'Name1'))
229
+ unless(lines.empty?)
230
+ xml_name_address.add_element(_xml_nested_text(lines.join(" "), 'Name2'))
231
+ end
232
+ xml_name_address.add_element(_xml_nested_text(street, 'Street'))
233
+ xml_name_address.add_element(_xml_nested_text(addr.zip_code, 'PostalCode'))
234
+ xml_name_address.add_element(_xml_nested_text(addr.city, 'City'))
235
+ xml_party.add_element(xml_name_address)
236
+ end
237
+ def _xml_add_pricing_detail(xml_item, item, type=:order_response)
238
+ tag = 'PricingDetail'
239
+ total = 'TotalValue'
240
+ case type
241
+ when :invoice
242
+ tag = 'InvoicePricingDetail'
243
+ total = 'InvoiceCurrencyTotalValue'
244
+ end
245
+ xml_base = _xml_element(tag)
246
+ if(price = item.get_price('NettoPreis'))
247
+ xml_list = _xml_element('ListOfPrice')
248
+ xml_price = _xml_element('Price')
249
+ xml_unit = _xml_nested_text('CHF', 'UnitPrice', 'Currency',
250
+ 'CurrencyCoded')
251
+ xml_value = _xml_nested_text(sprintf('%1.2f', price.amount),
252
+ 'UnitPriceValue')
253
+ xml_unit.add_element(xml_value)
254
+ xml_price.add_element(xml_unit)
255
+ xml_list.add_element(xml_price)
256
+ xml_base.add_element(xml_list)
257
+ end
258
+ if(price = item.get_price('NettoPreisME'))
259
+ xml_price = _xml_nested_text(sprintf('%1.2f', price.amount),
260
+ total, 'MonetaryValue', 'MonetaryAmount')
261
+ xml_base.add_element(xml_price)
262
+ end
263
+ xml_item.add_element(xml_base)
264
+ end
265
+ def _xml_element(name)
266
+ REXML::Element.new(name)
267
+ end
268
+ def _xml_nested_text(text, *hierarchy)
269
+ parent = _xml_element(hierarchy.pop)
270
+ parent.text = _utf8(text)
271
+ hierarchy.reverse.each { |name|
272
+ child = parent
273
+ parent = _xml_element(name)
274
+ parent.add_element(child)
275
+ }
276
+ parent
277
+ end
278
+ end
279
+ end
280
+ end
281
+ end