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

IBNCPEV3.m

Go to the documentation of this file.
  1. IBNCPEV3 ;ALB/DMB - ECME RXS WITH NON-BILLABLE STATUS ;5/22/08
  1. ;;2.0;INTEGRATED BILLING;**534,617**;21-MAR-94;Build 43
  1. ;;Per VA Directive 6402, this routine should not be modified.
  1. ;
  1. ; ICR #6131 documents the usage of this entry point by the ECME application
  1. ;
  1. COLLECT(BEGDT,ENDDT,MWC,RELNRL,IBDRUG,DRUGCLS,ALLRCNT,IBPHARM,IBINS,IBNBSTS,IBELIG1,IBGLTMP,IBPAT,IBBILL,IBMIN,IBMAX) ;
  1. ; Compile the data for the new Non-Billable Status report
  1. ; Input:
  1. ; BEGDT - Beginning Date
  1. ; ENDDT - Ending Date
  1. ; MWC - A:All; M:Mail; W:Window; C:CMOP, if multiple entries MWC="C,M"
  1. ; RELNRL - 1:All; 2:Released; 3:Not Released
  1. ; IBDRUG - 0:All; DRUG to report on (ptr to #50), if multiple entries IBDRUG=ptr,ptr,...
  1. ; DRUGCLS - 0:All; DRUG CLASS to report on (ptr to #50.5), if multiple entries DRUGCLS=ptr,ptr,...
  1. ; ALLRCNT - A:All; R:Most recent
  1. ; IBPHARM/IBPHARM(ptr) - 0:All pharmacies; 1:Array of IENs of pharmacies
  1. ; IBINS/IBINS(ptr) - 0:All insurances or list of file 36 IENs
  1. ; IBNBSTS/IBNBSTS(x) - 0:All; 1:Array of Non-Billable Status
  1. ; IBELIG1/IBELIG1(x) - 0:All; 1:Array of multiple eligibilities
  1. ; IBGLTMP - Temporary Global Storage (returned with extracted data)
  1. ; IBPAT - 0:All; ptr to #2 PATIENT, IBPAT=ptr,ptr,...
  1. ; IBBILL - 0:All; 1:Range of Billed Amount - then check IBMIN and IBMAX
  1. ; IBMIN=minimum billed amount entered, default is 0
  1. ; IBMAX=maximum billed amount entered, default is 999999
  1. ;
  1. ; Output:
  1. ; 1 - Successful
  1. ; -1 - Unsuccessful
  1. ;
  1. ; Check Parameters
  1. I $G(IBGLTMP)="" Q -1
  1. ;
  1. N DATE,IEN,IEN1,X,X0,X2,X7,DIV,INS,RX,FILL,DRUG,RLDT,ELIG
  1. N DFN,DRGCOST,I,IBDGLCS,IBSTOP,STATUS
  1. K ^TMP($J)
  1. ;
  1. ; Loop through the IB NCPDP Event Log for the data range
  1. S DATE=BEGDT-.1 F S DATE=$O(^IBCNR(366.14,"B",DATE)) Q:'DATE!(DATE>ENDDT) D
  1. . S IEN="" F S IEN=$O(^IBCNR(366.14,"B",DATE,IEN)) Q:'IEN D
  1. .. S IEN1=0 F S IEN1=$O(^IBCNR(366.14,IEN,1,IEN1)) Q:'IEN1 D
  1. ... S X0=$G(^IBCNR(366.14,IEN,1,IEN1,0))
  1. ... ;
  1. ... ; If not a Billable Status Check, quit
  1. ... I +X0'=1 Q
  1. ... ;
  1. ... ; If successful, quit
  1. ... I $P(X0,"^",7)'=0 Q
  1. ... ;
  1. ... ; Check Non-Status Reason matches user input
  1. ... I IBNBSTS=1,'$D(IBNBSTS(+$P(X0,U,2))) Q
  1. ... ;
  1. ... ; Check Division matches user input
  1. ... S DIV=+$P(X0,U,9)
  1. ... I IBPHARM=1,'$D(IBPHARM(DIV)) Q
  1. ... ;
  1. ... ; Check Insurance matches user input
  1. ... S INS=$$GETINS(IEN,IEN1)
  1. ... I IBINS'=0,'$$CHKINS(IBINS,+INS) Q
  1. ... S INS=$P(INS,"^",2)
  1. ... ;
  1. ... ; Get Rx and Fill
  1. ... S X2=$G(^IBCNR(366.14,IEN,1,IEN1,2))
  1. ... S RX=$P(X2,U,12),FILL=$P(X2,U,3)
  1. ... I 'RX S RX=$P(X2,U,2)
  1. ... I 'RX Q
  1. ... ;
  1. ... ; Check Fill Type matches user input
  1. ... I MWC'="A",MWC'[$$MWC^PSOBPSU2(RX,FILL) Q
  1. ... ;
  1. ... ; Check Drug matches user input
  1. ... S DRUG=$$FILE^IBRXUTL(RX,6,"I")
  1. ... I IBDRUG D I IBSTOP=0 Q
  1. .... S IBSTOP=0
  1. .... F I=1:1:$L(IBDRUG,",") I DRUG=$P(IBDRUG,",",I) S IBSTOP=1 Q
  1. ... ;
  1. ... ; Check Drug Class matches user input
  1. ... S IBDGCLS=$$CLSNAME^IBNCPEV3($$GETDRGCL^IBNCPEV3(DRUG),99)
  1. ... I DRUGCLS'=0 D I IBSTOP=0 Q
  1. .... S IBSTOP=0
  1. .... F I=1:1:$L(DRUGCLS,";") I IBDGCLS=$P(DRUGCLS,";",I) S IBSTOP=1 Q
  1. ... ;
  1. ... ; Check Released matches user input
  1. ... S RLDT=$P($$RXRLDT^PSOBPSUT(RX,FILL),".")
  1. ... I RELNRL'=1 Q:RELNRL=2&'RLDT Q:RELNRL=3&RLDT
  1. ... ;
  1. ... ; Check Eligibilities matches user input
  1. ... S X7=$G(^IBCNR(366.14,IEN,1,IEN1,7))
  1. ... S ELIG=$P(X7,U,5)
  1. ... I IBELIG1=1,'$D(IBELIG1(ELIG)) Q
  1. ... ;
  1. ... ; Check Patient(s) matches user input
  1. ... S DFN=+$P(X0,U,3)
  1. ... I IBPAT'=0 D I IBSTOP=0 Q
  1. .... S IBSTOP=0
  1. .... F I=1:1:$L(IBPAT,",") I $P(IBPAT,",",I)=DFN S IBSTOP=1 Q
  1. ... ;
  1. ... ; Check Drug Cost matches Bill Amount user input
  1. ... S DRGCOST=$$COST(RX,FILL)
  1. ... I IBBILL'=0 I (DRGCOST<$G(IBMIN))!(DRGCOST>$G(IBMAX)) Q
  1. ... ;
  1. ... ; Get Data
  1. ... ; Division, Insurance, Patient Name, SSN, Eligibility, RX, Fill
  1. ... ; Date, Drug Cost, Drug, Released On, Fill Type,
  1. ... ; Status (RX status/Released-Not released)
  1. ... S STATUS=$$RXAPI1^IBNCPUT1(RX,100,"I")
  1. ... ; If most recent, temporary Sort by RX and Fill
  1. ... ; Else store in the global
  1. ... I ALLRCNT="R" S ^TMP($J,"IBNCPEV3",+RX,+FILL,DATE)=DIV_U_INS_U_DFN_U_ELIG_U_DRGCOST_U_0_U_DRUG_U_RLDT_U_STATUS_U_$P(X0,U,2)
  1. ... E S @IBGLTMP@(DIV,INS,+DFN,DATE,+RX,+FILL)=ELIG_U_DRGCOST_U_0_U_DRUG_U_RLDT_U_STATUS_U_$P(X0,U,2)
  1. ;
  1. ; If most recent, get most recent record for each RX and fill and populate the array
  1. I ALLRCNT="R" D
  1. . S RX="" F S RX=$O(^TMP($J,"IBNCPEV3",RX)) Q:'RX D
  1. .. S FILL="" F S FILL=$O(^TMP($J,"IBNCPEV3",RX,FILL)) Q:FILL="" D
  1. ... S DATE=$O(^TMP($J,"IBNCPEV3",RX,FILL,""),-1)
  1. ... S X=$G(^TMP($J,"IBNCPEV3",RX,FILL,DATE)),DIV=$P(X,U,1),INS=$P(X,U,2),DFN=$P(X,U,3)
  1. ... S @IBGLTMP@(DIV,INS,+DFN,DATE,RX,FILL)=$P(X,U,4,10)
  1. . ; Clean up scratch global
  1. . K ^TMP($J,"IBNCPEV3")
  1. Q 1
  1. ;
  1. ;
  1. DRUGDIE(IEN,FLD,FORMAT,IBARR) ;
  1. ; Return field values for Drug file
  1. ; Function returns field data if one field is specified. If
  1. ; multiple fields, the function will return "" and the field
  1. ; values are returned in IBARR
  1. ; Example: W $$DRUGDIE^IBNCPEV3(134,25,"E",.ARR)
  1. ; IEN - IEN of DRUG FILE #50
  1. ; FLD - Field Number(s) (like .01)
  1. ; FORMAT - Specifies internal or external value of returned field
  1. ; - optional, defaults to "I"
  1. ; IBARR - Array to return value(s). Optional. Pass by reference.
  1. ; See EN^DIQ documentation for variable DIQ
  1. ;
  1. I $G(IEN)="" Q ""
  1. I $G(FLD)="" Q ""
  1. I $G(FORMAT)'="E" S FORMAT="I"
  1. N DIQ,PSSDIY,IBDIQ
  1. S IBDIQ="IBARR",IBDIQ(0)=FORMAT
  1. D EN^PSSDI(50,"IB",50,.FLD,.IEN,.IBDIQ)
  1. Q $G(IBARR(50,IEN,FLD,FORMAT))
  1. ;
  1. CLSNAME(CLASS,IBLEN) ;
  1. ; Get Drug Class Name
  1. I $G(CLASS)="" Q ""
  1. K ^TMP($J,"IBPEV-CLASS")
  1. N Y,IEN
  1. S Y=""
  1. D C^PSN50P65(CLASS,"","IBPEV-CLASS")
  1. S IEN=$O(^TMP($J,"IBPEV-CLASS",0))
  1. I IEN]"" S Y=$E($G(^TMP($J,"IBPEV-CLASS",IEN,1)),1,IBLEN)
  1. K ^TMP($J,"IBPEV-CLASS")
  1. Q Y
  1. ;
  1. GETINS(IEN,IEN1) ;
  1. ;Get the Insurance from INSURANCE multiple
  1. ;Input: IEN = IEN of the IB NCPCP BILLING EVENT LOG
  1. ; IEN1 = IEN of the EVENT subfile
  1. ;
  1. ;Output: Insurance Company Pointer or null if not found
  1. ;
  1. I '$G(IEN) Q "0^UNKNOWN INSURANCE"
  1. I '$G(IEN1) Q "0^UNKNOWN INSURANCE"
  1. ;
  1. ; Get Group Plan from first INSURANCE multiple entry
  1. N IEN2,GPLAN,INS,INSNM
  1. S IEN2=$O(^IBCNR(366.14,IEN,1,IEN1,5,0))
  1. I 'IEN2 Q "0^UNKNOWN INSURANCE"
  1. S GPLAN=$P($G(^IBCNR(366.14,IEN,1,IEN1,5,IEN2,0)),"^",2)
  1. I 'GPLAN Q "0^UNKNOWN INSURANCE"
  1. ;
  1. ; Get Insurance Company from the Group Plan record
  1. S INS=+$G(^IBA(355.3,GPLAN,0))
  1. I INS=0 Q "0^UNKNOWN INSURANCE"
  1. S INSNM=$$GET1^DIQ(36,INS,.01,"E")
  1. I INSNM="" S INSNM="UNKNOWN INSURANCE"
  1. Q INS_"^"_INSNM
  1. ;
  1. CHKINS(LIST,INS) ;
  1. ;Check if the IB NCPDP EVENT LOG has the user-entered insurance
  1. ;Input: LIST = Semi-colon separated list of Insurances selected by the user
  1. ; INS = IEN of the Insurance Company (#36) file
  1. ;
  1. ;Output: 1 = Match found
  1. ; 0 = No match found
  1. ;
  1. I $G(LIST)="" Q 0
  1. I '$G(INS) Q 0
  1. ;
  1. N I,IN1,RETV
  1. S RETV=0
  1. F I=2:1 S IN1=$P($G(LIST),";",I) Q:IN1="" S RETV=$S(IN1=INS:1,1:0) Q:RETV
  1. Q RETV
  1. ;
  1. COST(RX,FILL) ;
  1. ; Calculate Drug Cost for RX/Fill
  1. ; Input:
  1. ; RX: Prescription IEN
  1. ; FILL: Fill Number
  1. ; Output:
  1. ; Drug Cost
  1. ;
  1. I '$G(RX) Q ""
  1. I $G(FILL)="" Q ""
  1. ;
  1. N DATA,COST,QTY
  1. I FILL=0 S COST=$$FILE^IBRXUTL(RX,17,"I"),QTY=$$FILE^IBRXUTL(RX,7,"I")
  1. I FILL S COST=$$SUBFILE^IBRXUTL(RX,FILL,"",1.2,"I"),QTY=$$SUBFILE^IBRXUTL(RX,FILL,"",1,"I")
  1. Q COST*QTY
  1. ;
  1. ;Get VA DRUG CLASS pointer
  1. ;
  1. ; Input Variables: BP50 - ptr to DRUG (#50)
  1. ;
  1. ; Return Value -> n = ptr to VA DRUG CLASS (#50.605)
  1. ; 0 = Unknown
  1. ;
  1. GETDRGCL(BP50) Q $$DRUGDIE(BP50,25)
  1. ;