| 1 | ECXLBB1 ;ALB/JRC - DSS VBECS EXTRACT ; 7/24/08 12:01pm
 | 
|---|
| 2 |         ;;3.0;DSS EXTRACTS;**105,102**;Dec 22, 1997;Build 17
 | 
|---|
| 3 |         ;Per VHA Directive 97-033 this routine should not be modified.  Medical Device # BK970021
 | 
|---|
| 4 |         ; access to the VBECS EXTRACT file (#6002.03) is supported by
 | 
|---|
| 5 |         ; controlled subscription to IA #4953  (global root ^VBECS(6002.03)
 | 
|---|
| 6 | BEG     ;entry point from option
 | 
|---|
| 7 |         D SETUP I ECFILE="" Q
 | 
|---|
| 8 |         D ^ECXTRAC,^ECXKILL
 | 
|---|
| 9 |         Q
 | 
|---|
| 10 |         ;
 | 
|---|
| 11 | START   ; Entry point from tasked job
 | 
|---|
| 12 |         ; begin package specific extract
 | 
|---|
| 13 |         N ECTRSP,ECADMT,ECTODT,ECENCTR,ECPAT,ECLRDFN,ECXPHY,ECXPHYPC
 | 
|---|
| 14 |         N ECD,ECXDFN,ECARRY,EC66,ECERR,ECTRFDT,ECTRFTM,ECX,ECINOUT,ECXINST
 | 
|---|
| 15 |         N ECPHYNPI,ECREQNPI
 | 
|---|
| 16 |         ;variables ECFILE,EC23,ECXYM,ECINST,ECSD,ECSD1,ECED passed in 
 | 
|---|
| 17 |         ; by taskmanager 
 | 
|---|
| 18 |         ; ECED defined in ^ECXTRAC - end date of the extract
 | 
|---|
| 19 |         ; TRANSFUSION DATE should be within start and end dates
 | 
|---|
| 20 |         ; ECED and ECSD input provided by the user interface
 | 
|---|
| 21 |         ; and ECSD1 = ECSD-.1
 | 
|---|
| 22 |         ; Read through the VBECS DSS EXTRACT file (6002.03)
 | 
|---|
| 23 |         I $D(ZTQUEUED),$$S^%ZTLOAD S QFLG=1 Q  ;quit if tasked and user sends stop request  (QFLG assigned in ECXTRAC)
 | 
|---|
| 24 |         ;
 | 
|---|
| 25 | AUDRPT  ; entry point for pre-extract audit report
 | 
|---|
| 26 |         S RECORD=0,ECD=ECSD-.1,ECTODT=ECED+.9
 | 
|---|
| 27 |         F  S ECD=$O(^VBEC(6002.03,"C",ECD)) Q:'ECD!(ECD>ECTODT)  S RECORD=0 F  S RECORD=$O(^VBEC(6002.03,"C",ECD,RECORD)) Q:RECORD'>0  S EC0=^VBEC(6002.03,RECORD,0) D
 | 
|---|
| 28 |         .; ECARRY(1)=TRANSFUSION DATE AND TIME, ECARRY(3)=COMPONENT 
 | 
|---|
| 29 |         .; ECARRY(4)=COMPONENT ABBREVIATION, ECARRY(5)=UNITS POOLED
 | 
|---|
| 30 |         .; ECARRY(6)=TRANSFUSION REACTION,ECARRY(7)=VOLUME TRANSFUSED
 | 
|---|
| 31 |         .; ECARRY(8)=TRANSFUSION REACTION TYPE, ECARRY(9)=REQUESTING PROVIDER
 | 
|---|
| 32 |         .; ECARRY(10)=REQUEST. PROV. PERSON CLASS, ECARRY(11)=UNIT MODIFIED
 | 
|---|
| 33 |         .; ECARRY(12)=UNIT MODIFICATION, ECARRY(13)=PRODUCTION DIVISION CODE
 | 
|---|
| 34 |         .;
 | 
|---|
| 35 |         . S ECXDFN=$P(EC0,U,2),ECERR=$$PAT(ECXDFN) Q:ECERR
 | 
|---|
| 36 |         . S ECARRY(1)=$P(EC0,U,10),ECARRY(3)=$P(EC0,U,7),ECARRY(4)=$P(EC0,U,8),ECARRY(5)=$S(+$P(EC0,U,9)=0:1,1:+$P(EC0,U,9)),ECARRY(6)=$S($P(EC0,U,15):"Y",1:"N"),ECARRY(7)=$P(EC0,"^",12),ECARRY(8)=$P(EC0,U,13)
 | 
|---|
| 37 |         . S ECARRY(9)=$P(EC0,U,6),ECINST=$P(EC0,U,3),ECARRY(12)=$P(EC0,U,14),ECARRY(11)=$S(ECARRY(12)'="":"Y",1:"N"),ECARRY(13)=$P(EC0,U,4)
 | 
|---|
| 38 |         . ;get requesting and ordering providers and their person class
 | 
|---|
| 39 |         . S ECXPHY=$P(EC0,U,5),(ECXPHYPC,ECARRY(10),ECPHYNPI,ECREQNPI)=""
 | 
|---|
| 40 |         . I ECXPHY]"" S ECXPHY=$O(^VA(200,"B",ECXPHY,0))
 | 
|---|
| 41 |         . I ECXPHY>0 D
 | 
|---|
| 42 |         .. N PERCLS S PERCLS=$$GET^XUA4A72(ECXPHY,ECD)
 | 
|---|
| 43 |         .. I +PERCLS>0 S ECXPHYPC=$P(PERCLS,U,7)
 | 
|---|
| 44 |         .. S ECPHYNPI=$$NPI^XUSNPI("Individual_ID",ECXPHY,ECD)
 | 
|---|
| 45 |         .. S:+ECPHYNPI'>0 ECPHYNPI="" S ECPHYNPI=$P(ECPHYNPI,U)
 | 
|---|
| 46 |         .. S ECXPHY=2_ECXPHY
 | 
|---|
| 47 |         . I ECARRY(9)>0 D
 | 
|---|
| 48 |         .. N PERCLS S PERCLS=$$GET^XUA4A72(ECARRY(9),ECD)
 | 
|---|
| 49 |         .. I +PERCLS>0 S ECARRY(10)=$P(PERCLS,U,7)
 | 
|---|
| 50 |         .. S ECREQNPI=$$NPI^XUSNPI("Individual_ID",ECARRY(9),ECD)
 | 
|---|
| 51 |         .. S:+ECREQNPI'>0 ECREQNPI="" S ECREQNPI=$P(ECREQNPI,U)
 | 
|---|
| 52 |         .. S ECARRY(9)=2_ECARRY(9)
 | 
|---|
| 53 |         . D GETDATA
 | 
|---|
| 54 |         . K ECARRY
 | 
|---|
| 55 |         Q
 | 
|---|
| 56 |         ;
 | 
|---|
| 57 | GETDATA ; gather rest of extract data that will be recorded in an 
 | 
|---|
| 58 |         ; entry in file 727.829
 | 
|---|
| 59 |         S ECTRFDT=$$ECXDOB^ECXUTL(ECARRY(1)),ECTRFTM=$$ECXTIME^ECXUTL(ECARRY(1))
 | 
|---|
| 60 |         S ECX=$$INP^ECXUTL2(ECXDFN,ECARRY(1)),ECINOUT=$P(ECX,U),ECTRSP=$P(ECX,U,3),ECADMT=$P(ECX,U,4)
 | 
|---|
| 61 |         ;
 | 
|---|
| 62 |         ;- Observation patient indicator (YES/NO)
 | 
|---|
| 63 |         S ECXOBS=$$OBSPAT^ECXUTL4(ECINOUT,ECTRSP)
 | 
|---|
| 64 |         ;- If no encounter number don't file record
 | 
|---|
| 65 |         S ECENCTR=$$ENCNUM^ECXUTL4(ECINOUT,ECPAT("SSN"),ECADMT,ECARRY(1),ECTRSP,ECXOBS,ECHEAD,,) ; [FLD #6]
 | 
|---|
| 66 |         Q:ECENCTR=""
 | 
|---|
| 67 |         ;get emergency response indicator (FEMA)
 | 
|---|
| 68 |         S ECXERI=$G(ECPAT("ERI"))
 | 
|---|
| 69 |         ;
 | 
|---|
| 70 |         S ECXSTR=$G(EC23)_"^"_ECINST_"^"_ECXDFN_"^"_ECPAT("SSN")_"^"_ECPAT("NAME")_"^"_ECINOUT_"^"_ECENCTR_"^"_ECTRFDT_"^"_ECTRFTM_"^"_ECARRY(3)_"^"_ECARRY(4)_"^"_ECARRY(5)_"^"_ECARRY(7)_"^"_ECARRY(6)_"^"_ECARRY(8)_"^BB"_ECARRY(13)_"^^"
 | 
|---|
| 71 |         I $G(ECXLOGIC)>2005 S ECXSTR=ECXSTR_U_ECXPHY_U_ECXPHYPC
 | 
|---|
| 72 |         I $G(ECXLOGIC)>2006 D
 | 
|---|
| 73 |         .S ECXSTR=ECXSTR_U_ECXERI_U_ECARRY(11)_U_ECARRY(12)_U_ECARRY(9)_U_ECARRY(10)_U_ECARRY(13)_U
 | 
|---|
| 74 |         I '$D(ECXRPT) D FILE(ECXSTR) Q
 | 
|---|
| 75 |         S ^TMP("ECXLBB",$J,ECXDFN,ECD)=ECXSTR  ;temporary global array
 | 
|---|
| 76 |         ;   used in ECXPLBB (pre-extract audit report)
 | 
|---|
| 77 |         Q
 | 
|---|
| 78 |         ;
 | 
|---|
| 79 | PAT(ECXDFN)     ;get/set patient data
 | 
|---|
| 80 |         ; INPUT - ECXDFN = patient ien (DFN)
 | 
|---|
| 81 |         ; OUTPUT - ECPAT array:
 | 
|---|
| 82 |         ;          ECPAT("SSN")
 | 
|---|
| 83 |         ;          ECPAT("NAME")
 | 
|---|
| 84 |         ; returns 0 or 1 in ECXERR - 0=successful
 | 
|---|
| 85 |         ;                            1=error condition
 | 
|---|
| 86 |         N X,OK,ECXERR
 | 
|---|
| 87 |         ;get data
 | 
|---|
| 88 |         S ECXERR=0
 | 
|---|
| 89 |         K ECXPAT S OK=$$PAT^ECXUTL3(ECXDFN,"","1;3",.ECPAT)
 | 
|---|
| 90 |         I 'OK S ECXERR=1
 | 
|---|
| 91 |         Q ECXERR
 | 
|---|
| 92 |         ;
 | 
|---|
| 93 | FILE(ECODE)     ;
 | 
|---|
| 94 |         ; Input - ECODE = extract record
 | 
|---|
| 95 |         ;
 | 
|---|
| 96 |         ; record the extract record at a global node in file 727.829
 | 
|---|
| 97 |         ; sequence #^year/month of extract^extract #^facility^patient dfn^SSN^
 | 
|---|
| 98 |         ; name^i/o pt indicator^encounter #^date of transfusion^time of 
 | 
|---|
| 99 |         ; transfusion^component^component abbrev^# of units^volume in mm^
 | 
|---|
| 100 |         ; reaction^reaction type^feeder location^DSS product dept^DSS IP #
 | 
|---|
| 101 |         ; ordering physician^ordering physician pc^emergency response indicator
 | 
|---|
| 102 |         ; (FEMA)^unit modified^unit modification^requesting provider^request. 
 | 
|---|
| 103 |         ; provider person class^ordering provider npi ECPHYNPI
 | 
|---|
| 104 |         ;ECODE1- requesting provider npi ECREQNPI
 | 
|---|
| 105 |         ;note:  DSS product dept and DSS IP # are dependent on the release of
 | 
|---|
| 106 |         ; ECX*3*61
 | 
|---|
| 107 |         N DA,DIK,EC7
 | 
|---|
| 108 |         S EC7=$O(^ECX(ECFILE,999999999),-1),EC7=EC7+1
 | 
|---|
| 109 |         S ECODE=EC7_"^"_ECODE
 | 
|---|
| 110 |         I ECXLOGIC>2007 D
 | 
|---|
| 111 |         .S ECODE=ECODE_ECPHYNPI_U
 | 
|---|
| 112 |         .S ECODE1=$G(ECREQNPI)
 | 
|---|
| 113 |         S ^ECX(ECFILE,EC7,0)=ECODE,^ECX(ECFILE,EC7,1)=$G(ECODE1),ECRN=ECRN+1
 | 
|---|
| 114 |         S DA=EC7,DIK="^ECX("_ECFILE_"," D IX1^DIK K DIK,DA
 | 
|---|
| 115 |         Q
 | 
|---|
| 116 |         ;
 | 
|---|
| 117 | SETUP   ;Set required input for ECXTRAC.
 | 
|---|
| 118 |         S ECHEAD="LBB"
 | 
|---|
| 119 |         D ECXDEF^ECXUTL2(ECHEAD,.ECPACK,.ECGRP,.ECFILE,.ECRTN,.ECPIECE,.ECVER)
 | 
|---|
| 120 |         Q
 | 
|---|
| 121 |         ;
 | 
|---|
| 122 | LOCAL   ; to extract nightly for local use not to be transmitted to TSI
 | 
|---|
| 123 |         ; should be queued with a 1D frequency
 | 
|---|
| 124 |         D SETUP,^ECXTLOCL,^ECXKILL Q
 | 
|---|
| 125 |         ;
 | 
|---|
| 126 | CHKMOD(MD)      ;check if modifier is contained in string
 | 
|---|
| 127 |         N RES,MODX
 | 
|---|
| 128 |         I MD="" Q ""
 | 
|---|
| 129 |         S (RES,MODX)="" F  S MODX=$O(MODARY(MODX)) Q:MODX=""  D  I RES'="" Q
 | 
|---|
| 130 |         .I MD[MODX S RES=MODARY(MODX)
 | 
|---|
| 131 |         Q RES
 | 
|---|
| 132 |         ;
 | 
|---|
| 133 | QUE     ; entry point for the background requeuing handled by ECXTAUTO
 | 
|---|
| 134 |         D SETUP,QUE^ECXTAUTO,^ECXKILL
 | 
|---|
| 135 |         Q
 | 
|---|
| 136 |         ;
 | 
|---|
| 137 |         ;ECXLBB
 | 
|---|