| 1 | PRSEEMP4 ;WIRMFO/JAH-STUDENT TRAINING REPORT BY SERVICE ;7/2/97
 | 
|---|
| 2 |  ;;4.0;PAID;**25**;Sep 21, 1995
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 5 | SORT(PRDA) ;
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  ;PRDA = ptr 2 file 200 from PAID EMPLOYEE file, (new person field).
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  I $E(IOST,1,2)="C-" S CLOCK=$$HUMDRUM^PRSLIB00(CLOCK,1)
 | 
|---|
| 10 |  ;
 | 
|---|
| 11 |  ;convert PRDA 2 name in file 200
 | 
|---|
| 12 |  S N1=$P($G(^VA(200,PRDA,0)),"^")
 | 
|---|
| 13 |  I N1="" D
 | 
|---|
| 14 |  .S N1="*"_EMPNAME,^TMP("EORM",$J,1)="* Names missing resolution from PAID EMPLOYEE file to the NEW PERSON file."
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  ;create 0 node 4 everyone whether they have data or not
 | 
|---|
| 17 |  S ^TMP($J,SERVIEN,CCORG,EMPIEN,0)="0^^"_N1
 | 
|---|
| 18 |  S SSN=$P($G(^VA(200,+PRDA,1)),U,9)
 | 
|---|
| 19 |  I SSN="" S $P(^TMP($J,SERVIEN,CCORG,EMPIEN,0),"^",2)=0
 | 
|---|
| 20 |  Q:SSN=""
 | 
|---|
| 21 |  S PRDA(1)=+$O(^PRSPC("SSN",SSN,0))
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ;get job code & find it's readable 4mat.
 | 
|---|
| 24 |  S PRSETL=""
 | 
|---|
| 25 |  ;job code = piece 17 of emp record or = 0 if no code is found.
 | 
|---|
| 26 |  S JOBCODE=$S($P($G(^PRSPC(PRDA(1),0)),U,17)'="":$P($G(^(0)),U,17),1:0)
 | 
|---|
| 27 |  ;store job code & readable 4mat 4 later output
 | 
|---|
| 28 |  S PRSETL=$$EN12^PRSEUTL2(JOBCODE)
 | 
|---|
| 29 |  S $P(^TMP($J,SERVIEN,CCORG,EMPIEN,0),"^",2)=JOBCODE
 | 
|---|
| 30 |  I JOBCODE S ^TMP("JOBS",$J,JOBCODE)=PRSETL
 | 
|---|
| 31 |  ;
 | 
|---|
| 32 |  ;sort thru X-ref corresponding 2 training user asked 2 c.
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  I PRSESEL="L" F PRSE="C","O","W" D SORT1(PRSE) ;all but mandatory
 | 
|---|
| 35 |  ;all but hospital wide OR all
 | 
|---|
| 36 |  I PRSESEL="H"!(PRSESEL="A") F PRSE="C","O","W","M" D SORT1(PRSE)
 | 
|---|
| 37 |  I PRSESEL'="A",PRSESEL'="L",PRSESEL'="H" D
 | 
|---|
| 38 |  . S PRSE=PRSESEL D SORT1(PRSE) ;single type
 | 
|---|
| 39 |  Q
 | 
|---|
| 40 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 41 | HWLIST ;build list of classes that are hospital wide
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  N SERV,MIIEN,CLSPTR,CLSMLT
 | 
|---|
| 44 |  ;VARIABLES
 | 
|---|
| 45 |  ;  HWIDE() - RETURNED:
 | 
|---|
| 46 |  ;          = Subscripted by name of the class. Value is entry #s.
 | 
|---|
| 47 |  ;  SERV = service name in file 454.1
 | 
|---|
| 48 |  ;  MIEN   = IEN in Mandatory Training Group file
 | 
|---|
| 49 |  ;  CLSPTR = Pointer to class file.
 | 
|---|
| 50 |  ;  CLSMLT = IENs in mandatory class multiple.
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 |  S MIEN=0
 | 
|---|
| 53 |  F  S MIEN=$O(^PRSE(452.3,MIEN))  Q:MIEN'>0  D
 | 
|---|
| 54 |  .  S SERV=$P($G(^PRSE(452.3,MIEN,0)),"^",2)
 | 
|---|
| 55 |  .  I SERV'="",$P($G(^PRSP(454.1,SERV,0)),"^",1)="MISCELLANEOUS" D
 | 
|---|
| 56 |  ..   S CLSMLT=0
 | 
|---|
| 57 |  ..   F  S CLSMLT=$O(^PRSE(452.3,MIEN,1,CLSMLT))  Q:CLSMLT'>0  D
 | 
|---|
| 58 |  ...     S CLSPTR=$G(^PRSE(452.3,MIEN,1,CLSMLT,0))
 | 
|---|
| 59 |  ...     I CLSPTR'="" S HWIDE(CLSPTR)=$P($G(^PRSE(452.1,CLSPTR,0)),"^",1)
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 62 | HASHLIST ;Reverse array list 4 faster hashing in sort routine.
 | 
|---|
| 63 |  ; i.e. change HWIDE(3)="DIVERSITY IN WP"... HWIDE("DIVERSITY IN WP")=3
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  S NODE=""
 | 
|---|
| 66 |  F  S NODE=$O(HWIDE(NODE))  Q:NODE'>0  D
 | 
|---|
| 67 |  .  I HWIDE(NODE)'="" S HWIDE(HWIDE(NODE))=NODE
 | 
|---|
| 68 |  .  K HWIDE(NODE)
 | 
|---|
| 69 |  Q
 | 
|---|
| 70 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 71 | SORT1(PRSE) ;Loop thru training data in AA x-ref & sort in2 ^TMP
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  ;   VARIABLES
 | 
|---|
| 74 |  ; COUNT      = # of classes, current type
 | 
|---|
| 75 |  ; CRS        = Course Title
 | 
|---|
| 76 |  ; CURR       = Current subtotl, all classes taken by employee
 | 
|---|
| 77 |  ; NCD        = Regular FM date
 | 
|---|
| 78 |  ; NCD1       = Inverse FileMan date
 | 
|---|
| 79 |  ; PRDA       = Employee's IEN in file 200.  (built into AA x-ref)
 | 
|---|
| 80 |  ; PRSE       = Type of training (mandatory, cont. educ)
 | 
|---|
| 81 |  ; PRSECLS(0) = Ien of course in the PROGRAM CLASS file
 | 
|---|
| 82 |  ; YRST,YREND = Start,end date range returned from DATSEL^PRSEUTL call.
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  N CRS,COUNT,CURR S COUNT=0
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  ;outer loop thru courses (CRS) of type PRSE taken by employee (PRDA)
 | 
|---|
| 87 |  S CRS=""
 | 
|---|
| 88 |  F  S CRS=$O(^PRSE(452,"AA",PRSE,PRDA,CRS))  Q:CRS=""  D
 | 
|---|
| 89 |  .   Q:'$D(^PRSE(452,"AA",PRSE,PRDA,CRS))
 | 
|---|
| 90 |  .;
 | 
|---|
| 91 |  .   ;screen out hospital wide classes if user selected "H"
 | 
|---|
| 92 |  .   I PRSESEL="H",$G(HWIDE(CRS))'="" Q
 | 
|---|
| 93 |  .;
 | 
|---|
| 94 |  .;  loop thru dates that student took this class
 | 
|---|
| 95 |  .   F NCD1=0:0 S NCD1=$O(^PRSE(452,"AA",PRSE,PRDA,CRS,NCD1)) Q:NCD1'>0  D
 | 
|---|
| 96 |  ..;   convert inverse FM date of class 2 FM date
 | 
|---|
| 97 |  ..    S NCD=(9999999.0000-NCD1)
 | 
|---|
| 98 |  ..;
 | 
|---|
| 99 |  ..;   get ien of the entry in the student education file.
 | 
|---|
| 100 |  ..    S DA(2)=$O(^PRSE(452,"AA",PRSE,PRDA,CRS,NCD1,0))
 | 
|---|
| 101 |  ..    Q:DA(2)'>0
 | 
|---|
| 102 |  ..    S:$G(NSORT)="" NSORT=1
 | 
|---|
| 103 |  ..;   
 | 
|---|
| 104 |  ..;   quit if the class is outside selected date range
 | 
|---|
| 105 |  ..    I (NCD>YREND)!(NCD<YRST) Q
 | 
|---|
| 106 |  ..;
 | 
|---|
| 107 |  ..    N X
 | 
|---|
| 108 |  ..    S PRDATA=$G(^PRSE(452,DA(2),0))
 | 
|---|
| 109 |  ..    S X=$G(^TMP($J,SERVIEN,CCORG,EMPIEN,"L",CRS))
 | 
|---|
| 110 |  ..    I X="" D
 | 
|---|
| 111 |  ...     S X=NSORT,NSORT=NSORT+1
 | 
|---|
| 112 |  ...     S ^TMP($J,SERVIEN,CCORG,EMPIEN,"L",CRS)=X
 | 
|---|
| 113 |  ..;
 | 
|---|
| 114 |  ..;   get ien of course in the PROGRAM CLASS file
 | 
|---|
| 115 |  ..    S PRSECLS(0)=+$O(^PRSE(452.1,"B",CRS,0))
 | 
|---|
| 116 |  ..;
 | 
|---|
| 117 |  ..;
 | 
|---|
| 118 |  ..    S ^TMP($J,SERVIEN,CCORG,EMPIEN,"L1",X,N1,NCD,DA(2))=$S(+$G(PRSECLS(0))>0:$P($G(^PRSE(452.1,PRSECLS(0),0)),U,3),1:$P(PRDATA,U,16))_U_$P(PRDATA,U,6)_U_$P(PRDATA,U,10)_U_$P(PRDATA,U,21)
 | 
|---|
| 119 |  ..;
 | 
|---|
| 120 |  ..;incremnt employee 0 node. Check later 2 c if no training occured.
 | 
|---|
| 121 |  ..S COUNT=COUNT+1
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 |  ;add class count to employees node
 | 
|---|
| 124 |  S CURR=$P(^TMP($J,SERVIEN,CCORG,EMPIEN,0),"^")
 | 
|---|
| 125 |  S $P(^TMP($J,SERVIEN,CCORG,EMPIEN,0),"^",1)=CURR+COUNT
 | 
|---|
| 126 |  Q
 | 
|---|
| 127 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 | OUTPUT(PRDA,POUT,JOBCODE,EMPNAME) ;
 | 
|---|
| 130 |  ;routine loops thru tmp global, prints classes 4 1 employee.
 | 
|---|
| 131 |  N PRHLOC S POUT=0
 | 
|---|
| 132 |  ;
 | 
|---|
| 133 |  ;If class counter for employee is 0, write message and quit
 | 
|---|
| 134 |  I $P(^TMP($J,SERVIEN,CCORG,EMPIEN,0),"^",1)=0 D  Q
 | 
|---|
| 135 |  .  D NHDR^PRSEEMP4(JOBCODE,.POUT)
 | 
|---|
| 136 |  .  W !,"NO DATA FOR EMPLOYEE: ",EMPNAME
 | 
|---|
| 137 |  .  W:$G(PRSECLS)]"" !,"CLASS: ",PRSECLS
 | 
|---|
| 138 |  ;
 | 
|---|
| 139 |  D NHDR^PRSEEMP4(JOBCODE,.POUT)
 | 
|---|
| 140 |  ;
 | 
|---|
| 141 |  S NIC=""
 | 
|---|
| 142 |  F  S NIC=$O(^TMP($J,SERVIEN,CCORG,EMPIEN,"L",NIC)) Q:NIC=""!POUT  S NSORT=$G(^TMP($J,SERVIEN,CCORG,EMPIEN,"L",NIC)),HOLD=1 D:NSORT
 | 
|---|
| 143 |  .;
 | 
|---|
| 144 |  .  S N1=""
 | 
|---|
| 145 |  .  F  S N1=$O(^TMP($J,SERVIEN,CCORG,EMPIEN,"L1",NSORT,N1)) Q:N1=""!POUT  D
 | 
|---|
| 146 |  ..   S NCD=""
 | 
|---|
| 147 |  ..   F  S NCD=$O(^TMP($J,SERVIEN,CCORG,EMPIEN,"L1",NSORT,N1,NCD)) Q:NCD=""!POUT  D
 | 
|---|
| 148 |  ...    S DA=$O(^TMP($J,SERVIEN,CCORG,EMPIEN,"L1",NSORT,N1,NCD,0))
 | 
|---|
| 149 |  ...    Q:DA'>0
 | 
|---|
| 150 |  ...    I ('(NSW1>0)!($Y>(IOSL-7))) D NHDR(JOBCODE,.POUT) Q:POUT
 | 
|---|
| 151 |  ...    S PCOUNT=PCOUNT+1
 | 
|---|
| 152 |  ...    S PRDATA=$G(^TMP($J,SERVIEN,CCORG,EMPIEN,"L1",NSORT,N1,NCD,DA))
 | 
|---|
| 153 |  ...    S PHRS=(PHRS+$P(PRDATA,U))
 | 
|---|
| 154 |  ...    I $P(PRDATA,U,4)="C" D
 | 
|---|
| 155 |  ....     S PHRS("CEU")=(PHRS("CEU")+$P(PRDATA,U,2))
 | 
|---|
| 156 |  ....     S PHRS("CON")=(PHRS("CON")+$P(PRDATA,U,3))
 | 
|---|
| 157 |  ...    I HOLD=1 D
 | 
|---|
| 158 |  ....     W !,$S(PRSE132:NIC,1:$E(NIC,1,25))
 | 
|---|
| 159 |  ....     W:$P($G(^PRSE(452,DA,6)),U,2)'="" ?$S(PRSE132:55,1:27),$E($P(^(6),U,2),1,25)
 | 
|---|
| 160 |  ....     W ?$S(PRSE132:93,1:47),"Length: "
 | 
|---|
| 161 |  ....     W $S($P(PRDATA,U)>0:$J($P(PRDATA,U),4,2),1:"")
 | 
|---|
| 162 |  ....     S HOLD=0
 | 
|---|
| 163 |  ...    S Y=$E(NCD,1,7) D:+Y D^DIQ W ?$S(PRSE132:114,1:67),$P(Y,"@"),!
 | 
|---|
| 164 |  ...    I $P(PRDATA,U,4)="C" W ?1,"CEUs: ",+$P(PRDATA,U,2),?$S(PRSE132:88,1:42),"Contact HRS: ",$J($P(PRDATA,U,3),4,2)
 | 
|---|
| 165 |  ...    Q
 | 
|---|
| 166 |  .  S HOLD=1 Q
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  Q:POUT
 | 
|---|
| 169 |  W !,$$REPEAT^XLFSTR("-",$G(IOM))
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 |  ;Output totals 4 1 employee.
 | 
|---|
| 172 |  W !,?1,"Total Classes: ",PCOUNT,?$S(PRSE132:78,1:35)
 | 
|---|
| 173 |  W "Total Length/Hours:",$J(PHRS,7,2)
 | 
|---|
| 174 |  ;
 | 
|---|
| 175 |  ;Display CEU totals if type of training sort criteria 
 | 
|---|
| 176 |  ;contains CEU classes.
 | 
|---|
| 177 |  I CEU D
 | 
|---|
| 178 |  . W !,?4,"Total CEUs:",$J(PHRS("CEU"),6,2),?$S(PRSE132:77,1:34)
 | 
|---|
| 179 |  . W "Total Contact Hours:",$J(PHRS("CON"),7,2)
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 |  W !,$$REPEAT^XLFSTR("-",$G(IOM))
 | 
|---|
| 182 |  ;
 | 
|---|
| 183 |  Q
 | 
|---|
| 184 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 185 | NHDR(JOBCODE,POUT) ;
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  ;  NPC = page counter.
 | 
|---|
| 188 |  ;
 | 
|---|
| 189 |  S POUT=0
 | 
|---|
| 190 |  N Z S Z=PRSESEL
 | 
|---|
| 191 |  ;start a new page and a full header.
 | 
|---|
| 192 |  I $E(IOST,1,2)="C-" S POUT=$$ASK^PRSLIB00() Q:POUT
 | 
|---|
| 193 |  W @IOF S NPC=NPC+1
 | 
|---|
| 194 |  S PTAB=IOM-9
 | 
|---|
| 195 |  W $S(Z="L":"ALL BUT MANDATORY",Z="H":"ALL BUT HOSPITAL WIDE MANDATORY",Z="C":"C.E.",Z="M":"M.I.",Z="O":"OTHER",Z="W":"WARD",1:"COMPLETE")
 | 
|---|
| 196 |  W " TRAINING REPORT FOR "
 | 
|---|
| 197 |  W $S(TYP="C":"CY ",TYP="F":"FY ",1:" ")
 | 
|---|
| 198 |  W $S(TYP="C"!(TYP="F"):$G(PYR),1:$G(YRST(1))_" - "_$G(YREND(1)))
 | 
|---|
| 199 |  W ?PTAB,"PAGE: ",NPC
 | 
|---|
| 200 |  W !
 | 
|---|
| 201 |  W "Service: ",$S(PRSE132:SERVICE,1:$E(SERVICE,1,16))
 | 
|---|
| 202 |  W "  Cost Ctr./Org.: ",$E(CCORG,1,4),":",$E(CCORG,5,8)
 | 
|---|
| 203 |  S Y=REPDT D:+Y D^DIQ W ?(IOM-13),Y
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 |  ;print employees name and title portion of header
 | 
|---|
| 206 |  W !,"Name: ",$S(PRSE132:EMPNAME,1:$E(EMPNAME,1,20))
 | 
|---|
| 207 |  W "  Title: "
 | 
|---|
| 208 |  ;decipher job code from temporary table
 | 
|---|
| 209 |  S PRSETL=$G(^TMP("JOBS",$J,JOBCODE))
 | 
|---|
| 210 |  W $S(PRSETL="":"<Unknown>",1:$S(PRSE132:$E(PRSETL,1,40),1:$E(PRSETL,1,20)))
 | 
|---|
| 211 |  I PRSE132 D
 | 
|---|
| 212 |  .W !,"Class Name",?55,"Class Presenter",?114,"Date"
 | 
|---|
| 213 |  E  D
 | 
|---|
| 214 |  .W !,"Class Name",?30,"Class Presenter",?67,"Date"
 | 
|---|
| 215 |  S NI="",$P(NI,"-",$S(PRSE132:133,1:81))=""
 | 
|---|
| 216 |  W !,NI
 | 
|---|
| 217 |  Q:$O(^TMP($J,SERVIEN,CCORG,EMPIEN,"L",""))=""
 | 
|---|
| 218 |  S (HOLD,NSW1)=1
 | 
|---|
| 219 |  Q
 | 
|---|
| 220 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|
| 221 | EXIT K ^TMP($J),^TMP("JOBS",$J),^TMP("EORM",$J) D CLOSE^PRSEUTL,^PRSEKILL
 | 
|---|
| 222 |  Q
 | 
|---|
| 223 |  ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
|---|