123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767 |
- <?php
- namespace App\Http\Controllers;
- use App\Models\Client;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- class FDBPGController extends Controller
- {
- public function rx(Request $request)
- {
- return view('app.fdb-pg.fdb-rx');
- }
- // 1. medication suggest
- public function medSuggest(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select(
- "SELECT med_name_id, med_name FROM rminmid1_med_name WHERE med_status_cd = '0' AND med_name ILIKE :term ORDER BY med_name",
- ['term' => '%' . $term . '%']
- );
- return view('app.fdb-pg.fdb-med-suggest', compact('matches'));
- }
- // 1.1 medication suggest (json response)
- public function medSuggestJSON(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select(
- "SELECT med_name_id, med_name as text FROM rminmid1_med_name WHERE med_status_cd = '0' AND med_name ILIKE :term ORDER BY med_name",
- ['term' => '%' . $term . '%']
- );
- return json_encode([
- "success" => true,
- "data" => $matches
- ]);
- }
- // 2. routed meds from men name
- public function routedMeds(Request $request)
- {
- $medNameID = $request->input('med-name-id') ? trim($request->input('med-name-id')) : '';
- if (empty($medNameID)) return '';
- $matches = DB::connection('pgsql_fdb')->select(
- "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",
- ['medNameID' => $medNameID]
- );
- return json_encode($matches);
- }
- // 3. routed dosage from routed med
- public function routedDosages(Request $request)
- {
- $routedMedID = $request->input('routed-med-id') ? trim($request->input('routed-med-id')) : '';
- if (empty($routedMedID)) return '';
- $matches = DB::connection('pgsql_fdb')->select(
- "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",
- ['routedMedID' => $routedMedID]
- );
- return json_encode($matches);
- }
- // 4. strengths from routed med
- public function meds(Request $request)
- {
- $dosageFormMedId = $request->input('dosage-form-med-id') ? trim($request->input('dosage-form-med-id')) : '';
- if (empty($dosageFormMedId)) return '';
- $matches = DB::connection('pgsql_fdb')->select(
- "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",
- ['dosageFormMedId' => $dosageFormMedId]
- );
- return json_encode($matches);
- }
- // ** med suggest V2 ** //
- public function medSuggestV2JSON(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT r_med.medid,
- r_med.med_medid_desc as text,
- r_med.gcn_seqno,
- r_dosage_form.routed_dosage_form_med_id,
- r_route.routed_med_id,
- SIMILARITY(r_med.med_medid_desc, :term) as sim1
- FROM rmiid1_med r_med
- JOIN rmidfid1_routed_dose_form_med r_dosage_form
- ON r_med.routed_dosage_form_med_id = r_dosage_form.routed_dosage_form_med_id
- JOIN rmirmid1_routed_med r_route ON r_dosage_form.routed_med_id = r_route.routed_med_id
- WHERE r_med.med_status_cd = '0'
- AND SIMILARITY(r_med.med_medid_desc, :term) >= " . config('stag.fuzzySearchMinimumSimilarityScore')['medication'] . "
- ORDER BY sim1 DESC",
- ['term' => $term]
- );
- return json_encode([
- "success" => true,
- "data" => $matches
- ]);
- }
- // side effects for a given rx
- public function sideEffects(Request $request)
- {
- $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
- if (empty($gcnSeqNo)) return '';
- $sides = DB::connection('pgsql_fdb')->select("
- SELECT r1.side, sm.side_freq, sm.side_sev, sm.dxid, dx.dxid_desc56
- FROM rsidegc0_gcnseqno_link r1
- JOIN rsidema3_mstr sm ON r1.side = sm.side
- JOIN rfmldx0_dxid dx ON sm.dxid = dx.dxid
- WHERE r1.gcn_seqno = :gcnSeqNo
- ORDER BY sm.side_sev DESC, sm.side_freq ASC
- ",
- ['gcnSeqNo' => $gcnSeqNo]
- );
- return view('app.fdb-pg.fdb-side-effects', compact('sides'));
- }
- // ger prec for a given rx
- public function geriatricPrecautions(Request $request)
- {
- $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
- if (empty($gcnSeqNo)) return '';
- $precautions = DB::connection('pgsql_fdb')->select("
- SELECT r1.geri_code, gm.geri_sl, gm.geri_desc, gm.geri_narrative
- FROM rgerigc0_geri_gcnseqno_link r1
- JOIN rgerima1_geri_mstr gm ON r1.geri_code = gm.geri_code
- WHERE r1.gcn_seqno = :gcnSeqNo
- ORDER BY gm.geri_desc
- ",
- ['gcnSeqNo' => $gcnSeqNo]
- );
- return view('app.fdb-pg.fdb-geriatric-precautions', compact('precautions'));
- }
- // indication of a given rx
- public function indications(Request $request)
- {
- $gcnSeqNo = $request->input('gcn-seq-no') ? trim($request->input('gcn-seq-no')) : '';
- if (empty($gcnSeqNo)) return '';
- $indications = DB::connection('pgsql_fdb')->select("
- SELECT r1.indcts, r2.indcts_sn, r2.indcts_lbl, r2.dxid, r2.proxy_ind, r3.dxid_desc56
- FROM rindmgc0_indcts_gcnseqno_link r1
- JOIN rindmma2_indcts_mstr r2 ON r1.indcts = r2.indcts
- JOIN rfmldx0_dxid r3 ON r2.dxid = r3.dxid
- WHERE r1.gcn_seqno = :gcnSeqNo
- ORDER BY r3.dxid_desc56
- ",
- ['gcnSeqNo' => $gcnSeqNo]
- );
- return view('app.fdb-pg.fdb-indications', compact('indications'));
- }
- // contra-indications of a given rx
- public function contraindications(Request $request)
- {
- $routedMedID = $request->input('routed-med-id') ? trim($request->input('routed-med-id')) : '';
- if (empty($routedMedID)) return '';
- $contraindications = DB::connection('pgsql_fdb')->select("
- SELECT r1.ddxcn, r2.dxid, r2.ddxcn_sl, r3.dxid_desc56
- FROM rddcmrm0_routed_med_link r1
- JOIN rddcmma1_contra_mstr r2 ON r1.ddxcn = r2.ddxcn
- JOIN rfmldx0_dxid r3 ON r2.dxid = r3.dxid
- WHERE r1.routed_med_id = :routedMedID
- ORDER BY r2.ddxcn_sl
- ",
- ['routedMedID' => $routedMedID]
- );
- return view('app.fdb-pg.fdb-contraindications', compact('contraindications'));
- }
- // dx suggest
- public function dxSuggest(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT distinct(r1.dxid), r1.dxid_desc56
- FROM rfmldx0_dxid r1
- JOIN rfmlsyn0_dxid_syn r2 ON r1.dxid = r2.dxid
- 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)
- ORDER BY r1.dxid_desc56
- ",
- ['term' => '%' . $term . '%']
- );
- return view('app.fdb-pg.fdb-dx-suggest', compact('matches'));
- }
- public function dxSuggestJSON(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT distinct(r1.dxid), r1.dxid_desc56 as text
- FROM rfmldx0_dxid r1
- JOIN rfmlsyn0_dxid_syn r2 ON r1.dxid = r2.dxid
- 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)
- ORDER BY r1.dxid_desc56
- ",
- ['term' => '%' . $term . '%']
- );
- return response()->json(['success'=>true, 'data'=>$matches]);
- }
- public function dxICDsForDxID(Request $request) {
- $matches = DB::connection('pgsql_fdb')->select("
- select r1.search_icd_cd, r1.icd_cd_type, r2.icd_desc
- from RFMLISR1_ICD_SEARCH r1
- left join RFMLINM1_ICD_DESC r2 on r1.search_icd_cd = r2.icd_cd
- where r1.related_dxid = :dxid
- and (/*r1.icd_cd_type = '01' or */r1.icd_cd_type = '05')
- and r1.fml_clin_code = '01'
- /*and fml_nav_code = '01'*/
- ",
- ['dxid' => $request->input('dxid')]
- );
- return response()->json($matches);
- }
- // dx suggest v2 - from ICD tables
- public function dxSuggestV2JSON(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT distinct on (sim1) SIMILARITY(r2.icd_desc, :term) as sim1,
- search_icd_cd as sub_text,
- r1.icd_cd_type,
- r2.icd_desc as text,
- r1.related_dxid as dxid,
- r1.fml_clin_code,
- r1.fml_nav_code,
- r3.dxid_desc56
- FROM RFMLISR1_ICD_SEARCH r1
- JOIN RFMLINM1_ICD_DESC r2 ON r1.search_icd_cd = r2.icd_cd
- LEFT OUTER JOIN RFMLDX0_DXID r3 ON r1.related_dxid = r3.dxid
- WHERE r1.icd_cd_type = '05'
- AND r1.fml_clin_code = '01'
- AND (SIMILARITY(r2.icd_desc, :term) >= " . config('stag.fuzzySearchMinimumSimilarityScore')['problem'] . " OR
- r1.search_icd_cd ILIKE :term2)
- ORDER BY sim1 DESC
- ",
- ['term' => $term, 'term2' => $term . '%']
- );
- return response()->json(['success'=>true, 'data'=>$matches]);
- }
- // allergy suggest
- public function allergySuggest(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT r1.dam_concept_id, r1.dam_concept_id_typ, r1.dam_concept_id_desc
- FROM rdamca0_concept r1
- WHERE (r1.dam_concept_id_desc ILIKE :term)
- ORDER BY r1.dam_concept_id_desc
- ",
- ['term' => $term . '%']
- );
- return view('app.fdb-pg.fdb-allergy-suggest', compact('matches'));
- }
- // allergy suggest (json response)
- public function allergySuggestJSON(Request $request)
- {
- $term = $request->input('term') ? trim($request->input('term')) : '';
- if (empty($term)) return '';
- $matches = DB::connection('pgsql_fdb')->select("
- SELECT distinct on (sim1) SIMILARITY(r1.dam_concept_id_desc, :term) as sim1,
- r1.dam_concept_id, r1.dam_concept_id_typ, r1.dam_concept_id_desc as text
- FROM rdamca0_concept r1 join rdamcd0_picklist_con_typ_desc r2 on r1.dam_concept_id_typ = r2.dam_concept_id_typ
- WHERE SIMILARITY(r1.dam_concept_id_desc, :term) >= " . config('stag.fuzzySearchMinimumSimilarityScore')['allergy'] . "
- ORDER BY sim1 DESC
- ",
- ['term' => $term]
- );
- return json_encode([
- "success" => true,
- "data" => $matches
- ]);
- }
- // drug <-> allergy match making
- public function drugAllergies(Request $request) {
- // override
- if($request->input('test')) {
- $x = new \stdClass();
- $x->allergen = 'Pollen';
- $x->dam_concept_id_typ = 6;
- $allergies = [$x];
- $y = new \stdClass();
- $y->rx = 'Brufen';
- $rx = [$y];
- }
- else {
- $input = json_decode($request->input('data'));
- $allergies = $input->allergies;
- $rx = $input->rx;
- }
- $output = [];
- /*
- for each allergy
- if dam_concept_id_typ = 1 // allergen-group-id
- // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+a+DAM_ALRGN_GRP+Allergen+-+Illustration+of+Scenario+C
- ...
- elseif dam_concept_id_typ = 2 // medication-name-id
- // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+a+MED_NAME_ID+Allergen+-+Illustration+of+Scenario+B
- ...
- elseif dam_concept_id_typ = 6 // base-ingredient-id
- // https://docs.fdbhealth.com/display/MKDOCUS/Screening+an+NDC+for+an+Ingredient+Allergen+-+Illustration+of+Scenario+A
- ...
- endif
- endfor
- */
- foreach ($allergies as $allergy) {
- foreach ($rx as $rxItem) {
- if($allergy->dam_concept_id_typ == 6) { // ingredient
- if ($this->drugAllergyIngredientAllergenVsSingleRx($allergy, $rxItem)) {
- $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
- }
- }
- else if($allergy->dam_concept_id_typ == 2) { // medication
- if ($this->drugAllergyMedicationAllergenVsSingleRx($allergy, $rxItem)) {
- $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
- }
- }
- else if($allergy->dam_concept_id_typ == 1) { // allergen group
- if ($this->drugAllergyGroupAllergenVsSingleRx($allergy, $rxItem)) {
- $output[] = "<b>{$rxItem->rx}</b> can cause allergic reactions since the patient is allergic to <b>{$allergy->allergen}</b>.";
- }
- }
- }
- }
- return implode("<br>", $output);
- }
- private function drugAllergyIngredientAllergenVsSingleRx($_allergen, $_rx) {
- $matches = DB::connection('pgsql_fdb')->select("
- (
- -- ingredients from medication
- SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
- FROM RHICHCR0_HIC_HIC_LINK R1
- JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
- WHERE R1.hic_seqn IN (
- SELECT S2.dam_alrgn_hic_seqn
- FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
- JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
- WHERE S1.med_concept_id = :medid
- AND S1.med_concept_id_typ = 3
- )
- )
- INTERSECT
- (
- -- all ingredients directly and related from allergens
- (
- SELECT R1.related_hic_seqn as hic_seqn, R2.hic_desc
- FROM RHICHCR0_HIC_HIC_LINK R1
- JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
- WHERE R1.hic_seqn = :allergenConceptID
- )
- UNION
- -- all ingredients via related dam allergen groups
- (
- SELECT r3.hic_seqn, r4.hic_desc
- FROM RDAMGHC0_HIC_ALRGN_GRP_LINK R1
- JOIN rdamagd1_alrgn_grp_desc R2 on R1.dam_alrgn_grp = R2.dam_alrgn_grp
- JOIN RDAMGHC0_HIC_ALRGN_GRP_LINK R3 on R1.dam_alrgn_grp = R3.dam_alrgn_grp
- JOIN RHICD5_HIC_DESC R4 on r3.hic_seqn = r4.hic_seqn
- WHERE R1.hic_seqn = :allergenConceptID
- AND R2.dam_alrgn_grp_status_cd = 0
- ORDER BY r3.hic_seqn
- )
- )
- ",
- ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
- );
- return !!count($matches);
- }
- private function drugAllergyMedicationAllergenVsSingleRx($_allergen, $_rx) {
- $matches = DB::connection('pgsql_fdb')->select("
- (
- -- ingredients from medication
- SELECT R1.related_hic_seqn as hic_seqn
- FROM RHICHCR0_HIC_HIC_LINK R1
- JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
- WHERE R1.hic_seqn IN (
- SELECT S2.dam_alrgn_hic_seqn
- FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
- JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
- WHERE S1.med_concept_id = :medid
- AND S1.med_concept_id_typ = 3
- )
- )
- INTERSECT
- (
- -- all ingredients directly and related from allergens
- SELECT R1.dam_alrgn_hic_seqn as hic_seqn
- FROM RDAMHHA0_HIC_HICL_ALG_LINK R1
- WHERE R1.hicl_seqno IN (
- SELECT R1.hicl_seqno
- FROM RMEDMHL0_MED_HICLSEQNO_LINK R1
- WHERE R1.med_concept_id_typ = 1
- AND R1.med_concept_id = :allergenConceptID
- AND MED_CONCEPT_HICL_SRC_CD = 0
- )
- )
- ",
- ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
- );
- return !!count($matches);
- }
- private function drugAllergyGroupAllergenVsSingleRx($_allergen, $_rx) {
- $matches = DB::connection('pgsql_fdb')->select("
- (
- -- ingredients from medication
- SELECT R1.related_hic_seqn as hic_seqn
- FROM RHICHCR0_HIC_HIC_LINK R1
- JOIN RHICD5_HIC_DESC R2 ON R1.related_hic_seqn = R2.hic_seqn
- WHERE R1.hic_seqn IN (
- SELECT S2.dam_alrgn_hic_seqn
- FROM RMEDMHL0_MED_HICLSEQNO_LINK S1
- JOIN RDAMHHA0_HIC_HICL_ALG_LINK S2 ON S1.hicl_seqno = S2.hicl_seqno
- WHERE S1.med_concept_id = :medid
- AND S1.med_concept_id_typ = 3
- )
- )
- INTERSECT
- (
- -- ingredients from medication allergen
- (
- SELECT R1.hic_seqn as hic_seqn
- FROM RDAMGHC0_HIC_ALRGN_GRP_LINK R1
- WHERE R1.DAM_ALRGN_GRP = :allergenConceptID
- )
- UNION
- (
- SELECT distinct s1.hic_seqn
- FROM RDAMXHC0_HIC_ALRGN_XSENSE_LINK S1
- WHERE S1.dam_alrgn_xsense IN (
- SELECT R1.dam_alrgn_xsense
- FROM RDAMGX0_ALRGN_GRP_XSENSE_LINK R1
- JOIN RDAMCSD1_XSENSIT_ALLERGY_DESC R2 on R1.dam_alrgn_xsense = R2.dam_alrgn_xsense
- WHERE R1.dam_alrgn_grp = :allergenConceptID
- AND R2.dam_alrgn_xsense_status_cd = 0
- )
- )
- )
- ",
- ['medid' => $_rx->medid, 'allergenConceptID' => $_allergen->dam_concept_id]
- );
- return !!count($matches);
- }
- // drug <-> drug match making
- public function drugDrugInteraction(Request $request) {
- if($request->input('test')) {
- // override
- $rx = json_decode(json_encode([
- [
- "gcn_seqno" => "45190",
- "med_name_id" => "18604",
- "medid" => "234539",
- "routed_dosage_form_med_id" => "95130",
- "routed_med_id" => "19876",
- "rx" => "Zyprexa Zydis",
- ],
- [
- "gcn_seqno" => "49853",
- "med_name_id" => "26164",
- "medid" => "400058",
- "routed_dosage_form_med_id" => "36194",
- "routed_med_id" => "32562",
- "rx" => "Orfadin",
- ],
- ]));
- }
- else {
- $input = json_decode($request->input('data'));
- $rx = $input->rx;
- }
- if(count($rx) < 2) return "";
- $leftIndex = 0;
- $output = [];
- for ($i=$leftIndex; $i<count($rx) - 1; $i++) {
- for ($j=$i + 1; $j<count($rx); $j++) {
- $output[] = $this->drugDrugInteractionSinglePair($rx[$i], $rx[$j]);
- }
- }
- $output = array_filter($output, function($_x) {
- return !!$_x;
- });
- return implode("<br>", $output);
- }
- private function drugDrugInteractionSinglePair($_rx1, $_rx2) {
- $output = [];
- // get active ingredient DDI_CODEX values for drug 1 and 2
- $rx1ActiveDdiCodex = $this->getActiveDdiCodexFromGcnSeqNo($_rx1->gcn_seqno);
- $rx2ActiveDdiCodex = $this->getActiveDdiCodexFromGcnSeqNo($_rx2->gcn_seqno);
- if(!$rx1ActiveDdiCodex || !$rx2ActiveDdiCodex || !count($rx1ActiveDdiCodex) || !count($rx2ActiveDdiCodex)) return "";
- // dump($rx1_DDI_CODEX);
- // dump($rx2_DDI_CODEX);
- // get inactive ingredient DDI_CODEX values for drug 1 and 2
- // to get this we need to first get the NDCs of the drugs
- $rx1Ndc = $this->getNdcFromMedId($_rx1->medid);
- $rx2Ndc = $this->getNdcFromMedId($_rx2->medid);
- // dump($rx1Ndc);
- // dump($rx2Ndc);
- $rx1InactiveDdiCodex = $this->getInactiveDdiCodexFromNdc($rx1Ndc);
- $rx2InactiveDdiCodex = $this->getInactiveDdiCodexFromNdc($rx2Ndc);
- // if(!$rx1InactiveDdiCodex || !$rx2InactiveDdiCodex || !count($rx1InactiveDdiCodex) || !count($rx2InactiveDdiCodex)) return "";
- // dump($rx1InactiveDdiCodex);
- // dump($rx2InactiveDdiCodex);
- // get ddi codex - monox pairs for drug 1 & 2
- $rx1ActiveDdiCodexMonoxPairs = $this->getDdiCodexMonoxPairs($rx1ActiveDdiCodex);
- $rx1InactiveDdiCodexMonoxPairs = $this->getDdiCodexMonoxPairs($rx1InactiveDdiCodex);
- $rx2ActiveDdiCodexMonoxPairs = $this->getDdiCodexMonoxPairs($rx2ActiveDdiCodex);
- $rx2InactiveDdiCodexMonoxPairs = $this->getDdiCodexMonoxPairs($rx2InactiveDdiCodex);
- // dump($rx1ActiveDdiCodexMonoxPairs);
- // dump($rx1InactiveDdiCodexMonoxPairs);
- // dump($rx2ActiveDdiCodexMonoxPairs);
- // dump($rx2InactiveDdiCodexMonoxPairs);
- // compare 1-active to 2-active and 2-inactive
- $activeCatches = [];
- foreach ($rx1ActiveDdiCodexMonoxPairs as $compareLeft) {
- foreach ($rx2ActiveDdiCodexMonoxPairs as $compareRight) {
- if($compareLeft->ddi_monox == $compareRight->ddi_monox && $compareLeft->ddi_codex != $compareRight->ddi_codex) {
- $activeCatches[] = $compareLeft->ddi_codex;
- }
- }
- foreach ($rx2InactiveDdiCodexMonoxPairs as $compareRight) {
- if($compareLeft->ddi_monox == $compareRight->ddi_monox && $compareLeft->ddi_codex != $compareRight->ddi_codex) {
- $activeCatches[] = $compareLeft->ddi_codex;
- }
- }
- }
- // compare 1-inactive to 2-active and 2-inactive
- $inactiveCatches = [];
- foreach ($rx1InactiveDdiCodexMonoxPairs as $compareLeft) {
- foreach ($rx2ActiveDdiCodexMonoxPairs as $compareRight) {
- if($compareLeft->ddi_monox == $compareRight->ddi_monox && $compareLeft->ddi_codex != $compareRight->ddi_codex) {
- $inactiveCatches[] = $compareLeft->ddi_codex;
- }
- }
- foreach ($rx2InactiveDdiCodexMonoxPairs as $compareRight) {
- if($compareLeft->ddi_monox == $compareRight->ddi_monox && $compareLeft->ddi_codex != $compareRight->ddi_codex) {
- $inactiveCatches[] = $compareLeft->ddi_codex;
- }
- }
- }
- if(count($activeCatches)) {
- $output[] = "<b>{$_rx2->rx}</b> interacts with one or more active ingredients in <b>{$_rx1->rx}</b>.";
- }
- if(count($inactiveCatches)) {
- $output[] = "<b>{$_rx2->rx}</b> interacts with one or more inactive ingredients in <b>{$_rx1->rx}</b>.";
- }
- // TODO: find out and show the names of the actual ingredients causing interaction
- return implode("<br>", $output);
- }
- private function getActiveDdiCodexFromGcnSeqNo($_gcnSeqNo) {
- $ddiCodexArray = [];
- $query = DB::connection('pgsql_fdb')->select("
- SELECT r1.ddi_codex
- FROM RADIMGC4_GCNSEQNO_LINK r1
- WHERE r1.gcn_seqno = :gcnSeqNo
- ",
- ['gcnSeqNo' => $_gcnSeqNo]
- );
- if(count($query)) {
- $ddiCodexArray = array_map(function($_x) {
- return $_x->ddi_codex;
- }, $query);
- }
- return $ddiCodexArray;
- }
- private function getNdcFromMedId($_medId) {
- $ndcArray = [];
- $query = DB::connection('pgsql_fdb')->select("
- select ndc from rmindc1_ndc_medid where medid = :medId
- ",
- ['medId' => $_medId]
- );
- if(count($query)) {
- $ndcArray = array_map(function($_x) {
- return $_x->ndc;
- }, $query);
- }
- return $ndcArray;
- }
- private function getInactiveDdiCodexFromNdc($_ndc) {
- $ddiCodexArray = [];
- $query = DB::connection('pgsql_fdb')->select("
- SELECT distinct r1.ddi_codex
- FROM RDDIMIN0_NDC_INACTV_DDIM_LINK r1
- WHERE r1.ddi_ndc IN (" . implode(',', array_map(function($_x) {return "'" . $_x . "'";}, $_ndc)) . ")
- "
- );
- if(count($query)) {
- $ddiCodexArray = array_map(function($_x) {
- return $_x->ddi_codex;
- }, $query);
- }
- return $ddiCodexArray;
- }
- private function getDdiCodexMonoxPairs($_ddiCodexArray) {
- $ddiCodexMonoxPairsArray = [];
- if(count($_ddiCodexArray)) {
- $ddiCodexMonoxPairsArray = DB::connection('pgsql_fdb')->select("
- SELECT r1.ddi_codex, r1.ddi_monox
- FROM RADIMMA5_MSTR r1
- WHERE r1.ddi_codex IN (" . implode(',', array_map(function($_x) {return "'" . $_x . "'";}, $_ddiCodexArray)) . ")
- "
- );
- }
- return $ddiCodexMonoxPairsArray;
- }
- // drug <-> drug coadministration notes
- public function drugCoadministration(Request $request) {
- $gcnSeqnos = $request->input('gcn-seqnos') ? trim($request->input('gcn-seqnos')) : '';
- if (empty($gcnSeqnos)) return '';
- //$gcnSeqnos = explode(",", $gcnSeqnos);
- $coadministration = DB::connection('pgsql_fdb')->select("
- SELECT distinct r1.coadmin_dosing_text
- FROM radige0_ddi_gcnseqno_except r1
- WHERE r1.side_a_gcn_seqno in ($gcnSeqnos) AND r1.side_b_gcn_seqno in ($gcnSeqnos)
- "
- );
- return view('app.fdb-pg.fdb-coadministration', compact('coadministration'));
- }
- // duplicate therapy indications
- public function duplicateTherapy(Request $request) {
- if($request->input('test')) {
- // override
- $rx = json_decode(json_encode([
- [
- "gcn_seqno" => "4376",
- "med_name_id" => "1076",
- "medid" => "172480",
- "routed_dosage_form_med_id" => "5870",
- "routed_med_id" => "1082",
- "rx" => "aspirin 325",
- ],
- [
- "gcn_seqno" => "4377",
- "med_name_id" => "1076",
- "medid" => "216092",
- "routed_dosage_form_med_id" => "5870",
- "routed_med_id" => "1082",
- "rx" => "aspirin 500",
- ],
- ]));
- }
- else {
- $input = json_decode($request->input('data'));
- $rx = $input->rx;
- }
- $dptClasses = [];
- foreach ($rx as $rxItem) {
- $rxItem->dpt = $this->getDptClassFromGcnSeqNo($rxItem->gcn_seqno);
- }
- // dd($rx);
- $leftIndex = 0;
- $matches = [];
- for ($i=$leftIndex; $i<count($rx) - 1; $i++) {
- for ($j=$i + 1; $j<count($rx); $j++) {
- $compareResult = $this->compareDPTs($rx[$i]->dpt, $rx[$j]->dpt);
- foreach ($compareResult as $c) {
- $matches[] = "<b>{$rx[$i]->rx}</b> and <b>{$rx[$j]->rx}</b> both participate in the duplicate therapy class <b>{$c->dpt_class_desc}</b> (duplicates allowed: {$c->dpt_allowance})";
- }
- }
- }
- return "<ol class='pl-0 ml-3'>" . implode("", array_map(function($_x) {
- return "<li class='mb-2'>" . $_x . "</li>";
- }, $matches)) . "</ol>";
- }
- private function getDptClassFromGcnSeqNo($_gcnSeqNo) {
- return DB::connection('pgsql_fdb')->select("
- SELECT distinct r1.dpt_class_id, r2.dpt_allowance, r2.dpt_class_desc
- FROM RDPTGC0_GCNSEQNO_LINK r1
- JOIN RDPTCL0_CLASS_ID r2 on r1.dpt_class_id = r2.dpt_class_id
- WHERE r1.gcn_seqno = :gcnSeqNo
- ",
- ['gcnSeqNo' => $_gcnSeqNo]
- );
- }
- private function compareDPTs($_dptArray1, $_dptArray2) {
- $output = [];
- for ($i = 0; $i < count($_dptArray1); $i++) {
- for ($j = 0; $j < count($_dptArray2); $j++) {
- if ($_dptArray1[$i]->dpt_class_id == $_dptArray2[$j]->dpt_class_id) {
- $output[] = json_decode(json_encode([
- "dpt_allowance" => $_dptArray1[$i]->dpt_allowance,
- "dpt_class_desc" => $_dptArray1[$i]->dpt_class_desc
- ]));
- }
- }
- }
- return $output;
- }
- public function rxVigilance(Request $request, Client $patient) {
- return view('app.fdb-pg.rx-vigilance', compact('patient'));
- }
- public function dxVigilance(Request $request, Client $patient) {
- return view('app.fdb-pg.dx-vigilance', compact('patient'));
- }
- public function allergyVigilance(Request $request, Client $patient) {
- return view('app.fdb-pg.allergy-vigilance', compact('patient'));
- }
- }
|