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

IBCNOR1A.m

Go to the documentation of this file.
  1. IBCNOR1A ;AITC/DTG - PATIENT MISSING COVERAGE REPORT ;08/14/23
  1. ;;2.0;INTEGRATED BILLING;**771**;21-MAR-94;Build 26
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. Q
  1. COMPILE(IBCNORRTN,IBCNOR) ; Entry Point called from EN^XUTMDEVQ.
  1. ; IBCNORRTN = Routine name for ^TMP($J,...
  1. ; IBCNOR = Array of params
  1. ; Input:
  1. ; IBCNOR("IBI") = select INS 0 some, 1 all
  1. ; IBCNOR("IBIA") = only 1-Active Insurance Companies
  1. ; IBCNOR("IBIG") = 0-Selected, 1-All Group Plans
  1. ; IBCNOR("IBIGA")= only 1-Active Group Plans
  1. ; IBCNOR("IBIGN")= 1-Group Name, 2-Group Number, 3-Both Group Name and Group Number
  1. ; IBCNOR("IBFIL")= A^B^C where"
  1. ; A - 1-Begin with, 2-Contains, 3-Range
  1. ; B - A=1 Begin with text, A=2 Contains text, A=3 Range start text
  1. ; C - only if A=3 Range End text
  1. ; IBCNOR("IBOUT") E-EXCEL, R-REPORT
  1. ;
  1. ;
  1. ; Compile and Print Report
  1. N CRT,GDATA,GCT,GIEN,IBA,IBAR,IBC,IBCT,IBDOB,IBDOBI,IBEFFDT,IBEXPDT,IBIF,IBINS,IBITM,IBLNC,IBNA,IBNAM
  1. N IBNM,IBPGN,IBSSN,IBPTI,IBTMP,IBTYPE,IBXTFEED,ICT,IIEN,PLANOK,IBSCRCT,MAXCNT,X,Y
  1. ;
  1. S MAXCNT=IOSL-3,IBXTFEED=21,CRT=1,IBLNC=0
  1. I IOST'["C-" S MAXCNT=IOSL-6,IBXTFEED=50,CRT=0
  1. ; if selected insurances
  1. I 'IBCNOR("IBI") D
  1. . I $O(^TMP(IBJOB,"IBCNOR","FND",IBJOB,"INS","")) D
  1. . . K ^TMP("IBCNOR",$J,"INS") M ^TMP("IBCNOR",$J,"INS")=^TMP(IBJOB,"IBCNOR","FND")
  1. . I IBCNOR("IBIG") D
  1. . . D BLDINSGR^IBCNOR1 ; build insurance groups
  1. ;
  1. ; If ALL Insurance Companies, add to ^TMP("IBCNOR")
  1. I IBCNOR("IBI") D
  1. . S IIEN=0,INSCT=0 F S IIEN=$O(^DIC(36,IIEN)) Q:'IIEN D
  1. . . ; check insurance
  1. . . S INACT=+$$GET1^DIQ(36,IIEN_",",.05,"I") ;1=Inactive, 0=Active
  1. . . I INACT Q ; only select active insurances
  1. . . S IBINAME=$$GET1^DIQ(36,IIEN_",",.01,"I")
  1. . . S IBOK=1 D CHKNM^IBCNOR1(IBINAME) Q:'IBOK ; do not select if name is on exclusion list
  1. . . S INSCT=INSCT+1
  1. . . S ^TMP("IBCNOR",$J,"INS",INSCT)=IIEN
  1. . I $G(IOST)["C-" W !,"Build Insurance Groups...",!
  1. . D BLDINSGR^IBCNOR1 ; build insurance groups
  1. ;
  1. ;
  1. ; collect patients
  1. I $G(IOST)["C-" W !,"Collecting Subscribers ...",!
  1. D BLDPT ; collect all patients (subscribers) associated to insurance / groups
  1. ;
  1. S IBSCRCT=0
  1. K ^TMP($J,"PR")
  1. ;
  1. S IBTMP="^TMP(""IBCNOR"","_$J_")"
  1. ; build pt list of insurances
  1. S IBPTI=0,IBCT=0 K @IBTMP@("OUT")
  1. I $G(IOST)["C-" W !,"Building Output ...",!
  1. F S IBPTI=$O(@IBTMP@("P-PT",IBPTI)) Q:'IBPTI K ^TMP($J,"PR") D D COMPF
  1. . ; PT name
  1. . S IBITM=$G(@IBTMP@("P-PT",IBPTI))
  1. . S IBNAM=$P(IBITM,U,1)
  1. . S:IBNAM="" IBNAM="<Pt. "_IBPTI_" Name Missing>"
  1. . ; Retrieve last 4 of SSN (last 5 if pseudo SSN)
  1. .S X=$$GET1^DIQ(2,IBPTI_",",.09,"I") ; Patient's SSN
  1. .S X=$S($E(X,$L(X))="P":$E(X,$L(X)-4,$L(X)),1:$E(X,$L(X)-3,$L(X)))
  1. .S IBSSN=X
  1. .S IBDOBI=$$GET1^DIQ(2,IBPTI_",",.03,"I"),IBDOB=$$DTC(IBDOBI) ; Patient's DOB
  1. . ;
  1. . S IBIF=0 F S IBIF=$O(^DPT(IBPTI,.312,IBIF)) Q:'IBIF D
  1. . . ;
  1. . . S IBCT=IBCT+1 I $G(IOST)["C-"&(IBCT#1000=0) W "."
  1. . . ;
  1. . . K IBAR S IBA=IBIF_","_IBPTI_"," D GETS^DIQ(2.312,IBA,".01;8;3","EI","IBAR")
  1. . . S IBI36=$G(IBAR(2.312,IBA,.01,"I")) I 'IBI36 Q ; if no insurance go back
  1. . . S IBNM=$G(IBAR(2.312,IBA,.01,"E"))
  1. . . S IBOK=1 D CHKNM^IBCNOR1(IBNM) I 'IBOK Q ; insurance name was restricted
  1. . . S IBOK=1 D CHKINS^IBCNOR1(IBI36) I 'IBOK Q ; insurance type not allowed or ins is inactive
  1. . . ; is pt insurance active
  1. . . S IBEFFDT=$G(IBAR(2.312,IBA,8,"I")) ; Effective Date
  1. . . S IBEXPDT=$G(IBAR(2.312,IBA,3,"I")) ; Expiration Date
  1. . . I IBEFFDT="" Q ; if the effective date is null it is inactive
  1. . . I (IBEFFDT&(IBEFFDT>DT)) Q ; if a valid effective date and the date is greater than today it is inactive
  1. . . I (IBEXPDT&(IBEXPDT<DT)) Q ; if the expiration date is less than today it is inactive
  1. . . S IBTYPE=$$GET1^DIQ(36,IBI36_",",.13,"E")
  1. . . ;
  1. . . ; PT DFN ^ .312 RECID ^ INS NAME ^INSURANCE TYPE ^ EFFECTIVE DATE ^ EXPIRE DATE ^ PT NAME ^ PT SSN ^ PT DOB ^ INTERNAL DOB
  1. . . S ^TMP($J,"PR",IBPTI,IBI36)=IBI36_U_IBIF_U_IBNM_U_IBTYPE_U_IBEFFDT_U_IBEXPDT_U_IBNAM_U_IBSSN_U_IBDOB_U_IBDOBI
  1. . . S IBC=$G(^TMP($J,"PR",IBPTI,0)),IBC=IBC+1,^TMP($J,"PR",IBPTI,0)=IBC
  1. ;
  1. G PRINT
  1. ;
  1. COMPF ; process the found items
  1. ;
  1. N IBA,IBB,IBC,IBD,IBE,IBF,IBPHM,IBQ
  1. I '+$G(^TMP($J,"PR",IBPTI,0)) Q ; no active insurances left
  1. S IBQ=0 I +$G(^TMP($J,"PR",IBPTI,0))=1 D I IBQ Q
  1. . S IBA=$O(^TMP($J,"PR",IBPTI,0))
  1. . S IBD=$G(^TMP($J,"PR",IBPTI,IBA)) I $P(IBD,U,4)="PRESCRIPTION ONLY" S IBQ=1
  1. S IBA=0,IBPHM=1
  1. F S IBA=$O(^TMP($J,"PR",IBPTI,IBA)) Q:'IBA D Q:'IBPHM
  1. . S IBB=$G(^TMP($J,"PR",IBPTI,IBA))
  1. . S IBC=$P(IBB,U,3)
  1. . S IBD=$P(IBB,U,4)
  1. . S IBE=$P(IBB,U,10) ; internal pt dob
  1. . I IBD["PRESCRIPTION ONLY" S IBPHM=0
  1. I IBPHM D
  1. . S @IBTMP@("OUT",IBNAM,IBDOBI)=IBPTI_U_IBSSN_U_IBDOB
  1. . S IBF=$G(@IBTMP@("OUT",0))+1,@IBTMP@("OUT",0)=IBF
  1. Q
  1. ;
  1. PRINT ; print out
  1. ;
  1. N EORMSG,HDRDATE,HDRNAME,NONEMSG,IBDATA,IBDASHES,IBDFN,IBDOB,IBDOBI,IBEORM,IBPGC,IBPTNM,IBSPACES,IBT
  1. S IBT=$E($G(IBCNOR("IBOUT")),1) S:IBT'="R"&(IBT'="E") IBT="R"
  1. S IBPGC=0,IBEORM=0
  1. S EORMSG="*** End of Report ***"
  1. S NONEMSG="* * * N o D a t a F o u n d * * *"
  1. S HDRNAME="PATIENT MISSING COVERAGE REPORT"
  1. D NOW^%DTC
  1. S HDRDATE=$$DAT2^IBOUTL($E(%,1,12))
  1. S $P(IBDASHES,"-",80)=""
  1. S $P(IBSPACES," ",80)=""
  1. S IBLNC=0
  1. W ! ; add line between 'waiting dots' when compiling and the printing of the rpt
  1. D EHDR:IBT="E",HDR:IBT="R"
  1. I '+$G(^TMP("IBCNOR",$J,"OUT",0)) D G EXIT
  1. . W !,NONEMSG,!,EORMSG
  1. . S IBLNC=IBLNC+2,IBEORM=1
  1. . D QLINE
  1. ; loop
  1. S IBPTNM=""
  1. P1 S IBPTNM=$O(@IBTMP@("OUT",IBPTNM)) I IBPTNM="" W !,EORMSG S IBLNC=IBLNC+2,IBEORM=1 D QLINE G EXIT
  1. S IBDOBI=""
  1. P2 S IBDOBI=$O(@IBTMP@("OUT",IBPTNM,IBDOBI)) I 'IBDOBI G P1
  1. S IBDATA=$G(@IBTMP@("OUT",IBPTNM,IBDOBI)),IBLNC=IBLNC+1
  1. I IBT="R" S IBSTOP=0 D I IBSTOP G EXIT
  1. . W !,IBPTNM,?32,$P(IBDATA,U,3),?48,$P(IBDATA,U,2)
  1. . I (IBPGC>0),(IBLNC+1>MAXCNT) D
  1. . . D QLINE Q:IBSTOP
  1. . . D HDR
  1. I IBT="E" D
  1. . W !,IBPTNM,U,$P(IBDATA,U,3),U,$P(IBDATA,U,2)
  1. ;
  1. G P2
  1. ;
  1. EHDR ; EXCEL header
  1. ;
  1. S IBPGC=IBPGC+1,IBLNC=2
  1. W !,HDRNAME_U_HDRDATE
  1. I IBPGC=1 D
  1. . W !,"Filters: ",$S(IBCNOR("IBI")=1:"All",1:"Selected")," Insurances, "
  1. . W $S(IBCNOR("IBIG")=1:"All",1:"Selected")," Group Plans"
  1. . W " ,NAME Between ",$S(IBRF="":"'FIRST'",1:IBRF)," and ",$S(IBRL="zzzzzz":"'LAST'",1:IBRL)
  1. . S IBLNC=4
  1. W !,"Patient Name"_U_"DOB"_U_"SSN"
  1. Q
  1. ;
  1. HDR ; report header
  1. ;
  1. N IBA,IBF,IBG
  1. S IBPGC=IBPGC+1 W:$G(IOF)'="" @IOF W:$G(IOF)="" !
  1. S IBA=$E(IBSPACES,1,(4-$L(IBPGC)))_IBPGC,IBLNC=4
  1. W HDRNAME,?40,HDRDATE,?69,"Page: ",IBA,!
  1. I IBPGC=1 D
  1. . S IBLNC=5,IBF="Filters: "_$S(IBCNOR("IBI")=1:"All",1:"Selected")_" Insurances, "
  1. . S IBF=IBF_$S(IBCNOR("IBIG")=1:"All",1:"Selected")_" Group Plans"
  1. . S IBG="NAME Between "_$S(IBRF="":"'FIRST'",1:IBRF)_" and "_$S(IBRL="zzzzzz":"'LAST'",1:IBRL)
  1. . W IBF
  1. . I ($L(IBF)+($L(IBG)+2)>80) W ! S IBLNC=6
  1. . E W ", "
  1. . W IBG,!
  1. W !,"Patient Name",?32,"DOB",?48,"SSN"
  1. W !,$E(IBDASHES,1,79)
  1. Q
  1. ;
  1. EXIT ; leave option
  1. ;
  1. K ^TMP($J)
  1. K @IBTMP
  1. K ^TMP(IBJOB,"IBCNOR")
  1. ;
  1. Q
  1. ;
  1. QLINE ; cr to continue
  1. ;
  1. N DIR,DIROUT,DIRUT,DTOUT,DUOUT,LIN
  1. I MAXCNT<51&('IBEORM) F LIN=1:1:(IBXTFEED-IBLNC) W !
  1. I 'CRT Q
  1. S DIR(0)="E" D ^DIR K DIR
  1. I $D(DTOUT)!$D(DUOUT) S IBSTOP=1
  1. Q
  1. ;
  1. DTC(IBDTCK) ; check date return external if valid
  1. ;
  1. N IBDT,IBBK S IBDT=""
  1. I 'IBDTCK G DTCO
  1. S IBBK=$$VALIDDT^IBCNINSU($P(IBDTCK,".",1))
  1. I IBBK="-1"!(IBBK="") G DTCO
  1. S IBDT=$$FMTE^XLFDT(IBBK,"5DZ")
  1. I IBDT="00/00/00" S IBDT=""
  1. G DTCO
  1. ;
  1. DTCO ; date check exit
  1. ;
  1. Q IBDT
  1. ;
  1. BLDPT ; collect the subscribers for the policies/groups
  1. ;
  1. N IBA,IBAR35,IBC,IBCT,IBDTH,IBF,IBFC,IBGC,IB3553,IB36,IBIN,IBPNM,IBPNMA,IBPTDFN,IBPTINS
  1. ;
  1. ; clear found patients
  1. K ^TMP("IBCNOR",$J,"P-PT")
  1. S IBC=0,IBF=0,IBCT=0,IBFC=0
  1. F S IBC=$O(^TMP("IBCNOR",$J,"INS",IBC)) Q:'IBC S IB36=$G(^TMP("IBCNOR",$J,"INS",IBC)) I IB36 D
  1. . S IBGC=0 K IBAR35
  1. . F S IBGC=$O(^TMP("IBCNOR",$J,"INS",IBC,"GRP",IBGC)) Q:'IBGC D
  1. . . S IB3553=$G(^TMP("IBCNOR",$J,"INS",IBC,"GRP",IBGC)) I IB3553 S IBAR35(IB3553)=1
  1. . ; walk patient file for found combos.
  1. . S IBPTDFN=0,IBF=0 F S IBPTDFN=$O(^DPT("AB",IB36,IBPTDFN)) Q:'IBPTDFN S IBPTINS=0 D
  1. . . ;
  1. . . I $G(^TMP("IBCNOR",$J,"P-PT",IBPTDFN))'="" Q ; only put pt in list once
  1. . . ;
  1. . . S IBDTH="",IBDTH=$$GET1^DIQ(2,IBPTDFN_",",.351) I IBDTH'="" Q ; only look at living patients
  1. . . S IBPNM=$$GET1^DIQ(2,IBPTDFN_",",.01,"E"),IBPNMA=$$UP^XLFSTR(IBPNM)
  1. . . F S IBPTINS=$O(^DPT("AB",IB36,IBPTDFN,IBPTINS)) Q:'IBPTINS D Q:IBF
  1. . . . S IBCT=IBCT+1 I $G(IOST)["C-" W:IBCT#2000=0 "."
  1. . . . S IBA=$$GET1^DIQ(2.312,IBPTINS_","_IBPTDFN_",",.18,"I") I IBA D
  1. . . . . I $G(IBAR35(IBA))'=1 Q
  1. . . . . I $G(^TMP("IBCNOR",$J,"P-PT",IBPTDFN))'="" Q ; only put pt in list once
  1. . . . . I $E(IBPNM,1,$L(IBRLU))]IBRLU Q
  1. . . . . I IBRFU]$E(IBPNM,1,$L(IBRFU)) Q
  1. . . . . ; NM from DPT ^ ins ien ^ group ien ^ NM uppercase
  1. . . . . S ^TMP("IBCNOR",$J,"P-PT",IBPTDFN)=IBPNM_U_IB36_U_IB3553_U_IBPNMA,IBF=1
  1. . . . . S IBFC=$G(^TMP("IBCNOR",$J,"P-PT",0))+1,^TMP("IBCNOR",$J,"P-PT",0)=IBFC
  1. S $P(^TMP("IBCNOR",$J,"P-PT",0),U,2)=+$G(IBCT)
  1. Q
  1. ;