| 1 | IBCSC5A ;ALB/ARH - ADD/ENTER PRESCRIPTION FILLS ; 12/27/93
 | 
|---|
| 2 |  ;;2.0;INTEGRATED BILLING;**27,52,106,51,160,137,245,309,347**;21-MAR-94;Build 24
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | EN ;add/edit prescription fills for a bill, IBIFN required
 | 
|---|
| 6 |  S IBX=$$BILL(IBIFN) Q:'IBIFN  S DFN=+IBX,IBDT1=$P(IBX,U,2),IBDT2=$P(IBX,U,3),IBRXALL=$P(IBX,U,4)
 | 
|---|
| 7 |  D SET(IBIFN,.IBRXA,"")
 | 
|---|
| 8 |  D RXDISP^IBCSC5C(DFN,IBDT1,IBDT2,.IBPR,.IBPRO,.IBRXA,IBRXALL) I +$P($G(IBPRO),U,2) D NEWRX^IBCSC5C(+IBPRO) I +$G(IBLIST) D ADDNEW^IBCSC5C(IBIFN,IBLIST,.IBPR,.IBPRO) S DGRVRCAL=1
 | 
|---|
| 9 |  S IBRXAP=+$G(IBPRO) D SET(IBIFN,.IBRXA,.IBRXAP),DISP(.IBRXA,.IBRXAP)
 | 
|---|
| 10 | E1 S IBPIFN=0,IBRX=$$ASKRX(.IBRXAP,.IBPRO) G:IBRX="" EXIT S IBDT=$P(IBRX,U,2),IBRX=$P(IBRX,U,1),DGRVRCAL=1
 | 
|---|
| 11 |  I 'IBDT S IBDT=$O(IBRXA(IBRX,0)) S:'IBDT IBDT=$O(IBPR(IBRX,0)) S IBDT=$$ASKDT(IBDT1,IBDT2,IBDT) G:'IBDT E1
 | 
|---|
| 12 |  I +$$RXDUP^IBCU3(IBRX,IBDT,IBIFN,1),'$D(IBRXA(IBRX,IBDT)) G E1
 | 
|---|
| 13 |  I '$D(IBPR(IBRX,IBDT)) W !,"This rx fill does not exist in Pharmacy for this patient!",!
 | 
|---|
| 14 |  S IBPIFN=$G(IBRXA(IBRX,IBDT)),IBDRG=$P(IBPIFN,U,2)
 | 
|---|
| 15 |  I 'IBPIFN S IBX=$G(IBPR(IBRX,IBDT)),IBPIFN=$$ADD(IBRX,IBIFN,IBDT,$P(IBX,U,3),$P(IBX,U,1),$P(IBX,U,4,6)) D  G:'IBPIFN E1
 | 
|---|
| 16 |  . I 'IBPIFN W " ??" Q
 | 
|---|
| 17 |  . W "  ... ADDED"
 | 
|---|
| 18 |  D EDIT(+IBPIFN,$P(IBPIFN,U,7)) S IBRXAP=+$G(IBPRO) D SET(IBIFN,.IBRXA,.IBRXAP) G E1
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 | EXIT ;
 | 
|---|
| 21 |  K IBPIFN,IBRX,IBDRG,IBX,IBDT1,IBDT2,IBRXA,IBPR,IBDT,IBLIST,IBPRO,IBRXAP,IBRXALL
 | 
|---|
| 22 |  Q
 | 
|---|
| 23 |  ;
 | 
|---|
| 24 | ASKRX(IBRXAP,IBPRO) ;
 | 
|---|
| 25 |  N X,Y,IBY,IBX W ! S IBX=""
 | 
|---|
| 26 |  I +$G(IBIFN) S DIR("?")="The prescription number for the fill.  "_$$HTEXT^IBCSC5C,DIR("??")="^D HELP^IBCSC5A("_IBIFN_")"
 | 
|---|
| 27 |  S DIR("A")="Select RX FILL",DIR(0)="FO^1:11^K:X'?.UN X" D ^DIR I $D(DIRUT)!(Y'?.AN) S Y="" K DIR,DIRUT G ARX1E
 | 
|---|
| 28 |  S IBX=Y I $D(IBRXAP)<10,$D(IBPRO)<10 G ARX1E
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  S IBY=$G(IBRXAP(IBX)) S:IBY="" IBY=$G(IBPRO(IBX)) I IBY="" G ARX1E
 | 
|---|
| 31 |  W ! S DIR(0)="YO",DIR("A")="ADD/EDIT RX FILL "_$P(IBY,U,1)_" FOR "_$$FMTE^XLFDT($P(IBY,U,2))_" CORRECT",DIR("B")="YES"
 | 
|---|
| 32 |  D ^DIR K DIR I Y=1,'$D(DIRUT) S IBX=IBY
 | 
|---|
| 33 | ARX1E Q IBX
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 | ASKDT(IBDT1,IBDT2,IBDT) ;
 | 
|---|
| 36 |  S DIR("A")="Select RX FILL DATE",DIR(0)="DO^"_IBDT1_":"_IBDT2_":EX",DIR("B")=$$FMTE^XLFDT(IBDT) D ^DIR K DIR,DTOUT,DIRUT
 | 
|---|
| 37 |  Q $S(Y?7N:Y,1:0)
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 | ADD(RX,IFN,IBDT,DRUG,PIFN,OTHER) ;
 | 
|---|
| 40 |  N IBX,X,Y,DD,DO,DA,DIC,DLAYGO
 | 
|---|
| 41 |  S IBX=0 S DRUG=$$DRUG($G(DRUG)) G:'DRUG ADDE
 | 
|---|
| 42 |  S DIC="^IBA(362.4,",DIC(0)="AQL",X=RX,DLAYGO=362.4 D FILE^DICN
 | 
|---|
| 43 |  I Y>0 D
 | 
|---|
| 44 |  . S DIE=DIC,(IBX,DA)=+Y,DR=".02////"_IFN_";.03////"_IBDT_";.04////"_DRUG_";.05////"_+PIFN_";.06////"_$P(OTHER,U,1)_";.07////"_$P(OTHER,U,2)_";.08////"_$P(OTHER,U,3) D ^DIE K DIE,DIC,DA,DR
 | 
|---|
| 45 |  . S DGRVRCAL=1
 | 
|---|
| 46 | ADDE Q IBX
 | 
|---|
| 47 |  ;
 | 
|---|
| 48 | EDIT(PIFN,REVIEN) ;
 | 
|---|
| 49 |  N IBCHG,DIE,DR,DA,DIC,DIDEL
 | 
|---|
| 50 |  S DIDEL=362.4,DIE="^IBA(362.4,"
 | 
|---|
| 51 |  S DR=".01;.03;.04;.06;.07;.08;.09"
 | 
|---|
| 52 |  S DA=PIFN D ^DIE
 | 
|---|
| 53 |  I '$D(^IBA(362.4,PIFN,0)),$G(REVIEN) D  ; Deleted RX - delete related rev code/CPT code
 | 
|---|
| 54 |  . I $P($G(^DGCR(399,IBIFN,"RC",REVIEN,0)),U,15) S DA(1)=IBIFN,DA=$P(^(0),U,15),DIK="^DGCR(399,"_DA(1)_",""CP""," D ^DIK
 | 
|---|
| 55 |  . S DA=REVIEN,DA(1)=IBIFN,DIK="^DGCR(399,"_DA(1)_",""RC""," D ^DIK
 | 
|---|
| 56 |  . S DGRVRCAL=1
 | 
|---|
| 57 |  Q
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 | SET(IFN,RXARR,RXARRP) ;setup array of all rx fills for bill, array name should be passed by reference
 | 
|---|
| 60 |  ;returns: RXARR(RX #, FILL DT)=RX IFN (362.4) ^ DRUG ^ DAYS SUPPLY ^ QTY ^ NDC # ^ Charge if known ^ ien of associated rev code multiple, if known ^ NDC FORMAT INDICATOR (1-4)
 | 
|---|
| 61 |  ;         RXARR=BILL IFN ^ RX count
 | 
|---|
| 62 |  N CNT,IBX,IBY,IBZ,PIFN,IBC,IBCNT,IBRC S IBCNT=+$G(RXARRP),IBC="AIFN"_$G(IFN) K RXARR,RXARRP
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 |  D RCITEM(IFN,"IBRC",3)
 | 
|---|
| 65 |  S (CNT,IBX)=0 F  S IBX=$O(^IBA(362.4,IBC,IBX)) Q:IBX=""  S PIFN=0 F  S PIFN=$O(^IBA(362.4,IBC,IBX,PIFN)) Q:'PIFN  D
 | 
|---|
| 66 |  .S IBY=$G(^IBA(362.4,PIFN,0)) Q:IBY=""  S CNT=CNT+1,RXARR($P(IBY,U,1),+$P(IBY,U,3))=PIFN_U_$P(IBY,U,4)_U_$P(IBY,U,6,8),$P(RXARR($P(IBY,U),+$P(IBY,U,3)),U,6)=$$CHG^IBCF4(PIFN,3,.IBRC)
 | 
|---|
| 67 |  . I $G(IFN) S $P(RXARR($P(IBY,U),+$P(IBY,U,3)),U,7)=$$FINDREV(IFN,3,PIFN)
 | 
|---|
| 68 |  . S $P(RXARR($P(IBY,U),+$P(IBY,U,3)),U,8)=$P(IBY,U,9)
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  S RXARR=$G(IFN)_"^"_CNT
 | 
|---|
| 71 |  S IBX=0 F  S IBX=$O(RXARR(IBX)) Q:IBX=""  S IBY=0 F  S IBY=$O(RXARR(IBX,IBY)) Q:'IBY  S IBCNT=IBCNT+1,RXARRP(IBCNT)=IBX_"^"_IBY_"^"_$P(RXARR(IBX,IBY),U,7)
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | DISP(RXARR,RXARRP) ;screen display of existing fills for a bill: input should be print order array returned by SET^IBCSC5A: RXARR(RX,DT)=RX IFN (362.4) ^ DRUG, passed by reference
 | 
|---|
| 75 |  N IBX,IBY,IBZ,IBS,IBP,IBIFN
 | 
|---|
| 76 |  W !!,?5,"-----------------  Existing Prescriptions on Bill  -----------------",!
 | 
|---|
| 77 |  S IBIFN=+$G(RXARR)
 | 
|---|
| 78 |  S IBI=0 F  S IBI=$O(RXARRP(IBI)) Q:IBI=""  S IBX=$P(RXARRP(IBI),U,1),IBY=$P(RXARRP(IBI),U,2) I $D(RXARR(IBX,IBY)) D
 | 
|---|
| 79 |  . S IBS=$$RXSTAT^IBCU1(+$P(RXARR(IBX,IBY),U,2),+$P($G(^IBA(362.4,+RXARR(IBX,IBY),0)),U,5),IBY)
 | 
|---|
| 80 |  . D ZERO^IBRXUTL(+$P(RXARR(IBX,IBY),U,2))
 | 
|---|
| 81 |  . S IBZ=$G(^TMP($J,"IBDRUG",+$P(RXARR(IBX,IBY),U,2),.01)),IBP=$$PRVNM(+RXARR(IBX,IBY))
 | 
|---|
| 82 |  . K ^TMP($J,"IBDRUG")
 | 
|---|
| 83 |  . W !,$J(IBI,2),")",?5,IBX,?19,$E(IBZ,1,25),?46,$$DATE^IBCSC5C(IBY),?56,$P(IBS,U,1),?61,$P(IBS,U,2),?69,$P(IBS,U,3)
 | 
|---|
| 84 |  . S IBZ=$$RXDUP^IBCU3(IBX,IBY,IBIFN) I +IBZ W ?73,$P($G(^DGCR(399,+IBZ,0)),U,1)
 | 
|---|
| 85 |  . S IBZ=$G(^DGCR(399,IBIFN,"RC",+$P(RXARR(IBX,IBY),U,7),0))
 | 
|---|
| 86 |  . W !,?5,$E(IBP,1,25),?35,"(Rx Procedure ",$S($P(IBZ,U,15):"#"_$P(IBZ,U,15)_" "_$$CPTNM^IBCRBH1(IBIFN,4,$P(IBZ,U,15)),1:"Missing"),"  Rev Code ",$S(IBZ:"#"_+$P(RXARR(IBX,IBY),U,7)_" "_$P($G(^DGCR(399.2,+IBZ,0)),U),1:"Missing"),")"
 | 
|---|
| 87 |  W !
 | 
|---|
| 88 |  Q
 | 
|---|
| 89 |  ;
 | 
|---|
| 90 | HELP(IFN) ;called for help from rx enter to display existing rx, displays rx' from 52 and 399
 | 
|---|
| 91 |  I +$G(IFN) N IBX,IBRXA S IBX=$$BILL(IFN) I +IBX D SET(IFN,.IBRXA,""),RXDISP^IBCSC5C($P(IBX,U,1),$P(IBX,U,2),$P(IBX,U,3),.IBPR,.IBPRO,.IBRXA,$P(IBX,U,4)) S IBRXAP=+IBPRO D SET(IFN,.IBRXA,.IBRXAP),DISP(.IBRXA,.IBRXAP)
 | 
|---|
| 92 |  Q
 | 
|---|
| 93 | BILL(IBIFN) ; return data on a bill 'patient ifn ^ from dt ^ to dt ^ true if add original rx'
 | 
|---|
| 94 |  N IBX,IBY
 | 
|---|
| 95 |  S IBX=$G(^DGCR(399,+$G(IBIFN),0)),IBY=$P(IBX,U,2)
 | 
|---|
| 96 |  I '$$PERDIEM^IBCRU3(+$P(IBX,U,7),+$P(IBX,U,5),+$P(IBX,U,3)) S $P(IBY,U,4)=1
 | 
|---|
| 97 |  S IBX=$G(^DGCR(399,+IBIFN,"U")),$P(IBY,U,2)=+IBX,$P(IBY,U,3)=+$P(IBX,U,2)
 | 
|---|
| 98 |  Q IBY
 | 
|---|
| 99 | DRUG(IBD) ; get drug
 | 
|---|
| 100 |  N X,Y S IBD=+$G(IBD) S DIC(0)="VQ",DIC="^PSDRUG(" D DIC^PSSDI(50,"PS",.DIC,IBD,) I +Y<0  S IBD=0,DIC="^PSDRUG(",DIC(0)="AEQ" D DIC^PSSDI(50,"PS",.DIC,,) K DIC I +Y>0 S IBD=+Y
 | 
|---|
| 101 |  Q IBD
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 | RCITEM(IBIFN,ARRAY,TYPE) ; Pull off all item charges from RC multiple 
 | 
|---|
| 104 |  ;  for item TYPE on bill IBIFN, return array ARRAY
 | 
|---|
| 105 |  ; If type = "ALL", pull off all types
 | 
|---|
| 106 |  ;Set up @ARRAY@(type,item reference,ct)=# units^unit charge
 | 
|---|
| 107 |  ; If no pointer to an item, this was a manually entered charge and
 | 
|---|
| 108 |  ;  will only 'associate' with the items found in the appropriate
 | 
|---|
| 109 |  ;  item source file that are not referenced by an item in the revenue
 | 
|---|
| 110 |  ;  code multiple in a sequential fashion (first unassociated 'RC' will
 | 
|---|
| 111 |  ;  correlate to the first unassociated entry found for the bill in source file)
 | 
|---|
| 112 |  N Z,Z0,Z1
 | 
|---|
| 113 |  S Z=0
 | 
|---|
| 114 |  F  S Z=$O(^DGCR(399,IBIFN,"RC",Z)) Q:'Z  S Z0=$G(^(Z,0)) I $S(TYPE="ALL":1,1:$P(Z0,U,10)=TYPE) I $P(Z0,U,10)'="" S Z1=$S($P(Z0,U,11)="":0,1:$P(Z0,U,11)),@ARRAY@($P(Z0,U,10),Z1,Z)=$P(Z0,U,3)_U_$P(Z0,U,2)
 | 
|---|
| 115 |  Q
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 | FINDREV(IBIFN,TYP,PTR) ; Finds the first revenue code that matches the
 | 
|---|
| 118 |  ; same item type and item pointer
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  N REVIEN,Z,Z0
 | 
|---|
| 121 |  S Z=0
 | 
|---|
| 122 |  F  S Z=$O(^DGCR(399,IBIFN,"RC",Z)) Q:'Z  S Z0=$G(^(Z,0)) I $P(Z0,U,10)=TYP,$P(Z0,U,11)=PTR S REVIEN=Z Q
 | 
|---|
| 123 |  Q $G(REVIEN)
 | 
|---|
| 124 |  ;
 | 
|---|
| 125 | NDCNUM(IBNDC) ; Returns the format of the NDC # IBNDC, if possible
 | 
|---|
| 126 |  N Z
 | 
|---|
| 127 |  S Z=$TR(IBNDC,"-")
 | 
|---|
| 128 |  Q $S(IBNDC?4N1"-"4N1"-"2N:1,IBNDC?5N1"-"3N1"-"2N:2,IBNDC?5N1"-"4N1"-"1N:3,IBNDC?5N1"-"4N1"-"2N!($L(Z)=11):4,IBNDC'="":1,1:"")
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 | PRVNM(PIFN) ; return provider name for an rx, if one defined or null
 | 
|---|
| 131 |  N IBX,IBPRV,IBRXIFN S IBPRV=""
 | 
|---|
| 132 |  S IBRXIFN=$P($G(^IBA(362.4,+$G(PIFN),0)),U,5) I +IBRXIFN S IBX=$$FILE^IBRXUTL(IBRXIFN,4) I +IBX S IBPRV=$P($G(^VA(200,+IBX,0)),U,1)
 | 
|---|
| 133 |  Q IBPRV
 | 
|---|