de.oddb 2.0.0

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.
Files changed (431) hide show
  1. data/Guide.txt +3 -0
  2. data/History.txt +5 -0
  3. data/LICENCE.txt +339 -0
  4. data/Manifest.txt +430 -0
  5. data/README +423 -0
  6. data/README.txt +25 -0
  7. data/Rakefile +28 -0
  8. data/bin/admin +71 -0
  9. data/bin/exportd +44 -0
  10. data/bin/oddbd +33 -0
  11. data/data/fulltext/data/dicts/french/fulltext.aff +1057 -0
  12. data/data/fulltext/data/dicts/french/fulltext.dict +91189 -0
  13. data/data/fulltext/data/dicts/french/fulltext.stop +135 -0
  14. data/data/fulltext/data/dicts/german/fulltext.aff +1233 -0
  15. data/data/fulltext/data/dicts/german/fulltext.dict +287574 -0
  16. data/data/fulltext/data/dicts/german/fulltext.stop +133 -0
  17. data/data/fulltext/data/german_compound/README +15 -0
  18. data/data/fulltext/data/german_compound/compound.pl +63 -0
  19. data/data/fulltext/data/german_compound/german.stop +20 -0
  20. data/data/fulltext/data/ispell-german-compound.tar.gz +0 -0
  21. data/data/fulltext/redist/dict_french/Makefile +12 -0
  22. data/data/fulltext/redist/dict_french/README.french +1 -0
  23. data/data/fulltext/redist/dict_french/dict_french.sql.in +7 -0
  24. data/data/fulltext/redist/dict_french/dict_snowball.c +56 -0
  25. data/data/fulltext/redist/dict_french/french_stem.c +1222 -0
  26. data/data/fulltext/redist/dict_french/french_stem.h +16 -0
  27. data/data/fulltext/redist/dict_french/subinclude.h +2 -0
  28. data/data/fulltext/redist/dict_german/Makefile +12 -0
  29. data/data/fulltext/redist/dict_german/README.german +1 -0
  30. data/data/fulltext/redist/dict_german/dict_german.sql.in +7 -0
  31. data/data/fulltext/redist/dict_german/dict_snowball.c +56 -0
  32. data/data/fulltext/redist/dict_german/german_stem.c +527 -0
  33. data/data/fulltext/redist/dict_german/german_stem.h +16 -0
  34. data/data/fulltext/redist/dict_german/subinclude.h +1 -0
  35. data/data/fulltext/redist/french_stem.c +1222 -0
  36. data/data/fulltext/redist/french_stem.h +16 -0
  37. data/data/fulltext/redist/german_stem.c +527 -0
  38. data/data/fulltext/redist/german_stem.h +16 -0
  39. data/jobs/export_chde_xls +20 -0
  40. data/jobs/export_csv +20 -0
  41. data/jobs/export_fachinfo_yaml +20 -0
  42. data/jobs/export_patinfo_yaml +20 -0
  43. data/jobs/export_yaml +20 -0
  44. data/jobs/import_dimdi +15 -0
  45. data/jobs/import_gkv +19 -0
  46. data/jobs/import_pharma24 +15 -0
  47. data/jobs/import_pharmnet +30 -0
  48. data/jobs/import_whocc +18 -0
  49. data/lib/fixes/singular.rb +9 -0
  50. data/lib/fixes/yaml.rb +13 -0
  51. data/lib/oddb.rb +13 -0
  52. data/lib/oddb/business/company.rb +18 -0
  53. data/lib/oddb/business/grant_download.rb +27 -0
  54. data/lib/oddb/business/invoice.rb +75 -0
  55. data/lib/oddb/config.rb +112 -0
  56. data/lib/oddb/currency.rb +6 -0
  57. data/lib/oddb/drugs.rb +16 -0
  58. data/lib/oddb/drugs/active_agent.rb +37 -0
  59. data/lib/oddb/drugs/atc.rb +53 -0
  60. data/lib/oddb/drugs/composition.rb +41 -0
  61. data/lib/oddb/drugs/ddd.rb +24 -0
  62. data/lib/oddb/drugs/dose.rb +107 -0
  63. data/lib/oddb/drugs/galenic_form.rb +21 -0
  64. data/lib/oddb/drugs/galenic_group.rb +17 -0
  65. data/lib/oddb/drugs/package.rb +111 -0
  66. data/lib/oddb/drugs/part.rb +55 -0
  67. data/lib/oddb/drugs/product.rb +25 -0
  68. data/lib/oddb/drugs/sequence.rb +68 -0
  69. data/lib/oddb/drugs/substance.rb +31 -0
  70. data/lib/oddb/drugs/substance_group.rb +13 -0
  71. data/lib/oddb/drugs/unit.rb +12 -0
  72. data/lib/oddb/export.rb +4 -0
  73. data/lib/oddb/export/csv.rb +94 -0
  74. data/lib/oddb/export/l10n_sessions.rb +30 -0
  75. data/lib/oddb/export/rss.rb +44 -0
  76. data/lib/oddb/export/server.rb +137 -0
  77. data/lib/oddb/export/xls.rb +127 -0
  78. data/lib/oddb/export/yaml.rb +212 -0
  79. data/lib/oddb/html/state/download.rb +13 -0
  80. data/lib/oddb/html/state/drugs/admin/package.rb +190 -0
  81. data/lib/oddb/html/state/drugs/admin/product.rb +56 -0
  82. data/lib/oddb/html/state/drugs/admin/sequence.rb +253 -0
  83. data/lib/oddb/html/state/drugs/ajax/explain_ddd_price.rb +19 -0
  84. data/lib/oddb/html/state/drugs/ajax/explain_price.rb +19 -0
  85. data/lib/oddb/html/state/drugs/ajax/global.rb +18 -0
  86. data/lib/oddb/html/state/drugs/ajax/package_infos.rb +19 -0
  87. data/lib/oddb/html/state/drugs/ajax/remote_infos.rb +19 -0
  88. data/lib/oddb/html/state/drugs/atc_browser.rb +39 -0
  89. data/lib/oddb/html/state/drugs/atc_guidelines.rb +21 -0
  90. data/lib/oddb/html/state/drugs/compare.rb +52 -0
  91. data/lib/oddb/html/state/drugs/download_export.rb +18 -0
  92. data/lib/oddb/html/state/drugs/downloads.rb +42 -0
  93. data/lib/oddb/html/state/drugs/fachinfo.rb +21 -0
  94. data/lib/oddb/html/state/drugs/feedback.rb +91 -0
  95. data/lib/oddb/html/state/drugs/global.rb +270 -0
  96. data/lib/oddb/html/state/drugs/init.rb +18 -0
  97. data/lib/oddb/html/state/drugs/login.rb +17 -0
  98. data/lib/oddb/html/state/drugs/package.rb +32 -0
  99. data/lib/oddb/html/state/drugs/patinfo.rb +21 -0
  100. data/lib/oddb/html/state/drugs/products.rb +51 -0
  101. data/lib/oddb/html/state/drugs/result.rb +125 -0
  102. data/lib/oddb/html/state/global.rb +206 -0
  103. data/lib/oddb/html/state/global_predefine.rb +17 -0
  104. data/lib/oddb/html/state/limit.rb +17 -0
  105. data/lib/oddb/html/state/login.rb +56 -0
  106. data/lib/oddb/html/state/paypal/checkout.rb +97 -0
  107. data/lib/oddb/html/state/paypal/collect.rb +19 -0
  108. data/lib/oddb/html/state/paypal/download.rb +61 -0
  109. data/lib/oddb/html/state/paypal/redirect.rb +18 -0
  110. data/lib/oddb/html/state/register_download.rb +24 -0
  111. data/lib/oddb/html/state/register_export.rb +38 -0
  112. data/lib/oddb/html/state/register_poweruser.rb +17 -0
  113. data/lib/oddb/html/state/viral/admin.rb +79 -0
  114. data/lib/oddb/html/state/viral/poweruser.rb +16 -0
  115. data/lib/oddb/html/util/annotated_list.rb +39 -0
  116. data/lib/oddb/html/util/know_it_all.rb +28 -0
  117. data/lib/oddb/html/util/known_user.rb +55 -0
  118. data/lib/oddb/html/util/lookandfeel.rb +698 -0
  119. data/lib/oddb/html/util/need_all_input.rb +29 -0
  120. data/lib/oddb/html/util/session.rb +84 -0
  121. data/lib/oddb/html/util/sort.rb +72 -0
  122. data/lib/oddb/html/util/unsaved_helper.rb +20 -0
  123. data/lib/oddb/html/util/validator.rb +59 -0
  124. data/lib/oddb/html/view/ajax/json.rb +22 -0
  125. data/lib/oddb/html/view/alpha_header.rb +28 -0
  126. data/lib/oddb/html/view/document.rb +117 -0
  127. data/lib/oddb/html/view/download.rb +33 -0
  128. data/lib/oddb/html/view/drugs/admin/package.rb +245 -0
  129. data/lib/oddb/html/view/drugs/admin/product.rb +104 -0
  130. data/lib/oddb/html/view/drugs/admin/sequence.rb +305 -0
  131. data/lib/oddb/html/view/drugs/ajax/explain_ddd_price.rb +87 -0
  132. data/lib/oddb/html/view/drugs/ajax/explain_price.rb +61 -0
  133. data/lib/oddb/html/view/drugs/ajax/package_infos.rb +105 -0
  134. data/lib/oddb/html/view/drugs/ajax/remote_infos.rb +44 -0
  135. data/lib/oddb/html/view/drugs/atc_browser.rb +68 -0
  136. data/lib/oddb/html/view/drugs/atc_guidelines.rb +94 -0
  137. data/lib/oddb/html/view/drugs/compare.rb +95 -0
  138. data/lib/oddb/html/view/drugs/download_export.rb +28 -0
  139. data/lib/oddb/html/view/drugs/downloads.rb +128 -0
  140. data/lib/oddb/html/view/drugs/fachinfo.rb +46 -0
  141. data/lib/oddb/html/view/drugs/feedback.rb +235 -0
  142. data/lib/oddb/html/view/drugs/init.rb +51 -0
  143. data/lib/oddb/html/view/drugs/legend.rb +24 -0
  144. data/lib/oddb/html/view/drugs/package.rb +403 -0
  145. data/lib/oddb/html/view/drugs/patinfo.rb +46 -0
  146. data/lib/oddb/html/view/drugs/products.rb +97 -0
  147. data/lib/oddb/html/view/drugs/result.rb +296 -0
  148. data/lib/oddb/html/view/drugs/search.rb +33 -0
  149. data/lib/oddb/html/view/drugs/template.rb +15 -0
  150. data/lib/oddb/html/view/foot.rb +52 -0
  151. data/lib/oddb/html/view/google.rb +23 -0
  152. data/lib/oddb/html/view/google_ads.rb +40 -0
  153. data/lib/oddb/html/view/head.rb +78 -0
  154. data/lib/oddb/html/view/limit.rb +109 -0
  155. data/lib/oddb/html/view/list.rb +59 -0
  156. data/lib/oddb/html/view/login.rb +38 -0
  157. data/lib/oddb/html/view/navigation.rb +67 -0
  158. data/lib/oddb/html/view/offset_header.rb +35 -0
  159. data/lib/oddb/html/view/paypal/collect.rb +95 -0
  160. data/lib/oddb/html/view/paypal/redirect.rb +51 -0
  161. data/lib/oddb/html/view/paypal/register_form.rb +149 -0
  162. data/lib/oddb/html/view/register_download.rb +29 -0
  163. data/lib/oddb/html/view/register_export.rb +29 -0
  164. data/lib/oddb/html/view/register_poweruser.rb +29 -0
  165. data/lib/oddb/html/view/rss/feedback.rb +64 -0
  166. data/lib/oddb/html/view/rss_preview.rb +61 -0
  167. data/lib/oddb/html/view/search.rb +104 -0
  168. data/lib/oddb/html/view/snapback.rb +24 -0
  169. data/lib/oddb/html/view/template.rb +56 -0
  170. data/lib/oddb/import/dimdi.rb +583 -0
  171. data/lib/oddb/import/excel.rb +45 -0
  172. data/lib/oddb/import/gkv.rb +463 -0
  173. data/lib/oddb/import/importer.rb +36 -0
  174. data/lib/oddb/import/pharma24.rb +211 -0
  175. data/lib/oddb/import/pharmnet.rb +1186 -0
  176. data/lib/oddb/import/rtf.rb +409 -0
  177. data/lib/oddb/import/whocc.rb +148 -0
  178. data/lib/oddb/import/xml.rb +15 -0
  179. data/lib/oddb/model.rb +179 -0
  180. data/lib/oddb/persistence.rb +22 -0
  181. data/lib/oddb/persistence/odba.rb +32 -0
  182. data/lib/oddb/persistence/odba/business/company.rb +13 -0
  183. data/lib/oddb/persistence/odba/business/grant_download.rb +14 -0
  184. data/lib/oddb/persistence/odba/business/invoice.rb +15 -0
  185. data/lib/oddb/persistence/odba/drugs/atc.rb +15 -0
  186. data/lib/oddb/persistence/odba/drugs/galenic_form.rb +18 -0
  187. data/lib/oddb/persistence/odba/drugs/galenic_group.rb +13 -0
  188. data/lib/oddb/persistence/odba/drugs/package.rb +25 -0
  189. data/lib/oddb/persistence/odba/drugs/product.rb +13 -0
  190. data/lib/oddb/persistence/odba/drugs/sequence.rb +21 -0
  191. data/lib/oddb/persistence/odba/drugs/substance.rb +21 -0
  192. data/lib/oddb/persistence/odba/drugs/substance_group.rb +13 -0
  193. data/lib/oddb/persistence/odba/drugs/unit.rb +13 -0
  194. data/lib/oddb/persistence/odba/export.rb +26 -0
  195. data/lib/oddb/persistence/odba/model.rb +68 -0
  196. data/lib/oddb/persistence/odba/text/document.rb +11 -0
  197. data/lib/oddb/persistence/odba/util/code.rb +11 -0
  198. data/lib/oddb/persistence/odba/util/m10l_document.rb +13 -0
  199. data/lib/oddb/persistence/og.rb +16 -0
  200. data/lib/oddb/persistence/og/drugs/composition.rb +14 -0
  201. data/lib/oddb/persistence/og/drugs/product.rb +14 -0
  202. data/lib/oddb/persistence/og/drugs/sequence.rb +15 -0
  203. data/lib/oddb/persistence/og/model.rb +25 -0
  204. data/lib/oddb/persistence/og/util/multilingual.rb +13 -0
  205. data/lib/oddb/redist/rtf_tools/reader.rb +139 -0
  206. data/lib/oddb/remote/business/company.rb +17 -0
  207. data/lib/oddb/remote/drugs/active_agent.rb +27 -0
  208. data/lib/oddb/remote/drugs/atc.rb +31 -0
  209. data/lib/oddb/remote/drugs/dose.rb +8 -0
  210. data/lib/oddb/remote/drugs/galenic_form.rb +24 -0
  211. data/lib/oddb/remote/drugs/package.rb +128 -0
  212. data/lib/oddb/remote/drugs/part.rb +30 -0
  213. data/lib/oddb/remote/drugs/substance.rb +20 -0
  214. data/lib/oddb/remote/drugs/unit.rb +20 -0
  215. data/lib/oddb/remote/object.rb +36 -0
  216. data/lib/oddb/text/chapter.rb +23 -0
  217. data/lib/oddb/text/document.rb +42 -0
  218. data/lib/oddb/text/format.rb +37 -0
  219. data/lib/oddb/text/paragraph.rb +53 -0
  220. data/lib/oddb/text/picture.rb +89 -0
  221. data/lib/oddb/text/table.rb +68 -0
  222. data/lib/oddb/util.rb +9 -0
  223. data/lib/oddb/util/annotated_list.rb +37 -0
  224. data/lib/oddb/util/code.rb +69 -0
  225. data/lib/oddb/util/comparison.rb +36 -0
  226. data/lib/oddb/util/download.rb +17 -0
  227. data/lib/oddb/util/exporter.rb +8 -0
  228. data/lib/oddb/util/feedback.rb +23 -0
  229. data/lib/oddb/util/ipn.rb +53 -0
  230. data/lib/oddb/util/job.rb +23 -0
  231. data/lib/oddb/util/logger.rb +20 -0
  232. data/lib/oddb/util/m10l_document.rb +41 -0
  233. data/lib/oddb/util/mail.rb +87 -0
  234. data/lib/oddb/util/money.rb +64 -0
  235. data/lib/oddb/util/multilingual.rb +70 -0
  236. data/lib/oddb/util/quanty.rb +3 -0
  237. data/lib/oddb/util/quanty/fact.rb +242 -0
  238. data/lib/oddb/util/quanty/main.rb +164 -0
  239. data/lib/oddb/util/quanty/parse.rb +872 -0
  240. data/lib/oddb/util/quanty/units.dump +0 -0
  241. data/lib/oddb/util/server.rb +150 -0
  242. data/lib/oddb/util/smtp_tls.rb +58 -0
  243. data/lib/oddb/util/updater.rb +161 -0
  244. data/lib/oddb/util/ydim.rb +110 -0
  245. data/lib/oddb/util/yus.rb +46 -0
  246. data/test/business/test_company.rb +29 -0
  247. data/test/business/test_grant_download.rb +29 -0
  248. data/test/drugs/test_active_agent.rb +53 -0
  249. data/test/drugs/test_atc.rb +54 -0
  250. data/test/drugs/test_composition.rb +88 -0
  251. data/test/drugs/test_ddd.rb +22 -0
  252. data/test/drugs/test_dose.rb +189 -0
  253. data/test/drugs/test_galenic_form.rb +41 -0
  254. data/test/drugs/test_package.rb +172 -0
  255. data/test/drugs/test_part.rb +32 -0
  256. data/test/drugs/test_product.rb +31 -0
  257. data/test/drugs/test_sequence.rb +140 -0
  258. data/test/drugs/test_substance.rb +51 -0
  259. data/test/drugs/test_substance_group.rb +27 -0
  260. data/test/export/test_rss.rb +86 -0
  261. data/test/export/test_server.rb +163 -0
  262. data/test/export/test_xls.rb +146 -0
  263. data/test/export/test_yaml.rb +120 -0
  264. data/test/import/data/csv/products.csv +11 -0
  265. data/test/import/data/html/dimdi_index.html +400 -0
  266. data/test/import/data/html/gkv/Befreiungsliste_Arzneimittel_Versicherte.gkvnet +508 -0
  267. data/test/import/data/html/pharma24/1337397.html +754 -0
  268. data/test/import/data/html/pharma24/842756.html +570 -0
  269. data/test/import/data/html/pharma24/ac-page-10.html +2999 -0
  270. data/test/import/data/html/pharma24/ac-page-11.html +2999 -0
  271. data/test/import/data/html/pharma24/ac-page-12.html +2999 -0
  272. data/test/import/data/html/pharma24/ac-page-13.html +2999 -0
  273. data/test/import/data/html/pharma24/ac-page-14.html +2999 -0
  274. data/test/import/data/html/pharma24/ac-page-15.html +3011 -0
  275. data/test/import/data/html/pharma24/ac-page-16.html +3050 -0
  276. data/test/import/data/html/pharma24/ac-page-17.html +3285 -0
  277. data/test/import/data/html/pharma24/ac-page-18.html +3109 -0
  278. data/test/import/data/html/pharma24/ac-page-19.html +3126 -0
  279. data/test/import/data/html/pharma24/ac-page-2.html +3005 -0
  280. data/test/import/data/html/pharma24/ac-page-20.html +3007 -0
  281. data/test/import/data/html/pharma24/ac-page-21.html +2999 -0
  282. data/test/import/data/html/pharma24/ac-page-22.html +2999 -0
  283. data/test/import/data/html/pharma24/ac-page-23.html +3055 -0
  284. data/test/import/data/html/pharma24/ac-page-24.html +2999 -0
  285. data/test/import/data/html/pharma24/ac-page-25.html +3004 -0
  286. data/test/import/data/html/pharma24/ac-page-26.html +2999 -0
  287. data/test/import/data/html/pharma24/ac-page-27.html +3167 -0
  288. data/test/import/data/html/pharma24/ac-page-28.html +3236 -0
  289. data/test/import/data/html/pharma24/ac-page-29.html +3110 -0
  290. data/test/import/data/html/pharma24/ac-page-3.html +2999 -0
  291. data/test/import/data/html/pharma24/ac-page-30.html +2999 -0
  292. data/test/import/data/html/pharma24/ac-page-31.html +2999 -0
  293. data/test/import/data/html/pharma24/ac-page-32.html +2999 -0
  294. data/test/import/data/html/pharma24/ac-page-33.html +3001 -0
  295. data/test/import/data/html/pharma24/ac-page-34.html +2999 -0
  296. data/test/import/data/html/pharma24/ac-page-35.html +2999 -0
  297. data/test/import/data/html/pharma24/ac-page-36.html +2999 -0
  298. data/test/import/data/html/pharma24/ac-page-37.html +2999 -0
  299. data/test/import/data/html/pharma24/ac-page-38.html +3003 -0
  300. data/test/import/data/html/pharma24/ac-page-39.html +2999 -0
  301. data/test/import/data/html/pharma24/ac-page-4.html +2999 -0
  302. data/test/import/data/html/pharma24/ac-page-40.html +2999 -0
  303. data/test/import/data/html/pharma24/ac-page-41.html +2999 -0
  304. data/test/import/data/html/pharma24/ac-page-42.html +2999 -0
  305. data/test/import/data/html/pharma24/ac-page-43.html +2999 -0
  306. data/test/import/data/html/pharma24/ac-page-44.html +2999 -0
  307. data/test/import/data/html/pharma24/ac-page-45.html +2999 -0
  308. data/test/import/data/html/pharma24/ac-page-46.html +2999 -0
  309. data/test/import/data/html/pharma24/ac-page-47.html +2999 -0
  310. data/test/import/data/html/pharma24/ac-page-48.html +2999 -0
  311. data/test/import/data/html/pharma24/ac-page-49.html +2999 -0
  312. data/test/import/data/html/pharma24/ac-page-5.html +3168 -0
  313. data/test/import/data/html/pharma24/ac-page-50.html +2999 -0
  314. data/test/import/data/html/pharma24/ac-page-51.html +2999 -0
  315. data/test/import/data/html/pharma24/ac-page-52.html +3003 -0
  316. data/test/import/data/html/pharma24/ac-page-53.html +2999 -0
  317. data/test/import/data/html/pharma24/ac-page-54.html +3095 -0
  318. data/test/import/data/html/pharma24/ac-page-55.html +3041 -0
  319. data/test/import/data/html/pharma24/ac-page-56.html +2999 -0
  320. data/test/import/data/html/pharma24/ac-page-57.html +3001 -0
  321. data/test/import/data/html/pharma24/ac-page-58.html +3001 -0
  322. data/test/import/data/html/pharma24/ac-page-59.html +2999 -0
  323. data/test/import/data/html/pharma24/ac-page-6.html +3072 -0
  324. data/test/import/data/html/pharma24/ac-page-60.html +3001 -0
  325. data/test/import/data/html/pharma24/ac-page-61.html +3005 -0
  326. data/test/import/data/html/pharma24/ac-page-62.html +2999 -0
  327. data/test/import/data/html/pharma24/ac-page-63.html +3007 -0
  328. data/test/import/data/html/pharma24/ac-page-64.html +3007 -0
  329. data/test/import/data/html/pharma24/ac-page-65.html +2999 -0
  330. data/test/import/data/html/pharma24/ac-page-66.html +3011 -0
  331. data/test/import/data/html/pharma24/ac-page-67.html +3026 -0
  332. data/test/import/data/html/pharma24/ac-page-68.html +2999 -0
  333. data/test/import/data/html/pharma24/ac-page-69.html +3010 -0
  334. data/test/import/data/html/pharma24/ac-page-7.html +2999 -0
  335. data/test/import/data/html/pharma24/ac-page-70.html +3192 -0
  336. data/test/import/data/html/pharma24/ac-page-71.html +3133 -0
  337. data/test/import/data/html/pharma24/ac-page-72.html +2999 -0
  338. data/test/import/data/html/pharma24/ac-page-73.html +3227 -0
  339. data/test/import/data/html/pharma24/ac-page-74.html +3241 -0
  340. data/test/import/data/html/pharma24/ac-page-75.html +3227 -0
  341. data/test/import/data/html/pharma24/ac-page-76.html +3244 -0
  342. data/test/import/data/html/pharma24/ac-page-77.html +1164 -0
  343. data/test/import/data/html/pharma24/ac-page-8.html +2999 -0
  344. data/test/import/data/html/pharma24/ac-page-9.html +2999 -0
  345. data/test/import/data/html/pharma24/ac.html +2999 -0
  346. data/test/import/data/html/pharmnet/display.html +662 -0
  347. data/test/import/data/html/pharmnet/display1.html +625 -0
  348. data/test/import/data/html/pharmnet/display2.html +625 -0
  349. data/test/import/data/html/pharmnet/display3.html +625 -0
  350. data/test/import/data/html/pharmnet/display_tramal.html +634 -0
  351. data/test/import/data/html/pharmnet/empty_result.html +395 -0
  352. data/test/import/data/html/pharmnet/gate.html +246 -0
  353. data/test/import/data/html/pharmnet/index.html +258 -0
  354. data/test/import/data/html/pharmnet/paged_result_1.html +401 -0
  355. data/test/import/data/html/pharmnet/paged_result_2.html +401 -0
  356. data/test/import/data/html/pharmnet/result.html +401 -0
  357. data/test/import/data/html/pharmnet/search.html +865 -0
  358. data/test/import/data/html/pharmnet/search_filtered.html +182 -0
  359. data/test/import/data/html/whocc/A.html +56 -0
  360. data/test/import/data/html/whocc/A03.html +48 -0
  361. data/test/import/data/html/whocc/A03AB.html +48 -0
  362. data/test/import/data/html/whocc/A06AA.html +47 -0
  363. data/test/import/data/html/whocc/C03.html +47 -0
  364. data/test/import/data/html/whocc/login.html +77 -0
  365. data/test/import/data/mail/csv.mail +81 -0
  366. data/test/import/data/rtf/pharmnet/aarane.pi.rtf +648 -0
  367. data/test/import/data/rtf/pharmnet/ace_hemmer_ratio.pi.rtf +324 -0
  368. data/test/import/data/rtf/pharmnet/ace_hemmer_ratio.rtf +4816 -0
  369. data/test/import/data/rtf/pharmnet/acemetacin.pi.rtf +388 -0
  370. data/test/import/data/rtf/pharmnet/acemit.pi.rtf +240 -0
  371. data/test/import/data/rtf/pharmnet/acerbon.pi.rtf +1257 -0
  372. data/test/import/data/rtf/pharmnet/acetylcystein.pi.rtf +323 -0
  373. data/test/import/data/rtf/pharmnet/aciclo.pi.rtf +287 -0
  374. data/test/import/data/rtf/pharmnet/aciclovir.pi.rtf +236 -0
  375. data/test/import/data/rtf/pharmnet/actrapid.pi.rtf +322 -0
  376. data/test/import/data/rtf/pharmnet/amlodipin.pi.rtf +452 -0
  377. data/test/import/data/rtf/pharmnet/amlodipin.rtf +473 -0
  378. data/test/import/data/rtf/pharmnet/aspirin.pi.rtf +313 -0
  379. data/test/import/data/rtf/pharmnet/aspirin.rtf +781 -0
  380. data/test/import/data/rtf/pharmnet/baymycard.pi.rtf +447 -0
  381. data/test/import/data/rtf/pharmnet/omeprazol.pi.rtf +510 -0
  382. data/test/import/data/rtf/pharmnet/omeprazol.rtf +9216 -0
  383. data/test/import/data/rtf/pharmnet/paroxetin.pi.rtf +678 -0
  384. data/test/import/data/rtf/pharmnet/selegilin.pi.rtf +312 -0
  385. data/test/import/data/rtf/pharmnet/selegilin.rtf +683 -0
  386. data/test/import/data/rtf/pharmnet/valium.pi.rtf +387 -0
  387. data/test/import/data/txt/gkv/gkv_p1.txt +17 -0
  388. data/test/import/data/xls/darform_010706.xls +0 -0
  389. data/test/import/data/xls/fb010706.xls +0 -0
  390. data/test/import/data/xls/liste_zuzahlungsbefreite_arzneimittel_suchfunktion.xls +0 -0
  391. data/test/import/data/xls/wirkkurz_010406.xls +0 -0
  392. data/test/import/data/xml/ATC_2006.xml +47 -0
  393. data/test/import/data/xml/ATC_2006_ddd.xml +35 -0
  394. data/test/import/test_dimdi.rb +323 -0
  395. data/test/import/test_excel.rb +31 -0
  396. data/test/import/test_gkv.rb +260 -0
  397. data/test/import/test_pharma24.rb +112 -0
  398. data/test/import/test_pharmnet.rb +980 -0
  399. data/test/import/test_rtf.rb +37 -0
  400. data/test/import/test_whocc.rb +314 -0
  401. data/test/remote/drugs/test_active_agent.rb +36 -0
  402. data/test/selenium/selenium-server.jar +0 -0
  403. data/test/selenium/test_atc_browser.rb +121 -0
  404. data/test/selenium/test_atc_guidelines.rb +95 -0
  405. data/test/selenium/test_collect.rb +137 -0
  406. data/test/selenium/test_compare.rb +294 -0
  407. data/test/selenium/test_fachinfo.rb +128 -0
  408. data/test/selenium/test_feedback.rb +192 -0
  409. data/test/selenium/test_init.rb +64 -0
  410. data/test/selenium/test_limit.rb +304 -0
  411. data/test/selenium/test_login.rb +67 -0
  412. data/test/selenium/test_package.rb +516 -0
  413. data/test/selenium/test_patinfo.rb +128 -0
  414. data/test/selenium/test_product.rb +80 -0
  415. data/test/selenium/test_products.rb +141 -0
  416. data/test/selenium/test_search.rb +933 -0
  417. data/test/selenium/test_sequence.rb +513 -0
  418. data/test/selenium/unit.rb +190 -0
  419. data/test/stub/http_server.rb +144 -0
  420. data/test/stub/model.rb +173 -0
  421. data/test/suite.rb +15 -0
  422. data/test/test_model.rb +83 -0
  423. data/test/util/test_code.rb +74 -0
  424. data/test/util/test_ipn.rb +117 -0
  425. data/test/util/test_mail.rb +85 -0
  426. data/test/util/test_multilingual.rb +97 -0
  427. data/test/util/test_server.rb +94 -0
  428. data/test/util/test_updater.rb +130 -0
  429. data/test/util/test_ydim.rb +115 -0
  430. data/test/util/test_yus.rb +79 -0
  431. metadata +568 -0
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # Import::Excel -- de.oddb.org -- 12.09.2006 -- hwyss@ywesee.com
3
+
4
+ require 'spreadsheet'
5
+ require 'oddb/import/importer'
6
+
7
+ module ODDB
8
+ module Import
9
+ class Excel < Importer
10
+ attr_reader :report
11
+ def cell(row, idx)
12
+ if(cell = row[idx])
13
+ case cell
14
+ when Date, DateTime
15
+ cell
16
+ when Numeric
17
+ cell.to_f
18
+ else
19
+ u(cell.to_s).strip
20
+ end
21
+ end
22
+ end
23
+ def import(io)
24
+ workbook = parse(io)
25
+ import_worksheet(workbook.worksheet(0))
26
+ postprocess()
27
+ report
28
+ end
29
+ def import_worksheet(worksheet)
30
+ worksheet.each(@skip_rows) { |row|
31
+ import_row(row)
32
+ }
33
+ end
34
+ def parse(io)
35
+ Spreadsheet.open(io)
36
+ end
37
+ end
38
+ class DatedExcel < Excel
39
+ def initialize(date = Date.today)
40
+ super()
41
+ @date = date
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,463 @@
1
+ #!/usr/bin/env ruby
2
+ # Import::Gkv -- de.oddb.org -- 17.08.2009 -- hwyss@ywesee.com
3
+
4
+ require 'rpdf2txt/default_handler'
5
+ require 'rpdf2txt/parser'
6
+ require 'mechanize'
7
+ require 'open-uri'
8
+ require 'oddb/import/importer'
9
+ require 'oddb/util/money'
10
+ require 'drb'
11
+
12
+ module ODDB
13
+ module Import
14
+ class GkvHandler < Rpdf2txt::SimpleHandler
15
+ attr_reader :pairs
16
+ def initialize callback
17
+ @callback = callback
18
+ @rows = []
19
+ reset
20
+ end
21
+ def reset
22
+ @current_line = ''
23
+ end
24
+ def send_flowing_data(data)
25
+ @current_line << data
26
+ end
27
+ def send_line_break
28
+ data = @current_line.strip.split /\s{3,}/
29
+ if /^\d{6,}$/.match(data[1].to_s)
30
+ ## ensure consistent row-length, so we can append additional substances
31
+ # to the tail
32
+ data[9] ||= nil
33
+ @rows.push data
34
+ else
35
+ @rows.push :doubtful
36
+ end
37
+ reset
38
+ end
39
+ def send_page
40
+ @callback.call @rows
41
+ @rows = []
42
+ reset
43
+ end
44
+ end
45
+ class Gkv < Importer
46
+ def initialize
47
+ super
48
+ @assigned_companies = 0
49
+ @assigned_equivalences = 0
50
+ @confirmed_pzns = {}
51
+ @count = 0
52
+ @created = 0
53
+ @created_companies = 0
54
+ @created_products = 0
55
+ @created_sequences = 0
56
+ @created_substances = 0
57
+ @deleted = 0
58
+ @existing = 0
59
+ @existing_companies = 0
60
+ @existing_substances = 0
61
+ @doubtful_pzns = []
62
+ @missingname_uids = [] # UIDs of products which has no name
63
+ end
64
+ def download_latest(url, opts={}, &block)
65
+ opts = {:date => Date.today}.merge(opts)
66
+ file = File.basename(url)
67
+ pdf_dir = File.join(ODDB.config.var, 'pdf/gkv')
68
+ FileUtils.mkdir_p(pdf_dir)
69
+ dest = File.join(pdf_dir, file)
70
+ archive = File.join(ODDB.config.var, 'pdf/gkv',
71
+ sprintf("%s-%s", opts[:date].strftime("%Y.%m.%d"), file))
72
+ content = open(url).read
73
+ if(!File.exist?(dest) || content.size != File.size(dest))
74
+ open(archive, 'w') { |local|
75
+ local << content
76
+ }
77
+ open(archive, 'r', &block)
78
+ open(dest, 'w') { |local|
79
+ local << content
80
+ }
81
+ end
82
+ rescue StandardError => error
83
+ ODDB.logger.error('Gkv') { error.message }
84
+ end
85
+ def latest_url agent, opts={}
86
+ host = 'https://www.gkv-spitzenverband.de'
87
+ url = '/Befreiungsliste_Arzneimittel_Versicherte.gkvnet'
88
+ page = agent.get host + url
89
+ file_base_name = "Zuzahlungsbefreit"
90
+ link = (page/'a').map{|tag| tag['href']}.grep(/#{file_base_name}/)
91
+ if link.length == 1 and link.to_s.match(/\.pdf/)
92
+ return host + link.to_s
93
+ else
94
+ return nil
95
+ end
96
+ end
97
+ def import fh, opts={}
98
+ parser = Rpdf2txt::Parser.new(fh.read, 'utf8')
99
+ handler = GkvHandler.new method(:process_page)
100
+ parser.extract_text handler
101
+ postprocess
102
+ report
103
+ end
104
+ def import_row(row)
105
+ if row == :doubtful
106
+ @doubtful_pzns.push @created_pzn if @created_pzn
107
+ @created_pzn = nil
108
+ return
109
+ end
110
+ @count += 1
111
+ package = import_package(row)
112
+ return if package.nil?
113
+ @confirmed_pzns.store(package.code(:cid).value, true)
114
+ if(code = package.code(:zuzahlungsbefreit))
115
+ if(code.value)
116
+ @existing += 1
117
+ else
118
+ @created += 1
119
+ end
120
+ code.value = true
121
+ else
122
+ @created += 1
123
+ code = Util::Code.new(:zuzahlungsbefreit, true, 'DE')
124
+ package.add_code(code)
125
+ end
126
+ sequence = package.sequence
127
+ product = sequence.product if sequence
128
+ part = package.parts.first
129
+ mnum, qnum = row.at(6).to_s.split('X')
130
+ if(qnum.nil?)
131
+ mnum, qnum = qnum, mnum
132
+ end
133
+ sunit = row.at(7)
134
+ if(sunit == "ml")
135
+ dose = Drugs::Dose.new(qnum, sunit)
136
+ if(part.quantity != dose || part.size != mnum)
137
+ part.quantity = dose
138
+ part.size = mnum
139
+ part.unit = nil
140
+ save part
141
+ end
142
+ else
143
+ unit = Drugs::Unit.find_by_name(row.at(8))
144
+ changed = false
145
+ if(qnum && part.size != qnum)
146
+ part.size = qnum
147
+ changed = true
148
+ end
149
+ if(unit && part.unit != unit)
150
+ part.unit = unit
151
+ changed = true
152
+ end
153
+ save(part) if changed
154
+ end
155
+ if(product && (company = import_company(row)) && product.company != company)
156
+ product.company = company
157
+ save product
158
+ end
159
+ if sequence
160
+ import_active_agent(sequence, row, 3)
161
+ import_active_agent(sequence, row, 10)
162
+ import_active_agent(sequence, row, 13)
163
+ end
164
+ save package
165
+ end
166
+ def import_active_agent(sequence, row, offset)
167
+ name = row.at(offset)
168
+ sane = sanitize_substance_name(name)
169
+ composition = sequence.compositions.first
170
+ dose = Drugs::Dose.new(row.at(offset + 1),
171
+ row.at(offset + 2))
172
+ ## check for slightly different names
173
+ if(composition \
174
+ && (agent = composition.active_agents.find { |act|
175
+ act.substance.name.all.any? { |sub|
176
+ sane == sanitize_substance_name(sub)
177
+ }
178
+ }))
179
+ agent.dose = dose
180
+ save agent
181
+ substance = agent.substance
182
+ if(substance.name != name)
183
+ substance.name.add_synonym(name) && save(substance)
184
+ end
185
+ elsif(substance = import_substance(name))
186
+ ## for now: don't expect multiple compositions
187
+ if(composition.nil?)
188
+ composition = Drugs::Composition.new
189
+ composition.sequence = sequence
190
+ save composition
191
+ save sequence
192
+ end
193
+ candidate_names = [ name[/^\S+/], name[/^[^-]+/] ]
194
+ composition.active_agents.each { |agent|
195
+ other = agent.substance.name.de
196
+ if other == name[0,other.length]
197
+ candidate_names.push other
198
+ end
199
+ }
200
+ candidate_names.uniq!
201
+ agent = nil
202
+ if(agent = composition.active_agent(substance))
203
+ agent.dose = dose
204
+ save agent
205
+ elsif(candidate_names.any? { |name|
206
+ agent = composition.active_agent(name) } )
207
+ previous = agent.chemical_equivalence
208
+ if(previous && previous.substance == substance)
209
+ previous.dose = dose
210
+ save previous
211
+ else
212
+ previous.delete if(previous)
213
+ chemical = Drugs::ActiveAgent.new(substance, dose)
214
+ save chemical
215
+ agent.chemical_equivalence = chemical
216
+ save agent
217
+ end
218
+ else
219
+ agent = Drugs::ActiveAgent.new(substance, dose)
220
+ agent.composition = composition
221
+ end
222
+ end
223
+ end
224
+ def import_company(row)
225
+ if name = row.at(2)
226
+ cname = company_name(name)
227
+ company = Business::Company.find_by_name(cname)
228
+ if(company)
229
+ @existing_companies += 1
230
+ else
231
+ @created_companies += 1
232
+ company = Business::Company.new
233
+ company.name.de = cname
234
+ save company
235
+ end
236
+ company
237
+ end
238
+ end
239
+ def import_galenic_form(row)
240
+ Drugs::GalenicForm.find_by_description(:value => row.at(7),
241
+ :type => "galenic_form",
242
+ :country => 'DE')
243
+ end
244
+ def import_package(row)
245
+ pzn = row.at(1).to_i
246
+ return if(pzn == 0)
247
+ pzn = u(pzn.to_s)
248
+ package = Drugs::Package.find_by_code(:type => 'cid',
249
+ :value => pzn,
250
+ :country => 'DE')
251
+ @created_pzn = nil
252
+ if(package.nil?)
253
+ @created_pzn = pzn
254
+ package = Drugs::Package.new
255
+ package.add_code(Util::Code.new(:cid, pzn, 'DE'))
256
+ part = Drugs::Part.new
257
+ part.package = package
258
+ save part
259
+ product = import_product(package, row)
260
+ package.sequence = import_sequence(product, package, row)
261
+ # save(package) is called at the end of import_row
262
+ end
263
+ if(amount = row.at(9))
264
+ import_price package, :public, amount.tr(',', '.').to_f
265
+ if(efp = package._price_exfactory)
266
+ import_price(package, :exfactory, efp.to_f)
267
+ end
268
+ end
269
+ package
270
+ end
271
+ def import_price(package, type, amount)
272
+ dotype = :"price_#{type}"
273
+ # if this price has been edited manually we won't overwrite
274
+ unless((data_origin = package.data_origin(dotype)) \
275
+ && data_origin.to_s.include?('@'))
276
+ if(price = package.price(type, 'DE'))
277
+ if(price != amount)
278
+ price.amount = amount
279
+ end
280
+ else
281
+ price = Util::Money.new(amount, type, 'DE')
282
+ package.add_price(price)
283
+ end
284
+ package.data_origins.store dotype, :gkv
285
+ end
286
+ end
287
+ def import_product(package, row)
288
+ name = product_name(row)
289
+ search = name.dup
290
+ product = nil
291
+ candidates = []
292
+ until(product || search.empty? || candidates.size > 1)
293
+ candidates = Drugs::Product.search_by_name(search)
294
+ if(candidates.size == 1)
295
+ product = candidates.first
296
+ product.name.add_synonym(name) && save(product)
297
+ end
298
+ search.sub!(/(\s|^)\S*$/, '')
299
+ end
300
+ if(product.nil?)
301
+ @created_products += 1
302
+ product = Drugs::Product.new
303
+ product.name.de = name
304
+ save product
305
+ end
306
+ product
307
+ end
308
+ def import_sequence(product, package, row)
309
+ substances = []
310
+ doses = []
311
+ [3, 10, 13].each { |idx|
312
+ if(name = row.at(idx))
313
+ substances.push(import_substance(name))
314
+ doses.push(Drugs::Dose.new(row.at(idx + 1),
315
+ row.at(idx + 2)))
316
+ end
317
+ }
318
+ galform = import_galenic_form(row)
319
+ sequence = product.sequences.find { |seq|
320
+ doses = seq.doses
321
+ seq.galenic_forms == [galform] \
322
+ && seq.substances == substances \
323
+ && (doses.empty? || doses.inject { |a, b| a + b } == dose)
324
+ }
325
+ if(sequence.nil?)
326
+ @created_sequences += 1
327
+ sequence = Drugs::Sequence.new
328
+ composition = Drugs::Composition.new
329
+ substances.each_with_index { |sub, idx|
330
+ act = Drugs::ActiveAgent.new(sub, doses.at(idx))
331
+ act.composition = composition
332
+ }
333
+ composition.galenic_form = galform
334
+ composition.sequence = sequence
335
+ save composition
336
+ sequence.product = product
337
+ save sequence
338
+ end
339
+ sequence
340
+ end
341
+ def import_substance(substance_name)
342
+ if(substance_name)
343
+ substance = Drugs::Substance.find_by_name(substance_name)
344
+ if(substance)
345
+ @existing_substances += 1
346
+ else
347
+ @created_substances += 1
348
+ substance = Drugs::Substance.new
349
+ substance.name.de = substance_name
350
+ save substance
351
+ end
352
+ substance
353
+ end
354
+ end
355
+ def postprocess
356
+ Drugs::Package.search_by_code(:type => 'zuzahlungsbefreit',
357
+ :value => 'true',
358
+ :country => 'DE').each { |package|
359
+ pzn = package.code(:cid).value
360
+ unless(@confirmed_pzns.include?(pzn))
361
+ @deleted += 1
362
+ package.code(:zuzahlungsbefreit).value = false
363
+ save package
364
+ end
365
+ } unless(@confirmed_pzns.empty?)
366
+ Drugs::Product.all { |product|
367
+ unless(product.company)
368
+ unless(product.name.de)
369
+ @missingname_uids.push product.odba_id
370
+ else
371
+ keys = product.name.de.split
372
+ key = keys.pop
373
+ if(key == 'Comp')
374
+ key = keys.pop
375
+ end
376
+ company = Business::Company.find_by_name(key)
377
+ if(company.nil?)
378
+ companies = Business::Company.search_by_name(key)
379
+ if(companies.size == 1)
380
+ company = companies.pop
381
+ end
382
+ end
383
+ if(company)
384
+ @assigned_companies += 1
385
+ product.company = company
386
+ save product
387
+ end
388
+ end
389
+ end
390
+ }
391
+ Drugs::Composition.all { |composition|
392
+ next if(composition.active_agents.size < 2)
393
+ composition.active_agents.dup.each { |agent|
394
+ next unless composition.active_agents.include?(agent)
395
+ name = agent.substance.name.de
396
+ if(other = composition.active_agents.find { |candidate|
397
+ candidate != agent \
398
+ && candidate.substance.name.de[0,name.length] == name })
399
+ qty = other.dose.qty
400
+ if(qty > 0 && qty == qty.to_i && !other.chemical_equivalence)
401
+ agent, other = other, agent
402
+ end
403
+ if(agent.chemical_equivalence)
404
+ raise "multiple chemical equivalences in #{composition.parts.first.package.code(:cid)}"
405
+ end
406
+ @assigned_equivalences += 1
407
+ composition.remove_active_agent(other)
408
+ agent.chemical_equivalence = other
409
+ save agent
410
+ save other
411
+ save composition
412
+ end
413
+ }
414
+ }
415
+ end
416
+ def product_name(row)
417
+ if data = row.at(0)
418
+ capitalize_all(data.gsub(/[^A-Z\s]/, '').gsub(/\s+/, ' ')).strip
419
+ end
420
+ end
421
+ def report
422
+ doubtfuls = @doubtful_pzns.collect do |pzn|
423
+ "http://de.oddb.org/de/drugs/package/pzn/#{pzn}"
424
+ end
425
+ missingnames = @missingname_uids.collect do |uid|
426
+ "http://de.oddb.org/de/drugs/product/uid/#{uid}"
427
+ end
428
+ [
429
+ sprintf("Imported %5i Zubef-Entries on %s:",
430
+ @count, Date.today.strftime("%d.%m.%Y")),
431
+ sprintf("Visited %5i existing Zubef-Entries", @existing),
432
+ sprintf("Visited %5i existing Companies",
433
+ @existing_companies),
434
+ sprintf("Visited %5i existing Substances",
435
+ @existing_substances),
436
+ sprintf("Created %5i new Zubef-Entries", @created),
437
+ sprintf("Created %5i new Products", @created_products),
438
+ sprintf("Created %5i new Sequences", @created_sequences),
439
+ sprintf("Created %5i new Companies", @created_companies),
440
+ sprintf("Created %5i new Substances", @created_substances),
441
+ sprintf("Assigned %5i Chemical Equivalences",
442
+ @assigned_equivalences),
443
+ sprintf("Assigned %5i Companies", @assigned_companies),
444
+ sprintf("Created %5i Incomplete Packages:", doubtfuls.size),
445
+ ].concat(doubtfuls) +
446
+ [
447
+ sprintf("Created %5i Product(s) without a name (missing product name):", missingnames.size),
448
+ ].concat(missingnames)
449
+ end
450
+ def sanitize_substance_name(str)
451
+ str.to_s.downcase.gsub(/[^a-z]/, '')
452
+ end
453
+ def save(obj)
454
+ obj.save
455
+ end
456
+ def process_page rows
457
+ rows.each do |row|
458
+ import_row row
459
+ end
460
+ end
461
+ end
462
+ end
463
+ end