| 1 | ACKQUTL2 ;AUG/JLTP BIR/PTD HCIOFO/AG -QUASAR Utility Routine ; [ 04/25/96 10:03 ]
 | 
|---|
| 2 |  ;;3.0;QUASAR;**15**;Feb 11, 2000;Build 2
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine SHOULD NOT be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | DIVLIST(ACKTYP,ACKTXT) ; list on screen all the Divisions on the Site Parameter File
 | 
|---|
| 7 |  ; optional ACKTYP = type of list 1=Active only, 0 (default) = all
 | 
|---|
| 8 |  ; optional ACKTXT = preceding message
 | 
|---|
| 9 |  N ACKFROM,ACKFDA,ACKMSG,ACKSCRN,DIWL,DIWR,DIWF,X,Y,I,DA,ACKCT
 | 
|---|
| 10 |  S ACKFROM="",ACKTYP=$S(+$G(ACKTYP)=1:1,1:0)
 | 
|---|
| 11 |  ; set up the screen if only active divisions are to be listed
 | 
|---|
| 12 |  S ACKSCRN=$S(ACKTYP=1:"I $P(^(0),U,2)=""A""",1:"")
 | 
|---|
| 13 |  ; call fileman to retrieve the Divisions
 | 
|---|
| 14 |  D LIST^DIC(509850.83,",1,",".01;.02","","",.ACKFROM,"","",ACKSCRN,"","ACKFDA","ACKMSG")
 | 
|---|
| 15 |  ; get count of number of Divisions
 | 
|---|
| 16 |  S ACKCT=$P(ACKFDA("DILIST",0),U,1)
 | 
|---|
| 17 |  ; determine the text header
 | 
|---|
| 18 |  I ACKCT=0,ACKTYP=0 S ACKTXT="  No Divisions have been set up."
 | 
|---|
| 19 |  I ACKCT=0,ACKTYP=1 S ACKTXT="  There are no Active Divisions on file."
 | 
|---|
| 20 |  I $G(ACKTXT)="" D
 | 
|---|
| 21 |  . I ACKCT>0 S ACKTXT="  The following Divisions have been set up..."
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 |  ; the following section uses DIWP & DIWW to format and output the text
 | 
|---|
| 24 |  S DIWL=5,DIWR=75,DIWF=""
 | 
|---|
| 25 |  S X="|SETTAB(10,40)| " D ^DIWP
 | 
|---|
| 26 |  S X=" " D ^DIWP   ;blank line!
 | 
|---|
| 27 |  S X=ACKTXT D ^DIWP
 | 
|---|
| 28 |  ; now output each Division
 | 
|---|
| 29 |  F ACK=1:1:ACKCT D
 | 
|---|
| 30 |  . ; print division name
 | 
|---|
| 31 |  . S X="  |TAB|"_$E(ACKFDA("DILIST",1,ACK),1,25)
 | 
|---|
| 32 |  . ; if all divisions to be printed then also print the status
 | 
|---|
| 33 |  . I ACKTYP=0 S X=X_"|TAB|"_$$MC(ACKFDA("DILIST","ID",ACK,.02))
 | 
|---|
| 34 |  . D ^DIWP
 | 
|---|
| 35 |  ; now write to the screen
 | 
|---|
| 36 |  D ^DIWW
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ; end
 | 
|---|
| 39 |  Q
 | 
|---|
| 40 |  ;
 | 
|---|
| 41 | MC(X) ; convert X to mixed case (1st upper, remainder lower)
 | 
|---|
| 42 |  N UP,LW S UP="ABCDEFGHIJKLMNOPQRSTUVWXYZ",LW="abcdefghijklmnopqrstuvwxyz"
 | 
|---|
| 43 |  Q $TR($E(X),LW,UP)_$TR($E(X,2,999),UP,LW)
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 | DIV(ACKTYP,ACKDIV,ACKSTA) ; prompt user for an A&SP Division
 | 
|---|
| 47 |  ;  where ACKTYP can be 1=one div, 2=many, 3=many/all
 | 
|---|
| 48 |  ;  if ACTYPE>1 then ACKDIV must be passed in by reference
 | 
|---|
| 49 |  ;  and ACKSTA contains the required status of the Division
 | 
|---|
| 50 |  ;  so if ACKSTA="A" then only active divisions may be chosen
 | 
|---|
| 51 |  ;   if ACKSTA="I" then only inactive divisions may be chosen
 | 
|---|
| 52 |  ;   if ACKSTA="AI" or "IA" then either active or inactive may be 
 | 
|---|
| 53 |  ;    chosen. If not passed then "A" is used as the default.
 | 
|---|
| 54 |  ; ------------------------------------------------------------
 | 
|---|
| 55 |  ; function returns:-
 | 
|---|
| 56 |  ;   ACKDIV=a^b   where a=no. divisions selected, and b=total
 | 
|---|
| 57 |  ;        available divisions.
 | 
|---|
| 58 |  ;        (if the user quits or times out then a=0)
 | 
|---|
| 59 |  ;   ACKDIV(x)=x^y^z  where 
 | 
|---|
| 60 |  ;         x=div ien on Med Cen Div file #40.8,
 | 
|---|
| 61 |  ;         y=div ien on Site Parameters #509850.83
 | 
|---|
| 62 |  ;     and z=division name
 | 
|---|
| 63 |  ; ------------------------------------------------------------
 | 
|---|
| 64 |  N DIVARR,ACKDIVN,ACKN,ACKDEF,ACKDFLT,ACKIEN,ACKX
 | 
|---|
| 65 |  K ACKDIV
 | 
|---|
| 66 |  ; initialise selected Division
 | 
|---|
| 67 |  S ACKDIV=""
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ; check parameter has been passed in
 | 
|---|
| 70 |  I "1/2/3"'[+$G(ACKTYP) G DIVX
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ; get list of divisions
 | 
|---|
| 73 |  D GETDIV^ACKQRU(.DIVARR,$G(ACKSTA),"U")
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ; no Divisions exist
 | 
|---|
| 76 |  I DIVARR<1 S ACKDIV=0 G DIVX
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ;  only one Division exists 
 | 
|---|
| 79 |  I DIVARR=1 D  G DIVX
 | 
|---|
| 80 |  . S ACKDIV="1^1",ACKDIV($P(DIVARR(1,1),U,1))=$P(DIVARR(1,1),U,1,3)_U
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  ; get last Division selected by the user (spacebar recall)
 | 
|---|
| 83 |  S ACKDEF=$$FIND1^DIC(509850.83,",1,",""," ")
 | 
|---|
| 84 |  S ACKDEF=$S(ACKDEF:$$EXTERNAL^DILFD(509850.83,".01","",ACKDEF),1:"")
 | 
|---|
| 85 |  S ACKDEF=$$UC(ACKDEF) ; convert to uppercase
 | 
|---|
| 86 |  I ACKDEF'="",'$D(DIVARR(2,ACKDEF)) S ACKDEF=""
 | 
|---|
| 87 |  S ACKDFLT=$S(ACKDEF="":"",1:"2^"_ACKDEF)
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; multiple divisions exist, only one required.
 | 
|---|
| 90 |  I ACKTYP=1,DIVARR>1 D  G DIVX
 | 
|---|
| 91 |  . D SELECT^ACKQSEL(1,"DIVARR(2)","DIVARR(4)","DIVISION^35","D DIVHLP^ACKQUTL2",ACKDFLT)
 | 
|---|
| 92 |  . ; get Division IEN
 | 
|---|
| 93 |  . I $O(DIVARR(4,""))="" S ACKDIV="0^"_DIVARR Q  ; either quit or timed out
 | 
|---|
| 94 |  . S ACKDIVN=$O(DIVARR(4,"")),ACKN=DIVARR(2,ACKDIVN)
 | 
|---|
| 95 |  . S ACKIEN=$P(DIVARR(1,ACKN),U,1)
 | 
|---|
| 96 |  . D RECALL^DILFD(509850.83,ACKIEN_",1,",DUZ) ; save for spacebar recall
 | 
|---|
| 97 |  . S ACKDIV="1^"_DIVARR
 | 
|---|
| 98 |  . S ACKDIV(ACKIEN)=$P(DIVARR(1,ACKN),U,1,3)_U
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ; multiple divisions exist, user may select one/many or ALL.
 | 
|---|
| 101 |  I ACKTYP>1,DIVARR>1 D  G DIVX
 | 
|---|
| 102 |  . D SELECT^ACKQSEL(ACKTYP,"DIVARR(2)","DIVARR(4)","DIVISION^35","D DIVHLP^ACKQUTL2",ACKDFLT)
 | 
|---|
| 103 |  . ; get Division IEN
 | 
|---|
| 104 |  . I $G(DIVARR(4))'="" S ACKDIV="0^"_DIVARR Q  ;either quit or timed out
 | 
|---|
| 105 |  . S ACKDIV=U_DIVARR
 | 
|---|
| 106 |  . S ACKX="" F  S ACKX=$O(DIVARR(4,ACKX)) Q:ACKX=""  D
 | 
|---|
| 107 |  . . S $P(ACKDIV,U,1)=$P(ACKDIV,U,1)+1,ACKN=DIVARR(2,ACKX)
 | 
|---|
| 108 |  . . S ACKDIV($P(DIVARR(1,ACKN),U,1))=$P(DIVARR(1,ACKN),U,1,3)_U
 | 
|---|
| 109 |  . ; if only one selected then save for spacebar recall
 | 
|---|
| 110 |  . I +$P(ACKDIV,U,1)=1 D
 | 
|---|
| 111 |  . . S ACKIEN=$O(ACKDIV("")) Q:'ACKIEN
 | 
|---|
| 112 |  . . D RECALL^DILFD(509850.83,ACKIEN_",1,",DUZ) ; save for spacebar recall
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 | DIVX ; end
 | 
|---|
| 115 |  Q ACKDIV
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 | DIVHLP ; displays help text for the Division prompt
 | 
|---|
| 119 |  N X,DIWL,DIWR,DIWF
 | 
|---|
| 120 |  S DIWL=1,DIWR=80,DIWF=""
 | 
|---|
| 121 |  S X="     " D ^DIWP
 | 
|---|
| 122 |  S X="    Enter the name of a Division from the A&SP Site Parameters File." D ^DIWP
 | 
|---|
| 123 |  S X="    Enter '??' to see a list of the available Divisions, '^' to exit." D ^DIWP
 | 
|---|
| 124 |  D ^DIWW
 | 
|---|
| 125 |  Q
 | 
|---|
| 126 | LEADROLE(ACKVIEN) ; determine lead role for a visit
 | 
|---|
| 127 |  ;  prior to version 3.0 all visits would be filed with a Lead Role
 | 
|---|
| 128 |  ;  entered by the user (either the primary clinician, secondary
 | 
|---|
| 129 |  ;  clinician or other prov). With ver 3.0 this field is no longer
 | 
|---|
| 130 |  ;  populated and the lead role is the primary provider, or if absent
 | 
|---|
| 131 |  ;  the secondary provider. In order to be backward compatible this
 | 
|---|
| 132 |  ;  function will check the lead role field first. If it contains a 
 | 
|---|
| 133 |  ;  value then the visit must be pre-ver 3.0 and this code must be
 | 
|---|
| 134 |  ;  the lead role selected by the user. If the lead role field is
 | 
|---|
| 135 |  ;  empty then the visit must be post-ver 3.0 and so this function
 | 
|---|
| 136 |  ;  will return either the primary or secondary provider.
 | 
|---|
| 137 |  N ACKSECV2,ACKTGT,ACKMSG,ACKLEAD,ACKIENS,ACKPRIM,ACKSCND,ACKSTUD,ACKMSG1,ACKTGT1
 | 
|---|
| 138 |  N ACK2
 | 
|---|
| 139 |  S ACKIENS=ACKVIEN_","
 | 
|---|
| 140 |  D GETS^DIQ(509850.6,ACKIENS,".25;.27;6","I","ACKTGT","ACKMSG")
 | 
|---|
| 141 |  S ACKLEAD=ACKTGT(509850.6,ACKIENS,.27,"I")   ; Lead role (Pre V.3.)
 | 
|---|
| 142 |  I +ACKLEAD>0 Q +ACKLEAD
 | 
|---|
| 143 |  S ACKPRIM=ACKTGT(509850.6,ACKIENS,6,"I")     ; Primary clinician
 | 
|---|
| 144 |  I +ACKPRIM>0 Q +ACKPRIM
 | 
|---|
| 145 |  S ACKSECV2=ACKTGT(509850.6,ACKIENS,.25,"I")  ; Pre V.3 Sec'dry clinician
 | 
|---|
| 146 |  I +ACKSECV2>0 Q +ACKSECV2
 | 
|---|
| 147 |  ;
 | 
|---|
| 148 |  D LIST^DIC(509850.66,","_ACKVIEN_",",".01","I","*","","","","","","ACKTGT1","ACKMSG1")
 | 
|---|
| 149 |  S ACKSCND=$O(ACKTGT1("DILIST",1,""))
 | 
|---|
| 150 |  I ACKSCND'="" S ACKSCND=ACKTGT1("DILIST",1,ACKSCND)
 | 
|---|
| 151 |  Q +ACKSCND                     ;  First Secondary Provider V.3.
 | 
|---|
| 152 |  ;
 | 
|---|
| 153 | ASPDIV(ACKDIV) ; returns true if ACKDIV is a valid ASP division
 | 
|---|
| 154 |  N ACKTGT,ACKMSG,ACKFND
 | 
|---|
| 155 |  ; look for the Division on the Site Parameters file
 | 
|---|
| 156 |  D FIND^DIC(509850.83,",1,","","","`"_ACKDIV,1,"","","","ACKTGT","ACKMSG")
 | 
|---|
| 157 |  ; get number found
 | 
|---|
| 158 |  S ACKFND=$P($G(ACKTGT("DILIST",0)),U,1)
 | 
|---|
| 159 |  Q (ACKFND=1)
 | 
|---|
| 160 | CLNDIV(ACKCLN) ; returns the ien of the division that the clinic is in.
 | 
|---|
| 161 |  Q $$GET1^DIQ(44,ACKCLN_",",3.5,"I")
 | 
|---|
| 162 | ASPCLN(ACKCLN) ; returns true if ACKCLN is a valid clinic for ASP
 | 
|---|
| 163 |  ; ACKCLN is the internal entry number from the hospital locations file
 | 
|---|
| 164 |  ;  true returned if stop code is 203-Audiology, 204-Speech 
 | 
|---|
| 165 |  ;   if stop code is invalid then the credit stop code field must be either 203 or 204.
 | 
|---|
| 166 |  N ACKSTOP,ACKCRDT,ACKSC
 | 
|---|
| 167 |  ; get ien of stop code
 | 
|---|
| 168 |  S ACKSTOP=$$GET1^DIQ(44,ACKCLN_",",8,"I")
 | 
|---|
| 169 |  I ACKSTOP="" Q 0  ; bad clinic record
 | 
|---|
| 170 |  ; get actual stop code
 | 
|---|
| 171 |  S ACKSC=$$GET1^DIQ(40.7,ACKSTOP_",",1)
 | 
|---|
| 172 |  ; exit
 | 
|---|
| 173 |  I ACKSC=203 Q 1  ; audiology
 | 
|---|
| 174 |  I ACKSC=204 Q 1  ; speech pathology
 | 
|---|
| 175 |  ; get clinic credit stop code
 | 
|---|
| 176 |  S ACKCRDT=$$GET1^DIQ(44,ACKCLN_",",2503,"I")
 | 
|---|
| 177 |  I ACKCRDT="" Q 0 ; no credit stop code
 | 
|---|
| 178 |  ; get actual stop code
 | 
|---|
| 179 |  S ACKSC=$$GET1^DIQ(40.7,ACKCRDT_",",1)
 | 
|---|
| 180 |  ; exit
 | 
|---|
| 181 |  I ACKSC=203 Q 1  ; audiology
 | 
|---|
| 182 |  I ACKSC=204 Q 1  ; speech pathology
 | 
|---|
| 183 |  Q 0  ; any other value is invalid
 | 
|---|
| 184 | UC(X) ; convert X to uppercase
 | 
|---|
| 185 |  Q $TR(X,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
 | 
|---|
| 186 |  ;
 | 
|---|