[613] | 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
|
---|