| [613] | 1 | PSOTPHL1 ;BPFO/EL-CREATE HL7 BATCH MESSAGE FILE ;09/10/03
 | 
|---|
 | 2 |  ;;7.0;OUTPATIENT PHARMACY;**146,153,227**;DEC 1997
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  ; Summary:
 | 
|---|
 | 5 |  ; Use of ^VAFCQRY API is approved under private IA #3630
 | 
|---|
 | 6 |  ; For initial run, makes sure the "Transmission End Date" (#46.2) in 
 | 
|---|
 | 7 |  ;    File 59.7 - Pharmacy System File is null.
 | 
|---|
 | 8 |  ; If field (#46.2) is null, the system will pick up all DFN in File 52.91 
 | 
|---|
 | 9 |  ;    from the first date of file creation to the "RunDate"-1.
 | 
|---|
 | 10 |  ; If field (#46.2) has a date, the system will pick up DFN starting 
 | 
|---|
 | 11 |  ;    from the last "Transmission End Date"+1 to the "RunDate"-1.
 | 
|---|
 | 12 |  ; This program only runs on Sunday.  RunTime will be 6pm.
 | 
|---|
 | 13 |  ; Tab: EN^PSOTPHL1(RDT,EDT,.SDT) is the ad-hoc entry point if user 
 | 
|---|
 | 14 |  ;    wants to run it at certain "Transmission Begin Date", 
 | 
|---|
 | 15 |  ;    "Transmission End Date", & return actual "Transmission Begin Date".       
 | 
|---|
 | 16 |  ; If run is success, an audit node will be placed at File 59.7 as:
 | 
|---|
 | 17 |  ;    ^PS(59.7,D0,46)=TransmissionStartDt_"^"_TransmissionEndDt_"^"_MshID_"^"_MshCnt_"^"_LineCnt
 | 
|---|
 | 18 |  ;
 | 
|---|
 | 19 |  ; At the end of each run, this program will send out mail to the mail
 | 
|---|
 | 20 |  ;   group "PSO TPB HL7 EXTRACT" except the non-Sunday TaskMan check
 | 
|---|
 | 21 |  ;
 | 
|---|
 | 22 |  Q  ; placed out of order by PSO*7*227
 | 
|---|
 | 23 |  N A,B,C,CK,EDT,ERR,FRTIME,I,L,R,RDT,SDT,SET,X
 | 
|---|
 | 24 |  N BCNT,DATA,DFN,EVENT,LN,MCNT,PGM,PS,PSO
 | 
|---|
 | 25 |  N BBDT,BEDT,DADT,EXC,INS,PADT,PN,REASON,STA,WAITYP
 | 
|---|
 | 26 |  ;
 | 
|---|
 | 27 | START S CK=0 D DATE I CK=1 G ENDS
 | 
|---|
 | 28 |  ;  
 | 
|---|
 | 29 |  D EN^PSOTPHL1(RDT,EDT,.SDT)
 | 
|---|
 | 30 |  Q
 | 
|---|
 | 31 |  ;
 | 
|---|
 | 32 | DATE ; Check if first time run or Sunday
 | 
|---|
 | 33 |  S (EDT,FRTIME,PS,SET)=0,PS=59.7
 | 
|---|
 | 34 |  S EDT=$$GET1^DIQ(PS,"1,46",46.2,"I"),EDT=+EDT
 | 
|---|
 | 35 |  D NOW^%DTC
 | 
|---|
 | 36 |  D DW^%DTC
 | 
|---|
 | 37 |  I EDT'>0 S FRTIME=1 G GDATE
 | 
|---|
 | 38 |  I X'["SUN" S CK=1 Q
 | 
|---|
 | 39 |  ;
 | 
|---|
 | 40 |  S SDT=EDT+1
 | 
|---|
 | 41 | GDATE S RDT="",SET=1
 | 
|---|
 | 42 |  S RDT=$S(EDT:EDT,1:0)
 | 
|---|
 | 43 |  S EDT=DT-1
 | 
|---|
 | 44 |  Q
 | 
|---|
 | 45 |  ;
 | 
|---|
 | 46 | INIT ; Variable Initialization
 | 
|---|
 | 47 |  S (BCNT,LN,MCNT,CK)=0
 | 
|---|
 | 48 |  S PGM="PSOTPHL1"
 | 
|---|
 | 49 |  S PSO=52.91
 | 
|---|
 | 50 |  D INHL7
 | 
|---|
 | 51 |  ;
 | 
|---|
 | 52 |  K ^TMP("HLS",$J),^TMP(PGM,$J,EDT)
 | 
|---|
 | 53 |  ;
 | 
|---|
 | 54 |  Q
 | 
|---|
 | 55 |  ;
 | 
|---|
 | 56 | INHL7 S EVENT="PSO TPB EV"
 | 
|---|
 | 57 |  I '$D(U) S U="^"
 | 
|---|
 | 58 |  D INIT^HLFNC2(EVENT,.HL)
 | 
|---|
 | 59 |  I $G(HL) S ERR=$P(HL,"^",2),CK=1 Q
 | 
|---|
 | 60 |  D CREATE^HLTF(.HLMID,.HLDA,.HLDT,.HLDT1)
 | 
|---|
 | 61 |  D INHD
 | 
|---|
 | 62 |  Q
 | 
|---|
 | 63 |  ;
 | 
|---|
 | 64 | INHD I '$D(DTIME) S DTIME=0
 | 
|---|
 | 65 |  I '$D(HL("DTM")) S HL("DTM")=HLDT1
 | 
|---|
 | 66 |  I '$D(HL("FS")) S HL("FS")="^"
 | 
|---|
 | 67 |  I '$D(HL("ECH")) S HL("ECH")="~|\&"
 | 
|---|
 | 68 |  I '$D(HL("ETN")) S HL("ETN")="S12"
 | 
|---|
 | 69 |  I '$D(HL("MTN")) S HL("MTN")="SIU"
 | 
|---|
 | 70 |  I '$D(HL("MTN_ETN")) S HL("MTN_ETN")="SIU_S12"
 | 
|---|
 | 71 |  I '$D(HL("PID")) S HL("PID")="P"
 | 
|---|
 | 72 |  I '$D(HL("Q")) S HL("Q")=""""
 | 
|---|
 | 73 |  I '$D(HL("VER")) S HL("VER")="2.4"
 | 
|---|
 | 74 |  I '$D(HL("CC")) S HL("CC")="US"
 | 
|---|
 | 75 |  I '$D(HL("ACAT")) S HL("ACAT")="AL"
 | 
|---|
 | 76 |  I '$D(HL("APAT")) S HL("APAT")="NE"
 | 
|---|
 | 77 |  I '$D(HL("SAN")) S HL("SAN")="PSO TPB-PHARM"
 | 
|---|
 | 78 |  I '$D(HL("RAN")) S HL("RAN")="PSO TPB-ACC"
 | 
|---|
 | 79 |  ;
 | 
|---|
 | 80 |  Q
 | 
|---|
 | 81 |  ;
 | 
|---|
 | 82 | BHS ; CREATE "BHS" SEGMENT
 | 
|---|
 | 83 |  S BCNT=BCNT+1
 | 
|---|
 | 84 |  S LN=LN+1
 | 
|---|
 | 85 |  ;
 | 
|---|
 | 86 |  Q
 | 
|---|
 | 87 |  ;
 | 
|---|
 | 88 | EN(RDT,EDT,SDT) ; ENTRY POINT FOR PROCESS
 | 
|---|
 | 89 |  D INIT I CK=1 G OUT
 | 
|---|
 | 90 |  D BHS
 | 
|---|
 | 91 |  D PROCESS
 | 
|---|
 | 92 |  D BTS
 | 
|---|
 | 93 |  G OUT
 | 
|---|
 | 94 |  ;
 | 
|---|
 | 95 | PROCESS ; Sort and Process the message body
 | 
|---|
 | 96 |  I '$D(SET) S SDT=RDT,RDT=RDT-1
 | 
|---|
 | 97 |  I $G(FRTIME)=1 D FRTIME
 | 
|---|
 | 98 | P10 S RDT=$O(^PS(PSO,"AX",RDT)) G P30:(RDT>EDT)!(RDT="")
 | 
|---|
 | 99 |  I SDT>RDT S SDT=RDT
 | 
|---|
 | 100 |  S DFN=""
 | 
|---|
 | 101 | P20 S DFN=$O(^PS(PSO,"AX",RDT,DFN)) G P10:DFN=""
 | 
|---|
 | 102 |  I '$D(^PS(PSO,DFN,0)) K ^PS(PSO,"AX",RDT,DFN) G P20
 | 
|---|
 | 103 |  S ^TMP(PGM,$J,EDT,"ZZ",DFN)=RDT
 | 
|---|
 | 104 |  G P20
 | 
|---|
 | 105 |  ;
 | 
|---|
 | 106 | FRTIME ; To generate a complete data set for the frist time 
 | 
|---|
 | 107 |  S (DFN,RDT,X)=""
 | 
|---|
 | 108 |  S SDT=999999999
 | 
|---|
 | 109 | F10 S DFN=$O(^PS(PSO,DFN)) Q:(DFN'?1N.N)!(DFN="")
 | 
|---|
 | 110 |  I '$D(^PS(PSO,DFN,0)) G F10
 | 
|---|
 | 111 |  S X=$P(^PS(PSO,DFN,0),"^",2)
 | 
|---|
 | 112 |  I SDT>X S SDT=X
 | 
|---|
 | 113 |  S ^TMP(PGM,$J,EDT,"ZZ",DFN)=X
 | 
|---|
 | 114 |  G F10
 | 
|---|
 | 115 |  ;
 | 
|---|
 | 116 | P30 I '$D(^TMP(PGM,$J,EDT,"ZZ")) D  G GEN
 | 
|---|
 | 117 |  .  S MCNT=0
 | 
|---|
 | 118 |  .  D MSH^HLFNC2(.HL,HLMID_"-"_MCNT,.X,"")
 | 
|---|
 | 119 |  .  D WRITE
 | 
|---|
 | 120 |  ;
 | 
|---|
 | 121 |  S DFN=""
 | 
|---|
 | 122 | DFN S DFN=$O(^TMP(PGM,$J,EDT,"ZZ",DFN)) G GEN:DFN=""
 | 
|---|
 | 123 |  S RDT=^TMP(PGM,$J,EDT,"ZZ",DFN)
 | 
|---|
 | 124 |  D EXTRACT
 | 
|---|
 | 125 |  D MSH
 | 
|---|
 | 126 |  D SCH
 | 
|---|
 | 127 |  D PID
 | 
|---|
 | 128 |  G DFN
 | 
|---|
 | 129 |  ;
 | 
|---|
 | 130 | GEN S HLP="" D GENERATE^HLMA(EVENT,"GB",1,.R,HLDA,.HLP)
 | 
|---|
 | 131 |  Q
 | 
|---|
 | 132 |  ;
 | 
|---|
 | 133 | EXTRACT ; Extract data from File 52.91
 | 
|---|
 | 134 |  S (A,B,BBDT,BEDT,C,DADT,DATA,EXC,INS,PADT,PN,REASON,STA,WAITYP,X)=""
 | 
|---|
 | 135 |  S X=^PS(PSO,DFN,0)
 | 
|---|
 | 136 |  S DATA="PN,BBDT,BEDT,REASON,DADT,WAITYP,STA,INS,EXC,PADT"
 | 
|---|
 | 137 |  F I=1:1:10 S @$P(DATA,",",I)=$P(X,"^",I)
 | 
|---|
 | 138 |  I $D(PADT) S PADT=$P(PADT,".")
 | 
|---|
 | 139 |  I +BBDT=+RDT S HL("ETN")="S12"
 | 
|---|
 | 140 |  E  S HL("ETN")="S14"
 | 
|---|
 | 141 |  S HL("MTN_ETN")=HL("MTN")_"_"_HL("ETN")
 | 
|---|
 | 142 |  S A="BBDT,BEDT,DADT,PADT"
 | 
|---|
 | 143 |  F I=1:1:4 S B=$P(A,",",I) I $G(@B)>0 S C=$$HLDATE^HLFNC(@B,"DT"),@$P(A,",",I)=C
 | 
|---|
 | 144 |  Q
 | 
|---|
 | 145 |  ;
 | 
|---|
 | 146 | MSH ; CREATE "MSH" SEGMENT
 | 
|---|
 | 147 |  S MCNT=MCNT+1
 | 
|---|
 | 148 |  D MSH^HLFNC2(.HL,HLMID_"-"_MCNT,.X,"")
 | 
|---|
 | 149 |  ;
 | 
|---|
 | 150 |  D WRITE
 | 
|---|
 | 151 |  Q
 | 
|---|
 | 152 |  ;
 | 
|---|
 | 153 | SCH ; CREATE "SCH" SEGMENT
 | 
|---|
 | 154 |  K SCH S (X,A,B,C)="",I=0 S:REASON>9 REASON=9
 | 
|---|
 | 155 |  S X="Seen by VA Provider,No/Show/Cancellation,Patient Ended"
 | 
|---|
 | 156 |  S X=X_",Non-Formulary Rx not accepted,Patient Expired,All Rx's Inactive"
 | 
|---|
 | 157 |  S X=X_",Exclusion,Patient Refused Appointment,Patient Unreachable"
 | 
|---|
 | 158 |  S A=$P(X,",",REASON)
 | 
|---|
 | 159 |  ;
 | 
|---|
 | 160 |  S X="" S:EXC>3 EXC=3
 | 
|---|
 | 161 |  S X="Excluded due to active Rx#"
 | 
|---|
 | 162 |  S X=X_",Excluded due to actual appt<30 days from desired appt date"
 | 
|---|
 | 163 |  S X=X_",Exclued due to active Rx# and actual appt<30 days from desired appt date"
 | 
|---|
 | 164 |  S B=$P(X,",",EXC)
 | 
|---|
 | 165 |  ;
 | 
|---|
 | 166 |  I WAITYP="E" S C="EWL"
 | 
|---|
 | 167 |  E  I WAITYP="M" S C="Manual"
 | 
|---|
 | 168 |  E  I WAITYP="S" S C="Schedule"
 | 
|---|
 | 169 |  E  S C="S\T\E"
 | 
|---|
 | 170 |  ;
 | 
|---|
 | 171 |  S X=""
 | 
|---|
 | 172 |  S X=HL("FS")_HL("FS")_HL("FS")_HL("FS")_HL("FS")_HL("FS")_REASON_"~"_A
 | 
|---|
 | 173 |  S X=X_HL("FS")_EXC_"~"_B_HL("FS")_WAITYP_"~"_C
 | 
|---|
 | 174 |  S X=X_HL("FS")_HL("FS")_HL("FS")
 | 
|---|
 | 175 |  S I=I+1,SCH(I)="SCH"_X
 | 
|---|
 | 176 |  ;
 | 
|---|
 | 177 |  S X="",X=X_"~~~"_DADT_"~~~~Desired Appointment Date|~~~"
 | 
|---|
 | 178 |  S X=X_PADT_"~~~~Primary Care Scheduled Appointment Date|~~~"
 | 
|---|
 | 179 |  S X=X_BBDT_"~~~~Date Pharmacy Benefit Began|~~~"
 | 
|---|
 | 180 |  S X=X_BEDT_"~~~~Inactivation of Benefit Date|~~~"
 | 
|---|
 | 181 |  S X=X_$$HLDATE^HLFNC(RDT,"DT")_"~~~~Record Change Date"
 | 
|---|
 | 182 |  I $L(SCH(I)_X)<246 S SCH(I)=SCH(I)_X
 | 
|---|
 | 183 |  E  S I=I+1,SCH(I)=X
 | 
|---|
 | 184 |  ;
 | 
|---|
 | 185 |  S X="",$P(X,"^",12)=STA_"~~~"_INS_"&"_$$GET1^DIQ(4,INS_",0",.01)
 | 
|---|
 | 186 |  I $L(SCH(I)_X)<246 S SCH(I)=SCH(I)_X
 | 
|---|
 | 187 |  E  S I=I+1,SCH(I)=X
 | 
|---|
 | 188 |  ;
 | 
|---|
 | 189 |  F I=1:1 S X=$G(SCH(I)) Q:X=""  D
 | 
|---|
 | 190 |  . I I=1 D WRITE
 | 
|---|
 | 191 |  . E  D WRITEN
 | 
|---|
 | 192 |  Q
 | 
|---|
 | 193 |  ;
 | 
|---|
 | 194 | PID ; CREATE "PID" SEGMENT
 | 
|---|
 | 195 |  K PID
 | 
|---|
 | 196 |  D DEM^VADPT,ADD^VADPT
 | 
|---|
 | 197 |  D BLDPID^PSOTPHL2(DFN,1,.PID,.HL,.ERR)
 | 
|---|
 | 198 |  Q:$G(PID(1))=""
 | 
|---|
 | 199 |  S X=""
 | 
|---|
 | 200 |  F I=1:1 S X=$G(PID(I)) Q:X=""  D
 | 
|---|
 | 201 |  . I I=1 D WRITE
 | 
|---|
 | 202 |  . E  D WRITEN
 | 
|---|
 | 203 |  Q
 | 
|---|
 | 204 |  ;
 | 
|---|
 | 205 | BTS ; CREATE "BTS" SEGMENT
 | 
|---|
 | 206 |  S LN=LN+1
 | 
|---|
 | 207 |  Q
 | 
|---|
 | 208 |  ;
 | 
|---|
 | 209 | WRITE ; Write single line
 | 
|---|
 | 210 |  S LN=LN+1
 | 
|---|
 | 211 |  S ^TMP("HLS",$J,LN)=X
 | 
|---|
 | 212 |  Q
 | 
|---|
 | 213 |  ;
 | 
|---|
 | 214 | WRITEN ; Write multiple lines
 | 
|---|
 | 215 |  S ^TMP("HLS",$J,LN,I-1)=X
 | 
|---|
 | 216 |  Q
 | 
|---|
 | 217 |  ;
 | 
|---|
 | 218 | CLEANUP ; Clean up variables
 | 
|---|
 | 219 |  K A,B,C,CK,EDT,ERR,I,L,R,RDT,SDT,X
 | 
|---|
 | 220 |  K BCNT,DATA,DFN,EVENT,LN,MCNT,PGM,PS,PSO
 | 
|---|
 | 221 |  K BBDT,BEDT,DADT,EXC,INS,PADT,PN,REASON,STA,WAITYP
 | 
|---|
 | 222 |  Q
 | 
|---|
 | 223 |  ;
 | 
|---|
 | 224 | OUT ; End of compilation
 | 
|---|
 | 225 |  I CK=1 G END
 | 
|---|
 | 226 |  K ^TMP("HLS",$J),^TMP(PGM,$J,EDT),PID,SCH
 | 
|---|
 | 227 |  I SDT>EDT S SDT=EDT
 | 
|---|
 | 228 |  I $G(SET)=1 S ^PS(PS,1,46)=SDT_"^"_EDT_"^"_HLDA_"^"_MCNT_"^"_LN
 | 
|---|
 | 229 |  ;
 | 
|---|
 | 230 | END D MAIL
 | 
|---|
 | 231 |  I $G(SET)'=1 D CLEANUP
 | 
|---|
 | 232 | ENDS I $G(FRTIME)=1 D RESET
 | 
|---|
 | 233 |  S:$D(ZTQUEUED) ZTREQ="@"
 | 
|---|
 | 234 |  Q
 | 
|---|
 | 235 |  ;
 | 
|---|
 | 236 | RESET ; Reset to run tomorrow
 | 
|---|
 | 237 |  D RESCH^XUTMOPT("PSO TPB HL7 EXTRACT","T+1@18:00","","24H","L")
 | 
|---|
 | 238 |  Q
 | 
|---|
 | 239 |  ;
 | 
|---|
 | 240 | RESET1 ; Reset to run tomorrow
 | 
|---|
 | 241 |  D RESET,EDIT^XUTMOPT("PSO TPB HL7 EXTRACT")
 | 
|---|
 | 242 |  Q
 | 
|---|
 | 243 |  ;
 | 
|---|
 | 244 | MAIL ;Send mail message
 | 
|---|
 | 245 |  I '$G(DUZ) Q
 | 
|---|
 | 246 |  K PSOTTEXT,XMY S (XMDUZ,XMSUB,XMTEST,A,B,C,I,L,R,X)=""
 | 
|---|
 | 247 |  S C="G.PSO TPB HL7 EXTRACT"
 | 
|---|
 | 248 |  S XMY(C)=""
 | 
|---|
 | 249 |  S PSOTTEXT(1)="SENT TO: "_C
 | 
|---|
 | 250 |  S XMDUZ="PSO TPB HL7 EXTRACT"
 | 
|---|
 | 251 |  S (A,B)=""
 | 
|---|
 | 252 |  I '$D(SET) S A="Ad-Hoc"
 | 
|---|
 | 253 |  E  S A=$S(($G(FRTIME)=1):"first-time",1:"weekly")
 | 
|---|
 | 254 |  S B=$S(($G(CK)=1):"unsuccessful",1:"successful")
 | 
|---|
 | 255 |  S XMSUB="PSO TPB HL7 "_A_" update ** "_B_" **"
 | 
|---|
 | 256 |  S A=XMSUB
 | 
|---|
 | 257 |  I $G(CK)=1 D FAIL
 | 
|---|
 | 258 |  E  D SUCC
 | 
|---|
 | 259 |  S PSOTTEXT(2)=" "
 | 
|---|
 | 260 |  S PSOTTEXT(3)="The weekly generation of the HL7 Message of"
 | 
|---|
 | 261 |  S PSOTTEXT(3.2)="TPB Patient Information was "_B
 | 
|---|
 | 262 |  S PSOTTEXT(4)=""
 | 
|---|
 | 263 |  S PSOTTEXT(5)=I
 | 
|---|
 | 264 |  S PSOTTEXT(6)=L
 | 
|---|
 | 265 |  S PSOTTEXT(6.2)=R
 | 
|---|
 | 266 |  S PSOTTEXT(6.4)=X
 | 
|---|
 | 267 |  S PSOTTEXT(7)=" "
 | 
|---|
 | 268 |  D NOW^%DTC S Y=% X ^DD("DD") S PSOTTEXT(8)="The job ended at "_$G(Y)
 | 
|---|
 | 269 |  S PSOTTEXT(9)=" "
 | 
|---|
 | 270 |  S XMTEXT="PSOTTEXT(" N DIFROM D ^XMD
 | 
|---|
 | 271 |  I $D(XMMG),(XMMG["Error =") D
 | 
|---|
 | 272 |  .  K XMY(C)
 | 
|---|
 | 273 |  .  S XMSUB=A,XMY(DUZ)="",PSOTTEXT(1)=PSOTTEXT(1)_"   ("_XMMG_")",XMMG=""
 | 
|---|
 | 274 |  .  S XMTEXT="PSOTTEXT(" D ^XMD
 | 
|---|
 | 275 |  K PSOTTEXT,XMDUZ,XMSUB,XMTEXT,XMY
 | 
|---|
 | 276 |  Q
 | 
|---|
 | 277 | FAIL ; Msg for unsuccessful run
 | 
|---|
 | 278 |  S I="Reason: "_$S(($D(ERR)):ERR,1:"Check Event Server Protocol OR the run date")
 | 
|---|
 | 279 |  S L=" "
 | 
|---|
 | 280 |  S R="Please contact National Help Desk @888-596-4357"
 | 
|---|
 | 281 |  S X=" "
 | 
|---|
 | 282 |  Q
 | 
|---|
 | 283 |  ;
 | 
|---|
 | 284 | SUCC ; Msg for successful run
 | 
|---|
 | 285 |  S I="Please check the PSOTPBAAC HL7 Logical Link to ensure"
 | 
|---|
 | 286 |  S L="successful transmission to the Austin Automation Center."
 | 
|---|
 | 287 |  S R=" "
 | 
|---|
 | 288 |  S X="MSH-ID: "_HLDA
 | 
|---|
 | 289 |  Q
 | 
|---|
 | 290 |  ;
 | 
|---|