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