| 1 | PSUVIT1 ;BIR/RDC - VITALS & IMMUNIZATION EXTRACT; 24 DEC 2003 ; 10/9/07 7:03am
 | 
|---|
| 2 |  ;;4.0;PHARMACY BENEFITS MANAGEMENT;**11**;MARCH, 2005;Build 8
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;DBIA's
 | 
|---|
| 5 |  ;References to file #4       - the INSTITUTION file
 | 
|---|
| 6 |  ;  DBIA 10090 for: the STATION field  - #99
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;References to file #120.5    - the GMRV VITAL MEASUREMENT file
 | 
|---|
| 9 |  ;  DBIA 1381 for:   the DATE/TIME VITALS TAKEN field - #.01
 | 
|---|
| 10 |  ;                   the VITAL TYPE field #.03
 | 
|---|
| 11 |  ;                   the RATE field #1.2
 | 
|---|
| 12 |  ;                   the QUALIFIER field #5
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ;References to file #120.51- the GMRV VITAL TYPE file
 | 
|---|
| 15 |  ;       DBIA 1382 for: the NAME field - #.01
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ;References to file #120.52 - the GMRV VITAL QUALIFIER file
 | 
|---|
| 18 |  ;       DBIA 4504 for: the QUALIFIER field #.01
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  ;References to file #9000010.11 - the V IMMUNIZATION file
 | 
|---|
| 21 |  ;       DBIA 4567 for: the EVENT DATE AND TIME field #1202
 | 
|---|
| 22 |  ;                      the IMMUNIZATION field #.01
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 |  ;References to file #2   - the PATIENT file
 | 
|---|
| 25 |  ;       DBIA 10035 for:  the SOCIAL SECURITY NUMBER field #.09
 | 
|---|
| 26 |  ;       DBIA 3504 for: the TEST PATIENT INDICATOR field #.6
 | 
|---|
| 27 |  ;
 | 
|---|
| 28 |  ;References to file #9999999.14 - the IMMUNIZATION file
 | 
|---|
| 29 |  ;       DBIA 2454 for: the NAME field #.01
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 | EN ;ENtry POINT - Routine control module
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  N SDATE,EDATE,PSUFAC,PSUIDATE,PSUQCNT,PSUQNUM
 | 
|---|
| 34 |  N MAXLINE,LINECNT,MSGCNT,I,J,K,Z,LINETOT
 | 
|---|
| 35 |  S PSUVTMP(0)="TEMP ARRAY FOR PSUVIT1 PROCESSING"
 | 
|---|
| 36 |  D SETUP
 | 
|---|
| 37 |  D VITALS
 | 
|---|
| 38 |  D VITALS2
 | 
|---|
| 39 |  D IMMUNS
 | 
|---|
| 40 |  D MAILIT
 | 
|---|
| 41 |  Q          ;  **  end of routine control module **
 | 
|---|
| 42 |  ; 
 | 
|---|
| 43 | SETUP ; SET UP PARTITION FOR VITALS/IMMUNIZATION EXTRACT
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  S LINEMAX=$$VAL^PSUTL(4.3,1,8.3)       ; ** get maximum line length **
 | 
|---|
| 46 |  S:LINEMAX=""!(LINEMAX>10000) LINEMAX=10000
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  ; SET EXTRACT DATE
 | 
|---|
| 49 |  S %H=$H
 | 
|---|
| 50 |  D YMD^%DTC
 | 
|---|
| 51 |  S $P(^TMP("PSUVI",$J),U,3)=X
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ; GET TIME WINDOW
 | 
|---|
| 54 |  S SDATE=PSUSDT\1-.0001
 | 
|---|
| 55 |  S EDATE=PSUEDT\1+.2359
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ; GET FACILITY
 | 
|---|
| 58 |  S PSUFAC=PSUSNDR
 | 
|---|
| 59 |  ; 
 | 
|---|
| 60 |  ; SET VARIABLES
 | 
|---|
| 61 |  I $G(^XTMP("PSU_"_PSUJOB,"PSUPSUFLAG"))=1 D  ;AUTOJOBED
 | 
|---|
| 62 |  . S PSUOPTS="1,2,3,4,5,6,7,8,9,10,11,12,13"
 | 
|---|
| 63 |  . S PSUAUTO=1
 | 
|---|
| 64 |  S LINECNT=999999
 | 
|---|
| 65 |  S LINETOT=0
 | 
|---|
| 66 |  ;
 | 
|---|
| 67 |  Q                         ;  ** end of SETUP  **
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 | VITALS ; EXTRACT VITAL DATA
 | 
|---|
| 70 |  ; 
 | 
|---|
| 71 |  N PSUDATE,PSUV,PSUQ,PSUVREC,PSUPTREC,PSUPTPTR,PSUVPTR,PSUQPTR
 | 
|---|
| 72 |  N PSURTYPE,PSUSSN,PSUICN,PSUVTYPE,PSUVRATE,PSUVUNIT
 | 
|---|
| 73 |  N Z,QQ,PSUVQ1,PSUVQ2,PSUVQ3,PSUVQ4,PSUVLIST,PSUVMSG
 | 
|---|
| 74 |  N PSULN,PSUTXT
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 |  S PSUVLIST="""BLOOD PRESSURE"",""HEIGHT"",""WEIGHT"",""PAIN"",""PULSE"",""PULSE OXIMETRY"""
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ;                          ** Loop through date index for valid dates **
 | 
|---|
| 79 |  S PSUDATE=SDATE
 | 
|---|
| 80 |  ;PSU*4*11 Added null ptr notification.
 | 
|---|
| 81 |  S PSUTXT(1)="The following IEN(s) have a null pointer in the PATIENT (#2) field of"
 | 
|---|
| 82 |  S PSUTXT(2)="the GMRV VITAL MEASUREMENT file (#120.5).  Please notify your IRM and"
 | 
|---|
| 83 |  S PSUTXT(3)="submit a remedy ticket for help in evaluating the record."
 | 
|---|
| 84 |  S PSULN=3
 | 
|---|
| 85 |  F  S PSUDATE=$O(^GMR(120.5,"B",PSUDATE)) Q:PSUDATE>EDATE!('PSUDATE)  D
 | 
|---|
| 86 |  . S PSUV=""                      ; ** loop thru vitals for each date **
 | 
|---|
| 87 |  . F  S PSUV=$O(^GMR(120.5,"B",PSUDATE,PSUV)) Q:PSUV=""  D
 | 
|---|
| 88 |  .. Q:$P($D(^GMR(120.5,PSUV,2)),U)  ;** quit if vital entered in error **
 | 
|---|
| 89 |  .. S PSUVREC=$G(^GMR(120.5,PSUV,0)) Q:'PSUVREC
 | 
|---|
| 90 |  .. S PSUPTPTR=$P(PSUVREC,U,2)    ; ** point to PATIENT **
 | 
|---|
| 91 |  .. I PSUPTPTR="" D  Q            ; ** quit if no patient pointer **
 | 
|---|
| 92 |  ... S PSULN=PSULN+1
 | 
|---|
| 93 |  ... S PSUTXT(PSULN)=PSUV
 | 
|---|
| 94 |  .. Q:$G(^DPT(PSUPTPTR,0))=""     ; ** quit if no patient record **
 | 
|---|
| 95 |  .. S PSUPTREC=^DPT(PSUPTPTR,0)   ; ** get patient record **
 | 
|---|
| 96 |  .. S PSUSSN=$P(PSUPTREC,U,9)     ; ** get SSN
 | 
|---|
| 97 |  .. Q:$E(PSUSSN,1,5)="00000"      ; ** quit if invalid patient **
 | 
|---|
| 98 |  .. Q:$P(PSUPTREC,U,21)=1
 | 
|---|
| 99 |  .. Q:$P(PSUVREC,U,3)=""          ; ** quit if no pointer **
 | 
|---|
| 100 |  .. S PSUVPTR=$P(PSUVREC,U,3)     ; ** point to VITAL  **
 | 
|---|
| 101 |  .. S PSUVTYPE=$P(^GMRD(120.51,PSUVPTR,0),U)  ; ** get VITAL TYPE **
 | 
|---|
| 102 |  .. Q:PSUVLIST'[PSUVTYPE         ; ** screen out invalid vital types **
 | 
|---|
| 103 |  .. S PSURTYPE="V"                ; ** set record type **
 | 
|---|
| 104 |  .. S PSUICN=$$GETICN^MPIF001(PSUPTPTR)  ; ** get ICN **
 | 
|---|
| 105 |  .. I $P(PSUICN,U)="-1" S PSUICN=""
 | 
|---|
| 106 |  .. S PSUVRATE=$P(PSUVREC,U,8)
 | 
|---|
| 107 |  .. S PSUVUNIT=""                 ; ** set vital unit rate **
 | 
|---|
| 108 |  .. S:PSUVTYPE="PULSE OXIMETRY" PSUVUNIT="%"
 | 
|---|
| 109 |  .. S:PSUVTYPE="WEIGHT" PSUVUNIT="LBS"
 | 
|---|
| 110 |  .. S:PSUVTYPE="HEIGHT" PSUVUNIT="IN"
 | 
|---|
| 111 |  .. S (PSUVQ1,PSUVQ2,PSUVQ3,PSUVQ4)=""
 | 
|---|
| 112 |  .. D:$D(^GMR(120.5,PSUV,5,0))    ; ** get qualifiers **
 | 
|---|
| 113 |  ... S (PSUQNUM,PSUQCNT)=0
 | 
|---|
| 114 |  ... F  S PSUQNUM=$O(^GMR(120.5,PSUV,5,PSUQNUM)) Q:'+PSUQNUM  D
 | 
|---|
| 115 |  .... S PSUQPTR=^GMR(120.5,PSUV,5,PSUQNUM,0)
 | 
|---|
| 116 |  .... S PSUQCNT=PSUQCNT+1
 | 
|---|
| 117 |  .... S QQ="PSUVQ"_PSUQCNT
 | 
|---|
| 118 |  .... S @QQ=$P(^GMRD(120.52,PSUQPTR,0),U)
 | 
|---|
| 119 |  .. S Z="$"
 | 
|---|
| 120 |  .. S PSUVMSG=Z_PSUFAC_Z_PSUDATE_Z_PSURTYPE_Z_PSUSSN_Z_PSUICN_Z_""_Z_PSUVTYPE_Z_PSUVRATE_Z_PSUVUNIT_Z_PSUVQ1_Z_PSUVQ2_Z_PSUVQ3_Z_PSUVQ4_Z
 | 
|---|
| 121 |  .. S PSUVMSG=$TR(PSUVMSG,"^","'")
 | 
|---|
| 122 |  .. S PSUVMSG=$TR(PSUVMSG,Z,U)
 | 
|---|
| 123 |  .. ; ** S PSUVTMP(PSUSSN,PSUVTYPE)=PSUVMSG
 | 
|---|
| 124 |  .. S ^XTMP("PSU_"_PSUJOB,"PSUVI","TMP",PSUSSN,PSUVTYPE)=PSUVMSG
 | 
|---|
| 125 |  ;PSU*4*11 Send null ptr notifications to PBM group.
 | 
|---|
| 126 |  I PSULN>3 D
 | 
|---|
| 127 |  . S XMTEXT="PSUTXT(",XMY("G.PSU PBM")=""
 | 
|---|
| 128 |  . S XMSUB="** PBM vitals extract detected null patient pointer(s) **"
 | 
|---|
| 129 |  . S XMDUZ="Pharmacy Benefits Management Package"
 | 
|---|
| 130 |  . N DIFROM D ^XMD
 | 
|---|
| 131 |  Q
 | 
|---|
| 132 |  ;               ** end of vital extract **
 | 
|---|
| 133 | VITALS2 ; LOAD SORTED ARRAY INTO ^XTMP
 | 
|---|
| 134 |  ;
 | 
|---|
| 135 |  N VPT,VPTV
 | 
|---|
| 136 |  S VPT=""
 | 
|---|
| 137 |  ; ** F  S VPT=$O(PSUVTMP(VPT)) Q:VPT=""  D
 | 
|---|
| 138 |  F  S VPT=$O(^XTMP("PSU_"_PSUJOB,"PSUVI","TMP",VPT)) Q:VPT=""  D
 | 
|---|
| 139 |  . S VPTV=""
 | 
|---|
| 140 |  . ; **F  S VPTV=$O(PSUVTMP(VPT,VPTV)) Q:VPTV=""  D
 | 
|---|
| 141 |  . F  S VPTV=$O(^XTMP("PSU_"_PSUJOB,"PSUVI","TMP",VPT,VPTV)) Q:VPTV=""  D
 | 
|---|
| 142 |  .. ; ** S X=PSUVTMP(VPT,VPT                     ; * LOAD VITAL RECORD
 | 
|---|
| 143 |  .. S X=^XTMP("PSU_"_PSUJOB,"PSUVI","TMP",VPT,VPTV)
 | 
|---|
| 144 |  .. S LINECNT=LINECNT+1
 | 
|---|
| 145 |  .. S LINETOT=LINETOT+1
 | 
|---|
| 146 |  .. I LINECNT>LINEMAX S MSGCNT=$G(MSGCNT)+1,LINECNT=1
 | 
|---|
| 147 |  .. I $L(X)<254 S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)=X Q  ; load
 | 
|---|
| 148 |  .. F J=254:-1 Q:$E(X,J)="^"
 | 
|---|
| 149 |  .. S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)=$E(X,1,J)
 | 
|---|
| 150 |  .. S LINECNT=LINECNT+1
 | 
|---|
| 151 |  .. S LINETOT=LINETOT+1
 | 
|---|
| 152 |  .. S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)="*"_$E(X,J,J+253)
 | 
|---|
| 153 |  Q
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 | IMMUNS ;
 | 
|---|
| 156 |  N PSUDATE,ICNT,PSUINUM,PSUIREC,PSUPTPTR,PSUPTREC,PSUSSN,PSUIMPTR
 | 
|---|
| 157 |  N PSUIMM,PSUICN,PSURTYPE,PSUIMSG
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 |  S (PSUMCNT,PSUINUM)=0
 | 
|---|
| 160 |  F  S PSUINUM=$O(^AUPNVIMM(PSUINUM)) Q:'PSUINUM  D
 | 
|---|
| 161 |  . S PSUIDATE=$P($G(^AUPNVIMM(PSUINUM,12)),"U")  ; ** get IMM date **
 | 
|---|
| 162 |  . Q:$P(PSUIDATE,U)=""               ; ** quit if date is null **
 | 
|---|
| 163 |  . Q:PSUIDATE<SDATE!(PSUIDATE>EDATE)  ; ** quit if date out of range **
 | 
|---|
| 164 |  . S PSUIREC=^AUPNVIMM(PSUINUM,0)    ; ** get IMM record **
 | 
|---|
| 165 |  . S PSUPTPTR=$P(PSUIREC,U,2)        ; ** pointer to PAT file **
 | 
|---|
| 166 |  . S PSUPTREC=^DPT(PSUPTPTR,0)       ; ** get patient record **
 | 
|---|
| 167 |  . S PSUSSN=$P(PSUPTREC,U,9)
 | 
|---|
| 168 |  . Q:$E(PSUSSN,1,5)="00000"          ; ** quit if invalid patient **
 | 
|---|
| 169 |  . I $P(PSUPTREC,U,21)=1 Q
 | 
|---|
| 170 |  . S PSUIMPTR=$P(PSUIREC,U)         ; ** point to IMM file **
 | 
|---|
| 171 |  . S PSUIMM=$P(^AUTTIMM(PSUIMPTR,0),U)  ; ** get IMM name **
 | 
|---|
| 172 |  . S PSUICN=$$GETICN^MPIF001(PSUPTPTR)  ; ** set ICN **
 | 
|---|
| 173 |  . I $P(PSUICN,U)="-1" S PSUICN=""
 | 
|---|
| 174 |  . S PSURTYPE="I"                    ; ** set record type **
 | 
|---|
| 175 |  . S Z="$"
 | 
|---|
| 176 |  . S PSUIMSG=Z_PSUFAC_Z_PSUIDATE_Z_PSURTYPE_Z_PSUSSN_Z_PSUICN_Z_PSUIMM_Z_""_Z_""_Z_""_Z_""_Z_""_Z_""_Z_""_Z_""_Z
 | 
|---|
| 177 |  . S PSUIMSG=$TR(PSUIMSG,"^","'")
 | 
|---|
| 178 |  . S X=$TR(PSUIMSG,Z,U)
 | 
|---|
| 179 |  . ;   *** load ^XTMP  ***
 | 
|---|
| 180 |  . S LINECNT=LINECNT+1
 | 
|---|
| 181 |  . S LINETOT=LINETOT+1
 | 
|---|
| 182 |  . I LINECNT>LINEMAX S MSGCNT=$G(MSGCNT)+1,LINECNT=1
 | 
|---|
| 183 |  . I $L(X)<254 S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)=X Q  ; load
 | 
|---|
| 184 |  . F K=254:-1 Q:$E(X,K)="^"
 | 
|---|
| 185 |  . S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)=$E(X,1,K)
 | 
|---|
| 186 |  . S LINECNT=LINECNT+1
 | 
|---|
| 187 |  . S LINETOT=LINETOT+1
 | 
|---|
| 188 |  . S ^XTMP("PSU_"_PSUJOB,"PSUVI",MSGCNT,LINECNT)="*"_$E(X,K,K+253)
 | 
|---|
| 189 |  ;                                           *** save message count  ***
 | 
|---|
| 190 |  S:$G(MSGCNT) ^XTMP("PSU_"_PSUJOB,"PSUVI","MSGTCNT")=MSGCNT
 | 
|---|
| 191 |  S ^XTMP("PSU_"_PSUJOB,"PSUVI","LINECNT")=LINETOT
 | 
|---|
| 192 |  Q                                                ; ** quit IMMUNS **
 | 
|---|
| 193 |  ;
 | 
|---|
| 194 | MAILIT ; MAIL VITAL & IMMUNIZATION EXTRACT MESSAGES
 | 
|---|
| 195 |  ;
 | 
|---|
| 196 |  D ^PSUVIT2
 | 
|---|
| 197 |  Q                         ;  **  quit for MAILIT  **
 | 
|---|
| 198 |  ;
 | 
|---|