SDESPATRPC ;ALB/TAW,RJT,ANU,MGD,DJS,RRM,MGD - PATIENT RPCS ;Apr 23, 2026
;;5.3;Scheduling;**792,804,805,807,809,814,816,820,823,824,943**;Aug 13, 1993;Build 5
;
; Reference to ^IBA(355.33 in ICR #6891
; Reference to $$GETS^DIQ,$$GET1^DIQ in ICR #2056
; Reference to #354 in ICR #5296
;
Q
;
INSURINDICATORS(RETURN,DFNS) ;
Q:$D(DFNS)=0
N INDICATORS,SDINDEX,HASDFNERRORS,PTDFN,SDINDEX,SDCNT
S SDINDEX="",SDCNT=0
F S SDINDEX=$O(DFNS(SDINDEX)) Q:(SDINDEX="")!(SDCNT>100) D
.S SDCNT=SDCNT+1
.S PTDFN=DFNS(SDINDEX)
.S INDICATORS("NeedInsuranceVerification",SDINDEX,"DFN")=PTDFN
.S INDICATORS("NeedInsuranceVerification",SDINDEX,"ICN")=$$GETPATICN^SDESINPUTVALUTL(PTDFN)
.I $G(SDCNT)>100 D
..S INDICATORS("NeedInsuranceVerification",SDINDEX,"Errors")="Max number of records allowed is 100"
.Q:SDCNT>100
.N DFNERRORS
.S HASDFNERRORS=$$VALIDATEDFN(.DFNERRORS,PTDFN)
.I $G(HASDFNERRORS) D
..S INDICATORS("NeedInsuranceVerification",SDINDEX,"Errors")="DFN Error"
..S INDICATORS("NeedInsuranceVerification",SDINDEX,"YesNo")=""
.I '$G(HASDFNERRORS) D
..N FLG
..D NEEDVERIFY(.FLG,PTDFN,180,90)
..S INDICATORS("NeedInsuranceVerification",SDINDEX,"YesNo")=FLG
D BUILDJSON(.RETURN,.INDICATORS)
Q
;
VALIDATEDFN(ERRORS,PDFN) ;
N ERRORFLAG
I $G(PDFN)="" S ERRORFLAG=1 D ERRLOG^SDESJSON(.ERRORS,1)
I $G(PDFN)'="",'$D(^DPT(PDFN,0)) S ERRORFLAG=1 D ERRLOG^SDESJSON(.ERRORS,2)
Q $D(ERRORFLAG)
;
BUILDJSON(JSONRETURN,INPUT) ;
N JSONERROR
S JSONERROR=""
D ENCODE^XLFJSON("INPUT","JSONRETURN","JSONERROR")
Q
;
INSURVERIFYREQ(RETURN,DFN,SDEAS) ;
N POP,SDPAT,FLG
S (FLG,POP)=0
S DFN=$G(DFN)
I DFN="" S POP=1 D ERRLOG^SDESJSON(.SDPAT,1)
I DFN'="",'$D(^DPT(DFN,0)) S POP=1 D ERRLOG^SDESJSON(.SDPAT,2)
S SDEAS=$G(SDEAS,"")
I $L(SDEAS) S SDEAS=$$EASVALIDATE^SDESUTIL(SDEAS)
I $G(SDEAS)=-1 S POP=1 D ERRLOG^SDESJSON(.SDPAT,142)
I '$G(POP) D NEEDVERIFY(.FLG,DFN,180,90) S SDPAT("NeedInsuranceVerification","YesNo")=FLG
D BUILDER
Q
NEEDVERIFY(NEEDVERIFY,DFN,LASTVERFWINDOW,NOCOVWINDOW) ;
; LASTVERFWINDOW - How many days in the past to look for a Last Verified Date
; NOCOVWINDOW - How many days in the past to look for a No Coverage Date
;
; Return
; 1 = Verification needed (Default)
; 0 = Has active insurance or verification started
N IENS,SDMSG,PATDATA,BILLPATDATA,NOCOVDT,COVBYHI,SUBIEN,XDT,TMPDT,INDEXEND,IBAIEN,IBADATA
N FEDONLY,FEDPOLICY
S NEEDVERIFY=1
;
;SD*5.3*816
;
S IBAIEN=""
S FEDONLY="Y"
F S IBAIEN=$O(^IBA(355.33,"C",DFN,IBAIEN)) Q:IBAIEN=""!(FEDONLY="N") D
.S FEDPOLICY=""
.S FEDPOLICY=$$GET1^DIQ(355.33,IBAIEN,20.01,"E")
.S FEDPOLICY=$G(FEDPOLICY,"")
.S FEDPOLICY=$$UP^XLFSTR(FEDPOLICY)
.Q:((FEDPOLICY["MEDICAID")!(FEDPOLICY["MEDICARE")!(FEDPOLICY["TRICARE")!(FEDPOLICY["CHAMPVA"))
.S FEDONLY="N"
;
S SUBIEN=0
F S SUBIEN=$O(^DPT(DFN,.312,SUBIEN)) Q:SUBIEN=""!('SUBIEN)!(FEDONLY="N") D
.S IENS=SUBIEN_","_DFN_","
.K PATDATA,SDMSG
.D GETS^DIQ(2.312,IENS,".01;3","IE","PATDATA","SDMSG")
.Q:$D(SDMSG)
.;Check the Insurance Expiration Data is active
.S TMPDT=$G(PATDATA(2.312,IENS,3,"I"))
.I +TMPDT,(+TMPDT'>DT) Q ;term date of today is inactive coverage
.S FEDPOLICY=""
.S FEDPOLICY=$G(PATDATA(2.312,IENS,.01,"E"))
.S FEDPOLICY=$$UP^XLFSTR(FEDPOLICY)
.Q:((FEDPOLICY["MEDICAID")!(FEDPOLICY["MEDICARE")!(FEDPOLICY["TRICARE")!(FEDPOLICY["CHAMPVA"))
.S FEDONLY="N"
;
I $G(FEDONLY)="Y" S LASTVERFWINDOW=365
;
;Check the Insurance Verification Processor file
; The assumption is that once verification is complete all
; references to the patient are removed.
S IBAIEN=""
S INDEXEND=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
F S IBAIEN=$O(^IBA(355.33,"C",DFN,IBAIEN)) Q:IBAIEN="" D
. K IBADATA
. Q:$$GET1^DIQ(355.33,IBAIEN,.01,"I")<INDEXEND
. I $$GET1^DIQ(355.33,IBAIEN,.04,"I")="E" S NEEDVERIFY=0 ;Entered - verification has started
I $G(NEEDVERIFY)=0 Q ;Verification not needed
;
;Check the Insurance Types (sub file .312) of the Patient File (#2)
S SUBIEN=0
F S SUBIEN=$O(^DPT(DFN,.312,SUBIEN)) Q:SUBIEN=""!(NEEDVERIFY=0)!('SUBIEN) D
.S IENS=SUBIEN_","_DFN_","
.K PATDATA,SDMSG
.D GETS^DIQ(2.312,IENS,"1.03;3","I","PATDATA","SDMSG")
.Q:$D(SDMSG)
.;Check the Insurance Expiration Data is active
.S TMPDT=$G(PATDATA(2.312,IENS,3,"I"))
.I +TMPDT,(+TMPDT'>DT) Q ;term date of today is inactive coverage
.;Check the Date Last Verified
.S TMPDT=$P($G(PATDATA(2.312,IENS,1.03,"I")),".")
.I TMPDT D
..S XDT=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
..S XDT=$G(XDT)
..I XDT<TMPDT S NEEDVERIFY=0
I $G(NEEDVERIFY)=0 Q ;Verification not needed
;
;If no insurance or unknown on file then check the Covered by Health Insurance date
K PATDATA,SDMSG
D GETS^DIQ(2,DFN,".3192","I","PATDATA","SDMSG")
Q:$D(SDMSG)
S COVBYHI=$G(PATDATA(2,DFN_",",.3192,"I"))
I COVBYHI="N"!(COVBYHI="U") D
.K BILLPATDATA,SDMSG
.D GETS^DIQ(354,DFN,"60","I","BILLPATDATA","SDMSG")
.Q:$D(SDMSG)
.S NOCOVDT=$G(BILLPATDATA(354,DFN_",",60,"I"))
.I NOCOVDT D
..S XDT=$$FMADD^XLFDT(DT,-NOCOVWINDOW)
..I $G(XDT)<NOCOVDT S NEEDVERIFY=0
Q
;
BUILDER ;Convert data to JSON
N JSONERR
S JSONERR=""
D ENCODE^SDESJSON(.SDPAT,.RETURN,.JSONERR)
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSDESPATRPC 5252 printed Jul 22, 2026@16:06:51 Page 2
SDESPATRPC ;ALB/TAW,RJT,ANU,MGD,DJS,RRM,MGD - PATIENT RPCS ;Apr 23, 2026
+1 ;;5.3;Scheduling;**792,804,805,807,809,814,816,820,823,824,943**;Aug 13, 1993;Build 5
+2 ;
+3 ; Reference to ^IBA(355.33 in ICR #6891
+4 ; Reference to $$GETS^DIQ,$$GET1^DIQ in ICR #2056
+5 ; Reference to #354 in ICR #5296
+6 ;
+7 QUIT
+8 ;
INSURINDICATORS(RETURN,DFNS) ;
+1 if $DATA(DFNS)=0
QUIT
+2 NEW INDICATORS,SDINDEX,HASDFNERRORS,PTDFN,SDINDEX,SDCNT
+3 SET SDINDEX=""
SET SDCNT=0
+4 FOR
SET SDINDEX=$ORDER(DFNS(SDINDEX))
if (SDINDEX="")!(SDCNT>100)
QUIT
Begin DoDot:1
+5 SET SDCNT=SDCNT+1
+6 SET PTDFN=DFNS(SDINDEX)
+7 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"DFN")=PTDFN
+8 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"ICN")=$$GETPATICN^SDESINPUTVALUTL(PTDFN)
+9 IF $GET(SDCNT)>100
Begin DoDot:2
+10 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"Errors")="Max number of records allowed is 100"
End DoDot:2
+11 if SDCNT>100
QUIT
+12 NEW DFNERRORS
+13 SET HASDFNERRORS=$$VALIDATEDFN(.DFNERRORS,PTDFN)
+14 IF $GET(HASDFNERRORS)
Begin DoDot:2
+15 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"Errors")="DFN Error"
+16 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"YesNo")=""
End DoDot:2
+17 IF '$GET(HASDFNERRORS)
Begin DoDot:2
+18 NEW FLG
+19 DO NEEDVERIFY(.FLG,PTDFN,180,90)
+20 SET INDICATORS("NeedInsuranceVerification",SDINDEX,"YesNo")=FLG
End DoDot:2
End DoDot:1
+21 DO BUILDJSON(.RETURN,.INDICATORS)
+22 QUIT
+23 ;
VALIDATEDFN(ERRORS,PDFN) ;
+1 NEW ERRORFLAG
+2 IF $GET(PDFN)=""
SET ERRORFLAG=1
DO ERRLOG^SDESJSON(.ERRORS,1)
+3 IF $GET(PDFN)'=""
IF '$DATA(^DPT(PDFN,0))
SET ERRORFLAG=1
DO ERRLOG^SDESJSON(.ERRORS,2)
+4 QUIT $DATA(ERRORFLAG)
+5 ;
BUILDJSON(JSONRETURN,INPUT) ;
+1 NEW JSONERROR
+2 SET JSONERROR=""
+3 DO ENCODE^XLFJSON("INPUT","JSONRETURN","JSONERROR")
+4 QUIT
+5 ;
INSURVERIFYREQ(RETURN,DFN,SDEAS) ;
+1 NEW POP,SDPAT,FLG
+2 SET (FLG,POP)=0
+3 SET DFN=$GET(DFN)
+4 IF DFN=""
SET POP=1
DO ERRLOG^SDESJSON(.SDPAT,1)
+5 IF DFN'=""
IF '$DATA(^DPT(DFN,0))
SET POP=1
DO ERRLOG^SDESJSON(.SDPAT,2)
+6 SET SDEAS=$GET(SDEAS,"")
+7 IF $LENGTH(SDEAS)
SET SDEAS=$$EASVALIDATE^SDESUTIL(SDEAS)
+8 IF $GET(SDEAS)=-1
SET POP=1
DO ERRLOG^SDESJSON(.SDPAT,142)
+9 IF '$GET(POP)
DO NEEDVERIFY(.FLG,DFN,180,90)
SET SDPAT("NeedInsuranceVerification","YesNo")=FLG
+10 DO BUILDER
+11 QUIT
NEEDVERIFY(NEEDVERIFY,DFN,LASTVERFWINDOW,NOCOVWINDOW) ;
+1 ; LASTVERFWINDOW - How many days in the past to look for a Last Verified Date
+2 ; NOCOVWINDOW - How many days in the past to look for a No Coverage Date
+3 ;
+4 ; Return
+5 ; 1 = Verification needed (Default)
+6 ; 0 = Has active insurance or verification started
+7 NEW IENS,SDMSG,PATDATA,BILLPATDATA,NOCOVDT,COVBYHI,SUBIEN,XDT,TMPDT,INDEXEND,IBAIEN,IBADATA
+8 NEW FEDONLY,FEDPOLICY
+9 SET NEEDVERIFY=1
+10 ;
+11 ;SD*5.3*816
+12 ;
+13 SET IBAIEN=""
+14 SET FEDONLY="Y"
+15 FOR
SET IBAIEN=$ORDER(^IBA(355.33,"C",DFN,IBAIEN))
if IBAIEN=""!(FEDONLY="N")
QUIT
Begin DoDot:1
+16 SET FEDPOLICY=""
+17 SET FEDPOLICY=$$GET1^DIQ(355.33,IBAIEN,20.01,"E")
+18 SET FEDPOLICY=$GET(FEDPOLICY,"")
+19 SET FEDPOLICY=$$UP^XLFSTR(FEDPOLICY)
+20 if ((FEDPOLICY["MEDICAID")!(FEDPOLICY["MEDICARE")!(FEDPOLICY["TRICARE")!(FEDPOLICY["CHAMPVA"))
QUIT
+21 SET FEDONLY="N"
End DoDot:1
+22 ;
+23 SET SUBIEN=0
+24 FOR
SET SUBIEN=$ORDER(^DPT(DFN,.312,SUBIEN))
if SUBIEN=""!('SUBIEN)!(FEDONLY="N")
QUIT
Begin DoDot:1
+25 SET IENS=SUBIEN_","_DFN_","
+26 KILL PATDATA,SDMSG
+27 DO GETS^DIQ(2.312,IENS,".01;3","IE","PATDATA","SDMSG")
+28 if $DATA(SDMSG)
QUIT
+29 ;Check the Insurance Expiration Data is active
+30 SET TMPDT=$GET(PATDATA(2.312,IENS,3,"I"))
+31 ;term date of today is inactive coverage
IF +TMPDT
IF (+TMPDT'>DT)
QUIT
+32 SET FEDPOLICY=""
+33 SET FEDPOLICY=$GET(PATDATA(2.312,IENS,.01,"E"))
+34 SET FEDPOLICY=$$UP^XLFSTR(FEDPOLICY)
+35 if ((FEDPOLICY["MEDICAID")!(FEDPOLICY["MEDICARE")!(FEDPOLICY["TRICARE")!(FEDPOLICY["CHAMPVA"))
QUIT
+36 SET FEDONLY="N"
End DoDot:1
+37 ;
+38 IF $GET(FEDONLY)="Y"
SET LASTVERFWINDOW=365
+39 ;
+40 ;Check the Insurance Verification Processor file
+41 ; The assumption is that once verification is complete all
+42 ; references to the patient are removed.
+43 SET IBAIEN=""
+44 SET INDEXEND=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
+45 FOR
SET IBAIEN=$ORDER(^IBA(355.33,"C",DFN,IBAIEN))
if IBAIEN=""
QUIT
Begin DoDot:1
+46 KILL IBADATA
+47 if $$GET1^DIQ(355.33,IBAIEN,.01,"I")<INDEXEND
QUIT
+48 ;Entered - verification has started
IF $$GET1^DIQ(355.33,IBAIEN,.04,"I")="E"
SET NEEDVERIFY=0
End DoDot:1
+49 ;Verification not needed
IF $GET(NEEDVERIFY)=0
QUIT
+50 ;
+51 ;Check the Insurance Types (sub file .312) of the Patient File (#2)
+52 SET SUBIEN=0
+53 FOR
SET SUBIEN=$ORDER(^DPT(DFN,.312,SUBIEN))
if SUBIEN=""!(NEEDVERIFY=0)!('SUBIEN)
QUIT
Begin DoDot:1
+54 SET IENS=SUBIEN_","_DFN_","
+55 KILL PATDATA,SDMSG
+56 DO GETS^DIQ(2.312,IENS,"1.03;3","I","PATDATA","SDMSG")
+57 if $DATA(SDMSG)
QUIT
+58 ;Check the Insurance Expiration Data is active
+59 SET TMPDT=$GET(PATDATA(2.312,IENS,3,"I"))
+60 ;term date of today is inactive coverage
IF +TMPDT
IF (+TMPDT'>DT)
QUIT
+61 ;Check the Date Last Verified
+62 SET TMPDT=$PIECE($GET(PATDATA(2.312,IENS,1.03,"I")),".")
+63 IF TMPDT
Begin DoDot:2
+64 SET XDT=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
+65 SET XDT=$GET(XDT)
+66 IF XDT<TMPDT
SET NEEDVERIFY=0
End DoDot:2
End DoDot:1
+67 ;Verification not needed
IF $GET(NEEDVERIFY)=0
QUIT
+68 ;
+69 ;If no insurance or unknown on file then check the Covered by Health Insurance date
+70 KILL PATDATA,SDMSG
+71 DO GETS^DIQ(2,DFN,".3192","I","PATDATA","SDMSG")
+72 if $DATA(SDMSG)
QUIT
+73 SET COVBYHI=$GET(PATDATA(2,DFN_",",.3192,"I"))
+74 IF COVBYHI="N"!(COVBYHI="U")
Begin DoDot:1
+75 KILL BILLPATDATA,SDMSG
+76 DO GETS^DIQ(354,DFN,"60","I","BILLPATDATA","SDMSG")
+77 if $DATA(SDMSG)
QUIT
+78 SET NOCOVDT=$GET(BILLPATDATA(354,DFN_",",60,"I"))
+79 IF NOCOVDT
Begin DoDot:2
+80 SET XDT=$$FMADD^XLFDT(DT,-NOCOVWINDOW)
+81 IF $GET(XDT)<NOCOVDT
SET NEEDVERIFY=0
End DoDot:2
End DoDot:1
+82 QUIT
+83 ;
BUILDER ;Convert data to JSON
+1 NEW JSONERR
+2 SET JSONERR=""
+3 DO ENCODE^SDESJSON(.SDPAT,.RETURN,.JSONERR)
+4 QUIT