- SDESPATRPC ;ALB/TAW,RJT,ANU,MGD,DJS,RRM - PATIENT RPCS ;Aug 11, 2022
- ;;5.3;Scheduling;**792,804,805,807,809,814,816,820,823,824**;Aug 13, 1993;Build 3
- ;
- ; 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
- .D GETS^DIQ(2.312,IENS,".01;3","IE","PATDATA","SDMSG")
- .;Check the Insurance Expiration Data is active
- .S TMPDT=PATDATA(2.312,IENS,3,"I")
- .S TMPDT=$G(TMPDT)
- .I +TMPDT,(+TMPDT'>DT) Q ;term date of today is inactive coverage
- .S FEDPOLICY=""
- .S FEDPOLICY=PATDATA(2.312,IENS,.01,"E")
- .S FEDPOLICY=$G(FEDPOLICY,"")
- .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 .321) 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
- .D GETS^DIQ(2.312,IENS,"1.03;3","I","PATDATA","SDMSG")
- .;Check the Insurance Expiration Data is active
- .S TMPDT=PATDATA(2.312,IENS,3,"I")
- .S TMPDT=$G(TMPDT)
- .I +TMPDT,(+TMPDT'>DT) Q ;term date of today is inactive coverage
- .;Check the Date Last Verified
- .S TMPDT=$P(PATDATA(2.312,IENS,1.03,"I"),".")
- .S TMPDT=$G(TMPDT)
- .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
- D GETS^DIQ(2,DFN,".3192","I","PATDATA","SDMSG")
- S COVBYHI=PATDATA(2,DFN_",",.3192,"I")
- S COVBYHI=$G(COVBYHI)
- I COVBYHI="N"!(COVBYHI="U") D
- .D GETS^DIQ(354,DFN,"60","I","BILLPATDATA","SDMSG")
- .S NOCOVDT=$G(BILLPATDATA(354,DFN_",",60,"I"))
- .S NOCOVDT=$G(NOCOVDT)
- .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 5256 printed Feb 19, 2025@00:24:01 Page 2
- SDESPATRPC ;ALB/TAW,RJT,ANU,MGD,DJS,RRM - PATIENT RPCS ;Aug 11, 2022
- +1 ;;5.3;Scheduling;**792,804,805,807,809,814,816,820,823,824**;Aug 13, 1993;Build 3
- +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
- +27 DO GETS^DIQ(2.312,IENS,".01;3","IE","PATDATA","SDMSG")
- +28 ;Check the Insurance Expiration Data is active
- +29 SET TMPDT=PATDATA(2.312,IENS,3,"I")
- +30 SET TMPDT=$GET(TMPDT)
- +31 ;term date of today is inactive coverage
- IF +TMPDT
- IF (+TMPDT'>DT)
- QUIT
- +32 SET FEDPOLICY=""
- +33 SET FEDPOLICY=PATDATA(2.312,IENS,.01,"E")
- +34 SET FEDPOLICY=$GET(FEDPOLICY,"")
- +35 SET FEDPOLICY=$$UP^XLFSTR(FEDPOLICY)
- +36 if ((FEDPOLICY["MEDICAID")!(FEDPOLICY["MEDICARE")!(FEDPOLICY["TRICARE")!(FEDPOLICY["CHAMPVA"))
- QUIT
- +37 SET FEDONLY="N"
- End DoDot:1
- +38 ;
- +39 IF $GET(FEDONLY)="Y"
- SET LASTVERFWINDOW=365
- +40 ;
- +41 ;Check the Insurance Verification Processor file
- +42 ; The assumption is that once verification is complete all
- +43 ; references to the patient are removed.
- +44 SET IBAIEN=""
- +45 SET INDEXEND=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
- +46 FOR
- SET IBAIEN=$ORDER(^IBA(355.33,"C",DFN,IBAIEN))
- if IBAIEN=""
- QUIT
- Begin DoDot:1
- +47 KILL IBADATA
- +48 if $$GET1^DIQ(355.33,IBAIEN,.01,"I")<INDEXEND
- QUIT
- +49 ;Entered - verification has started
- IF $$GET1^DIQ(355.33,IBAIEN,.04,"I")="E"
- SET NEEDVERIFY=0
- End DoDot:1
- +50 ;Verification not needed
- IF $GET(NEEDVERIFY)=0
- QUIT
- +51 ;
- +52 ;Check the Insurance Types (sub file .321) of the Patient File (#2)
- +53 SET SUBIEN=0
- +54 FOR
- SET SUBIEN=$ORDER(^DPT(DFN,.312,SUBIEN))
- if SUBIEN=""!(NEEDVERIFY=0)!('SUBIEN)
- QUIT
- Begin DoDot:1
- +55 SET IENS=SUBIEN_","_DFN_","
- +56 KILL PATDATA
- +57 DO GETS^DIQ(2.312,IENS,"1.03;3","I","PATDATA","SDMSG")
- +58 ;Check the Insurance Expiration Data is active
- +59 SET TMPDT=PATDATA(2.312,IENS,3,"I")
- +60 SET TMPDT=$GET(TMPDT)
- +61 ;term date of today is inactive coverage
- IF +TMPDT
- IF (+TMPDT'>DT)
- QUIT
- +62 ;Check the Date Last Verified
- +63 SET TMPDT=$PIECE(PATDATA(2.312,IENS,1.03,"I"),".")
- +64 SET TMPDT=$GET(TMPDT)
- +65 IF TMPDT
- Begin DoDot:2
- +66 SET XDT=$$FMADD^XLFDT(DT,-LASTVERFWINDOW)
- +67 SET XDT=$GET(XDT)
- +68 IF XDT<TMPDT
- SET NEEDVERIFY=0
- End DoDot:2
- End DoDot:1
- +69 ;Verification not needed
- IF $GET(NEEDVERIFY)=0
- QUIT
- +70 ;
- +71 ;If no insurance or unknown on file then check the Covered by Health Insurance date
- +72 DO GETS^DIQ(2,DFN,".3192","I","PATDATA","SDMSG")
- +73 SET COVBYHI=PATDATA(2,DFN_",",.3192,"I")
- +74 SET COVBYHI=$GET(COVBYHI)
- +75 IF COVBYHI="N"!(COVBYHI="U")
- Begin DoDot:1
- +76 DO GETS^DIQ(354,DFN,"60","I","BILLPATDATA","SDMSG")
- +77 SET NOCOVDT=$GET(BILLPATDATA(354,DFN_",",60,"I"))
- +78 SET NOCOVDT=$GET(NOCOVDT)
- +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