| 1 | BPSOSO2 ;BHAM ISC/FCS/DRS/DLF - NCPDP Override-Fman utils ;06/01/2004
 | 
|---|
| 2 |  ;;1.0;E CLAIMS MGMT ENGINE;**1,3,5**;JUN 2004;Build 45
 | 
|---|
| 3 |  ;;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ; EDIT,EDITGEN are called from the menus in BPSOSO1,
 | 
|---|
| 6 |  ;   typically reached from the pharmacy package's call
 | 
|---|
| 7 |  ;   to OVERRIDE^BPSOSO
 | 
|---|
| 8 |  ; GET511 is called from BPSOSCD during claim construction
 | 
|---|
| 9 |  ;
 | 
|---|
| 10 |  ;IHS/SD/lwj 8/01/02  NCPDP 5.1 changes to GET511 subroutine
 | 
|---|
| 11 |  ; Routine was changed to look at an exceptions list, if the
 | 
|---|
| 12 |  ; field being processed is in the exceptions list it will
 | 
|---|
| 13 |  ; create a "claim header" and "claim rx" entry.  The reason
 | 
|---|
| 14 |  ; for this is that several 300 range fields were moved to the
 | 
|---|
| 15 |  ; claim rx area within the 5.1 segments creating duplicate flds.
 | 
|---|
| 16 |  ; (i.e. the <402 and >402 rule is no longer valid)
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  ; New routine (PRIORA) added to handle the input of the prior
 | 
|---|
| 19 |  ; authorization information at prescription creation time.
 | 
|---|
| 20 |  ;
 | 
|---|
| 21 | EDIT(IEN,FIELDNUM) ;
 | 
|---|
| 22 |  I '$D(FIELDNUM) D EDITGEN(IEN) Q
 | 
|---|
| 23 |  ; Editing one field
 | 
|---|
| 24 |  N DIE,DA,DR,DIDEL,DTOUT,FIELDNAM
 | 
|---|
| 25 |  S DA=$$HASVALUE(IEN,FIELDNUM)
 | 
|---|
| 26 |  ; Make sure the entry exists in the subfile.
 | 
|---|
| 27 |  ; Create an empty one if necessary.
 | 
|---|
| 28 |  I 'DA S DA=$$SETVALUE(IEN,FIELDNUM,"")
 | 
|---|
| 29 |  ; edit the value field in the subfile
 | 
|---|
| 30 |  S DIE="^BPS(9002313.511,"_IEN_",1,",DA(1)=IEN
 | 
|---|
| 31 |  S DR=.02_$TR($$FIELDNAM(FIELDNUM),""";~","")
 | 
|---|
| 32 |  D ^DIE
 | 
|---|
| 33 |  ; If the value is null, then delete the entire FIELDNUM entry
 | 
|---|
| 34 |  I $$GETVALUE(IEN,FIELDNUM)="" D DELVALUE(IEN,FIELDNUM)
 | 
|---|
| 35 |  Q
 | 
|---|
| 36 | EDITGEN(IEN) ; general edit
 | 
|---|
| 37 |  ; First pass:  quick & dirty Fileman ^DIE call
 | 
|---|
| 38 |  ; Future: Screenman interface
 | 
|---|
| 39 |  N DIE,DA,DR,DIDEL,DTOUT
 | 
|---|
| 40 |  S DA=IEN,DIE=$$FILENUM,DR=1 D ^DIE
 | 
|---|
| 41 |  ; And we need to delete any entries with null values
 | 
|---|
| 42 |  N A S A=0 F  S A=$O(^BPS(9002313.511,IEN,1,A)) Q:'A  D
 | 
|---|
| 43 |  . N X S X=^BPS(9002313.511,IEN,1,A,0)
 | 
|---|
| 44 |  . I $P(X,U,2)="" D
 | 
|---|
| 45 |  . . N FIELDNUM S FIELDNUM=$P(^BPSF(9002313.91,$P(X,U),0),U)
 | 
|---|
| 46 |  . . D DELVALUE(IEN,FIELDNUM)
 | 
|---|
| 47 |  Q
 | 
|---|
| 48 | GET511(IEN,ARR101,ARR402) ;EP - from BPSOSCD - load arrays with data from IEN
 | 
|---|
| 49 |  ;
 | 
|---|
| 50 |  N A,C S A=0,C=0
 | 
|---|
| 51 |  N X,F,HDRLST,MULTLST,TFLD,BPFLDNUM
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ; Build the exception lists
 | 
|---|
| 54 |  S HDRLST=",524,",MULTLST=",308,315,316,317,318,319,320,327,"
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  F  S A=$O(^BPS(9002313.511,IEN,1,A)) Q:'A  D
 | 
|---|
| 57 |  . S X=^BPS(9002313.511,IEN,1,A,0)
 | 
|---|
| 58 |  . S F=$P(X,U) ; Field IEN, points to 9002313.91
 | 
|---|
| 59 |  . ; Store in either claim header or claim detail, based on field #
 | 
|---|
| 60 |  . ; Note that logic below will put 401 field in both header and detail
 | 
|---|
| 61 |  . S BPFLDNUM=+$$FIELDNUM(F)
 | 
|---|
| 62 |  . S TFLD=","_BPFLDNUM_","
 | 
|---|
| 63 |  . I BPFLDNUM<402!(HDRLST[TFLD) S @ARR101@(F)=$P(X,U,2)
 | 
|---|
| 64 |  . I BPFLDNUM>400!(MULTLST[TFLD) S @ARR402@(F)=$P(X,U,2)
 | 
|---|
| 65 |  . ;
 | 
|---|
| 66 |  . S C=C+1
 | 
|---|
| 67 |  Q C
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; Generalized utilities - good for everything, not just auth #
 | 
|---|
| 70 | LOCK() L +^BPS(9002313.511,IEN):300 Q $T
 | 
|---|
| 71 | UNLOCK L -^BPS(9002313.511,IEN) Q
 | 
|---|
| 72 | FILENUM() Q 9002313.511
 | 
|---|
| 73 | SUBFNUM() Q 9002313.5111
 | 
|---|
| 74 | FLOCK() L +^BPS(9002313.511):300 Q $T
 | 
|---|
| 75 | FUNLOCK L -^BPS(9002313.511) Q
 | 
|---|
| 76 | FIELDIEN(FIELDNUM) ; ien of a 9002313.91 NCPDP Data Dictionary field
 | 
|---|
| 77 |  Q $$FIND1^DIC(9002313.91,,,FIELDNUM)
 | 
|---|
| 78 | FIELDNAM(FIELDNUM) ; name of a 9002313.91 NCPDP Data Dictionary field
 | 
|---|
| 79 |  Q $$GET1^DIQ(9002313.91,$$FIELDIEN(FIELDNUM),.03)
 | 
|---|
| 80 |  ; given pointer to NCPDP Data Dictionary fields, return external #
 | 
|---|
| 81 | FIELDNUM(IEN91) Q $P($G(^BPSF(9002313.91,IEN91,0)),U)
 | 
|---|
| 82 | NEW() ;EP -  create new entry in 9002313.511
 | 
|---|
| 83 |  F  Q:$$FLOCK  Q:'$$IMPOSS^BPSOSUE("L","RTI","interlock on new Override record creation",,"NEW",$T(+0))
 | 
|---|
| 84 |  N FLAGS,FDA,IEN,MSG,FN,X,NEWREC S FN=$$FILENUM
 | 
|---|
| 85 |  D NEW1
 | 
|---|
| 86 |  D FUNLOCK
 | 
|---|
| 87 |  Q NEWREC
 | 
|---|
| 88 | NEW1 ;
 | 
|---|
| 89 |  S FDA(FN,"+1,",.01)=$O(^BPS(FN,"B",999999999999),-1)+1
 | 
|---|
| 90 |  D UPDATE^DIE(,"FDA","IEN","MSG")
 | 
|---|
| 91 |  I $D(MSG) D  G NEW1:$$IMPOSS^BPSOSUE("FM","TRI","UPDATE^DIE failed",,"NEW1",$T(+0))
 | 
|---|
| 92 |  . D ZWRITE^BPSOS("FDA","IEN","MSG")
 | 
|---|
| 93 |  . K MSG
 | 
|---|
| 94 |  S NEWREC=IEN(1)
 | 
|---|
| 95 | NEW2 ;
 | 
|---|
| 96 |  S FDA(FN,NEWREC_",",.02)="NOW"
 | 
|---|
| 97 |  D FILE^DIE("E","FDA","MSG")
 | 
|---|
| 98 |  Q:'$D(MSG)  ; success
 | 
|---|
| 99 |  G NEW2:$$IMPOSS^BPSOSUE("FM","TRI","FILE^DIE failed",,"NEW2",$T(+0))
 | 
|---|
| 100 |  Q
 | 
|---|
| 101 | HASVALUE(IEN,FIELDNUM) ; does the FIELDNUM have an override value?
 | 
|---|
| 102 |  ; returns IEN into the subfile
 | 
|---|
| 103 |  Q $$FIND1^DIC($$SUBFNUM,","_IEN_",",,FIELDNUM)
 | 
|---|
| 104 | GETVALUE(IEN,FIELDNUM) ; return currently-set override value for given FIELDNUM
 | 
|---|
| 105 |  N X S X=$$HASVALUE(IEN,FIELDNUM) I 'X Q ""
 | 
|---|
| 106 |  Q $$GET1^DIQ($$SUBFNUM,X_","_IEN_",",.02)
 | 
|---|
| 107 | SETVALUE(IEN,FIELDNUM,VALUE) ;
 | 
|---|
| 108 |  ; can DO or $$; $$ = ien in subfile for this FIELDNUM
 | 
|---|
| 109 |  ; Special case for the override file:  if you're trying to set the
 | 
|---|
| 110 |  ; field's value to "@", don't just delete the field value,
 | 
|---|
| 111 |  ; which would leave the field defined with a null value.
 | 
|---|
| 112 |  ; Instead, delete the entire override for the field.
 | 
|---|
| 113 |  ; This prevents accidentally overriding a genuine value with null.
 | 
|---|
| 114 |  I "@"=VALUE D DELVALUE(IEN,FIELDNUM) Q ""
 | 
|---|
| 115 |  ; But the usual case is just storing a value:
 | 
|---|
| 116 |  N FDA,MSG,IENS,IENARRAY
 | 
|---|
| 117 |  ; Note:  I tried the "+?1,ien," method but it always created a new
 | 
|---|
| 118 |  ; entry, even when it meant creating duplicates.  So now we test to
 | 
|---|
| 119 |  ; see if there's already an entry for the fieldnum, and if not,
 | 
|---|
| 120 |  ; then we put in a "+1,"
 | 
|---|
| 121 |  N ENTRY S ENTRY=$$HASVALUE(IEN,FIELDNUM) ; do we already have FIELDNUM
 | 
|---|
| 122 |  I 'ENTRY S ENTRY="+1" ; if not, then create a new entry
 | 
|---|
| 123 |  S IENS=ENTRY_","_IEN_","
 | 
|---|
| 124 |  S FDA($$SUBFNUM,IENS,.01)=FIELDNUM
 | 
|---|
| 125 |  S FDA($$SUBFNUM,IENS,.02)=VALUE
 | 
|---|
| 126 |  D SETV1
 | 
|---|
| 127 |  I ENTRY="+1" S ENTRY=$G(IENARRAY(1))
 | 
|---|
| 128 |  Q ENTRY
 | 
|---|
| 129 | SETV1 ;
 | 
|---|
| 130 |  D UPDATE^DIE("E","FDA","IENARRAY","MSG")
 | 
|---|
| 131 |  Q:'$D(MSG)  ; success
 | 
|---|
| 132 |  K ^TMP("BPS",$J,"BPSOSO2",$J,"SETVALUE")
 | 
|---|
| 133 |  S ^TMP("BPS",$J,"BPSOSO2",$J,"SETVALUE")=$$ERRHDR
 | 
|---|
| 134 |  M ^TMP("BPS",$J,"BPSOSO2",$J,"SETVALUE","MSG")=MSG
 | 
|---|
| 135 |  I $D(IENARRAY) M ^TMP("BPS",$J,"BPSOSO2",$J,"SETVALUE","IENARRAY")=IENARRAY
 | 
|---|
| 136 |  D ZWRITE^BPSOS("FDA","IENARRAY","MSG")
 | 
|---|
| 137 |  G SETV1:$$IMPOSS^BPSOSUE("FM","TRI",,,"SETVALUE",$T(+0))
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 | DELVALUE(IEN,FIELDNUM) ;
 | 
|---|
| 140 |  N ENTRY S ENTRY=$$HASVALUE(IEN,FIELDNUM) Q:'ENTRY  ; wasn't defined
 | 
|---|
| 141 |  N FDA,MSG
 | 
|---|
| 142 |  S FDA($$SUBFNUM,ENTRY_","_IEN_",",.01)="@"
 | 
|---|
| 143 | DE5 D FILE^DIE("E","FDA","MSG")
 | 
|---|
| 144 |  Q:'$D(MSG)  ; success
 | 
|---|
| 145 |  K ^TMP("BPS",$J,"BPSOSO2",$J,"DELVALUE")
 | 
|---|
| 146 |  S ^TMP("BPS",$J,"BPSOSO2",$J,"DELVALUE")=$$ERRHDR
 | 
|---|
| 147 |  D ZWRITE^BPSOS("IEN","FDA","MSG")
 | 
|---|
| 148 |  G DE5:$$IMPOSS^BPSOSUE("FM","TRI",,,"DELVALUE",$T(+0))
 | 
|---|
| 149 |  Q
 | 
|---|
| 150 | ERRHDR() Q "ERROR AT $H="_$H_" FOR $J="_$J
 | 
|---|
| 151 | SEE(IEN) N TMP M TMP=^BPS($$FILENUM,IEN) D ZWRITE^BPSOS("TMP") Q  ; debugging
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | PRIORA(IEN) ;IHS/SD/lwj 9/3/02 NCPDP 5.1 Changes - Prior Authorization
 | 
|---|
| 154 |  ; We are still processing 5.1 and 3.2 claims, so we have to be able
 | 
|---|
| 155 |  ; to populate fields 461, 462 and 416.  416 will be created based
 | 
|---|
| 156 |  ; on the input into fields 461, and 462.
 | 
|---|
| 157 |  ;
 | 
|---|
| 158 |  N FIELDNUM
 | 
|---|
| 159 |  ;
 | 
|---|
| 160 |  S FIELDNUM=461       ;Prior authorization type code
 | 
|---|
| 161 |  D EDIT(IEN,FIELDNUM)
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  S FIELDNUM=462       ;Prior authorization number submitted
 | 
|---|
| 164 |  D EDIT(IEN,FIELDNUM)
 | 
|---|
| 165 |  ;
 | 
|---|
| 166 |  ;now we combine field 461 and 462 to creat field 416
 | 
|---|
| 167 |  ;
 | 
|---|
| 168 |  N VAL461,VAL462,VAL416,DA
 | 
|---|
| 169 |  S (VAL461,VAL462,VAL416)=""
 | 
|---|
| 170 |  ;
 | 
|---|
| 171 |  S VAL461=$$GETVALUE(IEN,461)
 | 
|---|
| 172 |  S VAL462=$$GETVALUE(IEN,462)
 | 
|---|
| 173 |  S VAL416=VAL461_VAL462
 | 
|---|
| 174 |  Q:VAL416=""
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  S DA=$$SETVALUE(IEN,416,"")
 | 
|---|
| 177 |  S:$G(DA)'="" DA=$$SETVALUE(IEN,416,VAL416)
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 |  Q
 | 
|---|