Parcourir la source

FDB Playground - drug allergies (wip)

Vijayakrishnan il y a 3 ans
Parent
commit
a7d758c72b
1 fichiers modifiés avec 96 ajouts et 14 suppressions
  1. 96 14
      app/Http/Controllers/FDBPGController.php

+ 96 - 14
app/Http/Controllers/FDBPGController.php

@@ -191,9 +191,19 @@ ORDER BY r1.dam_concept_id_desc
         */
 
         foreach ($allergies as $allergy) {
-            if($allergy->dam_concept_id_typ == 6) {
-                foreach ($rx as $rxItem) {
-                    if($this->drugAllergyIngredientAllergenVsSingleRx($allergy, $rxItem)) {
+            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>.";
                     }
                 }
@@ -204,14 +214,6 @@ ORDER BY r1.dam_concept_id_desc
 
     }
 
-    private function getAllergenIngredients($_allergen) {
-
-    }
-
-    private function getRxIngredients($_rx) {
-
-    }
-
     private function drugAllergyIngredientAllergenVsSingleRx($_allergen, $_rx) {
 
         $matches = DB::connection('pgsql_fdb')->select("
@@ -235,7 +237,7 @@ INTERSECT
         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 = :allergenHicSeqNo
+        WHERE R1.hic_seqn = :allergenConceptID
     )
     UNION
     -- all ingredients via related dam allergen groups
@@ -245,13 +247,93 @@ INTERSECT
                  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 = :allergenHicSeqNo
+        WHERE R1.hic_seqn = :allergenConceptID
           AND R2.dam_alrgn_grp_status_cd = 0
         ORDER BY r3.hic_seqn
     )
 )
 ",
-            ['medid' => $_rx->medid, 'allergenHicSeqNo' => $_allergen->dam_concept_id]
+            ['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);