oddb2xml 1.8.0 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MGEzYWEzNGQ4NjlmODA3MzA5MGVlODkyOTY3YTYzM2RmZjllNmM0Mg==
5
+ data.tar.gz: !binary |-
6
+ ZDJiNjI4NzM4NmRmMjY1NzBhMzc4NWMwYmZlMjhmODQ4NGE3NDdmMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZjQ1ZDk0MmQyNmFkMzg3MDg0N2NlNWY1ZmUwNGUwNGI3MjYxZmI4ODFjM2Fh
10
+ YzIzY2NmMGFjYmMzNWM2ZGMyMTZjNjYzY2FmZWIyNGIzNDIzMGJhZDQwNTRk
11
+ NjhlODBiNmY0NDZmMjZlOGJiM2UzNzg2Y2NlYzE5Yjc1NGI2MmQ=
12
+ data.tar.gz: !binary |-
13
+ OWFmMTU4YzVhYzIwYjFkNTdhOTg1OTY1ODdiYWEwMGIyODljOTY4ZmM2NGZm
14
+ NDA0YTVhYzY0YTA4NjlkOTM5NTIwMTc3M2UzYjExZWMzMDI5NWI2NGIxYTgx
15
+ OTA0YWY5NTRkYThhZTgyNjVlMWRjNmIyZWQ2ZTAxMTc2ZTBiZDg=
@@ -1,13 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oddb2xml (1.8.0)
4
+ oddb2xml (1.8.1)
5
5
  archive-tar-minitar
6
6
  mechanize (~> 2.5.1)
7
7
  nokogiri (~> 1.5.10)
8
8
  rubyXL (~> 2.5)
9
9
  rubyzip (~> 1.0)
10
10
  savon (~> 2.0)
11
+ sax-machine
11
12
  spreadsheet
12
13
 
13
14
  GEM
@@ -87,6 +88,8 @@ GEM
87
88
  nokogiri (>= 1.4.0)
88
89
  nori (~> 2.3.0)
89
90
  wasabi (~> 3.2.2)
91
+ sax-machine (0.1.0)
92
+ nokogiri (> 0.0.0)
90
93
  slop (3.5.0)
91
94
  spreadsheet (0.9.7)
92
95
  ruby-ole (>= 1.0)
@@ -1,3 +1,25 @@
1
+ === 1.8.1 / 30.04.2014
2
+
3
+ * Fix building NONPHARMA
4
+ * Using SAX-Parser and sax-machine
5
+ * Adapt to new location of epha interaction.csv
6
+
7
+ === 1.8.0 / 28.04.2014
8
+
9
+ * Improved rake clean targer
10
+ * More logging and exit 2 unless substances and limitations okay for extended
11
+ * Fix problem with empty substances and limitation when running -e
12
+
13
+ === 1.7.9 / 22.04.2014
14
+
15
+ * Added log option
16
+ * Added clean target to rake
17
+ * Added test target to rake
18
+ * Add spec task to rake
19
+ * Fix rspec
20
+ * Avoid ArgumentError for sprintf
21
+ * Orphan is now an xlsx file, too
22
+
1
23
  === 1.7.8 / 02.04.2014
2
24
 
3
25
  * Don't emit field BC starting with 000000
data/Rakefile CHANGED
@@ -26,6 +26,9 @@ require 'rake/clean'
26
26
  CLEAN.include FileList['*.xls*']
27
27
  CLEAN.include FileList['*.xml*']
28
28
  CLEAN.include FileList['*.dat*']
29
+ CLEAN.include FileList['*.tar.gz']
30
+ CLEAN.include FileList['*.txt.*']
31
+ CLEAN.include FileList['*.csv.*']
29
32
  CLEAN.include FileList['ruby*.tmp']
30
33
  CLEAN.include FileList['data/download']
31
34
  CLEAN.include FileList['duplicate_ean13_from_zur_rose.txt']
@@ -357,10 +357,12 @@ module Oddb2xml
357
357
  #xml.GRP2F
358
358
  xml.EFFD ix[:effect]
359
359
  #xml.EFFF
360
- if dict = @codes[ix[:grad].upcase]
361
- xml.RLV dict[:int]
362
- xml.RLVD dict[:txt]
363
- #xml.RLVF
360
+ if @codes and ix[:grad]
361
+ if dict = @codes[ix[:grad].upcase]
362
+ xml.RLV dict[:int]
363
+ xml.RLVD dict[:txt]
364
+ #xml.RLVF
365
+ end
364
366
  end
365
367
  #xml.EFFTXTD
366
368
  #xml.EFFTXTF
@@ -99,7 +99,7 @@ module Oddb2xml
99
99
  class EphaDownloader < Downloader
100
100
  include DownloadMethod
101
101
  def download
102
- @url ||= 'http://community.epha.ch/interactions_de_utf8.csv'
102
+ @url ||= 'https://download.epha.ch/cleaned/matrix.csv'
103
103
  download_as('epha_interactions.csv', 'r')
104
104
  end
105
105
  end
@@ -165,7 +165,14 @@ module Oddb2xml
165
165
  response = nil # win
166
166
  end
167
167
  end
168
- read_xml_form_zip(/^Preparation/iu, file)
168
+ inhalt = read_xml_form_zip(/^Preparation/iu, file)
169
+ if @options[:skip_download]
170
+ FileUtils.makedirs(Backup)
171
+ outfile = File.join(Backup, 'Preparations.xml')
172
+ Oddb2xml.log "Downloader saving outfile #{outfile} for #{self.class}"
173
+ File.open(outfile, 'w+') { |file| file.write inhalt}
174
+ end
175
+ inhalt
169
176
  rescue Timeout::Error, Errno::ETIMEDOUT
170
177
  retrievable? ? retry : raise
171
178
  ensure
@@ -4,8 +4,11 @@ require 'nokogiri'
4
4
  require 'spreadsheet'
5
5
  require 'stringio'
6
6
  require 'rubyXL'
7
+ require 'csv'
8
+ require 'oddb2xml/xml_definitions'
7
9
 
8
10
  module Oddb2xml
11
+ Strip_For_Sax_Machine = '<?xml version="1.0" encoding="utf-8"?>'+"\n"
9
12
  module TxtExtractorMethods
10
13
  def initialize(str)
11
14
  @io = StringIO.new(str)
@@ -39,77 +42,91 @@ module Oddb2xml
39
42
  class LppvExtractor < Extractor
40
43
  include TxtExtractorMethods
41
44
  end
45
+
42
46
  class BagXmlExtractor < Extractor
43
47
  def to_hash
44
48
  data = {}
45
- doc = Nokogiri::XML(@xml)
46
- doc.xpath('//Preparation').each do |seq|
49
+ result = PreparationsEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
50
+ result.Preparations.Preparation.each do |seq|
47
51
  item = {}
48
- item[:product_key] = seq.attr('ProductCommercial').to_s
49
- item[:desc_de] = (desc = seq.at_xpath('.//DescriptionDe')) ? desc.text : ''
50
- item[:desc_fr] = (desc = seq.at_xpath('.//DescriptionFr')) ? desc.text : ''
51
- item[:name_de] = (name = seq.at_xpath('.//NameDe')) ? name.text : ''
52
- item[:name_fr] = (name = seq.at_xpath('.//NameFr')) ? name.text : ''
53
- item[:swissmedic_number5] = (num5 = seq.at_xpath('.//SwissmedicNo5')) ? (num5.text.rjust(5,'0')) : ''
54
- item[:org_gen_code] = (orgc = seq.at_xpath('.//OrgGenCode')) ? orgc.text : ''
55
- item[:deductible] = (ddbl = seq.at_xpath('.//FlagSB20')) ? ddbl.text : ''
56
- item[:atc_code] = (atcc = seq.at_xpath('.//AtcCode')) ? atcc.text : ''
57
- item[:comment_de] = (info = seq.at_xpath('.//CommentDe')) ? info.text : ''
58
- item[:comment_fr] = (info = seq.at_xpath('.//CommentFr')) ? info.text : ''
52
+ item[:product_key] = seq.ProductCommercial
53
+ item[:desc_de] = (desc = seq.DescriptionDe) ? desc : ''
54
+ item[:desc_fr] = (desc = seq.DescriptionFr) ? desc : ''
55
+ item[:name_de] = (name = seq.NameDe) ? name : ''
56
+ item[:name_fr] = (name = seq.NameFr) ? name : ''
57
+ item[:swissmedic_number5] = (num5 = seq.SwissmedicNo5) ? (num5.rjust(5,'0')) : ''
58
+ item[:org_gen_code] = (orgc = seq.OrgGenCode) ? orgc : ''
59
+ item[:deductible] = (ddbl = seq.FlagSB20) ? ddbl : ''
60
+ item[:atc_code] = (atcc = seq.AtcCode) ? atcc : ''
61
+ item[:comment_de] = (info = seq.CommentDe) ? info : ''
62
+ item[:comment_fr] = (info = seq.CommentFr) ? info : ''
59
63
  item[:it_code] = ''
60
- seq.xpath('.//ItCode').each do |itc|
64
+ seq.ItCodes.ItCode.each do |itc|
61
65
  if item[:it_code].to_s.empty?
62
- it_code = itc.attr('Code').to_s
66
+ it_code = itc.Code.to_s
63
67
  item[:it_code] = (it_code =~ /(\d+)\.(\d+)\.(\d+)./) ? it_code : ''
64
68
  end
65
69
  end
66
70
  item[:substances] = []
67
- seq.xpath('.//Substance').each_with_index do |sub, i|
71
+ seq.Substances.Substance.each_with_index do |sub, i|
68
72
  item[:substances] << {
69
73
  :index => i.to_s,
70
- :name => (name = sub.at_xpath('.//DescriptionLa')) ? name.text : '',
71
- :quantity => (qtty = sub.at_xpath('.//Quantity')) ? qtty.text : '',
72
- :unit => (unit = sub.at_xpath('.//QuantityUnit')) ? unit.text : '',
74
+ :name => (name = sub.DescriptionLa) ? name : '',
75
+ :quantity => (qtty = sub.Quantity) ? qtty : '',
76
+ :unit => (unit = sub.QuantityUnit) ? unit : '',
73
77
  }
74
78
  end
75
79
  item[:pharmacodes] = []
76
80
  item[:packages] = {} # pharmacode => package
77
- seq.xpath('.//Pack').each do |pac|
78
- phar = pac.attr('Pharmacode')
81
+ seq.Packs.Pack.each do |pac|
82
+ phar = pac.Pharmacode
79
83
  phar = correct_code(phar.to_s, 7)
80
- ean = pac.at_xpath('.//GTIN')
81
- search_key = phar.to_i != 0 ? phar : ean.text
84
+ ean = pac.GTIN
85
+ search_key = phar.to_i != 0 ? phar : ean
82
86
  # as common key with swissINDEX
83
87
  item[:pharmacodes] << phar
84
88
  # packages
89
+ exf = {:price => '', :valid_date => '', :price_code => ''}
90
+ if pac.Prices and pac.Prices.ExFactoryPrice
91
+ exf[:price] = pac.Prices.ExFactoryPrice.Price if pac.Prices.ExFactoryPrice.Price
92
+ exf[:valid_date] = pac.Prices.ExFactoryPrice.ValidFromDate if pac.Prices.ExFactoryPrice.ValidFromDate
93
+ exf[:price_code] = pac.Prices.ExFactoryPrice.PriceTypeCode if pac.Prices.ExFactoryPrice.PriceTypeCode
94
+ end
95
+ pub = {:price => '', :valid_date => '', :price_code => ''}
96
+ if pac.Prices and pac.Prices.PublicPrice
97
+ pub[:price] = pac.Prices.PublicPrice.Price if pac.Prices.PublicPrice.Price
98
+ pub[:valid_date] = pac.Prices.PublicPrice.ValidFromDate if pac.Prices.PublicPrice.ValidFromDate
99
+ pub[:price_code] = pac.Prices.PublicPrice.PriceTypeCode if pac.Prices.PublicPrice.PriceTypeCode
100
+ end
85
101
  item[:packages][search_key] = {
86
102
  :pharmacode => phar,
87
- :ean => (ean) ? ean.text : '',
88
- :swissmedic_category => (cat = pac.at_xpath('.//SwissmedicCategory')) ? cat.text : '',
89
- :swissmedic_number8 => (num = pac.at_xpath('.//SwissmedicNo8')) ? num.text.rjust(8, '0') : '',
90
- :narcosis_flag => (flg = pac.at_xpath('.//FlagNarcosis')) ? flg.text : '',
91
- :prices => {
92
- :exf_price => {
93
- :price => (exf = pac.at_xpath('.//ExFactoryPrice/Price')) ? exf.text : '',
94
- :valid_date => (exf = pac.at_xpath('.//ExFactoryPrice/ValidFromDate')) ? exf.text : '',
95
- :price_code => (exf = pac.at_xpath('.//ExFactoryPrice/PriceTypeCode')) ? exf.text : '',
96
- },
97
- :pub_price => {
98
- :price => (pub = pac.at_xpath('.//PublicPrice/Price')) ? pub.text : '',
99
- :valid_date => (pub = pac.at_xpath('.//PublicPrice/ValidFromDate')) ? pub.text : '',
100
- :price_code => (pub = pac.at_xpath('.//PublicPrice/PriceTypeCode')) ? pub.text : '',
101
- }
102
- }
103
+ :ean => (ean) ? ean : '',
104
+ :swissmedic_category => (cat = pac.SwissmedicCategory) ? cat : '',
105
+ :swissmedic_number8 => (num = pac.SwissmedicNo8) ? num.rjust(8, '0') : '',
106
+ :narcosis_flag => (flg = pac.FlagNarcosis) ? flg : '',
107
+ :prices => { :exf_price => exf, :pub_price => pub },
103
108
  }
104
109
  # related all limitations
105
110
  item[:packages][search_key][:limitations] = []
106
111
  limitations = Hash.new{|h,k| h[k] = [] }
107
- # in seq
108
- limitations[:seq] = (lims = seq.xpath('.//Limitations/Limitation')) ? lims.to_a : nil
112
+ if seq.Limitations
113
+ limitations[:seq] = seq.Limitations.Limitation.collect { |x| x }
114
+ else
115
+ limitations[:seq] = nil
116
+ end
109
117
  # in it-codes
110
- limitations[:itc] = (lims = seq.xpath('.//ItCodes/ItCode/Limitations/Limitation')) ? lims.to_a : nil
118
+ if seq and seq.ItCodes and seq.ItCodes.ItCode
119
+ limitations[:itc] = []
120
+ seq.ItCodes.ItCode.each { |x| limitations[:itc] += x.Limitations.Limitation if x.Limitations.Limitation}
121
+ else
122
+ limitations[:itc] =nil
123
+ end
111
124
  # in pac
112
- limitations[:pac] = (lims = pac.xpath('.//Limitations/Limitation')) ? lims.to_a : nil
125
+ if pac and pac.Limitations
126
+ limitations[:pac] = (lims = pac.Limitations.Limitation) ? lims.to_a : nil
127
+ else
128
+ limitations[:pac] = nil
129
+ end
113
130
  limitations.each_pair do |lim_key, lims|
114
131
  key = ''
115
132
  id = ''
@@ -130,16 +147,16 @@ module Oddb2xml
130
147
  :it => item[:it_code],
131
148
  :key => key,
132
149
  :id => id,
133
- :code => (lic = lim.at_xpath('.//LimitationCode')) ? lic.text : '',
134
- :type => (lit = lim.at_xpath('.//LimitationType')) ? lit.text : '',
135
- :value => (liv = lim.at_xpath('.//LimitationValue')) ? liv.text : '',
136
- :niv => (niv = lim.at_xpath('.//LimitationNiveau')) ? niv.text : '',
137
- :desc_de => (dsc = lim.at_xpath('.//DescriptionDe')) ? dsc.text : '',
138
- :desc_fr => (dsc = lim.at_xpath('.//DescriptionFr')) ? dsc.text : '',
139
- :vdate => (dat = lim.at_xpath('.//ValidFromDate')) ? dat.text : '',
150
+ :code => (lic = lim.LimitationCode) ? lic : '',
151
+ :type => (lit = lim.LimitationType) ? lit : '',
152
+ :value => (liv = lim.LimitationValue) ? liv : '',
153
+ :niv => (niv = lim.LimitationNiveau) ? niv : '',
154
+ :desc_de => (dsc = lim.DescriptionDe) ? dsc : '',
155
+ :desc_fr => (dsc = lim.DescriptionFr) ? dsc : '',
156
+ :vdate => (dat = lim.ValidFromDate) ? dat : '',
140
157
  }
141
158
  deleted = false
142
- if upto = ((thr = lim.at_xpath('.//ValidThruDate')) ? thr.text : nil) and
159
+ if upto = ((thr = lim.ValidThruDate) ? thr : nil) and
143
160
  upto =~ /\d{2}\.\d{2}\.\d{2}/
144
161
  begin
145
162
  deleted = true if Date.strptime(upto, '%d.%m.%y') >= Date.today
@@ -148,18 +165,18 @@ module Oddb2xml
148
165
  end
149
166
  limitation[:del] = deleted
150
167
  item[:packages][search_key][:limitations] << limitation
151
- end
168
+ end if lims
152
169
  end
153
170
  # limitation points
154
- pts = pac.at_xpath('.//PointLimitations/PointLimitation/Points') # only first points
155
- item[:packages][search_key][:limitation_points] = pts ? pts.text : ''
156
- # pharmacode => seq (same data)
171
+ pts = pac.PointLimitations.PointLimitation.first # only first points
172
+ item[:packages][search_key][:limitation_points] = pts ? pts.Points : ''
157
173
  data[search_key] = item
158
174
  end
159
175
  end
160
176
  data
161
177
  end
162
178
  end
179
+
163
180
  class SwissIndexExtractor < Extractor
164
181
  def initialize(xml, type)
165
182
  @type = (type == :pharma ? 'PHARMA' : 'NONPHARMA')
@@ -167,23 +184,24 @@ module Oddb2xml
167
184
  end
168
185
  def to_hash
169
186
  data = {}
170
- doc = Nokogiri::XML(@xml)
171
- doc.remove_namespaces!
172
- doc.xpath("//Envelope/Body/#{@type}/ITEM").each do |pac|
187
+ result = PharmaEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
188
+ items = result.PHARMA.ITEM
189
+ $stderr.puts "SwissIndexExtractor #{__LINE__}: #{@type} with #{items.size} items"; $stderr.flush
190
+ items.each do |pac|
173
191
  item = {}
174
192
  item[:_type] = @type.downcase.intern
175
- item[:ean] = (gtin = pac.at_xpath('.//GTIN')) ? gtin.text : ''
176
- item[:pharmacode] = (phar = pac.at_xpath('.//PHAR')) ? phar.text : ''
177
- item[:status] = (stat = pac.at_xpath('.//STATUS')) ? stat.text : ''
178
- item[:stat_date] = (date = pac.at_xpath('.//SDATE')) ? date.text : ''
179
- item[:lang] = (lang = pac.at_xpath('.//LANG')) ? lang.text : ''
180
- item[:desc] = (dscr = pac.at_xpath('.//DSCR')) ? dscr.text : ''
181
- item[:atc_code] = (code = pac.at_xpath('.//ATC')) ? code.text.to_s : ''
193
+ item[:ean] = (gtin = pac.GTIN) ? gtin: ''
194
+ item[:pharmacode] = (phar = pac.PHAR) ? phar: ''
195
+ item[:status] = (stat = pac.STATUS) ? stat: ''
196
+ item[:stat_date] = (date = pac.SDATE) ? date: ''
197
+ item[:lang] = (lang = pac.LANG) ? lang: ''
198
+ item[:desc] = (dscr = pac.DSCR) ? dscr: ''
199
+ item[:atc_code] = (code = pac.ATC) ? code.to_s : ''
182
200
  # as quantity text
183
- item[:additional_desc] = (dscr = pac.at_xpath('.//ADDSCR')) ? dscr.text : ''
184
- if comp = pac.xpath('.//COMP')
185
- item[:company_name] = (nam = comp.at_xpath('.//NAME')) ? nam.text : ''
186
- item[:company_ean] = (gln = comp.at_xpath('.//GLN')) ? gln.text : ''
201
+ item[:additional_desc] = (dscr = pac.ADDSCR) ? dscr: ''
202
+ if comp = pac.COMP
203
+ item[:company_name] = (nam = comp.NAME) ? nam: ''
204
+ item[:company_ean] = (gln = comp.GLN) ? gln: ''
187
205
  end
188
206
  unless item[:pharmacode].empty?
189
207
  item[:pharmacode] = correct_code(item[:pharmacode].to_s, 7)
@@ -308,17 +326,19 @@ module Oddb2xml
308
326
  data
309
327
  end
310
328
  end
329
+
311
330
  class SwissmedicInfoExtractor < Extractor
312
331
  def to_hash
313
332
  data = Hash.new{|h,k| h[k] = [] }
314
- doc = Nokogiri::XML(@xml)
315
- doc.xpath("//medicalInformations/medicalInformation[@type='fi']").each do |fi|
316
- lang = fi.attr('lang').to_s
333
+ return data unless @xml.size > 0
334
+ result = MedicalInformationsContent.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
335
+ result.medicalInformation.each do |pac|
336
+ lang = pac.lang.to_s
317
337
  next unless lang =~ /de|fr/
318
338
  item = {}
319
- item[:name] = (name = fi.at_xpath('.//title')) ? name.text : ''
320
- item[:owner] = (ownr = fi.at_xpath('.//authHolder')) ? ownr.text : ''
321
- if content = fi.at_xpath('.//content').children.detect{|child| child.cdata? }
339
+ item[:name] = (name = pac.title) ? name : ''
340
+ item[:owner] = (ownr = pac.authHolder) ? ownr : ''
341
+ if content = /cdata/.match(pac.content)
322
342
  html = Nokogiri::HTML(content.to_s)
323
343
  # all HTML contents without MonTitle and ownerCompany
324
344
  item[:paragraph] = "<title><p>#{item[:name]}</p></title>" +
@@ -344,9 +364,11 @@ module Oddb2xml
344
364
  def to_arry
345
365
  data = []
346
366
  ixno = 0
347
- while line = @io.gets
348
- next if line =~ /^ATC1;Name1;ATC2;Name2;/
349
- row = line.chomp.gsub("\"", '').split(';')
367
+ inhalt = @io.read
368
+ inhalt.split("\n").each do |line|
369
+ next if line =~ /ATC1.*Name1.*ATC2.*Name2/
370
+ line = '"'+line unless /^"/.match(line)
371
+ row = CSV.parse_line(line)
350
372
  ixno += 1
351
373
  action = {}
352
374
  action[:ixno] = ixno
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.8.0"
2
+ VERSION = "1.8.1"
3
3
  end
@@ -0,0 +1,250 @@
1
+ # Definitions for the sax-machine parse to parse
2
+ # Preparations.xml
3
+
4
+ require 'sax-machine'
5
+
6
+ class PriceElement
7
+ include SAXMachine
8
+ element :Price
9
+ element :ValidFromDate
10
+ element :DivisionDescription
11
+ element :PriceTypeCode
12
+ element :PriceTypeDescriptionDe
13
+ element :PriceTypeDescriptionFr
14
+ element :PriceTypeDescriptionIt
15
+ element :PriceChangeTypeDescriptionDe
16
+ element :PriceChangeTypeDescriptionFr
17
+ element :PriceChangeTypeDescriptionIt
18
+ end
19
+
20
+ class StatusElement
21
+ include SAXMachine
22
+ element :IntegrationDate
23
+ element :ValidFromDate
24
+ element :ValidThruDate
25
+ element :StatusTypeCodeSl
26
+ element :StatusTypeDescriptionSl
27
+ element :FlagApd
28
+ end
29
+
30
+ class PricesElement
31
+ include SAXMachine
32
+ element :ExFactoryPrice, :class => PriceElement
33
+ element :PublicPrice, :class => PriceElement
34
+ end
35
+
36
+ class LimitationElement
37
+ include SAXMachine
38
+ element :LimitationCode
39
+ element :LimitationType
40
+ element :LimitationValue
41
+ element :LimitationNiveau
42
+ element :DescriptionDe
43
+ element :DescriptionFr
44
+ element :DescriptionIt
45
+ element :ValidFromDate
46
+ element :ValidThruDate
47
+ end
48
+
49
+ class LimitationsElement
50
+ include SAXMachine
51
+ elements :Limitation, :class => LimitationElement
52
+ end
53
+
54
+ class PointLimitationElement
55
+ include SAXMachine
56
+ element :Points
57
+ element :Packs
58
+ element :ValidFromDate
59
+ element :ValidThruDate
60
+ end
61
+
62
+ class PointLimitationsElement
63
+ include SAXMachine
64
+ elements :PointLimitation, :class => PointLimitationElement
65
+ end
66
+
67
+ class PackContent
68
+ include SAXMachine
69
+ attribute :ProductKey
70
+ attribute :Pharmacode
71
+ attribute :PackId
72
+ element :DescriptionDe
73
+ element :DescriptionFr
74
+ element :DescriptionIt
75
+ element :SwissmedicCategory
76
+ element :SwissmedicNo8
77
+ element :FlagNarcosis
78
+ element :FlagModal
79
+ element :BagDossierNo
80
+ element :GTIN
81
+ element :Limitations, :class => LimitationsElement
82
+ element :PointLimitations, :class => PointLimitationsElement
83
+ element :Prices, :class => PricesElement
84
+ end
85
+
86
+ class PacksElement
87
+ include SAXMachine
88
+ elements :Pack, :class => PackContent
89
+ end
90
+
91
+ class ItCodeContent
92
+ include SAXMachine
93
+ attribute :Code
94
+ element :DescriptionDe
95
+ element :DescriptionFr
96
+ element :DescriptionIt
97
+ element :Limitations, :class => LimitationsElement
98
+ end
99
+
100
+ class ItCodeEntry
101
+ include SAXMachine
102
+ element :ItCode, :class => ItCodeContent
103
+ end
104
+
105
+ # handling attributes as suggested by https://github.com/pauldix/sax-machine/issues/30
106
+ class ItCodesElement
107
+ include SAXMachine
108
+ elements :ItCode, :class => ItCodeContent
109
+ end
110
+
111
+ class SubstanceElement
112
+ include SAXMachine
113
+ element :DescriptionLa
114
+ element :Quantity
115
+ element :QuantityUnit
116
+ end
117
+
118
+ class SubstancesElement
119
+ include SAXMachine
120
+ elements :Substance, :class => SubstanceElement
121
+ end
122
+
123
+ class PreparationContent
124
+ include SAXMachine
125
+ attribute :ProductCommercial
126
+ element :NameFr
127
+ element :NameDe
128
+ element :NameIt
129
+ element :Status, :class => StatusElement
130
+ element :Dummy
131
+ element :DescriptionDe
132
+ element :DescriptionFr
133
+ element :DescriptionIt
134
+ element :AtcCode
135
+ element :SwissmedicNo5
136
+ element :FlagItLimitation
137
+ element :OrgGenCode
138
+ element :FlagSB20
139
+ element :CommentDe
140
+ element :CommentFr
141
+ element :CommentIt
142
+ element :VatInEXF
143
+ element :Limitations, :class => LimitationsElement
144
+ element :Substances, :class => SubstancesElement
145
+ element :Packs, :class => PacksElement
146
+ element :ItCodes, :class => ItCodesElement
147
+ end
148
+
149
+ class PreparationEntry
150
+ include SAXMachine
151
+ element :Preparation, :class => PreparationContent
152
+ end
153
+
154
+ class PreparationsContent
155
+ include SAXMachine
156
+ attribute :ReleaseDate
157
+ elements :Preparation, :class => PreparationContent
158
+ end
159
+
160
+ class PreparationsEntry
161
+ include SAXMachine
162
+ element :Preparations, :class => PreparationsContent
163
+ end
164
+
165
+
166
+ class CompElement
167
+ include SAXMachine
168
+ element :NAME
169
+ element :GLN
170
+ end
171
+
172
+ class ItemContent
173
+ include SAXMachine
174
+ attribute :DT
175
+ element :GTIN
176
+ element :PHAR
177
+ element :STATUS
178
+ element :SDATE
179
+ element :LANG
180
+ element :DSCR
181
+ element :ADDSCR
182
+ element :ATC
183
+ element :COMP, :class => CompElement
184
+ end
185
+
186
+ class PharmaContent
187
+ include SAXMachine
188
+ attribute :CREATION_DATETIME
189
+ elements :ITEM, :class => ItemContent
190
+ end
191
+
192
+ class PharmaEntry
193
+ include SAXMachine
194
+ element :CREATION_DATETIME
195
+ element :NONPHARMA, :as => :PHARMA, :class => PharmaContent
196
+ element :PHARMA, :class => PharmaContent
197
+ end
198
+
199
+ class ItemContent
200
+ include SAXMachine
201
+ attribute :DT
202
+ element :GTIN
203
+ element :PHAR
204
+ element :STATUS
205
+ element :STDATE
206
+ element :LANG
207
+ element :DSCR
208
+ element :ADDSCR
209
+ element :ATC
210
+ element :COMP, :class => CompElement
211
+ end
212
+
213
+ class PharmaContent
214
+ include SAXMachine
215
+ attribute :CREATION_DATETIME
216
+ elements :ITEM, :class => ItemContent
217
+ end
218
+
219
+ class PharmaEntry
220
+ include SAXMachine
221
+ element :CREATION_DATETIME
222
+ element :PHARMA, :class => PharmaContent
223
+ end
224
+
225
+ class MedicalInformationContent
226
+ include SAXMachine
227
+ attribute :type
228
+ attribute :version
229
+ attribute :lang
230
+ element :title
231
+ element :authHolder
232
+ element :style
233
+ element :content
234
+ end
235
+
236
+ class MedicalInformationEntry
237
+ include SAXMachine
238
+ element :medicalInformation, :class => MedicalInformationContent
239
+ end
240
+
241
+ class MedicalInformationsContent
242
+ include SAXMachine
243
+ elements :medicalInformation, :class => MedicalInformationContent
244
+ end
245
+
246
+ class MedicalInformationsEntry
247
+ include SAXMachine
248
+ element :medicalInformations, :class => MedicalInformationsContent
249
+ end
250
+