| 1 | ECXUTLA ;ALB/JAP - Utilities for Audit Reports ;Sep 25, 1997 | 
|---|
| 2 | ;;3.0;DSS EXTRACTS;**8,14**;Dec 22, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | AUDIT(ECXHEAD,ECXERR,ECXARRAY,ECXAUD) ;set audit report parameters | 
|---|
| 5 | ;   input | 
|---|
| 6 | ;   ECXHEAD  = extract HEADER CODE (required) | 
|---|
| 7 | ;              (from file #727.1, field #7) | 
|---|
| 8 | ;   ECXERR   = passed-by-reference variable (required) | 
|---|
| 9 | ;   ECXARRAY = passed-by-reference array (required) | 
|---|
| 10 | ;   ECXAUD   = 0/1 (optional) | 
|---|
| 11 | ;              0 --> extract audit (default) | 
|---|
| 12 | ;              1 --> SAS audit | 
|---|
| 13 | ;   output | 
|---|
| 14 | ;   ECXARRAY = array of audit parameters | 
|---|
| 15 | ;              ECXARRAY("DEF")     = ien of extract type in file #727.1 | 
|---|
| 16 | ;              ECXARRAY("TYPE")    = print name for extract; field #7 in file #727.1 | 
|---|
| 17 | ;              ECXARRAY("EXTRACT") = ien of extract in file #727 | 
|---|
| 18 | ;              ECXARRAY("START")   = start date for extract audit | 
|---|
| 19 | ;              ECXARRAY("END")     = end date for extract audit | 
|---|
| 20 | ;              ECXARRAY("ERUN")    = date on which extract was generated | 
|---|
| 21 | ;              ECXARRAY("DIV")     = ien of station if file #4 | 
|---|
| 22 | ;   error CODE | 
|---|
| 23 | ;   ECXERR   = 1, if input problem occurs | 
|---|
| 24 | ;              0, otherwise | 
|---|
| 25 | ; | 
|---|
| 26 | N X,Y,N,DA,DIC,DIQ,DIR,DTOUT,DUOUT,DIRUT,ECXDA,ECXTYPE,ECXSTART,ECXEND,ECXARR | 
|---|
| 27 | S ECXERR=0 | 
|---|
| 28 | S N=$O(^ECX(727.1,"C",ECXHEAD,"")) S:N="" ECXERR=1 | 
|---|
| 29 | Q:ECXERR | 
|---|
| 30 | S DIC="^ECX(727.1,",DIC(0)="NZ",X=N | 
|---|
| 31 | D ^DIC I Y=-1 S ECXERR=1 Q | 
|---|
| 32 | S ECXTYPE=$P(Y(0),U,7)_U_+Y K X,Y,DIC | 
|---|
| 33 | I $G(ECXAUD)=1,ECXHEAD'="DEN",ECXHEAD'="PRE",ECXHEAD'="RAD",ECXHEAD'="SUR" S ECXERR=1 | 
|---|
| 34 | Q:ECXERR | 
|---|
| 35 | S DIC="^ECX(727,",DIC(0)="AEMQ",DIC("S")="I $P(^(0),U,3)=$P(ECXTYPE,U),'$D(^(""PURG""))" | 
|---|
| 36 | D ^DIC | 
|---|
| 37 | I Y=-1!($G(DUOUT))!($G(DTOUT)) S ECXERR=1 Q | 
|---|
| 38 | S DIC="^ECX(727,",(DA,ECXDA)=+Y,DR=".01;1;2;3;4;5;15;300",DIQ="ECXARR",DIQ(0)="IE" | 
|---|
| 39 | D EN^DIQ1 | 
|---|
| 40 | W !!,?5,"Extract:      ",ECXARR(727,ECXDA,2,"E")," #",ECXDA | 
|---|
| 41 | W !!,?5,"Start date:   ",ECXARR(727,ECXDA,3,"E") | 
|---|
| 42 | W !,?5,"End date:     ",ECXARR(727,ECXDA,4,"E") | 
|---|
| 43 | W !,?5,"# of Records: ",ECXARR(727,ECXDA,5,"E") | 
|---|
| 44 | I ECXHEAD="PRO" W !,?5,"Station:      ",ECXARR(727,ECXDA,15,"E") | 
|---|
| 45 | ;if transmit date exists, then ask user if audit still needed | 
|---|
| 46 | I $L(ECXARR(727,ECXDA,300,"E"))>0 D | 
|---|
| 47 | .W !!,?5,"The extract which you have chosen to audit" | 
|---|
| 48 | .W !,?5,"was transmitted to AAC/DSS on ",ECXARR(727,ECXDA,300,"E"),".",! | 
|---|
| 49 | .S DIR(0)="Y",DIR("A")="Do you want to continue with this audit report",DIR("B")="NO" D ^DIR | 
|---|
| 50 | .S:$G(DIRUT) ECXERR=1 S:Y=0 ECXERR=1 | 
|---|
| 51 | Q:ECXERR | 
|---|
| 52 | ;setup the return array | 
|---|
| 53 | S ECXARRAY("EXTRACT")=ECXARR(727,ECXDA,.01,"E"),ECXARRAY("DIV")=ECXARR(727,ECXDA,15,"I"),ECXARRAY("TYPE")=$P(ECXTYPE,U),ECXARRAY("DEF")=$P(ECXTYPE,U,2) | 
|---|
| 54 | S ECXARRAY("START")=ECXARR(727,ECXDA,3,"E"),ECXARRAY("END")=ECXARR(727,ECXDA,4,"E"),ECXARRAY("ERUN")=ECXARR(727,ECXDA,1,"E") | 
|---|
| 55 | ;determine date range only for extract audit reports | 
|---|
| 56 | I $G(ECXAUD)=0 D | 
|---|
| 57 | .S ECXSTART=ECXARRAY("START"),ECXEND=ECXARRAY("END") D RANGE^ECXUTLA(.ECXSTART,.ECXEND,.ECXERR) | 
|---|
| 58 | .I ECXERR K ECXARRAY | 
|---|
| 59 | .Q:ECXERR | 
|---|
| 60 | .S ECXARRAY("START")=ECXSTART,ECXARRAY("END")=ECXEND | 
|---|
| 61 | Q | 
|---|
| 62 | ; | 
|---|
| 63 | RANGE(ECXSTART,ECXEND,ECXERR) ;determine date range for extract audit report | 
|---|
| 64 | ;   input | 
|---|
| 65 | ;   ECXSTART = start date of extract in file #727 (required) | 
|---|
| 66 | ;              passed by reference | 
|---|
| 67 | ;   ECXEND   = end date of extract in file #727 (required) | 
|---|
| 68 | ;              passed by reference | 
|---|
| 69 | ;   ECXERR   = passed by reference (required) | 
|---|
| 70 | ;   output | 
|---|
| 71 | ;   ECXSTART = user selected start date | 
|---|
| 72 | ;   ECXEND   = user selected end date | 
|---|
| 73 | ;   error CODE | 
|---|
| 74 | ;   ECXERR   = 1, if input problem occurs | 
|---|
| 75 | ;              0, otherwise | 
|---|
| 76 | ; | 
|---|
| 77 | ; | 
|---|
| 78 | ;convert dates to internal format | 
|---|
| 79 | N DATEA,DATEB,X,Y,%DT,DTOUT,OUT | 
|---|
| 80 | S (ECXERR,OUT)=0 | 
|---|
| 81 | S X=ECXSTART D ^%DT S DATEA=Y | 
|---|
| 82 | S X=ECXEND D ^%DT S DATEB=Y | 
|---|
| 83 | ;allow user to select start date | 
|---|
| 84 | ;can't be less than ecxstart or greater than ecxend | 
|---|
| 85 | W !!,?5,"You can narrow the date range, if you wish.",! | 
|---|
| 86 | W !,?5,"The Start Date can't be earlier than ",ECXSTART,"," | 
|---|
| 87 | W !,?5,"or later than ",ECXEND,".",! | 
|---|
| 88 | F  Q:OUT!ECXERR  D | 
|---|
| 89 | .S %DT="AEX",%DT("A")="Select Start Date: ",%DT("B")=ECXSTART,%DT(0)=DATEA | 
|---|
| 90 | .D ^%DT S:Y=-1 ECXERR=1 S:$G(DTOUT) ECXERR=1 | 
|---|
| 91 | .Q:ECXERR | 
|---|
| 92 | .I Y>DATEB D  Q | 
|---|
| 93 | ..W !,?5,"But that's later than ",ECXEND,"...try again.",! | 
|---|
| 94 | .S DATEA=Y,OUT=1 | 
|---|
| 95 | I ECXERR K ECXSTART,ECXEND | 
|---|
| 96 | Q:ECXERR | 
|---|
| 97 | S Y=DATEA D DD^%DT S ECXSTART=Y | 
|---|
| 98 | ;allow user to select end date | 
|---|
| 99 | ;can't be less than ecxstart or greater than ecxend | 
|---|
| 100 | W !!,?5,"The End Date can't be earlier than ",ECXSTART | 
|---|
| 101 | W !,?5,"(the Start Date you selected), or later than ",ECXEND,".",! | 
|---|
| 102 | S OUT=0 | 
|---|
| 103 | F  Q:OUT!ECXERR  D | 
|---|
| 104 | .S %DT="AEX",%DT("A")="Select End Date: ",%DT("B")=ECXEND,%DT(0)=-DATEB | 
|---|
| 105 | .D ^%DT S:Y=-1 ECXERR=1 S:$G(DTOUT) ECXERR=1 | 
|---|
| 106 | .Q:ECXERR | 
|---|
| 107 | .I Y<DATEA D  Q | 
|---|
| 108 | ..W !,?5,"But that's earlier than ",ECXSTART,"...try again.",! | 
|---|
| 109 | .S DATEB=Y,OUT=1 | 
|---|
| 110 | I ECXERR K ECXSTART,ECXEND | 
|---|
| 111 | Q:ECXERR | 
|---|
| 112 | S Y=DATEB D DD^%DT S ECXEND=Y | 
|---|
| 113 | Q | 
|---|
| 114 | ; | 
|---|
| 115 | DEVICE(ZTRTN,ZTDESC,ZTSAVE) ;get print device and optionally task to background | 
|---|
| 116 | ;   input | 
|---|
| 117 | ;   ZTRTN  = line^routine; task entry point (required) | 
|---|
| 118 | ;            variable for %ZTLOAD | 
|---|
| 119 | ;   ZTDESC = task description (required) | 
|---|
| 120 | ;            variable for %ZTLOAD | 
|---|
| 121 | ;   ZTSAVE = array; passed by reference (required) | 
|---|
| 122 | ;            variables for %ZTLOAD | 
|---|
| 123 | ;   output | 
|---|
| 124 | ;   ZTSAVE = returns ZTSAVE("POP"),ZTSAVE("ZTSK") | 
|---|
| 125 | ; | 
|---|
| 126 | N POP,ZTSK | 
|---|
| 127 | S ZTSAVE("POP")=0,ZTSAVE("ZTSK")=0 | 
|---|
| 128 | ;return ztsave("pop")=1 and quit if required input not available | 
|---|
| 129 | I '$L(ZTRTN)!('$L(ZTDESC))!('$D(ZTSAVE)) S ZTSAVE("POP")=1 Q | 
|---|
| 130 | ;get print device | 
|---|
| 131 | K IO("Q") S %ZIS="QM" D ^%ZIS | 
|---|
| 132 | S ZTSAVE("POP")=POP | 
|---|
| 133 | I POP D | 
|---|
| 134 | .W !,"No device selected...exiting.",! | 
|---|
| 135 | Q:POP | 
|---|
| 136 | I $D(IO("Q")) D | 
|---|
| 137 | .S ZTSAVE("ZTREQ")="@" | 
|---|
| 138 | .D ^%ZTLOAD | 
|---|
| 139 | .I $G(ZTSK)>0 D | 
|---|
| 140 | ..W !,"Request queued as Task #",ZTSK,".",! | 
|---|
| 141 | ..S ZTSAVE("ZTSK")=ZTSK | 
|---|
| 142 | ..S ZTSAVE("POP")=0 | 
|---|
| 143 | .I '$G(ZTSK) D | 
|---|
| 144 | ..W !,"Request to queue cancelled...exiting.",! | 
|---|
| 145 | ..S ZTSAVE("ZTSK")=0 | 
|---|
| 146 | ..S ZTSAVE("POP")=1 | 
|---|
| 147 | Q | 
|---|
| 148 | ; | 
|---|
| 149 | WARDS(ECXALL,ECXDIV) ;get wards for selected divisions | 
|---|
| 150 | ;   input | 
|---|
| 151 | ;   ECXALL = 1/0 (optional) | 
|---|
| 152 | ;            1==> user selected all divisions OR | 
|---|
| 153 | ;                 facility is non-divisional | 
|---|
| 154 | ;            0==> user selected some divisions | 
|---|
| 155 | ;            if ECXALL not defined, then assume 1 | 
|---|
| 156 | ;   ECXDIV = array of divisions selected (optional) | 
|---|
| 157 | ;            passed by reference array containing | 
|---|
| 158 | ;            selected divisions; | 
|---|
| 159 | ;            if ECXALL=1, then ECXDIV array isn't | 
|---|
| 160 | ;            required; information for all wards will be obtained | 
|---|
| 161 | ;            if ECXALL=0, then only wards for divisions in ECXDIV | 
|---|
| 162 | ;   output | 
|---|
| 163 | ;   ^TMP($J,"ECXWARD", contains ward name, division, g&l order | 
|---|
| 164 | ;   ^TMP($J,"ECXORDER", contains ward grouping info | 
|---|
| 165 | ; | 
|---|
| 166 | N IEN,WARD,ORDX,NAME,NM,ORDER,DIV,HIEN,GROUP,DATA,DEPT,NAMEDEPT | 
|---|
| 167 | K ^TMP($J,"ECXWARD"),^TMP($J,"ECXORDER") | 
|---|
| 168 | ;if ecxall not here, then set ecxall=1 | 
|---|
| 169 | S:'$D(ECXALL) ECXALL=1 S:ECXALL="" ECXALL=1 | 
|---|
| 170 | S ORDX=0,NM="" | 
|---|
| 171 | F  S NM=$O(^DIC(42,"B",NM)) Q:NM=""  S IEN=0 F  S IEN=$O(^DIC(42,"B",NM,IEN)) Q:IEN=""  D | 
|---|
| 172 | .S DIV=+$P(^DIC(42,IEN,0),U,11) Q:DIV=0 | 
|---|
| 173 | .I ECXALL=0,'$D(ECXDIV(DIV)) Q | 
|---|
| 174 | .S (NAME,ORDER,DEPT)="",NAME=$P(^DIC(42,IEN,0),U,1),ORDER=+$P($G(^DIC(42,IEN,"ORDER")),U,1),DEPT=$P($G(^ECX(727.4,IEN,0)),U,2) | 
|---|
| 175 | .;'unordered' ward is probably inactive, but get basic data anyway | 
|---|
| 176 | .I ORDER=0 S ORDX=ORDX+1,ORDER="99999"_ORDX,ORDER=+ORDER | 
|---|
| 177 | .;get this ward's ien in file #44; file #727.802 & #727.808 use pointers to file #44 | 
|---|
| 178 | .S HIEN=+$P($G(^DIC(42,IEN,44)),U,1) Q:HIEN=0 | 
|---|
| 179 | .;if this is last ward in group, then get the group name | 
|---|
| 180 | .K GROUP I $D(^DIC(42,IEN,1,1,0)) S GROUP=$P(^DIC(42,IEN,1,1,0),U,1) I GROUP="" K GROUP | 
|---|
| 181 | .S ^TMP($J,"ECXWARD",HIEN)=ORDER_U_NAME_U_DIV_U_IEN_U_DEPT | 
|---|
| 182 | .I $D(GROUP) S ^TMP($J,"ECXWARD",HIEN,1)=GROUP | 
|---|
| 183 | ;after all wards in file #42 are processed, arrange by g&l order | 
|---|
| 184 | S HIEN=0 | 
|---|
| 185 | F  S HIEN=$O(^TMP($J,"ECXWARD",HIEN)) Q:HIEN=""  S DATA=^TMP($J,"ECXWARD",HIEN) D | 
|---|
| 186 | .S ORDER=$P(DATA,U,1),NAME=$P(DATA,U,2),DIV=$P(DATA,U,3),DEPT=$P(DATA,U,5) | 
|---|
| 187 | .S NAMEDEPT=NAME S:DEPT]"" NAMEDEPT=NAME_" <"_DEPT_">" | 
|---|
| 188 | .S ^TMP($J,"ECXORDER",DIV,ORDER)=HIEN_U_NAMEDEPT_U | 
|---|
| 189 | .I $D(^TMP($J,"ECXWARD",HIEN,1)) S GROUP=^(1),^TMP($J,"ECXORDER",DIV,ORDER,1)=1_U_GROUP_U | 
|---|
| 190 | Q | 
|---|
| 191 | ; | 
|---|
| 192 | SASHEAD(ECXFL,ECXHEAD,ECXDIV,ECXARRAY,ECXPG,ECXTAB) ;header and page control | 
|---|
| 193 | ; | 
|---|
| 194 | ;   ECXFL   = feeder location (division) (required) | 
|---|
| 195 | ;   ECXHEAD = extract header from file #727.1 (required) | 
|---|
| 196 | ;   ECXDIV  = array of divisions selected (required) | 
|---|
| 197 | ;   ECXPG   = page number (required) | 
|---|
| 198 | ;   ECXTAB  = tab location; | 
|---|
| 199 | ;             allows for proper spacing in sub-header line (optional) | 
|---|
| 200 | ; | 
|---|
| 201 | N JJ,SS,LN | 
|---|
| 202 | S $P(LN,"-",80)="" | 
|---|
| 203 | I $G(ECXTAB)="" S ECXTAB=40 | 
|---|
| 204 | I $E(IOST)="C" D | 
|---|
| 205 | .S SS=22-$Y F JJ=1:1:SS W ! | 
|---|
| 206 | .I PG>0 S DIR(0)="E" W ! D ^DIR K DIR S:'Y QFLG=1 | 
|---|
| 207 | Q:QFLG | 
|---|
| 208 | W:$Y!($E(IOST)="C") @IOF S ECXPG=ECXPG+1 | 
|---|
| 209 | W !,"SAS Audit Report for "_ECXARRAY("TYPE")_" ("_ECXHEAD_") Extract" | 
|---|
| 210 | W !,"DSS Extract Log #:    "_ECXARRAY("EXTRACT") | 
|---|
| 211 | W !,"Date Range of Audit:  "_ECXARRAY("START")_" to "_ECXARRAY("END") | 
|---|
| 212 | W !,"Report Run Date/Time: "_ECXRUN | 
|---|
| 213 | I $D(ECXDIV(ECXFL)) W !,"Division/Site:        "_$P(ECXDIV(ECXFL),U,2)_" ("_ECXFL_")",?68,"Page: "_ECXPG | 
|---|
| 214 | I '$D(ECXDIV(ECXFL)) W !,"Division/Site:        "_"Unknown",?68,"Page: "_ECXPG | 
|---|
| 215 | W !!,"Feeder Location",?ECXTAB,"Feeder Key",?68,"Quantity" | 
|---|
| 216 | W !,LN,! | 
|---|
| 217 | Q | 
|---|