Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: SDES2SNODEUTIL

SDES2SNODEUTIL.m

Go to the documentation of this file.
SDES2SNODEUTIL ;ALB/JAS - UTILITIES TO FIND AND FIX MISSING S NODES ; April 20, 2026
 ;;5.3;SCHEDULING;**943**;AUG 13, 1993;Build 5
 ;;Per VHA Directive 6402, this routine should not be modified
 ;;
 Q
 ;
 ;
ALLPATS(INCLUDECAN) ; MAIN ENTRY POINT TO SEARCH ALL PATIENTS
 N INDEX,RETURN,STARTDATE,SDPATIENT,SDSTART
 S STARTDATE=$$FMADD^XLFDT(DT,-91)_".999999"
 D MES^XPDUTL("")
 D MES^XPDUTL("                CLINIC FILE 'S' NODE MISMATCH REPORT")
 D MES^XPDUTL("")
 D MES^XPDUTL("PATIENT DFN^APPT IEN^CLINIC IEN^APPT START DATE/TIME^APPT CREATE DATE^ISSUE")
 D MES^XPDUTL("")
 S SDPATIENT=0
 F  S SDPATIENT=$O(^SDEC(409.84,"APTDT",SDPATIENT)) Q:'SDPATIENT  D
 . S SDSTART=STARTDATE
 . I $G(INCLUDECAN) D ALLONEPAT(.RETURN,SDPATIENT,SDSTART)
 . I '$G(INCLUDECAN) D ONEPAT(.RETURN,SDPATIENT,SDSTART)
 . I $D(RETURN) D
 . . S INDEX=0 F  S INDEX=$O(RETURN(INDEX)) Q:'INDEX  D
 . . . D MES^XPDUTL(RETURN(INDEX))
 . . K RETURN
 Q
 ;
ALLONEPAT(RETURN,SDPATIENT,SDSTART) ; Full S Node Search for a single patient
 N APPTCNT,APPTIEN,CLINICIEN,DATEMADE,FOUND,INDEX,RESOURCE,SNODE,SNODECNT,SNODEIEN
 S INDEX=0
 F  S SDSTART=$O(^SDEC(409.84,"APTDT",SDPATIENT,SDSTART)) Q:'SDSTART  D
 . S (APPTCNT,APPTIEN,SNODECNT)=0
 . F  S APPTIEN=$O(^SDEC(409.84,"APTDT",SDPATIENT,SDSTART,APPTIEN)) Q:'APPTIEN  D
 . . S RESOURCE=$$GET1^DIQ(409.84,APPTIEN,.07,"I")
 . . S CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
 . . S DATEMADE=$$GET1^DIQ(409.84,APPTIEN,.09,"I")
 . . I '$D(^SC(CLINICIEN,"S",SDSTART)) D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^MISSING PARENT IN 44.003"
 . . I '$O(^SC(CLINICIEN,"S",SDSTART,1,0)) D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^NO RECORDS UNDER 44.003 PARENT"
 . . S APPTCNT=APPTCNT+1,(FOUND,SNODECNT,SNODEIEN)=0
 . . F  S SNODEIEN=$O(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN)) Q:'SNODEIEN  D
 . . . S SNODE=$G(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN,0)) Q:'+SNODE
 . . . I +SNODE=SDPATIENT S SNODECNT=SNODECNT+1
 . . . I DATEMADE=$P(SNODE,"^",7) S FOUND=1
 . . I 'FOUND D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^MATCHING 'S' NODE NOT FOUND"
 . . I APPTCNT'=SNODECNT D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^MISMATCHING PATIENT 'S' NODES FOR APPT DATE/TIME"
 Q
 ;
ONEPAT(RETURN,SDPATIENT,SDSTART) ; Non-canceled S Node Search for a single patient
 N APPTCNT,APPTIEN,CANCELED,CLINICIEN,DATEMADE,FOUND,INDEX,RESOURCE,SNODE,SNODECNT,SNODEIEN
 S INDEX=0
 F  S SDSTART=$O(^SDEC(409.84,"APTDT",SDPATIENT,SDSTART)) Q:'SDSTART  D
 . S (APPTCNT,APPTIEN,SNODECNT)=0
 . S APPTIEN=$O(^SDEC(409.84,"APTDT",SDPATIENT,SDSTART,APPTIEN)) Q:'APPTIEN  D
 . . S CANCELED=$$GET1^DIQ(409.84,APPTIEN,.12,"I")
 . . Q:$G(CANCELED)
 . . S RESOURCE=$$GET1^DIQ(409.84,APPTIEN,.07,"I")
 . . S CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
 . . S DATEMADE=$$GET1^DIQ(409.84,APPTIEN,.09,"I")
 . . I '$D(^SC(CLINICIEN,"S",SDSTART)) D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^MISSING PARENT IN 44.003"
 . . I '$O(^SC(CLINICIEN,"S",SDSTART,1,0)) D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^NO RECORDS UNDER 44.003 PARENT"
 . . S (FOUND,SNODECNT,SNODEIEN)=0
 . . F  S SNODEIEN=$O(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN)) Q:'SNODEIEN!(FOUND)  D
 . . . S SNODE=$G(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN,0)) Q:'+SNODE
 . . . Q:+SNODE'=SDPATIENT
 . . . Q:$P(SNODE,"^",9)="C"
 . . . Q:DATEMADE'=$P(SNODE,"^",7)
 . . . S FOUND=1
 . . I 'FOUND D  Q
 . . . S INDEX=INDEX+1
 . . . S RETURN(INDEX)=SDPATIENT_"^"_APPTIEN_"^"_CLINICIEN_"^"_SDSTART_"^"_DATEMADE_"^MATCHING 'S' NODE NOT FOUND"
 Q
 ;
FIXONE(APPTIEN) ;
 ;
 N ADJUSTAVAIL,APPTDATA,CLINICIEN,ENDTIME,ERR,FDA,FDAERR,RESOURCE,STARTTIME,MSG,NEWIEN44001
 S ERR=0
 ;
 I '$D(^SDEC(409.84,APPTIEN)) D  Q
 . S MSG=APPTIEN_" is an invalid Appointment IEN."
 . D WRTMSG(MSG)
 ;
 I $$CHECKONE(APPTIEN) D  Q
 . S MSG="Appointment IEN "_APPTIEN_" already has a valid 'S' node."
 . D WRTMSG(MSG)
 ;
 D GETS^DIQ(409.84,APPTIEN,".01;.02;.03;.04;.05;.07;.08;.09;.12;.14;.18","I","APPTDATA","SDERRORS")
 S RESOURCE=APPTDATA(409.84,APPTIEN_",",.07,"I")
 S CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
 S STARTTIME=APPTDATA(409.84,APPTIEN_",",.01,"I")
 S ENDTIME=APPTDATA(409.84,APPTIEN_",",.02,"I")
 ;
 I '$D(^SC(CLINICIEN,"S",STARTTIME)) D  Q:ERR
 . S NEWIEN44001(1)=STARTTIME
 . S FDA(44.001,"+1,"_CLINICIEN_",",.01)=STARTTIME
 . D UPDATE^DIE(,"FDA","NEWIEN44001","FDAERR")
 . I $D(FDAERR) D
 . . S ERR=1,MSG="There was an issue creating the Parent 'S' Node"
 . . D WRTMSG(MSG)
 . K FDA,FDAERR
 ;
 N IENS,INDEX,NEWIEN44003,NOTE
 S IENS=STARTTIME_","_CLINICIEN_",",INDEX=0,NOTE=""
 S FDA(44.003,"+1,"_IENS,.01)=APPTDATA(409.84,APPTIEN_",",.05,"I") ; Patient DFN
 S FDA(44.003,"+1,"_IENS,1)=APPTDATA(409.84,APPTIEN_",",.18,"I") ; Appt Length
 I $L($G(APPTDATA(409.84,APPTIEN_",",1,1))) D
 . F  S INDEX=$O(APPTDATA(409.84,APPTIEN_",",1,INDEX)) Q:'INDEX  D
 . . I '$L(NOTE) S NOTE=APPTDATA(409.84,APPTIEN_",",1,INDEX) Q
 . . S NOTE=" "_APPTDATA(409.84,APPTIEN_",",1,INDEX)
 . S FDA(44.003,"+1,"_IENS,3)=NOTE ; Appt Reason
 S FDA(44.003,"+1,"_IENS,7)=APPTDATA(409.84,APPTIEN_",",.08,"I") ; Data Entry Clerk
 S FDA(44.003,"+1,"_IENS,8)=APPTDATA(409.84,APPTIEN_",",.09,"I") ; Date Appt Made
 S FDA(44.003,"+1,"_IENS,30)=$P($G(^DPT(APPTDATA(409.84,APPTIEN_",",.05,"I"),.36)),"^",1) ; Eligibility
 ;
 I $G(APPTDATA(409.84,APPTIEN_",",.12,"I")) S FDA(44.003,"+1,"_IENS,310)="C" ; Appt Canceled?
 S FDA(44.003,"+1,"_IENS,9)="" ; Overbook node
 D UPDATE^DIE(,"FDA","NEWIEN44003","FDAERR")
 I $D(FDAERR) D  Q
 . S MSG="There was an issue creating the missing 'S' Node for Appt IEN: "_APPTIEN_"."
 ;
 I $G(APPTDATA(409.84,APPTIEN_",",.03,"I")) D
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^")=APPTDATA(409.84,APPTIEN_",",.03,"I") ; Checked-in
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^",2)=APPTDATA(409.84,APPTIEN_",",.08,"I") ; Check In User
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^",5)=APPTDATA(409.84,APPTIEN_",",.04,"I") ; Check In Entered
 I $G(APPTDATA(409.84,APPTIEN_",",.14,"I")) D
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^",3)=APPTDATA(409.84,APPTIEN_",",.14,"I") ; Checked Out
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^",4)=APPTDATA(409.84,APPTIEN_",",.08,"I") ; Check Out User
 . S $P(^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"C"),"^",6)=APPTDATA(409.84,APPTIEN_",",.14,"I") ; Check Out Entered
 ;
 S MSG="The missing 'S' node for Appt IEN "_APPTIEN_" has been created."
 D WRTMSG(MSG)
 ;
 I $P(STARTTIME,".")<DT D  Q
 . S MSG="Appointment IEN "_APPTIEN_" is in the past, please check and adjust availability, if needed."
 . D WRTMSG(MSG)
 ;
 ; does current avail match actual avail?
 N ERRORS
 S ADJUSTAVAIL=$$COMPAREAVAIL(CLINICIEN,STARTTIME,ENDTIME,.ERRORS)
 I $G(ERRORS) D  Q
 . S MSG="There was an issue calculating availability - please check manually."
 . D WRTMSG(MSG)
 ;
 I ADJUSTAVAIL=0 D  Q
 . S MSG="The current availability for "_$$FMTISO^SDAMUTDT(STARTTIME)_" appears to be correct."
 . D WRTMSG(MSG)
 ;
 I ADJUSTAVAIL>0 D
 . D INCREMENTAVAIL1^SDESUTIL(CLINICIEN,STARTTIME,APPTDATA(409.84,APPTIEN_",",.18,"I"))
 ;
 I ADJUSTAVAIL<0 D
 . D AVUPDT^SDEC07C(CLINICIEN,STARTTIME,APPTDATA(409.84,APPTIEN_",",.18,"I"))
 ;
 S MSG="Clinic availability has been adjusted for "_$$FMTISO^SDAMUTDT(STARTTIME)_"."
 D WRTMSG(MSG)
 ;
 I ADJUSTAVAIL=-2 D  Q
 . S ^SC(CLINICIEN,"S",STARTTIME,1,NEWIEN44003(1),"OB")="O"
 . S MSG="Appointment IEN "_APPTIEN_" has been marked as an overbook."
 . D WRTMSG(MSG)
 ;
 Q
 ;
WRTMSG(MSG) ; 
 ;
 D MES^XPDUTL("")
 D MES^XPDUTL(MSG)
 D MES^XPDUTL("")
 Q
 ;
CHECKONE(APPTIEN) ;
 N CANCELED,CLINICIEN,DATEMADE,FOUND,RESOURCE,SDPATIENT,SDSTART,SNODE,SNODEIEN
 ;
 S SDSTART=$$GET1^DIQ(409.84,APPTIEN,.01,"I")
 S SDPATIENT=$$GET1^DIQ(409.84,APPTIEN,.05,"I")
 S RESOURCE=$$GET1^DIQ(409.84,APPTIEN,.07,"I")
 S CLINICIEN=$$GET1^DIQ(409.831,RESOURCE,.04,"I")
 S DATEMADE=$$GET1^DIQ(409.84,APPTIEN,.09,"I")
 S CANCELED=$$GET1^DIQ(409.84,APPTIEN,.12,"I")
 ;
 ; no 44.003 parent
 I '$D(^SC(CLINICIEN,"S",SDSTART)) Q 0
 ; no children under 44.003 parent
 I '$O(^SC(CLINICIEN,"S",SDSTART,1,0)) Q 0
 ;
 S (FOUND,SNODEIEN)=0
 F  S SNODEIEN=$O(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN)) Q:'SNODEIEN  D
 . S SNODE=$G(^SC(CLINICIEN,"S",SDSTART,1,SNODEIEN,0)) Q:'+SNODE
 . ; wrong patient
 . Q:+SNODE'=SDPATIENT
 . ; wrong create date
 . Q:DATEMADE'=$P(SNODE,"^",7)
 . ; mismatches
 . Q:$G(CANCELED)&($P(SNODE,"^",9)'="")
 . Q:'$G(CANCELED)&($P(SNODE,"^",9)="C")
 . S FOUND=1
 I 'FOUND Q 0
 Q 1
 ;
COMPAREAVAIL(CLINICIEN,STARTTIME,ENDTIME,ERRORS) ;
 ;
 N APPTCNT,COMPTIME,CURRAVAIL,INDEX,JSONRET,ORIGAVAIL,RETURN
 S (CURRAVAIL,ORIGAVAIL)=0
 ;
 ; get original availability
 D GETSCHEDULE^SDESCLINDAILYSCH(.RETURN,CLINICIEN,$$FMTISO^SDAMUTDT($P(STARTTIME,".")))
 D DECODE^XLFJSON("RETURN","JSONRET")
 I $D(JSONRET("Error")) S ERRORS=1 Q ""
 ;
 S COMPTIME="*"_$P(STARTTIME,".",2),COMPTIME=$E(COMPTIME_$TR($J("",5)," ","0"),2,5)
 S INDEX=0
 F  S INDEX=$O(JSONRET("ClinicSlot",INDEX)) Q:'INDEX  D
 . I $G(JSONRET("ClinicSlot",INDEX,"StartTime"))=COMPTIME D
 . . S ORIGAVAIL=JSONRET("ClinicSlot",INDEX,"OpenSlots")
 ;
 ; get current availability
 K JSONRET,RETURN
 D GETCLAVAILABLTY^SDESCLINICAVAIL(.RETURN,CLINICIEN,$$FMTISO^SDAMUTDT(STARTTIME),$$FMTISO^SDAMUTDT(ENDTIME))
 D DECODE^XLFJSON("RETURN","JSONRET")
 I $D(JSONRET("Error")) S ERRORS=1 Q ""
 ;
 S INDEX=0
 F  S INDEX=$O(JSONRET("ClinAvail",INDEX)) Q:'INDEX  D
 . I $G(JSONRET("ClinAvail",INDEX,"BeginTime"))=$$FMTISO^SDAMUTDT(STARTTIME) D
 . . S CURRAVAIL=JSONRET("ClinAvail",INDEX,"SlotsAvail")
 ;
 ; get actual avail by looping through the clinic's "S" node
 S (APPTCNT,INDEX)=0
 F  S INDEX=$O(^SC(CLINICIEN,"S",STARTTIME,1,INDEX)) Q:'INDEX  D
 . Q:'$D(^SC(CLINICIEN,"S",STARTTIME,1,INDEX,0))
 . Q:$P(^SC(CLINICIEN,"S",STARTTIME,1,INDEX,0),"^",9)="C"
 . Q:$G(^SC(CLINICIEN,"S",STARTTIME,1,INDEX,"OB"))="O"
 . S APPTCNT=APPTCNT+1
 ;
 ; determine if adjustment is needed
 I (ORIGAVAIL-APPTCNT)=CURRAVAIL Q 0
 I ((ORIGAVAIL-APPTCNT)<CURRAVAIL)&(CURRAVAIL=0) Q -2 ;overbook
 I (ORIGAVAIL-APPTCNT)<CURRAVAIL Q -1 ;decrement avail
 I (ORIGAVAIL-APPTCNT)>CURRAVAIL Q 1 ;increment avail
 Q ""