# oddb2xml
[![Build Status](https://secure.travis-ci.org/zdavatz/oddb2xml.png)](http://travis-ci.org/zdavatz/oddb2xml)
* oddb2xml -a nonpharma -o fi
creates the following xml files:
* oddb_substance.xml
* oddb_limitation.xml
* oddb_interaction.xml
* oddb_code.xml
* oddb_product.xml
* oddb_article.xml
* oddb_fi.xml
* oddb_fi_product.xml
and
* oddb2xml -f dat
* oddb2xml -f dat -a nonpharma
creates .dat files according to ([IGM-11](http://dev.ywesee.com/uploads/att/IGM.pdf)). IGM-11 describes the structure of the zurrose_transfer.dat.
* oddb.dat
* oddb_with_migel.dat
the files are using [swissINDEX](http://www.refdata.ch/downloads/company/download/swissindex_TechnischeBeschreibung.pdf), [BAG-XML](http://bag.e-mediat.net/SL2007.Web.External/Default.aspx?webgrab=ignore) and [Swissmedic](http://www.swissmedic.ch/daten/00080/00251/index.html?lang=de) as sources.
The following additional data is in the files:
* [Wirkstoffe](http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip) (BAG XML)
* [Kühlkette](http://www.swissmedic.ch/daten/00080/00254/index.html?lang=de&download=NHzLpZeg7t,lnp6I0NTU042l2Z6ln1acy4Zn4Z2qZpnO2Yuq2Z6gpJCDdH57e2ym162epYbg2c_JjKbNoKOn6A--) (Swissmedic)
* [Orphan Drugs](http://www.swissmedic.ch/daten/00081/index.html?lang=de&download=NHzLpZeg7t,lnp6I0NTU042l2Z6ln1acy4Zn4Z2qZpnO2Yuq2Z6gpJCDdH55f2ym162epYbg2c_JjKbNoKSn6A--&.xls) (Swissmedic)
* [FI: de, fr](http://download.swissmedicinfo.ch) (Swissmedic)
* Limitation-Texte (BAG XML)
* Interaktionen [EPha.ch](http://epha.ch)
* [Betäubungsmittel](http://www.swissmedic.ch/produktbereiche/00447/00536/index.html?lang=de&download=NHzLpZeg7t,lnp6I0NTU042l2Z6ln1acy4Zn4Z2qZpnO2Yuq2Z6gpJCDdH1,fWym162epYbg2c_JjKbNoKSn6A--&.pdf) und psychotrope Stoffe (Swissmedic)
* Non-Pharma from Refdata and Suppliers (swissINDEX)
The top elements of all XML files have a SHA256 attribute over their content. The content corresponds to Nokogiris text method of the node which is essentially join by "\n" + some whitespaces of each element.
Consumers of the data file may use it to check whether they have to replace the corresponding nodes.
## usage
see `--help`.
```
/usr/local/bin/oddb2xml ver.1.9.4
Usage:
oddb2xml [option]
produced files are found under data
-a, --append Additional target nonpharma
-c F, --compress=F Compress format F. {tar.gz|zip}
-e --extended pharma, non-pharma plus prices and non-pharma from zurrose. Products without EAN-Code will also be listed.
-f F, --format=F File format F, default is xml. {xml|dat}
If F is given, -o option is ignored.
-I x, --increment=x Increment price by x percent. Forces -f dat -p zurrose.
-I x, --increment=x create additional field price_resellerpub as
price_extfactory incremented by x percent (rounded to the next 0.05 francs)
in oddb_article.xml. In generated zurrose_transfer.dat PRPU is set to this price
Forces -f dat -p zurrose.
-i, --include Include target option for ean14 for 'dat' format.
'xml' format includes always ean14 records.
-o, --option Optional fachinfo output.
-p, --price Price source (transfer.dat) from ZurRose
-t S, --tag-suffix=S XML tag suffix S. Default is none. [A-z0-9]
If S is given, it is also used as prefix of filename.
-x N, --context=N context N {product|address}. product is default.
For debugging purposes
--skip-download skips downloading files it the file is already under downloads.
Downloaded files are saved under downloads
--log log important actions
-h, --help Show this help message.
```
## Option examples
```
$ oddb2xml -t md # => md_article.xml, md_product.xml, md_substance.xml
$ oddb2xml -a nonpharma -t md -c tar.gz # => md_xml_dd.mm.yyyy_hh.mm.tar.gz
$ oddb2xml -f dat # => oddb.dat
$ oddb2xml -f dat -a nonpharma # => oddb_with_migel.dat
$ oddb2xml -e # => oddb_article.xml
```
output.
```
$ oddb2xml
DE
Pharma products: 14801
FR
Pharma products: 14801
```
## Supported ruby version
We run tests on travis-ci.org for the Ruby versions mentioned in the .travis.yml file. These are
* 1.9.3
* 2.0.0
* 2.1
* ruby-head
If you are running an older Ruby-Version (eg. 1.8 or 1.9.1), please upgrade before reporting a bug.
See also http://bugs.ruby-lang.org/projects/ruby/wiki/ReleaseEngineering
## XSD files
The file oddb2xml.xsd was manually created by merging the output of the xmlbeans tools inst2xsd and trang
* http://xmlbeans.apache.org/docs/2.0.0/guide/tools.html#inst2xsd
* http://www.thaiopensource.com/relaxng/trang.html
Running rake spec will validated the XML-files generated during the tests using the Nokogiri validator.
We have two XSD files. One for oddb_calc.xml and one for the rest.
Manually you can also validate (assuming that you have installed the xmlbeans tools) all generated XML-files using
* xsdvalidate oddb_calc.xsd oddb_article.xml oddb_calc.xml
* xsdvalidate oddb2xml.xsd oddb_article.xml oddb_code.xml oddb_interaction.xml oddb_product.xml oddb_substance.xml
## XML files
xml files generated are:
* oddb_substance.xml
* oddb_limitation.xml
* oddb_interaction.xml
* oddb_code.xml
* oddb_product.xml
* oddb_article.xml
* oddb_fi.xml
* oddb_fi_product.xml
### article.xml
oddb2xml creates article.xml as oddb_article.xml by default.
```
1
2731179
D
16105058
161051
2
A
N
N
HIRUDOID Creme 3 mg/g 40 g
HIRUDOID crème 3 mg/g 40 g
HIRUDOID CREME 3 MG/G 40 G
HIRUDOID CRèME 3 MG/G 40 G
Hirudoid
Hirudoid
2
7601001002258
E13
7680161050583
A
01.11.2012
PEXF
4.768575
01.11.2012
PPUB
8.8
09.09.2015
ZURROSE
4.77
09.09.2015
ZURROSEPUB
8.80
10
...
OK
14801
```
### product.xml
For example, if `-t _swiss` is given then oddb2xml creates product.xml as swiss_product.xml.
```
7680353660163
353661
KENDURAL Depottabl 30 Stk
KENDURAL cpr dépot 30 pce
B03AE10
06.07.1.
0
5
105
mg
1
1
500
mg
30
Tablette(n)
ferrum(II), acidum ascorbicum
ferrum(II) 105 mg ut ferrosi sulfas dessiccatus, acidum ascorbicum 500 mg ut natrii ascorbas, color.: E 124, excipiens pro compresso obducto.
...
OK
14336
```
### substance.xml
product.xml has relation to substance as ``.
```
1
Acidum ascorbicum (Vitamin C, E300)
2
Alprostadilum
...
OK
1441
```
## Data sources
We use the following files:
* https://www.swissmedic.ch/arzneimittel/00156/00221/00222/00230/index.html?lang=de (Präparateliste und zugelassene Packungen)
* https://download.epha.ch/cleaned/matrix.csv (Interactions from epha)
* http://refdatabase.refdata.ch/Service/Article.asmx
* http://bag.e-mediat.net/SL2007.Web.External/File.axd?file=XMLPublications.zip
* https://www.medregbm.admin.ch/Publikation/CreateExcelListBetriebs
* https://www.medregbm.admin.ch/Publikation/CreateExcelListMedizinalPersons
* http://zurrose.com/fileadmin/main/lib/download.php?file=/fileadmin/user_upload/downloads/ProduktUpdate/IGM11_mit_MwSt/Vollstamm/transfer.dat
* https://index.ws.e-mediat.net/Swissindex/NonPharma/ws_NonPharma_V101.asmx
* https://index.ws.e-mediat.net/Swissindex/NonPharma/ws_Pharma_V101.asmx
* http://download.swissmedicinfo.ch/ (AipsDownload)
* https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/LPPV.txt
* https://raw.githubusercontent.com/zdavatz/oddb2xml_files/master/BM_Update.txt
* https://raw.githubusercontent.com/epha/robot/master/data/manual/swissmedic/atc.csv
## Rules for matching GTIN (aka EAN13), product number and IKSNR
For drugs which appear in Packungen.xlsx file published by Swissmedic the following rule is used to create the GTIN
* First 4 digits identify SwissMedic and are fixed to 7680
* next 5 digits corresponding to IKSNR (authorization) number
* next 3 digits corresponding to Packungscode
* last digit is checksum
The product number is calculated as
* 5 digits corresponding to IKSNR (authorization) number
* 2 digits corresponding to Dosisstärke (aka sequence number)
In oddb_article.xml you find
* GTIN is found as "BC" inside "ARTBAR"
* The product number as field PRODNO
Example given. For the IKSNR 48305 sequence number 1 named "Felden, Gel" with Packungscode "024" we get GTIN 7680483050247 and a product number 483051.
## SSLv3 cert for Windows Users
Some websites need SSLv3 connection.
If you don't have these root CA files (x509), Please install these Certificates before running.
see [cURL Website](http://curl.haxx.se/ca/)
You can confirm wit `ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'`.
### Windows User: Making your SSL Certificate permanent via your PATH
1. Download this [cacert.pem](http://curl.haxx.se/ca/cacert.pem) (cURL) into your HOME directory.
* or directly select cacert.pem from your oddb2xml-x.x.x gems directory.
* tools/cacert.pem is bundled with the oddb2xml gem.
2. Then Choose Menu "Control Panel" > "System" > "Advanced system settings"
* This opens the "System Properties" Window.
3. Click "Advanced" Tab.
4. Click "Environment Variables" button.
5. Add set variable entry "SSL\_CERT\_FILE=%HOMEPATH%\cacert.pem"
* Variable name: SSL\_CERT\_FILE
* Variable value: %HOMEPATH%\cacert.pem
* with "New..." button into upper are "User variables for xxx"
6. Do not remove this cacert.pem. All SSLv3 connections use this file.
### win_fetch_cacerts.rb
You can also run
* tools/win_fetch_cacerts.rb
for your currently open Terminal to download and set the Certificate.
## Testing
* Calling rake spec runs spec tests.
* Calling rake test installs the gems and runs oddb2xml with the most commonly used combinations. All output is placed under under ausgabe/. These files should be manually compared to the ones generated by the last release to check for possible problems.
* we use the gem VCR to record real HTTP responses.
** Removing the directory fixtures and running @bundle exec rspec spec/downloader_spec.rb@ gets the actual content from the different servers
** To minimize the downloaded size we use several @before_record@ hooks to select the desired content, eg. only the 5 items from EPha.