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

APCD3M.m

Go to the documentation of this file.
  1. APCD3M ; IHS/CMI/LAB - PCC TO 3M CODER INTERFACE ;
  1. ;;2.0;IHS PCC SUITE;**2,11**;MAY 14, 2009;Build 58
  1. ;;2.0
  1. ;
  1. ; This routine processes inbound HL7 messages from the 3M Coder
  1. ; and generates outbound HL7 messages to send to the 3M Coder.
  1. ;
  1. ; The entry point IN is called by the HL7 package to process
  1. ; an inbound message from the 3M Coder. An entry is generated
  1. ; in file 9001001.9 for the specified visit which contains the
  1. ; ICD codes and provider narratives required to generate the
  1. ; appropriate V POV and V PROCEDURE entries for this visit.
  1. ;
  1. ; The entry point OUT is called to generate an HL7 message
  1. ; containing patient demographic and medical data required
  1. ; by the 3M Coder to assign ICD codes to V POV entries. The
  1. ; visit IEN is passed in APCDVSIT.
  1. ;
  1. ;cmi/anch/maw 10/11/2005 modified due to change in 3m structure
  1. ;cmi/anch/maw 12/2/2005 maw added clean of destination queue before sending
  1. ;cmi/anch/maw 3/6/2007 maw modified DISPCPT to screen off description
  1. ;cmi/anch/maw 3/6/2007 maw modified DISPICD to get if a V code
  1. ;cmi/tucson/lab 11/12/2007 code set versioning
  1. ;
  1. Q ;do not enter at top of routine
  1. ;
  1. IN ; EP - PROCESS HL7 MESSAGE FROM 3M CODER
  1. ;maw this is where the inbound stuff starts
  1. NEW APCD3COD,APCD3IEN,APCD3NAR,APCDQ,I,J,X,Y
  1. D INMAIN
  1. D EOJ
  1. Q
  1. ;
  1. INMAIN ; INBOUND MAINLINE LOGIC
  1. D INSTALL ; generate 9001001.9 entry
  1. Q
  1. ;
  1. INSTALL ; GENERATE 9001001.9 ENTRY
  1. F J=1:1 S X=$G(APCDHL7M(J)) Q:X="" D Q:$G(APCD3MER)
  1. . S Y=$P(X,"|") ; get segment
  1. . I Y="PV1" D IPV1 Q ; pv1 segment
  1. . I Y="DG1" D IDG1 Q ; dg1 segment
  1. . I Y="PR1" D IPR1 Q ; pr1 segment
  1. . I Y="DRG" D IDRG Q ; drg segment
  1. . Q
  1. Q
  1. ;
  1. IPV1 ; PV1 SEGMENT
  1. S X=$P(X,"|",20)
  1. I 'X S APCD3MER="200^No Visit IEN in Message" D ERR Q
  1. S DIC="^APCD3MV(",DIC(0)="L",DLAYGO=9001001.9,DIC("DR")=".02////"_UIF
  1. S DINUM=X
  1. D FILE
  1. I Y<0 S APCD3MER="100^Error adding message to 3M file" D ERR Q
  1. S APCD3IEN=+Y
  1. Q
  1. ;
  1. IDG1 ; DG1 SEGMENT
  1. S APCD3COD=$P($P(X,"|",4),U) ; get ICD9 code
  1. S APCD3TXT=$P($P(X,"|",4),U,2) ;icd desc
  1. S APCD3DTP=$P(X,"|",7) ;diagnosis type
  1. Q:$G(APCD3DTP)="A" ;don't file admit dx
  1. ;I $E(APCD3COD,1,1)="E" S APCDECOD=APCD3COD D Q
  1. ;. I APCDECOD'["." S APCDECOD=$E(APCDECOD,1,4)_"."_$E(APCDECOD,5,999)
  1. ;. D UPDCODE Q
  1. I $E(APCD3COD,1,1)="E" D
  1. . I APCD3COD'["." S APCD3COD=$E(APCD3COD,1,4)_"."_$E(APCD3COD,5,999)
  1. I $E(APCD3COD,1,1)'="E" D
  1. . I APCD3COD'["." S APCD3COD=$E(APCD3COD,1,3)_"."_$E(APCD3COD,4,999)
  1. I APCD3COD="" S APCD3MER="204^POV ICD9 code missing" Q
  1. S X=APCD3COD,DA(1)=APCD3IEN,DIC="^APCD3MV("_DA(1)_",11,",DIC(0)="L",DIC("P")=$P(^DD(9001001.9,1101,0),U,2)
  1. S DIC("DR")=".02///"_$G(APCD3TXT)
  1. D FILE
  1. I Y<0 S APCD3MER="210^Error adding POV to 3M file" D ERR Q
  1. S APCDDG1=+Y
  1. Q
  1. ;
  1. IPR1 ; PR1 SEGMENT
  1. S APCD3COD=$P($P(X,"|",4),U) ; get ICD9 code
  1. S APCD3TXT=$P($P(X,"|",4),U,2) ; cpt description
  1. S APCDCTP=$P($P(X,"|",4),U,3) ; get type of coding system
  1. S APCD3MOD=$P(X,"|",17) ; get modifier
  1. I APCD3COD="" S APCD3MER="208^PROC ICD9 code missing" Q
  1. I $G(APCDCTP)="CP" D ICPT Q ;goto cpt filer then quit
  1. I $G(APCDCTP)="H" D ICPT Q ;hcps codes
  1. I $E(APCD3COD,1)'?.N D ICPT Q ;non icd codes
  1. ;I $L(APCD3COD)>4 D ICPT Q ;cpt codes 10/25/2005 maw commented out
  1. I APCD3COD'["." S APCD3COD=$E(APCD3COD,1,2)_"."_$E(APCD3COD,3,999)
  1. S X=APCD3COD,DA(1)=APCD3IEN,DIC="^APCD3MV("_DA(1)_",12,",DIC(0)="L",DIC("P")=$P(^DD(9001001.9,1201,0),U,2)
  1. S DIC("DR")=".02///"_$G(APCD3TXT)
  1. D FILE
  1. I Y<0 S APCD3MER="211^Error adding Procedure to 3M file" D ERR Q
  1. S APCDPR1=+Y
  1. Q
  1. ;
  1. IDRG ;-- get the drg
  1. S APCD3DRG=$P(X,"|",2)
  1. I APCD3DRG'="" S APCD3DRG="DRG"_+APCD3DRG
  1. S DIE="^APCD3MV(",DA=APCD3IEN,DR=".03///"_APCD3DRG
  1. D ^DIE
  1. I $D(Y) S APCD3MER="220^Error adding DRG to 3M file" D ERR
  1. Q
  1. ;
  1. ICPT ;-- file cpt codes
  1. S X=APCD3COD_" - "_APCD3TXT ;file cpt and text
  1. S DA(1)=APCD3IEN,DIC="^APCD3MV("_DA(1)_",13,",DIC(0)="L",DIC("P")=$P(^DD(9001001.9,1301,0),U,2)
  1. I $G(APCD3MOD)?.N S DIC("DR")=".02////"_$G(APCD3MOD)
  1. D FILE
  1. Q
  1. ;
  1. DISPCPT ;-- display the cpt picklist for user
  1. S APCDDA=0 F I=1:1 S APCDDA=$O(^APCD3MV(APCDVSIT,13,APCDDA)) Q:'APCDDA D
  1. . S APCD3CPT=$P($G(^APCD3MV(APCDVSIT,13,APCDDA,0)),U)
  1. . S APCD3MOD=$P($G(^APCD3MV(APCDVSIT,13,APCDDA,0)),U,2)
  1. . W !,$G(I)_") Cpt: "_$G(APCD3CPT)_$S($G(APCD3MOD)'="":" Modifier: "_$G(APCD3MOD),1:"")
  1. . S APCDCPTA(I)=APCDDA_U_APCD3CPT_U_APCD3MOD
  1. Q:'$O(APCDCPTA(""))
  1. S APCDPCPT=""
  1. R !!,"Which CPT should I attach to this procedure: ",APCDRX:DTIME
  1. Q:APCDRX="^"
  1. Q:APCDRX=""
  1. I '$G(APCDCPTA(APCDRX)) W !,"Not a valid Selection, Try Again." G DISPCPT
  1. S APCDUCPT=$P($G(APCDCPTA(APCDRX)),U)
  1. ;S APCDPCPT=$P($G(APCDCPTA(APCDRX)),U,2) ;cmi/anch/maw 3/6/2007 orig line
  1. S APCDPCPT=+$P($G(APCDCPTA(APCDRX)),U,2) ;cmi/anch/maw 3/6/2007 modified
  1. S APCDPMOD=$P($G(APCDPMOD(APCDRX)),U,3)
  1. ;I $G(APCDPCPT)'="" S APCDPCPT=$O(^ICPT("B",APCDPCPT,0))
  1. I $G(APCDPCPT)'="" S APCDPCPT=$P($$CPT^ICPTCOD(APCDPCPT),U,1)
  1. I APCDPCPT=-1 S APCDPCPT=""
  1. I APCDPCPT'="" S APCDPCPT="`"_APCDPCPT
  1. I $G(APCDPMOD)'="" D
  1. .I $$VERSION^XPDUTL("BCSV")>0 S APCDPMOD=$O(^DIC(81.3,APCDPMOD,0)) Q
  1. .S APCDPMOD=$O(^AUTTCMOD("B",APCDPMOD,0))
  1. I APCDPMOD'="" S APCDPMOD="`"_APCDPMOD
  1. ;maw kill these cpt's after the template
  1. S APCDCPTU(APCDUCPT)=APCDVSIT ;set variable since they were picked
  1. Q
  1. ;
  1. DISPICD ;-- display the icd code picklist for user
  1. S APCDPDA=0 F I=1:1 S APCDPDA=$O(^AUPNVPOV("AD",APCDVSIT,APCDPDA)) Q:'APCDPDA D
  1. . Q:'$G(^AUPNVPOV(APCDPDA,0))
  1. . S APCDDXI=$P(^AUPNVPOV(APCDPDA,0),U)
  1. . Q:APCDDXI=""
  1. . ;Q:'$G(^ICD9(APCDDXI,0)) ;cmi/anch/maw 3/6/2007 orig line
  1. . ;Q:'$D(^ICD9(APCDDXI,0)) ;cmi/anch/maw 3/6/2007 not picking up v codes
  1. . Q:$P($$ICDDX^ICDEX(APCDDXI),U,1)<0
  1. . ;S APCDDXC=$P(^ICD9(APCDDXI,0),U)
  1. . S APCDDXC=$P($$ICDDX^ICDEX(APCDDXI,$$VD^APCLV(APCDVSIT)),U,2)
  1. . ;S APCDDXE=$G(^ICD9(APCDDXI,1))
  1. . S APCDDXE=$P($$ICDDX^ICDEX(APCDDXI,$$VD^APCLV(APCDVSIT)),U,4)
  1. . W !,$G(I)_") Dx Code: "_$G(APCDDXC)_" Dx Desc: "_$G(APCDDXE)
  1. . S APCDICDA(I)=APCDPDA_U_APCDDXC
  1. Q:'$O(APCDICDA(""))
  1. S APCDPICD=""
  1. R !!,"Which DX should I attach to this procedure: ",APCDIRX:DTIME
  1. Q:APCDIRX="^"
  1. Q:APCDIRX=""
  1. I '$G(APCDICDA(APCDIRX)) W !,"Not a valid Selection, Try Again." G DISPICD
  1. S APCDPICD=$P($G(APCDICDA(APCDIRX)),U,2)
  1. I $G(APCDPICD)'="" S APCDPICD=+$$CODEN^ICDEX(APCDPICD,80) I $P(APCDPICD,U)=-1 S APCDPICD=""
  1. I APCDPICD'="" S APCDPICD="`"_APCDPICD
  1. Q
  1. ;
  1. DISPECD ;-- display the ecode picklist for user
  1. S APCDI=1
  1. S APCDDA=0 F S APCDDA=$O(^APCD3MV(APCDVSIT,11,APCDDA)) Q:'APCDDA D
  1. . S APCD3ECD=$P($G(^APCD3MV(APCDVSIT,11,APCDDA,0)),U)
  1. . Q:$E(APCD3ECD,1,1)'="E"
  1. . W !,$G(APCDI)_") E Code: "_$G(APCD3ECD)
  1. . S APCDECDA(APCDI)=APCDDA_U_APCD3ECD
  1. . S APCDI=APCDI+1
  1. Q:'$O(APCDECDA(""))
  1. S APCDPECD=""
  1. R !!,"Which E Code should I attach to this diagnosis: ",APCDEX:DTIME
  1. Q:APCDEX="^"
  1. Q:APCDEX=""
  1. I '$G(APCDECDA(APCDEX)) W !,"Not a valid Selection, Try Again." G DISPECD
  1. S APCDUECD=$P($G(APCDECDA(APCDEX)),U)
  1. S APCDPECD=$P($G(APCDECDA(APCDEX)),U,2)
  1. I $G(APCDPECD)'="" S APCDCECD=+$$CODEN^ICDEX(APCDPECD,80) I $P(APCDCECD,U)=-1 S APCDCECD=""
  1. I APCDCECD="" S APCDPECD=""
  1. ;I APCDPECD'="" S APCDPECD="`"_APCDPECD
  1. Q
  1. ;
  1. FILE ; CALL FILE^DICN
  1. K DD,DO
  1. D FILE^DICN
  1. K D,D0,D1,DA,DI,DIADD,DIC,DICR,DIE,DLAYGO,DQ,DR,DINUM
  1. Q
  1. ;
  1. UPDCODE ;-- add ecode to coded entry
  1. Q:'$G(APCDDG1)
  1. S DA=$G(APCDDG1)
  1. Q:$P($G(^APCD3MV(APCD3IEN,11,DA,0)),U,4) ;e code exists
  1. S DA(1)=APCD3IEN,DIE="^APCD3MV("_DA(1)_",11,",DR=".04////"_APCDECOD
  1. D ^DIE
  1. Q
  1. ;
  1. OUT(APCDVSIT) ; EP - SEND HL7 MESSAGE TO 3M CODER
  1. ; called by PCC Data Entry and ADT Data Entry
  1. D OUTMAIN
  1. I $G(APCD3MER) D ERR
  1. Q
  1. ;
  1. OUTMAIN ; OUTBOUND MAINLINE LOGIC
  1. D OUTINIT ; initialization/check protocol
  1. D GEN^APCD3MG(APCDVSIT)
  1. Q:$G(APCD3MER)
  1. Q:APCDQ
  1. S APCDIP=$G(APCD3MIP)
  1. S BHLIP=APCDIP ;needed for protocol
  1. W !!,"Now Sending to 3M"
  1. S APCDBP=$O(^INTHPC("B","HL IHS 3M SENDER "_BHLIP,0))
  1. Q:'APCDBP
  1. F APCDJOB="FORMAT CONTROLLER","OUTPUT CONTROLLER" D
  1. . S APCDY=$$CHK^BHLBCK(APCDJOB,"")
  1. D CLNDST(BHLIP) ;12/2/2005 maw added to eliminate duplicate sends
  1. S APCDMSG=$$A^INHB(APCDBP)
  1. S X="BHL SEND TO 3M",DIC=101 D EN^XQOR
  1. Q
  1. ;
  1. CLNDST(IP) ;-- cleanout destination queue before creating message
  1. N BHLDST
  1. S BHLDST=$O(^INRHD("B","HL IHS 3M CODER "_IP,0))
  1. Q:'BHLDST
  1. K ^INLHDEST(BHLDST)
  1. Q
  1. ;
  1. OUTINIT ; OUTBOUND INITIALIZATION
  1. S APCDQ=1
  1. D:$G(APCD3MIP)="" OUTGETIP ; get IP address
  1. S APCDQ=0
  1. Q
  1. ;
  1. OUTGETIP ; GET IP ADDRESS
  1. I $G(APCD3MIP)="" D
  1. . W !
  1. . S DIR(0)="FO^1:2",DIR("A")="Enter your 3M Workstation ID "
  1. . KILL DA D ^DIR KILL DIR
  1. . S APCD3MIP=$G(X)
  1. . Q
  1. I APCD3MIP="" S APCD3MER="101^No ID address entered" D ERR Q
  1. Q
  1. ;
  1. ERR ;-- log the error here
  1. W !,$P($G(APCD3MER),U,2) Q ;maw needs work
  1. S APCDERR="D TRAP^BHLERR"
  1. I $G(APCD3MER)="GEN" D
  1. . S BHLEFL=APCDEFL
  1. . S BHLFLD=APCDFLD
  1. I $P($G(APCD3MER),U,2)]"" S APCD3MER="GEN"
  1. S BHLERCD=APCD3MER X APCDERR
  1. Q
  1. ;
  1. EOJ ;-- kill variables
  1. D EN^XBVK("APCD")
  1. Q
  1. ;