oddb2xml 2.5.3 → 2.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +5 -0
- data/artikelstamm.md +1 -1
- data/lib/oddb2xml/builder.rb +48 -33
- data/lib/oddb2xml/extractor.rb +30 -19
- data/lib/oddb2xml/util.rb +37 -0
- data/lib/oddb2xml/version.rb +1 -1
- data/spec/artikelstamm_spec.rb +55 -24
- data/spec/builder_spec.rb +2 -2
- data/spec/extractor_spec.rb +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecd8f5025daaf98e1a23e42069c1a0b6f0f71792
|
4
|
+
data.tar.gz: 4f7e3d9fa12579d85c93fa00399584e0185fa1ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c81408b0c1e8afc663825b5fed409f929225ccd529f8d626c17f58b5ad625ed4b382963b74dbaedd427bf6f13b5d454ef421b442e973b73c42f5521b378eb5a4
|
7
|
+
data.tar.gz: d437a60586bc3e47307da01d9aded873f5968bcb411b848b734a951cd029f77b73bba0efefc8e41f25cdecb6550c2ba108045e14336c57b246b97ab3c79555ea
|
data/History.txt
CHANGED
data/artikelstamm.md
CHANGED
@@ -40,7 +40,7 @@ Oder
|
|
40
40
|
* swissmedic_package.csv https://www.swissmedic.ch/dam/swissmedic/de/dokumente/listen/excel-version_zugelasseneverpackungen.xlsx.download.xlsx/excel-version_zugelasseneverpackungen.xlsx
|
41
41
|
* oddb2xml_files_lppv.txt https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/LPPV.txt
|
42
42
|
* XMLPublications.zip http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip Dieses enthält
|
43
|
-
** Preparations.xml
|
43
|
+
** Preparations.xml Hier sind alle Artikel aufgeführt, welche zur Spezialitätenliste (aka SL_ENTRY) gehören
|
44
44
|
* transfer.zip http://pillbox.oddb.org/TRANSFER.ZIP Dieses enthält
|
45
45
|
** transfer.dat
|
46
46
|
|
data/lib/oddb2xml/builder.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require 'nokogiri'
|
4
3
|
require 'oddb2xml/util'
|
5
4
|
require 'oddb2xml/calc'
|
6
5
|
require 'csv'
|
7
|
-
|
8
6
|
class Numeric
|
9
7
|
# round a given number to the nearest step
|
10
8
|
def round_by(increment)
|
@@ -51,7 +49,7 @@ module Oddb2xml
|
|
51
49
|
@options = args
|
52
50
|
@subject = nil
|
53
51
|
@refdata = {}
|
54
|
-
@items = {} # Items from Preparations.xml in BAG, using
|
52
|
+
@items = {} # Spezailitäteniste: SL-Items from Preparations.xml in BAG, using GTINS as key
|
55
53
|
@flags = {}
|
56
54
|
@lppvs = {}
|
57
55
|
@infos = {}
|
@@ -1399,47 +1397,57 @@ module Oddb2xml
|
|
1399
1397
|
end
|
1400
1398
|
def emit_items(xml)
|
1401
1399
|
nr_items = 0
|
1402
|
-
|
1403
|
-
@
|
1400
|
+
gtins_to_article = {}
|
1401
|
+
@articles.each {|article| gtins_to_article[article[:ean13]] = article }
|
1402
|
+
sl_gtins = @items.values.collect{|x| x[:packages].keys}.flatten.uniq;
|
1403
|
+
gtins = gtins_to_article.keys + @infos_zur_rose.keys + @packs.values.collect{|x| x[:ean13]} + sl_gtins
|
1404
|
+
gtins = (gtins-@@gtin2ignore)
|
1405
|
+
gtins.sort!.uniq!
|
1406
|
+
gtins.each do |ean13|
|
1404
1407
|
pac,no8 = nil,ean13.to_s[4..11] # BAG-XML(SL/LS)
|
1405
1408
|
next if ean13 == 0
|
1406
|
-
obj =
|
1409
|
+
obj = gtins_to_article[ean13] || @items.values.find{|x| x[:packages].keys.index(ean13) } || @infos_zur_rose[ean13]
|
1407
1410
|
if obj
|
1408
1411
|
obj = @packs[no8].merge(obj) if @packs[no8]
|
1409
1412
|
else
|
1410
1413
|
obj = @packs[no8] # obj not yet in refdata. Use data from swissmedic_package.xlsx
|
1411
1414
|
end
|
1412
1415
|
nr_items += 1
|
1413
|
-
Oddb2xml.log "build_article #{nr_items} of #{
|
1416
|
+
Oddb2xml.log "build_article #{nr_items} of #{gtins.size} articles" if nr_items % 5000 == 0
|
1414
1417
|
item = @items[ean13]
|
1415
1418
|
pack_info = nil
|
1416
1419
|
pack_info = @packs[no8] if no8 && /#{ean13}/.match(@packs[no8].to_s) # info from Packungen.xlsx from swissmedic_info
|
1417
1420
|
next if pack_info && /Tierarzneimittel/.match(pack_info[:list_code])
|
1418
1421
|
next if obj[:desc_de] && /ad us vet/i.match(obj[:desc_de])
|
1419
1422
|
sequence = obj[:seq]
|
1420
|
-
|
1421
|
-
|
1422
|
-
|
1423
|
-
obj[:seq] = sequence.clone
|
1424
|
-
end
|
1423
|
+
if sequence.nil? && @packs[no8] && /#{ean13}/.match(@packs[no8].to_s)
|
1424
|
+
sequence = {:packages =>{ean13 => @packs[no8]}}
|
1425
|
+
obj[:seq] = sequence.clone
|
1425
1426
|
end
|
1426
|
-
if
|
1427
|
-
|
1427
|
+
if sequence.nil? && @items[ean13] && @items[ean13][:packages][ean13]
|
1428
|
+
sequence = @items[ean13]
|
1428
1429
|
end
|
1429
1430
|
if sequence
|
1430
|
-
|
1431
|
+
if obj[:seq] && !obj[:seq][:packages].keys.index(ean13)
|
1431
1432
|
# puts "unable to find #{ean13} in #{obj[:seq][:packages].keys}"
|
1432
1433
|
next
|
1433
1434
|
end
|
1434
1435
|
sequence[:packages].each do |gtin, package|
|
1435
1436
|
pkg_gtin = package[:ean13].clone
|
1437
|
+
if package[:no8] && (newEan13 = Oddb2xml.getEan13forNo8(package[:no8]))
|
1438
|
+
if !newEan13.eql?(pkg_gtin)
|
1439
|
+
puts "Setting #{newEan13} for #{pkg_gtin}"
|
1440
|
+
pkg_gtin = newEan13
|
1441
|
+
end
|
1442
|
+
end
|
1436
1443
|
pharma_code = @refdata[pkg_gtin]
|
1437
1444
|
if @refdata[pkg_gtin] && @refdata[pkg_gtin][:pharmacode]
|
1438
1445
|
pharma_code = @refdata[pkg_gtin][:pharmacode]
|
1439
|
-
|
1446
|
+
elsif obj[:pharmacode]
|
1440
1447
|
pharma_code = obj[:pharmacode]
|
1448
|
+
elsif @infos_zur_rose[ean13]
|
1449
|
+
pharma_code = @infos_zur_rose[ean13][:pharmacode]
|
1441
1450
|
end
|
1442
|
-
#
|
1443
1451
|
info = @calc_items[pkg_gtin]
|
1444
1452
|
if @@emitted_v5_gtins.index(pkg_gtin)
|
1445
1453
|
next
|
@@ -1448,17 +1456,30 @@ module Oddb2xml
|
|
1448
1456
|
end
|
1449
1457
|
options = {'PHARMATYPE' => 'P'}
|
1450
1458
|
xml.ITEM(options) do
|
1451
|
-
|
1459
|
+
# require 'pry'; binding.pry if pkg_gtin.to_i == 7680665990026
|
1460
|
+
name = item[:name_de] + ' ' + item[:desc_de].strip + ' ' + package[:desc_de] if package && package[:desc_de]
|
1461
|
+
name ||= @refdata[pkg_gtin] ? @refdata[pkg_gtin][:desc_de] : nil
|
1462
|
+
name ||= @infos_zur_rose[ean13][:description] if @infos_zur_rose[ean13]
|
1463
|
+
name ||= obj[:name_de] + ', ' + obj[:desc_de].strip if obj[:name_de]
|
1464
|
+
name ||= (item[:desc_de] + item[:name_de]) if item
|
1465
|
+
name ||= obj[:sequence_name]
|
1452
1466
|
xml.GTIN pkg_gtin.to_s.rjust(13, '0')
|
1453
1467
|
override(xml, pkg_gtin, :PHAR, pharma_code)
|
1454
1468
|
xml.SALECD('A')
|
1455
1469
|
# maxLength for DSCR is 50 for Artikelstamm v3
|
1456
1470
|
xml.DSCR(name) # for description for zur_rose
|
1457
|
-
|
1471
|
+
name_fr = item[:name_fr] + ' ' + item[:desc_fr].strip + ' ' + package[:desc_fr] if package && package[:desc_fr]
|
1472
|
+
name_fr ||= @refdata[pkg_gtin] ? @refdata[pkg_gtin][:desc_fr] : nil
|
1473
|
+
# Zugelassenen Packungen has only german names
|
1474
|
+
name_fr ||= (obj[:name_fr] + ', ' + obj[:desc_fr]).strip if obj[:name_fr]
|
1475
|
+
# ZuRorse has only german names
|
1476
|
+
name_fr ||= (item[:name_fr] + ', ' + item[:desc_fr]) if item
|
1477
|
+
name_fr ||= '--missing--'
|
1478
|
+
xml.DSCRF(name_fr)
|
1458
1479
|
xml.COMP do # Manufacturer
|
1459
1480
|
xml.NAME obj[:company_name]
|
1460
1481
|
xml.GLN obj[:company_ean]
|
1461
|
-
end
|
1482
|
+
end if obj[:company_name] || obj[:company_ean]
|
1462
1483
|
pexf = ppub = nil
|
1463
1484
|
if package[:prices]
|
1464
1485
|
pexf ||= package[:prices][:exf_price][:price]
|
@@ -1492,16 +1513,15 @@ module Oddb2xml
|
|
1492
1513
|
xml.DOSAGE_FORM info.galenic_form.descriptions['de'] if info.galenic_form.descriptions['de']
|
1493
1514
|
xml.DOSAGE_FORMF info.galenic_form.descriptions['fr'] if info.galenic_form.descriptions['fr']
|
1494
1515
|
end
|
1495
|
-
xml.SL_ENTRY 'true' if
|
1516
|
+
xml.SL_ENTRY 'true' if sl_gtins.index(pkg_gtin)
|
1496
1517
|
xml.IKSCAT package[:swissmedic_category] if package[:swissmedic_category] && package[:swissmedic_category].length > 0
|
1497
1518
|
xml.GENERIC_TYPE sequence[:org_gen_code] if sequence[:org_gen_code] && !sequence[:org_gen_code].empty?
|
1498
1519
|
xml.LPPV 'true' if @lppvs[pkg_gtin.to_s] # detect_nincd
|
1499
1520
|
case item[:deductible]
|
1500
|
-
|
1501
|
-
|
1502
|
-
else # xml.DEDUCTIBLE '' # k.A.
|
1521
|
+
when 'Y'; xml.DEDUCTIBLE 20; # 20%
|
1522
|
+
when 'N'; xml.DEDUCTIBLE 10; # 10%
|
1503
1523
|
end if item && item[:deductible]
|
1504
|
-
prodno =
|
1524
|
+
prodno = Oddb2xml.getProdnoForEan13(pkg_gtin)
|
1505
1525
|
xml.PRODNO prodno if prodno
|
1506
1526
|
csv = []
|
1507
1527
|
@csv_file << [pkg_gtin, name, package[:unit], measure,
|
@@ -1562,7 +1582,7 @@ module Oddb2xml
|
|
1562
1582
|
@nr_articles = 0
|
1563
1583
|
used_limitations = []
|
1564
1584
|
Oddb2xml.log "#{variant}: Deleted #{@old_rose_size - @new_rose_size} entries from ZurRose where GTIN start with 7680 (Swissmedic)"
|
1565
|
-
# Oddb2xml.log "#{variant} #{nr_products} of #{@products.size} articles and ignore #{@@gtin2ignore.size}
|
1585
|
+
# Oddb2xml.log "#{variant} #{nr_products} of #{@products.size} articles and ignore #{@@gtin2ignore.size} gtins specified via #{@@ignore_file}"
|
1566
1586
|
_builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
|
1567
1587
|
xml.doc.tag_suffix = @tag_suffix
|
1568
1588
|
datetime = Time.new.strftime('%FT%T%z')
|
@@ -1578,11 +1598,6 @@ module Oddb2xml
|
|
1578
1598
|
no8_to_prodno = {}
|
1579
1599
|
@packs.collect{ |key, val| no8_to_prodno[key] = val [:prodno] }
|
1580
1600
|
xml.comment("Produced by #{__FILE__} version #{VERSION} at #{Time.now}")
|
1581
|
-
@gtins_to_article = {}
|
1582
|
-
@articles.each {|article| @gtins_to_article[article[:ean13]] = article }
|
1583
|
-
@gtins = @gtins_to_article.keys + @infos_zur_rose.keys + @packs.values.collect{|x| x[:ean13]}
|
1584
|
-
@gtins = (@gtins-@@gtin2ignore)
|
1585
|
-
@gtins.sort!.uniq!
|
1586
1601
|
xml.ARTIKELSTAMM(options_xml) do
|
1587
1602
|
xml.PRODUCTS do
|
1588
1603
|
products = @products.sort_by { |ean13, obj| ean13 }
|
@@ -1603,7 +1618,7 @@ module Oddb2xml
|
|
1603
1618
|
next if emitted_prodno.index(prodno)
|
1604
1619
|
sequence ||= @articles.find{|x| x[:ean13].eql?(ean)}
|
1605
1620
|
next unless sequence && (sequence[:name_de] || sequence[:desc_de])
|
1606
|
-
if
|
1621
|
+
if Oddb2xml.getEan13forProdno(prodno).size == 0
|
1607
1622
|
puts "No item found for prodno #{prodno} no8 #{obj[:no8]} #{sequence[:name_de]} "
|
1608
1623
|
next
|
1609
1624
|
end
|
@@ -1666,7 +1681,7 @@ module Oddb2xml
|
|
1666
1681
|
lines << " - #{sprintf('%5d', @products.size)} products"
|
1667
1682
|
lines << " - #{sprintf('%5d', @limitations.size)} limitations"
|
1668
1683
|
lines << " - #{sprintf('%5d', @nr_articles)} articles"
|
1669
|
-
lines << " - #{sprintf('%5d', @@gtin2ignore.size)} ignored
|
1684
|
+
lines << " - #{sprintf('%5d', @@gtin2ignore.size)} ignored GTINS"
|
1670
1685
|
@@articlestamm_v5_info_lines = lines
|
1671
1686
|
_builder.to_xml({:indent => 4, :encoding => 'UTF-8'})
|
1672
1687
|
end
|
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -38,6 +38,10 @@ module Oddb2xml
|
|
38
38
|
data = {}
|
39
39
|
result = PreparationsEntry.parse(@xml.sub(Strip_For_Sax_Machine, ''), :lazy => true)
|
40
40
|
result.Preparations.Preparation.each do |seq|
|
41
|
+
if seq.SwissmedicNo5.eql?('0')
|
42
|
+
puts "BagXmlExtractor Skipping SwissmedicNo5 0 for #{seq.NameDe} #{seq.DescriptionDe} #{seq.CommentDe}"
|
43
|
+
next
|
44
|
+
end
|
41
45
|
item = {}
|
42
46
|
item[:data_origin] = 'bag_xml'
|
43
47
|
item[:refdata] = true
|
@@ -72,19 +76,21 @@ module Oddb2xml
|
|
72
76
|
item[:packages] = {} # pharmacode => package
|
73
77
|
seq.Packs.Pack.each do |pac|
|
74
78
|
if pac.SwissmedicNo8 && pac.SwissmedicNo8.length < 8
|
75
|
-
puts "BagXmlExtractor: Adding leading zeros for SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}"
|
79
|
+
puts "BagXmlExtractor: Adding leading zeros for SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}" if $VERBOSE
|
76
80
|
pac.SwissmedicNo8 = pac.SwissmedicNo8.rjust(8, '0')
|
77
81
|
end
|
78
82
|
unless pac.GTIN
|
79
83
|
unless pac.SwissmedicNo8
|
80
|
-
puts "BagXmlExtractor:
|
84
|
+
puts "BagXmlExtractor: Missing GTIN and SwissmedicNo8 in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}"
|
85
|
+
next
|
81
86
|
else
|
82
87
|
ean12 = '7680' + pac.SwissmedicNo8
|
83
88
|
pac.GTIN = (ean12 + Oddb2xml.calc_checksum(ean12)) unless @artikelstamm
|
84
|
-
puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
|
89
|
+
# puts "BagXmlExtractor: Missing GTIN in SwissmedicNo8 #{pac.SwissmedicNo8} BagDossierNo #{pac.BagDossierNo} PackId #{pac.PackId} #{item[:name_de]}."
|
85
90
|
end
|
86
91
|
end
|
87
92
|
ean13 = pac.GTIN.to_s
|
93
|
+
Oddb2xml.setEan13forNo8(pac.SwissmedicNo8, ean13) if pac.SwissmedicNo8
|
88
94
|
# packages
|
89
95
|
exf = {:price => '', :valid_date => '', :price_code => ''}
|
90
96
|
if pac.Prices and pac.Prices.ExFactoryPrice
|
@@ -100,6 +106,11 @@ module Oddb2xml
|
|
100
106
|
end
|
101
107
|
item[:packages][ean13] = {
|
102
108
|
:ean13 => ean13,
|
109
|
+
:name_de => (desc = seq.NameDe) ? desc : '',
|
110
|
+
:name_fr => (desc = seq.NameFr) ? desc : '',
|
111
|
+
:desc_de => (desc = pac.DescriptionDe) ? desc : '',
|
112
|
+
:desc_fr => (desc = pac.DescriptionFr) ? desc : '',
|
113
|
+
:sl_entry => true,
|
103
114
|
:swissmedic_category => (cat = pac.SwissmedicCategory) ? cat : '',
|
104
115
|
:swissmedic_number8 => (num = pac.SwissmedicNo8) ? num : '',
|
105
116
|
:prices => { :exf_price => exf, :pub_price => pub },
|
@@ -168,6 +179,14 @@ module Oddb2xml
|
|
168
179
|
# limitation points
|
169
180
|
pts = pac.PointLimitations.PointLimitation.first # only first points
|
170
181
|
item[:packages][ean13][:limitation_points] = pts ? pts.Points : ''
|
182
|
+
if pac.SwissmedicNo8
|
183
|
+
ean12 = '7680' + pac.SwissmedicNo8
|
184
|
+
correct_ean13 = ean12+ Oddb2xml.calc_checksum(ean12)
|
185
|
+
unless pac.GTIN.eql?(correct_ean13)
|
186
|
+
puts "pac.GTIN #{pac.GTIN} should be #{correct_ean13}"
|
187
|
+
item[:packages][ean13][:CORRECT_EAN13] = correct_ean13
|
188
|
+
end
|
189
|
+
end
|
171
190
|
data[ean13] = item
|
172
191
|
end
|
173
192
|
end
|
@@ -196,11 +215,12 @@ module Oddb2xml
|
|
196
215
|
end
|
197
216
|
# but in refdata_nonPharma we have a about 700 GTINs which are 14 characters and longer
|
198
217
|
item = {}
|
218
|
+
item[:ean13] = ean13
|
219
|
+
item[:no8] = pac.SWMC_AUTHNR
|
220
|
+
item[:pharmacode] = (phar = pac.PHAR.to_s) ? phar: '0'
|
199
221
|
item[:data_origin] = 'refdata'
|
200
222
|
item[:refdata] = true
|
201
223
|
item[:_type] = (typ = pac.ATYPE.downcase.to_sym) ? typ: ''
|
202
|
-
item[:ean13] = ean13
|
203
|
-
item[:pharmacode] = (phar = pac.PHAR.to_s) ? phar: '0'
|
204
224
|
item[:last_change] = (date = Time.parse(pac.DT).to_s) ? date: '' # Date and time of last data change
|
205
225
|
item[:desc_de] = (dscr = pac.NAME_DE) ? dscr: ''
|
206
226
|
item[:desc_fr] = (dscr = pac.NAME_FR) ? dscr: ''
|
@@ -225,17 +245,8 @@ module Oddb2xml
|
|
225
245
|
@type = type
|
226
246
|
Oddb2xml.log("SwissmedicExtractor #{@filename} #{File.size(@filename)} bytes")
|
227
247
|
return unless File.exists?(@filename)
|
228
|
-
@@prodno_to_ean13 = {}
|
229
|
-
@@ean13_to_prodno = {}
|
230
248
|
@sheet = RubyXL::Parser.parse(File.expand_path(@filename)).worksheets[0]
|
231
249
|
end
|
232
|
-
# Needed for ensuring consitency for the Artikelstamm
|
233
|
-
def self.getEan13forProdno(prodno)
|
234
|
-
@@prodno_to_ean13[prodno] || []
|
235
|
-
end
|
236
|
-
def self.getProdnoForEan13(ean13)
|
237
|
-
@@ean13_to_prodno[ean13]
|
238
|
-
end
|
239
250
|
def to_arry
|
240
251
|
data = []
|
241
252
|
return data unless @sheet
|
@@ -304,15 +315,14 @@ module Oddb2xml
|
|
304
315
|
ean_base12 = "7680#{no8}"
|
305
316
|
prodno = Oddb2xml.gen_prodno(row[iksnr].value.to_i, row[seqnr].value.to_i)
|
306
317
|
ean13 = (ean_base12.ljust(12, '0') + Oddb2xml.calc_checksum(ean_base12))
|
307
|
-
|
308
|
-
|
309
|
-
@@ean13_to_prodno[ean13] = prodno
|
318
|
+
Oddb2xml.setEan13forProdno(prodno, ean13)
|
319
|
+
Oddb2xml.setEan13forNo8(no8, ean13)
|
310
320
|
data[no8] = {
|
321
|
+
:no8 => no8,
|
311
322
|
:ean13 => ean13,
|
312
323
|
:prodno => prodno,
|
313
324
|
:seqnr => row[seqnr].value,
|
314
|
-
|
315
|
-
:ith_swissmedic => row[ith] ? row[ith].value.to_s : '',
|
325
|
+
:ith_swissmedic => row[ith] ? row[ith].value.to_s : '',
|
316
326
|
:swissmedic_category => row[cat].value.to_s,
|
317
327
|
:atc_code => row[atc] ? Oddb2xml.add_epha_changes_for_ATC(row[iksnr].value.to_s, row[atc].value.to_s) : '',
|
318
328
|
:list_code => row[list_code] ? row[list_code].value.to_s : '',
|
@@ -513,6 +523,7 @@ module Oddb2xml
|
|
513
523
|
while line = @io.gets
|
514
524
|
ean13 = "-1"
|
515
525
|
line = Oddb2xml.patch_some_utf8(line).chomp
|
526
|
+
# next unless /(7680\d{9})(\d{1})$/.match(line) # Skip non pharma
|
516
527
|
next if line =~ /(ad us\.* vet)|(\(vet\))/i
|
517
528
|
if @@extended
|
518
529
|
next unless line =~ /(\d{13})(\d{1})$/
|
data/lib/oddb2xml/util.rb
CHANGED
@@ -185,4 +185,41 @@ module Oddb2xml
|
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
+
# Needed for ensuring consistency for the Artikelstamm
|
189
|
+
@@prodno_to_ean13 = {}
|
190
|
+
@@no8_to_ean13 = {}
|
191
|
+
@@ean13_to_prodno = {}
|
192
|
+
@@ean13_to_no8 = {}
|
193
|
+
def Oddb2xml.setEan13forProdno(prodno, ean13)
|
194
|
+
if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
|
195
|
+
puts "setEan13forProdno #{prodno} ean13 #{ean13}"
|
196
|
+
end
|
197
|
+
@@prodno_to_ean13[prodno] ||= []
|
198
|
+
@@prodno_to_ean13[prodno] << ean13
|
199
|
+
@@ean13_to_prodno[ean13] = prodno
|
200
|
+
end
|
201
|
+
def Oddb2xml.setEan13forNo8(no8, ean13)
|
202
|
+
if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
|
203
|
+
puts "setEan13forNo8 #{no8} ean13 #{ean13}"
|
204
|
+
end
|
205
|
+
if @@no8_to_ean13[no8].nil?
|
206
|
+
@@no8_to_ean13[no8] = ean13
|
207
|
+
@@ean13_to_no8[ean13] = no8
|
208
|
+
elsif !@@no8_to_ean13[no8].eql?(ean13)
|
209
|
+
puts "@@no8_to_ean13[no8] #{@@no8_to_ean13[no8]} not overridden by #{ean13}"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
def Oddb2xml.getEan13forProdno(prodno)
|
213
|
+
@@prodno_to_ean13[prodno] || []
|
214
|
+
end
|
215
|
+
def Oddb2xml.getEan13forNo8(no8)
|
216
|
+
@@no8_to_ean13[no8] || []
|
217
|
+
end
|
218
|
+
def Oddb2xml.getProdnoForEan13(ean13)
|
219
|
+
@@ean13_to_prodno[ean13]
|
220
|
+
end
|
221
|
+
def Oddb2xml.getNo8ForEan13(ean13)
|
222
|
+
@@ean13_to_no8[ean13]
|
223
|
+
end
|
224
|
+
|
188
225
|
end
|
data/lib/oddb2xml/version.rb
CHANGED
data/spec/artikelstamm_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe Oddb2xml::Builder do
|
|
24
24
|
unless @inhalt.index(expected_value)
|
25
25
|
puts expected_value
|
26
26
|
end
|
27
|
-
binding.pry unless @inhalt.index(expected_value)
|
27
|
+
# binding.pry unless @inhalt.index(expected_value)
|
28
28
|
expect(@inhalt.index(expected_value)).not_to be nil
|
29
29
|
end
|
30
30
|
def common_run_init(options = {})
|
@@ -121,7 +121,7 @@ describe Oddb2xml::Builder do
|
|
121
121
|
it 'should find price from Preparations.xml by setting' do
|
122
122
|
expect(File.exists?(@elexis_v5_csv)).to eq true
|
123
123
|
inhalt = File.open(@elexis_v5_csv, 'r+').read
|
124
|
-
expected = %(7680658560014,"
|
124
|
+
expected = %(7680658560014,"Dibase 10'000, Tropfen 10000 IE/ml",Flasche(n),Flasche(n),5,9.25,6585601,A11CC05,cholecalciferolum,,07.02.3.,SL)
|
125
125
|
expect(inhalt.index(expected)).to be > 0
|
126
126
|
end
|
127
127
|
|
@@ -139,7 +139,7 @@ describe Oddb2xml::Builder do
|
|
139
139
|
it 'should have a price for Lynparza' do
|
140
140
|
expect(File.exists?(@elexis_v5_csv)).to eq true
|
141
141
|
inhalt = File.open(@elexis_v5_csv, 'r+').read
|
142
|
-
expect(inhalt.index('7680651600014,
|
142
|
+
expect(inhalt.index('7680651600014,Lynparza Kaps 50 mg 448 Stk,,Kapsel(n),5562.48,5947.55,,,,"",,SL')).not_to be nil
|
143
143
|
end
|
144
144
|
it 'should trim the ean13 to 13 length' do
|
145
145
|
gtin14 = "00040565124346"
|
@@ -217,32 +217,46 @@ describe Oddb2xml::Builder do
|
|
217
217
|
<GTIN>7680658560014</GTIN>
|
218
218
|
<!--override with-->
|
219
219
|
<SALECD>A</SALECD>
|
220
|
-
<DSCR>
|
221
|
-
<DSCRF
|
220
|
+
<DSCR>Dibase 10'000, Tropfen 10000 IE/ml</DSCR>
|
221
|
+
<DSCRF>Dibase 10'000, gouttes 10000 UI/ml</DSCRF>
|
222
|
+
<COMP>
|
223
|
+
<NAME>Gebro Pharma AG</NAME>
|
224
|
+
<GLN/>
|
225
|
+
</COMP>
|
226
|
+
<PEXF>5</PEXF>
|
227
|
+
<PPUB>9.25</PPUB>
|
228
|
+
<PKG_SIZE>1</PKG_SIZE>
|
229
|
+
<MEASURE>Flasche(n)</MEASURE>
|
230
|
+
<MEASUREF>Flasche(n)</MEASUREF>
|
231
|
+
<DOSAGE_FORM>orale Tropflösung</DOSAGE_FORM>
|
232
|
+
<SL_ENTRY>true</SL_ENTRY>
|
233
|
+
<IKSCAT>D</IKSCAT>
|
234
|
+
<DEDUCTIBLE>10</DEDUCTIBLE>
|
235
|
+
<PRODNO>6585601</PRODNO>
|
236
|
+
</ITEM>)
|
222
237
|
expect(@inhalt.index(expected)).not_to be nil
|
223
238
|
end
|
224
239
|
|
225
|
-
it 'should contain a public price if the item was only in the SL liste (Preparations.xml)' do
|
226
|
-
# same as 7680403330459 CARBADERM
|
227
|
-
expect(@inhalt.index('<PPUB>27.70</PPUB>')).not_to be nil
|
228
|
-
end
|
229
240
|
it 'should contain PEVISONE Creme 30 g' do
|
230
|
-
expect(@inhalt.index('
|
231
|
-
expect(@inhalt.index('
|
241
|
+
expect(@inhalt.index('Pevisone Creme 15 g')).not_to be nil # 7680406620144
|
242
|
+
expect(@inhalt.index('Pevisone Creme 30 g')).not_to be nil # 7680406620229
|
232
243
|
# Should also check for price!
|
233
244
|
end
|
234
245
|
it 'should validate against artikelstamm.xsd' do
|
235
246
|
validate_via_xsd(@elexis_v5_xsd, @artikelstamm_name)
|
236
247
|
end
|
237
|
-
tests = { 'item 7680403330459 CARBADERM only in Preparations(SL)' =>
|
248
|
+
tests = { 'item 7680403330459 CARBADERM only in Preparations(SL) with public price' =>
|
238
249
|
%(<ITEM PHARMATYPE="P">
|
239
250
|
<GTIN>7680403330459</GTIN>
|
240
251
|
<PHAR>3603779</PHAR>
|
241
252
|
<SALECD>A</SALECD>
|
242
|
-
<DSCR>
|
243
|
-
<DSCRF
|
244
|
-
<PEXF>
|
245
|
-
<PPUB>
|
253
|
+
<DSCR>Carbaderm Creme Tb 300 ml</DSCR>
|
254
|
+
<DSCRF>Carbaderm crème tb 300 ml</DSCRF>
|
255
|
+
<PEXF>14.61</PEXF>
|
256
|
+
<PPUB>26.95</PPUB>
|
257
|
+
<SL_ENTRY>true</SL_ENTRY>
|
258
|
+
<IKSCAT>D</IKSCAT>
|
259
|
+
<DEDUCTIBLE>10</DEDUCTIBLE>
|
246
260
|
</ITEM>),
|
247
261
|
'item 4042809018288 TENSOPLAST' =>
|
248
262
|
%(<ITEM PHARMATYPE="N">
|
@@ -296,13 +310,13 @@ describe Oddb2xml::Builder do
|
|
296
310
|
<DEDUCTIBLE>10</DEDUCTIBLE>
|
297
311
|
<PRODNO>5366201</PRODNO>
|
298
312
|
</ITEM>),
|
299
|
-
'item 7680161050583 HIRUDOID' =>
|
313
|
+
'item 7680161050583 HIRUDOID 40g' =>
|
300
314
|
%(<ITEM PHARMATYPE="P">
|
301
315
|
<GTIN>7680161050583</GTIN>
|
302
316
|
<PHAR>2731179</PHAR>
|
303
317
|
<SALECD>A</SALECD>
|
304
|
-
<DSCR>
|
305
|
-
<DSCRF>
|
318
|
+
<DSCR>Hirudoid Creme 3 mg/g 40 g</DSCR>
|
319
|
+
<DSCRF>Hirudoid crème 3 mg/g 40 g</DSCRF>
|
306
320
|
<COMP>
|
307
321
|
<NAME>Medinova AG</NAME>
|
308
322
|
<GLN>7601001002258</GLN>
|
@@ -318,12 +332,29 @@ describe Oddb2xml::Builder do
|
|
318
332
|
<DEDUCTIBLE>10</DEDUCTIBLE>
|
319
333
|
<PRODNO>1610501</PRODNO>
|
320
334
|
</ITEM>),
|
335
|
+
'item 7680161050743 100g ' =>
|
336
|
+
%( <ITEM PHARMATYPE="P">
|
337
|
+
<GTIN>7680161050743</GTIN>
|
338
|
+
<PHAR>2731179</PHAR>
|
339
|
+
<SALECD>A</SALECD>
|
340
|
+
<DSCR>Hirudoid Creme 3 mg/g 100 g</DSCR>
|
341
|
+
<DSCRF>Hirudoid crème 3 mg/g 100 g</DSCRF>
|
342
|
+
<COMP>
|
343
|
+
<NAME>Medinova AG</NAME>
|
344
|
+
<GLN>7601001002258</GLN>
|
345
|
+
</COMP>
|
346
|
+
<PEXF>9.555316</PEXF>
|
347
|
+
<PPUB>17.65</PPUB>
|
348
|
+
<SL_ENTRY>true</SL_ENTRY>
|
349
|
+
<IKSCAT>D</IKSCAT>
|
350
|
+
<DEDUCTIBLE>10</DEDUCTIBLE>
|
351
|
+
</ITEM>),
|
321
352
|
'item 7680284860144 ANCOPIR' =>'<ITEM PHARMATYPE="P">
|
322
353
|
<GTIN>7680284860144</GTIN>
|
323
354
|
<PHAR>0177804</PHAR>
|
324
355
|
<SALECD>A</SALECD>
|
325
|
-
<DSCR>
|
326
|
-
<DSCRF
|
356
|
+
<DSCR>ANCOPIR Inj Lös 5 Amp 2 ml</DSCR>
|
357
|
+
<DSCRF>Ancopir, sol inj</DSCRF>
|
327
358
|
<COMP>
|
328
359
|
<NAME>Dr. Grossmann AG, Pharmaca</NAME>
|
329
360
|
<GLN/>
|
@@ -340,7 +371,7 @@ describe Oddb2xml::Builder do
|
|
340
371
|
<DEDUCTIBLE>10</DEDUCTIBLE>
|
341
372
|
<PRODNO>2848601</PRODNO>
|
342
373
|
</ITEM>',
|
343
|
-
'
|
374
|
+
'FERRO-GRADUMET price from ZurRose ' => %(<ITEM PHARMATYPE="P">
|
344
375
|
<GTIN>7680316440115</GTIN>
|
345
376
|
<PHAR>0020244</PHAR>
|
346
377
|
<SALECD>A</SALECD>
|
@@ -389,8 +420,8 @@ describe Oddb2xml::Builder do
|
|
389
420
|
<GTIN>7680532900196</GTIN>
|
390
421
|
<PHAR>1699999</PHAR>
|
391
422
|
<SALECD>A</SALECD>
|
392
|
-
<DSCR>
|
393
|
-
<DSCRF>
|
423
|
+
<DSCR>Humalog Inj Lös Durchstf 10 ml</DSCR>
|
424
|
+
<DSCRF>Humalog sol inj flac 10 ml</DSCRF>
|
394
425
|
<COMP>
|
395
426
|
<NAME>Eli Lilly (Suisse) SA</NAME>
|
396
427
|
<GLN>7601001261853</GLN>
|
data/spec/builder_spec.rb
CHANGED
@@ -456,7 +456,7 @@ def checkProductXml(nbr_record = -1)
|
|
456
456
|
expect(desitin.elements['SubstanceSwissmedic'].text).to eq 'levetiracetamum'
|
457
457
|
expect(desitin.elements['CompositionSwissmedic'].text).to eq 'levetiracetamum 250 mg, excipiens pro compressi obducti pro charta.'
|
458
458
|
expect(desitin.elements['CPT/CPTCMP/LINE'].text).to eq '0'
|
459
|
-
expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '
|
459
|
+
expect(desitin.elements['CPT/CPTCMP/SUBNO'].text).to eq '13'
|
460
460
|
expect(desitin.elements['CPT/CPTCMP/QTY'].text).to eq '250'
|
461
461
|
expect(desitin.elements['CPT/CPTCMP/QTYU'].text).to eq 'mg'
|
462
462
|
|
@@ -474,7 +474,7 @@ end
|
|
474
474
|
|
475
475
|
describe Oddb2xml::Builder do
|
476
476
|
NrExtendedArticles = 74
|
477
|
-
NrSubstances =
|
477
|
+
NrSubstances = 27
|
478
478
|
NrLimitations = 14
|
479
479
|
|
480
480
|
NrInteractions = 2
|
data/spec/extractor_spec.rb
CHANGED
@@ -69,6 +69,7 @@ describe Oddb2xml::RefdataExtractor do
|
|
69
69
|
:refdata=>true,
|
70
70
|
:_type=>:pharma,
|
71
71
|
:ean13=> Oddb2xml::LEVETIRACETAM_GTIN.to_s,
|
72
|
+
:no8 => "62069008",
|
72
73
|
:pharmacode=> pharma_code_LEVETIRACETAM,
|
73
74
|
:data_origin => "refdata",
|
74
75
|
:desc_de=>"LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk",
|
@@ -95,6 +96,7 @@ describe Oddb2xml::RefdataExtractor do
|
|
95
96
|
expected = {:refdata=>true,
|
96
97
|
:_type=>:nonpharma,
|
97
98
|
:ean13=>'7611600441020',
|
99
|
+
:no8 => nil,
|
98
100
|
:pharmacode=>pharma_code_TUBEGAZE,
|
99
101
|
:last_change => @@last_change,
|
100
102
|
:data_origin => "refdata",
|
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: 2.5.
|
4
|
+
version: 2.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yasuhiro Asaka, Zeno R.R. Davatz, Niklaus Giger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|