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

CIAZPLCH.m

Go to the documentation of this file.
  1. CIAZPLCH ;CIA/PLS - PCC Hook for Lab- Chem data ;23-Apr-2004 11:11;PLS
  1. ;;1.1;VUECENTRIC RPMS SUPPORT;;Sep 14, 2004
  1. ;;Copyright 2000-2004, Clinical Informatics Associates, Inc.
  1. ;=================================================================
  1. EN(DATA) N MSG
  1. I $D(DATA)=1 M MSG=@DATA
  1. E M MSG=DATA
  1. D LOG(.MSG)
  1. ;I $$QUEUE^CIAUTSK("TASK^CIAZPLCH","PCC VLAB FILER",,"MSG(")
  1. D TASK
  1. Q
  1. ; Log data
  1. LOG(ARY,NMSP) ;
  1. S NMSP="CIAZPLCH"_$S($G(NMSP)="":"",1:"."_NMSP)
  1. L +^XTMP(NMSP):2
  1. M ^($O(^XTMP(NMSP,""),-1)+1)=ARY
  1. L -^XTMP(NMSP)
  1. Q
  1. TASK N SEG,LP,DL1,DL2,OIEN,ORD,ACC,STATUS,DFN,DAT,LOC,ERR,PCC,VSIT
  1. N CAT,CONTROL,LABORD,PRV,ODT,CDT,VLAB,SPEC,VSTAT,CPTP,CPTCODE
  1. N DAT,ACT,LOINC,DIAG,LODT,LSEQ
  1. S LP=0
  1. S SEG=$$SEG("MSH",.LP)
  1. Q:'LP
  1. S DL1=$E(SEG,4),DL2=$E(SEG,5)
  1. Q:$P(SEG,DL1,3)'="LABORATORY"
  1. S SEG=$$SEG("PID",.LP)
  1. Q:'LP
  1. S DFN=+$P(SEG,DL1,4)
  1. Q:'DFN
  1. S SEG=$$SEG("PV1",.LP)
  1. Q:'LP
  1. S LOC=+$P($P(SEG,DL1,4),DL2)
  1. S CAT=$S($P(SEG,DL1,3)="I":"I",1:"A")
  1. S SEG=$$SEG("ORC",.LP)
  1. Q:'LP
  1. S STATUS=$P(SEG,DL1,6) ; Order status
  1. S OIEN=$P($P(SEG,DL1,3),DL2) ; OE/RR order number
  1. Q:'OIEN ; Must have an OE/RR order number
  1. S LABORDF=$P($P(SEG,DL1,4),DL2) ; Lab order information
  1. S LABORD=$P(LABORDF,";") ; Lab order number w/File 69 ref
  1. S LODT=$P(LABORDF,";",2) ; Lab order date
  1. S LSEQ=$P(LABORDF,";",3) ; Lab order seq number
  1. S CONTROL=$P(SEG,DL1,2)
  1. S PRV=+$P(SEG,DL1,13) ; Ordering Provider
  1. S ODT=$$FMDATE^LR7OU0($P(SEG,DL1,16)) ; Order effective Date/Time
  1. S CMPDT=$$FMDATE^LR7OU0($P($P(SEG,DL1,8),U,5)) ; Complete Date/Time
  1. ;
  1. I CONTROL?2U,$L($T(@CONTROL)) D @CONTROL
  1. Q
  1. SN ; New Order
  1. ; Currently not used
  1. Q
  1. SC ; Status Change
  1. N DAT,LP1,TSTARY,VSIT,ERR,TST,FLN,SUB,LOINC
  1. N RES,AFLG,ORG,ATB,COLSPL,CMPDT,UNITS,RLOW,RHIGH,ORG,ATB
  1. N CMPDT
  1. S SEG=$$SEG("OBR",.LP)
  1. Q:'LP
  1. S TST=+$P($P(SEG,DL1,5),DL2,4) ; Primary test
  1. S CDT=$$FMDATE^LR7OU0($P(SEG,DL1,8)) ; Collection Date/Time
  1. S SPEC=$P($P($P(SEG,DL1,16),DL2,4),";") ;Specimen pointer to File 61
  1. S COLSPL=$P($P(SEG,DL1,16),";",4) ; Collection Sample to File 62
  1. S ACC=$P(SEG,DL1,21) ; Accession Number
  1. S VSTAT="A" ; V File Status
  1. S TCST=$$GET1^DIQ(60,TST,1,"E") ; Test cost
  1. S SUB=$$GET1^DIQ(60,TST,4,"I") ; Subscript
  1. S LOINC=$$LOINC(TST,SPEC) ; LOINC Code associated with test/specimen
  1. S (UNITS,RLOW,RHIGH,ORG,ATB)=""
  1. S FLN=$S(SUB="MI":.25,SUB="BB":.31,1:.09) ; V File based on Subscript
  1. D GETCPT(TST,ODT,.DAT)
  1. S CPTP=$G(DAT("CPTPTR"))
  1. S CPTCODE=$G(DAT("CPTCODES"))
  1. S ACT="LR"_$S(SUB="MI":"M",SUB="BB":"B",1:"C")_"+"
  1. S (RES,AFLG,ORG,ATB,CMPDT)=""
  1. D ADD("HDR^^^"_LOC_";"_ODT_";"_CAT_";")
  1. D ADD("VST^PT^"_DFN)
  1. D ADD("VST^DT^"_ODT)
  1. ;D ADD("PRV^"_PRV_"^^^^1") ;V Lab doesn't appear to set V Provider
  1. D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV_U_TCST_U_SPEC_U_COLSPL)
  1. D GETCOM(.DAT)
  1. D:$D(DAT(1)) ADD("COM^1^"_DAT(1))
  1. D:$D(DAT(2)) ADD("COM^2^"_DAT(2))
  1. D:$D(DAT(3)) ADD("COM^3^"_DAT(3))
  1. ; Add Panel Tests - returns expanded panel plus original test
  1. D EXPAND^LR7OU1(TST,.TSTARY)
  1. I $D(TSTARY) D
  1. .K TSTARY(TST) ; remove original test
  1. .S TST="" F S TST=$O(TSTARY(TST)) Q:TST="" D
  1. ..S FLN=$S($$GET1^DIQ(60,TST,4,"I")="MI":.25,SUB="BB":.31,1:.09) ; V File based on Subscript
  1. ..S TCST=$$GET1^DIQ(60,TST,1,"E") ; Test Cost
  1. ..D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV_U_TCST_U_SPEC_U_COLSPL)
  1. D SAVE
  1. Q
  1. ;
  1. RE ; Result Message
  1. N DAT,LP1,TSTARY,VSIT,ERR,TST,FLN,RLOW,RHIGH
  1. N RES,AFLG,ORG,ATB,COLSPL,SUB,SPEC,RESDT
  1. Q:$$FINDNODE(.MSG,"OBX")<0 ; Result message without OBX segment
  1. S SEG=$$SEG("OBR",.LP)
  1. Q:'LP
  1. S TST=+$P($P(SEG,DL1,5),DL2,4) ; Primary test
  1. S CDT=$$FMDATE^LR7OU0($P(SEG,DL1,8)) ; Collection Date/Time
  1. S SPEC=$P($P($P(SEG,DL1,16),DL2,4),";") ; Specimen pointer to File 61
  1. S COLSPL=$P($P(SEG,DL1,16),";",4) ; Collection Sample to File 62
  1. S ACC=$P(SEG,DL1,21) ; Accession Number
  1. S VSTAT="R" ; V File Status
  1. S SUB=$$GET1^DIQ(60,TST,4,"I")
  1. S FLN=$S(SUB="MI":.25,SUB="BB":.31,1:.09) ; V File based on Subscript
  1. S ACT="LR"_$S(SUB="MI":"M",SUB="BB":"B",1:"C")
  1. S (TCST,RES,AFLG,UNITS,RLOW,RHIGH,ORG,ATB)=""
  1. D ADD("HDR^^^"_LOC_";"_ODT_";"_CAT_";")
  1. D ADD("VST^PT^"_DFN)
  1. D ADD("VST^DT^"_ODT)
  1. D GETCOM(.DAT)
  1. D:$D(DAT(1)) ADD("COM^1^"_DAT(1))
  1. D:$D(DAT(2)) ADD("COM^2^"_DAT(2))
  1. D:$D(DAT(3)) ADD("COM^3^"_DAT(3))
  1. ; Save OBR data
  1. I ACT["LRM" D ; Process Micro Results
  1. .D RE^CIAZPLMI
  1. E D
  1. .D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV_U_TCST_U_SPEC_U_COLSPL_U_RES_U_CMPDT)
  1. .F S SEG=$$SEG("OBX",.LP) Q:'LP D
  1. ..S TST=+$P($P(SEG,DL1,4),U,4) Q:'TST
  1. ..S RES=$P(SEG,DL1,6)
  1. ..S UNITS=$P(SEG,DL1,7)
  1. ..S AFLG=$P(SEG,DL1,9)
  1. ..S RLOW=$$FREFRNG("L",TST,SPEC)
  1. ..S RHIGH=$$FREFRNG("H",TST,SPEC)
  1. ..D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV_U_TCST_U_SPEC_U_COLSPL_U_RES_U_CMPDT_U_AFLG_U_UNITS_U_RLOW_U_RHIGH_U_ORG_U_ATB)
  1. D SAVE
  1. Q
  1. ; Order Cancel message
  1. OC ;
  1. N DAT,LP1,TSTARY,VSIT,ERR,TST,FLN,SUB,COLSPL
  1. S SEG=$$SEG("OBR",.LP)
  1. Q:'LP
  1. S TST=+$P($P(SEG,DL1,5),DL2,4) ; Primary test
  1. S ACC=$P(SEG,DL1,21) ; Accession Number
  1. S VSTAT="D" ; V File Status
  1. S SUB=$$GET1^DIQ(60,TST,4,"I") ; Subscript
  1. S (TCST,UNITS,RLOW,RHIGH,ORG,ATB,COLSPL,CDT)=""
  1. S FLN=$S(SUB="MI":.25,SUB="BB":.31,1:.09) ; V File based on Subscript
  1. S ACT="LR"_$S(SUB="MI":"M",SUB="BB":"B",1:"C")_"-"
  1. D ADD("HDR^^^"_LOC_";"_ODT_";"_CAT_";")
  1. D ADD("VST^PT^"_DFN)
  1. D ADD("VST^DT^"_ODT)
  1. D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV)
  1. ; Add Panel Tests - returns expanded panel plus original test
  1. D EXPAND^LR7OU1(TST,.TSTARY)
  1. I $D(TSTARY) D
  1. .K TSTARY(TST) ; remove original test
  1. .S TST="" F S TST=$O(TSTARY(TST)) Q:TST="" D
  1. ..S FLN=$S($$GET1^DIQ(60,TST,4,"I")="MI":.25,SUB="BB":.31,1:.09) ; V File based on Subscript
  1. ..D ADD(ACT_U_TST_U_FLN_U_VSTAT_U_ACC_U_LABORDF_U_ODT_U_CDT_U_PRV)
  1. D SAVE
  1. ;
  1. SAVE L +^CIAZPLCH(OIEN):30
  1. I D
  1. .D SAVE^CIAVCXPC(.ERR,.PCC)
  1. .L -^CIAZPLCH(OIEN)
  1. E S ERR="-1^Timeout while trying to lock record."
  1. D:ERR BUL
  1. Q
  1. ; Add to PCC array
  1. ADD(X,Y) ;
  1. I +$G(Y) D
  1. .S PCC(Y)=X
  1. E S PCC=$G(PCC)+1,PCC(PCC)=X
  1. Q
  1. ; Find a node in PCC array
  1. FINDNODE(ARY,VAL) ;
  1. N LP
  1. S LP=0 F S LP=$O(ARY(LP)) Q:'LP Q:$E(ARY(LP),1,$L(VAL))=VAL
  1. Q $S(LP:LP,1:-1)
  1. ; Return reference range for given test and specimen
  1. FREFRNG(TYPE,TST,SPEC) ;
  1. N AGE,SEX,SNODE,VAL
  1. S TYPE=$G(TYPE,"L")
  1. S AGE=$$GET1^DIQ(2,DFN,.033,"E")
  1. S SEX=$$GET1^DIQ(2,DFN,.02,"I")
  1. S SNODE=$G(^LAB(60,TST,1,SPEC,0))
  1. I $L(SNODE) D
  1. .S VAL=$P(SNODE,U,$S(TYPE="H":3,1:2))
  1. .X:VAL'?.N!(VAL'="") "S VAL="_VAL
  1. Q VAL
  1. ; Return specified segment, starting at line LP
  1. SEG(TYP,LP) ;
  1. F S LP=$O(MSG(LP)) Q:'LP Q:$E(MSG(LP),1,$L(TYP))=TYP
  1. Q $S(LP:MSG(LP),1:"")
  1. ; Send a bulletin on error
  1. BUL N XMB,XMTEXT,XMY,XMDUZ,XMDT,XMYBLOB,XMZ
  1. S XMB="APCD PCC PACKAGE LINK FAIL"
  1. S XMB(1)=OIEN
  1. S XMB(2)=$P($G(^DPT(DFN,0)),U)
  1. S XMB(3)=LABORD
  1. S XMB(4)=$$FMTE^XLFDT(ODT)
  1. S XMB(5)=$P(ERR,U,2)
  1. S XMDUZ=.5
  1. D ^XMB
  1. Q
  1. ; Return CPT code for given test
  1. GETCPT(TST,ODTM,DAT) ;
  1. ;Input: TST - pointer to File 60
  1. ; ODTM - Order Date/Time
  1. N PTST,FND,LP,CPTP,CPCODE,CPCOST,CPRC,CPAC
  1. N CPDAT,MOD,QUAL,CPTCODES
  1. S FND=0,PTST=0,(MOD,QUAL,CPTCODES)=""
  1. K DAT
  1. F S PTST=$O(^BLRCPT("C",TST,PTST)) Q:'PTST!FND D
  1. .Q:$$GET1^DIQ(9009021,PTST,102,"I") ; Inactive Flag
  1. .Q:ODTM<$$GET1^DIQ(9009021,PTST,.03,"I") ; Order Date>Create Date
  1. .D GETCPT1
  1. .S DAT("CPTPTR")=PTST
  1. .S DAT("CPTCODES")=CPTCODES
  1. Q
  1. GETCPT1 ;
  1. S FND=1
  1. S CPTP=0 F S CPTP=$O(^BLRCPT(PTST,11,CPTP)) Q:'CPTP D
  1. .S CPDAT=$G(^BLRCPT(PTST,11,CPTP,0))
  1. .S CPCODE=$P(CPDAT,U),CPCOST=$P(CPDAT,U,2),CPRC=$P(CPDAT,U,3),CPAC=$P(CPDAT,U,4)
  1. .S LP=0 F S LP=$O(^BLRCPT(PTST,11,CPTP,1,LP)) Q:'LP D
  1. ..S MOD=MOD_^BLRCPT(PTST,11,CPTP,1,LP,0)_","
  1. .S:$E(MOD,$L(MOD))="," MOD=$E(MOD,1,$L(MOD)-1)
  1. .S LP=0 F S LP=$O(^BLRCPT(PTST,11,CPTP,2,LP)) Q:'LP D
  1. ..S QUAL=QUAL_^BLRCPT(PTST,11,CPTP,2,LP,0)_","
  1. .S:$E(QUAL,$L(QUAL))="," QUAL=$E(QUAL,1,$L(QUAL)-1)
  1. .S CPTCODES=CPTCODES_CPCODE_DL1_CPCOST_DL1_CPRC_DL1_CPAC_DL1_MOD_DL1_QUAL_";"
  1. S:$E(CPTCODES,$L(CPTCODES))=";" CPTCODES=$E(CPTCODES,1,$L(CPTCODES)-1)
  1. Q
  1. ; Return comments
  1. GETCOM(ARY) ;
  1. N CNT,LP
  1. K ARY
  1. S CNT=0,LP=0
  1. F S LP=$O(MSG(LP),-1) Q:'LP I $E(MSG(LP),1,3)="NTE" D
  1. .S CNT=CNT+1,ARY(CNT)=$P(MSG(LP),DL1,4)
  1. Q
  1. ; Return LOINC code
  1. ; Input: TST - Laboratory Test File IEN
  1. ; SPEC - Site/Specimen IEN
  1. LOINC(TST,SPEC) ;
  1. Q $$GET1^DIQ(60.01,SPEC_","_TST_",",95.3,"I")
  1. ; Return Diagnosis stored in Lab Order File
  1. ; Input: TST - Laboratory Test File IEN
  1. ; ODT - Lab Order File Date
  1. ; SEQ - Lab Order File Date Sequence number
  1. DIAG(TST,ODT,SEQ) ;
  1. N TIEN
  1. S TIEN=$O(^LRO(69,ODT,1,SEQ,2,"B",TST,""))
  1. Q $$GET1^DIQ(69.03,TIEN_","_SEQ_","_ODT_",",9999999.1)