| 1 | SCMCLK ;bp/cmf - Preceptor History Functions ; Sep 1999 | 
|---|
| 2 | ;;5.3;Scheduling;**177,204**;AUG 13, 1993 | 
|---|
| 3 | ; | 
|---|
| 4 | ; - $$OKPREC functions | 
|---|
| 5 | ;        - input variables (required) | 
|---|
| 6 | ;               scien    := pointer to 404.57 (precepted ien) | 
|---|
| 7 | ;               scpien   := pointer to 404.57 (preceptor ien) | 
|---|
| 8 | ;               sclnkdt  := date to test | 
|---|
| 9 | ;        - output | 
|---|
| 10 | ;               $p1      := 1=assignment ok | 
|---|
| 11 | ;                           0=not | 
|---|
| 12 | ;               $p2      := if not, reason code | 
|---|
| 13 | ;               $p3      := if not, reason | 
|---|
| 14 | ; | 
|---|
| 15 | OKPREC(SCIEN,SCPIEN,SCLNKDT) ; | 
|---|
| 16 | ; | 
|---|
| 17 | S SCIEN=+$G(SCIEN,0) | 
|---|
| 18 | S SCPIEN=+$G(SCPIEN,0) | 
|---|
| 19 | S SCLNKDT=+$G(SCLNKDT,0) | 
|---|
| 20 | I (SCIEN<1)!(SCPIEN<1)!(SCLNKDT<1) Q $$S(8) | 
|---|
| 21 | ; | 
|---|
| 22 | I SCIEN=SCPIEN Q $$S(1) | 
|---|
| 23 | ; | 
|---|
| 24 | N SCX,SCY,SCPAH,SCPAHA | 
|---|
| 25 | I '$D(^SCTM(404.57,SCIEN,0)) Q $$S(8) | 
|---|
| 26 | S SCX=$G(^SCTM(404.57,SCIEN,0)) | 
|---|
| 27 | I '$D(^SCTM(404.57,SCPIEN,0)) Q $$S(8) | 
|---|
| 28 | S SCY=^SCTM(404.57,SCPIEN,0) | 
|---|
| 29 | I $P(SCX,U,2)'=$P(SCY,U,2) Q $$S(2) | 
|---|
| 30 | ; | 
|---|
| 31 | D DTARY(0) | 
|---|
| 32 | S SCPAH=$$VALHIST^SCAPMCU5(404.53,SCPIEN,"SCPAHA") | 
|---|
| 33 | I $$ACTHIST^SCAPMCU5("SCPAHA","SCLNKDT") Q $$S(3) | 
|---|
| 34 | ;I $$ACTHIST^SCAPMCU2(404.53,SCPIEN,"SCLNKDT") Q $$S(3) | 
|---|
| 35 | ; | 
|---|
| 36 | I '+$P(SCY,U,12) Q $$S(4) | 
|---|
| 37 | ; | 
|---|
| 38 | I +$P(SCX,U,4),'+$P(SCY,U,4) Q $$S(5) | 
|---|
| 39 | ; | 
|---|
| 40 | I $$ACTHIST^SCAPMCU2(404.59,SCPIEN,"SCLNKDT")<1 Q $$S(6) | 
|---|
| 41 | ; | 
|---|
| 42 | I $$CHKPRTP() Q $$S(9) | 
|---|
| 43 | ; | 
|---|
| 44 | Q 1 | 
|---|
| 45 | ; | 
|---|
| 46 | OKPREC1(SCPIEN,SCLNKDT) ; | 
|---|
| 47 | ;               ; prevent preceptor assignment danglers | 
|---|
| 48 | ;               ; should also return array of danglers, if any, | 
|---|
| 49 | ;               ; for a cleanup function, but not asked for yet | 
|---|
| 50 | ; | 
|---|
| 51 | ; | 
|---|
| 52 | S SCPIEN=+$G(SCPIEN,0) | 
|---|
| 53 | S SCLNKDT=+$G(SCLNKDT,0) | 
|---|
| 54 | I (SCPIEN<1)!(SCLNKDT<1) Q $$S(8) | 
|---|
| 55 | I '$D(^SCTM(404.53,"AD",SCPIEN)) Q 1 | 
|---|
| 56 | ; | 
|---|
| 57 | N SCX,SCN | 
|---|
| 58 | D DTARY(1) | 
|---|
| 59 | K ^TMP("SCPHIS",$J) | 
|---|
| 60 | S SCX=$$PRECHIS(SCPIEN,"SCLNKDT","^TMP(""SCPHIS"",$J)") | 
|---|
| 61 | K ^TMP("SCPHIS",$J) | 
|---|
| 62 | ; | 
|---|
| 63 | Q $S(SCX>0:$$S(7),1:1) | 
|---|
| 64 | ; | 
|---|
| 65 | OKPREC2(SCIEN,SCLNKDT) ; return preceptor ien^name, if any | 
|---|
| 66 | ;               ; used for computed field 306 of file 404.57 | 
|---|
| 67 | ; | 
|---|
| 68 | ; | 
|---|
| 69 | S SCIEN=+$G(SCIEN,0) | 
|---|
| 70 | S SCLNKDT=+$G(SCLNKDT,0) | 
|---|
| 71 | I (SCIEN<1)!(SCLNKDT<1) Q $$S(8) | 
|---|
| 72 | N SCX,SCP2,SCP3,SCPIEN,SCLNKLI,SCLNKER,SCPAH,SCPAHA | 
|---|
| 73 | D DTARY(0) | 
|---|
| 74 | S SCPAH=$$VALHIST^SCAPMCU5(404.53,SCIEN,"SCPAHA") | 
|---|
| 75 | S SCX=$$ACTHIST^SCAPMCU5("SCPAHA","SCLNKDT") | 
|---|
| 76 | ;S SCX=$$ACTHIST^SCAPMCU2(404.53,SCIEN,"SCLNKDT") | 
|---|
| 77 | I +SCX<1 Q "" | 
|---|
| 78 | S SCP2=$P(SCX,U,2) | 
|---|
| 79 | I +SCP2<1 Q "" | 
|---|
| 80 | S SCP3=$P(SCX,U,3) | 
|---|
| 81 | I '$D(^SCTM(404.53,SCP3,0)) Q $$S(8) | 
|---|
| 82 | S SCPIEN=$P(^SCTM(404.53,SCP3,0),U,6) | 
|---|
| 83 | Q $$GETPRTP^SCAPMCU2(SCPIEN,SCLNKDT) | 
|---|
| 84 | ; | 
|---|
| 85 | OKPREC3(SCIEN,SCLNKDT) ; return preceptor position ien^name, if any | 
|---|
| 86 | ;               ; used for computed field 305 of file 404.57 | 
|---|
| 87 | ; | 
|---|
| 88 | ; | 
|---|
| 89 | S SCIEN=+$G(SCIEN,0) | 
|---|
| 90 | S SCLNKDT=+$G(SCLNKDT,0) | 
|---|
| 91 | I (SCIEN<1)!(SCLNKDT<1) Q $$S(8) | 
|---|
| 92 | N SCX,SCP2,SCP3,SCPIEN,SCLNKER,SCPAH,SCPAHA | 
|---|
| 93 | D DTARY(0) | 
|---|
| 94 | S SCPAH=$$VALHIST^SCAPMCU5(404.53,SCIEN,"SCPAHA") | 
|---|
| 95 | S SCX=$$ACTHIST^SCAPMCU5("SCPAHA","SCLNKDT") | 
|---|
| 96 | ;S SCX=$$ACTHIST^SCAPMCU2(404.53,SCIEN,"SCLNKDT") | 
|---|
| 97 | I +SCX<1 Q "" | 
|---|
| 98 | S SCP2=$P(SCX,U,2) | 
|---|
| 99 | I +SCP2<1 Q "" | 
|---|
| 100 | S SCP3=$P(SCX,U,3) | 
|---|
| 101 | I '$D(^SCTM(404.53,SCP3,0)) Q $$S(8) | 
|---|
| 102 | S SCPIEN=$P(^SCTM(404.53,SCP3,0),U,6) | 
|---|
| 103 | Q SCPIEN_U_$$EXT^SCAPMCU2(404.53,SCPIEN) | 
|---|
| 104 | ; | 
|---|
| 105 | OKPREC4(SCIEN) ; return if precepted position can be un-precepted | 
|---|
| 106 | ;       ; if patient assign after 1st preceptment date, NO | 
|---|
| 107 | ;       ; used by computed field #400 of file 404.57 | 
|---|
| 108 | S SCIEN=$G(SCIEN,0) | 
|---|
| 109 | I (SCIEN<1)!('$D(^SCTM(404.57,SCIEN))) Q $$S(8) | 
|---|
| 110 | I '$D(^SCTM(404.53,"B",SCIEN)) Q 1 | 
|---|
| 111 | ; | 
|---|
| 112 | N SCVALHIS,SCDT,SCX | 
|---|
| 113 | S SCDT=$P($$VALHIST^SCAPMCU5(404.53,SCIEN,"SCVALHIS"),U,2) | 
|---|
| 114 | I SCDT=0 Q 1 | 
|---|
| 115 | S SCX=$$PCPOSCNT^SCAPMCU1(SCIEN,SCDT,0,1) | 
|---|
| 116 | Q $S(SCX>0:$$S(10),1:1) | 
|---|
| 117 | ; | 
|---|
| 118 | OKPREC5(SCIEN,SCLNKDT) ; if position has a preceptor, | 
|---|
| 119 | ;               ; is preceptor link valid? | 
|---|
| 120 | ; | 
|---|
| 121 | S SCIEN=$G(SCIEN,0) | 
|---|
| 122 | S SCLNKDT=$G(SCLNKDT,DT) | 
|---|
| 123 | I (SCIEN<1)!(SCLNKDT<1) Q $$S(8) | 
|---|
| 124 | N SCPIEN | 
|---|
| 125 | S SCPIEN=+$$OKPREC3(SCIEN,SCLNKDT) | 
|---|
| 126 | I SCPIEN<1 Q 1 | 
|---|
| 127 | Q $$OKPREC(SCIEN,SCPIEN,SCLNKDT) | 
|---|
| 128 | ; | 
|---|
| 129 | PRECHIS(SCPIEN,SCDATES,SCLIST) ;return precepted positions for preceptor | 
|---|
| 130 | ; input | 
|---|
| 131 | ;    SCPIEN := preceptor pos ien (404.57) (required) | 
|---|
| 132 | ;    SCDATES := standard PCMM date array  (required) | 
|---|
| 133 | ;    SCDATES(begin) := start date [default = DT] | 
|---|
| 134 | ;    SCDATES(end)   := end date   [default = DT] | 
|---|
| 135 | ;    SCDATES(incl)  := always set to 0 | 
|---|
| 136 | ;    SCLIST := output array (required) | 
|---|
| 137 | ; | 
|---|
| 138 | ; output | 
|---|
| 139 | ;    @SCLIST@(scn) | 
|---|
| 140 | ;     format := | 
|---|
| 141 | ;      pieces 1-13:  same as SCLIST(scn,) node of $$prtp^scapmc8 | 
|---|
| 142 | ;      pieces 14-16: same as SCLIST(scn,'PR',) node of $$prtp^scapmc8 | 
|---|
| 143 | ;    @SCLIST@('SCPR',precepted team posn ien (404.57) + | 
|---|
| 144 | ;                   ,preceptor start date + | 
|---|
| 145 | ;                   ,preceptor asgn ien, + | 
|---|
| 146 | ;                   ,precepted posn asgn ien,scn) | 
|---|
| 147 | ; | 
|---|
| 148 | S SCPIEN=+$G(SCPIEN,0) | 
|---|
| 149 | S SCDATES=$G(SCDATES) | 
|---|
| 150 | S SCLIST=$G(SCLIST) | 
|---|
| 151 | I (SCPIEN<1)!(SCDATES']"")!(SCLIST']"") Q $$S(8) | 
|---|
| 152 | ; | 
|---|
| 153 | N SCN,SCPVAL,SCPN,SCIEN,SCX,SCXP,SCXPR,SCXARY,SCXDT | 
|---|
| 154 | N SCPTP,SCPTPN,SCBEGIN,SCEND,SCESEQ,SCLSEQ | 
|---|
| 155 | N SCP1P11,SCP12,SCP13,SCP14,SCP15,SCP16,SCR | 
|---|
| 156 | ; | 
|---|
| 157 | S (@SCDATES@("BEGIN"),SCBEGIN)=$G(@SCDATES@("BEGIN"),DT) | 
|---|
| 158 | S (@SCDATES@("END"),SCEND)=$G(@SCDATES@("END"),DT) | 
|---|
| 159 | S @SCDATES@("INCL")=0 | 
|---|
| 160 | ; | 
|---|
| 161 | I '$D(^SCTM(404.53,"D",SCPIEN)) Q 0 | 
|---|
| 162 | I '$D(^SCTM(404.53,"AD",SCPIEN)) Q 0 | 
|---|
| 163 | S SCPN=0                              ; incrementor | 
|---|
| 164 | S @SCLIST@(0)=0 | 
|---|
| 165 | S SCIEN=0 | 
|---|
| 166 | F  S SCIEN=$O(^SCTM(404.53,"AD",SCPIEN,SCIEN)) Q:'SCIEN  D | 
|---|
| 167 | . ;K SCXPR | 
|---|
| 168 | . ;S SCX=$$ACTHIST^SCAPMCU2(404.53,SCIEN,.SCDATES,"SCXER","SCXPR") | 
|---|
| 169 | . ;Q:+SCX<1 | 
|---|
| 170 | . K SCPVAL(SCIEN) | 
|---|
| 171 | . S SCX=$$VALHIST^SCAPMCU5(404.53,SCIEN,"SCPVAL("_SCIEN_")") | 
|---|
| 172 | . Q:'$D(SCPVAL(SCIEN)) | 
|---|
| 173 | . S SCX=$$ACTHIST^SCAPMCU5("SCPVAL("_SCIEN_")",.SCDATES) | 
|---|
| 174 | . Q:+SCX<1 | 
|---|
| 175 | . ; | 
|---|
| 176 | . S SCX=0 | 
|---|
| 177 | . F  S SCX=$O(^SCTM(404.53,"AD",SCPIEN,SCIEN,1,SCX)) Q:'SCX  D | 
|---|
| 178 | . . Q:'$D(SCPVAL(SCIEN,"I",SCX)) | 
|---|
| 179 | . . S SCXARY=$O(SCPVAL(SCIEN,"I",SCX,0)) | 
|---|
| 180 | . . S SCP14=$O(SCPVAL(SCIEN,SCXARY,0))              ;precept start dt | 
|---|
| 181 | . . S SCP16=$O(SCPVAL(SCIEN,SCXARY,SCP14,0))        ;precept start ien | 
|---|
| 182 | . . S SCP15=$P(SCPVAL(SCIEN,SCXARY,SCP14,SCP16),U) | 
|---|
| 183 | . . S SCP15=$S(+SCP15>1:SCP15,1:9999999)            ;precept end dt | 
|---|
| 184 | . . Q:'$$DTCHK^SCAPU1(SCBEGIN,SCEND,0,SCP14,SCP15) | 
|---|
| 185 | . . K SCPTP | 
|---|
| 186 | . . K SCXDT | 
|---|
| 187 | . . S SCXDT("BEGIN")=SCP14 | 
|---|
| 188 | . . S SCXDT("END")=SCP15 | 
|---|
| 189 | . . S SCXDT("INCL")=0 | 
|---|
| 190 | . . S SCXP=$$PRTP^SCAPMC8(SCIEN,"SCXDT","SCPTP","SCPTPE") | 
|---|
| 191 | . . Q:+$G(SCPTP(0))<1 | 
|---|
| 192 | . . F SCXP=1:1:SCPTP(0) D | 
|---|
| 193 | . . . S SCPN=SCPN+1 | 
|---|
| 194 | . . . S SCP1P11=$P(SCPTP(SCXP),U,1,11) | 
|---|
| 195 | . . . S SCP12=$P(SCPTP(SCXP),U,12) | 
|---|
| 196 | . . . S SCP13=$P(SCPTP(SCXP),U,13) | 
|---|
| 197 | . . . S SCR=SCP1P11_U_SCP12_U_SCP13_U_SCP14_U_SCP15_U_SCP16 | 
|---|
| 198 | . . . S @SCLIST@(0)=SCPN | 
|---|
| 199 | . . . S @SCLIST@(SCPN)=SCR | 
|---|
| 200 | . . . S @SCLIST@("SCPR",SCIEN,SCP14,SCP16,$P(SCR,U,11),SCPN)="" | 
|---|
| 201 | . . . Q | 
|---|
| 202 | . . Q | 
|---|
| 203 | . K SCPVAL(SCIEN) | 
|---|
| 204 | . Q | 
|---|
| 205 | ; | 
|---|
| 206 | PRECQ Q @SCLIST@(0)>0 | 
|---|
| 207 | ; | 
|---|
| 208 | DTARY(SCX) ; | 
|---|
| 209 | S SCLNKDT("BEGIN")=SCLNKDT | 
|---|
| 210 | S SCLNKDT("END")=$S(SCX=1:9999999,1:SCLNKDT) | 
|---|
| 211 | S SCLNKDT("INCL")=0 | 
|---|
| 212 | ;I $G(SCLIST)]"" S SCLNKDT("END")=$G(SCLNKDT0,9999999) | 
|---|
| 213 | Q | 
|---|
| 214 | ; | 
|---|
| 215 | CHKPRTP() ; | 
|---|
| 216 | Q $$GETPRTP^SCAPMCU2(SCIEN,SCLNKDT)=$$GETPRTP^SCAPMCU2(SCPIEN,SCLNKDT) | 
|---|
| 217 | ; | 
|---|
| 218 | S(SCX) Q 0_U_SCX_U_$P($T(T+SCX),";;",2)_"." | 
|---|
| 219 | ; | 
|---|
| 220 | T ;; | 
|---|
| 221 | 1 ;;Position can't precept itself;; | 
|---|
| 222 | 2 ;;Preceptor and precepted must be on same team;; | 
|---|
| 223 | 3 ;;Preceptor can't have a preceptor on assignment date;; | 
|---|
| 224 | 4 ;;Preceptor must be able to act as a preceptor;; | 
|---|
| 225 | 5 ;;Preceptor must be PC if precepted is PC;; | 
|---|
| 226 | 6 ;;Preceptor must be active on assignment date;; | 
|---|
| 227 | 7 ;;Active or future precepted position(s);; | 
|---|
| 228 | 8 ;;Invalid Parameter | 
|---|
| 229 | 9 ;;Preceptor/Precepted Staff can't be the same;; | 
|---|
| 230 | 10 ;;Position has patient assignments after precepted date;; | 
|---|
| 231 | ; | 
|---|