oddb2xml 1.9.6 → 1.9.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01fd7337753234518adea6438bb4d82670b5cb37
4
- data.tar.gz: 8ee70f060cd40e4503b45989527336f07c8a9dfe
3
+ metadata.gz: 7cead671c938149dab5dfde7f418a9cc2fdd5d62
4
+ data.tar.gz: 1ae54ff9d2724b4675b2f9a7e2a345a20f9017b6
5
5
  SHA512:
6
- metadata.gz: 73a517563d9e338e2d0781ee13965596aaf8f559cc0b049d9a325d51c4186ee637f7b08cf4c876922488169184bf27a15a0c481072038e59e1f8aaafb0a41161
7
- data.tar.gz: 01a5e728ca3be8f21d6ec0d2546b23bd9551860494019f0abf9610373cceb526eac1e4860bcae79f7cba526fe6c2fb7d28d47ee5599c3ee89502dc46ee0367c3
6
+ metadata.gz: fc4db40f9ede22f2f48dc3159eff3d93f5fbae6c46f7a4ab0fc466c4ecc8d142c4e8e41d9395effac0bfe79c5c6e34553d87ed2b171fb16287a63c8b21c3dce9
7
+ data.tar.gz: b784b7ea2ae441c6869a514729b2663a1939022c2f2d841b3a2e87bc9bdf70d46892cf95eb8b815d2f51cb0148efac31ec38995d302155959c483f538673fa96
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oddb2xml (1.9.6)
4
+ oddb2xml (1.9.7)
5
5
  archive-tar-minitar (~> 0.5.2)
6
6
  mechanize (~> 2.5.1)
7
7
  nokogiri (~> 1.5.10)
@@ -1,15 +1,23 @@
1
- === 1.9.6 /18.02.2015
1
+ === 1.9.7 / 03.03.2015
2
+
3
+ * Emit qty as floats
4
+ * Emit compositions for --calc
5
+ * Fix Infusionsemulsion for Nutriflex
6
+ * Added missing_in_refdata.txt. Skip veterinary
7
+ * Show correct number of created item in oddb_product.xml
8
+
9
+ === 1.9.6 / 18.02.2015
2
10
 
3
11
  * Add all products defined in Packungen.xlsx from SwissMedic to oddb_products.xml
4
12
 
5
- === 1.9.5 /16.02.2015
13
+ === 1.9.5 / 16.02.2015
6
14
 
7
15
  * Option --calc produces oddb_calc.xml with field SELLING_UNITS
8
16
  * Use https instead of http for www.swissmedic.ch
9
17
  * Added field CompositionSwissmedic to oddb_product.xml
10
18
  * Unittests for upcoming oddb_calc.xml
11
19
 
12
- === 1.9.4 /21.01.2015
20
+ === 1.9.4 / 21.01.2015
13
21
 
14
22
  * Create additional field resellerpub in oddb_article.xml
15
23
  * Adapted xsd for this change
@@ -659,7 +659,7 @@ module Oddb2xml
659
659
  next if atc_code and /^Q/i.match(atc_code)
660
660
  next if list_code and /Tierarzneimittel/.match(list_code)
661
661
 
662
- info = Calc.new(name, package_size, unit, composition)
662
+ info = Calc.new(name, package_size, unit, active_substance, composition)
663
663
  ean12 = '7680' + no8
664
664
  ean13 = (ean12 + Oddb2xml.calc_checksum(ean12))
665
665
  items[ean13] = info
@@ -680,7 +680,19 @@ module Oddb2xml
680
680
  xml.GALENIC_FORM info.galenic_form.description
681
681
  xml.GALENIC_GROUP info.galenic_group ? info.galenic_group.description : "Unknown"
682
682
  end
683
- }
683
+ xml.COMPOSITIONS {
684
+ info.compositions.each {
685
+ |composition|
686
+ xml.COMPOSITION {
687
+ xml.NAME composition.name
688
+ if composition.unit
689
+ xml.QTY composition.qty
690
+ xml.UNIT composition.unit
691
+ end
692
+ }
693
+ }
694
+ }
695
+ } if info.compositions
684
696
  end
685
697
  }
686
698
  end
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  module Oddb2xml
7
7
  # Calc is responsible for analysing the columns "Packungsgrösse" and "Einheit"
8
8
  #
9
+ Composition = Struct.new("Composition", :name, :qty, :unit)
9
10
  GalenicGroup = Struct.new("GalenicGroup", :oid, :descriptions)
10
11
  GalenicForm = Struct.new("GalenicForm", :oid, :descriptions, :galenic_group)
11
12
 
@@ -37,6 +38,7 @@ module Oddb2xml
37
38
  'I.E.',
38
39
  'Infusionskonzentrat',
39
40
  'Infusionslösung',
41
+ 'Infusionsemulsion',
40
42
  'Inhalationen',
41
43
  'Inhalator',
42
44
  'Injektions-Set',
@@ -101,7 +103,7 @@ module Oddb2xml
101
103
  @@names_without_galenic_forms = []
102
104
  @@rules_counter = {}
103
105
  attr_accessor :galenic_form, :unit, :pkg_size
104
- attr_reader :name, :substances, :composition
106
+ attr_reader :name, :substances, :composition, :compositions
105
107
  attr_reader :selling_units, :count, :multi, :measure, :addition, :scale # s.a. commercial_form in oddb.org/src/model/part.rb
106
108
  def self.get_galenic_group(name, lang = 'de')
107
109
  @@galenic_groups.values.collect { |galenic_group|
@@ -149,8 +151,39 @@ module Oddb2xml
149
151
  "\n\n\nColumn Präparateliste has everywhere a name\n"
150
152
  end
151
153
  end
152
-
153
- def initialize(name = nil, size = nil, unit = nil, composition= nil)
154
+ public
155
+ SCALE_P = %r{pro\s+(?<scale>(?<qty>[\d.,]+)\s*(?<unit>[kcmuµn]?[glh]))}u
156
+ def self.update_active_agent(name, part)
157
+ units = 'U\.\s*Ph\.\s*Eur\.'
158
+ ptrn = %r{(?ix)
159
+ (^|[[:punct:]]|\bet|\bex)\s*#{Regexp.escape name}(?![:\-])
160
+ (\s*(?<dose>[\d\-.]+(\s*(?:(Mio\.?\s*)?(#{units}|[^\s,]+))
161
+ (\s*[mv]/[mv])?)))?
162
+ (\s*(?:ut|corresp\.?)\s+(?<chemical>[^\d,]+)
163
+ \s*(?<cdose>[\d\-.]+(\s*(?:(Mio\.?\s*)?(#{units}|[^\s,]+))
164
+ (\s*[mv]/[mv])?))?)?
165
+ }u
166
+ if(match = ptrn.match(part.sub(/\.$/, '')))
167
+ dose = match[:dose].split(/\b\s*(?![.,\d\-]|Mio\.?)/u, 2) if match[:dose]
168
+ cdose = match[:cdose].split(/\b\s*(?![.,\d\-]|Mio\.?)/u, 2) if match[:cdose]
169
+ if dose && (scale = SCALE_P.match(part)) && !dose[1].include?('/')
170
+ unit = dose[1] << '/'
171
+ num = scale[:qty].to_f
172
+ if num <= 1
173
+ unit << scale[:unit]
174
+ else
175
+ unit << scale[:scale]
176
+ end
177
+ end
178
+ if(chemical = match[:chemical])
179
+ chemical = capitalize(chemical)
180
+ chemical = nil if chemical.empty?
181
+ end if false # TODO:
182
+ [name, dose ? [dose[0], dose[1]] : [nil, nil] ].flatten
183
+ end
184
+ end
185
+ public
186
+ def initialize(name = nil, size = nil, unit = nil, active_substance = nil, composition= nil)
154
187
  @name = name
155
188
  @pkg_size = size
156
189
  @unit = unit
@@ -160,6 +193,39 @@ module Oddb2xml
160
193
  @measure = unit if unit and not @measure
161
194
  @measure = @galenic_form.description if @galenic_form and not @measure
162
195
  @galenic_form ||= @@galenic_forms[UnknownGalenicForm]
196
+
197
+ unless active_substance
198
+ @compositions = []
199
+ @active_substances = []
200
+ else
201
+ # Update of active substances, etc picked up from oddb.org/src/plugin/swissmedic.rb update_compositions
202
+ @active_substances = active_substance.split(/\s*,(?!\d|[^(]+\))\s*/u).collect { |name| capitalize(name) }.uniq
203
+
204
+ res = []
205
+ numbers = [ "A|I", "B|II", "C|III", "D|IV", "E|V", "F|VI" ]
206
+ current = numbers.shift
207
+ labels = []
208
+ composition_text = composition.gsub(/\r\n?/u, "\n")
209
+ compositions = composition_text.split(/\n/u).select do |line|
210
+ if match = /^(#{current})\)/.match(line)
211
+ labels.push match[1]
212
+ current = numbers.shift
213
+ end
214
+ end
215
+ if compositions.empty?
216
+ compositions.push composition_text.gsub(/\n/u, ' ')
217
+ end
218
+ agents = []
219
+ comps = []
220
+ compositions.each_with_index do |composition, idx|
221
+ composition.gsub!(/'/, '')
222
+ @active_substances.each { |name|
223
+ name, qty, unit = Calc.update_active_agent(name, composition)
224
+ res << Composition.new(name, qty.to_f, unit) if name
225
+ }
226
+ end
227
+ @compositions = res
228
+ end
163
229
  end
164
230
 
165
231
  def galenic_group
@@ -198,6 +264,14 @@ module Oddb2xml
198
264
  begin
199
265
  return pkg_size_to_int(pkg_size_L) unless part_from_name_C
200
266
  part_from_name_C = part_from_name_C.gsub(/[()]/, '_')
267
+ Mesurements.each{ |x|
268
+ if einheit_M and /^#{x}$/i.match(einheit_M)
269
+ puts "measurement in einheit_M #{einheit_M} matched: #{x}" if $VERBOSE
270
+ update_rule('measurement einheit_M')
271
+ @measure = x
272
+ return pkg_size_to_int(pkg_size_L, true)
273
+ end
274
+ }
201
275
  FesteFormen.each{ |x|
202
276
  if part_from_name_C and (x.gsub(/[()]/, '_')).match(part_from_name_C)
203
277
  puts "feste_form in #{part_from_name_C} matched: #{x}" if $VERBOSE
@@ -238,12 +312,6 @@ module Oddb2xml
238
312
  @measure = x
239
313
  return pkg_size_to_int(pkg_size_L, true)
240
314
  end
241
- if einheit_M and /^#{x}$/i.match(einheit_M)
242
- puts "measurement in einheit_M #{einheit_M} matched: #{x}" if $VERBOSE
243
- update_rule('measurement einheit_M')
244
- @measure = x
245
- return pkg_size_to_int(pkg_size_L, true)
246
- end
247
315
  }
248
316
  puts "Could not find anything for name_C #{part_from_name_C} pkg_size_L: #{pkg_size_L} einheit_M #{einheit_M}" if $VERBOSE
249
317
  update_rule('unbekannt')
@@ -284,18 +352,24 @@ module Oddb2xml
284
352
  @substances = nil
285
353
  @substances = @composition.split(/\s*,(?!\d|[^(]+\))\s*/u).collect { |name| capitalize(name) }.uniq if @composition
286
354
 
287
- name = @name.clone
355
+ name = @name ? @name.clone : ''
288
356
  parts = name.split(',')
289
- if parts.size == 1
357
+ form_name = nil
358
+ if parts.size == 0
359
+ elsif parts.size == 1
290
360
  @@names_without_galenic_forms << name
291
361
  else
292
- form_name = parts[-1].strip
293
- @galenic_form = Calc.get_galenic_form(form_name)
294
- # puts "oid #{UnknownGalenicForm} #{@galenic_form.oid} for #{name}"
295
- if @galenic_form.oid == UnknownGalenicForm
296
- @galenic_form = GalenicForm.new(0, {'de' => form_name}, @@galenic_forms[UnknownGalenicForm] )
297
- @@new_galenic_forms << form_name
298
- end
362
+ parts[1..-1].each{
363
+ |part|
364
+ form_name = part.strip
365
+ @galenic_form = Calc.get_galenic_form(form_name)
366
+ # puts "oid #{UnknownGalenicForm} #{@galenic_form.oid} for #{name}"
367
+ break unless @galenic_form.oid == UnknownGalenicForm
368
+ if @galenic_form.oid == UnknownGalenicForm
369
+ @galenic_form = GalenicForm.new(0, {'de' => form_name}, @@galenic_forms[UnknownGalenicForm] )
370
+ @@new_galenic_forms << form_name
371
+ end
372
+ }
299
373
  end
300
374
  @name = name.strip
301
375
  if @pkg_size.is_a?(Fixnum)
@@ -1,3 +1,3 @@
1
1
  module Oddb2xml
2
- VERSION = "1.9.6"
2
+ VERSION = "1.9.7"
3
3
  end
@@ -1,5 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
+ begin
4
+ require 'pry'
5
+ rescue LoadError
6
+ end
3
7
  require 'pp'
4
8
  require 'spec_helper'
5
9
  require "rexml/document"
@@ -19,12 +23,13 @@ describe Oddb2xml::Calc do
19
23
  end
20
24
 
21
25
  # after each name you find the column of swissmedic_package.xlsx file
22
- TestExample = Struct.new("TestExample", :test_description, :iksnr_A, :seqnr_B, :pack_K, :name_C, :package_size_L, :einheit_M, :composition_P ,
26
+ TestExample = Struct.new("TestExample", :test_description, :iksnr_A, :seqnr_B, :pack_K, :name_C, :package_size_L, :einheit_M, :active_substance_0, :composition_P,
23
27
  :values_to_compare)
24
28
 
25
29
  tst_fluorglukose = TestExample.new('Fluorglukose',
26
30
  51908, 2, 16, "2-Fluorglukose (18-F), Injektionslösung",
27
31
  '0,1 - 80', 'GBq',
32
+ 'fludeoxyglucosum(18-F) zum Kalibrierungszeitpunkt',
28
33
  'fludeoxyglucosum(18-F) zum Kalibrierungszeitpunkt 0.1-8 GBq, dinatrii phosphas dihydricus, natrii dihydrogenophosphas dihydricus, natrii chloridum, antiox.: natrii thiosulfas 1.3-1.9 mg, aqua ad iniectabilia q.s. ad solutionem pro 1 ml.',
29
34
  { :selling_units => 1,
30
35
  :measure => 'GBq',
@@ -34,6 +39,7 @@ describe Oddb2xml::Calc do
34
39
  tst_bicaNova = TestExample.new('bicaNova',
35
40
  58277, 1, 1, "bicaNova 1,5 % Glucose, Peritonealdialyselösung",
36
41
  '1500 ml', '',
42
+ 'natrii chloridum, natrii hydrogenocarbonas, calcii chloridum dihydricum, magnesii chloridum hexahydricum, glucosum anhydricum, natrium, calcium, magnesium, chloridum, hydrogenocarbonas, glucosum',
37
43
  'I) et II) corresp.: natrii chloridum 5.5 g, natrii hydrogenocarbonas 3.36 g, calcii chloridum dihydricum 184 mg, magnesii chloridum hexahydricum 102 mg, glucosum anhydricum 15 g ut glucosum monohydricum, aqua ad iniectabilia q.s. ad solutionem pro 1000 ml.',
38
44
  { :selling_units => 1500,
39
45
  :measure => 'ml',
@@ -43,6 +49,7 @@ describe Oddb2xml::Calc do
43
49
  tst_kamillin = TestExample.new('Kamillin Medipharm, Bad',
44
50
  43454, 1, 101, "Kamillin Medipharm, Bad",
45
51
  '25 x 40', 'ml',
52
+ 'matricariae extractum isopropanolicum liquidum',
46
53
  'haemagglutininum influenzae A (H1N1) (Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A) 15 µg, haemagglutininum influenzae A (H3N2) (Virus-Stamm A/Texas/50/2012 (H3N2)-like: reassortant virus NYMC X-223A) 15 µg, haemagglutininum influenzae B (Virus-Stamm B/Massachusetts/2/2012-like: B/Massachusetts/2/2012) 15 µg, natrii chloridum, kalii chloridum, dinatrii phosphas dihydricus, kalii dihydrogenophosphas, residui: formaldehydum max. 100 µg, octoxinolum-9 max. 500 µg, ovalbuminum max. 0.05 µg, saccharum nihil, neomycinum nihil, aqua ad iniectabilia q.s. ad suspensionem pro 0.5 ml.',
47
54
  { :selling_units => 25,
48
55
  :measure => 'ml',
@@ -52,6 +59,7 @@ describe Oddb2xml::Calc do
52
59
  tst_infloran = TestExample.new('Test Infloran, capsule',
53
60
  679, 2, 12, "Infloran, capsule",
54
61
  '2x10', 'Kapsel(n)',
62
+ 'lactobacillus acidophilus cryodesiccatus, bifidobacterium infantis',
55
63
  'lactobacillus acidophilus cryodesiccatus min. 10^9 CFU, bifidobacterium infantis min. 10^9 CFU, color.: E 127, E 132, E 104, excipiens pro capsula.',
56
64
  { :selling_units => 20,
57
65
  :measure => 'Kapsel(n)',
@@ -61,17 +69,33 @@ describe Oddb2xml::Calc do
61
69
  tst_mutagrip = TestExample.new('Test Mutagrip (Fertigspritzen)',
62
70
  373, 23, 10, "Mutagrip, Suspension zur Injektion",
63
71
  '10 x 0.5 ml', 'Fertigspritze(n)',
72
+ 'ropivacainum',
64
73
  'ropivacaini hydrochloridum 2 mg, natrii chloridum, aqua ad iniectabilia q.s. ad solutionem pro 1 ml.',
65
74
  { :selling_units => 10,
66
75
  :measure => 'Fertigspritze(n)',
67
76
  # :count => 10, :multi => 1, :dose => ''
68
77
  }
69
78
  )
70
-
79
+ tst_nutriflex = TestExample.new('Nutriflex Lipid plus ohne Elektrolyte, Infusionsemulsion 1250ml',
80
+ 56089, 1, 1, 'Nutriflex Lipid plus ohne Elektrolyte, Infusionsemulsion 1250ml',
81
+ '5 x 1250', 'ml',
82
+ 'glucosum anhydricum, isoleucinum, leucinum, lysinum anhydricum, methioninum, phenylalaninum, threoninum, tryptophanum, valinum, argininum, histidinum, alaninum, acidum asparticum, acidum glutamicum, glycinum, prolinum, serinum, aminoacida, carbohydrata, materia crassa, sojae oleum, triglycerida saturata media',
83
+ "I) Glucoselösung: glucosum anhydricum 150 g ut glucosum monohydricum, acidum citricum anhydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
84
+ II) Fettemulsion: sojae oleum 25 g, triglycerida saturata media 25 g, lecithinum ex ovo, glycerolum, natrii oleas, aqua q.s. ad emulsionem.
85
+ III) Aminosäurenlösung: isoleucinum 2.82 g, leucinum 3.76 g, lysinum anhydricum 2.73 g ut lysinum monohydricum, methioninum 2.35 g, phenylalaninum 4.21 g, threoninum 2.18 g, tryptophanum 0.68 g, valinum 3.12 g, argininum 3.24 g, histidinum 1.50 g, alaninum 5.82 g, acidum asparticum 1.80 g, acidum glutamicum 4.21 g, glycinum 1.98 g, prolinum 4.08 g, serinum 3.60 g, acidum citricum anhydricum, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
86
+ .
87
+ I) et II) et III) corresp.: aminoacida 48 g/l, carbohydrata 150 g/l, materia crassa 50 g/l, in emulsione recenter mixta 1250 ml.
88
+ Corresp. 5300 kJ.",
89
+ { # :selling_units => 5,
90
+ # :measure => 'Infusionsemulsion',
91
+ #:count => 25, :multi => 1
92
+ }
93
+ )
71
94
  tst_diamox = TestExample.new('Diamox. Tabletten',
72
95
  21191, 1, 19, 'Diamox, comprimés',
73
96
  '1 x 25', 'Tablette(n)',
74
- 'haemagglutininum influenzae A (H1N1) (Virus-Stamm A/California/7/2009 (H1N1)-like: reassortant virus NYMC X-179A) 15 µg, haemagglutininum influenzae A (H3N2) (Virus-Stamm A/Texas/50/2012 (H3N2)-like: reassortant virus NYMC X-223A) 15 µg, haemagglutininum influenzae B (Virus-Stamm B/Massachusetts/2/2012-like: B/Massachusetts/2/2012) 15 µg, natrii chloridum, kalii chloridum, dinatrii phosphas dihydricus, kalii dihydrogenophosphas, residui: formaldehydum max. 100 µg, octoxinolum-9 max. 500 µg, ovalbuminum max. 0.05 µg, saccharum nihil, neomycinum nihil, aqua ad iniectabilia q.s. ad suspensionem pro 0.5 ml.',
97
+ 'acetazolamidum',
98
+ 'acetazolamidum 250 mg, excipiens pro compresso.',
75
99
  { :selling_units => 25,
76
100
  :measure => 'Tablette(n)',
77
101
  #:count => 25, :multi => 1
@@ -81,13 +105,13 @@ describe Oddb2xml::Calc do
81
105
  tst_naropin = TestExample.new('Das ist eine Injektionslösung von einer Packung mit 5 x 100 ml',
82
106
  54015, 01, 100, "Naropin 0,2 %, Infusionslösung / Injektionslösung",
83
107
  '1 x 5 x 100', 'ml',
108
+ 'ropivacainum',
84
109
  'ropivacaini hydrochloridum 2 mg, natrii chloridum, aqua ad iniectabilia q.s. ad solutionem pro 1 ml.',
85
- { :selling_units => 5,
86
- :measure => 'ml',
110
+ { # :selling_units => 5, TODO:
111
+ # :measure => 'ml',
87
112
  #:count => 5, :multi => 1
88
113
  }
89
114
  )
90
-
91
115
  context 'should return correct value for liquid' do
92
116
  pkg_size_L = '1 x 5 x 200'
93
117
  einheit_M = 'ml'
@@ -106,7 +130,6 @@ describe Oddb2xml::Calc do
106
130
  specify { expect(result.measure).to eq 'ml' }
107
131
  end
108
132
 
109
-
110
133
  context 'should return correct value for Diamox, comprimés' do
111
134
  pkg_size_L = '1 x 25'
112
135
  einheit_M = 'Tablette(n)'
@@ -170,7 +193,7 @@ describe Oddb2xml::Calc do
170
193
  ].each {
171
194
  |tst|
172
195
  context "verify #{tst.iksnr_A} #{tst.name_C}: #{tst.url}" do
173
- info = Calc.new(tst.name_C, tst.package_size_L, tst.einheit_M, tst.composition_P)
196
+ info = Calc.new(tst.name_C, tst.package_size_L, tst.einheit_M, tst.active_substance_0, tst.composition_P)
174
197
  tst.values_to_compare.each do
175
198
  |key, value|
176
199
  context key do
@@ -182,7 +205,7 @@ describe Oddb2xml::Calc do
182
205
  }
183
206
 
184
207
  context 'find correct result for Injektionslösung' do
185
- info = Calc.new(tst_naropin.name_C, tst_naropin.package_size_L, tst_naropin.einheit_M, tst_naropin.composition_P)
208
+ info = Calc.new(tst_naropin.name_C, tst_naropin.package_size_L, tst_naropin.einheit_M, tst_naropin.active_substance_0, tst_naropin.composition_P)
186
209
  specify { expect(tst_naropin.url).to eq 'http://ch.oddb.org/de/gcc/drug/reg/54015/seq/01/pack/100' }
187
210
  specify { expect(info.galenic_form.description).to eq 'Infusionslösung/Injektionslösung' }
188
211
  specify { expect(info.galenic_group.description).to eq 'Injektion/Infusion' }
@@ -195,7 +218,7 @@ describe Oddb2xml::Calc do
195
218
  end
196
219
 
197
220
  context 'find correct result for Inflora, capsule' do
198
- info = Calc.new(tst_infloran.name_C, tst_infloran.package_size_L, tst_infloran.einheit_M, tst_infloran.composition_P)
221
+ info = Calc.new(tst_infloran.name_C, tst_infloran.package_size_L, tst_infloran.einheit_M, tst_infloran.active_substance_0, tst_infloran.composition_P)
199
222
  specify { expect(tst_infloran.url).to eq 'http://ch.oddb.org/de/gcc/drug/reg/00679/seq/02/pack/012' }
200
223
  specify { expect(info.galenic_form.description).to eq 'capsule' }
201
224
  skip { expect(info.galenic_group.description).to eq 'Injektion/Infusion' }
@@ -237,23 +260,43 @@ describe Oddb2xml::Calc do
237
260
  expect(File.exists?(full)).to eq true
238
261
  }
239
262
  xml = File.read(File.join(Oddb2xml::WorkDir, 'oddb_calc.xml'))
263
+ puts xml
240
264
  doc = REXML::Document.new xml
241
- gtin = '7680540151191'
265
+ gtin = '7680540151009'
266
+ ean12 = '7680' + sprintf('%05d',tst_naropin.iksnr_A) + sprintf('%03d',tst_naropin.pack_K)
267
+ ean13 = (ean12 + Oddb2xml.calc_checksum(ean12))
268
+ ean13.should eq gtin
269
+
242
270
  tst_naropin.values_to_compare.each{
243
271
  | key, value |
244
272
  result = XPath.match( doc, "//ARTICLE[GTIN='#{gtin}']/#{key.to_s.upcase}").first.text
245
273
  puts "Testing key #{key.inspect} #{value.inspect} against #{result} seems to fail" unless result == value.to_s
246
274
  result.should eq value.to_s
247
275
  }
276
+
277
+ gtin = '7680560890018'
278
+ ean12 = '7680' + sprintf('%05d',tst_nutriflex.iksnr_A) + sprintf('%03d',tst_nutriflex.pack_K)
279
+ ean13 = (ean12 + Oddb2xml.calc_checksum(ean12))
280
+ ean13.should eq gtin
281
+ tst_nutriflex.values_to_compare.each{
282
+ | key, value |
283
+ result = XPath.match( doc, "//ARTICLE[GTIN='#{gtin}']/#{key.to_s.upcase}").first.text
284
+ puts "Testing key #{key.inspect} #{value.inspect} against #{result} seems to fail" unless result == value.to_s
285
+ result.should eq value.to_s
286
+ }
287
+ XPath.match( doc, "//ARTICLE[GTIN='7680006790124']/COMPOSITIONS/COMPOSITION/NAME").last.text.should eq 'Bifidobacterium Infantis'
288
+ XPath.match( doc, "//ARTICLE[GTIN='7680545250363']/COMPOSITIONS/COMPOSITION/NAME").last.text.should eq 'Alprostadilum'
289
+ # I) Glucoselösung: glucosum anhydricum 150 g ut glucosum monohydricum, natrii dihydrogenophosphas dihydricus 2.34 g, zinci acetas dihydricus 6.58 mg, aqua ad iniectabilia q.s. ad solutionem pro 500 ml.
248
290
  end
249
291
  end
292
+
250
293
  context 'find correct result for Kamillin' do
251
- info = Calc.new(tst_kamillin.name_C, tst_kamillin.package_size_L, tst_kamillin.einheit_M, tst_kamillin.composition_P)
294
+ info = Calc.new(tst_kamillin.name_C, tst_kamillin.package_size_L, tst_kamillin.einheit_M, tst_kamillin.active_substance_0, tst_kamillin.composition_P)
252
295
  specify { expect(info.selling_units).to eq 25 }
253
296
  end
254
297
 
255
298
  context 'find correct result for bicaNova' do
256
- info = Calc.new(tst_bicaNova.name_C, tst_bicaNova.package_size_L, tst_bicaNova.einheit_M, tst_bicaNova.composition_P)
299
+ info = Calc.new(tst_bicaNova.name_C, tst_bicaNova.package_size_L, tst_bicaNova.einheit_M, tst_bicaNova.active_substance_0, tst_bicaNova.composition_P)
257
300
  specify { expect(info.selling_units).to eq 1500 }
258
301
  specify { expect(info.measure).to eq 'ml' }
259
302
  end
@@ -271,54 +314,27 @@ describe Oddb2xml::Calc do
271
314
  specify { expect(res.class).to eq Array }
272
315
  specify { expect(res.first.class).to eq String }
273
316
  end
317
+ context 'find correct result for Nutriflex' do
318
+ info = Calc.new(tst_nutriflex.name_C, tst_nutriflex.package_size_L, tst_nutriflex.einheit_M, tst_nutriflex.active_substance_0, tst_nutriflex.composition_P)
319
+ specify { expect(info.selling_units).to eq 5 }
320
+ skip "Nutriflex Infusionsemulsion"
321
+ # specify { expect(info.galenic_form.description).to eq "Infusionsemulsion" }
322
+ end
274
323
 
275
- end
276
-
277
- missing_tests = "
278
- 1. Das ist eine Injektionslösung von einer Packung mit 5 x 100 ml
279
- 1 x 5 x 100
280
-
281
- 2. Hier muss man schauen ob es sich um ein Injektionspräparat handelt
282
- oder um ein Tabletten, Kapseln, etc.
283
- 2 x 100
284
-
285
- a) Beim Injektionspräparat sind es wohl 2 Ampullen à 100 ml
286
- b) Bei den Tabletten sind es wohl total 200 Stück.
287
-
288
- 3. Das ist ein klarer Fall von einer Lösung, idR wohl Ampullen:
289
- 10 x 2 mL
290
-
291
- 4. Das sind 10 Teebeutel à 1.5g
292
- 10 x 1.5g
293
-
294
- 5. Das sind 20 mg Wirkstoff in einer 10 ml Lösung. 'ml' steht dann in
295
- der Spalte M
296
- 20 mg / 10. Könnte auch so geschrieben sein: 1000mg/50ml oder auch so:
297
- 1 x 50mg/100ml
298
-
299
- 6. 1x1 Urethrastab ist einmal ein Stab. ;)
300
-
301
- 7. 30 (3x10) sind Total 30 Tabletten verteilt auf 3 Blister à 10
302
- Tabletten. Könnte auch so geschrieben sein: 84 (4 x 21)
303
-
304
- 8. 10 + 10 Das sind zehn Ampullen mit einer Trockensubstanz und
305
- nochmals zehn Ampullen mit der Lösung. Das ist ein Kombipräparat.
306
-
307
- 9. 20 x 0.5 g sind zwanzig Einzeldosen à 0.5g.
308
-
309
- 10. Das ist eine Gaze: 1 x 7,5 x 10 cm
310
-
311
- 11. 100 (2 x 50) das sind total 100 Beutel, d.h. zweimal fünfzig Stück.
312
-
313
- 12. 0,1 - 80 GBq Das ist eine Injektionslösung.
314
-
315
- 13. 10 cm x 10 cm imprägnierter Verband. Das ist eine Salbengaze.
316
-
317
- 14. Das ist ein Sauerstofftank: 9000-10000 l
318
-
319
- 15. 360x1 Das ist eine Packung mit 360 Durchstechflaschen.
320
-
321
- 16. 5 + 5 Das sind 10 Durchstechflaschen à 1 Stück.
322
- "
324
+ context 'find correct result compositions' do
325
+ result = Calc.new(nil, nil, nil, 'rutosidum trihydricum, aescinum', 'rutosidum trihydricum 20 mg, aescinum 25 mg, aromatica, excipiens pro compresso.')
326
+ specify { expect(result.compositions.first.name).to eq 'Rutosidum Trihydricum' }
327
+ specify { expect(result.compositions.first.qty).to eq 20}
328
+ specify { expect(result.compositions.first.unit).to eq 'mg'}
329
+ specify { expect(result.compositions[1].name).to eq 'Aescinum' }
330
+ specify { expect(result.compositions[1].qty).to eq 25}
331
+ specify { expect(result.compositions[1].unit).to eq 'mg'}
332
+ end
323
333
 
334
+ context 'should handle CFU' do
335
+ result = Calc.new(nil, nil, nil, 'lactobacillus acidophilus cryodesiccatus, bifidobacterium infantis',
336
+ 'lactobacillus acidophilus cryodesiccatus min. 10^9 CFU, bifidobacterium infantis min. 10^9 CFU, color.: E 127, E 132, E 104, excipiens pro capsula.')
337
+ skip "Infloran, capsule mit cryodesiccatus min. 10^9 CFU"
338
+ end
324
339
 
340
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oddb2xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.6
4
+ version: 1.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhiro Asaka, Zeno R.R. Davatz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-19 00:00:00.000000000 Z
11
+ date: 2015-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip