oddb2xml 2.6.2 → 2.6.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +5 -6
- data/Elexis_Artikelstamm_v5.xsd +13 -8
- data/History.txt +23 -2
- data/README.md +1 -1
- data/bin/check_artikelstamm +1 -1
- data/lib/oddb2xml/builder.rb +42 -17
- data/lib/oddb2xml/chapter_70_hack.rb +8 -9
- data/lib/oddb2xml/downloader.rb +3 -3
- data/lib/oddb2xml/extractor.rb +1 -0
- data/lib/oddb2xml/semantic_check.rb +6 -4
- data/lib/oddb2xml/util.rb +7 -7
- data/lib/oddb2xml/version.rb +1 -1
- data/spec/artikelstamm_spec.rb +23 -26
- data/spec/builder_spec.rb +8 -8
- data/spec/downloader_spec.rb +1 -1
- data/spec/fixtures/vcr_cassettes/oddb2xml.json +4 -4
- data/spec/spec_helper.rb +4 -4
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 070625b76250b6816b761d5e4f37474326218067dcdbd0a59824c2667e62e9b7
|
4
|
+
data.tar.gz: 04af7deafbe8160ad3283b6edb9bae596d9782bad4c7a4be8facda175f062ac8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3616fc763495253e24a1176ccd5d2907e08b96860e87d79c5577b14b38826bf57aaa3aebbf7777fcde28cb2d243b379e25697ba943b1df921ea6cbe6ea16edca
|
7
|
+
data.tar.gz: dba061cc87bd89396f38b792f51c9918a23f55d9452c9df9472b5a1e208859f729cbba868097763fc0364791fbb0900a6df97319525dc9721515ad921527c18c
|
data/.travis.yml
CHANGED
@@ -11,17 +11,16 @@ before_install:
|
|
11
11
|
script: bundle exec rspec
|
12
12
|
|
13
13
|
rvm:
|
14
|
-
|
15
|
-
- 2.
|
16
|
-
- 2.
|
17
|
-
- 2.
|
14
|
+
# Building on Versions 2.4 or earlier of Ruby fail, because URI.open was priveate
|
15
|
+
# - 2.4
|
16
|
+
- 2.5
|
17
|
+
- 2.6
|
18
|
+
- 2.7
|
18
19
|
- ruby-head
|
19
20
|
|
20
21
|
matrix:
|
21
22
|
allow_failures:
|
22
23
|
- rvm: ruby-head
|
23
|
-
- rvm: 2.2.7
|
24
|
-
- rvm: 2.3.4
|
25
24
|
|
26
25
|
notifications:
|
27
26
|
email:
|
data/Elexis_Artikelstamm_v5.xsd
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<!-- Copyright (c) 2016 MEDEVIT. All rights reserved. This program and the
|
3
|
-
accompanying materials are made available under the terms of the Eclipse
|
4
|
-
Public License v1.0 which accompanies this distribution, and is available
|
5
|
-
at http://www.eclipse.org/legal/epl-v10.html v002 - Ergänzung K Komplementärprodukt
|
6
|
-
bei generic type, Consider ATC code of length 8 (on vet.med. articles) Relax
|
7
|
-
ADDSCR occurence to 0 .. 1 v003 - PRODNO hinzugefügt LIMNAMEBAG zur formal-kennzeichnung
|
8
|
-
von identen limitations v4 - Major refactoring, see https://redmine.medelexis.ch/issues/4405
|
2
|
+
<!-- Copyright (c) 2016 MEDEVIT. All rights reserved. This program and the
|
3
|
+
accompanying materials are made available under the terms of the Eclipse
|
4
|
+
Public License v1.0 which accompanies this distribution, and is available
|
5
|
+
at http://www.eclipse.org/legal/epl-v10.html v002 - Ergänzung K Komplementärprodukt
|
6
|
+
bei generic type, Consider ATC code of length 8 (on vet.med. articles) Relax
|
7
|
+
ADDSCR occurence to 0 .. 1 v003 - PRODNO hinzugefügt LIMNAMEBAG zur formal-kennzeichnung
|
8
|
+
von identen limitations v4 - Major refactoring, see https://redmine.medelexis.ch/issues/4405
|
9
9
|
Contributors: MEDEVIT <office@medevit.at> - initial API and implementation -->
|
10
10
|
<xs:schema targetNamespace="http://elexis.ch/Elexis_Artikelstamm_v5"
|
11
11
|
elementFormDefault="qualified" attributeFormDefault="unqualified"
|
@@ -339,7 +339,6 @@
|
|
339
339
|
</xs:element>
|
340
340
|
<xs:element name="GENERIC_TYPE"
|
341
341
|
maxOccurs="1" minOccurs="0">
|
342
|
-
|
343
342
|
<xs:simpleType>
|
344
343
|
<xs:annotation>
|
345
344
|
<xs:documentation>
|
@@ -359,6 +358,9 @@
|
|
359
358
|
<xs:enumeration
|
360
359
|
value="K">
|
361
360
|
</xs:enumeration>
|
361
|
+
<xs:enumeration
|
362
|
+
value="C"> <!-- BAG 9.6.2020: BDer Buchstabe C bei «Original Generika Code» steht für Co-Marketing Arzneimittel -->
|
363
|
+
</xs:enumeration>
|
362
364
|
</xs:restriction>
|
363
365
|
</xs:simpleType>
|
364
366
|
</xs:element>
|
@@ -429,6 +431,9 @@
|
|
429
431
|
</xs:documentation>
|
430
432
|
</xs:annotation>
|
431
433
|
</xs:element>
|
434
|
+
<xs:element name="Chapter70_HACK"
|
435
|
+
type="xs:string" minOccurs="0" maxOccurs="1">
|
436
|
+
</xs:element>
|
432
437
|
</xs:sequence>
|
433
438
|
|
434
439
|
|
data/History.txt
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
=== 2.6.7 / 25.06.2020
|
2
|
+
* Added value 'C' (Co-marketing) for field GENERIC_TYPE Elexis_Artikelstamm_v5.xsd from BAG Preparations.xml
|
3
|
+
* Fixed limitations coming from the chapte 70 hack
|
4
|
+
* Ruby 2.7 compatible (No URI.open warning)
|
5
|
+
|
6
|
+
=== 2.6.6 / 11.01.2020
|
7
|
+
* Fix link for varia_De.htm
|
8
|
+
|
9
|
+
=== 2.6.5 / 11.01.2020
|
10
|
+
* Fix issue #37: Update BAG Download Link
|
11
|
+
** Pending problem: varia_De.htm for Artikelstamm cannot be found anymore
|
12
|
+
|
13
|
+
=== 2.6.4 / 14.08.2019
|
14
|
+
* Fix issue #35: Missing product with ATC code for 7680005850010 Varilrix when building Artikelstamm_V5
|
15
|
+
|
16
|
+
=== 2.6.3 / 01.07.2019
|
17
|
+
* Use https://github.com/zdavatz/cpp2sqlite/blob/master/input/atc_codes_multi_lingual.txt instead of http://download.epha.ch/data/atc/atc.csv
|
18
|
+
|
19
|
+
=== 2.6.2 / 01.07.2019
|
20
|
+
* Use https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv instead of https://download.epha.ch/cleaned/matrix.csv
|
21
|
+
|
1
22
|
=== 2.6.1 / 27.02.2019
|
2
23
|
* Update rubyXL to 3.4.0 with fix to avoid problem reported via https://github.com/weshatheleopard/rubyXL/issues/325
|
3
24
|
* When generating artikelstamm XML generate products (aka sequences) with name like "3TC Filmtabl 150 mg" instead of only "3TC"
|
@@ -114,7 +135,7 @@
|
|
114
135
|
|
115
136
|
=== 2.4.1 / 2.12.2016
|
116
137
|
|
117
|
-
* Update oddb2xml.gemspec to add GPL-3.0 as correct license for Rubygems as stated in LICENSE file
|
138
|
+
* Update oddb2xml.gemspec to add GPL-3.0 as correct license for Rubygems as stated in LICENSE file
|
118
139
|
* Added a hack for 24 globulina equina which commas between brackets
|
119
140
|
|
120
141
|
=== 2.4.0 /25.08.2016
|
@@ -552,7 +573,7 @@
|
|
552
573
|
|
553
574
|
* Improve NINCD detection
|
554
575
|
- Update timeout handling
|
555
|
-
- Improve pharmacode detection
|
576
|
+
- Improve pharmacode detection
|
556
577
|
|
557
578
|
=== 1.5.1 / 10.06.2013
|
558
579
|
|
data/README.md
CHANGED
@@ -273,7 +273,7 @@ product.xml has relation to substance as `
|
|
273
273
|
We use the following files:
|
274
274
|
|
275
275
|
* https://www.swissmedic.ch/arzneimittel/00156/00221/00222/00230/index.html?lang=de (Präparateliste und zugelassene Packungen)
|
276
|
-
* https://
|
276
|
+
* https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv
|
277
277
|
* http://refdatabase.refdata.ch/Service/Article.asmx
|
278
278
|
* http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip
|
279
279
|
* https://www.medregbm.admin.ch/Publikation/CreateExcelListBetriebs
|
data/bin/check_artikelstamm
CHANGED
data/lib/oddb2xml/builder.rb
CHANGED
@@ -859,7 +859,7 @@ module Oddb2xml
|
|
859
859
|
@articles.sort! { |a,b| a[:ean13] <=> b[:ean13] }
|
860
860
|
@articles.each do |obj|
|
861
861
|
idx += 1
|
862
|
-
Oddb2xml.log "build_article #{idx} of #{@articles.size} articles" if idx % 500 == 0
|
862
|
+
Oddb2xml.log "build_article #{obj[:ean13]}: #{idx} of #{@articles.size} articles" if idx % 500 == 0
|
863
863
|
item = @items[obj[:ean13]]
|
864
864
|
pac,no8 = nil,obj[:ean13].to_s[4..11] # BAG-XML(SL/LS)
|
865
865
|
pack_info = nil
|
@@ -1449,7 +1449,7 @@ module Oddb2xml
|
|
1449
1449
|
obj = @packs[no8] # obj not yet in refdata. Use data from swissmedic_package.xlsx
|
1450
1450
|
end
|
1451
1451
|
nr_items += 1
|
1452
|
-
Oddb2xml.log "
|
1452
|
+
Oddb2xml.log "build_artikelstamm #{ean13}: #{nr_items} of #{gtins.size} articles" if nr_items % 5000 == 0
|
1453
1453
|
item = @items[ean13]
|
1454
1454
|
pack_info = nil
|
1455
1455
|
pack_info = @packs[no8] if no8 && /#{ean13}/.match(@packs[no8].to_s) # info from Packungen.xlsx from swissmedic_info
|
@@ -1509,7 +1509,7 @@ module Oddb2xml
|
|
1509
1509
|
name_fr ||= (obj[:name_fr] + ', ' + obj[:desc_fr]).strip if obj[:name_fr]
|
1510
1510
|
# ZuRorse has only german names
|
1511
1511
|
name_fr ||= (item[:name_fr] + ', ' + item[:desc_fr]) if item
|
1512
|
-
name_fr ||=
|
1512
|
+
name_fr ||= name
|
1513
1513
|
xml.DSCRF(name_fr)
|
1514
1514
|
xml.COMP do # Manufacturer
|
1515
1515
|
xml.NAME obj[:company_name]
|
@@ -1558,19 +1558,19 @@ module Oddb2xml
|
|
1558
1558
|
end if item && item[:deductible]
|
1559
1559
|
prodno = Oddb2xml.getProdnoForEan13(pkg_gtin)
|
1560
1560
|
xml.PRODNO prodno if prodno
|
1561
|
+
atc = package[:atc_code]
|
1562
|
+
atc ||= @refdata[pkg_gtin][:seq][:atc_code] if @refdata[pkg_gtin]
|
1561
1563
|
csv = []
|
1562
1564
|
@csv_file << [pkg_gtin, name, package[:unit], measure,
|
1563
1565
|
pexf ? pexf : '',
|
1564
1566
|
ppub ? ppub : '',
|
1565
|
-
|
1567
|
+
prodno, atc, package[:substance_swissmedic],
|
1566
1568
|
sequence[:org_gen_code], package[:ith_swissmedic],
|
1567
1569
|
@items[pkg_gtin] ? 'SL' : '',
|
1568
1570
|
]
|
1569
1571
|
end
|
1570
1572
|
end
|
1571
1573
|
else # non pharma
|
1572
|
-
@csv_file << [ ean13, (obj[:desc_de] || obj[:description]), '', '',
|
1573
|
-
obj[:price], obj[:pub_price], '', '', '', '', '', '' ]
|
1574
1574
|
if @@emitted_v5_gtins.index(ean13)
|
1575
1575
|
next
|
1576
1576
|
else
|
@@ -1589,17 +1589,38 @@ module Oddb2xml
|
|
1589
1589
|
xml.GTIN ean13.to_s.rjust(13, '0')
|
1590
1590
|
xml.PHAR obj[:pharmacode]
|
1591
1591
|
emit_salecd(xml, ean13, obj)
|
1592
|
-
|
1592
|
+
description = obj[:desc_de] || obj[:description] # for description for zur_rose
|
1593
|
+
xml.DSCR(description)
|
1593
1594
|
xml.DSCRF(obj[:desc_fr] || '--missing--')
|
1594
1595
|
xml.COMP do
|
1595
1596
|
xml.GLN obj[:company_ean]
|
1596
1597
|
end if obj[:company_ean] && !obj[:company_ean].empty?
|
1597
|
-
|
1598
|
-
|
1598
|
+
if !(obj[:price] && !obj[:price].empty?) || !(obj[:pub_price] && !obj[:pub_price].empty?)
|
1599
|
+
zur_rose_detail = @infos_zur_rose.values.find{|x| x[:ean13].to_i == ean13.to_i}
|
1600
|
+
end
|
1601
|
+
ppub = nil; pexf=nil
|
1602
|
+
if obj[:price] && !obj[:price].empty?
|
1603
|
+
xml.PEXF (pexf = obj[:price])
|
1604
|
+
elsif zur_rose_detail
|
1605
|
+
if zur_rose_detail[:price] && !zur_rose_detail[:price].empty? && !zur_rose_detail[:price].eql?('0.00')
|
1606
|
+
Oddb2xml.log "NonPharma: #{ean13} adding PEXF #{zur_rose_detail[:price]} #{description}"
|
1607
|
+
xml.PEXF (pexf = zur_rose_detail[:price])
|
1608
|
+
end
|
1609
|
+
end
|
1610
|
+
if obj[:pub_price] && !obj[:pub_price].empty?
|
1611
|
+
xml.PPUB (ppub = obj[:pub_price])
|
1612
|
+
elsif zur_rose_detail
|
1613
|
+
if zur_rose_detail[:pub_price] && !zur_rose_detail[:pub_price].empty? && !zur_rose_detail[:pub_price].eql?('0.00')
|
1614
|
+
Oddb2xml.log "NonPharma: #{ean13} adding PPUB #{zur_rose_detail[:pub_price]} #{description}"
|
1615
|
+
xml.PPUB (ppub = zur_rose_detail[:pub_price])
|
1616
|
+
end
|
1617
|
+
end
|
1618
|
+
@csv_file << [ ean13, description, '', '', pexf, ppub, '', '', '', '', '', '' ]
|
1599
1619
|
if chap70
|
1600
|
-
xml.comment "Chapter70 hack"
|
1620
|
+
xml.comment "Chapter70 hack"
|
1601
1621
|
xml.SL_ENTRY 'true'
|
1602
1622
|
xml.PRODNO obj[:pharmacode]
|
1623
|
+
xml.Chapter70_HACK 'true'
|
1603
1624
|
end
|
1604
1625
|
end
|
1605
1626
|
end
|
@@ -1658,18 +1679,20 @@ module Oddb2xml
|
|
1658
1679
|
sequence ||= @products[ean][:seq] if @products[ean]
|
1659
1680
|
next unless check_name(obj, :de)
|
1660
1681
|
ppac = ((_ppac = @packs[ean.to_s[4..11]] and !_ppac[:is_tier]) ? _ppac : {})
|
1661
|
-
unless ppac
|
1662
|
-
ppac = @packs.find{|pac| pac.ean == ean }.first
|
1663
|
-
end
|
1664
1682
|
prodno = ppac[:prodno] if ppac[:prodno] and !ppac[:prodno].empty?
|
1665
1683
|
prodno = obj[:pharmacode] if obj[:chapter70]
|
1684
|
+
myPack = @packs.values.find{ |x| x[:iksnr].to_i == obj[:seq][:swissmedic_number5].to_i } if obj[:seq]
|
1685
|
+
if myPack && !prodno
|
1686
|
+
prodno ||= myPack[:prodno]
|
1687
|
+
puts "Setting prodno #{prodno} for #{ean13} #{myPack[:sequence_name]}"
|
1688
|
+
end
|
1666
1689
|
next unless prodno
|
1667
1690
|
next if emitted_prodno.index(prodno)
|
1668
1691
|
sequence ||= @articles.find{|x| x[:ean13].eql?(ean)}
|
1669
1692
|
unless obj[:chapter70]
|
1670
1693
|
next unless sequence && (sequence[:name_de] || sequence[:desc_de])
|
1671
|
-
if Oddb2xml.getEan13forProdno(prodno).size == 0
|
1672
|
-
puts "No item found for prodno #{prodno} no8 #{obj[:no8]} #{sequence[:name_de]}
|
1694
|
+
if Oddb2xml.getEan13forProdno(prodno).size == 0 && !obj[:no8].eql?(Oddb2xml.getNo8ForEan13(ean))
|
1695
|
+
puts "No item found for prodno #{prodno} no8 #{obj[:no8]} #{sequence[:name_de]}"
|
1673
1696
|
next
|
1674
1697
|
end
|
1675
1698
|
end
|
@@ -1699,12 +1722,14 @@ module Oddb2xml
|
|
1699
1722
|
used_limitations << lim_code unless used_limitations.index(lim_code)
|
1700
1723
|
xml.LIMNAMEBAG lim_code
|
1701
1724
|
elsif obj[:chapter70]
|
1702
|
-
used_limitations << obj[:code]
|
1703
1725
|
xml.comment "Chapter70 hack"
|
1704
1726
|
xml.SALECD('A') # these products are always active!
|
1705
1727
|
xml.DSCR obj[:description]
|
1706
1728
|
xml.DSCRF ''
|
1707
|
-
|
1729
|
+
if @limitations.index(obj[:code])
|
1730
|
+
xml.LIMNAMEBAG obj[:code]
|
1731
|
+
used_limitations << obj[:code]
|
1732
|
+
end
|
1708
1733
|
end
|
1709
1734
|
if sequence && sequence[:substances]
|
1710
1735
|
value = nil
|
@@ -12,7 +12,7 @@ module Oddb2xml
|
|
12
12
|
puts "parse_td returns: #{res}" if $VERBOSE
|
13
13
|
rescue => exc
|
14
14
|
puts "Unable to pars #{elem} #{exc}"
|
15
|
-
binding.pry
|
15
|
+
# binding.pry
|
16
16
|
return nil
|
17
17
|
end
|
18
18
|
res.flatten # .join("\t")
|
@@ -26,14 +26,14 @@ module Oddb2xml
|
|
26
26
|
def self.items
|
27
27
|
@@items
|
28
28
|
end
|
29
|
-
def self.parse(html_file = 'http://
|
29
|
+
def self.parse(html_file = 'http://www.spezialitaetenliste.ch/varia_De.htm')
|
30
30
|
data = Hash.new{|h,k| h[k] = [] }
|
31
31
|
Ox.default_options = {
|
32
32
|
mode: :generic,
|
33
33
|
effort: :tolerant,
|
34
34
|
smart: true
|
35
35
|
}
|
36
|
-
res = Ox.load(open(html_file).read, mode: :hash_no_attrs).values.first['body']
|
36
|
+
res = Ox.load(URI.open(html_file).read, mode: :hash_no_attrs).values.first['body']
|
37
37
|
result = []
|
38
38
|
idx = 0
|
39
39
|
@@items = {}
|
@@ -50,15 +50,16 @@ module Oddb2xml
|
|
50
50
|
data = {}
|
51
51
|
pharma_code = entry.first
|
52
52
|
ean13 = (Oddb2xml::FAKE_GTIN_START + pharma_code.to_s)
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
if entry[2].encoding.to_s.eql?('ASCII-8BIT')
|
54
|
+
german = CGI.unescape(entry[2].force_encoding('ISO-8859-1'))
|
55
|
+
else
|
56
|
+
german = entry[2]
|
56
57
|
end
|
57
58
|
@@items[ean13] = {
|
58
59
|
:data_origin => 'Chapter70',
|
59
60
|
:line => entry.join(","),
|
60
61
|
:ean13 => ean13,
|
61
|
-
:description =>
|
62
|
+
:description => german,
|
62
63
|
:quantity => entry[3],
|
63
64
|
:pharmacode => pharma_code,
|
64
65
|
:pub_price => entry[4],
|
@@ -70,5 +71,3 @@ module Oddb2xml
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
end
|
73
|
-
|
74
|
-
|
data/lib/oddb2xml/downloader.rb
CHANGED
@@ -23,7 +23,7 @@ module Oddb2xml
|
|
23
23
|
else
|
24
24
|
begin
|
25
25
|
io = File.open(file, option)
|
26
|
-
data = open(@url).read
|
26
|
+
data = URI.open(@url).read
|
27
27
|
io.write(data)
|
28
28
|
rescue => error
|
29
29
|
puts "error #{error} while fetching #{@url}"
|
@@ -197,7 +197,7 @@ module Oddb2xml
|
|
197
197
|
include DownloadMethod
|
198
198
|
def init
|
199
199
|
super
|
200
|
-
@url ||= 'http://
|
200
|
+
@url ||= 'http://www.xn--spezialittenliste-yqb.ch/File.axd?file=XMLPublications.zip'
|
201
201
|
end
|
202
202
|
def download
|
203
203
|
file = File.join(WorkDir, 'XMLPublications.zip')
|
@@ -283,7 +283,7 @@ module Oddb2xml
|
|
283
283
|
include DownloadMethod
|
284
284
|
def initialize(type=:orphan, options = {})
|
285
285
|
url = BASE_URL + '/swissmedic/de/home/services/listen_neu.html'
|
286
|
-
doc = Nokogiri::HTML(open(url))
|
286
|
+
doc = Nokogiri::HTML(URI.open(url))
|
287
287
|
@type = type
|
288
288
|
@options = options
|
289
289
|
case @type
|
data/lib/oddb2xml/extractor.rb
CHANGED
@@ -64,7 +64,7 @@ module Oddb2xml
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def everyPharmaArticleHasAProductItem
|
69
69
|
result = true
|
70
70
|
puts "#{Time.now.strftime("%H:%M:%S")}: everyPharmaArticleHasAProductItem"
|
@@ -74,7 +74,7 @@ module Oddb2xml
|
|
74
74
|
unless allProductNumbers.index(item[:PRODNO])
|
75
75
|
puts "Item #{item[:GTIN]} has no Product #{item[:PRODNO]} #{item[:DSCR]}"
|
76
76
|
result = false
|
77
|
-
end
|
77
|
+
end unless item[:Chapter70_HACK]
|
78
78
|
end
|
79
79
|
result
|
80
80
|
end
|
@@ -91,17 +91,19 @@ module Oddb2xml
|
|
91
91
|
end
|
92
92
|
result
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
def everyReferencedLimitationIsIncluded
|
96
|
+
result = true
|
96
97
|
puts "#{Time.now.strftime("%H:%M:%S")}: everyReferencedLimitationIsIncluded"
|
97
98
|
allLimitations = limitations.collect{ |lim| lim[:LIMNAMEBAG] }
|
98
99
|
products.each do |product|
|
99
100
|
next unless product[:LIMNAMEBAG]
|
100
101
|
unless allLimitations.index(product[:LIMNAMEBAG])
|
101
102
|
puts "product #{product[:PRODNO]} has no limitation #{product[:LIMNAMEBAG]} #{product[:DSCR]}"
|
102
|
-
|
103
|
+
result = false
|
103
104
|
end
|
104
105
|
end
|
106
|
+
result
|
105
107
|
end
|
106
108
|
|
107
109
|
def checkPackageSize
|
data/lib/oddb2xml/util.rb
CHANGED
@@ -23,7 +23,7 @@ module Oddb2xml
|
|
23
23
|
Downloads = "#{Dir.pwd}/downloads"
|
24
24
|
end
|
25
25
|
@options = {}
|
26
|
-
@atc_csv_origin = '
|
26
|
+
@atc_csv_origin = 'https://github.com/zdavatz/cpp2sqlite/blob/master/input/atc_codes_multi_lingual.txt'
|
27
27
|
@atc_csv_content = {}
|
28
28
|
|
29
29
|
def Oddb2xml.html_decode(string)
|
@@ -34,7 +34,7 @@ module Oddb2xml
|
|
34
34
|
end
|
35
35
|
Oddb2xml.patch_some_utf8(german).gsub('<br>',"\n")
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def Oddb2xml.patch_some_utf8(line)
|
39
39
|
begin
|
40
40
|
line = line.encode('utf-8')
|
@@ -86,7 +86,7 @@ module Oddb2xml
|
|
86
86
|
def Oddb2xml.skip_download?
|
87
87
|
@options[:skip_download]
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
def Oddb2xml.skip_download(file)
|
91
91
|
return false if defined?(VCR)
|
92
92
|
dest = "#{Downloads}/#{File.basename(file)}"
|
@@ -96,7 +96,7 @@ module Oddb2xml
|
|
96
96
|
end
|
97
97
|
false
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
def Oddb2xml.download_finished(file, remove_file = true)
|
101
101
|
src = "#{WorkDir}/#{File.basename(file)}"
|
102
102
|
dest = "#{Downloads}/#{File.basename(file)}"
|
@@ -232,7 +232,7 @@ COLUMNS_FEBRUARY_2019= {
|
|
232
232
|
@@ean13_to_no8 = {}
|
233
233
|
def Oddb2xml.setEan13forProdno(prodno, ean13)
|
234
234
|
if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
|
235
|
-
|
235
|
+
Oddb2xml.log "setEan13forProdno #{prodno} ean13 #{ean13}"
|
236
236
|
end
|
237
237
|
@@prodno_to_ean13[prodno] ||= []
|
238
238
|
@@prodno_to_ean13[prodno] << ean13
|
@@ -240,13 +240,13 @@ COLUMNS_FEBRUARY_2019= {
|
|
240
240
|
end
|
241
241
|
def Oddb2xml.setEan13forNo8(no8, ean13)
|
242
242
|
if ean13.to_i == 7680006660045 || ean13.to_i == 7680006660014
|
243
|
-
|
243
|
+
Oddb2xml.log "setEan13forNo8 #{no8} ean13 #{ean13}"
|
244
244
|
end
|
245
245
|
if @@no8_to_ean13[no8].nil?
|
246
246
|
@@no8_to_ean13[no8] = ean13
|
247
247
|
@@ean13_to_no8[ean13] = no8
|
248
248
|
elsif !@@no8_to_ean13[no8].eql?(ean13)
|
249
|
-
|
249
|
+
Oddb2xml.log "@@no8_to_ean13[no8] #{@@no8_to_ean13[no8]} not overridden by #{ean13}"
|
250
250
|
end
|
251
251
|
end
|
252
252
|
def Oddb2xml.getEan13forProdno(prodno)
|
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
|
-
|
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,Dibase 10'000 Tropfen 10000 IE/ml Fl 10 ml,,Flasche(n),5,9.25
|
124
|
+
expected = %(7680658560014,Dibase 10'000 Tropfen 10000 IE/ml Fl 10 ml,,Flasche(n),5,9.25,6585601,A11CC05,,"",,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,Lynparza Kaps 50 mg 448 Stk,,Kapsel(n),5562.48,5947.55
|
142
|
+
expect(inhalt.index('7680651600014,Lynparza Kaps 50 mg 448 Stk,,Kapsel(n),5562.48,5947.55,6516001,L01XX46,,"",,S')).not_to be nil
|
143
143
|
end
|
144
144
|
it 'should trim the ean13 to 13 length' do
|
145
145
|
gtin14 = "00040565124346"
|
@@ -184,7 +184,7 @@ describe Oddb2xml::Builder do
|
|
184
184
|
@inhalt = IO.read(@artikelstamm_name)
|
185
185
|
expect(@inhalt.index('BIOMARIS Voll Meersalz 500 g')).not_to be nil
|
186
186
|
end
|
187
|
-
|
187
|
+
|
188
188
|
it 'Should not contain PHAR 8809544 Sildenavil with pexf and ppub 0.0' do
|
189
189
|
#1128809544Sildenafil Suspension 7mg/ml 100ml 0030850045801000000000000000000000002
|
190
190
|
@inhalt = IO.read(@artikelstamm_name)
|
@@ -211,29 +211,33 @@ describe Oddb2xml::Builder do
|
|
211
211
|
it 'shoud contain GENERIC_TYPE' do
|
212
212
|
expect(@inhalt.index('<GENERIC_TYPE')).not_to be nil
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
it 'should contain DIBASE with phar' do
|
216
216
|
expected = %(<ITEM PHARMATYPE="P">
|
217
|
-
<GTIN>
|
218
|
-
<!--override
|
217
|
+
<GTIN>7680658560014</GTIN>
|
218
|
+
<!--obsolete override-->
|
219
|
+
<PHAR>7199565</PHAR>
|
219
220
|
<SALECD>A</SALECD>
|
220
|
-
<DSCR>
|
221
|
-
<DSCRF
|
221
|
+
<DSCR>Dibase 10'000 Tropfen 10000 IE/ml Fl 10 ml</DSCR>
|
222
|
+
<DSCRF>Dibase 10'000 gouttes 10000 UI/ml fl 10 ml</DSCRF>
|
222
223
|
<COMP>
|
223
224
|
<NAME>Gebro Pharma AG</NAME>
|
224
|
-
<GLN
|
225
|
+
<GLN>7612053000000</GLN>
|
225
226
|
</COMP>
|
227
|
+
<PEXF>5</PEXF>
|
228
|
+
<PPUB>9.25</PPUB>
|
226
229
|
<PKG_SIZE>1</PKG_SIZE>
|
227
230
|
<MEASURE>Flasche(n)</MEASURE>
|
228
231
|
<MEASUREF>Flasche(n)</MEASUREF>
|
229
|
-
<DOSAGE_FORM>
|
230
|
-
<
|
232
|
+
<DOSAGE_FORM>orale Tropflösung</DOSAGE_FORM>
|
233
|
+
<SL_ENTRY>true</SL_ENTRY>
|
231
234
|
<IKSCAT>D</IKSCAT>
|
232
|
-
<
|
233
|
-
|
235
|
+
<DEDUCTIBLE>10</DEDUCTIBLE>
|
236
|
+
<PRODNO>6585601</PRODNO>
|
237
|
+
</ITEM)
|
234
238
|
expect(@inhalt.index(expected)).not_to be nil
|
235
239
|
end
|
236
|
-
|
240
|
+
|
237
241
|
it 'should contain PEVISONE Creme 30 g' do
|
238
242
|
expect(@inhalt.index('Pevisone Creme 15 g')).not_to be nil # 7680406620144
|
239
243
|
expect(@inhalt.index('Pevisone Creme 30 g')).not_to be nil # 7680406620229
|
@@ -329,7 +333,7 @@ describe Oddb2xml::Builder do
|
|
329
333
|
<DEDUCTIBLE>10</DEDUCTIBLE>
|
330
334
|
<PRODNO>1610501</PRODNO>
|
331
335
|
</ITEM>),
|
332
|
-
'item 7680161050743
|
336
|
+
'item 7680161050743 Hirudoid Creme 3 mg/g 100 g' =>
|
333
337
|
%( <ITEM PHARMATYPE="P">
|
334
338
|
<GTIN>7680161050743</GTIN>
|
335
339
|
<PHAR>2731179</PHAR>
|
@@ -345,7 +349,7 @@ describe Oddb2xml::Builder do
|
|
345
349
|
<SL_ENTRY>true</SL_ENTRY>
|
346
350
|
<IKSCAT>D</IKSCAT>
|
347
351
|
<DEDUCTIBLE>10</DEDUCTIBLE>
|
348
|
-
</ITEM>),
|
352
|
+
</ITEM>),
|
349
353
|
'item 7680284860144 ANCOPIR' =>'<ITEM PHARMATYPE="P">
|
350
354
|
<GTIN>7680284860144</GTIN>
|
351
355
|
<PHAR>0177804</PHAR>
|
@@ -387,7 +391,7 @@ describe Oddb2xml::Builder do
|
|
387
391
|
<DOSAGE_FORMF>Compresse</DOSAGE_FORMF>
|
388
392
|
<IKSCAT>C</IKSCAT>
|
389
393
|
<PRODNO>3164402</PRODNO>
|
390
|
-
</ITEM>),
|
394
|
+
</ITEM>),
|
391
395
|
'product 3TC Filmtabl' => %(<PRODUCT>
|
392
396
|
<PRODNO>5366201</PRODNO>
|
393
397
|
<SALECD>A</SALECD>
|
@@ -435,20 +439,12 @@ describe Oddb2xml::Builder do
|
|
435
439
|
<DEDUCTIBLE>20</DEDUCTIBLE>
|
436
440
|
<PRODNO>5329001</PRODNO>
|
437
441
|
</ITEM>),
|
438
|
-
'Chapter 70 limitation' => %(<LIMITATION>
|
439
|
-
<!--Chapter70 hack-->
|
440
|
-
<LIMNAMEBAG>L1, L2</LIMNAMEBAG>
|
441
|
-
<DSCR>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.</DSCR>
|
442
|
-
<DSCRF/>
|
443
|
-
<LIMITATION_PTS>1</LIMITATION_PTS>
|
444
|
-
</LIMITATION>),
|
445
442
|
'Chapter 70 product' => %(<PRODUCT>
|
446
443
|
<PRODNO>2069639</PRODNO>
|
447
444
|
<!--Chapter70 hack-->
|
448
445
|
<SALECD>A</SALECD>
|
449
446
|
<DSCR>Ceres Urtinkturen gemäss L2</DSCR>
|
450
447
|
<DSCRF/>
|
451
|
-
<LIMNAMEBAG>L1, L2</LIMNAMEBAG>
|
452
448
|
</PRODUCT>),
|
453
449
|
'Chapter 70 item' => %(<ITEM PHARMATYPE="P">
|
454
450
|
<GTIN>2500000588532</GTIN>
|
@@ -461,6 +457,7 @@ describe Oddb2xml::Builder do
|
|
461
457
|
<!--Chapter70 hack-->
|
462
458
|
<SL_ENTRY>true</SL_ENTRY>
|
463
459
|
<PRODNO>2069639</PRODNO>
|
460
|
+
<Chapter70_HACK>true</Chapter70_HACK>
|
464
461
|
</ITEM>),
|
465
462
|
'HTML-encoded limitation' => %(<DSCR>Zur Erhaltungstherapie (Monotherapie) bei erwachsenen Patientinnen mit rezidiviertem, fortgeschrittenem Ovarialkarzinom mit BRCA Mutation im Anschluss an eine platinhaltige Chemotherapie bei Vorliegen einer kompletten oder partiellen Remission.
|
466
463
|
|
data/spec/builder_spec.rb
CHANGED
@@ -59,7 +59,7 @@ ARTICLE_NAROPIN = %(
|
|
59
59
|
<BCSTAT>A</BCSTAT>
|
60
60
|
</ARTBAR>
|
61
61
|
</ART>)
|
62
|
-
|
62
|
+
|
63
63
|
ARTICLE_COMMON_ELEMENTS = [
|
64
64
|
['ARTICLE/ART/REF_DATA', '1'],
|
65
65
|
['ARTICLE/ART/SMCAT', 'A'],
|
@@ -256,7 +256,7 @@ def check_result(inhalt, nbr_record)
|
|
256
256
|
expect(inhalt.index('<ERROR_CODE/>')).to be > 0
|
257
257
|
m = /<NBR_RECORD>(\d+)<\/NBR_RECORD>/.match(inhalt)
|
258
258
|
expect(m).not_to be nil
|
259
|
-
expect(m[1].to_i).to eq nbr_record
|
259
|
+
expect(m[1].to_i).to eq nbr_record
|
260
260
|
end
|
261
261
|
|
262
262
|
def checkItemForRefdata(doc, pharmacode, isRefdata)
|
@@ -476,7 +476,7 @@ describe Oddb2xml::Builder do
|
|
476
476
|
NrExtendedArticles = 76
|
477
477
|
NrSubstances = 27
|
478
478
|
NrLimitations = 14
|
479
|
-
|
479
|
+
|
480
480
|
NrInteractions = 2
|
481
481
|
NrCodes = 5
|
482
482
|
NrProdno = 31
|
@@ -532,7 +532,7 @@ describe Oddb2xml::Builder do
|
|
532
532
|
|
533
533
|
check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
|
534
534
|
check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
|
535
|
-
|
535
|
+
|
536
536
|
it 'should validate XSD article' do
|
537
537
|
@inhalt = File.read(oddb_article_xml)
|
538
538
|
# This fails on Ruby < 2.4 as NAROPIN INJ LÖS 0.2 % 10 is wrongly encoded
|
@@ -552,7 +552,7 @@ describe Oddb2xml::Builder do
|
|
552
552
|
end
|
553
553
|
|
554
554
|
it 'should have a correct insulin (gentechnik) for 7680532900196' do
|
555
|
-
expect(
|
555
|
+
expect(@inhalt.match(/.*<BC>7680532900196<\/BC>.*/).class).to be MatchData
|
556
556
|
expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").size).to be >= 1
|
557
557
|
expect(XPath.match( @rexml, "//ART//GEN_PRODUCTION").first.text).to eq 'X'
|
558
558
|
expect(XPath.match( @rexml, "//ART//INSULIN_CATEGORY").size).to eq 1
|
@@ -568,7 +568,7 @@ describe Oddb2xml::Builder do
|
|
568
568
|
ean_with_drug_index = 7680555610041
|
569
569
|
it "should have a correct drug information for #{ean_with_drug_index}" do
|
570
570
|
doc = REXML::Document.new IO.read(checkAndGetArticleXmlName)
|
571
|
-
expect(
|
571
|
+
expect(@inhalt.match(/.*<BC>#{ean_with_drug_index}<\/BC>.*/).class).to be MatchData
|
572
572
|
expect(XPath.match( @rexml, "//ART//DRUG_INDEX").size).to eq 1
|
573
573
|
expect(XPath.match( @rexml, "//ART//DRUG_INDEX").first.text).to eq 'd'
|
574
574
|
found = false
|
@@ -605,11 +605,11 @@ describe Oddb2xml::Builder do
|
|
605
605
|
<CPT/>)
|
606
606
|
expect(oddb_product_xml.index(text2)).to be >= 1
|
607
607
|
end
|
608
|
-
|
608
|
+
|
609
609
|
it 'should generate SALECD A for swissmedic packages' do
|
610
610
|
expect(IO.read(oddb_article_xml).index('<SALECD>A<!--Overriding status I nincd 10 for 7680658560014 as in refdata_pharma--></SALECD>')).to be >= 1
|
611
611
|
end
|
612
|
-
|
612
|
+
|
613
613
|
end
|
614
614
|
|
615
615
|
context 'when -o for fachinfo is given' do
|
data/spec/downloader_spec.rb
CHANGED
@@ -76,7 +76,7 @@ def common_before
|
|
76
76
|
FileUtils.makedirs(Oddb2xml::WorkDir)
|
77
77
|
Dir.chdir(Oddb2xml::WorkDir)
|
78
78
|
WebMock.enable!
|
79
|
-
{ 'https://
|
79
|
+
{ 'https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv' => 'epha_interactions.csv',
|
80
80
|
}.each do |url, file|
|
81
81
|
inhalt = File.read(File.join(Oddb2xml::SpecData, file))
|
82
82
|
stub_request(:get,url).to_return(body: inhalt)
|
@@ -966,7 +966,7 @@
|
|
966
966
|
]
|
967
967
|
},
|
968
968
|
"method": "get",
|
969
|
-
"uri": "http://
|
969
|
+
"uri": "http://www.xn--spezialittenliste-yqb.ch/File.axd?file=XMLPublications.zip"
|
970
970
|
},
|
971
971
|
"response": {
|
972
972
|
"body": {
|
@@ -1025,7 +1025,7 @@
|
|
1025
1025
|
]
|
1026
1026
|
},
|
1027
1027
|
"method": "get",
|
1028
|
-
"uri": "
|
1028
|
+
"uri": "https://github.com/zdavatz/cpp2sqlite/blob/master/input/atc_codes_multi_lingual.txt"
|
1029
1029
|
},
|
1030
1030
|
"response": {
|
1031
1031
|
"body": {
|
@@ -1141,7 +1141,7 @@
|
|
1141
1141
|
]
|
1142
1142
|
},
|
1143
1143
|
"method": "get",
|
1144
|
-
"uri": "https://
|
1144
|
+
"uri": "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv"
|
1145
1145
|
},
|
1146
1146
|
"response": {
|
1147
1147
|
"body": {
|
@@ -1230,7 +1230,7 @@
|
|
1230
1230
|
]
|
1231
1231
|
},
|
1232
1232
|
"method": "get",
|
1233
|
-
"uri": "https://
|
1233
|
+
"uri": "https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv"
|
1234
1234
|
},
|
1235
1235
|
"response": {
|
1236
1236
|
"body": {
|
data/spec/spec_helper.rb
CHANGED
@@ -249,15 +249,15 @@ def mock_downloads
|
|
249
249
|
cmd = "zip --quiet --junk-paths #{zip_file} #{files.join(' ')}"
|
250
250
|
system(cmd)
|
251
251
|
end
|
252
|
-
{ 'https://
|
252
|
+
{ 'https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/interactions_de_utf8.csv' => 'epha_interactions.csv',
|
253
253
|
'https://www.swissmedic.ch/swissmedic/de/home/services/listen_neu.html' => 'listen_neu.html',
|
254
254
|
'https://www.swissmedic.ch/dam/swissmedic/de/dokumente/internetlisten/status_ophan%20Drug.xlsx.download.xlsx/Liste_OrphanDrug_Internet_2019_01_31.xlsx' => 'swissmedic_orphan.xlsx',
|
255
255
|
'https://www.swissmedic.ch/dam/swissmedic/de/dokumente/internetlisten/zugelassene_packungen_ham.xlsx.download.xlsx/Zugelassene_Packungen%20HAM_31012019.xlsx' => 'swissmedic_package.xlsx',
|
256
256
|
'http://pillbox.oddb.org/TRANSFER.ZIP' => 'transfer.zip',
|
257
|
-
'https://
|
257
|
+
'https://github.com/zdavatz/cpp2sqlite/blob/master/input/atc_codes_multi_lingual.txt' => 'atc.csv',
|
258
258
|
'https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/LPPV.txt' => 'oddb2xml_files_lppv.txt',
|
259
|
-
'http://
|
260
|
-
'http://
|
259
|
+
'http://www.xn--spezialittenliste-yqb.ch/File.axd?file=XMLPublications.zip' => 'XMLPublications.zip',
|
260
|
+
'http://www.spezialitaetenliste.ch/varia_De.htm' => 'varia_De.htm',
|
261
261
|
# 'http://refdatabase.refdata.ch/Service/Article.asmx?WSDL' => 'refdata_Pharma.xml',
|
262
262
|
}.each do |url, file|
|
263
263
|
inhalt = File.read(File.join(Oddb2xml::SpecData, file))
|
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.6.
|
4
|
+
version: 2.6.7
|
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:
|
11
|
+
date: 2020-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -486,8 +486,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
486
486
|
- !ruby/object:Gem::Version
|
487
487
|
version: '0'
|
488
488
|
requirements: []
|
489
|
-
|
490
|
-
rubygems_version: 2.6.8
|
489
|
+
rubygems_version: 3.1.2
|
491
490
|
signing_key:
|
492
491
|
specification_version: 4
|
493
492
|
summary: oddb2xml creates xml files.
|