oddb2xml 2.5.3 → 2.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|