| 1 | SCRPMTA ;ALB/REW/PDR - Team Reassignment APIs:APPTTM ; AUG 1998
 | 
|---|
| 2 |  ;;5.3;scheduling;**148,157**;aug 13, 1993
 | 
|---|
| 3 |  ; Reassign patient Team, called from RPC ='SC FILE PAT TM REASGN' (PTFILE^SCMRBK - PTFILE^SCMRBK)
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;;1.0
 | 
|---|
| 6 |  ; MAKE A SINGLE PATIENT TEAM REASSIGNMENT
 | 
|---|
| 7 | ACPTTM(DFN,SCTMTO,SCFIELDA,SCACT,FASIEN,SCERR) ;add a patient to a team (pt tmassgn - #404.42)
 | 
|---|
| 8 |  ; input:
 | 
|---|
| 9 |  ;  DFN     = pointer to PATIENT file (#2)
 | 
|---|
| 10 |  ;  SCTMTO  = pointer to TEAM file (#404.51) "TO" Team
 | 
|---|
| 11 |  ;  SCFIELDA= array of additional fields to be added for 404.42
 | 
|---|
| 12 |  ;  SCACT   = date to activate [default=DT]
 | 
|---|
| 13 |  ;  FASIEN  = IEN of source team assignment
 | 
|---|
| 14 |  ;  SCERR = array NAME to store error messages.
 | 
|---|
| 15 |  ;          [ex. ^TMP("ORXX",$J)]
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ; Output:
 | 
|---|
| 18 |  ;  Returned = ien of 404.42 - 0 if none after^new?^Message
 | 
|---|
| 19 |  ;  SCERR() = Array of DIALOG file messages(errors) .
 | 
|---|
| 20 |  ;             Foramt:
 | 
|---|
| 21 |  ;               Subscript: Sequential # from 1 to n
 | 
|---|
| 22 |  ;               Piece     Description
 | 
|---|
| 23 |  ;                 1       IEN of DIALOG file
 | 
|---|
| 24 |  N SCPTTM,SCESEQ,SCPARM,SCIEN,SC,SCFLD,SCNEWTM,SCDTPAR,SCMESS
 | 
|---|
| 25 |  ;
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  I '$$OKDATA D  G APTTMQ ;check/setup variables
 | 
|---|
| 28 |  . D ERROR("Failed initial data check","",10)
 | 
|---|
| 29 |  ; 
 | 
|---|
| 30 |  ; PROCESS REASSIGNMENT
 | 
|---|
| 31 |  ; get destination team assignment parameters if already existing assignment
 | 
|---|
| 32 |  I '$$GETTMPAR(DFN,SCTMTO,SCACT,.SCERR,.SCDTPAR,.SCPTTM) D  G APTTMQ ; BAIL if error 
 | 
|---|
| 33 |  . D ERROR("Unable to get list of team assignments for patient",FASIEN,20)
 | 
|---|
| 34 |  ; Make sure this reassignment doesn't set up more than 1 primary care team for PT
 | 
|---|
| 35 |  I $$INVALMOV(SCPTTM,FASIEN,SCDTPAR) D  G APTTMQ ; BAIL if error 
 | 
|---|
| 36 |  . D ERROR("Patient already has a primary care assignment",FASIEN,30)
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; check for currently active destination assignment and discharge if so
 | 
|---|
| 39 |  I $$ACTIVDES(SCDTPAR,SCACT) D  G:SCPTTM APTTMQ ; BAIL OUT if discharge unsuccessfull
 | 
|---|
| 40 |  . I $$DISTMOK(DFN,SCPTTM,SCACT,DUZ,"Destination") S SCPTTM="" Q  ; going to create a new team
 | 
|---|
| 41 |  . D ERROR("Unable to discharge current destination assignment",SCPTTM,40)
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 |  ; discharge source team
 | 
|---|
| 44 |  I '$$DISTMOK(DFN,FASIEN,SCACT,DUZ,"Source") D  G APTTMQ
 | 
|---|
| 45 |  . ; error messages setup within call to DISTMOK
 | 
|---|
| 46 |  . S SCPTTM=""
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 |  ; Move the patient to destination team and create destination team if necessary
 | 
|---|
| 49 |  I '$$MOVPATOK(DFN,SCACT,SCTMTO,SCFIELDA,SCDTPAR,.SCPTTM,DUZ) D  G APTTMQ
 | 
|---|
| 50 |  . D ERROR("Unable to move patient to destination team",FASIEN,50)
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 | APTTMQ ;
 | 
|---|
| 53 |  ;B
 | 
|---|
| 54 |  Q +$G(SCPTTM)_U_+$G(SCNEWTM)_U_$G(SCMESS)
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ;-------------------- SUBS -------------------------------
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 | PTTMACT(DFN,SCTMTO,SCDT,SCERR) ;what is patient/team assignment on a given date-time into the future? Return 404.42 ien or 0
 | 
|---|
| 59 |  N SCTMLST,SCOK,SCPTTMDT
 | 
|---|
| 60 |  S SCOK=0
 | 
|---|
| 61 |  S SCPTTMDT("BEGIN")=SCDT,SCPTTMDT("END")=3990101,SCPTTMDT("INCL")=0
 | 
|---|
| 62 |  IF $$TMPT^SCAPMC3(DFN,"SCPTTMDT","","SCTMLST",.SCERR) S:$D(SCTMLST("SCTM",SCTMTO)) SCOK=$O(SCTMLST("SCTM",SCTMTO,0))
 | 
|---|
| 63 |  Q SCOK
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | OKDATA()        ;setup/check variables
 | 
|---|
| 66 |  N SCOK
 | 
|---|
| 67 |  S SCOK=1
 | 
|---|
| 68 |  D INIT^SCAPMCU1(.SCOK)
 | 
|---|
| 69 |  IF '$D(^DPT(DFN,0))!('$D(^SCTM(404.51,SCTMTO,0))) D  S SCOK=0
 | 
|---|
| 70 |  . S SCPARM("PATIENT")=DFN
 | 
|---|
| 71 |  . S SCPARM("TEAM")=SCTMTO
 | 
|---|
| 72 |  . D ERR^SCAPMCU1(SCESEQ,4045101,.SCPARM,"",.SCERR)
 | 
|---|
| 73 |  S:'$G(SCACT) SCACT=DT
 | 
|---|
| 74 |  Q SCOK
 | 
|---|
| 75 |  ;
 | 
|---|
| 76 | DISTMOK(DFN,TMIEN,SCACT,SCDUZ,SD) ; Discharge patient from Team Assignment
 | 
|---|
| 77 |  ; DFN = pointer to patient
 | 
|---|
| 78 |  ; TMIEN = Ptr to Team Assignment File 404.42 for Team being discharged
 | 
|---|
| 79 |  ; SCAT = Discharge Date
 | 
|---|
| 80 |  ; SCDUZ = DUZ of user making reassignment
 | 
|---|
| 81 |  ; SD = text indicating "source" or "destination" team
 | 
|---|
| 82 |  N SC,SCTEC,DISDAT
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  Q:TMIEN="" TMIEN  ; Don't try to update this record if don't get IEN
 | 
|---|
| 85 |  S DISDAT=SCACT  ; init discharge date
 | 
|---|
| 86 |  ; discharge for previous day if assignment date prior to today
 | 
|---|
| 87 |  I $P($G(^SCPT(404.42,TMIEN,0)),U,2)'>$$PREVDAY(SCACT) S DISDAT=$$PREVDAY(SCACT)
 | 
|---|
| 88 |  ; Discharge Position assignments first, to prevent posibility of orphan positions
 | 
|---|
| 89 |  D DISCHPOS(DFN,TMIEN,DISDAT,SCERR,.SCTEC) ; Discharge from any position Assignments on this team
 | 
|---|
| 90 |  I SCTEC S SCTEC=$$INPTTM^SCAPMC(DFN,TMIEN,DISDAT,SCERR) ; Discharge from team Assignments
 | 
|---|
| 91 |  I 'SCTEC D ERROR("Unable to discharge "_SD_" team",FASIEN,500) Q 0 ; BAIL OUT
 | 
|---|
| 92 |  Q SCTEC
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 | DISCHPOS(DFN,TMASGN,SCAT,SCERR,SCTEC) ;Discharge positition assignments
 | 
|---|
| 95 |  ; DFN = ptr to patient
 | 
|---|
| 96 |  ; TMASGN = ptr to team assignment
 | 
|---|
| 97 |  ; SCAT = discharge date
 | 
|---|
| 98 |  N POSASGN,EM,GD,OK
 | 
|---|
| 99 |  S (EM,GD)=""
 | 
|---|
| 100 |  S OK=1
 | 
|---|
| 101 |  S SCTEC=1 ; initialize successfull pos discharge since may not be any pos to discharge
 | 
|---|
| 102 |  S POSASGN=0
 | 
|---|
| 103 |  F  S POSASGN=$O(^SCPT(404.43,"B",TMASGN,POSASGN)) Q:POSASGN=""  D
 | 
|---|
| 104 |  . S SCTEC=$$INPTTP^SCAPMC(DFN,POSASGN,SCAT,SCERR) ; discharge position
 | 
|---|
| 105 |  . I SCTEC S GD=GD_POSASGN_","
 | 
|---|
| 106 |  . I 'SCTEC D
 | 
|---|
| 107 |  .. S EM=EM_POSASGN_","
 | 
|---|
| 108 |  .. S OK=0
 | 
|---|
| 109 |  I 'OK D
 | 
|---|
| 110 |  . I GD'="" D ERROR("able to discharge these source positions: "_GD_" unable to discharge these: "_EM,POSASGN,300) Q
 | 
|---|
| 111 |  . D ERROR("unable to discharge any of the team positions: "_EM,POSASGN,400)
 | 
|---|
| 112 |  Q
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 | PREVDAY(DAY) ; GET PREVIOUS DAY
 | 
|---|
| 115 |  ; DAY = DATE IN FILEMAN FORMAT
 | 
|---|
| 116 |  N X,X1,X2
 | 
|---|
| 117 |  S X1=DAY,X2=-1
 | 
|---|
| 118 |  D C^%DTC
 | 
|---|
| 119 |  Q X
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 | GETTMPAR(DFN,SCTMTO,SCDT,SCERR,SCTMPAR,SCPTTM) ; RETURN team parameters
 | 
|---|
| 122 |  ; SCTMPAR is returned as:
 | 
|---|
| 123 |  ;               Piece     Description
 | 
|---|
| 124 |  ;                 1       IEN of TEAM file entry
 | 
|---|
| 125 |  ;                 2       Name of team
 | 
|---|
| 126 |  ;                 3       IEN of file #404.42 (Pt Tm Assignment)
 | 
|---|
| 127 |  ;                 4       current effective date
 | 
|---|
| 128 |  ;                 5       current inactivate date (if any)
 | 
|---|
| 129 |  ;                 6       pointer to 403.47 (purpose)
 | 
|---|
| 130 |  ;                 7       Name of Purpose
 | 
|---|
| 131 |  ;                 8       Is this the pt's PC Team?
 | 
|---|
| 132 |  ;                 9       IEN of PC team assignment - added to record -PDR
 | 
|---|
| 133 |  N SCTMLST,SCPTTMDT,PCTM
 | 
|---|
| 134 |  S (SCPTTM,SCTMPAR,PCTM)="" ; initialize dest team IEN and dest team parameters
 | 
|---|
| 135 |  ; get a list of active or future active teams for this patient
 | 
|---|
| 136 |  S SCPTTMDT("BEGIN")=SCDT,SCPTTMDT("END")=3990101,SCPTTMDT("INCL")=0
 | 
|---|
| 137 |  I $$TMPT^SCAPMC3(DFN,"SCPTTMDT","","SCTMLST",.SCERR) D
 | 
|---|
| 138 |  . S PCTM=$$GETPCTM(.SCTMLST)  ; get the PC team if any for this patient
 | 
|---|
| 139 |  . S:$D(SCTMLST("SCTM",SCTMTO)) SCPTTM=$O(SCTMLST("SCTM",SCTMTO,0))
 | 
|---|
| 140 |  . I SCPTTM D  ; get the team parameters
 | 
|---|
| 141 |  .. S SCN=$O(SCTMLST("SCTM",SCTMTO,SCPTTM,"")) ; ordered list
 | 
|---|
| 142 |  .. S SCTMPAR=$G(SCTMLST(SCN)) ; basic team parameters
 | 
|---|
| 143 |  S $P(SCTMPAR,U,9)=+PCTM ; add ien of PC team as 9th piece
 | 
|---|
| 144 |  Q '$D(@SCERR)
 | 
|---|
| 145 |  ;
 | 
|---|
| 146 | GETPCTM(TMLIST) ; FIND THE PC TEAM FOR THIS PATIENT
 | 
|---|
| 147 |  N SN,PT
 | 
|---|
| 148 |  S (PT,SN)=0
 | 
|---|
| 149 |  F  S SN=$O(TMLIST(SN)) Q:'SN  D  Q:PT
 | 
|---|
| 150 |  . I $P(TMLIST(SN),U,8) S PT=$P(TMLIST(SN),U,3)
 | 
|---|
| 151 |  Q PT
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | FUASSN(SCDTPAR,SCDT) ; is there a future assignment?
 | 
|---|
| 154 |  Q $P(SCTMPAR,U,4)>SCDT
 | 
|---|
| 155 |  ;
 | 
|---|
| 156 | FUDISCHG(SCTMPAR,SCDT) ;IS THERE A FUTURE DISCHARGE?
 | 
|---|
| 157 |  Q $P(SCTMPAR,U,5)>SCDT
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 | MOVPATOK(DFN,SCACT,SCTMTO,SCFIELDA,SCTMPAR,SCPTTM,SCDUZ) ; DID MOVE GO OK?
 | 
|---|
| 160 |  N SCFLD,SCED
 | 
|---|
| 161 |  S SCED=0
 | 
|---|
| 162 |  I SCPTTM D  ; setup for edit of existing dest assignment record
 | 
|---|
| 163 |  . S SCPTTM=SCPTTM_","  ; IENS format
 | 
|---|
| 164 |  . I $$FUASSN(SCTMPAR,SCACT) S SCED=1 ; the new assign date wil be entered below
 | 
|---|
| 165 |  . I $$FUDISCHG(SCTMPAR,SCACT) D  ; is there a future discharge for the dest team?
 | 
|---|
| 166 |  .. S SCED=1
 | 
|---|
| 167 |  .. S SC($J,404.42,SCPTTM,.09)="" ; remove discharge date
 | 
|---|
| 168 |  . I SCED D  ; editing the existing assignment - setup edit documentation fields
 | 
|---|
| 169 |  .. S SC($J,404.42,SCPTTM,.13)=@SCFIELDA@(.11) ; last edited by set to entered by
 | 
|---|
| 170 |  .. S SC($J,404.42,SCPTTM,.14)=@SCFIELDA@(.12) ; last edit time set to enter date/time
 | 
|---|
| 171 |  .. K @SCFIELDA@(.11) ; dispose of entered by (SCFIELDA array is set in SCMRBK)
 | 
|---|
| 172 |  .. K @SCFIELDA@(.12) ; dispose of entry date/time
 | 
|---|
| 173 |  ; 
 | 
|---|
| 174 |  I '(+SCPTTM) S SCPTTM="+1," ; setup for new team
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  S SCFLD=0 ; add additional fields from workstation if any
 | 
|---|
| 177 |  F  S SCFLD=$O(@SCFIELDA@(SCFLD)) Q:'SCFLD  D
 | 
|---|
| 178 |  . S SC($J,404.42,SCPTTM,SCFLD)=@SCFIELDA@(SCFLD)
 | 
|---|
| 179 |  ; core fields for new team assignment
 | 
|---|
| 180 |  S SC($J,404.42,SCPTTM,.01)=DFN
 | 
|---|
| 181 |  S SC($J,404.42,SCPTTM,.02)=SCACT
 | 
|---|
| 182 |  S SC($J,404.42,SCPTTM,.03)=SCTMTO
 | 
|---|
| 183 |  ;
 | 
|---|
| 184 |  I 'SCED D UPDATE^DIE("","SC($J)","SCIEN","SCERR") ; new entry
 | 
|---|
| 185 |  I SCED D FILE^DIE("","SC($J)","SCERR") ; edit existing entry
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 |  IF $D(@SCERR) D
 | 
|---|
| 188 |  . K SCIEN
 | 
|---|
| 189 |  . S SCPTTM=""
 | 
|---|
| 190 |  ELSE  D
 | 
|---|
| 191 |  . I SCPTTM'="+1," Q  ; BAIL OUT - was edit to existing assignement record
 | 
|---|
| 192 |  . S SCPTTM=$G(SCIEN(1))  ; new assignment record set up
 | 
|---|
| 193 |  . S SCNEWTM=1
 | 
|---|
| 194 |  . D AFTERTM^SCMCDD1(SCPTTM)
 | 
|---|
| 195 |  Q '$D(@SCERR)
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | INVALMOV(DTMIEN,STMIEN,TMPAR) ; IS THIS A VALID REASSIGNMENT?
 | 
|---|
| 198 |  ; can't have a pc team reassignment if patient has an existing PC team assignment
 | 
|---|
| 199 |  ; and it is not 
 | 
|---|
| 200 |  ; 1: the src team (move from src to dest discharges src, result only 1 pc team) OR 
 | 
|---|
| 201 |  ; 2: the destination team (already existing assignment)
 | 
|---|
| 202 |  I $$PCASSGN,$$OTHPCTM(DTMIEN,STMIEN,TMPAR) Q 1
 | 
|---|
| 203 |  Q 0
 | 
|---|
| 204 |  ;
 | 
|---|
| 205 | PCASSGN() ; IS THE REASSIGNMENT DESTINATION TO BE PC?
 | 
|---|
| 206 |  Q @SCFIELDA@(.08)=1
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 | OTHPCTM(DTMIEN,STMIEN,TMPAR) ; IS THERE ALREADY PC TEAM ASSIGNMENT?
 | 
|---|
| 209 |  I $P(TMPAR,U,9)=0 Q 0  ; no other primary care assignments
 | 
|---|
| 210 |  I 'DTMIEN Q $P(TMPAR,U,9)'=STMIEN  ; true if PC team is not source team
 | 
|---|
| 211 |  Q $P(TMPAR,U,9)'=DTMIEN  ; true if existing dest team assign is not pc team
 | 
|---|
| 212 |  ;
 | 
|---|
| 213 | ACTIVDES(SCDTPAR,SCACT) ; IS THE DESTINATION ASSIGNMENT ACTIVE?
 | 
|---|
| 214 |  ; SCDTPAR = Destination Team assignment parameter string
 | 
|---|
| 215 |  N DISDT,ASNDT
 | 
|---|
| 216 |  S DISDT=$P(SCDTPAR,U,5)
 | 
|---|
| 217 |  I DISDT="" S DISDT=9999999
 | 
|---|
| 218 |  S ASNDT=$P(SCDTPAR,U,4)
 | 
|---|
| 219 |  ; ACTIVE if assign date is not in future and 
 | 
|---|
| 220 |  ; there is no discharge date, or the discharge date is in the future 
 | 
|---|
| 221 |  I (ASNDT'>SCACT)&(DISDT>SCACT) Q 1
 | 
|---|
| 222 |  Q 0
 | 
|---|
| 223 |  ;
 | 
|---|
| 224 | ERROR(TXT,ID,ERN) ; ERROR PROCESSOR
 | 
|---|
| 225 |  S SCMESS=TXT_" IEN="_ID_" (ER#="_ERN_")"
 | 
|---|
| 226 |  S SCPTTM=0 ; return no assignment ien
 | 
|---|
| 227 |  ;S ^TMP("PDR",$J,$H,DFN)=SCMESS
 | 
|---|
| 228 |  Q
 | 
|---|