- SDRRISRU ;ALB/MAH,BWF,JAS - Recall Reminder Utilities ;NOV 25, 2024
- ;;5.3;Scheduling;**536,627,648,799,818,866,895**;Aug 13, 1993;Build 11
- ;;Per VHA Directive 6402, this routine should not be modified
- ;
- OPENSLOT(SDRRIEN,SDRRST,SDRRND) ; Function returns the number of open (available)
- ; slots at the clinic during the time period.
- ; SDRRIEN - IEN of clinic in file #44
- ; SDRRST - (optional) start checking on this date (default=today)
- ; SDRRND - (optional) end of time period (default=last day of month)
- N SDRRNOAV,SDRRTOT,SDRRHOL,SDRRT,SDRRTPT,SDRRTPDT,SDRRDT,SDRRDA
- N SDRRFTR,CK,CLIN1,DA,DFN
- I '$D(SDRRST) S SDRRST=DT
- I '$D(SDRRND) D ; end of month
- . S SDRRND=$E($$SCH^XLFDT("1M(L)",SDRRST),1,7)
- . S SDRRND=$$FMADD^XLFDT(SDRRND,1)
- . Q:$E(SDRRST,1,5)=$E(SDRRND,1,5)
- . S SDRRND=$$FMADD^XLFDT($E(SDRRND,1,5)_"01",-1)
- S SDRRST=$$FMADD^XLFDT(SDRRST,-1)
- S SDRRNOAV=0
- I '$O(^SC(SDRRIEN,"OST",SDRRST)),'$O(^SC(SDRRIEN,"ST",SDRRST,0)) D
- . N SDRRI,SDRRDOW
- . F SDRRI=0:1:6 S SDRRDOW=$O(^SC(SDRRIEN,"T"_SDRRI,SDRRST)) Q:SDRRDOW S:SDRRDOW SDRRNOAV=1
- I SDRRNOAV Q 0 ; No future dates available
- I '$D(SDRRYEAR) N SDRRYEAR D YEAR
- S SDRRHOL=($P($G(^SC(SDRRIEN,"SL")),U,8)="Y")
- S SDRRTOT=0,SDRRDT=SDRRST
- F S SDRRDT=$O(SDRRYEAR(SDRRDT)) Q:SDRRDT>SDRRND!'SDRRDT D
- . I 'SDRRHOL,$P(SDRRYEAR(SDRRDT),U,2) Q
- . S SDRRTPDT=$G(^SC(SDRRIEN,"ST",SDRRDT,1)) ; Pattern
- . I SDRRTPDT="" D Q:SDRRTPDT=""
- . . S SDRRT="T"_+SDRRYEAR(SDRRDT)
- . . S SDRRTPT=$O(^SC(SDRRIEN,SDRRT,SDRRDT)) Q:SDRRTPT=""
- . . S SDRRTPDT=$G(^SC(SDRRIEN,SDRRT,SDRRTPT,1))
- . S SDRRTOT=SDRRTOT+$$AVAIL(SDRRTPDT)
- Q SDRRTOT
- AVAIL(SDRRPAT) ; Given pattern, returns number of available slots.
- ; Check the pattern for available slots
- ; 0-9 and j-z = available slots where j=10, k=11...z=26
- ; $A(1)=49 $A(9)=57 $A("j")=106 $A("z")=122
- N SDRRCNT,SDRRCHAR,I
- S SDRRCNT=0
- S SDRRPAT=$TR($E(SDRRPAT,6,$L(SDRRPAT)),"|[] ","")
- F I=1:1:$L(SDRRPAT) S SDRRCHAR=$A(SDRRPAT,I) D
- . I SDRRCHAR>48,SDRRCHAR<58 S SDRRCNT=SDRRCNT+$C(SDRRCHAR) Q
- . I SDRRCHAR>105,SDRRCHAR<123 S SDRRCNT=SDRRCNT+SDRRCHAR-96
- Q SDRRCNT
- YEAR ; Set-up 1 year dates
- ; This array is used for available appointments
- N SDRRI,SDRRDT
- S SDRRDT=SDRRST
- F SDRRI=1:1:365 D Q:SDRRDT=SDRRND
- . S SDRRDT=$$FMADD^XLFDT(SDRRDT,1)
- . S SDRRYEAR(SDRRDT)=$$DOW^XLFDT(SDRRDT,1)
- . I $D(^HOLIDAY(SDRRDT)) S $P(SDRRYEAR(SDRRDT),U,2)=1
- Q
- DELETE ; This entry point is invoked by the new style xref A66201 on the .01 field of file 403.5
- I $D(SDRRDA),$D(APPT),$D(CLIN1) D Q
- .D DELAPPT(SDRRDA,APPT,CLIN1)
- D DELUSER(DA)
- Q
- DELAPPT(SDRRIEN,APPT,CLIN1) ; Record deleted from Recall List because of appointment.
- N SDRRFDA
- S SDRRFDA(403.56,"+1,",101)=APPT ; appt date
- S SDRRFDA(403.56,"+1,",102)=CLIN1 ; appt clinic
- ; SD*648 - Add delete info
- S SDRRFDA(403.56,"+1,",201)=$E($$NOW^XLFDT(),1,12) ; delete date
- S SDRRFDA(403.56,"+1,",202)=DUZ ; delete clerk
- S:$G(SDRRFTR) SDRRFDA(403.56,"+1,",203)=SDRRFTR ; delete reason:
- D DELSET(SDRRIEN,.SDRRFDA)
- Q
- DELUSER(SDRRIEN) ; Record deleted by a user.
- N SDRRFDA
- S SDRRFDA(403.56,"+1,",201)=$E($$NOW^XLFDT(),1,12) ; delete date
- ; DELUSER is defined by SDES2DISPRECALL to ensure the correct user is defined as the delete clerk
- ; This will not be new'ed or killed in this routine. DELUSER is newed in SDES2DISPRECALL,
- ; which is firing off this trigger cross reference.
- S SDRRFDA(403.56,"+1,",202)=$S($G(DELUSER):$G(DELUSER),1:DUZ) ; delete clerk
- S:$G(SDRRFTR) SDRRFDA(403.56,"+1,",203)=SDRRFTR ; delete reason:
- D DELSET(SDRRIEN,.SDRRFDA)
- Q
- DELSET(SDRRIEN,SDRRFDA) ;
- N SDRRREC,EAS,NEWIEN,APPTIEN,FDA,RREMIEN
- S SDRRREC=$G(^SD(403.5,SDRRIEN,0))
- S EAS=$G(^SD(403.5,SDRRIEN,1))
- S SDRRFDA(403.56,"+1,",.01)=$P(SDRRREC,U,1) ; patient
- S SDRRFDA(403.56,"+1,",2)=$P(SDRRREC,U,3) ; accession #
- S SDRRFDA(403.56,"+1,",2.5)=$$CTRL^XMXUTIL1($P(SDRRREC,U,7)) ; comment
- S SDRRFDA(403.56,"+1,",2.6)=$P(SDRRREC,U,8) ; fast / non-fast
- S SDRRFDA(403.56,"+1,",3)=$P(SDRRREC,U,4) ; test/app.
- S SDRRFDA(403.56,"+1,",4)=$P(SDRRREC,U,5) ; provider
- S SDRRFDA(403.56,"+1,",4.5)=$P(SDRRREC,U,2) ; clinic
- S SDRRFDA(403.56,"+1,",4.7)=$P(SDRRREC,U,9) ; length of appt.
- S SDRRFDA(403.56,"+1,",5)=$P(SDRRREC,U,6) ; recall date
- S SDRRFDA(403.56,"+1,",6)=$P(SDRRREC,U,10) ; date reminder sent
- S SDRRFDA(403.56,"+1,",7)=$P(SDRRREC,U,11) ; user who entered recall
- S SDRRFDA(403.56,"+1,",7.5)=$P(SDRRREC,U,14) ;DATE/TIME RECALL ADDED
- S SDRRFDA(403.56,"+1,",100)=EAS ;EAS TRACKING NUMBER ADDED
- D UPDATE^DIE("","SDRRFDA","NEWIEN")
- S RREMIEN=$G(NEWIEN(1)) I 'RREMIEN Q
- ;
- N CAFDA
- S CAFDA(403.58,"+1,"_RREMIEN_",",.01)=$$NOW^XLFDT
- S CAFDA(403.58,"+1,"_RREMIEN_",",1)=$P(SDRRREC,U,11)
- S CAFDA(403.58,"+1,"_RREMIEN_",",2)=$$CTRL^XMXUTIL1($P(SDRRREC,U,7))
- D UPDATE^DIE("","CAFDA") K CAFDA
- ;
- S APPTIEN=$$GETAPPT(SDRRIEN) Q:'APPTIEN
- S FDA(409.84,APPTIEN_",",5.1)=RREMIEN D FILE^DIE(,"FDA") K FDA
- Q
- GETAPPT(RECALLIEN) ;
- N FILEROOT,FULLREF,APPTIEN,SDPATIEN,TRGTAPPT
- S TRGTAPPT=""
- S SDPATIEN=$$GET1^DIQ(403.5,RECALLIEN,.01,"I")
- S FILEROOT=$$ROOT^DILFD(403.5)
- S FULLREF=RECALLIEN_";"_$P(FILEROOT,U,2)
- S APPTIEN=0 F S APPTIEN=$O(^SDEC(409.84,"CPAT",SDPATIEN,APPTIEN)) Q:'APPTIEN D
- .I $$GET1^DIQ(409.84,APPTIEN,.22,"I")'=FULLREF Q
- .S TRGTAPPT=APPTIEN
- Q $G(TRGTAPPT)
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDRRISRU 5357 printed Feb 19, 2025@00:27:18 Page 2
- SDRRISRU ;ALB/MAH,BWF,JAS - Recall Reminder Utilities ;NOV 25, 2024
- +1 ;;5.3;Scheduling;**536,627,648,799,818,866,895**;Aug 13, 1993;Build 11
- +2 ;;Per VHA Directive 6402, this routine should not be modified
- +3 ;
- OPENSLOT(SDRRIEN,SDRRST,SDRRND) ; Function returns the number of open (available)
- +1 ; slots at the clinic during the time period.
- +2 ; SDRRIEN - IEN of clinic in file #44
- +3 ; SDRRST - (optional) start checking on this date (default=today)
- +4 ; SDRRND - (optional) end of time period (default=last day of month)
- +5 NEW SDRRNOAV,SDRRTOT,SDRRHOL,SDRRT,SDRRTPT,SDRRTPDT,SDRRDT,SDRRDA
- +6 NEW SDRRFTR,CK,CLIN1,DA,DFN
- +7 IF '$DATA(SDRRST)
- SET SDRRST=DT
- +8 ; end of month
- IF '$DATA(SDRRND)
- Begin DoDot:1
- +9 SET SDRRND=$EXTRACT($$SCH^XLFDT("1M(L)",SDRRST),1,7)
- +10 SET SDRRND=$$FMADD^XLFDT(SDRRND,1)
- +11 if $EXTRACT(SDRRST,1,5)=$EXTRACT(SDRRND,1,5)
- QUIT
- +12 SET SDRRND=$$FMADD^XLFDT($EXTRACT(SDRRND,1,5)_"01",-1)
- End DoDot:1
- +13 SET SDRRST=$$FMADD^XLFDT(SDRRST,-1)
- +14 SET SDRRNOAV=0
- +15 IF '$ORDER(^SC(SDRRIEN,"OST",SDRRST))
- IF '$ORDER(^SC(SDRRIEN,"ST",SDRRST,0))
- Begin DoDot:1
- +16 NEW SDRRI,SDRRDOW
- +17 FOR SDRRI=0:1:6
- SET SDRRDOW=$ORDER(^SC(SDRRIEN,"T"_SDRRI,SDRRST))
- if SDRRDOW
- QUIT
- if SDRRDOW
- SET SDRRNOAV=1
- End DoDot:1
- +18 ; No future dates available
- IF SDRRNOAV
- QUIT 0
- +19 IF '$DATA(SDRRYEAR)
- NEW SDRRYEAR
- DO YEAR
- +20 SET SDRRHOL=($PIECE($GET(^SC(SDRRIEN,"SL")),U,8)="Y")
- +21 SET SDRRTOT=0
- SET SDRRDT=SDRRST
- +22 FOR
- SET SDRRDT=$ORDER(SDRRYEAR(SDRRDT))
- if SDRRDT>SDRRND!'SDRRDT
- QUIT
- Begin DoDot:1
- +23 IF 'SDRRHOL
- IF $PIECE(SDRRYEAR(SDRRDT),U,2)
- QUIT
- +24 ; Pattern
- SET SDRRTPDT=$GET(^SC(SDRRIEN,"ST",SDRRDT,1))
- +25 IF SDRRTPDT=""
- Begin DoDot:2
- +26 SET SDRRT="T"_+SDRRYEAR(SDRRDT)
- +27 SET SDRRTPT=$ORDER(^SC(SDRRIEN,SDRRT,SDRRDT))
- if SDRRTPT=""
- QUIT
- +28 SET SDRRTPDT=$GET(^SC(SDRRIEN,SDRRT,SDRRTPT,1))
- End DoDot:2
- if SDRRTPDT=""
- QUIT
- +29 SET SDRRTOT=SDRRTOT+$$AVAIL(SDRRTPDT)
- End DoDot:1
- +30 QUIT SDRRTOT
- AVAIL(SDRRPAT) ; Given pattern, returns number of available slots.
- +1 ; Check the pattern for available slots
- +2 ; 0-9 and j-z = available slots where j=10, k=11...z=26
- +3 ; $A(1)=49 $A(9)=57 $A("j")=106 $A("z")=122
- +4 NEW SDRRCNT,SDRRCHAR,I
- +5 SET SDRRCNT=0
- +6 SET SDRRPAT=$TRANSLATE($EXTRACT(SDRRPAT,6,$LENGTH(SDRRPAT)),"|[] ","")
- +7 FOR I=1:1:$LENGTH(SDRRPAT)
- SET SDRRCHAR=$ASCII(SDRRPAT,I)
- Begin DoDot:1
- +8 IF SDRRCHAR>48
- IF SDRRCHAR<58
- SET SDRRCNT=SDRRCNT+$CHAR(SDRRCHAR)
- QUIT
- +9 IF SDRRCHAR>105
- IF SDRRCHAR<123
- SET SDRRCNT=SDRRCNT+SDRRCHAR-96
- End DoDot:1
- +10 QUIT SDRRCNT
- YEAR ; Set-up 1 year dates
- +1 ; This array is used for available appointments
- +2 NEW SDRRI,SDRRDT
- +3 SET SDRRDT=SDRRST
- +4 FOR SDRRI=1:1:365
- Begin DoDot:1
- +5 SET SDRRDT=$$FMADD^XLFDT(SDRRDT,1)
- +6 SET SDRRYEAR(SDRRDT)=$$DOW^XLFDT(SDRRDT,1)
- +7 IF $DATA(^HOLIDAY(SDRRDT))
- SET $PIECE(SDRRYEAR(SDRRDT),U,2)=1
- End DoDot:1
- if SDRRDT=SDRRND
- QUIT
- +8 QUIT
- DELETE ; This entry point is invoked by the new style xref A66201 on the .01 field of file 403.5
- +1 IF $DATA(SDRRDA)
- IF $DATA(APPT)
- IF $DATA(CLIN1)
- Begin DoDot:1
- +2 DO DELAPPT(SDRRDA,APPT,CLIN1)
- End DoDot:1
- QUIT
- +3 DO DELUSER(DA)
- +4 QUIT
- DELAPPT(SDRRIEN,APPT,CLIN1) ; Record deleted from Recall List because of appointment.
- +1 NEW SDRRFDA
- +2 ; appt date
- SET SDRRFDA(403.56,"+1,",101)=APPT
- +3 ; appt clinic
- SET SDRRFDA(403.56,"+1,",102)=CLIN1
- +4 ; SD*648 - Add delete info
- +5 ; delete date
- SET SDRRFDA(403.56,"+1,",201)=$EXTRACT($$NOW^XLFDT(),1,12)
- +6 ; delete clerk
- SET SDRRFDA(403.56,"+1,",202)=DUZ
- +7 ; delete reason:
- if $GET(SDRRFTR)
- SET SDRRFDA(403.56,"+1,",203)=SDRRFTR
- +8 DO DELSET(SDRRIEN,.SDRRFDA)
- +9 QUIT
- DELUSER(SDRRIEN) ; Record deleted by a user.
- +1 NEW SDRRFDA
- +2 ; delete date
- SET SDRRFDA(403.56,"+1,",201)=$EXTRACT($$NOW^XLFDT(),1,12)
- +3 ; DELUSER is defined by SDES2DISPRECALL to ensure the correct user is defined as the delete clerk
- +4 ; This will not be new'ed or killed in this routine. DELUSER is newed in SDES2DISPRECALL,
- +5 ; which is firing off this trigger cross reference.
- +6 ; delete clerk
- SET SDRRFDA(403.56,"+1,",202)=$SELECT($GET(DELUSER):$GET(DELUSER),1:DUZ)
- +7 ; delete reason:
- if $GET(SDRRFTR)
- SET SDRRFDA(403.56,"+1,",203)=SDRRFTR
- +8 DO DELSET(SDRRIEN,.SDRRFDA)
- +9 QUIT
- DELSET(SDRRIEN,SDRRFDA) ;
- +1 NEW SDRRREC,EAS,NEWIEN,APPTIEN,FDA,RREMIEN
- +2 SET SDRRREC=$GET(^SD(403.5,SDRRIEN,0))
- +3 SET EAS=$GET(^SD(403.5,SDRRIEN,1))
- +4 ; patient
- SET SDRRFDA(403.56,"+1,",.01)=$PIECE(SDRRREC,U,1)
- +5 ; accession #
- SET SDRRFDA(403.56,"+1,",2)=$PIECE(SDRRREC,U,3)
- +6 ; comment
- SET SDRRFDA(403.56,"+1,",2.5)=$$CTRL^XMXUTIL1($PIECE(SDRRREC,U,7))
- +7 ; fast / non-fast
- SET SDRRFDA(403.56,"+1,",2.6)=$PIECE(SDRRREC,U,8)
- +8 ; test/app.
- SET SDRRFDA(403.56,"+1,",3)=$PIECE(SDRRREC,U,4)
- +9 ; provider
- SET SDRRFDA(403.56,"+1,",4)=$PIECE(SDRRREC,U,5)
- +10 ; clinic
- SET SDRRFDA(403.56,"+1,",4.5)=$PIECE(SDRRREC,U,2)
- +11 ; length of appt.
- SET SDRRFDA(403.56,"+1,",4.7)=$PIECE(SDRRREC,U,9)
- +12 ; recall date
- SET SDRRFDA(403.56,"+1,",5)=$PIECE(SDRRREC,U,6)
- +13 ; date reminder sent
- SET SDRRFDA(403.56,"+1,",6)=$PIECE(SDRRREC,U,10)
- +14 ; user who entered recall
- SET SDRRFDA(403.56,"+1,",7)=$PIECE(SDRRREC,U,11)
- +15 ;DATE/TIME RECALL ADDED
- SET SDRRFDA(403.56,"+1,",7.5)=$PIECE(SDRRREC,U,14)
- +16 ;EAS TRACKING NUMBER ADDED
- SET SDRRFDA(403.56,"+1,",100)=EAS
- +17 DO UPDATE^DIE("","SDRRFDA","NEWIEN")
- +18 SET RREMIEN=$GET(NEWIEN(1))
- IF 'RREMIEN
- QUIT
- +19 ;
- +20 NEW CAFDA
- +21 SET CAFDA(403.58,"+1,"_RREMIEN_",",.01)=$$NOW^XLFDT
- +22 SET CAFDA(403.58,"+1,"_RREMIEN_",",1)=$PIECE(SDRRREC,U,11)
- +23 SET CAFDA(403.58,"+1,"_RREMIEN_",",2)=$$CTRL^XMXUTIL1($PIECE(SDRRREC,U,7))
- +24 DO UPDATE^DIE("","CAFDA")
- KILL CAFDA
- +25 ;
- +26 SET APPTIEN=$$GETAPPT(SDRRIEN)
- if 'APPTIEN
- QUIT
- +27 SET FDA(409.84,APPTIEN_",",5.1)=RREMIEN
- DO FILE^DIE(,"FDA")
- KILL FDA
- +28 QUIT
- GETAPPT(RECALLIEN) ;
- +1 NEW FILEROOT,FULLREF,APPTIEN,SDPATIEN,TRGTAPPT
- +2 SET TRGTAPPT=""
- +3 SET SDPATIEN=$$GET1^DIQ(403.5,RECALLIEN,.01,"I")
- +4 SET FILEROOT=$$ROOT^DILFD(403.5)
- +5 SET FULLREF=RECALLIEN_";"_$PIECE(FILEROOT,U,2)
- +6 SET APPTIEN=0
- FOR
- SET APPTIEN=$ORDER(^SDEC(409.84,"CPAT",SDPATIEN,APPTIEN))
- if 'APPTIEN
- QUIT
- Begin DoDot:1
- +7 IF $$GET1^DIQ(409.84,APPTIEN,.22,"I")'=FULLREF
- QUIT
- +8 SET TRGTAPPT=APPTIEN
- End DoDot:1
- +9 QUIT $GET(TRGTAPPT)