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

IBACCWLRURREV.m

Go to the documentation of this file.
IBACCWLRURREV ;EDE/TPF - ACC (Automated Community Care) Claims - ADDITIONAL REVIEW SCREEN FOR RUR ; 12-SEP-2023 ; 12-SEP-2023
 ;;2.0;INTEGRATED BILLING;**770**;21-MAR-94;Build 119
 ;;Per VA Directive 6402, this routine should not be modified.
 Q
 ;ROUTINE CLONED FROM IBACCWLVE BUT MAY HAVE A LOTS OF CHANGES BECAUSE THIS IS A BIG REDESIGN
 ;WE MAY NEED TO DUMP THIS CODE PARADIGN COMPLETELY
 ;NEW ROUTINE IN TPF;IB*2*770vPURPLE;EBILL-5721 
 ;
 ;NOT SURE WE NEED ALL THESE PASSED
EN(IBDA,IBENCIFN,IBIFN,DETRETURN,PREVVALMAR,IBFROMVALMDDF) ;TPF;IB*2*770v38;EBILL-5485
 N D,D1,SBR,VALMAR,VALMCNT,VALMHDR,VALMSG
 ;
 N IBPARENT S IBPARENT=0
 S IBACCWLRURREVLEV=$G(IBACCWLRURREVLEV)+1
 D EN^VALM("IBACC WL IBACCRUR REVIEW")
 ;
 Q
 ;
HDR ; -- header code
 ;
 N PTDOB,PTSSN,PTNAME
 S ENCOUNTER=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",.15,"E")
 S IBBILL=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",2.02,"E")
 S IBIFN=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",2.02,"I")
 S PTNAME=$$PTNAME^IBACCWLUTIL1(IBENCIFN)
 S:$P($G(^IBA(364.9,IBENCIFN,2)),U) PTNAME=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",2.01,"E")
 S PTSSN=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",.11,"E")
 S:PTSSN'="" PTSSN=$E(PTSSN,1,3)_"-"_$E(PTSSN,4,5)_"-"_$E(PTSSN,6,9)  ;TPF;IB*2*770V44;EBILL-5975 ;MJL;IB*2*770v55;EBILL-6296
 S PTDOB=$$GET1^DIQ(364.9,$G(IBENCIFN)_",",.1,"I")  ;TPF;IB*2*770V44;EBILL-5975
 S PTDOB=$$FMTE^XLFDT(PTDOB,5)
 ;
 S VALMHDR(1)="Patient: "_$G(PTNAME)_"       "_$G(PTSSN)_"              DOB:"_PTDOB
 ;
 S VALMSG="Encounter: "_$G(ENCOUNTER)_"|"_$G(IBBILL)
 ;
 Q
 ;
INIT ;EP -- init variables and list array
 N CLM,CLMCNT,CODE,D,D1,HI,HL,IOD,LINEBLK,LINEVAR,NODE,SBR,TAX
 N IBDRG,IBDX,IBPROC,IBFORM,IBINOUT,DTOFOCCFR,DTOFOCCTO,SV1CODEFOUND,SV2CODEFOUND,SV3CODEFOUND,GETX12TPE
 N TTMPVALMDDF,DFN  ;TPF XINDEX
 N DIAGPTRARR  ;TPF;IB*27*70v38;EBILL-5483  Diagnosis Code Pointer ARRAY
 ;
 S (SV1CODEFOUND,SV2CODEFOUND,SV3CODEFOUND)=0
 ;
 S D="*",D1=":"
 D PRESCAN(IBENCIFN,.IBDRG,.DTOFOCCFR,.DTOFOCCTO,0,SV1CODEFOUND,SV2CODEFOUND,SV3CODEFOUND)  ;EP - GRAB SEGMENTS NEEDED FOR SECTION HEADER
 ;
 S VALMCNT=0
 S DFN=$$GET1^DIQ(364.9,IBENCIFN_",",2.01,"I")
 ;
 ;D SET("","",1,"") ;REMOVED LINE FEED TO PLACE IEN ON THE TOP LINE ;MJL;EBILL-6200
 I $G(DUZ(0))="@" D SET("IEN",IBENCIFN)
 ;
 S IBDX=$$GET1^DIQ(364.9,IBENCIFN_",",.14,"E")_$$GET1^DIQ(364.9,IBENCIFN_",",.3,"E")  ;IF NULL THEN NO DIAGNOSIS
 S IBPROC=$$GET1^DIQ(364.9,IBENCIFN_",",.13,"E")  ;IF NULL THEN NO PROCEDURES
 S IBFORM=$$GET1^DIQ(364.9,IBENCIFN_",",.06,"E")
 S IBINOUT=$TR($$GET1^DIQ(364.9,IBENCIFN_",",.05,"E"),"-")  ;MEANS NOTHING FOR EXTRACTING CODE FOR DISPLAY
 I $G(SV1CODEFOUND)'=""!($G(SV2CODEFOUND)'="")!($G(SV3CODEFOUND)'="") S IBPROC=1  ;PRESCAN OVERRIDES #.13 CPT FIELD FOR NOW
 ; 
 ; with qualifier =  435 Admission Date - it's a required segment for inpatient services.
 ;by default, all encounters are set as outpatient, until and if this DTP segment is found
 ;then it's labeled as an inpatient encounter. CAN NOT RELY ON FOR DETERMINING DISPLAY API
 ;
 D SET("Patient Type:",$G(IBINOUT)_"     "_$S(IBINOUT="INPATIENT":"DRG:"_$G(IBDRG),1:"")_"              "_"From:"_$G(DTOFOCCFR)_"  To:"_$G(DTOFOCCTO))
 ;
 D SET("")
 ;
 N ABFCNT,ENCOUNTER,HICNT,IBBILL,IBIFN,SV1LEVEL,SV2LEVEL,SV3LEVEL,BBQLEVEL,DIAGCNT  ;TPF XINDEX
 S (SV1LEVEL,SV2LEVEL,SV3LEVEL,BBQLEVEL)=0      ;USED TO DETERMINE PRINTING LABELS
 S (CLM,CLMCNT,HI,HL,SBR)=0
 S IOD=$$GET1^DIQ(364.9,IBENCIFN,.05,"I")
 S (ABFCNT,DIAGCNT)=0    ;NUMBER OF ABF QC FOUND IN GIVEN CLAIM. USED TO DETERMINE PRINTING LABELS
 F  S CLMCNT=$O(^IBA(364.9,IBENCIFN,1,CLMCNT)) Q:'CLMCNT  S DATA=^(CLMCNT,0) Q:DATA=""  D
 . S NODE=$P(DATA,D,1)
 . I ",ST,HI,SV1,SV2,SV3,"'[(","_NODE_",") Q
 . I ",ST,"[(","_NODE_",") D GETX12TPE(DATA,.GETX12TPE) Q
 . I ",HI,"[(","_NODE_",") S NODE=NODE_"^IBACCWLRURREV1A(.ABFCNT,.DIAGCNT,GETX12TPE)"  ;TPF;IB*2*770v770PURPLE;EBILL-9999 SAC SIZE
 . ;I ",DTP,"[(","_NODE_",") S NODE=NODE_"^IBACCWLRURREV1"  ;DOES NOT WORK BECAUSE THEY WANT DATE DISPLAYED BEFORE THE LINE ITEMS 
 . I ",SV1,"[(","_NODE_",") S NODE=NODE_"^IBACCWLRURREV3"
 . I ",SV2,"[(","_NODE_",") S NODE=NODE_"^IBACCWLRURREV3"
 . I ",SV3,"[(","_NODE_",") S NODE=NODE_"^IBACCWLRURREV3"
 . ;
 . D @NODE
 ;
 D SET("<end of codes>","","","","1^15","16^16")  ;MUST HAVE TITLE AND VALUE DDF OVERRIDES TO WORK CORRECTLY? CHNAGE IN FUTURE
 ;
 ;MOVE THE VS SECTION BELOW THE ENCOUNTER - ;MJL;EBILL-6200
 D SET("") ;ADDED EXTRA LINE FEED TO LOOK PRETTIER
 I $G(DFN) M TTMPVALMDDF=VALMDDF D GETVALMDDF("IBACC WL VS",.VALMDDF) Q:'$D(VALMDDF)  D BLD^IBACCWLVS K VALMDDF M VALMDDF=TTMPVALMDDF
 E  D SET("PATIENT PROFILE CAN NOT BE INSERTED BECAUSE NO PATIENT FOUND.")
 ;END MJL;EBILL-6200
 ;
 ;BEGIN TPF*IB*2*770v68;EBILL-5485,5721
 I $G(IBENCIFN) D
 .S @VALMAR@("IEN3649",1)=IBENCIFN
 .S IBIFN=$$GET1^DIQ(364.9,IBENCIFN_",",2.02,"I")
 S:$G(IBIFN) @VALMAR@("IEN399",1)=IBIFN
 ;END TPF*IB*2*770v38;EBILL-5485,5721
 ;
GETX12TPE(DATA,GETX12TPE) ;EP GET X12 TYPE
 ;
 N X12  ;TPF XINDEX
 ;ST*837*0001*005010X222A1
 ;For 837 Institutional (837I), the ST01 value is 005010X223A2.
 ;For 837 Professional (837P), the ST01 value is 005010X222A1.
 ;For 837 Dental (837D), the ST01 value is 005010X224A2
 S X12=$P(DATA,D,4)
 S X12=$E(X12,8,10)
 I X12="223" S GETX12TPE="UBHI"
 E  S GETX12TPE=""
 ;
 Q
 ;
INITQ ;Exit
 I '$D(@VALMAR) D SET^VALM10(1,"NO DATA FOUND!!")
 Q
 ;
PRESCANALL ;EP
 N IBENCIFN,PRESCAN,DRG,DTOFOCC
 S IBENCIFN=0
 F  S IBENCIFN=$O(^IBA(364.9,IBENCIFN)) Q:'IBENCIFN  D
 .D PRESCAN(IBENCIFN,.DRG,.DTOFOCC)
 .W !,IBENCIFN,?15,DRG,?25,DTOFOCC
 Q
 ;
PRESCAN(IBENCIFN,DRG,DTOFOCCFR,DTOFOCCTO,DISPLAY,SV1CODEFOUND,SV2CODEFOUND,SV3CODEFOUND)  ;EP - GRAB SEGMENTS NEEDED FOR SECTION HEADER
 ;
 ;DRG WILL NEVER BE FOUND IN ACC ENCOUNTERS. IN THIS APP IT IS A PLACEHOLDER FOR WHEN IT IS CACLULATED IN PTF
 ;RETURN DRG AND DATES OF OCURRENCE
 S DISPLAY=$G(DISPLAY)
 ;
 N SEGIEN,DTPDTRANGE,DTPFOUND,INOUTPT,SV1DX,SV2DX,SV3DX,SV1CODE,SV2CODE,SV3CODE  ;TPF XINDEX
 N SV1DXFOUND,SV2DXFOUND,SV3DXFOUND
 N ASSGRP,DATA,STATUS
 ;
 S (DRG,DTOFOCC,DTPDTRANGE,DTPFOUND)=""
 S SEGIEN=0
 F  S SEGIEN=$O(^IBA(364.9,IBENCIFN,1,SEGIEN)) Q:'SEGIEN  D
 .S DATA=$G(^IBA(364.9,IBENCIFN,1,SEGIEN,0))
 .;
 .I $P(DATA,"*")="SV2" D
 ..S SV2CODE=$P($P(DATA,D,3),D1,1)
 ..I SV2CODE'="" S SV2CODEFOUND=1  ;FLAG FOR CODEFOUND IF NO CODE FOUND DISPLAY "No Procedure Codes Found"
 .;
 .I $P(DATA,"*")="SV1" D
 ..S SV1DX=$P($P(DATA,D,3),D1,1)
 ..I SV1DX'="" S SV1DXFOUND=1  ;FLAG FOR CODEFOUND IF NO CODE FOUND DISPLAY "No Dx Found"
 .;
 .I $P(DATA,"*")="SV3" D
 ..S SV3DX=$P($P(DATA,D,3),D1,1)
 ..I SV3DX'="" S SV3DXFOUND=1  ;FLAG FOR CODEFOUND IF NO CODE FOUND DISPLAY "No Dx Found"
 .;
 .I $E(DATA,1,3)="DTP",'DTPFOUND D
 ..Q:(U_434_U_472_U)'[(U_$P(DATA,"*",2)_U)      ;434 = DATE RANGE, 472 = DATE OF SERVICE
 ..I $P(DATA,"*",2)=434 D
 ...S DTPFOUND=1
 ...S DTOFOCC=$P($P(DATA,"*",4),"~")                      ;DTP*434*RD8*20230501-20230510~  # Statement Dates
 ...S DTOFOCCFR=$P(DTOFOCC,"-")
 ...S DTOFOCCTO=$P(DTOFOCC,"-",2)
 ..E  I $P(DATA,"*",4)'="" S DTPDTRANGE($P(DATA,"*",4),SEGIEN)="",DTPDTRANGE=DTPDTRANGE+1
 .;
 .I $E(DATA,1,2)="HI" D
 ..I DATA[("*DR:") S DRG=$P(DATA,"*DR:",2)  ;TIMZ LOOKED FOR DRG IN HI*DR
 ..I DATA[("*DRG:") S DRG=$P(DATA,"*DRG:",2) ;VAGPT SAID DRG
 ..I DATA[("*BI:") S DTOFOCC=$P($P(DATA,"*BI:",2),":",3) ;HI*BI:73:RD8:20230522-20230531  RD8 = RANGE OF DATES
 ..I DTOFOCC'="" D
 ...S DTOFOCCFR=$P(DTOFOCC,"-")
 ...S DTOFOCCTO=$P(DTOFOCC,"-",2)
 ...;
 ...S DTOFOCCFR=$E(DTOFOCCFR,5,6)_"/"_$E(DTOFOCCFR,7,8)_"/"_$E(DTOFOCCFR,1,4)
 ...S DTOFOCCTO=$E(DTOFOCCTO,5,6)_"/"_$E(DTOFOCCTO,7,8)_"/"_$E(DTOFOCCTO,1,4)
 ...;
 ..;DEBUGGING CODE
 ..I $G(DRG)'=""!($G(DTOFOCC)'="") D
 ...S STATUS=$$GET1^DIQ(364.9,IBENCIFN_",",.16,"E")
 ...Q:STATUS="CLOSED"!(STATUS="PURGED")
 ...I $G(DRG)'="",($G(DTOFOCC)'="") I $G(DISPLAY) W !,"****************",IBENCIFN,"****",SEGIEN  ;B:$G(DUZ)=786223 "S"
 ...Q:'$G(DISPLAY)
 ...S ASSGRP=$$GET1^DIQ(364.9,IBENCIFN_",",3.01,"E")
 ...S INOUTPT=$$GET1^DIQ(364.9,IBENCIFN_",",.05,"E")
 ...W !,IBENCIFN
 ...W !?5,"IN/OUT:",INOUTPT
 ...W !?5,"ASSGNGRP:",ASSGRP
 ...W !?5,"    DRG: ",$G(DRG)
 ...W !?5,"DTOFOCC: ",$G(DTOFOCC)
 ...K DRG,DTOFOCC
 ;
 Q:$G(DTOFOCCFR)'=""&($G(DTOFOCCTO)'="")
 ;
 I $D(DTPDTRANGE)#10 D
 .I DTPDTRANGE=1 D
 ..S DTOFOCCFR=$O(DTPDTRANGE("")),DTOFOCCTO=DTOFOCCFR
 .E  S DTOFOCCFR=$O(DTPDTRANGE("")),DTOFOCCTO=$O(DTPDTRANGE(""),-1)
 .;
 .S DTOFOCCFR=$E(DTOFOCCFR,5,6)_"/"_$E(DTOFOCCFR,7,8)_"/"_$E(DTOFOCCFR,1,4)
 .S:DTOFOCCTO'="" DTOFOCCTO=$E(DTOFOCCTO,5,6)_"/"_$E(DTOFOCCTO,7,8)_"/"_$E(DTOFOCCTO,1,4)
 ;
 Q
 ;
HELP ; -- help code
 ;
 N X
 S X="?" D DISP^XQORM1 W !!
 ;
 Q
 ;
EXIT ; -- exit code
 ;
 S IBACCWLRURREVLEV=$G(IBACCWLRURREVLEV)-1  ;TPF;IB*2*770v44;EBILL-6011
 I $G(IBACCWLVELEV)>1 Q 
 D CLEAN^VALM10  ;KILLS DATA AND VIDEO CONTROL ARRAYS. KILLS @VALMAR TOO
 ;
 Q
 ;
EXPND ; -- expand code
 Q
 ;
SET(TITLE,VALUE,BLANK,HEADER,TITLECOLDDF,VALUECOLDDF,THIRDCOLDDF) ;EP -MODIFIED SET TO PLACE DATA AT SPECIFIC COLUMN
 N T1,WIDTH,COL
 S TITLECOLDDF=$G(TITLECOLDDF)
 S VALUECOLDDF=$G(VALUECOLDDF)
 S THIRDCOLDDF=$G(THIRDCOLDDF)
 ;
 S TITLE=$G(TITLE),VALUE=$G(VALUE)
 I $G(BLANK) S VALMCNT=VALMCNT+1 D SET^VALM10(VALMCNT," ")
 I $G(HEADER) D  G SETQ
 . I '$L(TITLE) Q
 . S VALMCNT=VALMCNT+1
 . S COL=((IOM/2)-($L(TITLE)/2))\1
 . S WIDTH=$L(TITLE)
 . D CNTRL^VALM10(VALMCNT,COL,WIDTH,IORVON,IORVOFF)
 . S TITLE=$$SETSTR^VALM1(TITLE,"",COL,WIDTH)
 . D SET^VALM10(VALMCNT,TITLE)
 S LINEVAR=""
 D SET1(TITLE,VALUE,TITLECOLDDF,VALUECOLDDF,THIRDCOLDDF)
SETQ ;
 Q
 ;
SET1(TITLE,VALUE,TITLECOLDDF,VALUECOLDDF,THIRDCOLDDF) ;EP
 ;
 N VALUE3RDCOL
 ;
 I TITLE[("Patient Type") S TITLE=TITLE_" "_$G(VALUE) S VALUE=""  ;LEAVE FIOR NOW. THIS NEEDS FOUR COLIUMNS
 I TITLE[("IEN") S TITLE=TITLE_" "_$G(VALUE)
 ;
 I $G(TITLECOLDDF),$G(VALUECOLDDF) D
 .N TITLESTART,TITLEWIDTH,VALSTART,VALWIDTH
 .S TITLESTART=$P(TITLECOLDDF,U)
 .S TITLEWIDTH=$P(TITLECOLDDF,U,2)
 .S VALSTART=$P(VALUECOLDDF,U)
 .S VALWIDTH=$P(VALUECOLDDF,U,2)
 .S VALMDDF("NODE")="NODE^"_TITLESTART_U_TITLEWIDTH
 .S VALMDDF("DATA")="DATA^"_VALSTART_U_VALWIDTH
 .I $G(THIRDCOLDDF)'="" D
 ..S VALMDDF("3RDCOL")="3RDCOL^"_$P(THIRDCOLDDF,U)_U_$P(THIRDCOLDDF,U,2)
 ..S VALUE3RDCOL=$P(THIRDCOLDDF,U,3)
 ; 
 S LINEVAR=$$SETFLD^VALM1(TITLE,LINEVAR,"NODE")
 S LINEVAR=$$SETFLD^VALM1(VALUE,LINEVAR,"DATA")
 I $D(VALMDDF("3RDCOL")) S LINEVAR=$$SETFLD^VALM1(VALUE3RDCOL,LINEVAR,"3RDCOL") K VALMDDF("3RDCOL")
 S VALMCNT=VALMCNT+1 D SET^VALM10(VALMCNT,LINEVAR)
 Q
 ;
GETVALMDDF(LISTNAME,VALMDDF) ;EP GET VALMDDF FIELD DEF ARRAY
 ;
 Q:$G(LISTNAME)=""
 N I,LISTIEN
 S LISTIEN=$O(^SD(409.61,"B",LISTNAME,""))
 ;I LISTIEN="" W !!,"'"_LISTNAME_"' LIST TEMPLATE CAN NOT BE FOUND!!" S ABORT=1 Q
 I LISTIEN="" W !!,"'"_LISTNAME_"' LIST TEMPLATE CAN NOT BE FOUND!!" Q  ;XINDEX MJL
 S I=0  ;SET UP COLUMN DATA ARRAY
 F  S I=$O(^SD(409.61,LISTIEN,"COL",I)) Q:'I  I $D(^(I,0)) S VALMDDF($P(^(0),U))=^(0)
 Q