FDBPGController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\DB;
  5. class FDBPGController extends Controller
  6. {
  7. public function rx(Request $request)
  8. {
  9. return view('app.fdb-pg.fdb-rx');
  10. }
  11. public function medSuggest(Request $request)
  12. {
  13. $term = $request->input('term') ? trim($request->input('term')) : '';
  14. if (empty($term)) return '';
  15. $matches = DB::connection('pgsql_fdb')->select(
  16. "SELECT med_name_id, med_name FROM rminmid1_med_name WHERE med_status_cd = '0' AND med_name ILIKE :term ORDER BY med_name",
  17. ['term' => '%' . $term . '%']
  18. );
  19. return view('app.fdb-pg.fdb-med-suggest', compact('matches'));
  20. }
  21. public function routedMeds(Request $request)
  22. {
  23. $medNameID = $request->input('med-name-id') ? trim($request->input('med-name-id')) : '';
  24. if (empty($medNameID)) return '';
  25. $matches = DB::connection('pgsql_fdb')->select(
  26. "SELECT routed_med_id, med_routed_med_id_desc FROM rmirmid1_routed_med WHERE med_status_cd = '0' AND med_name_id = :medNameID ORDER BY med_routed_med_id_desc",
  27. ['medNameID' => $medNameID]
  28. );
  29. return json_encode($matches);
  30. }
  31. public function routedDosages(Request $request)
  32. {
  33. $routedMedID = $request->input('routed-med-id') ? trim($request->input('routed-med-id')) : '';
  34. if (empty($routedMedID)) return '';
  35. $matches = DB::connection('pgsql_fdb')->select(
  36. "SELECT routed_dosage_form_med_id, med_routed_df_med_id_desc FROM rmidfid1_routed_dose_form_med WHERE med_status_cd = '0' AND routed_med_id = :routedMedID ORDER BY med_routed_df_med_id_desc",
  37. ['routedMedID' => $routedMedID]
  38. );
  39. return json_encode($matches);
  40. }
  41. public function meds(Request $request)
  42. {
  43. $dosageFormMedId = $request->input('dosage-form-med-id') ? trim($request->input('dosage-form-med-id')) : '';
  44. if (empty($dosageFormMedId)) return '';
  45. $matches = DB::connection('pgsql_fdb')->select(
  46. "SELECT medid, med_medid_desc, gcn_seqno FROM rmiid1_med WHERE med_status_cd = '0' AND routed_dosage_form_med_id = :dosageFormMedId ORDER BY med_medid_desc",
  47. ['dosageFormMedId' => $dosageFormMedId]
  48. );
  49. return json_encode($matches);
  50. }
  51. public function sideEffects(Request $request)
  52. {
  53. $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
  54. if (empty($gcnSeqNo)) return '';
  55. $sides = DB::connection('pgsql_fdb')->select("
  56. SELECT r1.side, sm.side_freq, sm.side_sev, sm.dxid, dx.dxid_desc56
  57. FROM rsidegc0_gcnseqno_link r1
  58. JOIN rsidema3_mstr sm ON r1.side = sm.side
  59. JOIN rfmldx0_dxid dx ON sm.dxid = dx.dxid
  60. WHERE r1.gcn_seqno = :gcnSeqNo
  61. ORDER BY sm.side_sev DESC, sm.side_freq ASC
  62. ",
  63. ['gcnSeqNo' => $gcnSeqNo]
  64. );
  65. return view('app.fdb-pg.fdb-side-effects', compact('sides'));
  66. }
  67. public function geriatricPrecautions(Request $request)
  68. {
  69. $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
  70. if (empty($gcnSeqNo)) return '';
  71. $precautions = DB::connection('pgsql_fdb')->select("
  72. SELECT r1.geri_code, gm.geri_sl, gm.geri_desc, gm.geri_narrative
  73. FROM rgerigc0_geri_gcnseqno_link r1
  74. JOIN rgerima1_geri_mstr gm ON r1.geri_code = gm.geri_code
  75. WHERE r1.gcn_seqno = :gcnSeqNo
  76. ORDER BY gm.geri_desc
  77. ",
  78. ['gcnSeqNo' => $gcnSeqNo]
  79. );
  80. return view('app.fdb-pg.fdb-geriatric-precautions', compact('precautions'));
  81. }
  82. public function indications(Request $request)
  83. {
  84. $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
  85. if (empty($gcnSeqNo)) return '';
  86. $indications = DB::connection('pgsql_fdb')->select("
  87. SELECT r1.indcts, r2.indcts_sn, r2.indcts_lbl, r2.dxid, r2.proxy_ind, r3.dxid_desc56
  88. FROM rindmgc0_indcts_gcnseqno_link r1
  89. JOIN rindmma2_indcts_mstr r2 ON r1.indcts = r2.indcts
  90. JOIN rfmldx0_dxid r3 ON r2.dxid = r3.dxid
  91. WHERE r1.gcn_seqno = :gcnSeqNo
  92. ORDER BY r3.dxid_desc56
  93. ",
  94. ['gcnSeqNo' => $gcnSeqNo]
  95. );
  96. return view('app.fdb-pg.fdb-indications', compact('indications'));
  97. }
  98. public function contraindications(Request $request)
  99. {
  100. $routedMedID = $request->input('routed-med-id') ? trim($request->input('routed-med-id')) : '';
  101. if (empty($routedMedID)) return '';
  102. $contraindications = DB::connection('pgsql_fdb')->select("
  103. SELECT r1.ddxcn, r2.dxid, r2.ddxcn_sl, r3.dxid_desc56
  104. FROM rddcmrm0_routed_med_link r1
  105. JOIN rddcmma1_contra_mstr r2 ON r1.ddxcn = r2.ddxcn
  106. JOIN rfmldx0_dxid r3 ON r2.dxid = r3.dxid
  107. WHERE r1.routed_med_id = :routedMedID
  108. ORDER BY r2.ddxcn_sl
  109. ",
  110. ['routedMedID' => $routedMedID]
  111. );
  112. return view('app.fdb-pg.fdb-contraindications', compact('contraindications'));
  113. }
  114. public function dxSuggest(Request $request)
  115. {
  116. $term = $request->input('term') ? trim($request->input('term')) : '';
  117. if (empty($term)) return '';
  118. $matches = DB::connection('pgsql_fdb')->select("
  119. SELECT distinct(r1.dxid), r1.dxid_desc56
  120. FROM rfmldx0_dxid r1
  121. JOIN rfmlsyn0_dxid_syn r2 ON r1.dxid = r2.dxid
  122. WHERE (r1.dxid_desc56 ILIKE :term OR r1.dxid_desc100 ILIKE :term OR r2.dxid_syn_desc56 ILIKE :term OR r2.dxid_syn_desc100 ILIKE :term)
  123. ORDER BY r1.dxid_desc56
  124. ",
  125. ['term' => '%' . $term . '%']
  126. );
  127. return view('app.fdb-pg.fdb-dx-suggest', compact('matches'));
  128. }
  129. public function allergySuggest(Request $request)
  130. {
  131. $term = $request->input('term') ? trim($request->input('term')) : '';
  132. if (empty($term)) return '';
  133. $matches = DB::connection('pgsql_fdb')->select("
  134. SELECT r1.dam_concept_id, r1.dam_concept_id_typ, r1.dam_concept_id_desc
  135. FROM rdamca0_concept r1
  136. WHERE (r1.dam_concept_id_desc ILIKE :term)
  137. ORDER BY r1.dam_concept_id_desc
  138. ",
  139. ['term' => '%' . $term . '%']
  140. );
  141. return view('app.fdb-pg.fdb-allergy-suggest', compact('matches'));
  142. }
  143. public function drugAllergies(Request $request) {
  144. // override
  145. if($request->input('test')) {
  146. $x = new \stdClass();
  147. $x->allergen = 'Pollen';
  148. $x->dam_concept_id_typ = 6;
  149. $allergies = [$x];
  150. $y = new \stdClass();
  151. $y->rx = 'Brufen';
  152. $rx = [$y];
  153. }
  154. else {
  155. $input = json_decode($request->input('data'));
  156. $allergies = $input->allergies;
  157. $rx = $input->rx;
  158. }
  159. $output = [];
  160. /*
  161. for each allergy
  162. if dam_concept_id_typ = 1 // allergen-group-id
  163. // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+a+DAM_ALRGN_GRP+Allergen+-+Illustration+of+Scenario+C
  164. ...
  165. elseif dam_concept_id_typ = 2 // medication-name-id
  166. // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+a+MED_NAME_ID+Allergen+-+Illustration+of+Scenario+B
  167. ...
  168. elseif dam_concept_id_typ = 6 // base-ingredient-id
  169. // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+an+Ingredient+Allergen+-+Illustration+of+Scenario+A
  170. ...
  171. endif
  172. endfor
  173. */
  174. foreach ($allergies as $allergy) {
  175. foreach ($rx as $rxItem) {
  176. if($allergy->dam_concept_id_typ == 6) { // ingredient
  177. if ($this->drugAllergyIngredientAllergenVsSingleRx($allergy, $rxItem)) {
  178. $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
  179. }
  180. }
  181. else if($allergy->dam_concept_id_typ == 2) { // medication
  182. if ($this->drugAllergyMedicationAllergenVsSingleRx($allergy, $rxItem)) {
  183. $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
  184. }
  185. }
  186. else if($allergy->dam_concept_id_typ == 1) { // allergen group
  187. if ($this->drugAllergyGroupAllergenVsSingleRx($allergy, $rxItem)) {
  188. $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
  189. }
  190. }
  191. }
  192. }
  193. return implode("\n", $output);
  194. }
  195. private function drugAllergyIngredientAllergenVsSingleRx($_allergen, $_rx) {
  196. $matches = DB::connection('pgsql_fdb')->select("
  197. (
  198. -- ingredients from medication
  199. SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
  200. FROM RHICHCR0_HIC_HIC_LINK R1
  201. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  202. WHERE R1.hic_seqn IN (
  203. SELECT S2.dam_alrgn_hic_seqn
  204. FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
  205. JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
  206. WHERE S1.med_concept_id = :medid
  207. AND S1.med_concept_id_typ = 3
  208. )
  209. )
  210. INTERSECT
  211. (
  212. -- all ingredients directly and related from allergens
  213. (
  214. SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
  215. FROM RHICHCR0_HIC_HIC_LINK R1
  216. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  217. WHERE R1.hic_seqn = :allergenConceptID
  218. )
  219. UNION
  220. -- all ingredients via related dam allergen groups
  221. (
  222. SELECT r3.hic_seqn, r4.hic_desc
  223. FROM RDAMGHC0_HIC_ALRGN_GRP_LINK R1
  224. JOIN rdamagd1_alrgn_grp_desc R2 on R1.dam_alrgn_grp = R2.dam_alrgn_grp
  225. JOIN RDAMGHC0_HIC_ALRGN_GRP_LINK R3 on R1.dam_alrgn_grp = R3.dam_alrgn_grp
  226. JOIN RHICD5_HIC_DESC R4 on r3.hic_seqn = r4.hic_seqn
  227. WHERE R1.hic_seqn = :allergenConceptID
  228. AND R2.dam_alrgn_grp_status_cd = 0
  229. ORDER BY r3.hic_seqn
  230. )
  231. )
  232. ",
  233. ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
  234. );
  235. return !!count($matches);
  236. }
  237. private function drugAllergyMedicationAllergenVsSingleRx($_allergen, $_rx) {
  238. $matches = DB::connection('pgsql_fdb')->select("
  239. (
  240. -- ingredients from medication
  241. SELECT R1.related_hic_seqn as hic_seqn
  242. FROM RHICHCR0_HIC_HIC_LINK R1
  243. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  244. WHERE R1.hic_seqn IN (
  245. SELECT S2.dam_alrgn_hic_seqn
  246. FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
  247. JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
  248. WHERE S1.med_concept_id = :medid
  249. AND S1.med_concept_id_typ = 3
  250. )
  251. )
  252. INTERSECT
  253. (
  254. -- all ingredients directly and related from allergens
  255. SELECT R1.dam_alrgn_hic_seqn as hic_seqn
  256. FROM RDAMHHA0_HIC_HICL_ALG_LINK R1
  257. WHERE R1.hicl_seqno IN (
  258. SELECT R1.hicl_seqno
  259. FROM RMEDMHL0_MED_HICLSEQNO_LINK R1
  260. WHERE R1.med_concept_id_typ = 1
  261. AND R1.med_concept_id = :allergenConceptID
  262. AND MED_CONCEPT_HICL_SRC_CD = 0
  263. )
  264. )
  265. ",
  266. ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
  267. );
  268. return !!count($matches);
  269. }
  270. private function drugAllergyGroupAllergenVsSingleRx($_allergen, $_rx) {
  271. $matches = DB::connection('pgsql_fdb')->select("
  272. (
  273. -- ingredients from medication
  274. SELECT R1.related_hic_seqn as hic_seqn
  275. FROM RHICHCR0_HIC_HIC_LINK R1
  276. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  277. WHERE R1.hic_seqn IN (
  278. SELECT S2.dam_alrgn_hic_seqn
  279. FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
  280. JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
  281. WHERE S1.med_concept_id = :medid
  282. AND S1.med_concept_id_typ = 3
  283. )
  284. )
  285. INTERSECT
  286. (
  287. -- ingredients from medication allergen
  288. (
  289. SELECT R1.hic_seqn as hic_seqn
  290. FROM RDAMGHC0_HIC_ALRGN_GRP_LINK R1
  291. WHERE R1.DAM_ALRGN_GRP = :allergenConceptID
  292. )
  293. UNION
  294. (
  295. SELECT distinct s1.hic_seqn
  296. FROM RDAMXHC0_HIC_ALRGN_XSENSE_LINK S1
  297. WHERE S1.dam_alrgn_xsense IN (
  298. SELECT R1.dam_alrgn_xsense
  299. FROM RDAMGX0_ALRGN_GRP_XSENSE_LINK R1
  300. JOIN RDAMCSD1_XSENSIT_ALLERGY_DESC R2 on R1.dam_alrgn_xsense = R2.dam_alrgn_xsense
  301. WHERE R1.dam_alrgn_grp = :allergenConceptID
  302. AND R2.dam_alrgn_xsense_status_cd = 0
  303. )
  304. )
  305. )
  306. ",
  307. ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
  308. );
  309. return !!count($matches);
  310. }
  311. }