| [613] | 1 | IBNCPUT1 ;BHAM ISC/SS - IB NCPDP UTILITIES ;22-MAR-2006
 | 
|---|
 | 2 |  ;;2.0;INTEGRATED BILLING;**342,363**;21-MAR-94;Build 35
 | 
|---|
 | 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
 | 4 |  ;
 | 
|---|
 | 5 |  ;Utilities for NPCDP
 | 
|---|
 | 6 |  ;/**
 | 
|---|
 | 7 |  ;Creates a new entry (or node for multiple with .01 field)
 | 
|---|
 | 8 |  ;
 | 
|---|
 | 9 |  ;IBFILE - subfile# (9002313.59111) for comment
 | 
|---|
 | 10 |  ;IBIEN - ien of the parent file entry in which the new subfile entry will be inserted
 | 
|---|
 | 11 |  ;IBVAL01 - .01 value for the new entry
 | 
|---|
 | 12 |  ;NEWRECNO -(optional) specify IEN if you want specific value
 | 
|---|
 | 13 |  ; Note: "" then the system will assign the entry number itself.
 | 
|---|
 | 14 |  ;IBFLGS - FLAGS parameter for UPDATE^DIE
 | 
|---|
 | 15 |  ;Examples
 | 
|---|
 | 16 |  ;top level:
 | 
|---|
 | 17 |  ; D INSITEM(366.14,"",IBDATE,"")
 | 
|---|
 | 18 |  ; D INSITEM(366.14,"",IBDATE,45)
 | 
|---|
 | 19 |  ; 
 | 
|---|
 | 20 |  ;1st level multiple:
 | 
|---|
 | 21 |  ; subfile number = #366.141
 | 
|---|
 | 22 |  ; parent file #366.14 entry number = 345
 | 
|---|
 | 23 |  ; D INSITEM(366.141,345,"SUBMIT","")
 | 
|---|
 | 24 |  ; to create mupltiple entry with particular entry number = 23
 | 
|---|
 | 25 |  ; D INSITEM(366.141,345,"SUBMIT",23)
 | 
|---|
 | 26 |  ;
 | 
|---|
 | 27 |  ;2nd level multiple
 | 
|---|
 | 28 |  ;parent file #366.14 entry number = 234
 | 
|---|
 | 29 |  ;parent multiple entry number = 55
 | 
|---|
 | 30 |  ;create mupltiple entry INSURANCE
 | 
|---|
 | 31 |  ; D INSITEM(366.1412,"55,234","INS","")
 | 
|---|
 | 32 |  ; results in :
 | 
|---|
 | 33 |  ; ^IBCNR(366.14,234,1,55,5,0)=^366.1412PA^1^1
 | 
|---|
 | 34 |  ; ^IBCNR(366.14,234,1,55,5,1,0)=INS
 | 
|---|
 | 35 |  ; ^IBCNR(366.14,234,1,55,5,"B","INS",1)=
 | 
|---|
 | 36 |  ;  (DD node for this muptiple =5 ) 
 | 
|---|
 | 37 |  ;  
 | 
|---|
 | 38 |  ;output :
 | 
|---|
 | 39 |  ; positive number - record # created
 | 
|---|
 | 40 |  ; <=0 - failure
 | 
|---|
 | 41 |  ;  See description above
 | 
|---|
 | 42 | INSITEM(IBFILE,IBIEN,IBVAL01,NEWRECNO,IBFLGS) ;*/
 | 
|---|
 | 43 |  N IBSSI,IBIENS,IBFDA,IBERR
 | 
|---|
 | 44 |  I '$G(NEWRECNO) N NEWRECNO S NEWRECNO=$G(NEWRECNO)
 | 
|---|
 | 45 |  I IBIEN'="" S IBIENS="+1,"_IBIEN_"," I $L(NEWRECNO)>0 S IBSSI(1)=+NEWRECNO
 | 
|---|
 | 46 |  I IBIEN="" S IBIENS="+1," I $L(NEWRECNO)>0 S IBSSI(1)=+NEWRECNO
 | 
|---|
 | 47 |  S IBFDA(IBFILE,IBIENS,.01)=IBVAL01
 | 
|---|
 | 48 |  D UPDATE^DIE($G(IBFLGS),"IBFDA","IBSSI","IBERR")
 | 
|---|
 | 49 |  I $D(IBERR) D BMES^XPDUTL(IBERR("DIERR",1,"TEXT",1)) Q -1  ;D BMES^XPDUTL(IBERR("DIERR",1,"TEXT",1)) 
 | 
|---|
 | 50 |  Q +$G(IBSSI(1))
 | 
|---|
 | 51 |  ;
 | 
|---|
 | 52 |  ;
 | 
|---|
 | 53 |  ;fill fields
 | 
|---|
 | 54 |  ;Input:
 | 
|---|
 | 55 |  ;FILENO file number
 | 
|---|
 | 56 |  ;FLDNO field number
 | 
|---|
 | 57 |  ;RECIEN ien string 
 | 
|---|
 | 58 |  ;NEWVAL new value to file
 | 
|---|
 | 59 |  ;Output:
 | 
|---|
 | 60 |  ;0^ NEWVAL^error if failure
 | 
|---|
 | 61 |  ;1^ NEWVAL if success
 | 
|---|
 | 62 | FILLFLDS(FILENO,FLDNO,RECIEN,NEWVAL) ;
 | 
|---|
 | 63 |  N RECIENS,FDA,ERRARR
 | 
|---|
 | 64 |  S RECIENS=RECIEN_","
 | 
|---|
 | 65 |  S FDA(FILENO,RECIENS,FLDNO)=NEWVAL
 | 
|---|
 | 66 |  D FILE^DIE("","FDA","ERRARR")
 | 
|---|
 | 67 |  I $D(ERRARR) Q "0^"_NEWVAL_"^"_ERRARR("DIERR",1,"TEXT",1)
 | 
|---|
 | 68 |  Q "1^"_NEWVAL
 | 
|---|
 | 69 |  ;
 | 
|---|
 | 70 |  ;convert external value of the field EVENT TYPE to its internal value
 | 
|---|
 | 71 |  ;IA# 10155
 | 
|---|
 | 72 | EXT2INT(IBEXTRN) ;
 | 
|---|
 | 73 |  N IBDD,IBZ,IBCNT,IBINTERN
 | 
|---|
 | 74 |  S IBINTERN=-1
 | 
|---|
 | 75 |  S IBDD=$P($G(^DD(366.141,.01,0)),U,3) ;IA# 10155
 | 
|---|
 | 76 |  F IBCNT=1:1 S IBZ=$P(IBDD,";",IBCNT) Q:IBZ=""  D  Q:IBINTERN'<0
 | 
|---|
 | 77 |  . I $P(IBZ,":",2)=IBEXTRN S IBINTERN=+IBZ
 | 
|---|
 | 78 |  Q:IBINTERN<0 0  ;treat as UNKNOWN
 | 
|---|
 | 79 |  Q IBINTERN
 | 
|---|
 | 80 |  ;
 | 
|---|
 | 81 |  ;
 | 
|---|
 | 82 |  ;should RX copay from the entry in file #350 be placed on hold ?
 | 
|---|
 | 83 |  ;called from HOLD^IBRUTL
 | 
|---|
 | 84 |  ;Input:
 | 
|---|
 | 85 |  ; X - zeroth node of file #350 entry
 | 
|---|
 | 86 |  ;output:
 | 
|---|
 | 87 |  ; 0 - NO - DO NOT PUT ON HOLD
 | 
|---|
 | 88 |  ; 1 - this is RX copay but there is no ECME claim, so process it as usual
 | 
|---|
 | 89 |  ; 1 - this is ECME RX copay and it should be put on HOLD
 | 
|---|
 | 90 |  ; 1 - this is ECME RX copay and it was rejected or reversed 
 | 
|---|
 | 91 |  ; 2 - this is not RX copay
 | 
|---|
 | 92 | HOLDECME(X) ;
 | 
|---|
 | 93 |  N IBRXIEN,IBREFNO,IBRXZ,IBDATE,IBDFN,IBEBCOB,IBRETVAL
 | 
|---|
 | 94 |  S IBRETVAL=""
 | 
|---|
 | 95 |  S IBRXZ=$P($G(X),U,4),(IBRXIEN,IBREFNO)=0
 | 
|---|
 | 96 |  I $P($P(IBRXZ,";"),":")'=52 Q 2  ;follow pre-existing logic
 | 
|---|
 | 97 |  S IBRXIEN=+$P($P(IBRXZ,";"),":",2) ;ien in file #52
 | 
|---|
 | 98 |  S IBREFNO=+$P($P($P(X,U,4),";",2),":",2) ;refill number (0 - for  original)
 | 
|---|
 | 99 |  S IBDFN=+$P($G(X),U,2) ;Patient ien
 | 
|---|
 | 100 |  ;if this is OTC "non-e-billable" drug then DO NOT PUT ON HOLD
 | 
|---|
 | 101 |  I $$OTCNEBIL(IBRXIEN)=1 Q 0
 | 
|---|
 | 102 |  ;if this is non-OTC drug OR if this is OTC drug but marked as e-billable then look if it has zero amount paid
 | 
|---|
 | 103 |  I $$AMNTHOLD^IBNCPUT1(IBDFN,IBRXIEN,IBREFNO)=0 Q 0  ;DO NOT PUT ON HOLD
 | 
|---|
 | 104 |  Q 1  ;follow pre-existing logic
 | 
|---|
 | 105 |  ;
 | 
|---|
 | 106 |  ;should RX copay be placed on hold based on the PAID amount?
 | 
|---|
 | 107 |  ;input:
 | 
|---|
 | 108 |  ; IBDFN - patient's ien
 | 
|---|
 | 109 |  ; IBRX - file #52 ien
 | 
|---|
 | 110 |  ; IBREF - refill no
 | 
|---|
 | 111 |  ;output:
 | 
|---|
 | 112 |  ; 1 - YES
 | 
|---|
 | 113 |  ; 0 - NO
 | 
|---|
 | 114 | AMNTHOLD(IBDFN,IBRX,IBREF) ;
 | 
|---|
 | 115 |  N IBPAYRES ;for payer's response
 | 
|---|
 | 116 |  N IBADT
 | 
|---|
 | 117 |  ;
 | 
|---|
 | 118 |  S IBPAYRES=$$PAIDAMNT^BPSUTIL(IBRX,IBREF)
 | 
|---|
 | 119 |  ;if payable AND amount paid is zero AND does not have any other Pharmacy insurance 
 | 
|---|
 | 120 |  ;THEN return NO - it should not be put on hold
 | 
|---|
 | 121 |  I +IBPAYRES=1,$P(IBPAYRES,U,2)=0,'$$MOREINS^IBNCPNB(IBDFN,+$P(IBPAYRES,U,3)) Q 0
 | 
|---|
 | 122 |  Q 1
 | 
|---|
 | 123 |  ;Is this RX for OTC drug which is NOT E-billiable?
 | 
|---|
 | 124 |  ;Input:
 | 
|---|
 | 125 |  ; IBRX - ien in file #52
 | 
|---|
 | 126 |  ;Output:
 | 
|---|
 | 127 |  ; 1 - this is OTC drug and it is NOT marked as e-billable
 | 
|---|
 | 128 |  ; 0 - otherwise
 | 
|---|
 | 129 | OTCNEBIL(IBRX) ;
 | 
|---|
 | 130 |  N ARR,IBSPHNDL,IBDRUG
 | 
|---|
 | 131 |  S IBDRUG=+$$RXAPI1^IBNCPUT1(IBRX,6,"I")
 | 
|---|
 | 132 |  S IBSPHNDL=$$DRUGDIE^IBNCPUT1(IBDRUG,3,"E",.ARR)
 | 
|---|
 | 133 |  I IBSPHNDL'["9" Q 0  ;this is not OTC drug
 | 
|---|
 | 134 |  I IBSPHNDL["E" Q 0  ;it is OTC E-billable drug
 | 
|---|
 | 135 |  ;it is OTC NON E-billable drug
 | 
|---|
 | 136 |  Q 1
 | 
|---|
 | 137 |  ;
 | 
|---|
 | 138 |  ;Function to return field data from DRUG file (#50)
 | 
|---|
 | 139 |  ; Parameters
 | 
|---|
 | 140 |  ;  IBIEN50 - IEN of DRUG FILE #50
 | 
|---|
 | 141 |  ;  IBFLDN - Field Number(s) (like .01)
 | 
|---|
 | 142 |  ;  IBEXIN - Specifies internal or external value of returned field
 | 
|---|
 | 143 |  ;         - optional, defaults to "I"
 | 
|---|
 | 144 |  ;  IBARR50 - Array to return value(s).  Optional.  Pass by reference.
 | 
|---|
 | 145 |  ;           See EN^DIQ documentation for variable DIQ
 | 
|---|
 | 146 |  ;
 | 
|---|
 | 147 |  ; Function returns field data if one field is specified.  If
 | 
|---|
 | 148 |  ;   multiple fields, the function will return "" and the field
 | 
|---|
 | 149 |  ;   values are returned in IBARR50
 | 
|---|
 | 150 |  ; Example: W $$DRUGDIE^IBNCPUT1(134,25,"E",.ARR)
 | 
|---|
 | 151 | DRUGDIE(IBIEN50,IBFLDN,IBEXIN,IBARR50) ; Return field values for Drug file 
 | 
|---|
 | 152 |  I $G(IBIEN50)=""!($G(IBFLDN)="") Q ""
 | 
|---|
 | 153 |  N DIQ,PSSDIY
 | 
|---|
 | 154 |  N IBDIQ
 | 
|---|
 | 155 |  I $G(IBEXIN)'="E" S IBEXIN="I"
 | 
|---|
 | 156 |  S IBDIQ="IBARR50",IBDIQ(0)=IBEXIN
 | 
|---|
 | 157 |  D EN^PSSDI(50,"IB",50,.IBFLDN,.IBIEN50,.IBDIQ)
 | 
|---|
 | 158 |  Q $G(IBARR50(50,IBIEN50,IBFLDN,IBEXIN))
 | 
|---|
 | 159 |  ;
 | 
|---|
 | 160 |  ;/*
 | 
|---|
 | 161 |  ;Function to return a value for a SINGLE field of file #52
 | 
|---|
 | 162 |  ;DBIA 4858
 | 
|---|
 | 163 |  ;input:
 | 
|---|
 | 164 |  ; IBIEN52 - ien of file #52
 | 
|---|
 | 165 |  ; IBFLDN - one single field, for example ".01"
 | 
|---|
 | 166 |  ; IBFORMAT - 
 | 
|---|
 | 167 |  ;  "E" for external format
 | 
|---|
 | 168 |  ;  "I" - internal 
 | 
|---|
 | 169 |  ;  "N" - do not return nulls
 | 
|---|
 | 170 |  ;  default is "E"
 | 
|---|
 | 171 |  ;output:
 | 
|---|
 | 172 |  ; returns a field value or null (empty string) 
 | 
|---|
 | 173 |  ; examples:
 | 
|---|
 | 174 |  ;W $$RXAPI1^IBNCPUT1(504733,6,"E")
 | 
|---|
 | 175 |  ;ALBUMIN 25% 50ML
 | 
|---|
 | 176 |  ;W $$RXAPI1^IBNCPUT1(504733,6,"I")
 | 
|---|
 | 177 |  ;134
 | 
|---|
 | 178 | RXAPI1(IBIEN52,IBFLDN,IBFORMAT) ;*/
 | 
|---|
 | 179 |  N DIQ,DIC,IBARR,X,Y,D0,PSODIY
 | 
|---|
 | 180 |  N I,J,C,DA,DRS,DIL,DI,DIQ1
 | 
|---|
 | 181 |  N IBDIQ
 | 
|---|
 | 182 |  S IBDIQ="IBARR"
 | 
|---|
 | 183 |  S IBDIQ(0)=$S($G(IBFORMAT)="":"E",1:IBFORMAT)
 | 
|---|
 | 184 |  D DIQ^PSODI(52,52,.IBFLDN,.IBIEN52,.IBDIQ) ;DBIA 4858
 | 
|---|
 | 185 |  Q $S(IBDIQ(0)="N":$G(IBARR(52,IBIEN52,IBFLDN)),1:$G(IBARR(52,IBIEN52,IBFLDN,IBDIQ(0))))
 | 
|---|
 | 186 |  ;
 | 
|---|
 | 187 |  ;
 | 
|---|
 | 188 |  ;IBNCPUT1
 | 
|---|