[613] | 1 | MPIFQUE3 ;SF/TNV-Generate Batch message for comparison of CMOR score ;FEB 27, 1998
|
---|
| 2 | ;;1.0; MASTER PATIENT INDEX VISTA ;**1,3**;30 Apr 99
|
---|
| 3 | ;
|
---|
| 4 | COMP ; Create a batch CMOR request for comparing the CMOR score with the owner
|
---|
| 5 | ; of this patient. This will be for ALL CMOR SITES. (NOT ONE SITE)
|
---|
| 6 | ;
|
---|
| 7 | N DIRUT
|
---|
| 8 | S DIR("A")="This process will take a while to complete. Are you sure? "
|
---|
| 9 | S DIR("B")="NO",DIR(0)="YAO" D ^DIR K DIR Q:$D(DIRUT)
|
---|
| 10 | I Y=0 K DIR Q ; no go
|
---|
| 11 | I $P($G(^RGSITE(991.8,1,"COMP")),"^")'="" S $P(^("COMP"),"^")=""
|
---|
| 12 | TASK ; Task this job to run
|
---|
| 13 | S ZTIO="",ZTRTN="EN^MPIFQUE3",ZTSAVE("DUZ")=""
|
---|
| 14 | S ZTDESC="GENERATE CMOR COMPARISON PROCESS"
|
---|
| 15 | D ^%ZTLOAD
|
---|
| 16 | I $D(ZTSK) W " Task#, ",ZTSK," queued" S $P(^RGSITE(991.8,1,"COMP"),U,5)=ZTSK
|
---|
| 17 | ;
|
---|
| 18 | KILL ; Clean up the partition
|
---|
| 19 | K DIR,ZTSK,Y,ZTIO,ZTRTN,ZTDESC,ZTSAVE
|
---|
| 20 | Q
|
---|
| 21 | ;
|
---|
| 22 | EN ; Entry point for CMOR Batch comparison. This should only be run after
|
---|
| 23 | ; the initialization to the MPI has been completed.
|
---|
| 24 | N U,SITE,NODE,MPI,MTIEN,MPILOOP,DTNOW,MSGCOUNT,LINCOUNT,RGLOG
|
---|
| 25 | S U="^",(MPILOOP,SITE)="",MPISTOP=0
|
---|
| 26 | D START^RGHLLOG()
|
---|
| 27 | N X,Y,DIC
|
---|
| 28 | S DIC="^VA(200,",DIC(0)="MZO",X="`"_+DUZ
|
---|
| 29 | D ^DIC
|
---|
| 30 | I $G(Y)<1 S MPINAME=""
|
---|
| 31 | I $G(Y)>0 S MPINAME=$G(Y(0,0))
|
---|
| 32 | ; If the job has manually stopped status it should restart at where
|
---|
| 33 | ; it left off
|
---|
| 34 | I $P($G(^RGSITE(991.8,1,"COMP")),U,4)="MS" D
|
---|
| 35 | . I $P($G(^RGSITE(991.8,1,"COMP")),U)="" S $P(^("COMP"),U,4)="C" Q ; Not logical restart from the top
|
---|
| 36 | . S NODE=$$MPINODE^MPIFAPI(+$P(^RGSITE(991.8,1,"COMP"),U))
|
---|
| 37 | . S CMOR=$P(NODE,U,3) ; CMOR of the last patient
|
---|
| 38 | . I +CMOR>0 S SITE=$O(^DPT("ACMOR",CMOR),-1) ; Back up one level
|
---|
| 39 | . I +CMOR>0 S MPILOOP=+$P(^RGSITE(991.8,1,"COMP"),U) ; Marked the last patient
|
---|
| 40 | . I +CMOR<1 S (SITE,MPILOOP)=0
|
---|
| 41 | . K CMOR
|
---|
| 42 | ; If the job has completed status it should restart at the top
|
---|
| 43 | I $P($G(^RGSITE(991.8,1,"COMP")),U,4)="C" S $P(^("COMP"),U)=""
|
---|
| 44 | ; Start the job
|
---|
| 45 | S ^XTMP("RGVCCMR","@@@@","DFNCOUNT")=0 ; set for counter in CALC^RGVCCMR2
|
---|
| 46 | D NOW^%DTC S Y=X X ^DD("DD") S DTNOW=Y ; get current date and time
|
---|
| 47 | S $P(^RGSITE(991.8,1,"COMP"),U,2)=% ; timestamp the job
|
---|
| 48 | S $P(^RGSITE(991.8,1,"COMP"),U,4)="R" ; mark the status as running
|
---|
| 49 | S $P(^RGSITE(991.8,1,"COMP"),U,6)="N" ; reset the flag
|
---|
| 50 | N RGDFN,CALDT,NODE
|
---|
| 51 | F S SITE=$O(^DPT("ACMOR",SITE)) Q:SITE="" D ; Get the site CMOR on file
|
---|
| 52 | . Q:MPISTOP=1 ; Trouble occured, user wanted to stop
|
---|
| 53 | . I +SITE=+$$SITE^VASITE() Q ; Don't process your own
|
---|
| 54 | . D HDR ; Create batch for each site
|
---|
| 55 | . F S MPILOOP=$O(^DPT("ACMOR",+SITE,MPILOOP)) Q:MPILOOP="" D Q:MPISTOP=1 ; Start with DFN and go
|
---|
| 56 | . . S DFN=+MPILOOP Q:DFN<0
|
---|
| 57 | . . S NODE=$$MPINODE^MPIFAPI(DFN) Q:+NODE<1 ; Was not CIRN'ed
|
---|
| 58 | . . I $G(^DPT(DFN,.35)),$P($G(^DPT(DFN,.35)),"^")'="" Q ; Death patient
|
---|
| 59 | . . I $P(NODE,"^")="" D LOG Q ; Log exception if no ICN
|
---|
| 60 | . . S CALDT=$P(NODE,"^",7) ; current calc date
|
---|
| 61 | . . I CALDT="" S CALDT=0
|
---|
| 62 | . . S X="T-90" D ^%DT
|
---|
| 63 | . . I CALDT<Y S RGDFN=DFN D CALC^RGVCCMR2 ; score is older than 90 days
|
---|
| 64 | . . S $P(^RGSITE(991.8,1,"COMP"),U)=+DFN ; mark that patient as done
|
---|
| 65 | . . D INDV
|
---|
| 66 | . . I MSGCOUNT>99 D SEND D HDR ; send out if over 100 messages
|
---|
| 67 | . . I $P($G(^RGSITE(991.8,1,"COMP")),U,6)="Y" S MPISTOP=1 D SEND Q
|
---|
| 68 | . I $O(^TMP("HLS",$J,0)) D SEND ;**3
|
---|
| 69 | ;
|
---|
| 70 | ; if user asked to stop set flag = yes and status to MS
|
---|
| 71 | ; if naturally stop set status to SN
|
---|
| 72 | I MPISTOP=1 S $P(^RGSITE(991.8,1,"COMP"),U,6)="Y",$P(^("COMP"),U,4)="MS"
|
---|
| 73 | E S $P(^RGSITE(991.8,1,"COMP"),U,4)="C"
|
---|
| 74 | D NOW^%DTC S $P(^RGSITE(991.8,1,"COMP"),U,3)=% ; timestamp when it stop
|
---|
| 75 | D CLEAN
|
---|
| 76 | D STOP^RGHLLOG()
|
---|
| 77 | Q
|
---|
| 78 | ;
|
---|
| 79 | HDR ; Create HL7 batch HEADER message to each of the CMOR site
|
---|
| 80 | K ^TMP("HLS",$J)
|
---|
| 81 | D INIT^HLFNC2("MPIF CMOR COMPARISON SERVER",.HL)
|
---|
| 82 | I $D(HL)=1 D EXC^RGHLLOG(220,"Error Returned in INIT^HLFNC2") K HL S MPISTOP=1 Q
|
---|
| 83 | D CREATE^HLTF(.HLMID,.MTIEN,.HLDT,.HLDT1)
|
---|
| 84 | I $D(MTIEN)="" D EXC^RGHLLOG(220,"Error Returned in CREATE^HLTF") K HLMID,HLDT,HLDT1 S MPISTOP=1 Q
|
---|
| 85 | S LINCOUNT=0 ; Set line counter
|
---|
| 86 | S MSGCOUNT=1 ; Set counter for 100 message per batch
|
---|
| 87 | Q
|
---|
| 88 | ;
|
---|
| 89 | INDV ; Create individual message of the HL7 ADT-A31 batch message
|
---|
| 90 | ; EVN segment = event, date, CMOR score, requestor name
|
---|
| 91 | ; PID segment = standard call
|
---|
| 92 | ; NTE segment = Reason CMOR COMPARISON, site requested
|
---|
| 93 | D INIT^HLFNC2("MPIF CMOR COMPARISON SERVER",.HL) ; Because HL7 did not know
|
---|
| 94 | S HL("SAF")=$P($$SITE^VASITE,"^",3) ; the facility # when dynamic
|
---|
| 95 | ; address of batch. This needs
|
---|
| 96 | ; to be set. Until HL7 fixs it
|
---|
| 97 | S MPIID=HLMID_"-"_MSGCOUNT
|
---|
| 98 | D MSH^HLFNC2(.HL,MPIID,.MPI)
|
---|
| 99 | N NODE
|
---|
| 100 | S LINCOUNT=LINCOUNT+1
|
---|
| 101 | S ^TMP("HLS",$J,LINCOUNT)=MPI
|
---|
| 102 | S LINCOUNT=LINCOUNT+1
|
---|
| 103 | S NODE=$$MPINODE^MPIFAPI(DFN)
|
---|
| 104 | Q:+NODE<1
|
---|
| 105 | S ^TMP("HLS",$J,LINCOUNT)="EVN"_HL("FS")_"A31"_HL("FS")_$P(NODE,"^",7)_HL("FS")_$P(NODE,U,6)_HL("FS")_MPINAME
|
---|
| 106 | S LINCOUNT=LINCOUNT+1
|
---|
| 107 | S ^TMP("HLS",$J,LINCOUNT)=$$EN^VAFCPID(DFN,"2,3,5")
|
---|
| 108 | S LINCOUNT=LINCOUNT+1
|
---|
| 109 | ;this is the request to the site for a comparison
|
---|
| 110 | S ^TMP("HLS",$J,LINCOUNT)="NTE"_HL("FS")_"COMPARISON"_HL("FS")_$P($$SITE^VASITE(),U,3)
|
---|
| 111 | S MSGCOUNT=MSGCOUNT+1
|
---|
| 112 | Q
|
---|
| 113 | ;
|
---|
| 114 | SEND ; Send out the batch message
|
---|
| 115 | N RESLT
|
---|
| 116 | D GENERATE^HLMA("MPIF CMOR COMPARISON SERVER","GB",1,.RESLT,MTIEN)
|
---|
| 117 | I $P(RESLT,U,2)'="" D EXC^RGHLLOG(220,"Error Returned in GENERATE^HLMA "_$P(RESLT,U,2)) S MPISTOP=1
|
---|
| 118 | Q
|
---|
| 119 | ;
|
---|
| 120 | LOGIC ; This is where the dynamic address located.
|
---|
| 121 | ; ** Routing logic field in Protocol file is being used
|
---|
| 122 | ; instead of GET^HLSUB.
|
---|
| 123 | ; For now, I have to hard set the receiving logical link, intercept
|
---|
| 124 | ; the message before it send out, figure out the receiving Logical
|
---|
| 125 | ; link from the MSH segment and let the Routing logic create the
|
---|
| 126 | ; HLL("LINKS") array.
|
---|
| 127 | N RESLT
|
---|
| 128 | K RGL,RESLT
|
---|
| 129 | D LINK^HLUTIL3(SITE,.RGL) ; get the logical link to that institution
|
---|
| 130 | S INSTITU=$O(RGL(0))
|
---|
| 131 | I INSTITU<1 Q ; if there is no logical link
|
---|
| 132 | I $E($G(RGL(INSTITU)),1,2)'="VA" D
|
---|
| 133 | .D START^RGHLLOG()
|
---|
| 134 | .D EXC^RGHLLOG(224,"Can't send CMOR Comparison message to site, due to non-CIRN logical link for site "_INSTITU)
|
---|
| 135 | .D STOP^RGHLLOG()
|
---|
| 136 | .S RESLT=1
|
---|
| 137 | Q:$D(RESLT)
|
---|
| 138 | S HLL("LINKS",1)="MPIF CMOR COMPARISON CLIENT"_HL("FS")_RGL(INSTITU)
|
---|
| 139 | K INSTITU,RGL
|
---|
| 140 | Q
|
---|
| 141 | ;
|
---|
| 142 | CLEAN ; Clean up the partition
|
---|
| 143 | K %,X,Y,MPISTOP,MPINAME,DFN,MPIID
|
---|
| 144 | K ^XTMP("HLS",$J)
|
---|
| 145 | Q
|
---|
| 146 | ;
|
---|
| 147 | LOG ; Log exception for non ICN but CMOR belong to someone else
|
---|
| 148 | N NAME,SSN,RGLOG,TEXT
|
---|
| 149 | S XMCHAN=1,NAME=$P(^DPT(DFN,0),"^",1),SSN=$P(^(0),"^",9)
|
---|
| 150 | S TEXT="This patient "_NAME_" ssn# "_SSN_" is missing the ICN. Log a NOIS regarding this missing ICN."
|
---|
| 151 | D EXC^RGHLLOG(219,TEXT,DFN)
|
---|
| 152 | K XMCHAN
|
---|
| 153 | Q
|
---|
| 154 | ;
|
---|
| 155 | STOP ; Stop/Restart the CMOR Comparison process
|
---|
| 156 | I $P($G(^RGSITE(991.8,1,"COMP")),"^",4)'="R" D Q
|
---|
| 157 | . S DIR("A")="Do you want to RESTART this CMOR Comparison process"
|
---|
| 158 | . S DIR("B")="N",DIR(0)="Y" D ^DIR
|
---|
| 159 | . I $G(Y)=1 D TASK
|
---|
| 160 | I $P($G(^RGSITE(991.8,1,"COMP")),"^",4)="R" D Q
|
---|
| 161 | . W !
|
---|
| 162 | . S DIR("A")="Do you want to stop CMOR Comparison process after the current patient"
|
---|
| 163 | . S DIR("B")="N",DIR(0)="Y" D ^DIR
|
---|
| 164 | . I $G(Y)=1 S $P(^RGSITE(991.8,1,"COMP"),"^",6)="Y"
|
---|
| 165 | Q
|
---|
| 166 | ;
|
---|
| 167 | STATUS ; Where is the process right now?
|
---|
| 168 | N IEN,NAME,SSN,STATUS,Y
|
---|
| 169 | I $P($G(^RGSITE(991.8,1,"COMP")),"^",5)="" W !,"The CMOR Comparison process HAS NEVER been tasked" Q
|
---|
| 170 | W !,"The CMOR Comparison process has been tasked with task # ",$P($G(^RGSITE(991.8,1,"COMP")),"^",5),". The"
|
---|
| 171 | S STATUS=$P($G(^RGSITE(991.8,1,"COMP")),"^",4)
|
---|
| 172 | W !,"process ",$S(STATUS="R":"is currently running",STATUS="MS":"was manually stopped",STATUS="C":"has completed",1:"")
|
---|
| 173 | I (STATUS="C")!(STATUS="MS") S Y=$P($G(^RGSITE(991.8,1,"COMP")),"^",3) X ^DD("DD") W " on ",Y
|
---|
| 174 | S IEN=$P($G(^RGSITE(991.8,1,"COMP")),"^")
|
---|
| 175 | I IEN'="" D
|
---|
| 176 | .S NAME=$P($G(^DPT(+IEN,0)),"^"),SSN=$P($G(^(0)),"^",9)
|
---|
| 177 | .S CMOR=$P($G(^DPT(+IEN,"MPI")),"^",3)
|
---|
| 178 | .S CMOR=$P($$NNT^XUAF4(CMOR),"^")
|
---|
| 179 | .W " and the last patient",!,"was ",NAME," ssn # ",SSN," CMOR= ",CMOR
|
---|
| 180 | Q
|
---|
| 181 | ;
|
---|