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,127 @@
1
+ #!/usr/bin/env ruby
2
+ # Export::Xls -- de.oddb.org -- 13.03.2007 -- hwyss@ywesee.com
3
+
4
+ require 'fileutils'
5
+ require 'spreadsheet/excel'
6
+ require 'oddb/currency'
7
+ require 'oddb/remote/drugs/package'
8
+ require 'oddb/util/comparison'
9
+
10
+ module ODDB
11
+ module Export
12
+ module Xls
13
+ class ComparisonDeCh
14
+ attr_reader :error_data
15
+ attr_reader :backtrace_info
16
+ def export(drb_uri, io)
17
+ write_xls(io, collect_comparables(drb_uri))
18
+ end
19
+ def adjust_price(price)
20
+ price * currency_rate * tax_factor
21
+ end
22
+ def collect_comparables(drb_uri)
23
+ data = []
24
+ @error_data = []
25
+ @backtrace_info = []
26
+ DRb::DRbObject.new(nil, drb_uri).remote_each_package { |remote|
27
+ package = Remote::Drugs::Package.new(drb_uri, remote,
28
+ 1.0 / currency_rate,
29
+ tax_factor)
30
+ begin
31
+ if(package.price(:public) \
32
+ && (comparable = package.local_comparables.select { |pac|
33
+ pac.price(:public)
34
+ }.sort_by { |pac|
35
+ pac.price(:public)
36
+ }.first))
37
+ data.push [comparable, package]
38
+ end
39
+ rescue NoMethodError => err
40
+ # This is a temporary solution for a NoMethodError bug
41
+ # See the bug http://dev.ywesee.com/wiki.php/Masa/20101020-debug-importChdeXls#DebugChde
42
+ @error_data.push("http://ch.oddb.org/en/gcc/compare/ean13/" + package.code(:ean).value)
43
+ @backtrace_info.push("\nhttp://ch.oddb.org/en/gcc/compare/ean13/" + package.code(:ean).value)
44
+ @backtrace_info.concat err.backtrace
45
+ end
46
+ nil # don't return data from the block across drb
47
+ }
48
+ data
49
+ end
50
+ def collect_cell(local, remote, format = "%s (%s)", &block)
51
+ lval = block.call(local) rescue StandardError
52
+ rval = block.call(remote) rescue StandardError
53
+ lval == rval ? lval : sprintf(format, lval, rval)
54
+ end
55
+ def currency_rate
56
+ @currency_rate ||= Currency.rate('EUR', 'CHF')
57
+ end
58
+ def tax_factor
59
+ 1.076 / 1.19
60
+ end
61
+ def write_row(worksheet, idx, local, remote)
62
+ comparison = Util::Comparison.new(local, remote)
63
+ lexf = local.price(:exfactory)
64
+ rexf = remote.price(:exfactory)
65
+ data = [
66
+ collect_cell(local, remote) { |x|
67
+ x.name.de || x.product.name.de },
68
+ collect_cell(local, remote) { |x| x.comparable_size.to_s },
69
+ adjust_price(local.price(:public)).to_s,
70
+ collect_cell(local, remote) { |x| x.company.name.de },
71
+ local.code(:cid).to_s,
72
+ remote.code(:ean).to_s,
73
+ collect_cell(local, remote) { |x|
74
+ x.galenic_forms.first.description.de },
75
+ collect_cell(local, remote) { |x|
76
+ x.active_agents.first.dose.to_s },
77
+ collect_cell(local, remote) { |x|
78
+ x.active_agents.first.substance.name.de },
79
+ remote.atc.code,
80
+ remote.ikscat,
81
+ remote.sl_entry ? 'SL' : '',
82
+ sprintf("%+4.2f", adjust_price(comparison.absolute)),
83
+ sprintf("%+4.2f%%", comparison.difference),
84
+ sprintf("%4.2f", comparison.factor),
85
+ (adjust_price(lexf) if lexf).to_s,
86
+ (adjust_price(rexf) if rexf).to_s,
87
+ ]
88
+ if(lexf && rexf)
89
+ data.push sprintf("%+4.2f", adjust_price(comparison.absolute_exfactory)),
90
+ sprintf("%+4.2f%%", comparison.difference_exfactory)
91
+ end
92
+ worksheet.write idx, 0, data
93
+ end
94
+ def write_xls(io, data)
95
+ workbook = Spreadsheet::Excel.new(io)
96
+ worksheet = workbook.add_worksheet('Preisvergleich')
97
+ fmt_title = Spreadsheet::Format.new(:bold => true)
98
+ workbook.add_format(fmt_title)
99
+ worksheet.write 0, 0, [
100
+ "Name DE (Name CH)",
101
+ "Pkg Grösse DE (Pkg Grösse CH)",
102
+ "AVP inkl. Mwst in CHF nach Abzug und Zuschlag",
103
+ "Hersteller DE (Hersteller CH)",
104
+ "PZN", "EAN",
105
+ "Gal Form DE (gal. Form CH)",
106
+ "Stärke (Schreibweise CH)",
107
+ "Wirkstoff (Schreibweise CH)",
108
+ "ATC-Code", "Abgabekategorie CH", "SL Schweiz",
109
+ "Preisunterschied inkl. Mwst. in CHF",
110
+ "Preisunterschied in % (normalisiert)",
111
+ "Packungsäquivalenzfaktor",
112
+ "FAP DE exkl. MwSt (errechnet)",
113
+ "FAP CH exkl. MwSt",
114
+ "Preisunterschied FAP in CHF ",
115
+ "Preisunterschied FAP in % (normalisiert)",
116
+ ], fmt_title
117
+ data.sort_by { |local, remote|
118
+ local.name.de || local.product.name.de
119
+ }.each_with_index { |(local, remote), idx|
120
+ write_row(worksheet, idx.next, local, remote)
121
+ }
122
+ workbook.close
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env ruby
2
+ # Export::Yaml -- de.oddb.org -- 09.10.2007 -- hwyss@ywesee.com
3
+
4
+ require 'fixes/yaml'
5
+ require 'oddb/business/company'
6
+ require 'oddb/drugs'
7
+
8
+ module ODDB
9
+ module OddbUri
10
+ YAML_URI = '!de.oddb.org,2007'
11
+ yaml_as YAML_URI
12
+ def to_yaml_type
13
+ "#{YAML_URI}/#{self.class}"
14
+ end
15
+ def to_yaml( opts = {} )
16
+ YAML::quick_emit( self.object_id, opts ) { |out|
17
+ out.map( taguri ) { |map|
18
+ to_yaml_map(map)
19
+ }
20
+ }
21
+ end
22
+ def to_yaml_map(map)
23
+ if(respond_to?(:oid) && id = oid)
24
+ map.add("oid", id)
25
+ end
26
+ to_yaml_properties.each { |m|
27
+ map.add( m[1..-1], instance_variable_get( m ) )
28
+ }
29
+ end
30
+ end
31
+ module Yaml
32
+ include OddbUri
33
+ def to_yaml_properties
34
+ super - self.class.connections - self.class.connectors
35
+ end
36
+ def Yaml.append_features(mod)
37
+ super
38
+ mod.module_eval {
39
+ class << self
40
+ def export(*args)
41
+ define_method(:to_yaml_properties) {
42
+ super.push(*args).uniq.reject { |name|
43
+ instance_variable_get(name).nil? }
44
+ }
45
+ end
46
+ end
47
+ }
48
+ end
49
+ end
50
+ class Model
51
+ include Yaml
52
+ end
53
+ module Util
54
+ class Code
55
+ include OddbUri
56
+ def to_yaml_map(map)
57
+ super
58
+ map.add('value', value)
59
+ end
60
+ def to_yaml_properties
61
+ super - ['@values']
62
+ end
63
+ end
64
+ class Multilingual
65
+ include OddbUri
66
+ end
67
+ class M10lDocument
68
+ export '@canonical'
69
+ end
70
+ end
71
+ module Business
72
+ class Company
73
+ export '@name'
74
+ end
75
+ end
76
+ module Drugs
77
+ class ActiveAgent
78
+ export '@substance'
79
+ end
80
+ class Atc
81
+ export '@ddds'
82
+ end
83
+ class Composition
84
+ export '@active_agents', '@parts'
85
+ end
86
+ class Dose
87
+ include OddbUri
88
+ def to_yaml_properties
89
+ [ '@val', '@unit' ]
90
+ end
91
+ end
92
+ class GalenicForm
93
+ export '@group'
94
+ end
95
+ class Package
96
+ def to_yaml_map(map)
97
+ super
98
+ map.add('prices', self.prices.inject({}) { |memo, price|
99
+ memo.store(price.type, price.to_f)
100
+ memo
101
+ } )
102
+ end
103
+ def to_yaml_properties
104
+ (super - ['@prices']).push('@parts')
105
+ end
106
+ end
107
+ class Product
108
+ export '@company', '@sequences'
109
+ end
110
+ class Sequence
111
+ export '@atc', '@compositions', '@packages'
112
+ end
113
+ class Substance
114
+ export '@group'
115
+ end
116
+ end
117
+ module Text
118
+ class Document
119
+ export '@title', '@chapters', '@date', '@source'
120
+ end
121
+ class Chapter
122
+ include OddbUri
123
+ end
124
+ class Paragraph
125
+ include OddbUri
126
+ def to_yaml_properties
127
+ [ '@text', '@formats' ]
128
+ end
129
+ end
130
+ class Picture
131
+ include OddbUri
132
+ def to_yaml_map(map)
133
+ super
134
+ map.add('path', path)
135
+ end
136
+ end
137
+ class Table
138
+ include OddbUri
139
+ end
140
+ class Format
141
+ include OddbUri
142
+ end
143
+ end
144
+ module Export
145
+ module Yaml
146
+ class Drugs
147
+ def export(io)
148
+ ODDB::Drugs::Product.all { |product| io.puts product.to_yaml }
149
+ nil
150
+ end
151
+ end
152
+ class Infos
153
+ def export(io)
154
+ raise "please specify which type of document you want to export" unless infotype
155
+ infos = []
156
+ ## Documents may be garbage-collected during this export. That's why we'll
157
+ # keep names in a separate table on the stack, and assign them just before
158
+ # calling #to_yaml
159
+ names = {}
160
+ ODDB::Drugs::Sequence.all do |seq|
161
+ info = seq.send infotype
162
+ # export sequence names as title
163
+ unless info.empty?
164
+ lnms = names[info.oid] ||= {}
165
+ info.canonical.each do |key, doc|
166
+ if (doc = info.send(key)) && (name = identify_name(seq, key))
167
+ lnms[key] = name
168
+ end
169
+ end
170
+ infos.push info
171
+ end
172
+ end
173
+ infos.uniq!
174
+ infos.each do |info|
175
+ info.canonical.each do |key, doc|
176
+ doc.title = names[info.oid][key]
177
+ end
178
+ io.puts info.to_yaml
179
+ end
180
+ nil
181
+ end
182
+ end
183
+ class Fachinfos < Infos
184
+ def infotype
185
+ :fachinfo
186
+ end
187
+ def identify_name seq, lang
188
+ seq.cascading_name(lang)
189
+ end
190
+ end
191
+ class Patinfos < Infos
192
+ def infotype
193
+ :patinfo
194
+ end
195
+ def identify_name seq, lang
196
+ names = seq.packages.collect do |pac| u pac.cascading_name(lang) end.uniq
197
+ if names.size == 1
198
+ return names.first
199
+ end
200
+ name = ''
201
+ pos = 0
202
+ while(chars = names.collect do |nm| nm[pos,1] end.uniq; chars.size == 1) do
203
+ pos += 1
204
+ name << chars.first
205
+ end
206
+ name.gsub! /\([^\)]+$/u, ''
207
+ name.strip
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,13 @@
1
+ require 'oddb/html/state/global_predefine'
2
+ require 'oddb/html/view/download'
3
+
4
+ module ODDB
5
+ module Html
6
+ module State
7
+ class Download < State::Global
8
+ VIEW = View::Download
9
+ VOLATILE = true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env ruby
2
+ # Html::State::Drugs::Admin::Package -- de.oddb.org -- 29.10.2007 -- hwyss@ywesee.com
3
+
4
+ require 'oddb/html/state/drugs/package'
5
+ require 'oddb/html/view/drugs/admin/package'
6
+ require 'oddb/import/pharmnet'
7
+ require 'oddb/util/code'
8
+
9
+ module ODDB
10
+ module Html
11
+ module State
12
+ module Drugs
13
+ module Admin
14
+ class AjaxParts < Global
15
+ VOLATILE = true
16
+ VIEW = View::Drugs::Admin::Parts
17
+ end
18
+ class Package < Drugs::Package
19
+ VIEW = View::Drugs::Admin::Package
20
+ def ajax_create_part
21
+ check_model
22
+ parts = @model.parts.dup
23
+ if(!error?)
24
+ part = ODDB::Drugs::Part.new
25
+ part.package = Util::UnsavedHelper.new(@model)
26
+ parts.push part
27
+ end
28
+ AjaxParts.new @session, parts
29
+ end
30
+ def ajax_delete_part
31
+ check_model
32
+ keys = [:code_cid, :part]
33
+ input = user_input(keys, keys)
34
+ agents = []
35
+ if(!error? \
36
+ && (part = @model.parts.at(input[:part].to_i)))
37
+ part.delete
38
+ end
39
+ AjaxParts.new(@session, @model.parts)
40
+ end
41
+ def check_model
42
+ if(@model.code(:cid, 'DE') != @session.user_input(:code_cid))
43
+ @errors.store :code_cid, create_error(:e_state_expired, :code_cid, nil)
44
+ end
45
+ end
46
+ def delete
47
+ check_model
48
+ unless error?
49
+ seq = @model.sequence
50
+ if(seq.is_a? Util::UnsavedHelper)
51
+ seq = seq.delegate
52
+ end
53
+ @model.delete
54
+ Sequence.new(@session, seq)
55
+ end
56
+ end
57
+ def update
58
+ mandatory = [ :name, :code_cid ]
59
+ keys = [ :price_exfactory, :price_public, :price_festbetrag,
60
+ :code_festbetragsstufe, :code_festbetragsgruppe,
61
+ :code_zuzahlungsbefreit, :code_prescription, :unit, :sequence,
62
+ :size, :multi, :composition, :quantity ]
63
+ input = user_input(mandatory + keys, mandatory)
64
+ others = ODDB::Drugs::Package.search_by_code(:type => 'cid',
65
+ :value => input[:code_cid],
66
+ :country => 'DE')
67
+ others.delete(@model)
68
+ unless others.empty?
69
+ value = sprintf "'%i' (%s)", input[:code_cid],
70
+ others.collect { |pac| pac.name.de }.join(', ')
71
+ @errors.store(:code_cid,
72
+ create_error(:e_duplicate_pzn, :code_cid, value))
73
+ end
74
+ _update input
75
+ end
76
+ def _update input
77
+ email = @session.user.email
78
+ input.each { |key, value|
79
+ unless(@errors[key])
80
+ set = case key
81
+ when :name
82
+ @model.name.de = value unless(@model.name.de == value)
83
+ when :price_public, :price_festbetrag, :price_exfactory
84
+ update_price(/price_(.*)/.match(key.to_s)[1].to_sym, value.to_f)
85
+ when :code_cid, :code_festbetragsgruppe, :code_festbetragsstufe
86
+ update_code(/code_(.*)/.match(key.to_s)[1].to_sym, value)
87
+ when :code_zuzahlungsbefreit, :code_prescription
88
+ update_code(/code_(.*)/.match(key.to_s)[1].to_sym, !!value)
89
+ when :size
90
+ update_parts(input)
91
+ end
92
+ unless(set.nil?)
93
+ @model.data_origins.store key, email
94
+ end
95
+ end
96
+ }
97
+ if((uid = input[:sequence]) \
98
+ && (seq = ODDB::Drugs::Sequence.find_by_uid(uid)) \
99
+ && @model.sequence != seq)
100
+ @model.sequence = seq
101
+ @model.parts.each_with_index { |part, idx|
102
+ part.composition = seq.compositions[idx]
103
+ part.save
104
+ }
105
+ elsif((seq = @model.sequence) && seq.is_a?(Util::UnsavedHelper))
106
+ @model.sequence = seq.delegate
107
+ end
108
+ @model.save
109
+ self
110
+ end
111
+ def package
112
+ if((code = @session.user_input(:pzn)) && @model.code(:cid, 'DE') == code)
113
+ self
114
+ else
115
+ super
116
+ end
117
+ end
118
+ private
119
+ def update_code(type, value)
120
+ if(code = @model.code(type))
121
+ code.value = value unless(code == value)
122
+ else
123
+ @model.add_code ODDB::Util::Code.new(type, value, 'DE')
124
+ end
125
+ end
126
+ def update_parts(input)
127
+ if(sizes = input[:size])
128
+ sizes.each { |idx, size|
129
+ part = @model.parts.at(idx.to_i)
130
+ part ||= ODDB::Drugs::Part.new
131
+ current = {}
132
+ [:multi, :size, :unit, :quantity, :composition].each { |key|
133
+ values = (input[key] ||= {})
134
+ if((val = values[idx]) && !val.empty?)
135
+ current.store(key, val)
136
+ end
137
+ }
138
+ part.multi = current[:multi] && current[:multi].to_i
139
+ part.size = current[:size]
140
+ if(unitname = current[:unit])
141
+ if(unit = ODDB::Drugs::Unit.find_by_name(unitname))
142
+ part.unit = unit
143
+ else
144
+ key = :"unit[#{idx}]"
145
+ @errors.store key, create_error(:e_unknown_unit, key, unitname)
146
+ end
147
+ else
148
+ part.unit = nil
149
+ end
150
+ if(str = current[:quantity])
151
+ part.quantity = ODDB::Drugs::Dose.new(*str.split(/\s*(?=[^\d.,])/, 2))
152
+ else
153
+ part.quantity = nil
154
+ end
155
+ if(comp = current[:composition])
156
+ part.composition = @model.compositions.at(comp.to_i)
157
+ end
158
+ part.package = @model unless(part.package == @model)
159
+ part.save
160
+ }
161
+ end
162
+ end
163
+ def update_price(type, amount)
164
+ if price = @model.price(type, 'DE')
165
+ if amount > 0
166
+ price.amount = amount unless(price == amount)
167
+ else
168
+ @model.remove_price price
169
+ end
170
+ elsif amount > 0
171
+ @model.add_price ODDB::Util::Money.new(amount, type, 'DE')
172
+ end
173
+ end
174
+ end
175
+ class NewPackage < Package
176
+ def direct_event
177
+ # disable redirector
178
+ end
179
+ def _update input
180
+ unless @errors[:code_cid]
181
+ super
182
+ Package.new(@session, @model)
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end