| 1 | ALPBINP ;OIFO-DALLAS/SED/KC/MW  BCMA - BCBU INPT TO HL7 ;5/2/2002 | 
|---|
| 2 | ;;3.0;BAR CODE MED ADMIN;**8,37**;May 2007;Build 10 | 
|---|
| 3 | ;;Per VHA Directive 2004-038, this routine should not be modified. | 
|---|
| 4 | ;This routine will intercept the HL7 message that it sent from Pharmacy | 
|---|
| 5 | ;to CPRS to update order information. The message is then parsed and | 
|---|
| 6 | ;repackage so it can be sent to the BCBU workstation. | 
|---|
| 7 | ; | 
|---|
| 8 | ; Reference/IA | 
|---|
| 9 | ; EN^PSJBCBU/3876 | 
|---|
| 10 | ; $$EN^VAFHLPID/263 | 
|---|
| 11 | ; $$EN^VAFHAPV1/4512 | 
|---|
| 12 | ; EN1^GMRADPT/10099 | 
|---|
| 13 | ; EN^PSJBCMA1/2829 | 
|---|
| 14 | ; | 
|---|
| 15 | IPH(MSG) ;CAPTURE MESSAGE ARRAY FROM PHARMACY | 
|---|
| 16 | N VAIN,ALPMSG | 
|---|
| 17 | S ALPMSG=$S($L($G(MSG)):MSG,1:"MSG") | 
|---|
| 18 | I '$O(@ALPMSG@(0)) Q "0^MSG^Missing Message Array" | 
|---|
| 19 | S MSH=0 | 
|---|
| 20 | F  S MSH=$O(@ALPMSG@(MSH)) Q:MSH'>0  Q:$E(@ALPMSG@(MSH),1,3)="MSH" | 
|---|
| 21 | I +MSH'>0 Q "0^MSG^Missing MSH Segment Bad Message" | 
|---|
| 22 | S MSFS=$E(@ALPMSG@(MSH),4,4) | 
|---|
| 23 | S MSCS=$E(@ALPMSG@(MSH),5,5) | 
|---|
| 24 | S MSCH=$E(@ALPMSG@(MSH),6,6) | 
|---|
| 25 | S MSCTR=$E(@ALPMSG@(MSH),4,8) | 
|---|
| 26 | ;The message is confirmed to be a Pharmacy message | 
|---|
| 27 | I $P(@ALPMSG@(MSH),MSFS,3)'="PHARMACY" Q "1^^Not a Pharmacy Message" | 
|---|
| 28 | ;A PID and PV1 segment is required for this message | 
|---|
| 29 | S PID=0 | 
|---|
| 30 | F  S PID=$O(@ALPMSG@(PID)) Q:PID'>0  Q:$E(@ALPMSG@(PID),1,3)="PID" | 
|---|
| 31 | I +PID'>0 Q "0^MSG^Missing PID Segment Bad Message" | 
|---|
| 32 | ;Also the patient must have an inpatient status | 
|---|
| 33 | S PV1=0 | 
|---|
| 34 | F  S PV1=$O(@ALPMSG@(PV1)) Q:PV1'>0  Q:$E(@ALPMSG@(PV1),1,3)="PV1" | 
|---|
| 35 | I +PV1'>0 Q "0^MSG^Missing PV1 Segment Bad Message" | 
|---|
| 36 | I $P(@ALPMSG@(PV1),MSFS,3)'="I" Q "1^^Not an Inpatient Pharmacy Message" | 
|---|
| 37 | S ORC=0 | 
|---|
| 38 | F  S ORC=$O(@ALPMSG@(ORC)) Q:ORC'>0  Q:$E(@ALPMSG@(ORC),1,3)="ORC" | 
|---|
| 39 | I +ORC'>0 Q "0^MSG^Missing ORC Segment Bad Message" | 
|---|
| 40 | ;RE-BUILDING THE MESSAGE FOR BCBU | 
|---|
| 41 | S ALPDFN=$P(@ALPMSG@(PID),MSFS,4) | 
|---|
| 42 | I +ALPDFN'>0 Q "0^MSG^Invalid or Missing Patient - PID" | 
|---|
| 43 | S ALPORD=$P($P(@ALPMSG@(ORC),MSFS,4),MSCS,1) | 
|---|
| 44 | I ALPORD="" Q "0^MSG^Invalid or Missing Order Number - ORC" | 
|---|
| 45 | K ALPB | 
|---|
| 46 | D EN^PSJBCBU(ALPDFN,ALPORD,.ALPB) | 
|---|
| 47 | SEED ;Entry point for ^ALPBIND | 
|---|
| 48 | N VAIN | 
|---|
| 49 | D INIT | 
|---|
| 50 | S SUB=0 F  S SUB=$O(ALPB(SUB)) Q:'SUB  D | 
|---|
| 51 | . ;convert and move the message to the HLA array for transport | 
|---|
| 52 | . S HLA("HLS",SUB)=$$CNV^ALPBUTL1(MSCTR,HLCTR,ALPB(SUB)) | 
|---|
| 53 | . ;Now check for continuations | 
|---|
| 54 | . S SUB1=0 | 
|---|
| 55 | . F  S SUB1=$O(ALPB(SUB,SUB1)) Q:'SUB1  D | 
|---|
| 56 | . . S HLA("HLS",SUB,SUB1)=$$CNV^ALPBUTL1(MSCTR,HLCTR,ALPB(SUB,SUB1)) | 
|---|
| 57 | . I $E(HLA("HLS",SUB),1,3)="RXE" S RXE=SUB | 
|---|
| 58 | . I $E(HLA("HLS",SUB),1,3)="PID" S PID=SUB | 
|---|
| 59 | . I $E(HLA("HLS",SUB),1,3)="PV1" S PV1=SUB | 
|---|
| 60 | K HLA("HLS",MSH) | 
|---|
| 61 | I '$D(HLA("HLS",PID)) Q "0^MSG^Missing PID Segment Bad Message" | 
|---|
| 62 | S ALPDFN=$P($P(HLA("HLS",PID),HLFS,4),HLCS,1) | 
|---|
| 63 | I +ALPDFN'>0 Q "0^MSG^Invalid or Missing Patient - PID" | 
|---|
| 64 | S HLA("HLS",PID)=$$EN^VAFHLPID(ALPDFN,"2,7,8,19") | 
|---|
| 65 | ;Fix RXE segement for Administration Type | 
|---|
| 66 | D RXE | 
|---|
| 67 | ;Get the Division that the patient is associated with | 
|---|
| 68 | D PDIV | 
|---|
| 69 | I ALPDIV="DOM",+$$GET^XPAR("PKG.BAR CODE MED ADMIN","PSB BKUP DOM FILTER",1,"Q")>0 Q "0^^Screen of DOMICILIARY" | 
|---|
| 70 | I '$D(HLL("LINKS")) Q "0^HL7^Missing HLL Links Array Division # "_ALPDIV | 
|---|
| 71 | ;SET NEW PV1 | 
|---|
| 72 | D NOW^%DTC | 
|---|
| 73 | S STRING=$$EN^VAFHAPV1(ALPDFN,%,"2,3,7,18") | 
|---|
| 74 | S HLA("HLS",PV1)=STRING | 
|---|
| 75 | I +ORC>0 D | 
|---|
| 76 | . S ALPST=$$STAT^ALPBUTL1($P(HLA("HLS",ORC),HLFS,6)) | 
|---|
| 77 | . Q:ALPST="" | 
|---|
| 78 | . S $P(HLA("HLS",ORC),HLFS,6)=$P(HLA("HLS",ORC),HLFS,6)_HLCS_ALPST | 
|---|
| 79 | D AL1 | 
|---|
| 80 | ;Capture message to review for testing before sending | 
|---|
| 81 | D SEND | 
|---|
| 82 | EXIT ;EXIT and kill | 
|---|
| 83 | K HLA,SUB,SUB1,STRING,ALPLOC,HLCS,HLCTR,HLFS,MSCH,MSCS,MSCTR | 
|---|
| 84 | K MSH,ORC,PID,PV1,RXE,RXR,ALPB,ALPBY,ALPBYN,ALPC,ALPDATA,ALPDFN | 
|---|
| 85 | K ALPDT,ALPI,ALPII,ALPIV,ALPOPTS,ALPOR,ALPORD,ALPST | 
|---|
| 86 | K ALPSTN,ALPSYM,EVENT,GMRA,GMRAL | 
|---|
| 87 | Q ALPRSLT | 
|---|
| 88 | INI() ;INTIAL SET UP ENTRY | 
|---|
| 89 | G SEED | 
|---|
| 90 | INIT ;CALL HL7 TO INITIALIZE MESSAGE VARIABLES | 
|---|
| 91 | ;SET UP ENVIRONMENT FOR MESSAGE | 
|---|
| 92 | K HL,HLA,HLECH,HLQ,ALPRSLT,ALPOPTS | 
|---|
| 93 | S EVENT="PSB BCBU ORM SEND" | 
|---|
| 94 | D INIT^HLFNC2(EVENT,.HL,1) | 
|---|
| 95 | S HLCS=$E(HL("ECH")),HLCTR=HLFS_HL("ECH") | 
|---|
| 96 | Q | 
|---|
| 97 | SEND ;CALL HL7 TO TRANSMIT SINGLE MESSAGE | 
|---|
| 98 | K ALPRSLT,ALPOPTS | 
|---|
| 99 | D GENERATE^HLMA(EVENT,"LM",1,.ALPRSLT,"",.ALPOPTS) | 
|---|
| 100 | Q | 
|---|
| 101 | AL1 ;ALLERGY SEGMENT BUILD | 
|---|
| 102 | ;The will build the ALP segment with the curent allergies | 
|---|
| 103 | ;for the patient to be added to the message | 
|---|
| 104 | N DFN | 
|---|
| 105 | Q:+ALPDFN'>0 | 
|---|
| 106 | K GMRAL | 
|---|
| 107 | S DFN=ALPDFN | 
|---|
| 108 | S GMRA="0^0^111"  ;DEFINES WHAT ALLERGIES TO RETURN | 
|---|
| 109 | D EN1^GMRADPT | 
|---|
| 110 | Q:'$D(GMRAL) | 
|---|
| 111 | S ALPI=0,ALPC=1,ALPSYM="" | 
|---|
| 112 | F  S ALPI=$O(GMRAL(ALPI)) Q:+ALPI'>0  D | 
|---|
| 113 | . S ALPADR="" | 
|---|
| 114 | . I $P($P(GMRAL(ALPI),U,8),";",2)="P" S ALPADR="**ADR** " | 
|---|
| 115 | . S ALPDATA="AL1"_HLFS_ALPC_HLFS_$P(GMRAL(ALPI),U,7) | 
|---|
| 116 | . S ALPDATA=ALPDATA_HLFS_ALPI_HLCS_ALPADR_$E($P(GMRAL(ALPI),U,2),1,25)_HLCS_"VA120.8" | 
|---|
| 117 | . ;S ALPII=0 F  S ALPII=$O(GMRAL(ALPI,"S",ALPII)) Q:+ALPII'>0  D | 
|---|
| 118 | . ;. S ALPSYM=ALPSYM_$P(GMRAL(ALPI,"S",ALPII),";",1)_HLCS | 
|---|
| 119 | . ;S $P(ALPDATA,HLFS,6)=ALPSYM | 
|---|
| 120 | . S HLA("HLS",$O(HLA("HLS",9999999),-1)+1)=ALPDATA | 
|---|
| 121 | . S ALPC=ALPC+1 | 
|---|
| 122 | K GMRAL | 
|---|
| 123 | Q | 
|---|
| 124 | RXE ; | 
|---|
| 125 | Q:+$G(RXE)'>0 | 
|---|
| 126 | K ^TMP("PSJ1",$J) | 
|---|
| 127 | Q:'$D(HLA("HLS",RXE)) | 
|---|
| 128 | S DATA=HLA("HLS",RXE) | 
|---|
| 129 | D EN^PSJBCMA1(ALPDFN,ALPORD,1) | 
|---|
| 130 | S TYP=$P($G(^TMP("PSJ1",$J,4)),U,2) | 
|---|
| 131 | Q:TYP="CONTINUOUS" | 
|---|
| 132 | Q:TYP="FILL ON REQUEST" | 
|---|
| 133 | S ALP1=$P(DATA,HLFS,2),ALP2=$P(ALP1,HLCS,2) | 
|---|
| 134 | I ALP1[TYP Q | 
|---|
| 135 | I ALP2[TYP Q | 
|---|
| 136 | S $P(ALP2,"&",1)=$P(ALP2,"&",1)_" "_TYP | 
|---|
| 137 | S $P(ALP1,HLCS,2)=ALP2,$P(DATA,HLFS,2)=ALP1 | 
|---|
| 138 | S HLA("HLS",RXE)=DATA | 
|---|
| 139 | K TYP,ALP1,ALP2,^TMP("PSJ1",$J) | 
|---|
| 140 | Q | 
|---|
| 141 | PDIV ;PATIENT DIVISION | 
|---|
| 142 | ;Check ALPBMDT Variable | 
|---|
| 143 | S:+$G(ALPBMDT)'>0 ALPBMDT=0 | 
|---|
| 144 | S ALPDIV=$$DIV^ALPBUTL1(ALPDFN,ALPBMDT) | 
|---|
| 145 | ;Screen Dom | 
|---|
| 146 | I ALPDIV="DOM",+$$GET^XPAR("PKG.BAR CODE MED ADMIN","PSB BKUP DOM FILTER",1,"Q")>0 Q | 
|---|
| 147 | ;Now do I send the Message or not Based of Division | 
|---|
| 148 | I $D(ALPHLL("LINKS")) M HLL("LINKS")=ALPHLL("LINKS") | 
|---|
| 149 | I '$D(HLL("LINKS")) D GET^ALPBPARM(.HLL,ALPDIV) | 
|---|
| 150 | Q | 
|---|
| 151 | MEDL(ALPML) ;Use this entry to send MedLog messages | 
|---|
| 152 | N VAIN | 
|---|
| 153 | ;ALPML is the IEN of the MedLog for file #53.79 | 
|---|
| 154 | I '$D(ALPML) Q "0^ALPML^No Med-Log Number" | 
|---|
| 155 | I '$D(^PSB(53.79,ALPML,0)) Q "0^"_ALPML_"^Med - Log Number Invalid" | 
|---|
| 156 | ;First get the required HL7 Variables | 
|---|
| 157 | D INIT | 
|---|
| 158 | ;Need to build the PID, PV1 and ORC segments | 
|---|
| 159 | S ALPDFN=+$P($G(^PSB(53.79,ALPML,0)),U,1) | 
|---|
| 160 | I +ALPDFN'>0 Q "0^"_ALPML_"^Invalid or Missing Patient - Med-Log" | 
|---|
| 161 | ;Get the Division that the patient is associated with | 
|---|
| 162 | D PDIV | 
|---|
| 163 | I ALPDIV="DOM",+$$GET^XPAR("PKG.BAR CODE MED ADMIN","PSB BKUP DOM FILTER",1,"Q")>0 Q "0^^Screen of DOMICILIARY" | 
|---|
| 164 | I '$D(HLL("LINKS")) Q "0^"_ALPML_"^Missing HLL Links Array Med-Log" | 
|---|
| 165 | S ALPST=$P($G(^PSB(53.79,ALPML,0)),U,9) | 
|---|
| 166 | S ALPBY=$P($G(^PSB(53.79,ALPML,0)),U,7) | 
|---|
| 167 | S ALPDT=$P($G(^PSB(53.79,ALPML,0)),U,6) | 
|---|
| 168 | S ALPOR=$P($G(^PSB(53.79,ALPML,.1)),U,1) | 
|---|
| 169 | S ALPBYN=$P($G(^VA(200,ALPBY,0)),U,1) | 
|---|
| 170 | S ALPSTN=$S($D(ALPST):$$EXTERNAL^DILFD(53.79,".09",,ALPST),1:"Non") | 
|---|
| 171 | I '$D(ALPOR) Q "0^"_ALPML_"^Invalid or Missing Pharmacy Order Number Med-Log" | 
|---|
| 172 | S PID=$$EN^VAFHLPID(ALPDFN,"2,7,8,19") | 
|---|
| 173 | I '$D(PID) Q "0^"_ALPML_"^Invalid or Missing Patient - PID Med-Log" | 
|---|
| 174 | S PV1=$$EN^VAFHAPV1(ALPDFN,DT,"2,3,7,18") | 
|---|
| 175 | I '$D(PV1) Q "0^"_ALPML_"^Invalid or Missing Patient Location - PV1 Med-Log" | 
|---|
| 176 | S HLA("HLS",1)=PID | 
|---|
| 177 | S HLA("HLS",2)=PV1 | 
|---|
| 178 | ;BUILD ORC SEGMENT | 
|---|
| 179 | S ORC="ORC"_HLFS_"ML"_HLFS_ALPML_HLCS_"ML"_HLFS_ALPOR_HLCS_"PS"_HLFS | 
|---|
| 180 | S ORC=ORC_HLFS_ALPST_HLCS_ALPSTN_HLFS_HLFS_HLFS_HLFS | 
|---|
| 181 | S ORC=ORC_$$HLDATE^HLFNC(ALPDT,"TS")_HLFS_ALPBY_HLCS_ALPBYN | 
|---|
| 182 | S HLA("HLS",3)=ORC | 
|---|
| 183 | ;The Message is ready to send | 
|---|
| 184 | D SEND | 
|---|
| 185 | Q ALPRSLT | 
|---|
| 186 | ; | 
|---|
| 187 | ADMQ ;Need to que a single patient init for admissions | 
|---|
| 188 | S ALDFN=ALPDFN | 
|---|
| 189 | S ZTDTH=$$NOW^XLFDT | 
|---|
| 190 | S ZTRTN="PAT^ALPBIND" | 
|---|
| 191 | S ZTDESC="PSB - Initialize Single Patient on Admission Contingency Workstation" | 
|---|
| 192 | S ZTIO="",ZTSAVE("ALDFN")="" | 
|---|
| 193 | D ^%ZTLOAD | 
|---|
| 194 | K ZTIO,ZTDESC,ZTRTN,ZTSK | 
|---|
| 195 | Q | 
|---|
| 196 | PMOV(ALPDFN,ALPTYP,ALPTT,ALPBMDT) ;Entry Point to send patient movement | 
|---|
| 197 | N VAIN | 
|---|
| 198 | I +$G(ALPDFN)'>0 Q "0^^Missing Patient ID" | 
|---|
| 199 | D INIT | 
|---|
| 200 | ;Check Movement type. If not a discharge then don't pass date and time | 
|---|
| 201 | S:$G(ALPTT)'="DISCHARGE" ALPBMDT=0 | 
|---|
| 202 | ;Get the Division that the patient is associated with | 
|---|
| 203 | D PDIV | 
|---|
| 204 | I ALPDIV="DOM",+$$GET^XPAR("PKG.BAR CODE MED ADMIN","PSB BKUP DOM FILTER",1,"Q")>0 Q "0^^Screen of DOMICILIARY" | 
|---|
| 205 | I '$D(HLL("LINKS")) Q "0^"_ALPDFN_"^Missing HLL Links Array Pat-Move" | 
|---|
| 206 | S HLA("HLS",1)=$$EN^VAFHLPID(ALPDFN,"2,7,8,19") | 
|---|
| 207 | S HLA("HLS",2)=$$EN^VAFHAPV1(ALPDFN,DT,"2,3,7,18") | 
|---|
| 208 | S:$G(ALPTT)="DISCHARGE" $P(HLA("HLS",2),HLFS,37)=$G(ALPTYP) | 
|---|
| 209 | D SEND | 
|---|
| 210 | I ALPTYP=14!(ALPTYP=41) S ALPTT="ADMISSION" ;FOR RETURN FROM ASIH | 
|---|
| 211 | I $G(ALPTT)="ADMISSION" D ADMQ | 
|---|
| 212 | ;SEND A DISCHARGE TO DIV SENDING ASIH | 
|---|
| 213 | I $G(ALPTYP)[13!($G(ALPTYP)[40) D | 
|---|
| 214 | .D INIT | 
|---|
| 215 | .S ALPWRD=$P($G(DGPMVI(5)),U,1) ;LAST WARD | 
|---|
| 216 | .I +ALPWRD'>0 S ALPRSLT="0^^Screen - No Ward" Q  ;NO WARD | 
|---|
| 217 | .S ALPBDIV=$P($G(^DIC(42,ALPWRD,0)),U,11) | 
|---|
| 218 | .D GET^ALPBPARM(.HLL,ALPBDIV) | 
|---|
| 219 | .S HLA("HLS",1)=$$EN^VAFHLPID(ALPDFN,"2,7,8,19") | 
|---|
| 220 | .S HLA("HLS",2)=$$EN^VAFHAPV1(ALPDFN,DT,"2,3,7,18") | 
|---|
| 221 | .S $P(HLA("HLS",2),HLFS,37)="ASIH" | 
|---|
| 222 | .D SEND | 
|---|
| 223 | Q ALPRSLT | 
|---|