FDBPGController.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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. if($allergy->dam_concept_id_typ == 6) {
  176. foreach ($rx as $rxItem) {
  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. }
  182. }
  183. return implode("\n", $output);
  184. }
  185. private function getAllergenIngredients($_allergen) {
  186. }
  187. private function getRxIngredients($_rx) {
  188. }
  189. private function drugAllergyIngredientAllergenVsSingleRx($_allergen, $_rx) {
  190. $matches = DB::connection('pgsql_fdb')->select("
  191. (
  192. -- ingredients from medication
  193. SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
  194. FROM RHICHCR0_HIC_HIC_LINK R1
  195. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  196. WHERE R1.hic_seqn IN (
  197. SELECT S2.dam_alrgn_hic_seqn
  198. FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
  199. JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
  200. WHERE S1.med_concept_id = :medid
  201. AND S1.med_concept_id_typ = 3
  202. )
  203. )
  204. INTERSECT
  205. (
  206. -- all ingredients directly and related from allergens
  207. (
  208. SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
  209. FROM RHICHCR0_HIC_HIC_LINK R1
  210. JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
  211. WHERE R1.hic_seqn = :allergenHicSeqNo
  212. )
  213. UNION
  214. -- all ingredients via related dam allergen groups
  215. (
  216. SELECT r3.hic_seqn, r4.hic_desc
  217. FROM RDAMGHC0_HIC_ALRGN_GRP_LINK R1
  218. JOIN rdamagd1_alrgn_grp_desc R2 on R1.dam_alrgn_grp = R2.dam_alrgn_grp
  219. JOIN RDAMGHC0_HIC_ALRGN_GRP_LINK R3 on R1.dam_alrgn_grp = R3.dam_alrgn_grp
  220. JOIN RHICD5_HIC_DESC R4 on r3.hic_seqn = r4.hic_seqn
  221. WHERE R1.hic_seqn = :allergenHicSeqNo
  222. AND R2.dam_alrgn_grp_status_cd = 0
  223. ORDER BY r3.hic_seqn
  224. )
  225. )
  226. ",
  227. ['medid' => $_rx->medid, 'allergenHicSeqNo' => $_allergen->dam_concept_id]
  228. );
  229. return !!count($matches);
  230. }
  231. }