oddb2xml 2.6.7 → 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +40 -0
  3. data/.standard.yml +2 -0
  4. data/Elexis_Artikelstamm_v5.xsd +0 -3
  5. data/Gemfile +3 -3
  6. data/History.txt +30 -0
  7. data/README.md +1 -1
  8. data/Rakefile +24 -23
  9. data/bin/check_artikelstamm +11 -11
  10. data/bin/compare_v5 +23 -23
  11. data/bin/oddb2xml +14 -13
  12. data/lib/oddb2xml.rb +1 -1
  13. data/lib/oddb2xml/builder.rb +1077 -1039
  14. data/lib/oddb2xml/calc.rb +232 -233
  15. data/lib/oddb2xml/chapter_70_hack.rb +38 -32
  16. data/lib/oddb2xml/cli.rb +252 -233
  17. data/lib/oddb2xml/compare.rb +70 -59
  18. data/lib/oddb2xml/compositions_syntax.rb +448 -430
  19. data/lib/oddb2xml/compressor.rb +20 -20
  20. data/lib/oddb2xml/downloader.rb +155 -129
  21. data/lib/oddb2xml/extractor.rb +302 -296
  22. data/lib/oddb2xml/options.rb +34 -35
  23. data/lib/oddb2xml/parslet_compositions.rb +263 -265
  24. data/lib/oddb2xml/semantic_check.rb +39 -33
  25. data/lib/oddb2xml/util.rb +169 -159
  26. data/lib/oddb2xml/version.rb +1 -1
  27. data/lib/oddb2xml/xml_definitions.rb +32 -33
  28. data/oddb2xml.gemspec +32 -30
  29. data/spec/artikelstamm_spec.rb +139 -132
  30. data/spec/builder_spec.rb +495 -524
  31. data/spec/calc_spec.rb +552 -593
  32. data/spec/check_artikelstamm_spec.rb +26 -26
  33. data/spec/cli_spec.rb +182 -157
  34. data/spec/compare_spec.rb +9 -11
  35. data/spec/composition_syntax_spec.rb +390 -409
  36. data/spec/compressor_spec.rb +48 -48
  37. data/spec/data/Preparations.xml +139 -3
  38. data/spec/data/refdata_NonPharma.xml +0 -3
  39. data/spec/data/refdata_Pharma.xml +10 -25
  40. data/spec/data/swissmedic_package.xlsx +0 -0
  41. data/spec/data/transfer.dat +3 -1
  42. data/spec/data/varia_De.htm +2 -2
  43. data/spec/data_helper.rb +47 -49
  44. data/spec/downloader_spec.rb +247 -260
  45. data/spec/extractor_spec.rb +173 -165
  46. data/spec/galenic_spec.rb +233 -256
  47. data/spec/options_spec.rb +116 -119
  48. data/spec/parslet_spec.rb +833 -861
  49. data/spec/spec_helper.rb +154 -153
  50. data/test_options.rb +39 -42
  51. data/tools/win_fetch_cacerts.rb +2 -3
  52. metadata +49 -5
  53. data/.travis.yml +0 -30
@@ -1,11 +1,10 @@
1
- # encoding: utf-8
2
- require 'nokogiri'
3
- require 'spreadsheet'
4
- require 'stringio'
5
- require 'rubyXL'
6
- require 'rubyXL/convenience_methods/workbook'
7
- require 'csv'
8
- require 'oddb2xml/xml_definitions'
1
+ require "nokogiri"
2
+ require "spreadsheet"
3
+ require "stringio"
4
+ require "rubyXL"
5
+ require "rubyXL/convenience_methods/workbook"
6
+ require "csv"
7
+ require "oddb2xml/xml_definitions"
9
8
 
10
9
  module Oddb2xml
11
10
  module TxtExtractorMethods
@@ -13,23 +12,26 @@ module Oddb2xml
13
12
  Oddb2xml.log("TxtExtractorMethods #{str} #{str.to_s.size} bytes")
14
13
  @io = StringIO.new(str)
15
14
  end
15
+
16
16
  def to_hash
17
17
  data = {}
18
- while line = @io.gets
19
- next unless line =~ /\d{13}/
20
- ean13 = line.chomp.gsub("\"", '')
18
+ while (line = @io.gets)
19
+ next unless /\d{13}/.match?(line)
20
+ ean13 = line.chomp.delete("\"")
21
21
  data[ean13] = true
22
22
  end
23
23
  data
24
24
  end
25
25
  end
26
+
26
27
  class Extractor
27
28
  attr_accessor :xml
28
29
  def initialize(xml)
29
- Oddb2xml.log("Extractor #{xml } xml #{xml.size} bytes")
30
+ Oddb2xml.log("Extractor #{xml} xml #{xml.size} bytes")
30
31
  @xml = xml
31
32
  end
32
33
  end
34
+
33
35
  class LppvExtractor < Extractor
34
36
  include TxtExtractorMethods
35
37
  end
@@ -37,156 +39,152 @@ module Oddb2xml
37
39
  class BagXmlExtractor < Extractor
38
40
  def to_hash
39
41
  data = {}
40
- result = PreparationsEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
42
+ result = PreparationsEntry.parse(@xml.sub(STRIP_FOR_SAX_MACHINE, ""), lazy: true)
41
43
  result.Preparations.Preparation.each do |seq|
42
- if seq.SwissmedicNo5.eql?('0')
44
+ if seq.SwissmedicNo5.eql?("0")
43
45
  puts "BagXmlExtractor Skipping SwissmedicNo5 0 for #{seq.NameDe} #{seq.DescriptionDe} #{seq.CommentDe}"
44
46
  next
45
47
  end
46
48
  item = {}
47
- item[:data_origin] = 'bag_xml'
48
- item[:refdata] = true
49
- item[:product_key] = seq.ProductCommercial
50
- item[:desc_de] = (desc = seq.DescriptionDe) ? desc : ''
51
- item[:desc_fr] = (desc = seq.DescriptionFr) ? desc : ''
52
- item[:name_de] = (name = seq.NameDe) ? name : ''
53
- item[:name_fr] = (name = seq.NameFr) ? name : ''
54
- item[:swissmedic_number5] = (num5 = seq.SwissmedicNo5) ? (num5.rjust(5,'0')) : ''
55
- item[:org_gen_code] = (orgc = seq.OrgGenCode) ? orgc : ''
56
- item[:deductible] = (ddbl = seq.FlagSB20) ? ddbl : ''
57
- item[:atc_code] = (atcc = seq.AtcCode) ? atcc : ''
58
- item[:comment_de] = (info = seq.CommentDe) ? info : ''
59
- item[:comment_fr] = (info = seq.CommentFr) ? info : ''
60
- item[:it_code] = ''
49
+ item[:data_origin] = "bag_xml"
50
+ item[:refdata] = true
51
+ item[:product_key] = seq.ProductCommercial
52
+ item[:desc_de] = (desc = seq.DescriptionDe) ? desc : ""
53
+ item[:desc_fr] = (desc = seq.DescriptionFr) ? desc : ""
54
+ item[:name_de] = (name = seq.NameDe) ? name : ""
55
+ item[:name_fr] = (name = seq.NameFr) ? name : ""
56
+ item[:swissmedic_number5] = (num5 = seq.SwissmedicNo5) ? num5.rjust(5, "0") : ""
57
+ item[:org_gen_code] = (orgc = seq.OrgGenCode) ? orgc : ""
58
+ item[:deductible] = (ddbl = seq.FlagSB20) ? ddbl : ""
59
+ item[:atc_code] = (atcc = seq.AtcCode) ? atcc : ""
60
+ item[:comment_de] = (info = seq.CommentDe) ? info : ""
61
+ item[:comment_fr] = (info = seq.CommentFr) ? info : ""
62
+ item[:it_code] = ""
61
63
  seq.ItCodes.ItCode.each do |itc|
62
64
  if item[:it_code].to_s.empty?
63
65
  it_code = itc.Code.to_s
64
- item[:it_code] = (it_code =~ /(\d+)\.(\d+)\.(\d+)./) ? it_code : ''
66
+ item[:it_code] = /(\d+)\.(\d+)\.(\d+)./.match?(it_code) ? it_code : ""
65
67
  end
66
68
  end
67
69
  item[:substances] = []
68
70
  seq.Substances.Substance.each_with_index do |sub, i|
69
71
  item[:substances] << {
70
- :index => i.to_s,
71
- :name => (name = sub.DescriptionLa) ? name : '',
72
- :quantity => (qtty = sub.Quantity) ? qtty : '',
73
- :unit => (unit = sub.QuantityUnit) ? unit : '',
72
+ index: i.to_s,
73
+ name: (name = sub.DescriptionLa) ? name : "",
74
+ quantity: (qtty = sub.Quantity) ? qtty : "",
75
+ unit: (unit = sub.QuantityUnit) ? unit : ""
74
76
  }
75
77
  end
76
78
  item[:pharmacodes] = []
77
- item[:packages] = {} # pharmacode => package
79
+ item[:packages] = {} # pharmacode => package
78
80
  seq.Packs.Pack.each do |pac|
79
81
  if pac.SwissmedicNo8 && pac.SwissmedicNo8.length < 8
80
82
  puts "BagXmlExtractor: Adding leading zeros for SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}" if $VERBOSE
81
- pac.SwissmedicNo8 = pac.SwissmedicNo8.rjust(8, '0')
83
+ pac.SwissmedicNo8 = pac.SwissmedicNo8.rjust(8, "0")
82
84
  end
83
85
  unless pac.GTIN
84
- unless pac.SwissmedicNo8
86
+ if pac.SwissmedicNo8
87
+ ean12 = "7680" + pac.SwissmedicNo8
88
+ pac.GTIN = (ean12 + Oddb2xml.calc_checksum(ean12)) unless @artikelstamm
89
+ # puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
90
+ else
85
91
  puts "BagXmlExtractor: Missing GTIN and SwissmedicNo8 in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}"
86
92
  next
87
- else
88
- ean12 = '7680' + pac.SwissmedicNo8
89
- pac.GTIN = (ean12 + Oddb2xml.calc_checksum(ean12)) unless @artikelstamm
90
- # puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
91
93
  end
92
94
  end
93
95
  ean13 = pac.GTIN.to_s
94
96
  Oddb2xml.setEan13forNo8(pac.SwissmedicNo8, ean13) if pac.SwissmedicNo8
95
97
  # packages
96
- exf = {:price => '', :valid_date => '', :price_code => ''}
97
- if pac.Prices and pac.Prices.ExFactoryPrice
98
- exf[:price] = pac.Prices.ExFactoryPrice.Price if pac.Prices.ExFactoryPrice.Price
99
- exf[:valid_date] = pac.Prices.ExFactoryPrice.ValidFromDate if pac.Prices.ExFactoryPrice.ValidFromDate
100
- exf[:price_code] = pac.Prices.ExFactoryPrice.PriceTypeCode if pac.Prices.ExFactoryPrice.PriceTypeCode
98
+ exf = {price: "", valid_date: "", price_code: ""}
99
+ if pac&.Prices&.ExFactoryPrice
100
+ exf[:price] = pac.Prices.ExFactoryPrice.Price if pac.Prices.ExFactoryPrice.Price
101
+ exf[:valid_date] = pac.Prices.ExFactoryPrice.ValidFromDate if pac.Prices.ExFactoryPrice.ValidFromDate
102
+ exf[:price_code] = pac.Prices.ExFactoryPrice.PriceTypeCode if pac.Prices.ExFactoryPrice.PriceTypeCode
101
103
  end
102
- pub = {:price => '', :valid_date => '', :price_code => ''}
103
- if pac.Prices and pac.Prices.PublicPrice
104
- pub[:price] = pac.Prices.PublicPrice.Price if pac.Prices.PublicPrice.Price
105
- pub[:valid_date] = pac.Prices.PublicPrice.ValidFromDate if pac.Prices.PublicPrice.ValidFromDate
106
- pub[:price_code] = pac.Prices.PublicPrice.PriceTypeCode if pac.Prices.PublicPrice.PriceTypeCode
104
+ pub = {price: "", valid_date: "", price_code: ""}
105
+ if pac&.Prices&.PublicPrice
106
+ pub[:price] = pac.Prices.PublicPrice.Price if pac.Prices.PublicPrice.Price
107
+ pub[:valid_date] = pac.Prices.PublicPrice.ValidFromDate if pac.Prices.PublicPrice.ValidFromDate
108
+ pub[:price_code] = pac.Prices.PublicPrice.PriceTypeCode if pac.Prices.PublicPrice.PriceTypeCode
107
109
  end
108
110
  item[:packages][ean13] = {
109
- :ean13 => ean13,
110
- :name_de => (desc = seq.NameDe) ? desc : '',
111
- :name_fr => (desc = seq.NameFr) ? desc : '',
112
- :desc_de => (desc = pac.DescriptionDe) ? desc : '',
113
- :desc_fr => (desc = pac.DescriptionFr) ? desc : '',
114
- :sl_entry => true,
115
- :swissmedic_category => (cat = pac.SwissmedicCategory) ? cat : '',
116
- :swissmedic_number8 => (num = pac.SwissmedicNo8) ? num : '',
117
- :prices => { :exf_price => exf, :pub_price => pub },
111
+ ean13: ean13,
112
+ name_de: (desc = seq.NameDe) ? desc : "",
113
+ name_fr: (desc = seq.NameFr) ? desc : "",
114
+ desc_de: (desc = pac.DescriptionDe) ? desc : "",
115
+ desc_fr: (desc = pac.DescriptionFr) ? desc : "",
116
+ sl_entry: true,
117
+ swissmedic_category: (cat = pac.SwissmedicCategory) ? cat : "",
118
+ swissmedic_number8: (num = pac.SwissmedicNo8) ? num : "",
119
+ prices: {exf_price: exf, pub_price: pub}
118
120
  }
119
121
  # related all limitations
120
122
  item[:packages][ean13][:limitations] = []
121
- limitations = Hash.new{|h,k| h[k] = [] }
122
- if seq.Limitations
123
- limitations[:seq] = seq.Limitations.Limitation.collect { |x| x }
124
- else
125
- limitations[:seq] = nil
123
+ limitations = Hash.new { |h, k| h[k] = [] }
124
+ limitations[:seq] = if seq.Limitations
125
+ seq.Limitations.Limitation.collect { |x| x }
126
126
  end
127
127
  # in it-codes
128
- if seq and seq.ItCodes and seq.ItCodes.ItCode
128
+ if seq&.ItCodes && seq&.ItCodes&.ItCode
129
129
  limitations[:itc] = []
130
- seq.ItCodes.ItCode.each { |x| limitations[:itc] += x.Limitations.Limitation if x.Limitations.Limitation}
130
+ seq.ItCodes.ItCode.each { |x| limitations[:itc] += x.Limitations.Limitation if x.Limitations.Limitation }
131
131
  else
132
- limitations[:itc] =nil
132
+ limitations[:itc] = nil
133
133
  end
134
134
  # in pac
135
- if pac and pac.Limitations
136
- limitations[:pac] = (lims = pac.Limitations.Limitation) ? lims.to_a : nil
137
- else
138
- limitations[:pac] = nil
135
+ limitations[:pac] = if pac && pac.Limitations
136
+ (lims = pac.Limitations.Limitation) ? lims.to_a : nil
139
137
  end
140
138
  limitations.each_pair do |lim_key, lims|
141
- key = ''
142
- id = ''
139
+ key = ""
140
+ id = ""
143
141
  case lim_key
144
142
  when :seq, :itc
145
143
  key = :swissmedic_number5
146
- id = item[key].to_s
144
+ id = item[key].to_s
147
145
  when :pac
148
146
  key = :swissmedic_number8
149
- id = item[:packages][ean13][key].to_s
147
+ id = item[:packages][ean13][key].to_s
150
148
  end
151
- if id.empty? && item[:packages][ean13][ :swissmedic_number8]
149
+ if id.empty? && item[:packages][ean13][:swissmedic_number8]
152
150
  key = :swissmedic_number8
153
- id = item[:packages][ean13][key].to_s
151
+ id = item[:packages][ean13][key].to_s
154
152
  end
155
- lims.each do |lim|
153
+ lims&.each do |lim|
156
154
  limitation = {
157
- :it => item[:it_code],
158
- :key => key,
159
- :id => id,
160
- :code => (lic = lim.LimitationCode) ? lic : '',
161
- :type => (lit = lim.LimitationType) ? lit : '',
162
- :value => (liv = lim.LimitationValue) ? liv : '',
163
- :niv => (niv = lim.LimitationNiveau) ? niv : '',
164
- :desc_de => (dsc = lim.DescriptionDe) ? dsc : '',
165
- :desc_fr => (dsc = lim.DescriptionFr) ? dsc : '',
166
- :vdate => (dat = lim.ValidFromDate) ? dat : '',
155
+ it: item[:it_code],
156
+ key: key,
157
+ id: id,
158
+ code: (lic = lim.LimitationCode) ? lic : "",
159
+ type: (lit = lim.LimitationType) ? lit : "",
160
+ value: (liv = lim.LimitationValue) ? liv : "",
161
+ niv: (niv = lim.LimitationNiveau) ? niv : "",
162
+ desc_de: (dsc = lim.DescriptionDe) ? dsc : "",
163
+ desc_fr: (dsc = lim.DescriptionFr) ? dsc : "",
164
+ vdate: (dat = lim.ValidFromDate) ? dat : ""
167
165
  }
168
166
  deleted = false
169
- if upto = ((thr = lim.ValidThruDate) ? thr : nil) and
170
- upto =~ /\d{2}\.\d{2}\.\d{2}/
167
+ if (upto = ((thr = lim.ValidThruDate) ? thr : nil)) &&
168
+ upto =~ (/\d{2}\.\d{2}\.\d{2}/)
171
169
  begin
172
- deleted = true if Date.strptime(upto, '%d.%m.%y') >= Date.today
170
+ deleted = true if Date.strptime(upto, "%d.%m.%y") >= Date.today
173
171
  rescue ArgumentError
174
172
  end
175
173
  end
176
174
  limitation[:del] = deleted
177
175
  item[:packages][ean13][:limitations] << limitation
178
- end if lims
176
+ end
179
177
  end
180
178
  # limitation points
181
179
  pts = pac.PointLimitations.PointLimitation.first # only first points
182
- item[:packages][ean13][:limitation_points] = pts ? pts.Points : ''
180
+ item[:packages][ean13][:limitation_points] = pts ? pts.Points : ""
183
181
  if pac.SwissmedicNo8
184
- ean12 = '7680' + pac.SwissmedicNo8
185
- correct_ean13 = ean12+ Oddb2xml.calc_checksum(ean12)
186
- unless pac.GTIN.eql?(correct_ean13)
187
- puts "pac.GTIN #{pac.GTIN} should be #{correct_ean13}"
188
- item[:packages][ean13][:CORRECT_EAN13] = correct_ean13
189
- end
182
+ ean12 = "7680" + pac.SwissmedicNo8
183
+ correct_ean13 = ean12 + Oddb2xml.calc_checksum(ean12)
184
+ unless pac.GTIN.eql?(correct_ean13)
185
+ puts "pac.GTIN #{pac.GTIN} should be #{correct_ean13}"
186
+ item[:packages][ean13][:CORRECT_EAN13] = correct_ean13
187
+ end
190
188
  end
191
189
  data[ean13] = item
192
190
  end
@@ -197,65 +195,60 @@ module Oddb2xml
197
195
 
198
196
  class RefdataExtractor < Extractor
199
197
  def initialize(xml, type)
200
- @type = (type == :pharma ? 'PHARMA' : 'NONPHARMA')
198
+ @type = (type == :pharma ? "PHARMA" : "NONPHARMA")
201
199
  super(xml)
202
200
  end
201
+
203
202
  def to_hash
204
203
  data = {}
205
- result = SwissRegArticleEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
204
+ result = SwissRegArticleEntry.parse(@xml.sub(STRIP_FOR_SAX_MACHINE, ""), lazy: true)
206
205
  items = result.ARTICLE.ITEM
207
206
  items.each do |pac|
208
- ean13 = (gtin = pac.GTIN.to_s) ? gtin: '0'
207
+ ean13 = (gtin = pac.GTIN.to_s) ? gtin : "0"
209
208
  if ean13.size < 13
210
209
  puts "Refdata #{@type} use 13 chars not #{ean13.size} for #{ean13}" if $VERBOSE
211
- ean13 = ean13.rjust(13, '0')
210
+ ean13 = ean13.rjust(13, "0")
212
211
  end
213
- if ean13.size == 14 && ean13[0] == '0'
212
+ if ean13.size == 14 && ean13[0] == "0"
214
213
  puts "Refdata #{@type} remove leading '0' for #{ean13}" if $VERBOSE
215
214
  ean13 = ean13[1..-1]
216
215
  end
217
216
  # but in refdata_nonPharma we have a about 700 GTINs which are 14 characters and longer
218
217
  item = {}
219
- item[:ean13] = ean13
220
- item[:no8] = pac.SWMC_AUTHNR
221
- item[:pharmacode] = (phar = pac.PHAR.to_s) ? phar: '0'
222
- item[:data_origin] = 'refdata'
223
- item[:refdata] = true
224
- item[:_type] = (typ = pac.ATYPE.downcase.to_sym) ? typ: ''
225
- item[:last_change] = (date = Time.parse(pac.DT).to_s) ? date: '' # Date and time of last data change
226
- item[:desc_de] = (dscr = pac.NAME_DE) ? dscr: ''
227
- item[:desc_fr] = (dscr = pac.NAME_FR) ? dscr: ''
228
- item[:atc_code] = (code = pac.ATC) ? code.to_s : ''
229
- item[:company_name] = (nam = pac.AUTH_HOLDER_NAME) ? nam: ''
230
- item[:company_ean] = (gln = pac.AUTH_HOLDER_GLN) ? gln: ''
231
- unless item[:pharmacode]
232
- item[:pharmacode] = phar
233
- unless data[item[:pharmacode]] # pharmacode => GTINs
234
- data[item[:ean13]] = []
235
- end
236
- end
218
+ item[:ean13] = ean13
219
+ item[:no8] = pac.SWMC_AUTHNR
220
+ item[:data_origin] = "refdata"
221
+ item[:refdata] = true
222
+ item[:_type] = (typ = pac.ATYPE.downcase.to_sym) ? typ : ""
223
+ item[:last_change] = (date = Time.parse(pac.DT).to_s) ? date : "" # Date and time of last data change
224
+ item[:desc_de] = (dscr = pac.NAME_DE) ? dscr : ""
225
+ item[:desc_fr] = (dscr = pac.NAME_FR) ? dscr : ""
226
+ item[:atc_code] = (code = pac.ATC) ? code.to_s : ""
227
+ item[:company_name] = (nam = pac.AUTH_HOLDER_NAME) ? nam : ""
228
+ item[:company_ean] = (gln = pac.AUTH_HOLDER_GLN) ? gln : ""
237
229
  data[item[:ean13]] = item
238
230
  end
239
231
  data
240
232
  end
241
233
  end
234
+
242
235
  class SwissmedicExtractor < Extractor
243
236
  def initialize(filename, type)
244
- @filename = File.join(Downloads, File.basename(filename))
245
- @filename = File.join(SpecData, File.basename(filename)) if defined?(RSpec) and not File.exists?(@filename)
246
- @type = type
237
+ @filename = File.join(DOWNLOADS, File.basename(filename))
238
+ @filename = File.join(SpecData, File.basename(filename)) if defined?(RSpec) && !File.exist?(@filename)
239
+ @type = type
247
240
  Oddb2xml.log("SwissmedicExtractor #{@filename} #{File.size(@filename)} bytes")
248
- return unless File.exists?(@filename)
241
+ return unless File.exist?(@filename)
249
242
  @sheet = RubyXL::Parser.parse(File.expand_path(@filename)).worksheets[0]
250
243
  end
244
+
251
245
  def to_arry
252
246
  data = []
253
247
  return data unless @sheet
254
248
  case @type
255
249
  when :orphan
256
- i = 1
257
250
  col_zulassung = 6
258
- raise "Could not find Zulassungsnummer in column #{col_zulassung} of #{@filename}" unless /Zulassungs.*nummer/.match(@sheet[3][col_zulassung].value)
251
+ raise "Could not find Zulassungsnummer in column #{col_zulassung} of #{@filename}" unless /Zulassungs.*nummer/.match?(@sheet[3][col_zulassung].value)
259
252
  @sheet.each do |row|
260
253
  next unless row[col_zulassung]
261
254
  number = row[col_zulassung].value.to_i
@@ -269,24 +262,25 @@ module Oddb2xml
269
262
  data.uniq
270
263
  end
271
264
 
272
- def to_hash # Packungen.xlsx COLUMNS_FEBRUARY_2019
265
+ # Packungen.xlsx COLUMNS_FEBRUARY_2019
266
+ def to_hash
273
267
  data = {}
274
268
  return data unless @sheet
275
269
  case @type
276
270
  when :package
277
271
  Oddb2xml.check_column_indices(@sheet)
278
- ith = COLUMNS_FEBRUARY_2019.keys.index(:index_therapeuticus)
279
- iksnr = COLUMNS_FEBRUARY_2019.keys.index(:iksnr)
280
- seq_name = COLUMNS_FEBRUARY_2019.keys.index(:name_base)
281
- i_3 = COLUMNS_FEBRUARY_2019.keys.index(:ikscd)
282
- seqnr = COLUMNS_FEBRUARY_2019.keys.index(:seqnr)
283
- cat = COLUMNS_FEBRUARY_2019.keys.index(:ikscat)
284
- siz = COLUMNS_FEBRUARY_2019.keys.index(:size)
285
- atc = COLUMNS_FEBRUARY_2019.keys.index(:atc_class)
272
+ ith = COLUMNS_FEBRUARY_2019.keys.index(:index_therapeuticus)
273
+ iksnr = COLUMNS_FEBRUARY_2019.keys.index(:iksnr)
274
+ seq_name = COLUMNS_FEBRUARY_2019.keys.index(:name_base)
275
+ i_3 = COLUMNS_FEBRUARY_2019.keys.index(:ikscd)
276
+ seqnr = COLUMNS_FEBRUARY_2019.keys.index(:seqnr)
277
+ cat = COLUMNS_FEBRUARY_2019.keys.index(:ikscat)
278
+ siz = COLUMNS_FEBRUARY_2019.keys.index(:size)
279
+ atc = COLUMNS_FEBRUARY_2019.keys.index(:atc_class)
286
280
  list_code = COLUMNS_FEBRUARY_2019.keys.index(:production_science)
287
- eht = COLUMNS_FEBRUARY_2019.keys.index(:unit)
288
- sub = COLUMNS_FEBRUARY_2019.keys.index(:substances)
289
- comp = COLUMNS_FEBRUARY_2019.keys.index(:composition)
281
+ eht = COLUMNS_FEBRUARY_2019.keys.index(:unit)
282
+ sub = COLUMNS_FEBRUARY_2019.keys.index(:substances)
283
+ comp = COLUMNS_FEBRUARY_2019.keys.index(:composition)
290
284
 
291
285
  # production_science Heilmittelcode, possible values are
292
286
  # Allergene
@@ -306,42 +300,41 @@ module Oddb2xml
306
300
  # Tierarzneimittel
307
301
  # Transplantat: Gewebeprodukt
308
302
  @sheet.each_with_index do |row, i|
309
-
310
- next if (i <= 1)
311
- next unless row and row[iksnr] and row[i_3]
312
- next unless row[iksnr].value.to_i > 0 and row[i_3].value.to_i > 0
313
- no8 = sprintf('%05d',row[iksnr].value.to_i) + sprintf('%03d',row[i_3].value.to_i)
303
+ next if i <= 1
304
+ next unless row && row[iksnr] && row[i_3]
305
+ next unless (row[iksnr].value.to_i > 0) && (row[i_3].value.to_i > 0)
306
+ no8 = sprintf("%05d", row[iksnr].value.to_i) + sprintf("%03d", row[i_3].value.to_i)
314
307
  unless no8.empty?
315
308
  next if no8.to_i == 0
316
309
  ean_base12 = "7680#{no8}"
317
- prodno = Oddb2xml.gen_prodno(row[iksnr].value.to_i, row[seqnr].value.to_i)
318
- ean13 = (ean_base12.ljust(12, '0') + Oddb2xml.calc_checksum(ean_base12))
310
+ prodno = Oddb2xml.gen_prodno(row[iksnr].value.to_i, row[seqnr].value.to_i)
311
+ ean13 = (ean_base12.ljust(12, "0") + Oddb2xml.calc_checksum(ean_base12))
319
312
  Oddb2xml.setEan13forProdno(prodno, ean13)
320
313
  Oddb2xml.setEan13forNo8(no8, ean13)
321
314
  data[no8] = {
322
- :iksnr => row[iksnr].value.to_i,
323
- :no8 => no8,
324
- :ean13 => ean13,
325
- :prodno => prodno,
326
- :seqnr => row[seqnr].value,
327
- :ith_swissmedic => row[ith] ? row[ith].value.to_s : '',
328
- :swissmedic_category => row[cat].value.to_s,
329
- :atc_code => row[atc] ? Oddb2xml.add_epha_changes_for_ATC(row[iksnr].value.to_s, row[atc].value.to_s) : '',
330
- :list_code => row[list_code] ? row[list_code].value.to_s : '',
331
- :package_size => row[siz] ? row[siz].value.to_s : '',
332
- :einheit_swissmedic => row[eht] ? row[eht].value.to_s : '',
333
- :substance_swissmedic => row[sub] ? row[sub].value.to_s : '',
334
- :composition_swissmedic => row[comp] ? row[comp].value.to_s : '',
335
- :sequence_name => row[seq_name] ? row[seq_name].value.to_s : '',
336
- :is_tier => (row[list_code] == 'Tierarzneimittel' ? true : false),
337
- :gen_production => row[COLUMNS_FEBRUARY_2019.keys.index(:gen_production)].value.to_s,
338
- :insulin_category => row[COLUMNS_FEBRUARY_2019.keys.index(:insulin_category)].value.to_s,
339
- :drug_index => row[COLUMNS_FEBRUARY_2019.keys.index(:drug_index)].value.to_s,
340
- :data_origin => 'swissmedic_package',
341
- :expiry_date => row[COLUMNS_FEBRUARY_2019.keys.index(:expiry_date)].value.to_s,
342
- :company_name => row[COLUMNS_FEBRUARY_2019.keys.index(:company)].value.to_s,
343
- :size => row[COLUMNS_FEBRUARY_2019.keys.index(:size)].value.to_s,
344
- :unit => row[COLUMNS_FEBRUARY_2019.keys.index(:unit)].value.to_s,
315
+ iksnr: row[iksnr].value.to_i,
316
+ no8: no8,
317
+ ean13: ean13,
318
+ prodno: prodno,
319
+ seqnr: row[seqnr].value,
320
+ ith_swissmedic: row[ith] ? row[ith].value.to_s : "",
321
+ swissmedic_category: row[cat].value.to_s,
322
+ atc_code: row[atc] ? Oddb2xml.add_epha_changes_for_ATC(row[iksnr].value.to_s, row[atc].value.to_s) : "",
323
+ list_code: row[list_code] ? row[list_code].value.to_s : "",
324
+ package_size: row[siz] ? row[siz].value.to_s : "",
325
+ einheit_swissmedic: row[eht] ? row[eht].value.to_s : "",
326
+ substance_swissmedic: row[sub] ? row[sub].value.to_s : "",
327
+ composition_swissmedic: row[comp] ? row[comp].value.to_s : "",
328
+ sequence_name: row[seq_name] ? row[seq_name].value.to_s : "",
329
+ is_tier: (row[list_code] == "Tierarzneimittel"),
330
+ gen_production: row[COLUMNS_FEBRUARY_2019.keys.index(:gen_production)].value.to_s,
331
+ insulin_category: row[COLUMNS_FEBRUARY_2019.keys.index(:insulin_category)].value.to_s,
332
+ drug_index: row[COLUMNS_FEBRUARY_2019.keys.index(:drug_index)].value.to_s,
333
+ data_origin: "swissmedic_package",
334
+ expiry_date: row[COLUMNS_FEBRUARY_2019.keys.index(:expiry_date)].value.to_s,
335
+ company_name: row[COLUMNS_FEBRUARY_2019.keys.index(:company)].value.to_s,
336
+ size: row[COLUMNS_FEBRUARY_2019.keys.index(:size)].value.to_s,
337
+ unit: row[COLUMNS_FEBRUARY_2019.keys.index(:unit)].value.to_s
345
338
  }
346
339
  end
347
340
  end
@@ -349,21 +342,26 @@ module Oddb2xml
349
342
  cleanup_file
350
343
  data
351
344
  end
345
+
352
346
  private
347
+
353
348
  def cleanup_file
354
- begin
355
- File.unlink(@filename) if File.exists?(@filename)
349
+ unless defined?(RSpec)
350
+ begin
351
+ File.unlink(@filename) if File.exist?(@filename)
356
352
  rescue Errno::EACCES # Permission Denied on Windows
357
- end unless defined?(RSpec)
353
+ end
354
+ end
358
355
  end
359
-
360
356
  end
357
+
361
358
  class MigelExtractor < Extractor
362
359
  def initialize(bin)
363
360
  Oddb2xml.log("MigelExtractor #{io} #{File.size(io)} bytes")
364
- book = Spreadsheet.open(io, 'rb')
361
+ book = Spreadsheet.open(io, "rb")
365
362
  @sheet = book.worksheet(0)
366
363
  end
364
+
367
365
  def to_hash
368
366
  data = {}
369
367
  @sheet.each_with_index do |row, i|
@@ -373,15 +371,15 @@ module Oddb2xml
373
371
  ean13 = row[0]
374
372
  ean13 = phar unless ean13.to_s.length == 13
375
373
  data[ean] = {
376
- :refdata => true,
377
- :ean13 => ean13,
378
- :pharmacode => phar,
379
- :desc_de => row[3],
380
- :desc_fr => row[4],
381
- :quantity => row[5], # quantity
382
- :company_name => row[6],
383
- :company_ean => row[7],
384
- :data_origin => 'migel'
374
+ refdata: true,
375
+ ean13: ean13,
376
+ pharmacode: phar,
377
+ desc_de: row[3],
378
+ desc_fr: row[4],
379
+ quantity: row[5], # quantity
380
+ company_name: row[6],
381
+ company_ean: row[7],
382
+ data_origin: "migel"
385
383
  }
386
384
  end
387
385
  data
@@ -390,26 +388,26 @@ module Oddb2xml
390
388
 
391
389
  class SwissmedicInfoExtractor < Extractor
392
390
  def to_hash
393
- data = Hash.new{|h,k| h[k] = [] }
391
+ data = Hash.new { |h, k| h[k] = [] }
394
392
  return data unless @xml.size > 0
395
- result = MedicalInformationsContent.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
393
+ result = MedicalInformationsContent.parse(@xml.sub(STRIP_FOR_SAX_MACHINE, ""), lazy: true)
396
394
  result.medicalInformation.each do |pac|
397
395
  lang = pac.lang.to_s
398
- next unless lang =~ /de|fr/
396
+ next unless /de|fr/.match?(lang)
399
397
  item = {}
400
398
  item[:refdata] = true
401
- item[:data_origin] = 'swissmedic_info'
402
- item[:name] = (name = pac.title) ? name : ''
403
- item[:owner] = (ownr = pac.authHolder) ? ownr : ''
404
- item[:style] = Nokogiri::HTML.fragment(pac.style).to_html(:encoding => 'UTF-8')
405
- html = Nokogiri::HTML.fragment(pac.content.force_encoding('UTF-8'))
399
+ item[:data_origin] = "swissmedic_info"
400
+ item[:name] = (name = pac.title) ? name : ""
401
+ item[:owner] = (ownr = pac.authHolder) ? ownr : ""
402
+ item[:style] = Nokogiri::HTML.fragment(pac.style).to_html(encoding: "UTF-8")
403
+ html = Nokogiri::HTML.fragment(pac.content.force_encoding("UTF-8"))
406
404
  item[:paragraph] = html
407
- numbers = /(\d{5})[,\s]*(\d{5})?|(\d{5})[,\s]*(\d{5})?[,\s]*(\d{5})?/.match(html)
405
+ numbers = /(\d{5})[,\s]*(\d{5})?|(\d{5})[,\s]*(\d{5})?[,\s]*(\d{5})?/.match(html)
408
406
  if numbers
409
- [$1, $2, $3].compact.each do |n| # plural
410
- item[:monid] = n
411
- data[lang] << item
412
- end
407
+ [$1, $2, $3].compact.each do |n| # plural
408
+ item[:monid] = n
409
+ data[lang] << item
410
+ end
413
411
  end
414
412
  end
415
413
  data
@@ -421,27 +419,28 @@ module Oddb2xml
421
419
  Oddb2xml.log("EphaExtractor #{str.size} bytes")
422
420
  @io = StringIO.new(str)
423
421
  end
422
+
424
423
  def to_arry
425
424
  data = []
426
425
  ixno = 0
427
426
  inhalt = @io.read
428
427
  inhalt.split("\n").each do |line|
429
428
  ixno += 1
430
- next if /ATC1.*Name1.*ATC2.*Name2/.match(line)
431
- #line = '"'+line unless /^"/.match(line)
429
+ next if /ATC1.*Name1.*ATC2.*Name2/.match?(line)
430
+ # line = '"'+line unless /^"/.match(line)
432
431
  begin
433
- row = CSV.parse_line(line.gsub('""','"'))
432
+ row = CSV.parse_line(line.gsub('""', '"'))
434
433
  action = {}
435
434
  next unless row.size > 8
436
- action[:data_origin] = 'epha'
437
- action[:ixno] = ixno
438
- action[:title] = row[4]
439
- action[:atc1] = row[0]
440
- action[:atc2] = row[2]
435
+ action[:data_origin] = "epha"
436
+ action[:ixno] = ixno
437
+ action[:title] = row[4]
438
+ action[:atc1] = row[0]
439
+ action[:atc2] = row[2]
441
440
  action[:mechanism] = row[5]
442
- action[:effect] = row[6]
443
- action[:measures] = row[7]
444
- action[:grad] = row[8]
441
+ action[:effect] = row[6]
442
+ action[:measures] = row[7]
443
+ action[:grad] = row[8]
445
444
  data << action
446
445
  rescue CSV::MalformedCSVError
447
446
  puts "CSV::MalformedCSVError in line #{ixno}: #{line}"
@@ -450,139 +449,146 @@ module Oddb2xml
450
449
  data
451
450
  end
452
451
  end
452
+
453
453
  class MedregbmExtractor < Extractor
454
454
  def initialize(str, type)
455
- @io = StringIO.new(str)
455
+ @io = StringIO.new(str)
456
456
  @type = type
457
457
  end
458
+
458
459
  def to_arry
459
460
  data = []
460
461
  case @type
461
462
  when :company
462
- while line = @io.gets
463
+ while (line = @io.gets)
463
464
  row = line.chomp.split("\t")
464
- next if row[0] =~ /^GLN/
465
+ next if /^GLN/.match?(row[0])
465
466
  data << {
466
- :data_origin => 'medreg',
467
- :gln => row[0].to_s.gsub(/[^0-9]/, ''), #=> GLN Betrieb
468
- :name_1 => row[1].to_s, #=> Betriebsname 1
469
- :name_2 => row[2].to_s, #=> Betriebsname 2
470
- :address => row[3].to_s, #=> Strasse
471
- :number => row[4].to_s, #=> Nummer
472
- :post => row[5].to_s, #=> PLZ
473
- :place => row[6].to_s, #=> Ort
474
- :region => row[7].to_s, #=> Bewilligungskanton
475
- :country => row[8].to_s, #=> Land
476
- :type => row[9].to_s, #=> Betriebstyp
477
- :authorization => row[10].to_s, #=> BTM Berechtigung
467
+ data_origin: "medreg",
468
+ gln: row[0].to_s.gsub(/[^0-9]/, ""), #=> GLN Betrieb
469
+ name_1: row[1].to_s, #=> Betriebsname 1
470
+ name_2: row[2].to_s, #=> Betriebsname 2
471
+ address: row[3].to_s, #=> Strasse
472
+ number: row[4].to_s, #=> Nummer
473
+ post: row[5].to_s, #=> PLZ
474
+ place: row[6].to_s, #=> Ort
475
+ region: row[7].to_s, #=> Bewilligungskanton
476
+ country: row[8].to_s, #=> Land
477
+ type: row[9].to_s, #=> Betriebstyp
478
+ authorization: row[10].to_s #=> BTM Berechtigung
478
479
  }
479
480
  end
480
481
  when :person
481
- while line = @io.gets
482
+ while (line = @io.gets)
482
483
  row = line.chomp.split("\t")
483
- next if row[0] =~ /^GLN/
484
+ next if /^GLN/.match?(row[0])
484
485
  data << {
485
- :data_origin => 'medreg',
486
- :gln => row[0].to_s.gsub(/[^0-9]/, ''), #=> GLN Person
487
- :last_name => row[1].to_s, #=> Name
488
- :first_name => row[2].to_s, #=> Vorname
489
- :post => row[3].to_s, #=> PLZ
490
- :place => row[4].to_s, #=> Ort
491
- :region => row[5].to_s, #=> Bewilligungskanton
492
- :country => row[6].to_s, #=> Land
493
- :license => row[7].to_s, #=> Bewilligung Selbstdispensation
494
- :certificate => row[8].to_s, #=> Diplom
495
- :authorization => row[9].to_s, #=> BTM Berechtigung
486
+ data_origin: "medreg",
487
+ gln: row[0].to_s.gsub(/[^0-9]/, ""), #=> GLN Person
488
+ last_name: row[1].to_s, #=> Name
489
+ first_name: row[2].to_s, #=> Vorname
490
+ post: row[3].to_s, #=> PLZ
491
+ place: row[4].to_s, #=> Ort
492
+ region: row[5].to_s, #=> Bewilligungskanton
493
+ country: row[6].to_s, #=> Land
494
+ license: row[7].to_s, #=> Bewilligung Selbstdispensation
495
+ certificate: row[8].to_s, #=> Diplom
496
+ authorization: row[9].to_s #=> BTM Berechtigung
496
497
  }
497
498
  end
498
499
  end
499
500
  data
500
501
  end
501
502
  end
503
+
502
504
  class ZurroseExtractor < Extractor
503
505
  # see http://dev.ywesee.com/Bbmb/TransferDat
504
506
  def initialize(dat, extended = false, artikelstamm = false)
505
507
  @@extended = extended
506
508
  @artikelstamm = artikelstamm
507
- FileUtils.makedirs(WorkDir)
508
- @@error_file ||= File.open(File.join(WorkDir, "duplicate_ean13_from_zur_rose.txt"), 'wb+:ISO-8859-14')
509
+ FileUtils.makedirs(WORK_DIR)
510
+ @@error_file ||= File.open(File.join(WORK_DIR, "duplicate_ean13_from_zur_rose.txt"), "wb+:ISO-8859-14")
509
511
  @@items_without_ean13s ||= 0
510
512
  @@duplicated_ean13s ||= 0
511
513
  @@zur_rose_items ||= 0
512
514
  if dat
513
- if File.exists?(dat)
514
- @io = File.open(dat, 'rb:ISO-8859-14')
515
+ @io = if File.exist?(dat)
516
+ File.open(dat, "rb:ISO-8859-14")
515
517
  else
516
- @io = StringIO.new(dat)
518
+ StringIO.new(dat)
517
519
  end
518
520
  @io
519
- else
520
- nil
521
521
  end
522
522
  end
523
+
523
524
  def to_hash
524
525
  data = {}
525
- while line = @io.gets
526
- ean13 = "-1"
527
- line = Oddb2xml.patch_some_utf8(line).chomp
528
- # next unless /(7680\d{9})(\d{1})$/.match(line) # Skip non pharma
529
- next if line =~ /(ad us\.* vet)|(\(vet\))/i
530
- if @@extended
531
- next unless line =~ /(\d{13})(\d{1})$/
532
- else
533
- next unless line =~ /(7680\d{9})(\d{1})$/
534
- end
535
- pharma_code = line[3..9]
536
- if $1.to_s == '0000000000000'
537
- @@items_without_ean13s += 1
538
- next if @artikelstamm && pharma_code.to_i == 0
539
- ean13 = Oddb2xml::FAKE_GTIN_START + pharma_code.to_s unless @artikelstamm
540
- else
541
- ean13 = $1
542
- end
543
- if data[ean13]
544
- @@error_file.puts "Duplicate ean13 #{ean13} in line \nact: #{line.chomp}\norg: #{data[ean13][:line]}"
545
- @@items_without_ean13s -= 1
546
- @@duplicated_ean13s += 1
547
- next
548
- end
526
+ if @io
527
+ while (line = @io.gets)
528
+ ean13 = "-1"
529
+ line = Oddb2xml.patch_some_utf8(line).chomp
530
+ # next unless /(7680\d{9})(\d{1})$/.match(line) # Skip non pharma
531
+ next if /(ad us\.* vet)|(\(vet\))/i.match?(line)
532
+ if @@extended
533
+ next unless (match_data = line.match(/(\d{13})(\d{1})$/))
534
+ else
535
+ next unless (match_data = line.match(/(7680\d{9})(\d{1})$/))
536
+ end
537
+ pharma_code = line[3..9]
538
+ if match_data[1].to_s == "0000000000000"
539
+ @@items_without_ean13s += 1
540
+ next if @artikelstamm && pharma_code.to_i == 0
541
+ ean13 = Oddb2xml::FAKE_GTIN_START + pharma_code.to_s unless @artikelstamm
542
+ else
543
+ ean13 = match_data[1]
544
+ end
545
+ if data[ean13]
546
+ @@error_file.puts "Duplicate ean13 #{ean13} in line \nact: #{line.chomp}\norg: #{data[ean13][:line]}"
547
+ @@items_without_ean13s -= 1
548
+ @@duplicated_ean13s += 1
549
+ next
550
+ end
549
551
 
550
- pexf = sprintf("%.2f", line[60,6].gsub(/(\d{2})$/, '.\1').to_f)
551
- ppub = sprintf("%.2f", line[66,6].gsub(/(\d{2})$/, '.\1').to_f)
552
- next if @artikelstamm && /^113/.match(line) && /^7680/.match(ean13)
553
- next if @artikelstamm && /^113/.match(line) && ppub.eql?('0.0') && pexf.eql?('0.0')
554
- next unless ean13
555
- key = ean13
556
- key = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s) if ean13.to_i <= 0 # dummy ean13
557
- data[key] = {
558
- :data_origin => 'zur_rose',
559
- :line => line.chomp,
560
- :ean13 => ean13,
561
- :clag => line[73],
562
- :vat => line[96],
563
- :description => line[10..59].sub(/\s+$/, ''),
564
- :quantity => '',
565
- :pharmacode => pharma_code,
566
- :price => pexf,
567
- :pub_price => ppub,
568
- :type => :nonpharma,
569
- :cmut => line[2],
570
- }
571
- @@zur_rose_items += 1
572
- end if @io
573
- if defined?(@@extended) and @@extended
552
+ pexf = sprintf("%.2f", line[60, 6].gsub(/(\d{2})$/, '.\1').to_f)
553
+ ppub = sprintf("%.2f", line[66, 6].gsub(/(\d{2})$/, '.\1').to_f)
554
+ next if @artikelstamm && /^113/.match(line) && ppub.eql?("0.0") && pexf.eql?("0.0")
555
+ next unless ean13
556
+ key = ean13
557
+ key = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s) if ean13.to_i <= 0 # dummy ean13
558
+ data[key] = {
559
+ data_origin: "zur_rose",
560
+ line: line.chomp,
561
+ ean13: ean13,
562
+ clag: line[73],
563
+ vat: line[96],
564
+ description: line[10..59].sub(/\s+$/, ""),
565
+ quantity: "",
566
+ pharmacode: pharma_code,
567
+ price: pexf,
568
+ pub_price: ppub,
569
+ type: :nonpharma,
570
+ cmut: line[2]
571
+ }
572
+ @@zur_rose_items += 1
573
+ end
574
+ end
575
+ if defined?(@@extended) && @@extended
574
576
  @@error_file.puts get_error_msg
575
577
  end
576
578
  @@error_file.close
577
579
  @@error_file = nil
578
580
  data
579
581
  end
580
- at_exit do
581
- puts get_error_msg
582
- end if defined?(@@extended) and @@extended
583
- private
582
+ if defined?(@@extended) && @@extended
583
+ at_exit do
584
+ puts get_error_msg
585
+ end
586
+ end
587
+
588
+ private
589
+
584
590
  def get_error_msg
585
- if defined?(@@extended) and @@extended
591
+ if defined?(@@extended) && @@extended
586
592
  msg = "Added #{@@items_without_ean13s} via pharmacodes of #{@@zur_rose_items} items when extracting the transfer.dat from \"Zur Rose\""
587
593
  msg += "\n found #{@@duplicated_ean13s} lines with duplicated ean13" if @@duplicated_ean13s > 0
588
594
  return msg