| 1 | ECDSUTIL ;BIR/RHK,TTH - Event Capture Utilities ;4 May 95
 | 
|---|
| 2 |  ;;2.0; EVENT CAPTURE ;**4,5,7,14,18,29**;8 May 96
 | 
|---|
| 3 |  ;Routine of various utilities and common subroutines
 | 
|---|
| 4 | UNIT ;Select DSS Unit
 | 
|---|
| 5 |  I '$D(ECL) D ^ECL Q:'$D(ECL)
 | 
|---|
| 6 |  S CNT=0 F XX=0:0 S XX=$O(^ECJ("AP",ECL,XX)) Q:'XX  S CNT=CNT+1 S ECD=XX
 | 
|---|
| 7 |  I CNT<2 D  G SETVAR
 | 
|---|
| 8 |  .S ECDN=$P(^ECD(ECD,0),"^") W !,"DSS Unit: ",ECDN
 | 
|---|
| 9 |  .S Y=ECD_"^"_$P(^ECD(ECD,0),"^")
 | 
|---|
| 10 |  .S Y(0)=^ECD(ECD,0)
 | 
|---|
| 11 |  .Q
 | 
|---|
| 12 |  S DIC=724,DIC(0)="AEQMZ",DIC("A")="Select DSS Unit: ",DIC("S")="I $D(^ECJ(""AP"",ECL,+Y))" D ^DIC K DIC I Y<0 K ECL Q
 | 
|---|
| 13 |  S ECD=+Y,ECDN=$P(Y,U,2)
 | 
|---|
| 14 | SETVAR ;Set variable from the selected DSS Unit.
 | 
|---|
| 15 |  S ECD(0)=Y(0),ECS=$P(Y(0),U,2),ECMS=$P(Y(0),U,3),ECOST=$P(Y(0),U,4),ECSN=$P(^DIC(49,ECS,0),U)
 | 
|---|
| 16 |  S ECPCE="U~"_$S($P(ECD(0),U,14)]"":$P(ECD(0),"^",14),1:"N")
 | 
|---|
| 17 |  I $P(^ECD(ECD,0),U,11) D  I $D(ECERR) K ECL,ECD,ECS,ECMS,ECOST,ECSN Q
 | 
|---|
| 18 |  .S DIC=726,DIC(0)="AEQMZ",DIC("A")="Select Category: ",DIC("S")="I $D(^ECJ(""AP"",ECL,ECD,+Y))&('$P(^EC(726,+Y,0),U,3)!($P(^EC(726,+Y,0),U,3)>DT))"
 | 
|---|
| 19 |  .D ^DIC K DIC I Y<0 S ECERR=1 Q
 | 
|---|
| 20 |  .S ECC=+Y,ECCN=Y(0,0)
 | 
|---|
| 21 |  I '$D(ECC) S ECC=0,ECCN="None"
 | 
|---|
| 22 |  Q
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  ;ALB/ESD - Procedure Reason utilities
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 | ADREAS(ECSPTR) ; Add procedure reason(s) to the EC Procedure Reason (#720.4)
 | 
|---|
| 28 |  ;         file and pointers to the EC Event Code Screens/Proc Reason
 | 
|---|
| 29 |  ;         Link (#720.5) file
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  N DA,DIC,DLAYGO,DIE,DR,ECPRPTR,X,Y,DUOUT,DTOUT
 | 
|---|
| 32 | ASK S ECSPTR=+$G(ECSPTR)
 | 
|---|
| 33 |  I 'ECSPTR G ADREASQ
 | 
|---|
| 34 |  S DIC="^ECR(",DIC(0)="QEALZ",DLAYGO=720.4,DIC("A")="Enter procedure reason: "
 | 
|---|
| 35 |  D ^DIC
 | 
|---|
| 36 |  Q:Y=-1  Q:($D(DUOUT)!$D(DTOUT))
 | 
|---|
| 37 |  I +Y>0 D
 | 
|---|
| 38 |  . S ECPRPTR=+Y
 | 
|---|
| 39 |  . S DIE=DIC,DA=ECPRPTR,DR=".02////1" D ^DIE
 | 
|---|
| 40 |  . K DA,DIC,DLAYGO,DIE,Y
 | 
|---|
| 41 |  . I '$D(^ECL("AC",ECPRPTR,ECSPTR)) D
 | 
|---|
| 42 |  .. S DIC="^ECL(",DIC(0)="L",DLAYGO=720.5,X=ECPRPTR,DIC("DR")=".02////"_ECSPTR
 | 
|---|
| 43 |  .. K DD,DO D FILE^DICN
 | 
|---|
| 44 |  G ASK
 | 
|---|
| 45 | ADREASQ Q
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | GETSCRN(ECPPTR) ; Get EC Event Code Screens (#720.3) file internal entry number
 | 
|---|
| 49 |  ;         (IEN)
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 |  ;       Input:   ECPPTR = Event Capture Patient (#721) file IEN
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ;      Output:   EC Event Code Screens IEN if found or zero if not
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  I '$G(ECPPTR) G GETSCRNQ
 | 
|---|
| 56 |  N ECSIEN,ECNODE0
 | 
|---|
| 57 |  S ECSIEN=0,ECNODE0=""
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ;- Get EC Patient record zero node
 | 
|---|
| 60 |  S ECNODE0=$G(^ECH(+ECPPTR,0))
 | 
|---|
| 61 |  I ECNODE0="" G GETSCRNQ
 | 
|---|
| 62 |  ;
 | 
|---|
| 63 |  ;- Get EC Screen IEN from file #720.3 "AP" xref using Loc, DSS Unit,
 | 
|---|
| 64 |  ;  Category, and Procedure from EC Patient record
 | 
|---|
| 65 |  S ECSIEN=+$O(^ECJ("AP",+$P(ECNODE0,U,4),+$P(ECNODE0,U,7),+$P(ECNODE0,U,8),$P(ECNODE0,U,9),0))
 | 
|---|
| 66 |  I 'ECSIEN G GETSCRNQ
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  ;- If 'Ask Procedure Reasons?' field = Yes and one or more procedure
 | 
|---|
| 69 |  ;  reasons entered for the event code screen
 | 
|---|
| 70 |  S ECSIEN=$S((+$P($G(^ECJ(ECSIEN,"PRO")),U,5))&(+$O(^ECL("AD",ECSIEN,0))):ECSIEN,1:0)
 | 
|---|
| 71 | GETSCRNQ Q +$G(ECSIEN)
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | GETPRO() ;Get procedure from user and determine type
 | 
|---|
| 75 |  ;     Input: None
 | 
|---|
| 76 |  ;    Output: 1^type of procedure: X = procedure number
 | 
|---|
| 77 |  ;                                 N = CPT or national number
 | 
|---|
| 78 |  ;                                 A = name of procedure
 | 
|---|
| 79 |  ;                                 S = procedure synonym
 | 
|---|
| 80 |  ;            or -1 if unsuccessful
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  ;            ECPROCED = value of Y from DIR call
 | 
|---|
| 83 |  ;            ECMODS   = value of CPT modifiers separated by comman
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  N ECANS,Y
 | 
|---|
| 86 |  K ECMODS S ECMODS="",ECANS=-1
 | 
|---|
| 87 |  S DIR(0)="FAO",DIR("A")="Enter Procedure: "
 | 
|---|
| 88 |  D ^DIR
 | 
|---|
| 89 |  I $D(DIRUT)!($D(DUOUT))!($D(DTOUT))!(Y="") G GETPROQ
 | 
|---|
| 90 |  I $G(Y)]"" D
 | 
|---|
| 91 |  . S ECANS=$S($P(Y,"-")?1.4N:"X",($L($P(Y,"-"))=5)&(($P(Y,"-")?5N)!($P(Y,"-")?1A4AN)):"N",((Y?1A.ANP)&($E(Y,1)'="&")):"A",(Y?1"&".ANP):"S",($A(Y)=32):"L",(($L(Y)>5)&(Y?1N.ANP)):"A",1:"ERR")
 | 
|---|
| 92 |  . ;S ECANS=$S(Y?1.4N:"X",($L(Y)=5)&((Y?5N)!(Y?1A4AN)):"N",((Y?1A.ANP)&($E(Y,1)'="&")):"A",(Y?1"&".ANP):"S",($A(Y)=32):"L",(($L(Y)>5)&(Y?1N.ANP)):"A",1:"ERR")
 | 
|---|
| 93 |  . I ECANS'="ERR" D
 | 
|---|
| 94 |  .. I "X^N^"[ECANS S ECMODS=$P(Y,"-",2),Y=$P(Y,"-")
 | 
|---|
| 95 |  .. S ECMODS=$TR(ECMODS,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 | 
|---|
| 96 |  .. S ECANS=1_"^"_ECANS
 | 
|---|
| 97 |  .. S ECPROCED=Y I $E(ECPROCED,1)="&" S ECPROCED=$E(ECPROCED,2,$L(ECPROCED))
 | 
|---|
| 98 |  . I ECANS="ERR" S ECANS=-1
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 | GETPROQ K DIR,DIRUT,DTOUT,DUOUT
 | 
|---|
| 101 |  Q $G(ECANS)
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  ;
 | 
|---|
| 104 | SRCHTM(ANS) ; Lookup for procedures in ^TMP("ECPRO",$J)
 | 
|---|
| 105 |  ;     Input:  Procedure type (see first output in GETPRO function above)
 | 
|---|
| 106 |  ;    Output:  ECPCNT:   -1 = no (or bad) procedure type
 | 
|---|
| 107 |  ;                        0 = procedure is in local ECPNAME array 
 | 
|---|
| 108 |  ;                            (for A and S types)
 | 
|---|
| 109 |  ;                   number = procedure number (for X and N types)
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  ;             ECPNAME      = procedure number^procedure name
 | 
|---|
| 112 |  ;                            (for A and S types)
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 |  N ECNOGO,ECPNAM,ECPUNAM,I,J
 | 
|---|
| 115 |  S ECPCNT=-1,ECPNAM="",J=0
 | 
|---|
| 116 |  I +ANS=-1!($G(ANS)="") G SRCHTMQ
 | 
|---|
| 117 |  I +ANS=1,('$D(ECPROCED)) S ANS=-1 G SRCHTMQ
 | 
|---|
| 118 |  ;
 | 
|---|
| 119 |  ;-- Get 2nd piece of procedure type (letter) for lookup
 | 
|---|
| 120 |  S ANS=$P(ANS,"^",2)
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 |  ;-- Convert to upper case to handle case sensitivity
 | 
|---|
| 123 |  S ECPROCED=$$UPPER^VALM1(ECPROCED)
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 |  ;-- X = procedure number
 | 
|---|
| 126 |  I ANS="X",$D(^TMP("ECPRO",$J,ECPROCED)) S ECPCNT=ECPROCED G SRCHTMQ
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 |  ;-- N = CPT or national number
 | 
|---|
| 129 |  I ANS="N",(+$O(^TMP("ECPRO",$J,"N",ECPROCED,0))>0) S ECPCNT=+$O(^TMP("ECPRO",$J,"N",ECPROCED,0)) G SRCHTMQ
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  ;-- If "N" and not in National # xref, chk to see if it's a proc name
 | 
|---|
| 132 |  I ANS="N",(+$O(^TMP("ECPRO",$J,"N",ECPROCED,0))=0) S ANS="A"
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  ;-- L = last procedure (spacebar/return functionality)
 | 
|---|
| 135 |  I ANS="L",$D(^TMP("ECLKUP",$J,"LAST")) S ECPCNT=+$P($G(^TMP("ECLKUP",$J,"LAST")),"^") G SRCHTMQ
 | 
|---|
| 136 |  ;
 | 
|---|
| 137 |  ;-- A = name of procedure / S = procedure synonym
 | 
|---|
| 138 |  I ANS="A"!(ANS="S") D
 | 
|---|
| 139 |  . F  S ECPNAM=$O(^TMP("ECPRO",$J,$S(ANS="A":"B",ANS="S":"SYN"),ECPNAM)) Q:ECPNAM=""  D
 | 
|---|
| 140 |  .. S ECNOGO=0
 | 
|---|
| 141 |  .. S ECPUNAM=$$UPPER^VALM1(ECPNAM)
 | 
|---|
| 142 |  .. F I=1:1:$L(ECPROCED) S:$E(ECPROCED,I)'=$E(ECPUNAM,I) ECNOGO=1
 | 
|---|
| 143 |  .. I 'ECNOGO S J=J+1,ECPCNT=0,ECPNAME(J)=+$O(^TMP("ECPRO",$J,$S(ANS="A":"B",ANS="S":"SYN"),ECPNAM,0))_"^"_ECPNAM
 | 
|---|
| 144 |  I ANS="L",'$D(^TMP("ECLKUP",$J,"LAST")) S ECPCNT=-2
 | 
|---|
| 145 | SRCHTMQ Q
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 | PRLST() ;Print list if more than one procedure matches
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  N ECFL,ECRESP,ECMAX,I
 | 
|---|
| 151 |  S (ECFL,ECRESP,ECMAX,I)=0
 | 
|---|
| 152 |  G:'$D(ECPNAME) PRLSTQ
 | 
|---|
| 153 |  F  S I=$O(ECPNAME(I)) Q:'I!(ECFL)  D
 | 
|---|
| 154 |  . I '$D(ECPNAME(2)) S (ECFL,ECRESP)=1 Q
 | 
|---|
| 155 |  . W !?5,I,?10,$P(ECPNAME(I),"^",2) S ECMAX=I
 | 
|---|
| 156 |  G:ECFL PRLSTQ
 | 
|---|
| 157 | CHOOSE S ECRESP=0
 | 
|---|
| 158 |  W !!,"CHOOSE 1-"_ECMAX_": " R ECRESP:DTIME I '$T!(ECRESP["^") G PRLSTQ
 | 
|---|
| 159 |  I +ECRESP<1!(+ECRESP>ECMAX) W *7,"??" G CHOOSE
 | 
|---|
| 160 | PRLSTQ Q $S(ECRESP>0:+$P(ECPNAME(ECRESP),"^"),1:-1)
 | 
|---|
| 161 |  ;
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 | ERRMSG ;Invalid procedure error message
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  W !!,"Enter a valid procedure or press ""^"" to exit.",!
 | 
|---|
| 167 |  Q
 | 
|---|
| 168 |  ;
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 | ERRMSG2 ;Spacebar/return error message
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 |  W !!?5,"One procedure must be entered before using spacebar/return",!?5,"to get the same procedure.",!
 | 
|---|
| 173 |  Q
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 | KILLV ;
 | 
|---|
| 177 |  K ECPCNT,ECPNAME,ECPROCED,ECPROS,ECX
 | 
|---|
| 178 |  Q
 | 
|---|