Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: BCHHL7F

BCHHL7F.m

Go to the documentation of this file.
  1. BCHHL7F ; IHS/TUCSON/LAB - ADD NEW CHR ACTIVITY RECORDS ; [ 04/28/06 3:21 PM ]
  1. ;;1.0;IHS RPMS CHR SYSTEM;**16**;OCT 28, 1996
  1. ;
  1. ; Driver for filing HL7 messages.
  1. ; Array of data is passed from GIS
  1. ;
  1. ;
  1. MAIN ;EP - called from GIS interface
  1. S BHLNOST=1 D ^BHLSETI
  1. D ^BHLFO
  1. S U="^"
  1. I '$D(BHL) Q ;no BHL array so don't bother
  1. D EN^XBVK("BCH")
  1. K BCHDAR ;array of data values for filing
  1. D CHECK ;check for required pieces of data/valid data, if req element missing file error
  1. I BCHERR D ERRLOG,XIT Q
  1. D GETPAT
  1. I BCHERR D ERRLOG,XIT Q
  1. D FILEREC
  1. I $G(BCHERR) D ERRLOG
  1. D XIT
  1. Q
  1. GETPAT ;
  1. S BCHPAT=""
  1. S BCHNAME=$P($G(BHL("PID",1,5)),U,1)_","_$P($G(BHL("PID",1,5)),U,2)
  1. S BCHCHRN=$P($G(BHL("PID",1,3)),"^",1)
  1. S BCHFACH=$E(BCHCHRN,1,6)
  1. S BCHFHRN=$O(^AUTTLOC("C",BCHFACH,0))
  1. S BCHHRN=+$E(BCHCHRN,7,99)
  1. I 'BCHFHRN Q
  1. S BCHSEX=$G(BHL("PID",1,8))
  1. S BCHDOB=""
  1. S X=$G(BHL("PID",1,7))
  1. I X]"" S X=$E(X,5,6)_"/"_$E(X,7,8)_"/"_$E(X,1,4),%DT="P" D ^%DT S BCHDOB=Y I Y=-1 S BCHDOB=""
  1. S X=0 F S X=$O(^AUPNPAT("D",BCHHRN,X)) Q:X'=+X I $D(^AUPNPAT("D",BCHHRN,X,BCHFHRN)) S BCHPAT=X
  1. I 'BCHPAT Q
  1. ;now check DOB and sex, if they don't match don't point to patient
  1. I $P(^DPT(BCHPAT,0),"^",2)'=BCHSEX S BCHPAT="" Q
  1. I $P(^DPT(BCHPAT,0),"^",3)'=BCHDOB S BCHPAT="" Q
  1. Q
  1. FILEREC ;
  1. S X=$O(^BCHR("CUI",BCHUID,0)) I X S BCHACT="M" ;says add but have that record
  1. I BCHACT="M" D MODIFY Q
  1. D ADD
  1. Q
  1. ADD ;
  1. ;create and file BCHR record entry
  1. D ^XBFMK
  1. S DIC="^BCHR(",DIC(0)="L",X=BCHDOS,%DT="T" D ^%DT S X=Y,DLAYGO=90002,DIC("DR")=".16////"_DUZ_";.17////"_DT_";.22////"_DT_";.26////R" K DD,DO D FILE^DICN
  1. I Y=-1 S BCHERR=1,BCHERR("ERROR")="CREATING CHR RECORD ENTRY FAILED" Q
  1. S BCHR=+Y
  1. D EDITREC
  1. I BCHERR Q
  1. D POVS
  1. D FILEMEAS
  1. D FILEDMO
  1. D PCCLINK
  1. Q
  1. EDITREC ;
  1. K BCHFDA
  1. S BCHFDA(90002,BCHR_",",.02)=BCHPROG
  1. S BCHFDA(90002,BCHR_",",.03)=BCHCHR
  1. I $G(BCHPAT) S BCHFDA(90002,BCHR_",",.04)=BCHPAT
  1. I $G(BCHFACL) S BCHFDA(90002,BCHR_",",.05)=BCHFACL
  1. S BCHFDA(90002,BCHR_",",.06)=BCHACTLI
  1. S BCHFDA(90002,BCHR_",",.07)=BCHREFT
  1. S BCHFDA(90002,BCHR_",",.08)=BCHREFF
  1. S BCHFDA(90002,BCHR_",",.09)=BCHEVAL
  1. S BCHFDA(90002,BCHR_",",.11)=BCHTRAV
  1. S BCHFDA(90002,BCHR_",",.12)=BCHNS
  1. S BCHFDA(90002,BCHR_",",.21)=BCHUID
  1. S BCHFDA(90002,BCHR_",",1108)=BCHTEMPR
  1. S BCHERR=""
  1. D FILE^DIE("KS","BCHFDA","BCHERR")
  1. I BCHERR S BCHERR("ERROR")="UPDATING CHR RECORD ENTRY FAILED FILEMAN"
  1. K BCHFDA
  1. Q
  1. POVS ;
  1. D ^XBFMK
  1. Q:'$D(BCHPOVS)
  1. S APCDOVRR=1
  1. S BCHN=0 F S BCHN=$O(BCHPOVS(BCHN)) Q:'BCHN D
  1. .S X=$P(BCHPOVS(BCHN),U),X=$$UP^XLFSTR(X) I X="" S BHLERR=1,BHLERR("ERROR")="POV PROBLEM CODE FAILED" Q
  1. .S DIC="^BCHRPROB(",DIC("DR")=".02////^S X=$G(BCHPAT);.03////^S X=BCHR",DLAYGO=90002.01,DIADD=1,DIC(0)="L" K DD,DO D FILE^DICN K DIADD,DLAYGO
  1. .I Y=-1 S BHLERR=1,BCHERR("ERROR")="ERROR IN DICN ADDING A POV" Q
  1. .S BCHPOV=+Y
  1. .D ^XBFMK
  1. .S DA=BCHPOV,DIE="^BCHRPROB("
  1. .S BCHSRV=$P(BCHPOVS(BCHN),U,2),BCHSRV="`"_BCHSRV
  1. .S DR=".04///"_BCHSRV_";.05////"_$P(BCHPOVS(BCHN),U,3)_";.06///"_$P(BCHPOVS(BCHN),U,4)_";.07///"_$P(BCHPOVS(BCHN),U,5)
  1. .D ^DIE
  1. .I $D(Y) S BCHERR=1,BCHERR("ERROR")="ERROR UPDATING POV RECORD - DIE"
  1. .D ^XBFMK
  1. K APCDOVRR
  1. Q
  1. ;
  1. FILEDMO ; get patient based on chart number passed, check dob and sex
  1. ; if same use IEN, otherwise do not
  1. ;
  1. Q:BCHPAT
  1. I BCHNAME="",BCHDOB="",BCHSEX="" Q ;not a patient encounter
  1. S BCHSSN=$G(BHL("PID",1,19)) I BCHSSN'?9N S BCHSSN=""
  1. S BCHTRI=$P($G(BHL("ZP2",1,15)),"^",1) I BCHTRI S BCHTRI=$O(^AUTTTRI("C",BCHTRI,0))
  1. S BCHCOM=$G(BHL("ZHR",1,1)) I BCHCOM]"" S BCHCOMP=$O(^AUTTCOM("C",BCHCOM,0))
  1. D ^XBFMK
  1. S DIE="^BCHR(",DA=BCHR,DR="1101///"_BCHNAME_";1102////"_BCHDOB_";1103///"_BCHSEX_";1104///"_BCHSSN_";1111///"_BCHHRN_";1109////"_BCHFHRN
  1. S DR=DR_";1107////"_BCHCOM_";1105////"_BCHTRI_";1106////"_BCHCOMP
  1. D ^DIE
  1. I $D(Y) S BHLERR="ERROR UPDATING AN ITEM IN THE DEMO NODE"
  1. Q
  1. ;
  1. FILEMEAS ; file all tests
  1. ;
  1. Q:'$D(BCHMEAS)
  1. S BCHN=0 F S BCHN=$O(BCHMEAS(BCHN)) Q:'BCHN S BCHMTYP=$P(BCHMEAS(BCHN),U,1),BCHVALUE=$P(BCHMEAS(BCHN),U,2) D
  1. .S BCHTIEN=$O(^BCHTMT("B",BCHMTYP,0)) I BCHTIEN="" S BCHERR=1,BCHERR("ERROR")="MEASUREMENT TYPE NOT FOUND IN TABLE" Q
  1. .S BCHFIELD=$P(^BCHTMT(BCHTIEN,0),U,3) I BCHFIELD="" Q ;this is temporary ************ only fields 1201-1210 work, will do lab tests later
  1. .;file measurement
  1. .D ^XBFMK S DIE="^BCHR(",DA=BCHR,DR=BCHFIELD_"///"_BCHVALUE D ^DIE
  1. .I $D(Y) S BCHERR="DIE FAILED UPDATING "_BCHMTYP_" VALUE" Q
  1. .Q
  1. Q
  1. ;
  1. S BCHEV("TYPE")="A" ; add, edit or delete
  1. D PROTOCOL^BCHUADD1
  1. K BCHEV,BCHR
  1. Q
  1. MODIFY ;
  1. S BCHR=$O(^BCHR("CUI",BCHUID,0))
  1. I BCHR="" D ADD Q ;couldn't find this record so do add
  1. S BCHSTOP=1 D DELETE^BCHUDEL K BCHSTOP
  1. D ADD
  1. Q
  1. ERRLOG ;
  1. ;file error into CHR
  1. D ^XBFMK K DLAYGO,DIADD
  1. S U="^"
  1. S X=$$NOW^XLFDT,DIC="^BCHHLER(",DIC(0)="L",DIADD=1,DLAYGO=90002
  1. K DD,D0,DO D FILE^DICN K DIADD,DLAYGO
  1. S BCHEIEN=+Y
  1. Q:'BCHEIEN
  1. D ^XBFMK
  1. S DIE="^BCHHLER(",DA=BCHEIEN,DR=".02////"_BCHERR("ERROR") D ^DIE
  1. S BCHTEXT="ERRF" F BCHX=1:1 S BCHDATA=$P($T(@BCHTEXT+BCHX),";;",2,99) Q:BCHDATA="" D
  1. .D ^XBFMK
  1. .S V=$P(BCHDATA,";;",2) S X="" X V
  1. .S DR=$P(BCHDATA,";;",1)_"////"_X,DIE="^BCHHLER(",DA=BCHEIEN D ^DIE
  1. .Q
  1. ;now save off the BHL obr and obx arrays into 12 nodes
  1. S BCHC=0,BCHCNTR=0 F S BCHC=$O(BHL("OBR",BCHC)) Q:BCHC'=+BCHC D
  1. .S BCHD=0 F S BCHD=$O(BHL("OBR",BCHC,BCHD)) Q:BCHD'=+BCHD D
  1. ..Q:BHL("OBR",BCHC,BCHD)=""
  1. ..S BCHCNTR=BCHCNTR+1,^BCHHLER(BCHEIEN,12,BCHCNTR,0)=BHL("OBR",BCHC,BCHD)
  1. .S BCHE=0 F S BCHE=$O(BHL("OBX",BCHC,BCHE)) Q:BCHE'=+BCHE D
  1. ..S BCHF=0 F S BCHF=$O(BHL("OBX",BCHC,BCHE,BCHF)) Q:BCHF'=+BCHF D
  1. ...Q:BHL("OBX",BCHC,BCHE,BCHF)=""
  1. ...S BCHCNTR=BCHCNTR+1,^BCHHLER(BCHEIEN,12,BCHCNTR,0)=BHL("OBX",BCHC,BCHE,BCHF)
  1. ..Q
  1. .Q
  1. S ^BCHHLER(BCHEIEN,12,0)="^^"_BCHCNTR_"^"_BCHCNTR_"^"_DT_"^"
  1. Q
  1. XIT ;
  1. D KILL^AUPNPAT
  1. D EN^XBVK("BCH")
  1. K BHL
  1. Q
  1. CHECK ;
  1. ; - in order to file a record into the CHR Module
  1. ; - the following field values must be present and valid
  1. ; . there must be at least one OBR/OBX combination that is
  1. ; not a test and measurement OBR this segment must have a
  1. ; health problem code and activity code pair in OBX
  1. ; . CHR - provider ID, OBR 32
  1. ; . DATE OF SERVICE - OBR 7
  1. ; . CHR PROGRAM CODE - ZHR 2
  1. ; . ACTIVITY LOCATION - ZHR 3
  1. ;
  1. ; check for value and transform into fileable format in separate array
  1. ; chr program code in variable BCHPROG, can be 4 slashed
  1. K BCHERR
  1. S BCHERR=0 ;if error then set to 1 and set BCHERR("ERROR")="error message"
  1. S X=$G(BHL("ZHR",1,2)) I X="" S BCHERR=1,BCHERR("ERROR")="Program code missing" Q
  1. S BCHPROG=$O(^BCHTPROG("C",X,0)) I X="" S BCHERR=1,BCHERR("ERROR")="Program code passed could not be found in table." Q
  1. ; check for chr activity location
  1. S (X,BCHACTL)=$G(BHL("ZHR",1,3)) S:X="-" (X,BCHACTL)="--" I X="" S BCHERR=1,BCHERR("ERROR")="Activity Location missing" Q
  1. S BCHACTLI=$O(^BCHTACTL("D",X,0)) I BCHACTLI="" S BCHERR=1,BCHERR("ERROR")="Invalid Activity Location passed" Q
  1. ;BCHACTLI can be 4 slashed when filing, internal format of pointer
  1. S BCHFACL=$G(BHL("PV1",1,3)) S:BCHACTL'="HC" BCHFACL="" I BCHACTL="HC" D Q:BCHERR
  1. .I BCHFACL="" S BCHERR=1,BCHERR("ERROR")="Patient location missing and activity location is HC" Q
  1. .S BCHFACL=$O(^AUTTLOC("C",BCHFACL,0)) I BCHFACL="" S BCHERR=1,BCHERR("ERROR")="Invalid patient location passed for activity location HC" Q
  1. ; check and set OBR/OBX
  1. K BCHPOVS
  1. K BCHMEAS
  1. S BCHPOVC=0
  1. S BCHC=0 F S BCHC=$O(BHL("OBR",BCHC)) Q:BCHC'=+BCHC!(BCHERR) D
  1. . ;get date of service from field 7
  1. . S (BCHPROB,BCHSRV,BCHMIN,BCHNARR,BCHSUBST)=""
  1. . S BCHDOS=$G(BHL("OBR",BCHC,7)) I BCHDOS="" S BCHERR=1,BCHERR("ERROR")="Date of Service Missing" Q
  1. . S BCHDOS=$E(BCHDOS,1,7)
  1. . ;convert to internal fileman format
  1. . ;NEW G,X,Y,%DT S X=BCHDOS,%DT="P" D ^%DT S BCHDOS=Y I BCHDOS=-1 S BCHERR=1,BCHERR("ERROR")="Date of service invalid" Q
  1. . ;get provider from field 32
  1. . S BCHT=$G(BHL("OBR",BCHC,4))
  1. . I BCHT["TM^TESTS AND MEASUREMENTS" D MEAS Q
  1. . ;process problem code/service code obxs
  1. . S BCHCHR=$P($G(BHL("OBR",BCHC,32)),"^",2) I BCHCHR="" S BCHERR=1,BCHERR("ERROR")="CHR Provider missing" Q
  1. . S BCHCHR=$O(^VA(200,"GIHS",BCHCHR,0)) I BCHCHR="" S BCHERR=1,BCHERR("ERROR")="CHR Provider not found in Provider file (file 200)." Q
  1. . S BCHX=0 F S BCHX=$O(BHL("OBX",BCHC,BCHX)) Q:BCHX'=+BCHX!(BCHERR) D
  1. .. S BCHVAL=$G(BHL("OBX",BCHC,BCHX,3))
  1. .. S BCHT=$P(BCHVAL,"^",3)
  1. .. I BCHT="" S BCHERR=1,BCHERR("ERROR")="Error in OBX segment, unknown type" Q
  1. .. I BCHT'="99CHRHAC",BCHT'="99CHRSVC" S BCHERR=1,BCHERR("ERROR")="obr table definition not HAC OR SVC" Q
  1. .. I BCHT="99CHRHAC" D PROBLK Q:BCHERR
  1. .. I BCHT="99CHRSVC" D SRVLK Q:BCHERR
  1. .. S BCHMIN=BHL("OBR",BCHC,20) I BCHMIN="" S BCHMIN=1
  1. .. S BCHSUBST=$G(BHL("OBR",BCHC,21)) I BCHSUBST]"","YN"'[BCHSUBST S BCHSUBST=""
  1. .. I BCHT="99CHRSVC" S BCHNARR=$G(BHL("OBX",BCHC,BCHX,5)) I BCHNARR="" S BCHNARR=$P(^BCHTPROB(BCHPROB,0),U)_": "_$P(^BCHTSERV(BCHSRV,0),"^",1)
  1. . S BCHPOVC=BCHPOVC+1
  1. . S BCHPOVS(BCHPOVC)=BCHPROB_"^"_BCHSRV_"^"_BCHMIN_"^"_BCHNARR_"^"_BCHSUBST
  1. ;now get other stuff
  1. ;
  1. Q:BCHERR
  1. S BCHTRAV=$G(BHL("ZV1",1,23)) I BCHTRAV="" S BCHTRAV=0
  1. S BCHREFT="",X=$G(BHL("ZHR",1,4)) I X]"" S X=$O(^BCHTREF("D",X,0)) S:X BCHREFT=X I X="" S BCHERR=1,BCHERR("ERROR")="Invalid Referred to code passed" Q
  1. S BCHREFF="",X=$G(BHL("ZHR",1,5)) I X]"" S X=$O(^BCHTREF("D",X,0)) S:X BCHREFF=X I X="" S BCHERR=1,BCHERR("ERROR")="Invalid Referred from code passed" Q
  1. S BCHNS=$G(BHL("ZHR",1,7)) I BCHNS="" S BCHNS=0 ;number served
  1. S BCHEVAL=$G(BHL("ZHR",1,6)) I BCHEVAL]"",BCHEVAL'="UI",BCHEVAL'="CI",BCHEVAL'="FI",BCHEVAL'="PR" S BCHEVAL=""
  1. S BCHACT=$G(BHL("ZHR",1,9)) I BCHACT="" S BCHACT="A"
  1. S BCHUID=$G(BHL("ZHR",1,8))
  1. S BCHTEMPR=$G(BHL("PID",1,11)) S BCHTEMPR=$E(BCHTEMPR,1,30)
  1. Q
  1. MEAS ;
  1. K BCHMEAS
  1. S BCHMEAS=0
  1. S BCHX=0 F S BCHX=$O(BHL("OBX",BCHC,BCHX)) Q:BCHX'=+BCHX!(BCHERR) D
  1. . S BCHVAL=$G(BHL("OBX",BCHC,BCHX,3))
  1. . S BCHVAL=$P(BCHVAL,"^",1)
  1. . S BCHMFIEL=$O(^BCHTMT("B",BCHVAL,0))
  1. . I BCHMFIEL="" S BCHERR=1,BCHERR("ERROR")="Error in measurement/test type "_BCHVAL Q
  1. . S BCHMFIEL=$P(^BCHTMT(BCHMFIEL,0),U,3) I BCHMFIEL="" S BCHERR=1,BCHERR("ERROR")="Error in measurement type field number" Q
  1. . S BCHMRES=$G(BHL("OBX",BCHC,BCHX,5))
  1. . I BCHVAL="VU"!(BCHVAL="VC") S BCHMRES=$P($P(BCHMRES,"~"),"/",2)_"/"_$P($P(BCHMRES,"~",2),"/",2)
  1. . K BCHZ D CHK^DIE(90002,BCHMFIEL,"E",BCHMRES,.BCHZ)
  1. . I BCHZ="^" S BCHERR=1,BCHERR("ERROR")="Invalid measurement/test value passed "_BCHVAL_" - "_BCHMRES Q
  1. . S BCHMEAS=BCHMEAS+1,BCHMEAS(BCHMEAS)=BCHVAL_"^"_BCHMRES_"^"_BCHMFIEL
  1. . Q
  1. Q
  1. PROBLK ;
  1. S X=$P(BCHVAL,"^",1)
  1. S Y=$O(^BCHTPROB("C",X,0))
  1. I Y="" S BCHERR=1,BCHERR("ERROR")="Invalid problem code passed "_X Q
  1. S BCHPROB=Y
  1. Q
  1. SRVLK ;
  1. S X=$P(BCHVAL,"^",1)
  1. S Y=$O(^BCHTSERV("D",X,0))
  1. I Y="" S BCHERR=1,BCHERR("ERROR")="Invalid service code passed "_X Q
  1. S BCHSRV=Y
  1. Q
  1. ERRF ;
  1. ;;1101;;S X=$G(BHL("OBR",1,7))
  1. ;;1102;;S X=$G(BHL("ZHR",1,2))
  1. ;;1103;;S X=$P($G(BHL("OBR",1,32)),U,2)
  1. ;;1104;;S X=$P($G(BHL("PID",1,5)),U,1)_","_$P($G(BHL("PID",1,5)),U,2)
  1. ;;1105;;S X=$TR($G(BHL("PID",1,3)),U,"~")
  1. ;;1106;;S X=$G(BHL("PID",1,8))
  1. ;;1107;;S X=$G(BHL("PID",1,9))
  1. ;;1108;;S X=$TR($G(BHL("ZP2",1,15)),"^","~")
  1. ;;1109;;S X=$TR($G(BHL("ZHR",1,2)),"^","~")
  1. ;;1110;;S X=$TR($G(BHL("PID",1,19)),"^","~")
  1. ;;1111;;S X=$TR($G(BHL("ZHR",1,3)),"^","~")
  1. ;;1301;;S X=$TR($G(BHL("ZHR",1,32)),"^","~")
  1. ;;