| [613] | 1 | MPIFQUE4 ;SF/TNV-Process the CMOR COMPARISON request ;FEB 25, 1998 | 
|---|
|  | 2 | ;;1.0; MASTER PATIENT INDEX VISTA ;**1,3,11,24,27**;30 Apr 99 | 
|---|
|  | 3 | ; | 
|---|
|  | 4 | ; Integration Agreements Utilized: | 
|---|
|  | 5 | ; | 
|---|
|  | 6 | ;   EXC^RGHLLOG     IA #2796 | 
|---|
|  | 7 | ;   START^RGHLLOG   IA #2796 | 
|---|
|  | 8 | ;   STOP^RGHLLOG    IA #2796 | 
|---|
|  | 9 | ;   CALC^RGVCCMR2   IA #2710 | 
|---|
|  | 10 | ;   $$EN^VAFCPID    IA #3015 | 
|---|
|  | 11 | ;   ^DGCN(391.91    IA #2751 | 
|---|
|  | 12 | ;   FILE^VAFCTFU    IA #2988 | 
|---|
|  | 13 | ; | 
|---|
|  | 14 | ; This routine will process the batch message from the sending CMOR | 
|---|
|  | 15 | ; who wished to change the patient CMOR from you to their own. | 
|---|
|  | 16 | ; PLEASE NOTE THAT THIS PROCESS WILL NOT BE TRACKED AS CMOR REQUEST | 
|---|
|  | 17 | ; EVENT. SO NOTHING WILL BE RECORDED IN THAT FILE. (PER SRS 9-18-97) | 
|---|
|  | 18 | ; Approving process: | 
|---|
|  | 19 | ; The sender will give the CMOR score and the date for a patient | 
|---|
|  | 20 | ; The receiver will look into the CMOR score on the system and compare | 
|---|
|  | 21 | ; the date if the date is less than 90 days. Go and use the Current | 
|---|
|  | 22 | ; CMOR score and compare. If the incoming CMOR score is 80% or more than | 
|---|
|  | 23 | ; the system CMOR score. CMOR site will be changed to the requesting CMOR | 
|---|
|  | 24 | ; site. An approved HL7 message will be send to ALL SITES in the | 
|---|
|  | 25 | ; subscriber list and notify them the new CMOR site. MPI is included. | 
|---|
|  | 26 | ; If the score is equal or greater than 90 days. CMOR score will be | 
|---|
|  | 27 | ; recalulated for this patient and compare. Same process as above. | 
|---|
|  | 28 | ; If the incoming CMOR score is not higher than 80% nothing will happen. | 
|---|
|  | 29 | BEGIN ; Entry point for CMOR COMPARISON request to process. | 
|---|
|  | 30 | ; NO input or output variables | 
|---|
|  | 31 | N IEN,RGLOG | 
|---|
|  | 32 | K RGL | 
|---|
|  | 33 | D NOW^%DTC | 
|---|
|  | 34 | S ZTIO="",ZTDTH=%,ZTRTN="EN^MPIFQUE4" | 
|---|
|  | 35 | S ZTDESC="BACKGROUND CMOR COMPARISON" | 
|---|
|  | 36 | S ZTSAVE("HL*")="" | 
|---|
|  | 37 | D ^%ZTLOAD,CLEAN | 
|---|
|  | 38 | K COUNT,RGL,%,ZTIO,ZTDTH,ZTRTN,ZTDESC,ZTSAVE | 
|---|
|  | 39 | Q | 
|---|
|  | 40 | ; | 
|---|
|  | 41 | EN ; Background job to run for cmor comparison | 
|---|
|  | 42 | K ERROR,MPICNT | 
|---|
|  | 43 | N MPII,U,LINE,PARENT,COUNT,NDATE,IKI,MPIFFS,MPIFSFS,MPIFREAP,RGLOG | 
|---|
|  | 44 | S MPIFFS=HL("FS"),MPIFSFS=$E(HL("ECH"),1),MPIFREAP=$E(HL("ECH"),2) | 
|---|
|  | 45 | D START^RGHLLOG() | 
|---|
|  | 46 | S U="^",(COUNT,MPICNT)=0 | 
|---|
|  | 47 | F MPII=1:1 X HLNEXT Q:HLQUIT'>0!($D(ERROR))  G:$$S^%ZTLOAD CLEAN D | 
|---|
|  | 48 | . S LINE=HLNODE | 
|---|
|  | 49 | . I $P(LINE,MPIFFS)["MSH" D MSH | 
|---|
|  | 50 | . I $P(LINE,MPIFFS)["NTE" D NTE | 
|---|
|  | 51 | . I $P(LINE,MPIFFS)["PID" D PID | 
|---|
|  | 52 | . I $P(LINE,MPIFFS)["EVN" D EVN | 
|---|
|  | 53 | . I COUNT=4,'$D(ERROR) D PROCES | 
|---|
|  | 54 | K SERVER,CLIENT,ERROR | 
|---|
|  | 55 | D STOP^RGHLLOG() | 
|---|
|  | 56 | S ZTREQ="@" | 
|---|
|  | 57 | Q | 
|---|
|  | 58 | ; | 
|---|
|  | 59 | MSH ; Process MSH segment | 
|---|
|  | 60 | S COUNT=COUNT+1 | 
|---|
|  | 61 | Q | 
|---|
|  | 62 | ; | 
|---|
|  | 63 | NTE ; Process NTE segment | 
|---|
|  | 64 | S COUNT=COUNT+1 | 
|---|
|  | 65 | S SITE=$P(LINE,MPIFFS,3) | 
|---|
|  | 66 | I SITE="" S ERROR="HL7 Msg# "_$G(HL("MID"))_" is missing CMOR for ICN# "_$G(ICN) D EXC^RGHLLOG(221,ERROR) Q | 
|---|
|  | 67 | S REASON=$P(LINE,MPIFFS,2) | 
|---|
|  | 68 | I REASON'="COMPARISON" S ERROR="HL7 Msg# "_$G(HL("MID"))_" contained a unknown request reason for ICN# "_$G(ICN) D EXC^RGHLLOG(222,ERROR) | 
|---|
|  | 69 | Q | 
|---|
|  | 70 | ; | 
|---|
|  | 71 | PID ; Process PID segment | 
|---|
|  | 72 | N NODE | 
|---|
|  | 73 | S COUNT=COUNT+1 | 
|---|
|  | 74 | S ICN=+$P(LINE,MPIFFS,3)   ; get ICN out. | 
|---|
|  | 75 | I ICN="" S ERROR="HL7 Msg# "_$G(HL("MID"))_" contains a null ICN in a PID segment." D EXC^RGHLLOG(219,ERROR) Q | 
|---|
|  | 76 | S DFN=$$IEN^MPIFNQ(ICN)                  ; get DFN of this patient | 
|---|
|  | 77 | I DFN="" S ERROR="Can't Process CMOR Compare for Patient with ICN "_ICN_". ICN not at this site. HL7 Message#: "_HLMTIEN D EXC^RGHLLOG(219,ERROR) Q | 
|---|
|  | 78 | S NODE=$$MPINODE^MPIFAPI(+DFN) | 
|---|
|  | 79 | S CMOR=$P(NODE,"^",3)               ; get the CMOR of this patient | 
|---|
|  | 80 | S SCORE=$P(NODE,"^",6),NDATE=$P(NODE,"^",7) | 
|---|
|  | 81 | ; if no score or score date recalc score and reset variables | 
|---|
|  | 82 | I SCORE=""!(NDATE="") N RGDFN S RGDFN=DFN D CALC^RGVCCMR2 | 
|---|
|  | 83 | S NODE=$$MPINODE^MPIFAPI(+DFN),SCORE=$P(NODE,"^",6),NDATE=$P(NODE,"^",7) | 
|---|
|  | 84 | Q | 
|---|
|  | 85 | ; | 
|---|
|  | 86 | EVN ; Process EVN segment | 
|---|
|  | 87 | S COUNT=COUNT+1 | 
|---|
|  | 88 | S X=$P(LINE,MPIFFS,3) D ^%DT S INDATE=Y | 
|---|
|  | 89 | I INDATE=-1 S ERROR="CMOR score Date was missing for DFN "_DFN_" in CMOR Compare Inbound Message" Q | 
|---|
|  | 90 | S INSCORE=$P($G(LINE),MPIFFS,4) | 
|---|
|  | 91 | I INSCORE="" S INSCORE=0 | 
|---|
|  | 92 | Q | 
|---|
|  | 93 | ; | 
|---|
|  | 94 | PROCES ; Process one complete message (MSH,PID,EVN,NTE) | 
|---|
|  | 95 | N LIMIT | 
|---|
|  | 96 | I $G(ERROR)]"" D CLEAN Q                ; Don't do anything if there is an error | 
|---|
|  | 97 | S X="T-90" D ^%DT                       ; get the target date | 
|---|
|  | 98 | I NDATE>Y D  Q                           ; RECORDED DATE is less than 90 days | 
|---|
|  | 99 | . S LIMIT=$$PERCENT(INSCORE,SCORE)      ; Incoming CMOR score is above 80% | 
|---|
|  | 100 | . I (LIMIT>80.5)&(INSCORE>SCORE) D CHANGE                 ; Incoming CMOR score is greater | 
|---|
|  | 101 | . D CLEAN                               ; Incoming CMOR score is LESS | 
|---|
|  | 102 | N RGDFN S RGDFN=DFN D CALC^RGVCCMR2                         ; Last calculation was greater than 90 days | 
|---|
|  | 103 | S SCORE=$P($$MPINODE^MPIFAPI(DFN),"^",6)    ; Get the latest score | 
|---|
|  | 104 | S LIMIT=$$PERCENT(INSCORE,SCORE)        ; Incoming CMOR score is above 80% | 
|---|
|  | 105 | I (LIMIT>80.5)&(INSCORE>SCORE) D CHANGE                   ; Incoming CMOR score is greater | 
|---|
|  | 106 | D CLEAN                                 ; Incoming CMOR score is LESS than the latest score | 
|---|
|  | 107 | Q | 
|---|
|  | 108 | ; | 
|---|
|  | 109 | PERCENT(NUM1,NUM2) ; Calculate the percent difference 80% or more need for change | 
|---|
|  | 110 | ; of CMOR number | 
|---|
|  | 111 | N DIF | 
|---|
|  | 112 | I NUM1="" S NUM1=0 | 
|---|
|  | 113 | I NUM2="" S NUM2=0 | 
|---|
|  | 114 | Q:$$MAX^XLFMTH(NUM1,NUM2)=0 0 | 
|---|
|  | 115 | S DIF=(100-(($$MIN^XLFMTH(NUM1,NUM2))/($$MAX^XLFMTH(NUM1,NUM2))*100)) | 
|---|
|  | 116 | Q DIF | 
|---|
|  | 117 | ; | 
|---|
|  | 118 | CHANGE ; Process the change CMOR request to the new CMOR site and Send out | 
|---|
|  | 119 | ; notification to the Subscriber list and MPI. | 
|---|
|  | 120 | N CHANGE,MPIFSITE S MPIFSITE=$$LKUP^XUAF4(SITE)  ;get INSTITUTION (#4) IEN | 
|---|
|  | 121 | I MPIFSITE=-1 S ERROR="HL7 Msg#"_$G(HL("MID"))_" contained an invalid STATION#"_$G(SITE)_" for ICN#"_$G(ICN) D EXC^RGHLLOG(211,ERROR,+DFN) Q | 
|---|
|  | 122 | S CHANGE=$$CHANGE^MPIF001(+DFN,MPIFSITE) | 
|---|
|  | 123 | I +CHANGE<1 S ERROR="Unable to change CMOR in HL7 Msg#"_$G(HL("MID"))_" from "_$P($$SITE^VASITE,"^",3)_" To "_$G(SITE)_" due to "_$P(CHANGE,"^",2) D EXC^RGHLLOG(211,ERROR,DFN) Q | 
|---|
|  | 124 | S SERVER="MPIF CMOR RESULT SERVER",CLIENT="MPIF CMOR RESULT CLIENT" | 
|---|
|  | 125 | D INIT^HLFNC2(SERVER,.HL) | 
|---|
|  | 126 | I $G(HL) S ERROR=HL D EXC^RGHLLOG(220,ERROR,DFN) Q | 
|---|
|  | 127 | D LINK | 
|---|
|  | 128 | I $G(RESULT)=0 K RESULT Q | 
|---|
|  | 129 | S HLA("HLS",1)=$$EN^VAFCPID(+DFN,"2,3,4,5,6,7,8,9,10") | 
|---|
|  | 130 | S HLA("HLS",2)="EVN"_HL("FS")_"A31"_HL("FS")_INDATE_HL("FS")_INSCORE_HL("FS")_"POSTMASTER" | 
|---|
|  | 131 | ;actually change the cmor | 
|---|
|  | 132 | S HLA("HLS",3)="PV1"_HL("FS")_HL("FS")_HL("FS")_SITE_HL("FS")_HL("FS")_HL("FS")_$P($$NNT^XUAF4(CMOR),"^",2) | 
|---|
|  | 133 | N RESLT | 
|---|
|  | 134 | D GENERATE^HLMA(SERVER,"LM",1,.RESLT) | 
|---|
|  | 135 | I $P(RESLT,U,2)'="" D EXC^RGHLLOG(220,"Error returned in GENERATE^HLMA  "_$P(RESLT,U,2),DFN) | 
|---|
|  | 136 | K RESULT | 
|---|
|  | 137 | S MPICNT=MPICNT+1 ;counting changes in CMOR | 
|---|
|  | 138 | Q | 
|---|
|  | 139 | ; | 
|---|
|  | 140 | LINK ; Give back the TF list in HLL(LINKS") array for this patient | 
|---|
|  | 141 | N CMOR,SUB,IEN,MPILINK,MPITF,PID,CST | 
|---|
|  | 142 | K RGL | 
|---|
|  | 143 | S RGL(0)="" | 
|---|
|  | 144 | S PID=$$GETDFN^MPIF001(ICN) | 
|---|
|  | 145 | S CMOR=$$GETVCCI^MPIF001(PID),CST=$$IEN^XUAF4(CMOR) | 
|---|
|  | 146 | I '$D(^DGCN(391.91,"APAT",PID,CST)) D FILE^VAFCTFU(PID,CST,1) | 
|---|
|  | 147 | S X=$$QUERYTF^VAFCTFU1($G(ICN),"MPITF") | 
|---|
|  | 148 | ;LOOP THOUGH TF LIST AND GET LINK FOR EACH | 
|---|
|  | 149 | N LP,CNT,STN,MPIFHL S CNT=1,LP=0 K ERROR | 
|---|
|  | 150 | F  S LP=$O(MPITF(LP)) Q:LP=""  D | 
|---|
|  | 151 | .S STN=$$STA^XUAF4($G(MPITF(LP))) | 
|---|
|  | 152 | .Q:$P($$SITE^VASITE(),"^",3)=STN | 
|---|
|  | 153 | .K MPIFHL D LINK^HLUTIL3(+$G(MPITF(LP)),.MPIFHL) | 
|---|
|  | 154 | .I '$O(MPIFHL(0)) S ERROR="-1^Unknown Logical Link for Station # "_STN_" Unable to notify of Change of CMOR for patient "_DFN | 
|---|
|  | 155 | .I $D(ERROR) D EXC^RGHLLOG(224,ERROR,DFN) K ERROR Q | 
|---|
|  | 156 | .S HLL("LINKS",CNT)=CLIENT_"^"_$P(MPIFHL($O(MPIFHL(0))),"^"),CNT=CNT+1 | 
|---|
|  | 157 | S MPILINK=$$MPILINK^MPIFAPI() | 
|---|
|  | 158 | I +MPILINK=-1 D EXC^RGHLLOG(224,"No MPI Link defined",DFN) Q | 
|---|
|  | 159 | S HLL("LINKS",9999)=CLIENT_U_MPILINK | 
|---|
|  | 160 | Q | 
|---|
|  | 161 | CLEAN ; Clean up the partition and ready for the next message | 
|---|
|  | 162 | D STOP^RGHLLOG() | 
|---|
|  | 163 | K RGL,EVENT,SITE,REASON,ICN,DFN,CMOR,SCORE,X,Y,INDATE,INSCORE | 
|---|
|  | 164 | S COUNT=0 | 
|---|
|  | 165 | Q | 
|---|
|  | 166 | CHKSUB(DFN,FAC) ;check for an existing subscription if one does not exist add it | 
|---|
|  | 167 | Q | 
|---|
|  | 168 | ;;^ NO LONGER TO BE USED | 
|---|
|  | 169 | N MPIFSCN,MPIF,MPIFLL,MPIFLLI,MPIFLLN,FLAG,LOOP,HLER | 
|---|
|  | 170 | Q:FAC="" | 
|---|
|  | 171 | Q:DFN="" | 
|---|
|  | 172 | Q:FAC=+$$SITE^VASITE  ;don't add subscription for yourself | 
|---|
|  | 173 | S MPIFSCN=$$GETSCN(DFN) | 
|---|
|  | 174 | D GET^HLSUB(MPIFSCN,0,"MPIF CMOR RESULT CLIENT",.MPIFLL) | 
|---|
|  | 175 | D LINK^HLUTIL3("`"_FAC,.MPIF,"I") S MPIFLLI=$O(MPIF(0)) S MPIFLLN=MPIF(MPIFLLI) | 
|---|
|  | 176 | S FLAG=0,LOOP=0 F  S LOOP=$O(MPIFLL("LINKS",LOOP)) Q:'LOOP  I $P(MPIFLL("LINKS",LOOP),"^",2)=MPIFLLN S FLAG=1 | 
|---|
|  | 177 | I FLAG=0 D UPD^HLSUB(MPIFSCN,MPIFLLN,0,$$NOW^XLFDT,,,.HLER) | 
|---|
|  | 178 | I $D(HLER) D EXC^RGHLLOG(224,"Msg#"_$G(HL("MID"))_" Unable to add/update SC for facility IEN "_FAC_", Link "_$G(MPIFLLN)_", for patient "_DFN_" SUB#"_$G(MPIFSCN),DFN) D STOP^RGHLLOG(1) Q  ; log exception | 
|---|
|  | 179 | Q | 
|---|
|  | 180 | GETSCN(DFN) ;Return existing SCN or Activate a new subscription | 
|---|
|  | 181 | ;DFN - PATIENT (#2) file ien | 
|---|
|  | 182 | N MPIFAR,MPIFAN | 
|---|
|  | 183 | ;get subscription control # | 
|---|
|  | 184 | S MPIFSCN=+$P($$MPINODE^MPIFAPI(DFN),"^",5) | 
|---|
|  | 185 | ;if no SCN, create new and update 991.05, then return result | 
|---|
|  | 186 | I 'MPIFSCN S MPIFSCN=$$ACT^HLSUB S MPIFAR(991.05)=MPIFSCN S MPIFAN=$$UPDATE^MPIFAPI(DFN,"MPIFAR") I MPIFAN=-1 S MPIFSCN="" | 
|---|
|  | 187 | Q MPIFSCN | 
|---|