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

BMXRPC10.m

Go to the documentation of this file.
  1. BMXRPC10 ; IHS/OIT/GIS - RPC CALL FOR EXTENDED BROKER FUNCTIONALITY ; 08 Jun 2010 8:47 AM
  1. ;;4.0;BMX;**1,4**;JUN 28, 2010;Build 4
  1. ;; LOGIN RPCS TO RETURN PATIENTS, VISITS AND FACILITIES. SUPPORTS MULTI-INDEX PATIENT LOOKUP (DOB, NAME, CHART#, ETC)
  1. ;
  1. GETFCRS(BMXFACS,BMXDUZ) ; EP - Gets all facilities for a user - returns RECORDSET
  1. ;
  1. ;S BMXFACS="T00030FACILITY_NAME^T00030FACILITY_IEN^T00002MOST_RECENT_LOOKUP"_$C(30)
  1. N BMXI
  1. S BMXI=0,BMXFACS=$NA(^TMP("BMX FIND",$J)) K @BMXFACS
  1. S ^TMP("BMX FIND",$J,0)="T00030FACILITY_NAME^T00030FACILITY_IEN^T00002MOST_RECENT_LOOKUP"_$C(30)
  1. I $G(BMXDUZ)="" G XFRCS
  1. N BMXFN,BMXN,BMXSUB,BMXRCNT,CREF,OREF,SITE,LAST,DFLT
  1. S BMXDUZ=$TR(BMXDUZ,$C(13),"")
  1. S BMXDUZ=$TR(BMXDUZ,$C(10),"")
  1. S BMXDUZ=$TR(BMXDUZ,$C(9),"")
  1. S BMXFN=0
  1. S CREF=$NA(^VA(200,BMXDUZ,2))
  1. I '$O(@CREF@(0)) D G XFRCS ; GIS/OIT JAN 22, 2010 ; Ensure at least one site returned
  1. . S BMXFN=$P(^AUTTSITE(1,0),U,1)
  1. . S SITE=$P($G(^DIC(4,BMXFN,0)),U,1)
  1. . S DFLT=0
  1. . S BMXI=BMXI+1
  1. . S ^TMP("BMX FIND",$J,BMXI)=SITE_U_BMXFN_U_DFLT_$C(30)
  1. . Q
  1. S OREF="^VA(200,"_BMXDUZ_",2,"
  1. S LAST=$G(^DISV(BMXDUZ,OREF))
  1. I LAST="" D
  1. . S BMXFN=0
  1. . F Q:LAST S BMXFN=$O(VA(200,BMXDUZ,2,BMXFN)) Q:'BMXFN D I LAST Q
  1. .. I $P($G(^VA(200,BMXDUZ,2,BMXFN,0)),U,2) S LAST=BMXFN
  1. .. Q
  1. . Q
  1. I LAST="" S LAST=$O(^VA(200,BMXDUZ,2,0)) ; IF LAST UNDEFINED, DEFAULT TO 1 ENTRY FOR THAT USER IN THE DIVISION SUBFILE
  1. I LAST="" S LAST=$P($G(^XTV(8989.3,1,"XUS")),U,17) ; IF LAST UNDEFINED, GET VALUE FROM KERNEL SYSTEM PARAMETERS FILE
  1. S BMXFN=0,STG=""
  1. F S BMXFN=$O(@CREF@(BMXFN)) Q:'BMXFN D
  1. . S SITE=$P($G(^DIC(4,BMXFN,0)),U,1) I SITE="" Q
  1. . S DFLT=(LAST=BMXFN)
  1. . S BMXI=BMXI+1
  1. . S ^TMP("BMX FIND",$J,BMXI)=SITE_U_BMXFN_U_DFLT_$C(30)
  1. . Q
  1. XFRCS S BMXI=BMXI+1
  1. S ^TMP("BMX FIND",$J,BMXI)=$C(31)
  1. Q
  1. ;
  1. GETVIS(OUT,STG) ; EP - RETURN SPECIFIED # OF VALID VISITS FOR THE PATIENT
  1. S OUT="T00010VISIT_IEN^T00030PATIENT_IEN^T00021TIMESTAMP^T00030VISIT_TYPE^T00030LOCATION^T00010SERVICE CATEGORY^T00030CLINIC^T00030PRIMARY_PROVIDER^T00030PRIMARY_POV"_$C(30)
  1. I $L($G(STG))
  1. E G VOUT
  1. N X,Y,Z,%,HDR,LINE,DFN,MAX,IDT,VIEN,CNT,STOP,TS,VIEN,TYPE,LOC,SCAT,CLIN,PPRV,PPOV,BDT,VDT,DATA
  1. S DFN=+STG I '$D(^DPT(DFN,0)) G VOUT
  1. S MAX=$P(STG,"|",2) I 'MAX S MAX=9
  1. I '$O(^AUPNVSIT("AA",+$G(DFN),0)) G VOUT
  1. S IDT=0,CNT=0,STOP=0,DATA=""
  1. S BDT=$$FMADD^XLFDT(DT,-2)
  1. F Q:STOP S IDT=$O(^AUPNVSIT("AA",DFN,IDT)) Q:'IDT S VIEN=999999999999 F Q:STOP S VIEN=$O(^AUPNVSIT("AA",DFN,IDT,VIEN),-1) Q:'VIEN D Q
  1. . S X=$G(^AUPNVSIT(VIEN,0)) I '$L(X) Q ; VISIT DATA MUST EXIST
  1. . S VDT=+X I 'VDT Q
  1. . I $P(X,U,11) Q ; MUST BE AN 'ACTIVE' VISIT - NOT 'DELETED'
  1. . I $P(X,U,5)'=DFN Q ; INVALID PATIENT IEN
  1. . I $P(X,U,3)="" Q ; VISIT MUST HAVE A TYPE
  1. . I '$P(X,U,6) Q ; MUST HAVE A VALID ENCOUNTER LOCATION
  1. . I $P(X,U,7)="" Q ; VISIT MUST HAVE A CATEGORY
  1. . I $P(X,U,8)="" Q ; VISIT MUST HAVE A VALID CLINIC STOP
  1. . I VDT<BDT,'$D(^AUPNVPOV("AD",VIEN)) Q ; MUST HAVE A POV ; PATCHED BY GIS 4/27/2009
  1. . I VDT<BDT,'$D(^AUPNVPRV("AD",VIEN)) Q ; MUST HAVE A PROVIDER
  1. . D VIS(VIEN,DFN,.DATA)
  1. . S CNT=CNT+1
  1. . I CNT=MAX S STOP=1
  1. . Q
  1. VOUT S OUT=OUT_$G(DATA)_$C(31)
  1. Q
  1. ;
  1. VIS(VIEN,DFN,DATA) ; EP - APPEND VISIT DATA STRING
  1. I $G(VIEN),$G(DFN)
  1. E Q
  1. N TYPE,LOC,SCAT,CLIN,PPRV,PPOV,VDT,FIEN,IENS,FLD,TYPE
  1. S FIEN=9000010,IENS=VIEN_","
  1. S TS=$$GET1^DIQ(FIEN,IENS,.01) I TS="" Q
  1. S TYPE=$$GET1^DIQ(FIEN,IENS,.03)
  1. S LOC=$$GET1^DIQ(FIEN,IENS,.06)
  1. S SCAT=$$GET1^DIQ(FIEN,IENS,.07)
  1. S CLIN=$$GET1^DIQ(FIEN,IENS,.08)
  1. S PPRV=$$PPRV(VIEN)
  1. S PPOV=$$PPOV(VIEN)
  1. S DATA=DATA_VIEN_U_DFN_U_TS_U_LOC_U_SCAT_U_CLIN_U_PPRV_U_PPOV_$C(30)
  1. Q
  1. ;
  1. PPRV(VIEN) ; EP - GIVEN A VISIT IEN, RETURN THE PRIMARY PROVIDER NAME
  1. ; CALLED BY THE BMX SCHEMA
  1. I '$D(^AUPNVPRV("AD",+$G(VIEN))) Q ""
  1. N NAME,PIEN,VPIEN,X,Y,Z,%
  1. S VPIEN=0,PIEN=""
  1. F S VPIEN=$O(^AUPNVPRV("AD",VIEN,VPIEN)) Q:'VPIEN D I PIEN Q
  1. . S X=$G(^AUPNVPRV(VPIEN,0)) I X="" Q
  1. . S TYPE=$P(X,U,4)
  1. . I TYPE="P" S PIEN=+X
  1. . Q
  1. I 'PIEN S VPIEN=$O(^AUPNVPRV("AD",VIEN,0)) I VPIEN S PIEN=+$G(^AUPNVPRV(VPIEN,0))
  1. I 'PIEN Q ""
  1. S PIEN=$$PRV^VENPCCU(PIEN)
  1. S NAME=$P($G(^VA(200,PIEN,0)),U)
  1. Q NAME
  1. ;
  1. PPOV(VIEN) ; EP - GIVEN A VISIT IEN, RETURN THE PRIMARY PURPOSE OF VISIT ICD CODE (NARRATIVE)
  1. ; CALLED BY BMX SCHEMA
  1. I '$D(^AUPNVPOV("AD",+$G(VIEN))) Q ""
  1. N TXT,IIEN,VPIEN,X,Y,Z,%,ICD,NIEN,DX,VDT
  1. S VPIEN=0,IIEN=""
  1. F S VPIEN=$O(^AUPNVPOV("AD",VIEN,VPIEN)) Q:'VPIEN D I IIEN Q
  1. . S X=$G(^AUPNVPOV(VPIEN,0)) I X="" Q
  1. . S TYPE=$P(X,U,12)
  1. . I TYPE="P" S IIEN=+X
  1. . Q
  1. I 'IIEN S VPIEN=$O(^AUPNVPOV("AD",VIEN,0)) I VPIEN S IIEN=+$G(^AUPNVPOV(VPIEN,0))
  1. I IIEN,VPIEN
  1. E Q ""
  1. ;
  1. ;Pull visit date/time
  1. S VDT=$$GET1^DIQ(9000010,VIEN_",",.01,"I")
  1. ;
  1. ;Pull appropriate ICD-9/ICD-10 code
  1. ;
  1. ;ICD-9 or ICD-10
  1. I $$VERSION^XPDUTL("AICD")>3.51 D
  1. . NEW STR
  1. . ;
  1. . ;First try to locate ICD-10
  1. . I $$IMP^ICDEXA(30)'>VDT D Q:ICD]""
  1. .. S STR=$$ICDDATA^ICDXCODE(30,IIEN,VDT,"I")
  1. .. S ICD=$S($P(STR,"^")<0:"",1:$P(STR,"^",2))
  1. . ;
  1. . ;If not an ICD-10 code try ICD-9 (could be before date or a historical entry)
  1. . I $G(ICD)="" D
  1. .. S STR=$$ICDDATA^ICDXCODE(1,IIEN,VDT,"I")
  1. .. S ICD=$S($P(STR,"^")<0:"",1:$P(STR,"^",2))
  1. ;
  1. I '$L(ICD) Q ""
  1. S TXT=$$GET1^DIQ(9000010.07,VPIEN_",",.04,"E")
  1. I $L(TXT)>20 S TXT=$E(TXT,1,17)_"..."
  1. S DX=ICD_" ("_TXT_")"
  1. Q DX
  1. ;
  1. GETPAT(BMXRET,BMXSTR) ; EP - -- return patient in ADO table
  1. ; S X="MERR^BMXGU",@^%ZOSF("TRAP") ; m error trap
  1. N BMXI,BMXERR,BMXUIEN,P,X,Y,Z,%,%DT
  1. S P="|"
  1. K ^BMXTMP($J)
  1. S BMXI=0
  1. S BMXERR=""
  1. S BMXRET="T00010IEN^T00030PATIENTNAME^T00015DOB^T00001SEX^T00007CHART^T00009SSN^T00010REG^T00030LASTUPDATE^T00030CLASSBEN^T00010AGE"_$C(30)
  1. S BMXPAT=$P(BMXSTR,P,1)
  1. S BMXMT=$P(BMXSTR,P,2)
  1. ; S BMXNPAT=$P(BMXSTR,P,4)
  1. I BMXMT="ALL"!(BMXMT="") S BMXMT=9999999
  1. S BMXMT=(BMXMT-1)
  1. S BMXPIEN=""
  1. S X=BMXPAT D ^%DT
  1. S Y=Y\1
  1. I $E(Y,4,5)="00" G GETADO
  1. I $E(Y,6,7)="00" G GETADO
  1. I Y?7N D G GETADO
  1. . S BMXPAT=Y
  1. . S BMXPATE=$$PATDOB(.BMXPIEN,BMXPAT)
  1. S X=$TR($P(BMXPAT," "),",","")
  1. I X?1.30U S BMXPATE=$$PATNAM(.BMXPIEN,BMXPAT,"") G GETADO
  1. I BMXPAT?9N D G GETADO
  1. . S BMXPIEN=$$PATSSN(BMXPAT)
  1. I BMXPAT?1.6N D G GETADO
  1. . S BMXPIEN=$$PATCHT(.BMXPIEN,BMXPAT)
  1. GETADO I $G(BMXPIEN),'$G(BMXPATS) D PATADO(.BMXPIEN)
  1. S BMXRET=BMXRET_$C(31)_$G(BMXERR)
  1. K BMXPAT,BMXPIEN,BMXCNT,BMXDA,BMXIEN,BMXPATE,BMXNM,BMXDB,BMXSX,BMXCT,BMXSSN
  1. K BMXPATS
  1. Q
  1. ;
  1. PATSSN(PAT) ;-- look up by ssn
  1. S BMXPIEN=$O(^DPT("SSN",PAT,0))
  1. S BMXPIEN(1)=BMXPIEN
  1. Q $G(BMXPIEN)
  1. ;
  1. PATCHT(BMXPIEN,HRN) ;-- lookup by chart
  1. N BMXCNT,BMXMCNT
  1. S BMXCNT=0,BMXPATE=0,BMXMCNT=0,BMXPIEN=""
  1. S BMXIEN=0 F S BMXIEN=$O(^AUPNPAT("D",HRN,BMXIEN)) Q:'BMXIEN D I BMXPIEN Q
  1. . I '$D(^AUPNPAT("D",HRN,BMXIEN,DUZ(2))) Q
  1. . S %=$O(^AUPNPAT("D",HRN,BMXIEN)) I %,$D(^AUPNPAT("D",HRN,%,DUZ(2))) S BMXIEN=999999999 Q ; MORE THAN ONE PAT WITH THIS CHART NUMBER!
  1. . S BMXPIEN=BMXIEN
  1. . S BMXCNT=BMXCNT+1
  1. . S:'$D(BMXPIEN(BMXCNT)) BMXPIEN(BMXCNT)=0
  1. . S BMXPIEN(BMXCNT)=BMXPIEN
  1. . Q
  1. Q BMXPIEN
  1. ;
  1. PATDOB(BMXPATE,PAT) ;-- lookup by DOB
  1. N BMXCNT
  1. S BMXCNT=0,BMXPATE=0
  1. S BMXIEN=0
  1. F S BMXIEN=$O(^DPT("ADOB",PAT,BMXIEN)) Q:'BMXIEN D
  1. . S:'$D(BMXPATE(BMXCNT)) BMXPATE(BMXCNT)=0
  1. . S BMXCNT=BMXCNT+1,BMXPATE=1
  1. . S BMXPATE(BMXCNT)=BMXIEN
  1. . Q
  1. S BMXPATE=BMXCNT
  1. Q $G(BMXPATE)
  1. ;
  1. PATNAM(BMXPATE,PAT,NPAT) ;lookup by name
  1. S BMXCNT=0,BMXPATE=0
  1. N BMXLEN
  1. S BMXLEN=$L(PAT)
  1. S BMXNAM=PAT
  1. S BMXNAM=$$BEGIN(PAT)
  1. I $G(NPAT)]"" S BMXNAM=NPAT
  1. F S BMXNAM=$O(^DPT("B",BMXNAM)) Q:BMXNAM=""!($E(BMXNAM,1,BMXLEN)'=PAT)!(BMXCNT>BMXMT) D
  1. . S BMXIEN=0 F S BMXIEN=$O(^DPT("B",BMXNAM,BMXIEN)) Q:'BMXIEN D
  1. .. Q:$O(^DPT("B",BMXNAM,BMXIEN,0)) ;cmi/maw 4/25/2005 don't get aliases
  1. .. S BMXCNT=BMXCNT+1
  1. .. S:'$D(BMXPATE(BMXCNT)) BMXPATE(BMXCNT)=0
  1. .. S BMXPATE(BMXCNT)=BMXIEN
  1. S BMXPATE=BMXCNT
  1. Q $G(BMXPATE)
  1. ;
  1. BEGIN(PT) ;-- get begin point
  1. N BMXPDA,BMXPIEN,BMXPCNT
  1. S BMXPCNT=0
  1. S BMXPDA=PT
  1. I $O(^DPT("B",BMXPDA,0)) D
  1. . S BMXPDA=$O(^DPT("B",BMXPDA),-1)
  1. F S BMXPDA=$O(^DPT("B",BMXPDA)) Q
  1. I $G(BMXPDA)="" Q ""
  1. Q $O(^DPT("B",BMXPDA),-1)
  1. ;
  1. PATADO(PIEN) ;-- ado return
  1. NEW BMXCNTR,BMXELG
  1. I '$G(DUZ(2)) Q ; DIVISION
  1. S BMXCNTR=0
  1. S BMXDA=0 F S BMXDA=$O(PIEN(BMXDA)) Q:'BMXDA D
  1. . NEW BMXAGE
  1. . S BMXCNTR=BMXCNTR+1
  1. . S BMXPI=$G(PIEN(BMXDA))
  1. . I '$D(^AUPNPAT(BMXPI,41,DUZ(2),0)) Q ; PATIENT NOT REGISTERED IN THE CURRENT DIVISION
  1. . S BMXNM=$P($G(^DPT(BMXPI,0)),U)
  1. . S BMXDB=$$FMTE^XLFDT($P($G(^DPT(BMXPI,0)),U,3))
  1. . S BMXSX=$P($G(^DPT(BMXPI,0)),U,2)
  1. . S BMXCT=$$HRN^AUPNPAT(BMXPI,DUZ(2))
  1. . S BMXSSN=$P($G(^DPT(BMXPI,0)),U,9)
  1. . S BMXUPD=$P($G(^AUPNPAT(BMXPI,0)),U,3)
  1. . S BMXELG=$$GET1^DIQ(9000001,BMXPI,1111) ;cmi/maw 5/17/2007 added class/ben for status bar
  1. . S BMXAGE=$$AGE^AUPNPAT(BMXPI,DT)
  1. . S BMXI=BMXI+1
  1. . S BMXRET=BMXRET_BMXPI_U_BMXNM_U_BMXDB_U_BMXSX_U_BMXCT_U_BMXSSN_U_$G(BMXHD)_U_BMXUPD_U_BMXELG_U_BMXAGE_$C(30)
  1. Q
  1. ;
  1. BMXCCXT(RESULT,XOPTION) ;creates context for the passed in option
  1. N XWB1,%,IEN,SIEN,OK,OPTION
  1. S RESULT=0
  1. S OPTION=$$DECRYP^XUSRB1(XOPTION) ;S:OPTION="" OPTION="\"
  1. I $E(OPTION,1,3)="BMX" S RESULT=1 Q ; NO RESTRICTIONS FOR BMX CONTEXT FOR THIS PORT
  1. K XQY0,XQY
  1. I OPTION="" S XQY=0,XQY0="" Q ;delete context if "" passed in N PORT
  1. S PORT=+$P($P,"|",3) I 'PORT Q
  1. S IEN=$O(^BMXMON("B",PORT,0)) I 'IEN Q
  1. I '$O(^BMXMON(IEN,1,0)) G BC1 ; NO RESTRICTIONS ON CONTEXT FOR THIS PORT
  1. S OK=0,CIEN=0
  1. F S CIEN=$O(^BMXMON(IEN,1,CIEN)) Q:'CIEN D I OK Q
  1. . S %=$P($G(^BMXMON(IEN,1,CIEN,0)),U) I '% Q
  1. . S %=$P($G(^DIC(19,%,0)),U) I %="" Q
  1. . I %=OPTION S OK=1
  1. . Q
  1. I 'OK S (XWBSEC,RESULT)="The context '"_OPTION_"' is not registered with port "_PORT_"." Q
  1. BC1 S XWB1=$$OPTLK^XQCS(OPTION)
  1. I XWB1="" S (XWBSEC,RESULT)="The context '"_OPTION_"' does not exist on server." Q ;P10
  1. S RESULT=$$CHK^XQCS(DUZ,XWB1)
  1. ;Access or programmer
  1. BC2 I RESULT!$$KCHK^XUSRB("XUPROGMODE") S XQY0=OPTION,XQY=XWB1,RESULT=1 Q
  1. S XWBSEC=RESULT
  1. Q
  1. ;
  1. CVC(OUT,IN) ; EP - RPC: BMX CVC ; CHECK VERIFY CODE (SEE CVC^XUSRB)
  1. S OUT(0)=99,OUT(1)="INVALID PARAMETERS"
  1. I $L(IN)
  1. E Q
  1. N AV,EAC,EOVC,ENVC,USER,AC,OVC,NVC,EVC,NVC,X,Y,Z,%,RET,U
  1. S U="^",RET(0)="",RET(1)=""
  1. S AV=$$DECRYP^XUSRB1(IN) I AV="" Q
  1. S AC=$P(AV,";")
  1. S X=$$EN^XUSHSH(AC)
  1. S USER=$O(^VA(200,"A",X,0)) I 'USER Q
  1. S @$C(68,85,90)=USER
  1. S OVC=$P(AV,";",2) I OVC="" Q
  1. S NVC=$P(AV,";",3) I NVC="" Q
  1. S EOVC=$$ENCRYP^XUSRB1(OVC)
  1. S ENVC=$$ENCRYP^XUSRB1(NVC)
  1. D CVC^XUSRB(.RET,(ENVC_U_EOVC))
  1. M OUT=RET
  1. Q
  1. ;
  1. TEST ; TEST CVC
  1. N DUZ,IN
  1. S IN=$$ENCRYP^XUSRB1("GREG4330;IRA-1727;IRA-1727")
  1. D CVC^BMXRPC10(.OUT,IN) W !,$G(OUT(0))," - ",$G(OUT(1))
  1. Q
  1. ;
  1. MON ; EP - OPTION: BMX MONITOR VIEW
  1. N X,Y,Z,%,PORT,ARR,STAT,DESC,IEN,CNT
  1. W !!,"Checking BMX ports"
  1. S PORT=0
  1. F S PORT=$O(^BMXMON("B",PORT)) Q:'PORT D
  1. . S IEN=$O(^BMXMON("B",PORT,0)) I 'IEN Q
  1. . W "."
  1. . I '$P($G(^BMXMON(IEN,0)),U,2) S STAT="NOT ENABLED"
  1. . E D
  1. .. S STAT="RUNNING"
  1. .. I $$SEMAPHOR^BMXMON(PORT,"LOCK") S STAT="STOPPED" I $$SEMAPHOR^BMXMON(PORT,"UNLOCK")
  1. .. Q
  1. . S DESC=$G(^BMXMON(IEN,2))
  1. . S ARR(PORT)=STAT_"|"_DESC
  1. . Q
  1. I '$D(ARR) W !,"No BMX ports have been registered in this namespace",!! Q
  1. W !,"The following BMX ports have been registered in this namespace...",!
  1. S PORT=0,CNT=0
  1. F S PORT=$O(ARR(PORT)) Q:'PORT D
  1. . S CNT=CNT+1
  1. . I '(CNT#6) W "<Press ENTER to see more>" R %:$G(DTIME,60) W $C(13),?77,$C(13)
  1. . S %=ARR(PORT)
  1. . S STAT=$P(%,"|"),DESC=$P(%,"|",2)
  1. . W !?2,"Port: ",PORT,?15,"Status: ",STAT,!?2,"Description: ",DESC
  1. . W !
  1. . Q
  1. Q
  1. ;