| 1 | QACMAIL0 ;ERC/WASHCIOFO-Send data to reposititory ;11/29/99
 | 
|---|
| 2 |  ;;2.0;Patient Representative;**4,14,15,17**;07/25/1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  N QACREQUE
 | 
|---|
| 5 |  D ZTDTH
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  Q
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 | TASK ;Set up tasking for routine.   Roll-up will be queued for
 | 
|---|
| 10 |  ; 01:30am, so that it doesn't run at a busy time of day.
 | 
|---|
| 11 |  S ZTRTN="START^QACMAIL0"
 | 
|---|
| 12 |  S ZTDESC="Routine collects data from local Patient Rep file for rollup"
 | 
|---|
| 13 |  S ZTDTH=QACSTART
 | 
|---|
| 14 |  S ZTSAVE("XMTXT")="",ZTSAVE("QACNOT")="",ZTSAVE("QACREQUE")=""
 | 
|---|
| 15 |  S ZTIO=""
 | 
|---|
| 16 |  F QAC1=1:1:20 D ^%ZTLOAD Q:$G(ZTSK)
 | 
|---|
| 17 |  I $G(ZTSK)']"" S QACERR=7 D ERROR
 | 
|---|
| 18 |  S DA=1,DR="754///^S X=ZTSK"
 | 
|---|
| 19 |  S DIE="^QA(740,"
 | 
|---|
| 20 |  D ^DIE K DIE
 | 
|---|
| 21 |  D EXIT
 | 
|---|
| 22 |  Q
 | 
|---|
| 23 | START ;
 | 
|---|
| 24 |  N QAC1,QACC,QACD,QACE,QACEE,QACF,QACHK,QACJ,QACK
 | 
|---|
| 25 |  N QA,QACBDAT,QACCONT,QACDOM,QACEDAT,QACELIG,QACEM,QACEMP
 | 
|---|
| 26 |  N QACERR,QACERROR,QACEXIT,QACINC,QACINTAP,QACLIN,QANLINE,QACLSAT,QACMADE
 | 
|---|
| 27 |  N QACMON,QACNO,QACNOCNT,QACNOT,QACQUIT,QACRST,QACSERV,QACSITE,QACSOR
 | 
|---|
| 28 |  N QACSR,QACSTA,QACST,QACTMP,QACVISN,QACVZ,QACYR,QACZERO
 | 
|---|
| 29 |  ;QACLCNT is message line count
 | 
|---|
| 30 |  ;QACRCNT is the number of records processed
 | 
|---|
| 31 |  ;QACCHCNT is a count of characters on the EMP line
 | 
|---|
| 32 |  ;QACTCNT is number of characters in message
 | 
|---|
| 33 |  ;QACNOCNT is the number of records not sent
 | 
|---|
| 34 |  N QACCHCNT,QACLCNT,QACNOCNT,QACRCNT,QACTCNT
 | 
|---|
| 35 |  S (QACCHCNT,QACLCNT,QACNOCNT,QACRCNT,QACTCNT)=0
 | 
|---|
| 36 |  ;set executable to cut down on keying
 | 
|---|
| 37 |  S QACINC="S QACTCNT=$G(QACTCNT)+$L($G(^TMP(""QAC MAIL"",$J,QACLCNT))),QACLCNT=$G(QACLCNT)+1"
 | 
|---|
| 38 |  K ^TMP("QAC MAIL",$J)
 | 
|---|
| 39 |  S QACEXIT=0
 | 
|---|
| 40 |  S QACZERO=$S($D(^QA(740,1,0))#2:^(0),1:0) I +QACZERO'>0 S QACERR=1 D ERROR G EXIT
 | 
|---|
| 41 |  S QACSITNO=+QACZERO
 | 
|---|
| 42 |  I $G(QACSITNO)]"" D VISN(QACSITNO)
 | 
|---|
| 43 |  S QACSTA="" D SITE^QACUTL0(+QACZERO,.QACSTA) I '$L(QACSTA) S QACERR=3 D ERROR G EXIT
 | 
|---|
| 44 |  ;reset ZTDTH, ^%ZTLOAD
 | 
|---|
| 45 |  I $G(QACREQUE)<1 D ZTDTH ;re-tasks job for next run
 | 
|---|
| 46 |  I $G(QACHK)=1 Q
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  I $G(QACREQUE)'=1 D LOOP^QACMAIL1
 | 
|---|
| 49 |  I $G(QACREQUE)=1 D REQLOOP
 | 
|---|
| 50 |  I $D(^TMP("QAC MAIL",$J)) D SEND
 | 
|---|
| 51 | EXIT ;
 | 
|---|
| 52 |  K ^TMP("QAC MAIL",$J)
 | 
|---|
| 53 |  K DIROUT,DIRUT
 | 
|---|
| 54 |  K QACDUZ,QACINT,QACMSG,QACNO,QACNOCNT
 | 
|---|
| 55 |  N QACQBEG,QACQEND,QACRCNT,QACREQUE,QACST,QACTCNT,QACVISN,QACZTSK
 | 
|---|
| 56 |  K X,X1,X2
 | 
|---|
| 57 |  K XMSUB,XMTEXT,XMY
 | 
|---|
| 58 |  K ZTDESC,ZTDTH,ZTRTN,ZTSAVE,ZTIO
 | 
|---|
| 59 |  Q
 | 
|---|
| 60 | ERROR ;
 | 
|---|
| 61 |  ; Need to send message with error codes if QACERR is set.
 | 
|---|
| 62 |  ; QACERR is set if site and domain information is missing
 | 
|---|
| 63 |  ; or if no task number assigned to queueing.
 | 
|---|
| 64 |  ; Then need to re-queue for next run.
 | 
|---|
| 65 |  D KILL^XM
 | 
|---|
| 66 |  S QACERROR(QACERR)=$P($T(ERR+QACERR),";;",2)
 | 
|---|
| 67 |  S XMTEXT="QACERROR("
 | 
|---|
| 68 |  S XMY("G.IRM")=""
 | 
|---|
| 69 |  S XMSUB="ERROR MSG FROM PATIENT REP DATABASE ROLLUP - PATCH QAC*2*4"
 | 
|---|
| 70 |  D ^XMD
 | 
|---|
| 71 |  D KILL^XM
 | 
|---|
| 72 |  K QACERROR(QACERR)
 | 
|---|
| 73 |  Q
 | 
|---|
| 74 | SEND ;Send message. 
 | 
|---|
| 75 |  ;This message is the roll-up.
 | 
|---|
| 76 |  S ^TMP("QAC MAIL",$J,QACLCNT)=^TMP("QAC MAIL",$J,QACLCNT)_"#"
 | 
|---|
| 77 |  D KILL^XM
 | 
|---|
| 78 |  S XMY("XXX@Q-PSS.MED.VA.GOV")=""
 | 
|---|
| 79 |  S XMSUB="QAC ROC LIST: "_^DD("SITE")_" ("_^DD("SITE",1)_")"
 | 
|---|
| 80 |  S XMTEXT="^TMP(""QAC MAIL"",$J,"
 | 
|---|
| 81 |  D ^XMD D KILL^XM
 | 
|---|
| 82 |  I $G(QACCONT)=1 S QACCONT=0 Q
 | 
|---|
| 83 |  D EXIT
 | 
|---|
| 84 |  Q
 | 
|---|
| 85 | ERR ;;Text for error messages to be included in mail message
 | 
|---|
| 86 |  ;;Site not found in QA Site Parameter file
 | 
|---|
| 87 |  ;;Site not found in Institute file
 | 
|---|
| 88 |  ;;Site number not found in Institution file
 | 
|---|
| 89 |  ;;Mail group not found in QA Site Parameter file
 | 
|---|
| 90 |  ;;Domain not found in QA Site Parameter file
 | 
|---|
| 91 |  ;;Domain not found in Domain file
 | 
|---|
| 92 |  ;;Message not sent - no task number
 | 
|---|
| 93 |  ;;No VISN number - primary VISN association not set up in Institution file
 | 
|---|
| 94 |  Q
 | 
|---|
| 95 | ZTDTH ;set the kernel ZTDTH variable for the first run and rescheduled runs.
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  H 20
 | 
|---|
| 98 |  D CHKTSK
 | 
|---|
| 99 |  I $G(QACHK)=1 Q
 | 
|---|
| 100 |  N %Y,QACSTART
 | 
|---|
| 101 |  S (X,X1)=DT
 | 
|---|
| 102 |  D H^%DTC
 | 
|---|
| 103 |  S X2=$S(%Y=0:2,%Y=6:3,1:1)
 | 
|---|
| 104 |  D C^%DTC
 | 
|---|
| 105 |  S QACSTART=X_".013"
 | 
|---|
| 106 |  D TASK
 | 
|---|
| 107 |  S DA=1
 | 
|---|
| 108 |  S DR="754///^S X=ZTSK"
 | 
|---|
| 109 |  S DIE="^QA(740,"
 | 
|---|
| 110 |  D ^DIE K DIE
 | 
|---|
| 111 |  Q
 | 
|---|
| 112 | NEWMSG ;send message, set variables for continuation message.
 | 
|---|
| 113 |  ;S (QACCHCNT,QACLCNT,QACRCNT,QACTCNT)=0
 | 
|---|
| 114 |  ;flag for continuation message - don't go to EXIT at end of SEND
 | 
|---|
| 115 |  S QACCONT=1
 | 
|---|
| 116 |  D SEND
 | 
|---|
| 117 |  S (QACCHCNT,QACLCNT,QACRCNT,QACTCNT)=0
 | 
|---|
| 118 |  K ^TMP("QAC MAIL")
 | 
|---|
| 119 |  Q
 | 
|---|
| 120 | ROLL(QACODE) ;set new Roll-Up Status field
 | 
|---|
| 121 |  ;if record is not being rolled up set field to "1" (Rejected).
 | 
|---|
| 122 |  ;if record is has been rolled up and is closed, set field to "0".
 | 
|---|
| 123 |  ;if record was sent, but status is still open, set to "2".
 | 
|---|
| 124 |  ;not used after QAC*2*17
 | 
|---|
| 125 |  N DA,DIE,DR
 | 
|---|
| 126 |  S DIE="^QA(745.1,"
 | 
|---|
| 127 |  S DA=QACJ
 | 
|---|
| 128 |  S DR="41///^S X=QACODE"
 | 
|---|
| 129 |  D ^DIE K DIE
 | 
|---|
| 130 |  Q
 | 
|---|
| 131 | REQUE ;this subroutine will task this extract once, for one month or for 
 | 
|---|
| 132 |  ;a portion of one month.
 | 
|---|
| 133 |  N QACREQUE
 | 
|---|
| 134 |  N QACCHCNT,QACLCNT,QACNOCNT,QACRCNT,QACTCNT
 | 
|---|
| 135 |  S (QACCHCNT,QACLCNT,QACNOCNT,QACRCNT,QACTCNT)=0
 | 
|---|
| 136 |  ;set re-queue flag so that task will not be re-tasked during this run
 | 
|---|
| 137 |  S QACREQUE=1
 | 
|---|
| 138 |  D START
 | 
|---|
| 139 |  Q
 | 
|---|
| 140 | VISN(QACSITNO) ;find VISN for this site
 | 
|---|
| 141 |  N QACV
 | 
|---|
| 142 |  I $D(^DIC(4,QACSITNO,7,0)) D PARENT^XUAF4("QACV",QACSITNO,"VISN")
 | 
|---|
| 143 |  I '$D(^DIC(4,QACSITNO,7,0)) S QACERR=8 S QACVISN=0 ;D ERROR Q
 | 
|---|
| 144 |  S QACVZ=$O(QACV("P",0))
 | 
|---|
| 145 |  I $G(QACVZ)]"" S QACVISN=$P(QACV("P",QACVZ),U)
 | 
|---|
| 146 |  I $G(QACVZ)']"" D
 | 
|---|
| 147 |  . S QACEE=0
 | 
|---|
| 148 |  . F  S QACEE=$O(^DIC(4,QACSITNO,7,QACEE)) Q:QACEE'>0  D
 | 
|---|
| 149 |  . . I +^DIC(4,QACSITNO,7,QACEE,0)'=1 Q
 | 
|---|
| 150 |  . . S QACVISN=$P(^DIC(4,QACSITNO,7,QACEE,0),U,2)
 | 
|---|
| 151 |  . . S QACVISN=$P($G(^DIC(4,QACVISN,0)),U)
 | 
|---|
| 152 |  I $G(QACVISN)']"" S QACERR=8
 | 
|---|
| 153 |  I $G(QACERR)=8 S QACVISN=0 D ERROR Q
 | 
|---|
| 154 |  I $G(QACVISN)["VISN " S QACVISN=$E(QACVISN,6,9)
 | 
|---|
| 155 |  Q
 | 
|---|
| 156 | CHKTSK ;check to see if this job has already been tasked (i.e. on an earlier 
 | 
|---|
| 157 |  ;installation, or if it has already started running).
 | 
|---|
| 158 |  S ZTSK=$P(^QA(740,1,"QAC"),U,5)
 | 
|---|
| 159 |  I $G(ZTSK)>0 D
 | 
|---|
| 160 |  . D STAT^%ZTLOAD
 | 
|---|
| 161 |  . I $G(ZTSK(1))=2 Q
 | 
|---|
| 162 |  . S QACZTSK=ZTSK K ZTSK S ZTSK=QACZTSK
 | 
|---|
| 163 |  . D ISQED^%ZTLOAD
 | 
|---|
| 164 |  . I $P($G(ZTSK("D")),",")>$P($H,",") S QACHK=1 Q
 | 
|---|
| 165 |  . I $P($G(ZTSK("D")),",")=$P($H,",") I $P(ZTSK("D"),",",2)>$P($H,",",2) S QACHK=1
 | 
|---|
| 166 |  Q
 | 
|---|
| 167 | REQLOOP ; this subroutine will run the rollup manually for a month or a part
 | 
|---|
| 168 |  ; of one month.
 | 
|---|
| 169 |  N Y
 | 
|---|
| 170 |  W !!,"This option will run the Patient Representative data roll-up"
 | 
|---|
| 171 |  W !,"for one month."
 | 
|---|
| 172 |  K %DT S %DT="AE",%DT("A")="Enter Month and Year: " D ^%DT
 | 
|---|
| 173 |  I Y'>0!(Y<2991000)!(Y>DT)!(+$E(Y,4,5)'>0) W !!,"Valid date not entered - exiting." Q
 | 
|---|
| 174 |  S QACQBEG=$E(Y,1,5)_"00"
 | 
|---|
| 175 |  S QACQEND=$E(Y,1,5)_"31"
 | 
|---|
| 176 |  S Y=QACQBEG D DD^%DT
 | 
|---|
| 177 |  I Y<0 W !!,"Invalid Date" Q
 | 
|---|
| 178 |  S QACMONTH=Y
 | 
|---|
| 179 |  S DIR(0)="Y"
 | 
|---|
| 180 |  S QACMONTH=Y
 | 
|---|
| 181 |  S DIR("A")="Would you like only a part of "_QACMONTH_"?"
 | 
|---|
| 182 |  S DIR("B")="NO"
 | 
|---|
| 183 |  S DIR("?")="Enter ""Y"" if to limit the date range, ""N"" if you want the whole month."
 | 
|---|
| 184 |  D ^DIR I $D(DIRUT)!($D(DIROUT)) Q
 | 
|---|
| 185 |  K QACFAIL
 | 
|---|
| 186 | REQLOOP1 I Y=1 D
 | 
|---|
| 187 |  . K DIR
 | 
|---|
| 188 |  . S DIR(0)="N^1:31"
 | 
|---|
| 189 |  . S DIR("A")="Enter the number of the earliest day."
 | 
|---|
| 190 |  . D ^DIR I $D(DIRUT)!($D(DIROUT)) Q
 | 
|---|
| 191 |  . S QACQBEG=$E(QACQBEG,1,5)_$S($L(+Y)<2:"0"_Y,1:Y)
 | 
|---|
| 192 |  . S DIR("A")="Enter the number of the last day."
 | 
|---|
| 193 |  . D ^DIR I $D(DIRUT)!($D(DIROUT)) Q
 | 
|---|
| 194 |  . S QACQEND=$E(QACQEND,1,5)_$S($L(+Y)<2:"0"_Y,1:Y)
 | 
|---|
| 195 |  . I QACQBEG>QACQEND S QACFAIL=1 W !!,"End date must be later than beginning date."
 | 
|---|
| 196 |  I $G(QACFAIL)=1 K QACFAIL S QACQBEG=$E(QACQBEG,1,5)_"00",QACQEND=$E(QACQEND,1,5)_"32" S Y=1 G REQLOOP1
 | 
|---|
| 197 |  N QACA,QACJ,QACOUNT
 | 
|---|
| 198 |  S QACOUNT=0
 | 
|---|
| 199 |  S QACQBEG=QACQBEG-.001
 | 
|---|
| 200 |  S QACA=QACQBEG
 | 
|---|
| 201 |  S QACQEND=QACQEND_.999
 | 
|---|
| 202 |  F  S QACA=$O(^QA(745.1,"D",QACA)) Q:QACA'>0!($G(QACOUNT)>700)!(QACA>QACQEND)  D
 | 
|---|
| 203 |  . S QACJ=""
 | 
|---|
| 204 |  . F  S QACJ=$O(^QA(745.1,"D",QACA,QACJ)) Q:QACJ'>0  D
 | 
|---|
| 205 |  . . D NODE0^QACMAIL1
 | 
|---|
| 206 |  . . I $D(^QA(745.1,QACJ,3,0)),($P(^QA(745.1,QACJ,3,0),U,3)>0) S QACOUNT=QACOUNT+1
 | 
|---|
| 207 |  I $G(QACOUNT)=0 W !!,"No Contacts for this date range." Q
 | 
|---|
| 208 |  D SITEMSG(QACOUNT,QACMONTH)
 | 
|---|
| 209 |  I $G(QACOUNT)>0 W !!,"Number of records transmitted to the national database - "_QACOUNT
 | 
|---|
| 210 |  W !!,"End of Manual Rollup Option."
 | 
|---|
| 211 |  Q
 | 
|---|
| 212 | SITEMSG(QACOUNT,QACMONTH) ;sends a message with the number of records 
 | 
|---|
| 213 |  ;sent from the manual option
 | 
|---|
| 214 |  D KILL^XM
 | 
|---|
| 215 |  S QACDUZ=$P(^VA(200,DUZ,0),U)
 | 
|---|
| 216 |  S XMY(QACDUZ)=""
 | 
|---|
| 217 |  S XMSUB="MANUAL ROLLUP STATUS"
 | 
|---|
| 218 |  S QACMSG(1)="Manual Rollup for "_QACMONTH_"."
 | 
|---|
| 219 |  S QACMSG(2)="Total number of records sent: "_QACOUNT
 | 
|---|
| 220 |  S XMTEXT="QACMSG("
 | 
|---|
| 221 |  D ^XMD D KILL^XM
 | 
|---|
| 222 |  Q
 | 
|---|