| 1 | GMRAFX ;SLC/DAN Fix existing allergy entries ;3/2/06  13:46
 | 
|---|
| 2 |  ;;4.0;Adverse Reaction Tracking;**17,19,23,20**;Mar 29, 1996;Build 1
 | 
|---|
| 3 |  ;DBIA SECTION
 | 
|---|
| 4 |  ;10118 - VALM
 | 
|---|
| 5 |  ;2056  - DIQ
 | 
|---|
| 6 |  ;3744  - $$TESTPAT^VADPT
 | 
|---|
| 7 |  ;10006 - DIC
 | 
|---|
| 8 |  ;10103 - XLFDT
 | 
|---|
| 9 |  ;10102 - XQORM1
 | 
|---|
| 10 |  ;10104 - XLFSTR
 | 
|---|
| 11 |  ;10117 - VALM10
 | 
|---|
| 12 |  ;10116 - VALM1
 | 
|---|
| 13 |  ;10026 - DIR
 | 
|---|
| 14 |  ;10018 - DIE
 | 
|---|
| 15 |  ;10013 - DIK
 | 
|---|
| 16 |  ;10061 - VADPT
 | 
|---|
| 17 |  ;10101 - XQOR
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 | EN ; -- main entry point for GMRA FIX
 | 
|---|
| 20 |  N NMBR,REBLD,Y,DIR,I,LTYPE
 | 
|---|
| 21 |  S LTYPE=$$GETTYPE^GMRAFX3(.LTYPE) Q:LTYPE=0
 | 
|---|
| 22 |  I $D(^XTMP("GMRAFX",LTYPE,"B")) W !,"The list is currently being built by another user so this option is",!,"temporarily unavailable.  Please try again in a few minutes." Q
 | 
|---|
| 23 |  I $D(^XTMP("GMRAFX",LTYPE,"INUSE")) D
 | 
|---|
| 24 |  .W !,"The utility is currently in use by the following people:",!
 | 
|---|
| 25 |  .S I=0 F  S I=$O(^XTMP("GMRAFX",LTYPE,"INUSE",I)) Q:'+I  W !,$$GET1^DIQ(200,I,.01)
 | 
|---|
| 26 |  .W !!,"As a result, the existing "_$S(LTYPE="FREE":"free text",LTYPE="ING":"ingredient",1:"drug class")_" list will be used." D WAIT^GMRAFX3
 | 
|---|
| 27 |  I $D(^XTMP("GMRAFX",LTYPE)),'$D(^XTMP("GMRAFX",LTYPE,"INUSE")) D
 | 
|---|
| 28 |  .W !,"The "_$S(LTYPE="FREE":"free text",LTYPE="ING":"ingredient",1:"drug class")_" list was last built on ",$$FMTE^XLFDT($P(^XTMP("GMRAFX",LTYPE,0),U,2)),!
 | 
|---|
| 29 |  .S DIR(0)="Y",DIR("A")="Do you want to rebuild the list",DIR("B")="NO",DIR("?")="Enter yes to rebuild the list of entries.  Enter NO to use the currently existing list"
 | 
|---|
| 30 |  .D ^DIR I Y=1 K ^XTMP("GMRAFX",LTYPE) S REBLD=1
 | 
|---|
| 31 |  I $G(REBLD)!('$D(^XTMP("GMRAFX",LTYPE))) W !,"Building list of "_$S(LTYPE="FREE":"free text",LTYPE="ING":"ingredient",1:"drug class")_" allergies...this may take a few minutes",!
 | 
|---|
| 32 |  S ^XTMP("GMRAFX",LTYPE,"INUSE",+$G(DUZ))=""
 | 
|---|
| 33 |  D EN^VALM("GMRA FIX")
 | 
|---|
| 34 |  K ^XTMP("GMRAFX",LTYPE,"INUSE",+$G(DUZ))
 | 
|---|
| 35 |  Q
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 | HDR ; -- header code
 | 
|---|
| 38 |  S VALMHDR(1)="Allergy Tracking "_$S(LTYPE="FREE":"Free Text",LTYPE="ING":"Ingredient",1:"Drug CLass")_" Entries"
 | 
|---|
| 39 |  Q
 | 
|---|
| 40 | PHDR ;
 | 
|---|
| 41 |  S VALMSG="Select one or more entries"
 | 
|---|
| 42 |  S XQORM("#")=$$FIND1^DIC(101,,"BX","GMRA FIX FREE TEXT LIST") ;19
 | 
|---|
| 43 |  D SHOW^VALM
 | 
|---|
| 44 |  Q
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 | INIT ;Initialize variables, etc
 | 
|---|
| 47 |  S VALMBCK="",VALMBG=$S($G(VALMBG)'="":VALMBG,1:1),VALMCNT=$S($D(^XTMP("GMRAFX",LTYPE,0)):$P(^(0),U,3),1:0),VALMWD=80
 | 
|---|
| 48 |  Q
 | 
|---|
| 49 | LIST ; -- obtain and display list of free text allergies
 | 
|---|
| 50 |  N GMRAIEN,GMRAOTH,GMRATXT,GMRAUTXT,SP1,SP2,SP3,UP,TXT
 | 
|---|
| 51 |  S VALMBCK="R",VALMCNT=0
 | 
|---|
| 52 |  K ^XTMP("GMRAFX",LTYPE) S ^XTMP("GMRAFX",LTYPE,"B")="",^XTMP("GMRAFX",LTYPE,"INUSE",+$G(DUZ))=""
 | 
|---|
| 53 |  S GMRAOTH=$O(^GMRD(120.82,"B","OTHER ALLERGY/ADVERSE REACTION",0))_";GMRD(120.82," ;Gets IEN;FILE ENTRY for free text entries
 | 
|---|
| 54 |  S GMRAIEN=0 F  S GMRAIEN=$O(^GMR(120.8,GMRAIEN)) Q:'+GMRAIEN  D
 | 
|---|
| 55 |  .I LTYPE="FREE" I $P($G(^GMR(120.8,GMRAIEN,0)),U,3)'=GMRAOTH Q
 | 
|---|
| 56 |  .I LTYPE="ING" I $P($G(^GMR(120.8,GMRAIEN,0)),U,3)'["50.416" Q
 | 
|---|
| 57 |  .I LTYPE="DRUG" I $P($G(^GMR(120.8,GMRAIEN,0)),U,3)'["50.605" Q
 | 
|---|
| 58 |  .Q:+$G(^GMR(120.8,GMRAIEN,"ER"))  ;Quit if reactant entered in error
 | 
|---|
| 59 |  .Q:$$DECEASED(+$P($G(^GMR(120.8,GMRAIEN,0)),U))  ;Don't report expired patients
 | 
|---|
| 60 |  .Q:$$TESTPAT^VADPT($P($G(^GMR(120.8,GMRAIEN,0)),U))  ;Don't report test patients
 | 
|---|
| 61 |  .S GMRATXT=$E($P($G(^GMR(120.8,GMRAIEN,0)),U,2),1,75) ;Get "reactant" text entry, no more than 75 characters
 | 
|---|
| 62 |  .S GMRATXT=$TR(GMRATXT,"""","") ;19 remove quote marks from text
 | 
|---|
| 63 |  .S GMRAUTXT=$$UP^XLFSTR(GMRATXT) ;Convert to upper case
 | 
|---|
| 64 |  .S ^XTMP("GMRAFX",LTYPE,"GMRAR",GMRAUTXT,GMRATXT)=$G(^XTMP("GMRAFX",LTYPE,"GMRAR",GMRAUTXT,GMRATXT))+1 ;# of active entries
 | 
|---|
| 65 |  .S ^XTMP("GMRAFX",LTYPE,"GMRAR",GMRAUTXT,GMRATXT,GMRAIEN)="" ;Store entry number
 | 
|---|
| 66 |  .Q
 | 
|---|
| 67 |  S UP="" F  S UP=$O(^XTMP("GMRAFX",LTYPE,"GMRAR",UP)) Q:UP=""  S TXT="" F  S TXT=$O(^XTMP("GMRAFX",LTYPE,"GMRAR",UP,TXT)) Q:TXT=""  D
 | 
|---|
| 68 |  .S VALMCNT=VALMCNT+1
 | 
|---|
| 69 |  .S SP1=4-$L(VALMCNT),SP2=40-$L(TXT),SP3=16-$L(^XTMP("GMRAFX",LTYPE,"GMRAR",UP,TXT))\2 ;Set up spacing before storing
 | 
|---|
| 70 |  .D SET^VALM10(VALMCNT,VALMCNT_$$REPEAT^XLFSTR(" ",SP1)_TXT_$$REPEAT^XLFSTR(" ",SP2)_$$REPEAT^XLFSTR(" ",SP3)_^XTMP("GMRAFX",LTYPE,"GMRAR",UP,TXT))
 | 
|---|
| 71 |  .S ^XTMP("GMRAFX",LTYPE,"IDX",VALMCNT)=UP_"^"_TXT
 | 
|---|
| 72 |  K ^XTMP("GMRAFX",LTYPE,"B") ;Done building
 | 
|---|
| 73 |  S ^XTMP("GMRAFX",LTYPE,0)=$$FMADD^XLFDT(DT,30)_U_DT_U_$G(VALMCNT)
 | 
|---|
| 74 |  Q
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 | HELP ; -- help code
 | 
|---|
| 77 |  D FULL^VALM1
 | 
|---|
| 78 |  W !!,"Use AE to add local allergies to the GMR ALLERGY file.  This",!,"should only be done if you're sure no existing reactant matches your needs."
 | 
|---|
| 79 |  W !!,"Use EE to mark all entries within the selected group as entered",!,"in error.  You may select multiple groups if you like."
 | 
|---|
| 80 |  W !!,"Use DD to get a detailed display.  It's highly recommended that you",!,"use the detailed display menu to make all changes."
 | 
|---|
| 81 |  W !!,"Use UR to update the reactant.  Extreme caution should be used when doing",!,"mass updates.  It would be better to do the updates from within",!,"the detailed display menu.",!
 | 
|---|
| 82 |  D WAIT^GMRAFX3 S VALMBCK="R"
 | 
|---|
| 83 |  Q
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | EXIT ; -- exit code
 | 
|---|
| 86 |  D FULL^VALM1
 | 
|---|
| 87 |  D DESELECT  ;Clear any remaining items
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 | EXPND ; -- expand code
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | CHKSEL ;Evaluate selection if done by number
 | 
|---|
| 94 |  N J,TMP,DIR,NUM,X,Y,TNMBR
 | 
|---|
| 95 |  S VALMBCK="R"
 | 
|---|
| 96 |  S NUM=$P($G(XQORNOD(0)),"=",2) ;get currently selected entries
 | 
|---|
| 97 |  I NUM'="" D
 | 
|---|
| 98 |  .I NUM=$G(NMBR) D DESELECT Q  ;If user selects same entry without taking an entry, unhighlight and stop processing
 | 
|---|
| 99 |  .D DESELECT:$G(NMBR) ;If user previously selected entries but took no action, unhighlight before highlighting new choices
 | 
|---|
| 100 |  .S NMBR=$P(XQORNOD(0),"=",2),DIR(0)="L^"_"1:"_VALMCNT,X=NMBR,DIR("V")="" D ^DIR K DIR
 | 
|---|
| 101 |  .I Y="" D FULL^VALM1 W !,"Invalid selection." D WAIT^GMRAFX3 K NMBR Q  ;Selection out of range, stop processing
 | 
|---|
| 102 |  .S TNMBR=""
 | 
|---|
| 103 |  .F J=1:1:$L(NMBR,",")-1 S TMP=$P(NMBR,",",J) I $$LOCK^GMRAFX3(TMP) S TNMBR=TNMBR_TMP_"," D CNTRL^VALM10(TMP,1,+$G(VALMWD),IORVON,IORVOFF)
 | 
|---|
| 104 |  .I TNMBR="" K NMBR Q
 | 
|---|
| 105 |  .S NMBR=TNMBR
 | 
|---|
| 106 |  Q
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 | DESELECT ;Un-highlight selected choices
 | 
|---|
| 109 |  N J,TMP
 | 
|---|
| 110 |  F J=1:1:$L($G(NMBR),",")-1 S TMP=$P(NMBR,",",J) D CNTRL^VALM10(TMP,1,+$G(VALMWD),IORVOFF,IORVOFF) L -^XTMP("GMRAFX","IDX",TMP)
 | 
|---|
| 111 |  K NMBR
 | 
|---|
| 112 |  Q
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 | AEA ; Entry for GMRA LOCAL ALLERGIES EDIT option
 | 
|---|
| 115 |  S VALMBCK="R" D FULL^VALM1,PROCESS^GMRAFUT0,WAIT^GMRAFX3 Q  ;23
 | 
|---|
| 116 |  N DLAYGO,DIC,Y,GMRAIEN,DA,GMRALN,DIE,GMRACT,DR,GMRAX,GMRAY,X
 | 
|---|
| 117 |  S VALMBCK="R" D FULL^VALM1
 | 
|---|
| 118 |  W ! S DLAYGO=120.82,DIC="^GMRD(120.82,",DIC("A")="Select a LOCAL ALLERGY/ADVERSE REACTION: ",DIC(0)="AEQML",DIC("DR")="1" D ^DIC K DIC,DLAYGO Q:+Y'>0  S (DA,GMRAIEN)=+Y
 | 
|---|
| 119 |  L +^GMRD(120.82,GMRAIEN):1 I '$T W !,"THIS ENTRY IS BEING EDITED BY SOMEONE ELSE" Q
 | 
|---|
| 120 |  S GMRALN=$G(^GMRD(120.82,GMRAIEN,0))
 | 
|---|
| 121 |  S DIE="^GMRD(120.82,",DR="",GMRACT=1
 | 
|---|
| 122 |  I +$P(GMRALN,U,3) S DR(1,120.82,1)="@1;W !!,$C(7),""CANNOT EDIT NAME FIELD OF A NATIONAL ALLERGY."",!;3;"
 | 
|---|
| 123 |  E  D
 | 
|---|
| 124 |  .S DR(1,120.82,1)=".01;3;"
 | 
|---|
| 125 |  .S DR(1,120.82,2)="S (GMRAY,GMRAX)=$P(GMRALN,U,2) D EDTTYPE^GMRAUTL(.GMRAX);"
 | 
|---|
| 126 |  .S DR(1,120.82,3)="S:GMRAX=GMRAY!(""^^""[GMRAX) X=GMRAX,Y=$S(""^^""[GMRAX:""@3"",1:""@4"");1///^S X=GMRAX;@4;4;5;@3;"
 | 
|---|
| 127 |  .Q
 | 
|---|
| 128 |  D ^DIE
 | 
|---|
| 129 |  L -^GMRD(120.82,GMRAIEN)
 | 
|---|
| 130 |  Q
 | 
|---|
| 131 |  ;
 | 
|---|
| 132 | PROCESS(TYPE) ;API to mark all entries as entered in error or update entries to new reactant
 | 
|---|
| 133 |  N GMRAPA,GMRAI,GMRAJ,DIR,Y,ROOT,NUM,ENTRY,GMRADONE,STOP,J,TNMBR,GMRAAR,GMRASURE
 | 
|---|
| 134 |  S VALMBCK="R" D FULL^VALM1
 | 
|---|
| 135 |  I '$G(NMBR) S NMBR=$$GETNUM^GMRAFX3("") Q:'+NMBR  D  Q:'+$G(NMBR)
 | 
|---|
| 136 |  .S TNMBR=""
 | 
|---|
| 137 |  .F J=1:1:$L(NMBR,",")-1 S TMP=$P(NMBR,",",J) I $$LOCK^GMRAFX3(TMP) S TNMBR=TNMBR_TMP_","
 | 
|---|
| 138 |  .I TNMBR="" K NMBR Q
 | 
|---|
| 139 |  .S NMBR=TNMBR
 | 
|---|
| 140 |  I TYPE="U" W !!,"You should use the detailed display option to review entries in",!,"this group before doing a mass update.  CHANGES CANNOT BE UN-DONE!" D WAIT^GMRAFX3
 | 
|---|
| 141 |  W !!,"You are about to ",$S(TYPE="E":"mark",1:"update")," ALL allergies with the selected reactant ",!,$S(TYPE="E":"as entered in error.",1:"to a new reactant."),!
 | 
|---|
| 142 |  S DIR(0)="Y",DIR("B")="NO",DIR("A")="ARE YOU SURE"
 | 
|---|
| 143 |  S DIR("?")="If you're unsure, use the 'detailed display' option to get a list of individual patients."
 | 
|---|
| 144 |  S DIR("?",1)="Answering YES to this prompt will cause all allergies associated with"
 | 
|---|
| 145 |  S DIR("?",2)="the selected reactant to be "_$S(TYPE="E":"marked as entered in error.",1:"updated to the new reactant.")
 | 
|---|
| 146 |  S DIR("?",3)=""
 | 
|---|
| 147 |  S DIR("?",4)="Be SURE this is what you want to do."
 | 
|---|
| 148 |  D ^DIR Q:Y'=1  ;Stop if user doesn't answer yes
 | 
|---|
| 149 |  F GMRAI=1:1:($L(NMBR,",")-1) D
 | 
|---|
| 150 |  .S NUM=$P(NMBR,",",GMRAI),ENTRY=^XTMP("GMRAFX",LTYPE,"IDX",NUM),STOP=0
 | 
|---|
| 151 |  .S ROOT="^XTMP(""GMRAFX"",LTYPE,""GMRAR"","_""""_$P(ENTRY,"^")_""""_","_""""_$P(ENTRY,"^",2)_""""_")",GMRAJ=0 Q:'@ROOT
 | 
|---|
| 152 |  .I TYPE="U" W !!,"Updating ",$P(ENTRY,U)," reactions"
 | 
|---|
| 153 |  .F  S GMRAJ=$O(@ROOT@(GMRAJ)) Q:GMRAJ=""!($G(STOP))  I GMRAJ D
 | 
|---|
| 154 |  ..S GMRAPA=GMRAJ,GMRADONE=1 D @$S(TYPE="E":"EIE",1:"UIE^GMRAFX3")
 | 
|---|
| 155 |  ..D:GMRADONE UPDATE^GMRAFX3
 | 
|---|
| 156 |  Q
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 | EIE ;Mark individual entry as entered in error
 | 
|---|
| 159 |  D EIE^GMRAFX3 ;Moved due to size limits
 | 
|---|
| 160 |  Q
 | 
|---|
| 161 |  ;
 | 
|---|
| 162 | DECEASED(GMRAIFN) ;Function returns 1 if patient is deceased, 0 if living
 | 
|---|
| 163 |  N DFN,VADM
 | 
|---|
| 164 |  Q:GMRAIFN=0 1  ;If no patient entry return true
 | 
|---|
| 165 |  S DFN=GMRAIFN
 | 
|---|
| 166 |  D DEM^VADPT
 | 
|---|
| 167 |  Q $S(+VADM(6):1,1:0)  ;VADM(6) holds date of death
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 | ADCOM(ENTRY,TYPE,COM) ;Add comment to allergy
 | 
|---|
| 170 |  N DIC,DIE,DR,DA,Y,X
 | 
|---|
| 171 |  S DA(1)=ENTRY
 | 
|---|
| 172 |  S DIC="^GMR(120.8,"_DA(1)_",26,",DIC(0)="L" F  S X=$$NOW^XLFDT Q:'$D(^GMR(120.8,DA(1),26,"B",X))  ;23 Don't allow duplicate entries
 | 
|---|
| 173 |  D ^DIC Q:Y=-1  ;add new comment multiple
 | 
|---|
| 174 |  S DA=+Y
 | 
|---|
| 175 |  S DIE=DIC K DIC
 | 
|---|
| 176 |  S DR="1////"_$G(DUZ,.5)_";1.5///"_TYPE_";2///"_$TR(COM,";"," ") ;remove semi-colon from free text
 | 
|---|
| 177 |  D ^DIE ;Comment added by user
 | 
|---|
| 178 |  Q
 | 
|---|