oddb2xml 2.6.9 → 2.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +40 -0
- data/.standard.yml +2 -0
- data/Elexis_Artikelstamm_v5.xsd +0 -3
- data/Gemfile +3 -3
- data/History.txt +28 -0
- data/README.md +3 -3
- data/Rakefile +24 -23
- data/bin/check_artikelstamm +11 -11
- data/bin/compare_v5 +23 -23
- data/bin/oddb2xml +14 -13
- data/lib/oddb2xml.rb +1 -1
- data/lib/oddb2xml/builder.rb +1075 -1048
- data/lib/oddb2xml/calc.rb +232 -233
- data/lib/oddb2xml/chapter_70_hack.rb +38 -32
- data/lib/oddb2xml/cli.rb +252 -235
- data/lib/oddb2xml/compare.rb +70 -59
- data/lib/oddb2xml/compositions_syntax.rb +448 -430
- data/lib/oddb2xml/compressor.rb +20 -20
- data/lib/oddb2xml/downloader.rb +156 -128
- data/lib/oddb2xml/extractor.rb +295 -302
- data/lib/oddb2xml/options.rb +34 -35
- data/lib/oddb2xml/parslet_compositions.rb +263 -269
- data/lib/oddb2xml/semantic_check.rb +39 -33
- data/lib/oddb2xml/util.rb +166 -164
- data/lib/oddb2xml/version.rb +1 -1
- data/lib/oddb2xml/xml_definitions.rb +32 -33
- data/oddb2xml.gemspec +32 -31
- data/spec/artikelstamm_spec.rb +116 -135
- data/spec/builder_spec.rb +495 -524
- data/spec/calc_spec.rb +552 -593
- data/spec/check_artikelstamm_spec.rb +26 -26
- data/spec/cli_spec.rb +173 -174
- data/spec/compare_spec.rb +9 -11
- data/spec/composition_syntax_spec.rb +390 -409
- data/spec/compressor_spec.rb +48 -48
- data/spec/data/refdata_NonPharma.xml +0 -3
- data/spec/data/refdata_Pharma.xml +0 -26
- data/spec/data/transfer.dat +1 -0
- data/spec/data/varia_De.htm +2 -2
- data/spec/data_helper.rb +47 -49
- data/spec/downloader_spec.rb +251 -260
- data/spec/extractor_spec.rb +172 -164
- data/spec/galenic_spec.rb +233 -256
- data/spec/options_spec.rb +116 -119
- data/spec/parslet_spec.rb +833 -861
- data/spec/spec_helper.rb +153 -153
- data/test_options.rb +39 -42
- data/tools/win_fetch_cacerts.rb +2 -3
- metadata +48 -5
- data/.travis.yml +0 -29
@@ -1,14 +1,19 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require 'open-uri'
|
1
|
+
require "oddb2xml/extractor"
|
2
|
+
require "ox"
|
3
|
+
require "open-uri"
|
5
4
|
|
6
5
|
module Oddb2xml
|
7
6
|
class Chapter70xtractor < Extractor
|
8
|
-
def
|
7
|
+
def self.parse_td(elem)
|
9
8
|
begin
|
10
9
|
values = elem.is_a?(Array) ? elem : elem.values
|
11
|
-
res = values.flatten.collect{|x|
|
10
|
+
res = values.flatten.collect { |x|
|
11
|
+
if x.nil?
|
12
|
+
nil
|
13
|
+
else
|
14
|
+
x.is_a?(Hash) ? x.values : x.gsub(/\r\n/, "").strip
|
15
|
+
end
|
16
|
+
}
|
12
17
|
puts "parse_td returns: #{res}" if $VERBOSE
|
13
18
|
rescue => exc
|
14
19
|
puts "Unable to pars #{elem} #{exc}"
|
@@ -18,53 +23,54 @@ module Oddb2xml
|
|
18
23
|
res.flatten # .join("\t")
|
19
24
|
end
|
20
25
|
LIMITATIONS = {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
"L" => "Kostenübernahme nur nach vorgängiger allergologischer Abklärung.",
|
27
|
+
"L1" => "Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat.",
|
28
|
+
"L1, L2" => "Eine Flasche zu 20 ml Urtinktur einer bestimmten Pflanze pro Monat. Für Aesculus, Carduus Marianus, Ginkgo, Hedera helix, Hypericum perforatum, Lavandula, Rosmarinus officinalis, Taraxacum officinale.",
|
29
|
+
"L3" => "Alle drei Monate wird eine Verordnung/Originalpackung pro Mittel vergütet."
|
25
30
|
}
|
26
31
|
def self.items
|
27
32
|
@@items
|
28
33
|
end
|
29
|
-
|
30
|
-
|
34
|
+
|
35
|
+
def self.parse(html_file = "http://www.spezialitaetenliste.ch/varia_De.htm")
|
36
|
+
data = Hash.new { |h, k| h[k] = [] }
|
31
37
|
Ox.default_options = {
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
mode: :generic,
|
39
|
+
effort: :tolerant,
|
40
|
+
smart: true
|
35
41
|
}
|
36
|
-
res = Ox.load(Oddb2xml.uri_open(html_file).read, mode: :hash_no_attrs).values.first[
|
42
|
+
res = Ox.load(Oddb2xml.uri_open(html_file).read, mode: :hash_no_attrs).values.first["body"]
|
37
43
|
result = []
|
38
44
|
idx = 0
|
39
45
|
@@items = {}
|
40
46
|
res.values.last.each do |item|
|
41
|
-
item.values.first.each do |
|
42
|
-
what =
|
47
|
+
item.values.first.each do |sub_elem|
|
48
|
+
what = Chapter70xtractor.parse_td(sub_elem)
|
43
49
|
idx += 1
|
44
50
|
puts "#{idx}: xx #{what}" if $VERBOSE
|
45
51
|
result << what
|
46
52
|
end
|
47
53
|
end
|
48
|
-
result2 = result.find_all{ |x| (x.is_a?(Array) && x.first.is_a?(String)) && x.first.to_i > 100}
|
54
|
+
result2 = result.find_all { |x| (x.is_a?(Array) && x.first.is_a?(String)) && x.first.to_i > 100 }
|
49
55
|
result2.each do |entry|
|
50
56
|
data = {}
|
51
57
|
pharma_code = entry.first
|
52
|
-
ean13 =
|
53
|
-
if entry[2].encoding.to_s.eql?(
|
54
|
-
|
58
|
+
ean13 = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s)
|
59
|
+
german = if entry[2].encoding.to_s.eql?("ASCII-8BIT")
|
60
|
+
CGI.unescape(entry[2].force_encoding("ISO-8859-1"))
|
55
61
|
else
|
56
|
-
|
62
|
+
entry[2]
|
57
63
|
end
|
58
64
|
@@items[ean13] = {
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
65
|
+
data_origin: "Chapter70",
|
66
|
+
line: entry.join(","),
|
67
|
+
ean13: ean13,
|
68
|
+
description: german,
|
69
|
+
quantity: entry[3],
|
70
|
+
pharmacode: pharma_code,
|
71
|
+
pub_price: entry[4],
|
72
|
+
limitation: entry[5],
|
73
|
+
type: :pharma
|
68
74
|
}
|
69
75
|
end
|
70
76
|
result2
|
data/lib/oddb2xml/cli.rb
CHANGED
@@ -1,25 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require 'oddb2xml/util'
|
10
|
-
require 'rubyXL'
|
11
|
-
require 'date' # for today
|
1
|
+
require "oddb2xml/builder"
|
2
|
+
require "oddb2xml/downloader"
|
3
|
+
require "oddb2xml/extractor"
|
4
|
+
require "oddb2xml/compressor"
|
5
|
+
require "oddb2xml/options"
|
6
|
+
require "oddb2xml/util"
|
7
|
+
require "rubyXL"
|
8
|
+
require "date" # for today
|
12
9
|
|
13
10
|
module Oddb2xml
|
14
|
-
|
15
11
|
class Cli
|
16
12
|
attr_reader :options
|
17
|
-
SUBJECTS
|
13
|
+
SUBJECTS = %w[product article]
|
18
14
|
ADDITIONS = %w[substance limitation interaction code]
|
19
15
|
OPTIONALS = %w[fi fi_product]
|
20
16
|
def initialize(args)
|
21
17
|
@options = args
|
22
|
-
|
18
|
+
$stdout.puts "\nStarting cli with from #{caller(2..2).first} using #{@options}" if defined?(RSpec)
|
23
19
|
Oddb2xml.save_options(@options)
|
24
20
|
@mutex = Mutex.new
|
25
21
|
# product
|
@@ -28,21 +24,22 @@ module Oddb2xml
|
|
28
24
|
@lppvs = {} # lppv.txt from files repo
|
29
25
|
@infos = {} # [option] FI from SwissmedicInfo
|
30
26
|
@packs = {} # [option] Packungen from Swissmedic for dat
|
31
|
-
@infos_zur_rose
|
32
|
-
@migel
|
27
|
+
@infos_zur_rose = {} # [addition] infos_zur_rose and other infos from zurrose transfer.txt
|
28
|
+
@migel = {} # [addition] additional Non Pharma products from files repo
|
33
29
|
@actions = [] # [addition] interactions from epha
|
34
30
|
@orphan = [] # [addition] Orphaned drugs from Swissmedic xls
|
35
31
|
# addresses
|
36
32
|
@companies = [] # betrieb
|
37
|
-
@people
|
33
|
+
@people = [] # medizinalperson
|
38
34
|
@_message = false
|
39
35
|
end
|
36
|
+
|
40
37
|
def run
|
41
38
|
threads = []
|
42
|
-
|
43
|
-
files2rm = Dir.glob(File.join(
|
44
|
-
FileUtils.rm_f(files2rm, :
|
45
|
-
if @options[:calc]
|
39
|
+
start_time = Time.now
|
40
|
+
files2rm = Dir.glob(File.join(DOWNLOADS, "*"))
|
41
|
+
FileUtils.rm_f(files2rm, verbose: true) if (files2rm.size > 0) && !Oddb2xml.skip_download?
|
42
|
+
if @options[:calc] && !(@options[:extended])
|
46
43
|
threads << download(:package) # swissmedic
|
47
44
|
elsif @options[:address]
|
48
45
|
[:company, :person].each do |type|
|
@@ -82,148 +79,157 @@ module Oddb2xml
|
|
82
79
|
end
|
83
80
|
build
|
84
81
|
if @options[:artikelstamm] && system("which xmllint")
|
85
|
-
elexis_v5_xsd = File.expand_path(File.join(__FILE__,
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
82
|
+
elexis_v5_xsd = File.expand_path(File.join(__FILE__, "..", "..", "..", "Elexis_Artikelstamm_v5.xsd"))
|
83
|
+
cmd = "xmllint --noout --schema #{elexis_v5_xsd} #{@the_files[:artikelstamm]}"
|
84
|
+
if system(cmd)
|
85
|
+
puts "Validatied #{@the_files[:artikelstamm]}"
|
86
|
+
else
|
87
|
+
puts "Validating failed using #{cmd}"
|
88
|
+
raise "Validating failed using #{cmd}"
|
89
|
+
end
|
93
90
|
end
|
94
91
|
compress if @options[:compress_ext]
|
95
92
|
res = report
|
96
|
-
|
97
|
-
if defined?(RSpec) &&
|
93
|
+
nr_secs = (Time.now - start_time).to_i
|
94
|
+
if defined?(RSpec) && nr_secs.to_i > 10 && ENV["TRAVIS"].to_s.empty?
|
95
|
+
puts "Took took long #{nr_secs} seconds"
|
96
|
+
# require "pry"; binding.pry;
|
97
|
+
end
|
98
98
|
res
|
99
99
|
end
|
100
|
+
|
100
101
|
private
|
102
|
+
|
101
103
|
def build
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
refdata.merge!(@refdata_types[type]) if @refdata_types[type]
|
115
|
-
end
|
116
|
-
builder.refdata = refdata
|
117
|
-
end
|
118
|
-
# common sources
|
119
|
-
builder.items = @items
|
120
|
-
builder.flags = @flags
|
121
|
-
builder.lppvs = @lppvs
|
122
|
-
# optional sources
|
123
|
-
builder.infos = @infos
|
124
|
-
builder.packs = @packs
|
125
|
-
# additional sources
|
126
|
-
%w[actions orphan migel infos_zur_rose].each do |addition|
|
127
|
-
builder.send("#{addition}=".intern, self.instance_variable_get("@#{addition}"))
|
104
|
+
@the_files = {"calc" => "oddb_calc.xml"} if @options[:calc] && !(@options[:extended] || @options[:artikelstamm])
|
105
|
+
builder = Builder.new(@options) do |builder|
|
106
|
+
if @options[:calc] && !(@options[:extended] || @options[:artikelstamm])
|
107
|
+
builder.packs = @packs
|
108
|
+
elsif @options[:address]
|
109
|
+
builder.companies = @companies
|
110
|
+
builder.people = @people
|
111
|
+
else # product
|
112
|
+
if @options[:format] != :dat
|
113
|
+
refdata = {}
|
114
|
+
types.each do |type|
|
115
|
+
refdata.merge!(@refdata_types[type]) if @refdata_types[type]
|
128
116
|
end
|
117
|
+
builder.refdata = refdata
|
118
|
+
end
|
119
|
+
# common sources
|
120
|
+
builder.items = @items
|
121
|
+
builder.flags = @flags
|
122
|
+
builder.lppvs = @lppvs
|
123
|
+
# optional sources
|
124
|
+
builder.infos = @infos
|
125
|
+
builder.packs = @packs
|
126
|
+
# additional sources
|
127
|
+
%w[actions orphan migel infos_zur_rose].each do |addition|
|
128
|
+
builder.send("#{addition}=".intern, instance_variable_get("@#{addition}"))
|
129
129
|
end
|
130
|
-
builder.tag_suffix = @options[:tag_suffix]
|
131
130
|
end
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
output << builder.to_dat
|
131
|
+
builder.tag_suffix = @options[:tag_suffix]
|
132
|
+
end
|
133
|
+
files.each_pair do |sbj, file|
|
134
|
+
builder.subject = sbj
|
135
|
+
output = ""
|
136
|
+
if !@options[:address] && (@options[:format] == :dat)
|
137
|
+
types.each do |type|
|
138
|
+
a_sby = (type == :pharma ? :dat : :with_migel_dat)
|
139
|
+
builder.refdata = @refdata_types[type]
|
140
|
+
builder.subject = a_sby
|
141
|
+
builder.ean14 = @options[:ean14]
|
142
|
+
if type == :nonpharma
|
143
|
+
output << "\n"
|
146
144
|
end
|
147
|
-
|
148
|
-
output = builder.to_xml
|
145
|
+
output << builder.to_dat
|
149
146
|
end
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
147
|
+
else
|
148
|
+
output = builder.to_xml
|
149
|
+
end
|
150
|
+
File.open(File.join(WORK_DIR, file), "w:utf-8") do |fh|
|
151
|
+
output.split("\n").each do |line|
|
152
|
+
if /.xml$/i.match?(file)
|
153
|
+
fh.puts(line)
|
154
|
+
else
|
155
|
+
fh.puts(Oddb2xml.convert_to_8859_1(line))
|
157
156
|
end
|
158
157
|
end
|
159
|
-
if @options[:calc]
|
160
|
-
ext = File.extname(file)
|
161
|
-
dest = File.join(WorkDir, file.sub(ext, '_'+Time.now.strftime("%d.%m.%Y_%H.%M")+ext))
|
162
|
-
FileUtils.cp(File.join(WorkDir, file), dest, :verbose => false)
|
163
|
-
end
|
164
158
|
end
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
end
|
159
|
+
if @options[:calc]
|
160
|
+
ext = File.extname(file)
|
161
|
+
dest = File.join(WORK_DIR, file.sub(ext, "_" + Time.now.strftime("%d.%m.%Y_%H.%M") + ext))
|
162
|
+
FileUtils.cp(File.join(WORK_DIR, file), dest, verbose: false)
|
170
163
|
end
|
171
|
-
raise Interrupt
|
172
164
|
end
|
165
|
+
rescue Interrupt
|
166
|
+
files.values.each do |file|
|
167
|
+
if File.exist? file
|
168
|
+
File.unlink(file) # we don't save it as it might be only partly downloaded
|
169
|
+
end
|
170
|
+
end
|
171
|
+
raise Interrupt
|
173
172
|
end
|
174
|
-
|
173
|
+
|
174
|
+
def download(what, type = nil)
|
175
175
|
case what
|
176
176
|
when :company, :person
|
177
|
-
var = (what == :company ?
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
)
|
186
|
-
|
187
|
-
|
188
|
-
|
177
|
+
var = (what == :company ? "companies" : "people")
|
178
|
+
# instead of Thread.new do
|
179
|
+
|
180
|
+
downloader = MedregbmDownloader.new(what)
|
181
|
+
str = downloader.download
|
182
|
+
Oddb2xml.log("SwissmedicInfoDownloader #{what} str #{str.size} bytes")
|
183
|
+
instance_variable_set(
|
184
|
+
"@#{var}".intern,
|
185
|
+
items = MedregbmExtractor.new(str, what).to_arry
|
186
|
+
)
|
187
|
+
Oddb2xml.log("MedregbmExtractor #{what} added #{items.size} fachinfo")
|
188
|
+
items
|
189
|
+
|
189
190
|
when :fachinfo
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
191
|
+
# instead of Thread.new do
|
192
|
+
|
193
|
+
downloader = SwissmedicInfoDownloader.new
|
194
|
+
xml = downloader.download
|
195
|
+
Oddb2xml.log("SwissmedicInfoDownloader #{var} xml #{xml.size} bytes")
|
196
|
+
@mutex.synchronize do
|
197
|
+
hsh = SwissmedicInfoExtractor.new(xml).to_hash
|
198
|
+
@infos = hsh
|
199
|
+
Oddb2xml.log("SwissmedicInfoExtractor added #{@infos.size} fachinfo")
|
200
|
+
@infos
|
200
201
|
end
|
202
|
+
|
201
203
|
when :orphan
|
202
204
|
var = what.to_s
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
)
|
211
|
-
|
212
|
-
|
213
|
-
|
205
|
+
# instead of Thread.new do
|
206
|
+
|
207
|
+
downloader = SwissmedicDownloader.new(what, @options)
|
208
|
+
bin = downloader.download
|
209
|
+
Oddb2xml.log("SwissmedicDownloader #{var} #{bin} #{File.size(bin)} bytes")
|
210
|
+
instance_variable_set(
|
211
|
+
"@#{var}",
|
212
|
+
items = SwissmedicExtractor.new(bin, what).to_arry
|
213
|
+
)
|
214
|
+
Oddb2xml.log("SwissmedicExtractor added #{items.size} from #{bin}")
|
215
|
+
items
|
216
|
+
|
214
217
|
when :interaction
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
218
|
+
# instead of Thread.new do
|
219
|
+
|
220
|
+
downloader = EphaDownloader.new
|
221
|
+
str = downloader.download
|
222
|
+
Oddb2xml.log("EphaDownloader str #{str.size} bytes")
|
223
|
+
@mutex.synchronize do
|
224
|
+
@actions = EphaExtractor.new(str).to_arry
|
225
|
+
Oddb2xml.log("EphaExtractor added #{@actions.size} interactions")
|
226
|
+
@actions
|
224
227
|
end
|
228
|
+
|
225
229
|
when :migel
|
226
|
-
|
230
|
+
# instead of Thread.new do
|
231
|
+
unless SKIP_MIGEL_DOWNLOADER
|
232
|
+
|
227
233
|
downloader = MigelDownloader.new
|
228
234
|
bin = downloader.download
|
229
235
|
Oddb2xml.log("MigelDownloader bin #{bin.size} bytes")
|
@@ -232,99 +238,107 @@ module Oddb2xml
|
|
232
238
|
Oddb2xml.log("MigelExtractor added #{@migel.size} migel items")
|
233
239
|
@migel
|
234
240
|
end
|
235
|
-
|
241
|
+
|
242
|
+
end
|
236
243
|
when :package
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
244
|
+
# instead of Thread.new do
|
245
|
+
|
246
|
+
downloader = SwissmedicDownloader.new(:package, @options)
|
247
|
+
bin = downloader.download
|
248
|
+
Oddb2xml.log("SwissmedicDownloader package #{bin} #{File.size(bin)} bytes")
|
249
|
+
@mutex.synchronize do
|
250
|
+
@packs = SwissmedicExtractor.new(bin, :package).to_hash
|
251
|
+
Oddb2xml.log("SwissmedicExtractor added #{@packs.size} packs from #{bin}")
|
252
|
+
@packs
|
246
253
|
end
|
254
|
+
|
247
255
|
when :lppv
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
256
|
+
# instead of Thread.new do
|
257
|
+
|
258
|
+
downloader = LppvDownloader.new
|
259
|
+
str = downloader.download
|
260
|
+
Oddb2xml.log("LppvDownloader str #{str.size} bytes")
|
261
|
+
@mutex.synchronize do
|
262
|
+
@lppvs = LppvExtractor.new(str).to_hash
|
263
|
+
Oddb2xml.log("LppvExtractor added #{@lppvs.size} lppvs")
|
264
|
+
@lppvs
|
257
265
|
end
|
266
|
+
|
258
267
|
when :bag
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
268
|
+
# instead of Thread.new do
|
269
|
+
|
270
|
+
downloader = BagXmlDownloader.new(@options)
|
271
|
+
xml = downloader.download
|
272
|
+
Oddb2xml.log("BagXmlDownloader xml #{xml.size} bytes")
|
273
|
+
@mutex.synchronize do
|
274
|
+
hsh = BagXmlExtractor.new(xml).to_hash
|
275
|
+
@items = hsh
|
276
|
+
Oddb2xml.log("BagXmlExtractor added #{@items.size} items.")
|
277
|
+
@items
|
269
278
|
end
|
279
|
+
|
270
280
|
when :zurrose
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
281
|
+
# instead of Thread.new do
|
282
|
+
|
283
|
+
downloader = ZurroseDownloader.new(@options, @options[:transfer_dat])
|
284
|
+
xml = downloader.download
|
285
|
+
Oddb2xml.log("ZurroseDownloader xml #{xml.size} bytes")
|
286
|
+
@mutex.synchronize do
|
287
|
+
hsh = ZurroseExtractor.new(xml, @options[:extended], @options[:artikelstamm]).to_hash
|
288
|
+
Oddb2xml.log("ZurroseExtractor added #{hsh.size} items from xml with #{xml.size} bytes")
|
289
|
+
@infos_zur_rose = hsh
|
280
290
|
end
|
291
|
+
|
281
292
|
when :refdata
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
unless @_message # hook only one exit
|
291
|
-
@_message = true
|
292
|
-
exit
|
293
|
-
end
|
294
|
-
end
|
295
|
-
end
|
293
|
+
# instead of Thread.new do
|
294
|
+
|
295
|
+
downloader = RefdataDownloader.new(@options, type)
|
296
|
+
begin
|
297
|
+
xml = downloader.download
|
298
|
+
Oddb2xml.log("RefdataDownloader #{type} xml #{xml.size} bytes")
|
299
|
+
xml
|
300
|
+
rescue SystemExit
|
296
301
|
@mutex.synchronize do
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
302
|
+
unless @_message # hook only one exit
|
303
|
+
@_message = true
|
304
|
+
exit
|
305
|
+
end
|
301
306
|
end
|
302
307
|
end
|
308
|
+
@mutex.synchronize do
|
309
|
+
hsh = RefdataExtractor.new(xml, type).to_hash
|
310
|
+
@refdata_types[type] = hsh
|
311
|
+
Oddb2xml.log("RefdataExtractor #{type} added #{hsh.size} keys now #{@refdata_types.keys} items from xml with #{xml.size} bytes")
|
312
|
+
@refdata_types[type]
|
313
|
+
end
|
314
|
+
|
303
315
|
end
|
304
316
|
end
|
317
|
+
|
305
318
|
def compress
|
306
319
|
compressor = Compressor.new(prefix, @options)
|
307
320
|
files.values.each do |file|
|
308
|
-
work_file = File.join(
|
309
|
-
if File.
|
321
|
+
work_file = File.join(WORK_DIR, file)
|
322
|
+
if File.exist?(work_file)
|
310
323
|
compressor.contents << work_file
|
311
324
|
end
|
312
325
|
end
|
313
326
|
compressor.finalize!
|
314
327
|
end
|
328
|
+
|
315
329
|
def files
|
316
|
-
unless @
|
317
|
-
@
|
318
|
-
@
|
330
|
+
unless @the_files
|
331
|
+
@the_files = {}
|
332
|
+
@the_files[:calc] = "oddb_calc.xml" if @options[:calc]
|
319
333
|
if @options[:artikelstamm]
|
320
|
-
@
|
334
|
+
@the_files[:artikelstamm] = "artikelstamm_#{Date.today.strftime("%d%m%Y")}_v5.xml"
|
321
335
|
elsif @options[:address]
|
322
|
-
@
|
323
|
-
@
|
336
|
+
@the_files[:company] = "#{prefix}_betrieb.xml"
|
337
|
+
@the_files[:person] = "#{prefix}_medizinalperson.xml"
|
324
338
|
elsif @options[:format] == :dat
|
325
|
-
@
|
339
|
+
@the_files[:dat] = "#{prefix}.dat"
|
326
340
|
if @options[:nonpharma] # into one file
|
327
|
-
@
|
341
|
+
@the_files[:dat] = "#{prefix}_with_migel.dat"
|
328
342
|
end
|
329
343
|
else # xml
|
330
344
|
##
|
@@ -332,18 +346,20 @@ module Oddb2xml
|
|
332
346
|
# 1. additions
|
333
347
|
# 2. subjects
|
334
348
|
# 3. optional SUBJECTS
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
@
|
349
|
+
the_files = (ADDITIONS + SUBJECTS)
|
350
|
+
the_files += OPTIONALS if @options[:fi]
|
351
|
+
the_files.each do |sbj|
|
352
|
+
@the_files[sbj] = "#{prefix}_#{sbj}.xml"
|
339
353
|
end
|
340
354
|
end
|
341
355
|
end
|
342
|
-
@
|
356
|
+
@the_files
|
343
357
|
end
|
358
|
+
|
344
359
|
def prefix
|
345
|
-
@_prefix ||= (@options[:tag_suffix] ||
|
360
|
+
@_prefix ||= (@options[:tag_suffix] || "oddb").gsub(/^_|_$/, "").downcase
|
346
361
|
end
|
362
|
+
|
347
363
|
def report
|
348
364
|
lines = []
|
349
365
|
if @options[:calc]
|
@@ -352,45 +368,46 @@ module Oddb2xml
|
|
352
368
|
lines << Calc.report_conversion
|
353
369
|
lines << ParseComposition.report
|
354
370
|
end
|
355
|
-
if
|
371
|
+
if @options[:artikelstamm]
|
356
372
|
lines << "Generated artikelstamm.xml for Elexis"
|
357
373
|
lines += Builder.articlestamm_v5_info_lines
|
374
|
+
elsif @options[:address]
|
375
|
+
{
|
376
|
+
"Betrieb" => :@companies,
|
377
|
+
"Person" => :@people
|
378
|
+
}.each do |type, var|
|
379
|
+
lines << sprintf(
|
380
|
+
"#{type} addresses: %i", instance_variable_get(var).length
|
381
|
+
)
|
382
|
+
end
|
358
383
|
else
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
indices = @refdata_types[type].values.flatten.length
|
384
|
+
types.each do |type|
|
385
|
+
if @refdata_types[type]
|
386
|
+
indices = @refdata_types[type].values.flatten.length
|
363
387
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
else
|
369
|
-
migel_xls = @migel.values.compact.select{|m| !m[:pharmacode]}.map{|m| m[:pharmacode] }
|
370
|
-
indices += (migel_xls - nonpharmas).length # ignore duplicates, null
|
371
|
-
end
|
372
|
-
lines << sprintf("\tNonPharma products: %i", indices)
|
388
|
+
if type == :nonpharma
|
389
|
+
nonpharmas = @refdata_types[type].keys
|
390
|
+
if SKIP_MIGEL_DOWNLOADER
|
391
|
+
indices + nonpharmas.length
|
373
392
|
else
|
374
|
-
|
393
|
+
migel_xls = @migel.values.compact.select { |m| !m[:pharmacode] }.map { |m| m[:pharmacode] }
|
394
|
+
indices += (migel_xls - nonpharmas).length # ignore duplicates, null
|
375
395
|
end
|
396
|
+
lines << sprintf("\tNonPharma products: %i", indices)
|
397
|
+
else
|
398
|
+
lines << sprintf("\tPharma products: %i", indices)
|
376
399
|
end
|
377
400
|
end
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
else
|
382
|
-
{
|
383
|
-
'Betrieb' => :@companies,
|
384
|
-
'Person' => :@people
|
385
|
-
}.each do |type, var|
|
386
|
-
lines << sprintf(
|
387
|
-
"#{type} addresses: %i", self.instance_variable_get(var).length)
|
388
|
-
end
|
401
|
+
end
|
402
|
+
if @options[:extended] || @options[:artikelstamm]
|
403
|
+
lines << sprintf("\tInformation items zur Rose: %i", @infos_zur_rose.length)
|
389
404
|
end
|
390
405
|
end
|
391
406
|
puts lines.join("\n")
|
392
407
|
end
|
393
|
-
|
408
|
+
|
409
|
+
# RefData
|
410
|
+
def types
|
394
411
|
@_types ||=
|
395
412
|
if @options[:nonpharma] || @options[:artikelstamm]
|
396
413
|
[:pharma, :nonpharma]
|