| 1 | HLUOPT1 ;AISC/SAW - Purging Entries in file #772 and #773 ;02/04/2004  09:58
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**10,13,21,36,19,47,62,109,108**;Oct 13, 1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ; Purge data of the HL7 message in file #772 and #773.
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; Patch 47 - For Purging Option scheduled on a recurring basis,
 | 
|---|
| 7 |  ; numbers of days kept for various Status of message are stored
 | 
|---|
| 8 |  ; in file #869.3, fields 41, 42, and 43.  Default values for these
 | 
|---|
| 9 |  ; fields are 7, 30, and 90, respectively.
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ; Patch 36 - a message will never be purged if the new field, "Don't
 | 
|---|
| 12 |  ; Purge" (#772,15), is set to 1.
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 | PURGE ;
 | 
|---|
| 15 |  ; HLPDT("COMP") - 'completed' status cutoff date
 | 
|---|
| 16 |  ; HLPDT("WAIT") - 'awaiting ack' status cutoff date
 | 
|---|
| 17 |  ; HLPDT("ERR")  - 'error' status cutoff date
 | 
|---|
| 18 |  ;                 (=0 means don't delete msgs in 'error' status)
 | 
|---|
| 19 |  ; HLPDT("ALL")  - all other status (except 'error') cutoff date
 | 
|---|
| 20 |  N HLPDT,HLTASK,HLEXIT
 | 
|---|
| 21 |  ;
 | 
|---|
| 22 |  S (HLTASK,HLEXIT)=0
 | 
|---|
| 23 |  D INIT(.HLPDT,.HLTASK,.HLEXIT) Q:HLEXIT
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  ; HL*1.6*109 lock logic...
 | 
|---|
| 26 |  L +^HL("HLUOPT1"):2 I '$T D:'$D(ZTQUEUED) LOCKTELL^HLUOPT4 QUIT  ;->
 | 
|---|
| 27 |  L -^HL("HLUOPT1") ; Locked again at the top of DQ
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  ; HL*1.6*109
 | 
|---|
| 30 |  I '$D(ZTQUEUED) I $$BTE^HLCSMON("Press RETURN to "_$S(HLTASK:"queue job",1:"start purging")_", or enter '^' to exit... ",1) D  QUIT  ;->
 | 
|---|
| 31 |  .  I HLTASK W "  no task started..."
 | 
|---|
| 32 |  .  I 'HLTASK W "  exiting..."
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  I HLTASK D TASKIT Q
 | 
|---|
| 35 |  K HLTASK,HLEXIT ; not needed
 | 
|---|
| 36 |  D DQ
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  Q
 | 
|---|
| 39 |  ;
 | 
|---|
| 40 | INIT(HLPDT,HLTASK,HLEXIT) ; Get data from file #869.3
 | 
|---|
| 41 |  D INIT^HLUOPT4 ; HL*1.6*109
 | 
|---|
| 42 |  Q
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 | TASKIT ; Queue task to run in the background
 | 
|---|
| 45 |  N ZTDESC,ZTDTH,ZTIO,ZTRTN,ZTSAVE
 | 
|---|
| 46 |  S ZTRTN="DQ^HLUOPT1",ZTIO="",ZTSAVE("HLPDT(")="",ZTDTH=$H
 | 
|---|
| 47 |  S ZTDESC="Purge HL7 message text on or before "_$$FMTE^XLFDT(HLPDT("COMP"),"5D")
 | 
|---|
| 48 |  D ^%ZTLOAD
 | 
|---|
| 49 |  I $D(ZTSK) W !,"  Task #",ZTSK," queued to run now...",! Q  ; HL*1.6*109
 | 
|---|
| 50 |  W !,"  Queuing of Purge task failed.",! ; HL*1.6*109
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 | DQ ; Entry point for running purge of HL7 message text
 | 
|---|
| 53 |  N HLDELCNT,HLEXIT,HLOOPCT
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  S HLOOPCT=0
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ; HL*1.6*109
 | 
|---|
| 58 |  N XTMP D XTMPBEGN^HLUOPT4
 | 
|---|
| 59 |  ;
 | 
|---|
| 60 |  ; Lock to ensures no other purge job can run...
 | 
|---|
| 61 |  L +^HL("HLUOPT1"):10 I '$T D  QUIT  ;->
 | 
|---|
| 62 |  .  D XTMPUPD^HLUOPT4(.XTMP,"NO-LOCK","DONE")
 | 
|---|
| 63 |  .  I $D(ZTQUEUED) S ZTREQ="@"
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  ; Purge 773s...
 | 
|---|
| 66 |  S (HLDELCNT,HLEXIT)=0
 | 
|---|
| 67 |  D CHK773(.HLPDT,.HLDELCNT,.HLEXIT)
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; Update piece 4 of file's zero node...
 | 
|---|
| 70 |  D UPDP4(773)
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ; Purge 772s...
 | 
|---|
| 73 |  I 'HLEXIT D CHK772(.HLPDT,.HLDELCNT,.HLEXIT)
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; Update piece 4 of file's zero node...
 | 
|---|
| 76 |  D UPDP4(772)
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ; HL*1.6*109
 | 
|---|
| 79 |  L -^HL("HLUOPT1")
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  D XTMPUPD^HLUOPT4(.XTMP,"FINISHED","DONE")
 | 
|---|
| 82 |  I $D(ZTQUEUED) S ZTREQ="@" Q
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  W !!,"  #",HLDELCNT," entries purged...",! ; HL*1.6*109
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  Q
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 | UPDP4(FNO) ; Update piece 4 of file's zero node...
 | 
|---|
| 89 |  N GBL,NODE,NODEL,P4
 | 
|---|
| 90 |  S GBL=$S(+FNO=772:"^HL(772,0)",+FNO=773:"^HLMA(0)",1:"") QUIT:GBL']""  ;->
 | 
|---|
| 91 |  S NODEL=$G(XTMP(+FNO,"DEL")) QUIT:NODEL'>0  ;->
 | 
|---|
| 92 |  L +@GBL:30 ; If don't get lock, update piece 4 anyway...
 | 
|---|
| 93 |  S NODE=$G(@GBL) ; Get node...
 | 
|---|
| 94 |  S P4=$P(NODE,U,4)-NODEL,P4=$S(P4>0:+P4,1:"") ; Recalc piece 4...
 | 
|---|
| 95 |  S $P(NODE,U,4)=P4 ; Reset node's piece 4...
 | 
|---|
| 96 |  S @GBL=NODE ; Store in file's zero node...
 | 
|---|
| 97 |  L -@GBL
 | 
|---|
| 98 |  Q
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 | CHK773(HLPDT,HLDELCNT,HLEXIT) ; Check file 773
 | 
|---|
| 101 |  N FPDATE,HLIEN,HLPTR,HLMADT,HLY,HLMADT1,HLLT773
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  ; HL*1.6*109
 | 
|---|
| 104 |  I '$G(HLTASK) W !,"Looping through file 773..."
 | 
|---|
| 105 |  D XTMPUPD^HLUOPT4(.XTMP,"RUNNING","START-773")
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;calculate cuttoff date for records reserved by Fast Purge - records with a more recent FAST PURGE DT/TM then this should be left to the Fast Purge to delete
 | 
|---|
| 108 |  S FPDATE=$$FMADD^XLFDT(DT,-2)
 | 
|---|
| 109 |  ;
 | 
|---|
| 110 |  S HLLT773=$O(^HLMA(";"),-1) ; last ien for 773
 | 
|---|
| 111 |  S HLIEN=0
 | 
|---|
| 112 |  F  S HLIEN=$O(^HLMA(HLIEN)) Q:'HLIEN  D  Q:HLEXIT  Q:$$FAIL(773)  ;HL*1.6*109
 | 
|---|
| 113 |  . D CHK4STOP(.HLEXIT) Q:HLEXIT
 | 
|---|
| 114 |  . S XTMP(773,"REV")=$G(XTMP(773,"REV"))+1,XTMP(773,"LAST")=HLIEN,XTMP(773,"FAIL")=$G(XTMP(773,"FAIL"))+1 ; HL*1.6*109
 | 
|---|
| 115 |  . ;
 | 
|---|
| 116 |  . ;check if the record is reserved for FAST PURGE
 | 
|---|
| 117 |  . I ($P($G(^HLMA(HLIEN,2)),"^",2)\1)>FPDATE Q
 | 
|---|
| 118 |  . ;
 | 
|---|
| 119 |  . S HLPTR=+$G(^HLMA(HLIEN,0)) Q:'HLPTR
 | 
|---|
| 120 |  . S HLMADT=+$G(^HL(772,HLPTR,0))
 | 
|---|
| 121 |  . ;HLY=status, HLMADT1=processed date
 | 
|---|
| 122 |  . S HLY=+$G(^HLMA(HLIEN,"P")),HLMADT1=+$G(^("S"))
 | 
|---|
| 123 |  . ;error status, quit if flag set to no
 | 
|---|
| 124 |  . I HLY>3,HLY<8,'HLPDT("ERR") Q
 | 
|---|
| 125 |  . ;check if date entered is less than purge all date
 | 
|---|
| 126 |  . I HLMADT<HLPDT("ALL") D KILL773(HLIEN,HLLT773,.HLDELCNT) Q
 | 
|---|
| 127 |  . ;pending, being generated, awaiting processing, or no processed date
 | 
|---|
| 128 |  . I HLY=1!(HLY>7)!('HLMADT1) Q
 | 
|---|
| 129 |  . ;awaiting ack, no purge date or date>purge date
 | 
|---|
| 130 |  . I HLY=2,HLMADT1>HLPDT("WAIT") Q
 | 
|---|
| 131 |  . ;successfully transmitted
 | 
|---|
| 132 |  . I HLY=3,HLMADT1>HLPDT("COMP") Q
 | 
|---|
| 133 |  . ;error status
 | 
|---|
| 134 |  . I HLY>3,HLY<8,HLMADT1>HLPDT("ERR") Q
 | 
|---|
| 135 |  . D KILL773(HLIEN,HLLT773,.HLDELCNT)
 | 
|---|
| 136 |  D XTMPUPD^HLUOPT4(.XTMP,"RUNNING","END-773") ; HL*1.6*109
 | 
|---|
| 137 |  Q
 | 
|---|
| 138 | KILL773(HLIEN,HLLT773,HLDELCNT) ; delete in file 773
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 |  ; quit if don't purge flag is set or the entry is the last one
 | 
|---|
| 141 |  Q:$G(^HLMA(HLIEN,2))!(HLIEN=HLLT773)
 | 
|---|
| 142 |  ;
 | 
|---|
| 143 |  S X=$G(^HLMA(+HLIEN,0)),X=+$G(^HL(772,+X,0)),XTMP(773,"LAST","TIME")=$S(X?7N1"."1.N:+X,1:"")
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  D DEL773^HLUOPT3(HLIEN) ; Purge w/direct kills...
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 |  S HLDELCNT=HLDELCNT+1
 | 
|---|
| 148 |  ;
 | 
|---|
| 149 |  S XTMP(773,"DEL")=$G(XTMP(773,"DEL"))+1,XTMP(773,"FAIL")=0
 | 
|---|
| 150 |  ;
 | 
|---|
| 151 |  Q
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | CHK772(HLPDT,HLDELCNT,HLEXIT) ; Check file 772 for parents and children
 | 
|---|
| 154 |  N FPDATE,HLOOP2,HLPTR,HLINK,HLIEN,HLMADT,HLY,HLLT772
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 |  ; HL*1.6*109
 | 
|---|
| 157 |  I '$G(HLTASK) W !,"Looping through file 772..."
 | 
|---|
| 158 |  D XTMPUPD^HLUOPT4(.XTMP,"RUNNING","START-772")
 | 
|---|
| 159 |  ;
 | 
|---|
| 160 |  ;calculate cuttoff date for records reserved by Fast Purge - records with a more recent FAST PURGE DT/TM then this should be left to the Fast Purge to delete
 | 
|---|
| 161 |  S FPDATE=$$FMADD^XLFDT(DT,-2)
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  S HLLT772=$O(^HL(772,";"),-1) ; last ien for 772
 | 
|---|
| 164 |  F HLOOP2=1:1:2 D  Q:HLEXIT  ; Kill children first, then parents
 | 
|---|
| 165 |  . S XTMP(772,"FAIL")=0 ; HL*1.6*109
 | 
|---|
| 166 |  . S HLPTR=0
 | 
|---|
| 167 |  . F  S HLPTR=$O(^HL(772,"B",HLPTR)) Q:HLPTR'>0  D  Q:HLEXIT  Q:$$FAIL(772)  ; HL*1.6*109
 | 
|---|
| 168 |  . . D CHK4STOP(.HLEXIT) Q:HLEXIT
 | 
|---|
| 169 |  . . S HLIEN=0
 | 
|---|
| 170 |  . . F  S HLIEN=$O(^HL(772,"B",HLPTR,HLIEN)) Q:'HLIEN  D
 | 
|---|
| 171 |  . . . S XTMP(772,"REV")=$G(XTMP(772,"REV"))+1,XTMP(772,"LAST")=HLIEN,XTMP(772,"FAIL")=$G(XTMP(772,"FAIL"))+1 ; HL*1.6*109
 | 
|---|
| 172 |  ... ;
 | 
|---|
| 173 |  ... ;check if the record is reserved for FAST PURGE
 | 
|---|
| 174 |  ... I ($P($G(^HL(772,+HLIEN,2)),"^",2)\1)>FPDATE Q
 | 
|---|
| 175 |  ... ;
 | 
|---|
| 176 |  . . . S HLMADT=+$G(^HL(772,+HLIEN,0)) Q:'HLMADT
 | 
|---|
| 177 |  . . . I HLMADT>HLPDT("COMP") Q
 | 
|---|
| 178 |  . . . S HLY=$P($G(^HL(772,HLIEN,"P")),U)
 | 
|---|
| 179 |  . . . I HLY?1U S HLY=$TR(HLY,"PASE",1234)
 | 
|---|
| 180 |  . . . I HLY>3,HLY<8,'HLPDT("ERR") Q
 | 
|---|
| 181 |  . . . I HLMADT<HLPDT("ALL") D KILL772(HLIEN,HLLT772,.HLDELCNT) Q
 | 
|---|
| 182 |  . . . I HLY=3,HLMADT>HLPDT("COMP") Q
 | 
|---|
| 183 |  . . . I HLY=2,HLMADT>HLPDT("WAIT") Q
 | 
|---|
| 184 |  . . . I HLY>3,HLY<8,HLMADT>HLPDT("ERR") Q
 | 
|---|
| 185 |  . . . I HLY=1!(HLY>7) Q
 | 
|---|
| 186 |  . . . I $O(^HL(772,"AI",HLIEN,HLIEN)) Q
 | 
|---|
| 187 |  . . . D KILL772(HLIEN,HLLT772,.HLDELCNT)
 | 
|---|
| 188 |  D XTMPUPD^HLUOPT4(.XTMP,"RUNNING","END-772") ; HL*1.6*109
 | 
|---|
| 189 |  S HLINK=0
 | 
|---|
| 190 |  F  S HLINK=$O(^HL(772,"A-XMIT-OUT",HLINK)) Q:'HLINK  D
 | 
|---|
| 191 |  . S HLIEN=0
 | 
|---|
| 192 |  . F  S HLIEN=$O(^HL(772,"A-XMIT-OUT",HLINK,HLIEN)) Q:'HLIEN  D
 | 
|---|
| 193 |  . . I '$D(^HL(772,HLIEN)) K ^HL(772,"A-XMIT-OUT",HLINK,HLIEN)
 | 
|---|
| 194 |  Q
 | 
|---|
| 195 | KILL772(HLIEN,HLLT772,HLDELCNT) ;
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 |  ; quit if the corresponding entry in #773 exists
 | 
|---|
| 198 |  I $O(^HLMA("B",HLIEN,0)) Q
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 |  ; quit if don't purge flag is set or the entry is the last one
 | 
|---|
| 201 |  Q:+$G(^HL(772,HLIEN,2))!(HLIEN=HLLT772)
 | 
|---|
| 202 |  ;
 | 
|---|
| 203 |  N XMDUZ,XMK,XMZ,DIK,DA,HLX
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 |  S HLX=$G(^HL(772,HLIEN,0))
 | 
|---|
| 206 |  S XMZ=$P(HLX,U,5)
 | 
|---|
| 207 |  I XMZ S XMK=1,XMDUZ=.5 D KLQ^XMA1B
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 |  S XTMP(772,"LAST","TIME")=$S(+HLX?7N1"."1.N:+HLX,1:"")
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 |  D DEL772^HLUOPT3(+HLIEN)
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 |  S HLDELCNT=HLDELCNT+1
 | 
|---|
| 214 |  S XTMP(772,"DEL")=$G(XTMP(772,"DEL"))+1,XTMP(772,"FAIL")=0 ; HL*1.6*109
 | 
|---|
| 215 |  ;
 | 
|---|
| 216 |  Q
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 | CHK4STOP(HLEXIT) ;
 | 
|---|
| 219 |  ; HL*1.6*109 modified from 60 to 120...
 | 
|---|
| 220 |  ;
 | 
|---|
| 221 |  S HLOOPCT=HLOOPCT+1
 | 
|---|
| 222 |  I '$D(ZTQUEUED) W:'(HLOOPCT#2000) "."
 | 
|---|
| 223 |  ;
 | 
|---|
| 224 |  S:$G(HLEXIT("LASTCHK"))']"" HLEXIT("LASTCHK")=$H
 | 
|---|
| 225 |  ;
 | 
|---|
| 226 |  Q:$$HDIFF^XLFDT($H,$G(HLEXIT("LASTCHK")),2)<120
 | 
|---|
| 227 |  ;
 | 
|---|
| 228 |  ; HL*1.6*109 modified...
 | 
|---|
| 229 |  I $$S^%ZTLOAD D  Q
 | 
|---|
| 230 |  .  S HLEXIT=1
 | 
|---|
| 231 |  .  D XTMPUPD^HLUOPT4(.XTMP,"ABORTED-TASKMAN","CHK4STOP")
 | 
|---|
| 232 |  ;
 | 
|---|
| 233 |  S HLEXIT("LASTCHK")=$H
 | 
|---|
| 234 |  ;
 | 
|---|
| 235 |  D XTMPUPD^HLUOPT4(.XTMP,"RUNNING","CHK4STOP") ; HL*1.6*109
 | 
|---|
| 236 |  ;
 | 
|---|
| 237 |  Q
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 | FAIL(FILE) ; Has number entries w/o purging any been exceeded?
 | 
|---|
| 240 |  QUIT $S($G(XTMP(FILE,"FAIL"))>200000:1,1:"")
 | 
|---|
| 241 |  ;
 | 
|---|