| 1 | ORWDBA3 ; SLC/GSS Billing Awareness (CIDC) [8/20/03 9:19am]
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**190,195**;Dec 17, 1997
 | 
|---|
| 3 |  ;
 | 
|---|
| 4 | ORFMDAT(ORDFN) ; Return date in FM format regarding order for CSV/CTD/HIPAA
 | 
|---|
| 5 |  ; Pass in Order IEN
 | 
|---|
| 6 |  Q ($P($G(^OR(100,ORDFN,8,1,0)),"^",16)\1)
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 | DISPLAY ; Display of BA data from original copied order (ORIT = ORIEN)
 | 
|---|
| 9 |  ; Displayed in window with all order info and user can accept/edit
 | 
|---|
| 10 |  ; Note: TxF = Treatment Factor
 | 
|---|
| 11 |  ; BA data (Dx,TxF's) not editable but in signature window, not in above
 | 
|---|
| 12 |  ; ORIT defined in ORWDXM1, DISPLAY called from ORWDXM2
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  ; Input:
 | 
|---|
| 15 |  ;  ORIT, ILST, and LST() from ORWDXM* routines
 | 
|---|
| 16 |  ; Output:
 | 
|---|
| 17 |  ;  ILST and LST() appropriately incremented/populated for order display
 | 
|---|
| 18 |  ; Variables:
 | 
|---|
| 19 |  ;  CUN     = TxF's in C, U, or N format
 | 
|---|
| 20 |  ;  I       = counter
 | 
|---|
| 21 |  ;  ILST    = line counter, initially from ORWDXM* routines
 | 
|---|
| 22 |  ;  LST()   = array of lines to output, initially from ORWDXM* routines
 | 
|---|
| 23 |  ;  NTF     = # of Treatment Factors
 | 
|---|
| 24 |  ;  ORITARY = ORIT array of 1 needed to access GETTFCI^ORWDBA4
 | 
|---|
| 25 |  ;  SPCS    = # of characters to space to left of ':'
 | 
|---|
| 26 |  ;  TF1     = first TxF output? (0/1)
 | 
|---|
| 27 |  ;  TFGBL   = TxF's in Global stored order
 | 
|---|
| 28 |  ;  TFGUI   = TxF's in GUI returned order
 | 
|---|
| 29 |  ;  TFV     = TxF verbiage
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  N CUN,I,NTF,ORITARY,SPCS,TF1,TFGBL,TFGUI,TFV,Y
 | 
|---|
| 32 |  S NTF=7,SPCS=28,ORITARY(1)=+ORIT
 | 
|---|
| 33 |  ; Get Y(+ORIT) string in ORIEN^CUUUCCN^Dx1^Desc1^Dx2^Desc2^... format
 | 
|---|
| 34 |  D GETTFCI^ORWDBA4(.Y,.ORITARY)
 | 
|---|
| 35 |  S CUN=$P($G(Y(1)),U,2)  ;CUN = Treatment Factors in CUN syntax
 | 
|---|
| 36 |  ; First output Diagnosis information - if any
 | 
|---|
| 37 |  F I=3:2:9 I $P($G(Y(1)),U,I)'="" D
 | 
|---|
| 38 |  . S ILST=ILST+1,LST(ILST)=$S(I=3:"Diagnoses",1:"")
 | 
|---|
| 39 |  . S LST(ILST)=LST(ILST)_":"_$P(Y(1),U,I)_" - "_$P(Y(1),U,I+1)
 | 
|---|
| 40 |  . D FRMTLST
 | 
|---|
| 41 |  ; Get GUI and GBL Treatment Factor sequence strings
 | 
|---|
| 42 |  D TFSTGS^ORWDBA1
 | 
|---|
| 43 |  ; Assumes SC will always be first in sequence! - not likely to change
 | 
|---|
| 44 |  S ILST=ILST+1
 | 
|---|
| 45 |  S LST(ILST)="Service Connected:"_$S($E(CUN)="C":"YES",1:"NO")
 | 
|---|
| 46 |  D FRMTLST
 | 
|---|
| 47 |  S ILST=ILST+1,LST(ILST)="Treatment Factors:"
 | 
|---|
| 48 |  ; If no TxF's (no 'C'hecked) {SC output above} then output '<none>'
 | 
|---|
| 49 |  I '$F($E(CUN,2,NTF),"C") S LST(ILST)=LST(ILST)_"<none>" D FRMTLST Q
 | 
|---|
| 50 |  S TF1=0  ;No TxF yet output
 | 
|---|
| 51 |  ; Verbiage for TxF's
 | 
|---|
| 52 |  S TFV("MST")="MILITARY SEXUAL TRAUMA",TFV("AO")="AGENT ORANGE"
 | 
|---|
| 53 |  S TFV("IR")="IONIZING RADIATION",TFV("EC")="ENVIRONMENTAL CONTAMINANTS"
 | 
|---|
| 54 |  S TFV("HNC")="HEAD AND NECK CANCER",TFV("CV")="COMBAT VETERAN"
 | 
|---|
| 55 |  ; Output Checked TxF's
 | 
|---|
| 56 |  F I=2:1:NTF I $E(CUN,I)="C" D
 | 
|---|
| 57 |  . I 'TF1 S LST(ILST)=LST(ILST)_TFV($P(TFGUI,U,I)),TF1=1 D FRMTLST Q
 | 
|---|
| 58 |  . S ILST=ILST+1,LST(ILST)=":"_TFV($P(TFGUI,U,I)) D FRMTLST
 | 
|---|
| 59 |  Q
 | 
|---|
| 60 |  ;
 | 
|---|
| 61 | FRMTLST ; Format the variable LST(ILST) for DISPLAY tag
 | 
|---|
| 62 |  S LST(ILST)=$J($P(LST(ILST),":"),SPCS)_": "_$P(LST(ILST),":",2)
 | 
|---|
| 63 |  Q
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 | HINTS(Y) ; Return HINTS for ORBA Treatment Factors - used by Delphi
 | 
|---|
| 66 |  ; The hints returned in the Y array will be used in the CPRS GUI and
 | 
|---|
| 67 |  ; displayed on fly-over of the cursor over the TxF text in the window
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; Input
 | 
|---|
| 70 |  ;  <none>
 | 
|---|
| 71 |  ; Output
 | 
|---|
| 72 |  ;  Y array of the hints for TxF's> Y(#)=TxFA ^ TxF line # ^ hint text
 | 
|---|
| 73 |  ;    where TxFA is Treatment Factor acronym, e.g., CV=Combat Veteran
 | 
|---|
| 74 |  ; Variables
 | 
|---|
| 75 |  ;  CT      = line number count, used in Y(#) where #=CT
 | 
|---|
| 76 |  ;  I       = incrementor index #
 | 
|---|
| 77 |  ;  ORTFIEN = the IEN for the TxF in the Help Frame (^DIC(9.2)) file
 | 
|---|
| 78 |  ;  TF      = TxF acronym
 | 
|---|
| 79 |  ;  TFLN    = TxF text line number, e.g., ^DIC(9.2,ORTFIEN,1,TFLN,0)
 | 
|---|
| 80 |  ;  TFS     = string of TxF acronyms
 | 
|---|
| 81 |  ;  TFV     = TxF description/text
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 |  N CT,I,ORTFIEN,TF,TFLN,TFS,TFV
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 |  S TFS="SC^MST^AO^IR^EC^HNC^CV",CT=0
 | 
|---|
| 86 |  ; Get next TxF from TFS
 | 
|---|
| 87 |  F I=1:1 S TF=$P(TFS,U,I) Q:TF=""  D
 | 
|---|
| 88 |  . S ORTFIEN=$O(^DIC(9.2,"B","ORBA-"_TF,"")),TFV="",TFLN=0
 | 
|---|
| 89 |  . ; Get next line of hint text
 | 
|---|
| 90 |  . F  S TFLN=$O(^DIC(9.2,ORTFIEN,1,TFLN)) Q:'TFLN  D
 | 
|---|
| 91 |  .. S CT=CT+1,Y(CT)=TF_U_TFLN_U_^DIC(9.2,ORTFIEN,1,TFLN,0)
 | 
|---|
| 92 |  Q
 | 
|---|
| 93 |  ;
 | 
|---|
| 94 | DG1(ORDFN,COUNTER,CTVALUE) ; Create DG1 segment(s) & make call for ZCL seg.
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 |  ;  Input
 | 
|---|
| 97 |  ;    ORDFN      Internal Order ID#
 | 
|---|
| 98 |  ;    COUNTER    Variable used as counter from calling routine
 | 
|---|
| 99 |  ;    CTVALUE    Value of COUNTER when DG1 called
 | 
|---|
| 100 |  ;  Output
 | 
|---|
| 101 |  ;    DG1 & ZCL HL7 segments
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  I $$BASTAT^ORWDBA1=0 Q  ;BA not used
 | 
|---|
| 104 |  N DG13,DXIEN,DXR,DXV,FROMFILE,ICD9,OCT,OREC,ORFMDAT
 | 
|---|
| 105 |  ; zero order count variable
 | 
|---|
| 106 |  S OCT=0
 | 
|---|
| 107 |  ; Get the date of order (for CSV/CTD usage)
 | 
|---|
| 108 |  S ORFMDAT=$$ORFMDAT(ORDFN)
 | 
|---|
| 109 |  ; Get the diagnoses for an order
 | 
|---|
| 110 |  F  S OCT=$O(^OR(100,ORDFN,5.1,OCT)) Q:OCT'?1N.N  D
 | 
|---|
| 111 |  . S OREC=^OR(100,ORDFN,5.1,OCT,0)
 | 
|---|
| 112 |  . S DXIEN=$P(OREC,U)  ; DXIEN=pointer to diagnosis (ICD9) file #80
 | 
|---|
| 113 |  . ; the DXIEN pointer should point to a valid diagnosis (after all is
 | 
|---|
| 114 |  . ;   was previously entered .. but just in case ...)
 | 
|---|
| 115 |  . S (DXV,ICD9)=""
 | 
|---|
| 116 |  . I DXIEN'="" D
 | 
|---|
| 117 |  .. S DXR=$$ICDDX^ICDCODE(DXIEN,ORFMDAT) Q:+DXR=-1
 | 
|---|
| 118 |  .. ; Get diagnosis verbiage and ICD code
 | 
|---|
| 119 |  .. S DXV=$P(DXR,U,4),ICD9=$P(DXR,U,2)
 | 
|---|
| 120 |  . S FROMFILE=80
 | 
|---|
| 121 |  . S DG13=DXIEN_U_DXV_U_FROMFILE_U_ICD9_U_DXV_U_"ICD9"
 | 
|---|
| 122 |  . S CTVALUE=CTVALUE+1
 | 
|---|
| 123 |  . S ORMSG(CTVALUE)="DG1"_"|"_OCT_"||"_DG13_"|||||||||||||"
 | 
|---|
| 124 |  . D ZCL
 | 
|---|
| 125 |  S @COUNTER=CTVALUE
 | 
|---|
| 126 |  Q
 | 
|---|
| 127 |  ;
 | 
|---|
| 128 | ZCL ;create all the ZCL segments (currently 7 TxF's) for order number OCT
 | 
|---|
| 129 |  ;
 | 
|---|
| 130 |  N I,J,TABLE,TF,TFGBL,TFGUI,TFTBL,TFIN,TFS,VALUE
 | 
|---|
| 131 |  D TFSTGS^ORWDBA1  ;set string sequence of treatment factors
 | 
|---|
| 132 |  ; TFS is TxF data in ^OR(100,ORIEN,5.2) order
 | 
|---|
| 133 |  S TFS=$G(^OR(100,ORDFN,5.2)),TABLE=""
 | 
|---|
| 134 |  ; conversion order from ^OR stored data and Table SD008 for HL7 msg
 | 
|---|
| 135 |  ; convert so that the ZCL segments will be in Table SD008 order (1-7)
 | 
|---|
| 136 |  F I=1:1:7 S TF=$P(TFTBL,U,I) F J=1:1:7 I $P(TFGBL,U,J)=TF S TABLE=TABLE_J Q
 | 
|---|
| 137 |  F TFIN=1:1:7 D
 | 
|---|
| 138 |  . ; ORMSG counter incremented
 | 
|---|
| 139 |  . S CTVALUE=CTVALUE+1
 | 
|---|
| 140 |  . ; TF VALUE=0 for no or 1 for yes (only if not req. is it null)
 | 
|---|
| 141 |  . S VALUE=$P(TFS,U,$E(TABLE,TFIN))
 | 
|---|
| 142 |  . I VALUE="?" S VALUE=0  ;temp fix if sending '?' to ancillary???
 | 
|---|
| 143 |  . ; for Table SD008: OCT=Set ID, SCIN=O/P Classif. Type, VALUE=Value
 | 
|---|
| 144 |  . S ORMSG(CTVALUE)="ZCL|"_OCT_"|"_TFIN_"|"_VALUE
 | 
|---|
| 145 |  Q
 | 
|---|
| 146 |  ;
 | 
|---|
| 147 | BDOSTR ;Store backdoor order DG1 and ZCL messages from HL7
 | 
|---|
| 148 |  ;Processes one order per entry into BDOSTR, e.g., ROUT(1)
 | 
|---|
| 149 |  ;Depends upon ORM* routines to set-up a number of variables including
 | 
|---|
| 150 |  ;  ORMSG array and ORIFN.
 | 
|---|
| 151 |  ;ORM* routines calling BDOSTR: ORMGMRC, ORMLR, ORMPS, & ORMRA
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 |  ; Input:   HL7 messages and related data
 | 
|---|
| 154 |  ; Output:  ROUT array in Delphi GUI format, i.e.
 | 
|---|
| 155 |  ;          OrderIEN;11CNNNCNN^exDx1^exDx2^exDx3^exDx4
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  ; Variables Used
 | 
|---|
| 158 |  ;  DG1      = sequential numbered array with a value of DXIEN
 | 
|---|
| 159 |  ;  I,J      = counters
 | 
|---|
| 160 |  ;  GUITF    = GUI order treatment factors (TxF)
 | 
|---|
| 161 |  ;  NDX      = number of diagnoses being passed
 | 
|---|
| 162 |  ;  NTF      = number of TxF
 | 
|---|
| 163 |  ;  OBX      = @ORMSG Dx array element # (max of 4 diagnoses stored)
 | 
|---|
| 164 |  ;  REC      = set to sequential HL7 messages, contains HL7 message data
 | 
|---|
| 165 |  ;  ROUT     = record sent for storage processing to RCVORCI
 | 
|---|
| 166 |  ;  TF       = individual TxF values
 | 
|---|
| 167 |  ;  TFGBL    = TxF acronyms in ^ delimited string in ^OR sequence
 | 
|---|
| 168 |  ;  TFGUI    = TxF acronyms in ^ delimited string in from GUI sequence
 | 
|---|
| 169 |  ;  TFTBL    = TxF acronyms in ^ delimited string in Table SD008 sequence
 | 
|---|
| 170 |  ;  VAL      = individual TxF values
 | 
|---|
| 171 |  ;  ZCL      = TxF in Table SD008 format and sequence
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  ; See if CIDC master switch set, if not then no DG1/ZCL seg, to store
 | 
|---|
| 174 |  I $$BASTAT^ORWDBA1=0 Q  ;CIDC (nee BA) not used
 | 
|---|
| 175 |  ;
 | 
|---|
| 176 |  N CPNODE,CT,DG1,I,J,GUITF,NDX,NTF,OBX,REC,ROUT,ORSDCARY,SDCARYA
 | 
|---|
| 177 |  N TF,TFGBL,TFGUI,TFTBL,VAL,X,ZCL
 | 
|---|
| 178 |  ;
 | 
|---|
| 179 |  K ORSDCARY,SDCARYA
 | 
|---|
| 180 |  D TFSTGS^ORWDBA1  ;set string sequence of treatment factors
 | 
|---|
| 181 |  S (CT,NDX,OBX)=0,NTF=7,(CPNODE,GUITF,TF,Y,ZCL)="",X="T"
 | 
|---|
| 182 |  ; Call API to acquire Treatment Factors in force
 | 
|---|
| 183 |  D NOW^%DTC,CL^SDCO21(DFN,%,"",.ORSDCARY)  ;DBIA 406
 | 
|---|
| 184 |  ; Retrved array order: AO,IR,SC,EC,MST,HNC,CV, e.g., ORSDCARY(3) for SC
 | 
|---|
| 185 |  ; Convert to character array, e.g., SDCARYA("SC")=""
 | 
|---|
| 186 |  F I=1:1:NTF S:$D(ORSDCARY(I)) SDCARYA($P("AO^IR^SC^EC^MST^HNC^CV",U,I))=""
 | 
|---|
| 187 |  ; Process only four DG1 segments and first set of ZCL segments
 | 
|---|
| 188 |  F  S OBX=$O(@ORMSG@(OBX)) Q:OBX'>0  S J=$E(@ORMSG@(OBX),1,3) I J="DG1"!(J="ZCL"&($P(@ORMSG@(OBX),"|",2)=1)) D
 | 
|---|
| 189 |  . S REC=@ORMSG@(OBX)
 | 
|---|
| 190 |  . ; Setting DG1(#)=DXIEN where # is Dx sequence # (1=primary)
 | 
|---|
| 191 |  . I J="DG1"&(NDX<4) S DG1($P(REC,"|",2))=$P(REC,U,4),NDX=NDX+1 Q
 | 
|---|
| 192 |  . ; Create ZCL string of TxFs, e.g., 1101011
 | 
|---|
| 193 |  . I J="ZCL" D
 | 
|---|
| 194 |  .. S:$P(REC,"|",4)="" $P(REC,"|",4)=" "
 | 
|---|
| 195 |  .. S $E(ZCL,$P(REC,"|",3))=$P(REC,"|",4)
 | 
|---|
| 196 |  ; convert order and format from Table SD008 to GUI
 | 
|---|
| 197 |  F I=1:1:NTF S TF=$P(TFGUI,U,I) F J=1:1:NTF I $P(TFTBL,U,J)=TF D
 | 
|---|
| 198 |  . ; If patient does not have that Tx Factor (TF) then ghost in GUI ("N")
 | 
|---|
| 199 |  . I '$D(SDCARYA(TF)) S GUITF=GUITF_"N" Q
 | 
|---|
| 200 |  . ; If patient has TF then format for GUI (C=ck'd, U=unck'd, ?=not ans)
 | 
|---|
| 201 |  . S VAL=$E(ZCL,J),GUITF=GUITF_$S(VAL=1:"C",VAL=0:"U",1:"?")
 | 
|---|
| 202 |  ; Create output string in a format that can be stored by RCVORCI^ORWDBA1
 | 
|---|
| 203 |  S ROUT(1)=ORIFN_";11"_GUITF_U_$G(DG1(1))_U_$G(DG1(2))_U_$G(DG1(3))_U_$G(DG1(4))
 | 
|---|
| 204 |  ; Store diagnoses and treatment factors
 | 
|---|
| 205 |  D RCVORCI^ORWDBA1(Y,.ROUT)
 | 
|---|
| 206 |  Q
 | 
|---|
| 207 |  ;
 | 
|---|
| 208 | ERRMSG(VISIT) ; Error handling and message
 | 
|---|
| 209 |  ; to be determined
 | 
|---|
| 210 |  Q
 | 
|---|