[613] | 1 | RAPCE ;HIRMFO/GJC-Interface with PCE APIs for wrkload, visits ;9/7/04 12:36pm
|
---|
| 2 | ;;5.0;Radiology/Nuclear Medicine;**10,17,21,26,41,57,56**;Mar 16, 1998;Build 3
|
---|
| 3 | ;Supported IA #2053 FILE^DIE
|
---|
| 4 | ;Supported IA #4663 SWSTAT^IBBAPI
|
---|
| 5 | ;Controlled IA #1889 DATA2PCE^PXAPI
|
---|
| 6 | Q
|
---|
| 7 | COMPLETE(RADFN,RADTI,RACNI) ; When an exam status changes to 'complete'
|
---|
| 8 | ; Input: RADFN-> Patient DFN, RADTI-> Exam Timestamp, RACNI-> Case IEN
|
---|
| 9 | ; NOTE: RACNI input param is ignored for exam sets (all cases under
|
---|
| 10 | ; an exam set are processed at once when order is complete)
|
---|
| 11 | ; $$DATA2PCE^PXAPI returns: 1 if no errors, else error condition
|
---|
| 12 | ;
|
---|
| 13 | K ^TMP("DIERR",$J),^TMP("RAPXAPI",$J)
|
---|
| 14 | N RA7002,RA7003,RA71,RA791,RACNT,RADTE,RAEARRY,RAPKG,RAVSIT,RABAD,RASTAT,RACPTM,RA,RA1,RARECMPL,RACNISAV
|
---|
| 15 | N RADUPRC,RACOMIEN,RASENT,RALCKFAL
|
---|
| 16 | S RALCKFAL=0 ; >0 if lock fails when :
|
---|
| 17 | ; 1= complt'g exam that's unique to other cases same dt/tm, if any
|
---|
| 18 | ; 2= complt'g exam that's a dupl of another cmplt'd exam (RESEND^RAPCE1)
|
---|
| 19 | ; 3= UNcompleting exam before deleting credit+visit pointers same dt/tm
|
---|
| 20 | S RAPKG=$O(^DIC(9.4,"B","RADIOLOGY/NUCLEAR MEDICINE",0))
|
---|
| 21 | S RADTE=9999999.9999-RADTI,RACNT=0
|
---|
| 22 | S RA7002=$G(^RADPT(RADFN,"DT",RADTI,0))
|
---|
| 23 | S RAXAMSET=+$P(RA7002,"^",5) ; is this part of an exam set? 1=YES
|
---|
| 24 | EN2 S RA791=$G(^RA(79.1,+$P(RA7002,"^",4),0))
|
---|
| 25 | ; Initialize variables required for PFSS 1B project and check the switch status.
|
---|
| 26 | N RAPFSW,RACCOUNT S RAPFSW=$$SWSTAT^IBBAPI ; Requirement 12
|
---|
| 27 | Q:+$P(RA791,"^",21)=2 ; no credit, quit
|
---|
| 28 | S RAEARRY="RAERROR" N @RAEARRY
|
---|
| 29 | LON ; lock at P level
|
---|
| 30 | L +^RADPT(RADFN,"DT",RADTI,"P",RACNI):30 I '$T S RALCKFAL=1 D FAILBUL^RAPCE2(RADFN,RADTI,RACNI,$S($G(RADUZ):RADUZ,1:DUZ)) Q
|
---|
| 31 | I 'RAXAMSET G NONSET
|
---|
| 32 | ; exam set, grab all the completed records!
|
---|
| 33 | S RACNISAV=RACNI
|
---|
| 34 | S RACNI=0
|
---|
| 35 | F S RACNI=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI)) Q:RACNI'>0!($G(RABAD)) D
|
---|
| 36 | . S RA7003=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0)) I $P($G(^RA(72,+$P(RA7003,U,3),0)),U,3)'=9 Q ;check code instead of name
|
---|
| 37 | . S RACNT=RACNT+1 D SETUP I $G(RABAD) Q
|
---|
| 38 | . D:'$D(^TMP("RAPXAPI",$J,"ENCOUNTER")) ENC(RACNT)
|
---|
| 39 | . D DX^RABWPCE($P(RA7003,U,11)) ; Ordering ICD Dx and related data.
|
---|
| 40 | . D PROC(RACNT)
|
---|
| 41 | . Q
|
---|
| 42 | S RACNI=RACNISAV ;restore value so unlock would work 012601
|
---|
| 43 | I '$G(RABAD),$D(^TMP("RAPXAPI",$J)) D PCE(RADFN,RADTI,RACNI)
|
---|
| 44 | ;Missing data, send failure bulletin for ea case in set, don't attempt to send data to PCE
|
---|
| 45 | I $G(RABAD) W:'$D(ZTQUEUED)&('$D(RARECMPL)) !,"Unable to credit Exam set" D
|
---|
| 46 | . S RACNI=0 F S RACNI=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI)) Q:RACNI'>0 D FAILBUL^RAPCE2(RADFN,RADTI,RACNI,$S($G(RADUZ):RADUZ,1:DUZ))
|
---|
| 47 | G KOUT
|
---|
| 48 | NONSET ; non-exam sets
|
---|
| 49 | S RA7003=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0))
|
---|
| 50 | D CKDUP^RAPCE1 ; chk for duplicate procedure(s) non-examset
|
---|
| 51 | I $G(RADUPRC) D RESEND^RAPCE1 G KOUT ; branch off to re-send rec(s) this dt/tm
|
---|
| 52 | S RACNT=RACNT+1
|
---|
| 53 | D SETUP
|
---|
| 54 | D:'$G(RABAD) ENC(RACNT) D:'$G(RABAD) DX^RABWPCE($P(RA7003,U,11)) D:'$G(RABAD) PROC(RACNT) D:'$G(RABAD) PCE(RADFN,RADTI,RACNI)
|
---|
| 55 | I $G(RABAD) W:'$D(ZTQUEUED)&('$D(RARECMPL)) !,"Unable to credit exam" D FAILBUL^RAPCE2(RADFN,RADTI,RACNI,$S($G(RADUZ):RADUZ,1:DUZ)) ;Missing data, send failure bulletin for single case, don't attempt to pass data to PCE
|
---|
| 56 | ;
|
---|
| 57 | KOUT K ^TMP("RAPXAPI",$J)
|
---|
| 58 | L -^RADPT(RADFN,"DT",RADTI,"P",RACNI)
|
---|
| 59 | Q
|
---|
| 60 | ENC(X) ; Set up the '"RAPXAPI",$J,"ENCOUNTER"' nodes
|
---|
| 61 | N RAIMGLOC,RA17,RARPTLOC
|
---|
| 62 | S RA17=+$P(RA7003,U,17)
|
---|
| 63 | S RARPTLOC=$P($G(^RARPT(RA17,"BA")),U,1)
|
---|
| 64 | S RAIMGLOC=$P($G(^RA(79.1,+RARPTLOC,0)),"^")
|
---|
| 65 | S:'RAIMGLOC RAIMGLOC=$P($G(^RA(79.1,+$P(RA7002,"^",4),0)),"^")
|
---|
| 66 | I RAIMGLOC="" S RABAD=1 Q ; needs imaging location
|
---|
| 67 | S ^TMP("RAPXAPI",$J,"ENCOUNTER",X,"PATIENT")=RADFN
|
---|
| 68 | S ^TMP("RAPXAPI",$J,"ENCOUNTER",X,"ENC D/T")=RADTE
|
---|
| 69 | S ^TMP("RAPXAPI",$J,"ENCOUNTER",X,"HOS LOC")=RAIMGLOC
|
---|
| 70 | S ^TMP("RAPXAPI",$J,"ENCOUNTER",X,"SERVICE CATEGORY")="X"
|
---|
| 71 | S ^TMP("RAPXAPI",$J,"ENCOUNTER",X,"ENCOUNTER TYPE")="A"
|
---|
| 72 | Q
|
---|
| 73 | PCE(RADFN,RADTI,RACNI) ; Pass on the information to the PCE software
|
---|
| 74 | N RASULT
|
---|
| 75 | ; If the PFSS switch is not active then do not pass RACCOUNT parameter to DATA2PCE call.
|
---|
| 76 | I 'RAPFSW S RASULT=$$DATA2PCE^PXAPI("^TMP(""RAPXAPI"",$J)",RAPKG,"RAD/NUC MED",.RAVSIT,"","","","",.@RAEARRY)
|
---|
| 77 | ; If the PFSS switch is active then use RACCOUNT parameter in DATA2PCE call.
|
---|
| 78 | I RAPFSW D
|
---|
| 79 | . ; PFSS Requirement 6, 11
|
---|
| 80 | . S RASULT=$$DATA2PCE^PXAPI("^TMP(""RAPXAPI"",$J)",RAPKG,"RAD/NUC MED",.RAVSIT,"","","","",.@RAEARRY,.RACCOUNT)
|
---|
| 81 | . Q
|
---|
| 82 | I (RASULT=1)!(RASULT=-1) D ;Visit file pointer, set 'Credit recorded' to yes.
|
---|
| 83 | . W:'$D(ZTQUEUED)&('$D(RARECMPL)) !?5,"Visit credited.",!
|
---|
| 84 | . D:'RAXAMSET VISIT(RADFN,RADTI,RACNI,RAVSIT)
|
---|
| 85 | . D:'RAXAMSET RECDCS(RADFN,RADTI,RACNI) ; only one exam, not a set
|
---|
| 86 | . D:RAXAMSET MULCS(RADFN,RADTI) ; set, update all exams!
|
---|
| 87 | . S RASENT=1 ; sent to PCE was okay
|
---|
| 88 | . Q
|
---|
| 89 | E D
|
---|
| 90 | . N RAWHOERR S RAWHOERR=""
|
---|
| 91 | . W:'$D(ZTQUEUED)&('$D(RARECMPL)) !?5,$C(7),"Unable to credit.",!
|
---|
| 92 | . I '$G(RAXAMSET) D FAILBUL^RAPCE2(RADFN,RADTI,RACNI,$S($G(RADUZ):RADUZ,1:DUZ))
|
---|
| 93 | . I $G(RAXAMSET) D
|
---|
| 94 | .. S RACNI=0 F S RACNI=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI)) Q:RACNI'>0 D FAILBUL^RAPCE2(RADFN,RADTI,RACNI,$S($G(RADUZ):RADUZ,1:DUZ))
|
---|
| 95 | .. Q
|
---|
| 96 | . Q
|
---|
| 97 | Q
|
---|
| 98 | MULCS(RADFN,RADTI) ; Update the 'Credit recorded' field and the Visit
|
---|
| 99 | ;pointer for each case that is complete
|
---|
| 100 | N RACNI S RACNI=0
|
---|
| 101 | F S RACNI=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI)) Q:RACNI'>0 D
|
---|
| 102 | . Q:$P($G(^RA(72,+$P($G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0)),U,3),0)),U,3)'=9
|
---|
| 103 | . D RECDCS(RADFN,RADTI,RACNI)
|
---|
| 104 | . D VISIT(RADFN,RADTI,RACNI,RAVSIT)
|
---|
| 105 | . Q
|
---|
| 106 | Q
|
---|
| 107 | PROC(X) ; Set up the other '"RAPXAPI",$J,"PROCEDURE"' nodes for this case
|
---|
| 108 | ; If same procedure repeated in exam set, add to qty of existing
|
---|
| 109 | ; 'procedure' node. Else, if different provider, create new
|
---|
| 110 | ; separate 'procedure' nodes
|
---|
| 111 | N X1,X2,X3,RADUP F X1=1:1:X S X2=$G(^TMP("RAPXAPI",$J,"PROCEDURE",X1,"PROCEDURE")) I X2=$P(RA71,"^",9),^("ENC PROVIDER")=$S(RA7003(15)]"":RA7003(15),1:RA7003(12)) D Q
|
---|
| 112 | . S ^TMP("RAPXAPI",$J,"PROCEDURE",X1,"QTY")=^("QTY")+1
|
---|
| 113 | . D CPTMOD(X1)
|
---|
| 114 | . S RADUP=1
|
---|
| 115 | . Q
|
---|
| 116 | I $D(RADUP) Q
|
---|
| 117 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"QTY")=1
|
---|
| 118 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"PROCEDURE")=$P(RA71,"^",9)
|
---|
| 119 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"NARRATIVE")=$P(RA71,"^")
|
---|
| 120 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"ENC PROVIDER")=$S(RA7003(15)]"":RA7003(15),1:RA7003(12)) ; Pri. Int Staff if exists, else Pri Int Resident
|
---|
| 121 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"ORD PROVIDER")=RA7003(14) ; Requesting Physician.
|
---|
| 122 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X,"EVENT D/T")=RADTE
|
---|
| 123 | ; if the PFSS switch is active Get both Dept. Code and Account Reference Number (RACCOUNT)
|
---|
| 124 | I RAPFSW D GETDEPT^RABWIBB ; Requirement 9
|
---|
| 125 | D CPTMOD(X)
|
---|
| 126 | D PROCDX^RABWPCE(X) ; Add Ordering ICD Dx to each Procedure.
|
---|
| 127 | Q
|
---|
| 128 | RECDCS(RADFN,RADTI,RACNI) ; Set 'Clinic Stop Recorded' to yes
|
---|
| 129 | ; (70.03, fld 23)
|
---|
| 130 | N RAFDA S RAFDA(70.03,RACNI_","_RADTI_","_RADFN_",",23)="Y"
|
---|
| 131 | D FILE^DIE("K","RAFDA")
|
---|
| 132 | Q
|
---|
| 133 | SETUP ; Setup examination data node information
|
---|
| 134 | ; If no provider, or inactive CPT, fail
|
---|
| 135 | S RA7003=$G(^RADPT(RADFN,"DT",RADTI,"P",RACNI,0))
|
---|
| 136 | S RA7003(12)=$P(RA7003,"^",12) ; Pri. Inter. Resident
|
---|
| 137 | S RA7003(14)=$P(RA7003,"^",14) ; Requesting Physician.
|
---|
| 138 | S RA7003(15)=$P(RA7003,"^",15) ; Pri. Inter. Staff
|
---|
| 139 | ; OK to send if missing resident/staff ONLY if report Elec. Filed
|
---|
| 140 | I (RA7003(12)="")&(RA7003(15)=""),$P($G(^RARPT(+$P(RA7003,U,17),0)),U,5)'="EF" S RABAD=1 Q
|
---|
| 141 | S RA71=$G(^RAMIS(71,+$P(RA7003,"^",2),0))
|
---|
| 142 | ; store CPT Modifiers' .01 value
|
---|
| 143 | K RACPTM S RA=0 F S RA=$O(^RADPT(RADFN,"DT",RADTI,"P",RACNI,"CMOD",RA)) Q:'RA S RA1=$$BASICMOD^RACPTMSC($P($G(^(RA,0)),"^"),+$P(RA7002,"^")) S:+RA1>0 RACPTM(RA)=$P(RA1,"^",2) ;only valid cpt mods
|
---|
| 144 | ; find out if CPT code is active
|
---|
| 145 | I '$$ACTCODE^RACPTMSC(+$P(RA71,"^",9),$P(RA7002,"^")) S RABAD=1
|
---|
| 146 | Q
|
---|
| 147 | VISIT(RADFN,RADTI,RACNI,RAVSIT) ; Stuff the Visit file pointer passed back
|
---|
| 148 | ; from $$DATA2PCE^PXAPI() into the Visit field (70.02, fld 6)
|
---|
| 149 | N RAFDA S RAFDA(70.03,RACNI_","_RADTI_","_RADFN_",",27)=RAVSIT
|
---|
| 150 | D FILE^DIE("K","RAFDA")
|
---|
| 151 | Q
|
---|
| 152 | CPTMOD(X3) ;CPT Modifiers
|
---|
| 153 | ; CPT Mods for dupl. procedure+provider will be accounted for
|
---|
| 154 | ; however, same CPT Mod will overwrite previous CPT Mod
|
---|
| 155 | S ^TMP("RAPXAPI",$J,"PROCEDURE",X3,"MODIFIERS")="" ;prevent abend
|
---|
| 156 | S RA=0
|
---|
| 157 | F S RA=$O(RACPTM(RA)) Q:'RA S ^TMP("RAPXAPI",$J,"PROCEDURE",X3,"MODIFIERS",RACPTM(RA))=""
|
---|
| 158 | Q
|
---|