| 1 | SCRPM21U ;ALB/PDR - POSITION REASSIGNMENT UTILITIES ; AUG 1998
 | 
|---|
| 2 |  ;;5.3;Scheduling;**148,157**;Aug 13, 1993
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | PREVDAY(DAY)    ; GET PREVIOUS DAY
 | 
|---|
| 5 |  N X,X1,X2
 | 
|---|
| 6 |  S X1=DAY,X2=-1
 | 
|---|
| 7 |  D C^%DTC
 | 
|---|
| 8 |  Q X
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 | PCPCASN(FASIEN,SCTP)    ; IS THIS A PRIMARY CARE to PRIMARY CARE ASSIGNMENT?
 | 
|---|
| 11 |  ; FASIEN = Pointer to source Position assignment SCPT(404.43)
 | 
|---|
| 12 |  ; SCTP   = Destination position pointer to Position DEF file SCTM(404.57)
 | 
|---|
| 13 |  N SPPC,DPPC,STPC,SCST
 | 
|---|
| 14 |  ; Exclude the case where source = destination team
 | 
|---|
| 15 |  ;
 | 
|---|
| 16 |  S SCST=$P($G(^SCPT(404.43,FASIEN,0)),U,2) ; pointer to position DEF file
 | 
|---|
| 17 |  S SCST=$P($G(^SCTM(404.57,SCST,0)),U,2) ; pointer to team DEF file
 | 
|---|
| 18 |  I SCST="" Q 0  ; this is really an error condition
 | 
|---|
| 19 |  I SCST=$P($G(^SCTM(404.57,SCTP,0)),U,2) Q 0  ; source and dest teams are the same
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 |  ; Both source and destination positions are (or will be) primary care.
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ; test source position is a pc position, and the new position is too
 | 
|---|
| 24 |  S SPPC=$P($G(^SCPT(404.43,FASIEN,0)),U,5)>0 ; source position is primary care
 | 
|---|
| 25 |  S DPPC=@SCFIELDA@(.05)>0 ; destination position is primary care
 | 
|---|
| 26 |  S STPC=$$GETPOSTM(FASIEN)
 | 
|---|
| 27 |  S STPC=$P($G(^SCPT(404.42,STPC,0)),U,8)=1 ; source team is primary care
 | 
|---|
| 28 |  ; if source pos and dest pos are PC OR source team and dest pos are PC then is a pc to pc assignment
 | 
|---|
| 29 |  Q (SPPC&DPPC)!(STPC&DPPC)
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 | UPDATPOS(POSAIEN,SCERR) ; UPDATE EXISTING POSITION ASSIGNMENT PARAMETERS, AND ENSURE NO FUTURE DISCHARGE
 | 
|---|
| 32 |  N SC,SCFLD,ENTFLD
 | 
|---|
| 33 |  S ENTFLD=",.06,.07,"
 | 
|---|
| 34 |  S SC($J,404.43,(+POSAIEN)_",",.08)=DUZ ; last edited by
 | 
|---|
| 35 |  S SC($J,404.43,(+POSAIEN)_",",.09)=SCNOW ; last edit date/time
 | 
|---|
| 36 |  S SC($J,404.43,(+POSAIEN)_",",.03)=SCACT ; set new activity date for existing position assgn
 | 
|---|
| 37 |  S SC($J,404.43,(+POSAIEN)_",",.04)="" ; ensure no future discharge
 | 
|---|
| 38 |  IF $D(SCFIELDA) D
 | 
|---|
| 39 |  . S SCFLD=0
 | 
|---|
| 40 |  . F  S SCFLD=$O(@SCFIELDA@(SCFLD)) Q:'SCFLD  D
 | 
|---|
| 41 |  .. Q:ENTFLD[","_SCFLD_","  ; don't want ENTRY user and ENTRY date time for edit
 | 
|---|
| 42 |  .. S SC($J,404.43,(+POSAIEN)_",",SCFLD)=@SCFIELDA@(SCFLD)
 | 
|---|
| 43 |  D FILE^DIE("","SC($J)",SCERR) ; update position assignment paramaeters
 | 
|---|
| 44 |  I $D(@SCERR) S POSAIEN=0_U_POSAIEN
 | 
|---|
| 45 |  Q
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 | TMEXIST(DFN,SCTM,SCSD,TMAIEN) ;
 | 
|---|
| 48 |  ; returns 1 if current/future assignment exists else 0
 | 
|---|
| 49 |  ; conserves IEN of the des tm asgn if it exists
 | 
|---|
| 50 |  N SCRESULT,SCSDT,SCX,SCTMLIST,SCTMERR
 | 
|---|
| 51 |  S (SCRESULT,TMAIEN)=0
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ;;set date variables for $$tmpt
 | 
|---|
| 54 |  S SCSDT("BEGIN")=$G(SCSD,DT)
 | 
|---|
| 55 |  S SCSDT("END")=$$FMADD^XLFDT(SCSDT("BEGIN"),36500)
 | 
|---|
| 56 |  ;
 | 
|---|
| 57 |  ;;look for current asgn first
 | 
|---|
| 58 |  S SCX=$$TMPT(1)
 | 
|---|
| 59 |  S TMAIEN=$O(SCTMLIST("SCTM",SCTM,0))
 | 
|---|
| 60 |  I +TMAIEN S SCRESULT=1 G TMXISTQ
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  ;;look for nearest future legit asgn/dschrg
 | 
|---|
| 63 |  S SCX=$$TMPT(0)
 | 
|---|
| 64 |  I '+$O(SCTMLIST("SCTM",SCTM,0)) G TMXISTQ
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  F  S TMAIEN=$O(SCTMLIST("SCTM",SCTM,TMAIEN)) Q:'TMAIEN  D
 | 
|---|
| 67 |  .S SCX=$O(SCTMLIST("SCTM",SCTM,TMAIEN,0))
 | 
|---|
| 68 |  .S SCX=$P(SCTMLIST(SCX),U,4,5)
 | 
|---|
| 69 |  .Q:$P(SCX,U,2)<+SCX
 | 
|---|
| 70 |  .S SCTMLIST("SCTM","BYDATE",+SCX,TMAIEN)=""
 | 
|---|
| 71 |  .Q
 | 
|---|
| 72 |  ;
 | 
|---|
| 73 |  S SCX=$O(SCTMLIST("SCTM","BYDATE",""))
 | 
|---|
| 74 |  I +SCX D
 | 
|---|
| 75 |  .S TMAIEN=$O(SCTMLIST("SCTM","BYDATE",SCX,""))
 | 
|---|
| 76 |  .S SCRESULT=1
 | 
|---|
| 77 |  .Q
 | 
|---|
| 78 |  ;
 | 
|---|
| 79 | TMXISTQ S TMAIEN=+TMAIEN
 | 
|---|
| 80 |  Q +SCRESULT
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 | TMPT(SCX) ;
 | 
|---|
| 83 |  S SCSDT("INCL")=SCX
 | 
|---|
| 84 |  K SCTMLIST
 | 
|---|
| 85 |  K SCTMERR
 | 
|---|
| 86 |  Q $$TMPT^SCAPMC(DFN,"SCSDT","","SCTMLIST","SCTMERR")
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 | DELPOS(DISIEN,POSAIEN)  ; DELETE a position
 | 
|---|
| 89 |  ; DISIEN = SOURCE POSITION TO DISCHARGE
 | 
|---|
| 90 |  ; POSAIEN = CURRENT DESTINATION POSITION IEN - USED JUST AS AN ERROR INDICATOR HERE
 | 
|---|
| 91 |  S DIK="^SCPT(404.43,"
 | 
|---|
| 92 |  S DA=DISIEN
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 |  IF DIK]"",$D(@(DIK_DA_",0)")) D ^DIK
 | 
|---|
| 95 |  E  S POSAIEN=0_U_POSAIEN
 | 
|---|
| 96 |  Q
 | 
|---|
| 97 |  ;
 | 
|---|
| 98 | DISPOS(DISIEN,POSAIEN)  ; DISCHARGE a position
 | 
|---|
| 99 |  ; DISIEN = SOURCE POSITION TO DISCHARGE
 | 
|---|
| 100 |  ; POSAIEN = CURRENT DESTINATION POSITION IEN - USED JUST AS AN ERROR INDICATOR HERE
 | 
|---|
| 101 |  N DISDAT
 | 
|---|
| 102 |  S DISDAT=SCACT  ; init discharge date
 | 
|---|
| 103 |  I $P($G(^SCPT(404.43,DISIEN,0)),U,3)'>$$PREVDAY(SCACT) S DISDAT=$$PREVDAY(SCACT)
 | 
|---|
| 104 |  S STEC=$$INPTTP^SCAPMC(DFN,DISIEN,DISDAT,SCERR)
 | 
|---|
| 105 |  I 'STEC S POSAIEN=0_U_POSAIEN
 | 
|---|
| 106 |  Q
 | 
|---|
| 107 |  ;
 | 
|---|
| 108 | CREATPOS(POSAIEN,TMAIEN)        ; CREATE A POSITION
 | 
|---|
| 109 |  N SCIEN
 | 
|---|
| 110 |  S POSAIEN="" ; initialize position IEN
 | 
|---|
| 111 |  IF $D(SCFIELDA) D
 | 
|---|
| 112 |  . S SCFLD=0
 | 
|---|
| 113 |  . F  S SCFLD=$O(@SCFIELDA@(SCFLD)) Q:'SCFLD  D
 | 
|---|
| 114 |  .. S SC($J,404.43,"+1,",SCFLD)=@SCFIELDA@(SCFLD)
 | 
|---|
| 115 |  S SC($J,404.43,"+1,",.01)=TMAIEN
 | 
|---|
| 116 |  S SC($J,404.43,"+1,",.02)=SCTP
 | 
|---|
| 117 |  S SC($J,404.43,"+1,",.03)=SCACT
 | 
|---|
| 118 |  D UPDATE^DIE("","SC($J)","SCIEN",SCERR) ; create new position
 | 
|---|
| 119 |  IF $D(@SCERR) K SCIEN
 | 
|---|
| 120 |  ELSE  D
 | 
|---|
| 121 |  . S POSAIEN=+$G(SCIEN(1))
 | 
|---|
| 122 |  . S SCNEWTP=1
 | 
|---|
| 123 |  . D AFTERTP^SCMCDD1(POSAIEN)
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 | DELTEAM(TMAIEN) ; DELETE A TEAM ASSIGNMENT
 | 
|---|
| 127 |  S DIK="^SCPT(404.42,"
 | 
|---|
| 128 |  S DA=TMAIEN
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  IF DIK]"",$D(@(DIK_DA_",0)")) D ^DIK
 | 
|---|
| 131 |  E  S TMAIEN=0_U_TMAIEN
 | 
|---|
| 132 |  Q
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | DISTEAM(TMAIEN) ; DISCHARGE A TEAM ASSIGNMENT
 | 
|---|
| 135 |  ; TMAIEN = SOURCE TEAM IEN
 | 
|---|
| 136 |  N DISDAT,SCPREVDT,SCNODE
 | 
|---|
| 137 |  S DISDAT=SCACT  ; init discharge date
 | 
|---|
| 138 |  ; discharge for previous day if assignment date prior to today
 | 
|---|
| 139 |  I $P($G(^SCPT(404.42,TMAIEN,0)),U,9)'>$$PREVDAY(SCACT) S DISDAT=$$PREVDAY(SCACT)
 | 
|---|
| 140 |  N SCTEC
 | 
|---|
| 141 |  S SCTEC=$$INPTTM^SCAPMC(DFN,TMAIEN,DISDAT,SCERR) ; Discharge from team Assignments
 | 
|---|
| 142 |  I 'SCTEC S TMAIEN=0_U_TMAIEN
 | 
|---|
| 143 |  Q
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 | CREATETM(DFN,SCTMTO,SCACT,TMAIEN)       ; CREATE A TEAM ASSIGNMENT
 | 
|---|
| 146 |  N SCTM,SCIEN
 | 
|---|
| 147 |  S TMAIEN="+1,"
 | 
|---|
| 148 |  ; set team assignment type (i.e PC (1) or non-PC (99))
 | 
|---|
| 149 |  S:$D(@SCFIELDA@(.05)) SCTM($J,404.42,TMAIEN,.08)=$G(@SCMAINA@(.08),$S(@SCFIELDA@(.05):1,1:99))
 | 
|---|
| 150 |  ; set team user entering
 | 
|---|
| 151 |  S:$D(@SCFIELDA@(.06)) SCTM($J,404.42,TMAIEN,.11)=$G(@SCMAINA@(.11),@SCFIELDA@(.06))
 | 
|---|
| 152 |  ; set team Date/time entered
 | 
|---|
| 153 |  S:$D(@SCFIELDA@(.07)) SCTM($J,404.42,TMAIEN,.12)=$G(@SCMAINA@(.12),@SCFIELDA@(.07))
 | 
|---|
| 154 |  ; set team last edited by
 | 
|---|
| 155 |  ;S:$D(@SCFIELDA@(.08)) SCTM($J,404.42,TMAIEN,.13)=$G(@SCMAINA@(.13),@SCFIELDA@(.08))
 | 
|---|
| 156 |  ; set team date/time last edited
 | 
|---|
| 157 |  ;S:$D(@SCFIELDA@(.09)) SCTM($J,404.42,TMAIEN,.14)=$G(@SCMAINA@(.14),@SCFIELDA@(.09))
 | 
|---|
| 158 |  S SCTM($J,404.42,TMAIEN,.01)=DFN
 | 
|---|
| 159 |  S SCTM($J,404.42,TMAIEN,.02)=SCACT
 | 
|---|
| 160 |  S SCTM($J,404.42,TMAIEN,.03)=SCTMTO
 | 
|---|
| 161 |  D UPDATE^DIE("","SCTM($J)","SCIEN",SCERR) ; new entry
 | 
|---|
| 162 |  IF $D(@SCERR) D
 | 
|---|
| 163 |  . K SCIEN
 | 
|---|
| 164 |  . S TMAIEN=""
 | 
|---|
| 165 |  ELSE  D
 | 
|---|
| 166 |  . S TMAIEN=$G(SCIEN(1))  ; new assignment record set up
 | 
|---|
| 167 |  . S SCNEWTM=1
 | 
|---|
| 168 |  . D AFTERTM^SCMCDD1(TMAIEN)
 | 
|---|
| 169 |  Q
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 | TMACTIV(TMAIEN,PCPOS)   ; CHANGE FUTURE ACTIVE DATE TO CURRENT DATE
 | 
|---|
| 172 |  ; PCPOS - flag that indicates whether or not team should be activated as a PC Team
 | 
|---|
| 173 |  ;  the team definition is assumed to support PC service at this point
 | 
|---|
| 174 |  ; also remove future discharge date if present
 | 
|---|
| 175 |  S SC($J,404.42,(+TMAIEN)_",",.14)=SCNOW ; date time last edited
 | 
|---|
| 176 |  S SC($J,404.42,(+TMAIEN)_",",.13)=DUZ ; last edited by
 | 
|---|
| 177 |  S SC($J,404.42,(+TMAIEN)_",",.02)=SCACT  ; assigned date
 | 
|---|
| 178 |  S SC($J,404.42,(+TMAIEN)_",",.09)=""     ; discharge date
 | 
|---|
| 179 |  I PCPOS S SC($J,404.42,(+TMAIEN)_",",.08)=1 ;
 | 
|---|
| 180 |  D FILE^DIE("","SC($J)",SCERR) ; update TEAM assignment
 | 
|---|
| 181 |  I $D(@SCERR) S TMAIEN=0_U_TMAIEN
 | 
|---|
| 182 |  Q
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 | XALLPOS(FASIEN,POSAIEN) ; DISCHARGE ALL POSITIONS FROM THE "from" TEAM
 | 
|---|
| 185 |  ; FASIEN = source position assignment IEN
 | 
|---|
| 186 |  ; POSAIEN = destination position assignment IEN, used just for error reporting here
 | 
|---|
| 187 |  ; this only occurs when the "from" pos and "to" pos are both Primary care,
 | 
|---|
| 188 |  ; or the "from" team is PC and the "to" pos is PC.
 | 
|---|
| 189 |  ; Rational is that a patient can't have more than one PC team
 | 
|---|
| 190 |  ;
 | 
|---|
| 191 |  ; use FASIEN to get team assignment, then find all positions for this team assignment,
 | 
|---|
| 192 |  ; and discharge them
 | 
|---|
| 193 |  N POSASGN,TMASGN,DISDAT,SCX,SCFLAG
 | 
|---|
| 194 |  S DISDAT=SCACT  ; init discharge date
 | 
|---|
| 195 |  ; discharge for previous day if assignment date prior to today
 | 
|---|
| 196 |  S SCX=$$PREVDAY(SCACT)
 | 
|---|
| 197 |  I $P($G(^SCPT(404.43,FASIEN,0)),U,3)'>SCX S DISDAT=SCX
 | 
|---|
| 198 |  S SCFLAG=0
 | 
|---|
| 199 |  S TMASGN=+$P($G(^SCPT(404.43,FASIEN,0)),U,1)
 | 
|---|
| 200 |  I TMASGN D 
 | 
|---|
| 201 |  .S POSASGN=0
 | 
|---|
| 202 |  .F  S POSASGN=$O(^SCPT(404.43,"B",TMASGN,POSASGN)) Q:POSASGN=""  D
 | 
|---|
| 203 |  ..S SCX=+$P($G(^SCPT(404.43,POSASGN,0)),U,4)       ;already discharged?
 | 
|---|
| 204 |  ..I SCX,SCX<SCACT Q                                ;leave past alone!
 | 
|---|
| 205 |  ..K @SCERR
 | 
|---|
| 206 |  ..S STEC=$$INPTTP^SCAPMC(DFN,POSASGN,DISDAT,SCERR) ;discharge position
 | 
|---|
| 207 |  ..I $D(@SCERR) S SCFLAG=1
 | 
|---|
| 208 |  ..Q
 | 
|---|
| 209 |  .Q
 | 
|---|
| 210 |  I ('TMASGN)!(SCFLAG) S POSAIEN=0_U_POSAIEN
 | 
|---|
| 211 |  Q
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 | GETPOSTM(POSAIEN)       ; RETURN THE TEAM ASSIGNMENT FOR A POSITION
 | 
|---|
| 214 |  Q $P($G(^SCPT(404.43,POSAIEN,0)),U,1)
 | 
|---|
| 215 |  ;
 | 
|---|
| 216 | FUPOSASN(POSAIEN,SCACT) ; IS THIS A FUTURE POSITION ASSIGNMENT?
 | 
|---|
| 217 |  Q $P($G(^SCPT(404.43,POSAIEN,0)),U,3)>SCACT
 | 
|---|
| 218 |  ;
 | 
|---|
| 219 | FUTMASN(TMAIEN,SCACT)   ; IS THIS A FUTURE TEAM ASSIGNMENT?
 | 
|---|
| 220 |  Q $P($G(^SCPT(404.42,TMAIEN,0)),U,2)>SCACT
 | 
|---|
| 221 |  ;
 | 
|---|
| 222 | FUTTMDIS(TMAIEN,SCACT)  ; IS THERE A FUTURE TEAM DISCHARGE?
 | 
|---|
| 223 |  Q $P($G(^SCPT(404.42,TMAIEN,0)),U,9)>SCACT
 | 
|---|
| 224 |  ;
 | 
|---|
| 225 | DPOSPROB(SCPTTPA,SCACT) ; handle disposition of existing destination POSITION
 | 
|---|
| 226 |  I $$FUPOSASN(.SCPTTPA,SCACT) D  Q:'SCPTTPA  ; BAIL OUT
 | 
|---|
| 227 |  . D DELPOS(SCPTTPA,.SCPTTPA) ; DELETE future non-PC position assignment
 | 
|---|
| 228 |  . I 'SCPTTPA D ERROR^SCRPMPSP("Unable to DELETE non-PC position assignment for existing dest team",SCPTTPA,20) Q   ; BAIL OUT
 | 
|---|
| 229 |  ELSE  D
 | 
|---|
| 230 |  . D DISPOS(SCPTTPA,.SCPTTPA)  ; else if current non-pc assignment discharge it
 | 
|---|
| 231 |  . I 'SCPTTPA D ERROR^SCRPMPSP("Unable to discharge non-PC position assignment with existing dest team",SCPTTPA,25) Q   ; BAIL OUT
 | 
|---|
| 232 |  Q 'SCPTTPA
 | 
|---|
| 233 |  ;
 | 
|---|
| 234 | DTMPROB(SCPTTMA,SCACT)  ; HANDLE DISPOSITION OF EXISTING DESTINATION TEAM
 | 
|---|
| 235 |  I $$FUTMASN(.SCPTTMA,SCACT) D  Q:'SCPTTMA  ; BAIL OUT
 | 
|---|
| 236 |  . D DELTEAM(.SCPTTMA) ; DELETE future dest NON-PC team assign
 | 
|---|
| 237 |  . I 'SCPTTMA D ERROR^SCRPMPSP("Unable to DELETE non-PC team assignment for existing dest team",SCPTTMA,30)
 | 
|---|
| 238 |  ELSE  D 
 | 
|---|
| 239 |  . D DISTEAM(.SCPTTMA)  ; discharge current non-pc team assignment
 | 
|---|
| 240 |  . I 'SCPTTMA D ERROR^SCRPMPSP("Unable to discharge non-PC team assignment for existing dest team",SCPTTMA,35) Q   ; BAIL OUT
 | 
|---|
| 241 |  Q 'SCPTTMA
 | 
|---|