| 1 | QACVEMPX ; OAKOIFO/TKW - Return Person Data, called by RPC ;9/25/07  14:14
 | 
|---|
| 2 |  ;;2.0;Patient Representative;**19,21**;07/25/1995;Build 5
 | 
|---|
| 3 | EN(PATSBY,LKUPVAL,PATSROWS,PATSFRM0,PATSFRM1)        ; Lookup Employee by Name, then
 | 
|---|
| 4 |  ; Output XML formatted data from NEW PERSON file.
 | 
|---|
| 5 |  ; PATSBY contains the name of the output array (pass by reference)
 | 
|---|
| 6 |  ; LKUPVAL is the name of the person to be matched (LAST,FIRST), or
 | 
|---|
| 7 |  ;         an array of Security Keys.
 | 
|---|
| 8 |  ; PATSROWS=Number of rows to return in each call
 | 
|---|
| 9 |  ; PATSFRM0=Employee Name value from previous call (empty on first call, pass by ref)
 | 
|---|
| 10 |  ; PATSFRM1=Employee IEN from previous call (empty on first call, pass by ref)
 | 
|---|
| 11 |  K ^TMP("DILIST",$J),^TMP("PatsPersonXml",$J)
 | 
|---|
| 12 |  N STDNAME,ULASTNM,NAMECOMP,IENS,PIECE,OUTCNT,TAGLIST,FROM,PART,SRVIEN,MAILCODE,TITLE,SRVRSTA,PATSMORE,PATSERR,DIERR,I,J,X,Y
 | 
|---|
| 13 |  ; If LKUPVAL exists, it contains an employee name, find partial matches.
 | 
|---|
| 14 |  I $G(LKUPVAL)]"" D
 | 
|---|
| 15 |  . S ULASTNM=$P(LKUPVAL,",")
 | 
|---|
| 16 |  . D LOOKUP1
 | 
|---|
| 17 |  . I (ULASTNM[" ")!(ULASTNM["'") D LOOKUP2
 | 
|---|
| 18 |  . Q
 | 
|---|
| 19 |  ; Else, it contains an array of Security Key values, find all
 | 
|---|
| 20 |  ; holders of those keys.
 | 
|---|
| 21 |  I $G(LKUPVAL)="" D
 | 
|---|
| 22 |  . D EN^QACVKHLD(.LKUPVAL,PATSROWS,.PATSFRM0,.PATSFRM1)
 | 
|---|
| 23 |  . S FROM(1)=$G(PATSFRM0),FROM(2)=$G(PATSFRM1)
 | 
|---|
| 24 |  . S PATSMORE=$S(FROM(1)="":0,1:1)
 | 
|---|
| 25 |  . Q
 | 
|---|
| 26 |  I '$D(^TMP("DILIST",$J)),'$D(^TMP("DIERR",$J)) Q
 | 
|---|
| 27 |  S PATSERR="" I $D(^TMP("DIERR",$J)) S PATSERR=$G(^TMP("DIERR",$J,1,"TEXT",1))
 | 
|---|
| 28 |  ; Get Station Number of Institution where server resides (IA #1518)
 | 
|---|
| 29 |  S SRVRSTA=$$STA^XUAF4(+$$GET1^DIQ(8989.3,1,217,"I"))
 | 
|---|
| 30 |  ; Set name of output array into output parameter.
 | 
|---|
| 31 |  S PATSBY=$NA(^TMP("PatsPersonXml",$J))
 | 
|---|
| 32 |  ; Now build the output.
 | 
|---|
| 33 |  D HDR
 | 
|---|
| 34 |  S OUTCNT=2
 | 
|---|
| 35 |  D EN2(.OUTCNT),FOOTER(.OUTCNT)
 | 
|---|
| 36 |  Q
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ;
 | 
|---|
| 39 | LOOKUP1 ; Use current routine to standardize the name (IA #3065)
 | 
|---|
| 40 |  ; (name may contain spaces or apostrophes).
 | 
|---|
| 41 |  S STDNAME=LKUPVAL
 | 
|---|
| 42 |  I '$G(PATSROWS) S PATSROWS=10
 | 
|---|
| 43 |  S PATSMORE=0
 | 
|---|
| 44 |  I STDNAME["," S STDNAME=$$FORMAT^XLFNAME7(.STDNAME,1,35,,,,,1)
 | 
|---|
| 45 |  E  S STDNAME=$$FORMAT^XLFNAME7(.STDNAME,1,35,,0,,1,1)
 | 
|---|
| 46 |  ; If we've already found all matches to current standard, get out.
 | 
|---|
| 47 |  N QOUT S QOUT=0
 | 
|---|
| 48 |  I (ULASTNM[" ")!(ULASTNM["'") D  Q:QOUT
 | 
|---|
| 49 |  . S X=$P($G(PATSFRM0),",")
 | 
|---|
| 50 |  . Q:X=""
 | 
|---|
| 51 |  . I (X[" ")!(X["'") Q
 | 
|---|
| 52 |  . S QOUT=1 Q
 | 
|---|
| 53 |  ; Get list of matching names.
 | 
|---|
| 54 |  D GETLIST(STDNAME,PATSROWS,.PATSFRM0,.PATSFRM1,.PATSMORE,.FROM)
 | 
|---|
| 55 |  Q
 | 
|---|
| 56 | LOOKUP2 ; Use old routine to standardize the name (no punctuation
 | 
|---|
| 57 |  ; except hyphens).)
 | 
|---|
| 58 |  ; Quit if the maximum number of names has been found.
 | 
|---|
| 59 |  Q:PATSMORE
 | 
|---|
| 60 |  ; Convert user input using old standardization routine
 | 
|---|
| 61 |  S STDNAME=LKUPVAL
 | 
|---|
| 62 |  D STDNAME^XLFNAME(.STDNAME,"FG")
 | 
|---|
| 63 |  ; Find enough names to fill the list
 | 
|---|
| 64 |  N NEWROWS
 | 
|---|
| 65 |  S NEWROWS=PATSROWS-$P($G(^TMP("DILIST",$J,0)),"^")
 | 
|---|
| 66 |  ; If list is already full, see whether there are more names
 | 
|---|
| 67 |  ; using the old standardization, then quit.
 | 
|---|
| 68 |  I NEWROWS'>0 D  Q
 | 
|---|
| 69 |  . I $D(^VA(200,"B",STDNAME)) S NEWROWS=1
 | 
|---|
| 70 |  . E  S X=$O(^VA(200,"B",STDNAME)) I $E(X,1,$L(STDNAME))=STDNAME S NEWROWS=1
 | 
|---|
| 71 |  . I NEWROWS=1 S PATSMORE=1,FROM(1)=STDNAME,FROM(2)=""
 | 
|---|
| 72 |  . Q
 | 
|---|
| 73 |  ; Save off names found using current name standardization.
 | 
|---|
| 74 |  K ^TMP("QACOLD",$J)
 | 
|---|
| 75 |  I $D(^TMP("DILIST",$J)) D
 | 
|---|
| 76 |  . M ^TMP("QACOLD",$J)=^TMP("DILIST",$J)
 | 
|---|
| 77 |  . K ^TMP("QACOLD",$J,0) Q
 | 
|---|
| 78 |  K ^TMP("DILIST",$J)
 | 
|---|
| 79 |  ; Get new list of matching names.
 | 
|---|
| 80 |  D GETLIST(STDNAME,NEWROWS,.PATSFRM0,.PATSFRM1,.PATSMORE,.FROM)
 | 
|---|
| 81 |  ; Merge the two lists into ^TMP("DILIST",$J).
 | 
|---|
| 82 |  S I=$O(^TMP("QACOLD",$J,PATSROWS+1),-1)
 | 
|---|
| 83 |  I I D
 | 
|---|
| 84 |  . S X=$P($G(^TMP("DILIST",$J,0)),"^")
 | 
|---|
| 85 |  . I X F J=1:1:X I $D(^TMP("DILIST",$J,J,0)) S ^TMP("QACOLD",$J,(I+J),0)=^TMP("DILIST",$J,J,0) K ^TMP("DILIST",$J,J,0)
 | 
|---|
| 86 |  . M ^TMP("DILIST",$J)=^TMP("QACOLD",$J)
 | 
|---|
| 87 |  . S $P(^TMP("DILIST",$J,0),"^")=X+I
 | 
|---|
| 88 |  . K ^TMP("QACOLD",$J)
 | 
|---|
| 89 |  . Q
 | 
|---|
| 90 |  Q 
 | 
|---|
| 91 | GETLIST(STDNAME,PATSROWS,PATSFRM0,PATSFRM1,PATSMORE,FROM) ; Get a list of names matching STDNAME
 | 
|---|
| 92 |  N FIRST,LAST,LEN,SCR,CURRDT
 | 
|---|
| 93 |  S LAST=$P(STDNAME,","),FIRST=$P(STDNAME,",",2,99)
 | 
|---|
| 94 |  S CURRDT=$$DT^XLFDT()
 | 
|---|
| 95 |  ; Screen out terminated users.
 | 
|---|
| 96 |  S SCR="I ($P(^(0),""^"",11)=""""!(CURRDT<$P(^(0),""^"",11)))"
 | 
|---|
| 97 |  ; If first name was passed, check for it with a screen.
 | 
|---|
| 98 |  S LEN=$L(FIRST) I LEN>0 S SCR=SCR_",$E($P($P(^(0),""^""),"","",2,99),1,"_LEN_")="_""""_FIRST_""""
 | 
|---|
| 99 |  ; Set the starting values, and partial match values.
 | 
|---|
| 100 |  I $G(PATSFRM0)="" S FROM(1)=LAST,FROM(2)=""
 | 
|---|
| 101 |  E  S FROM(1)=PATSFRM0,FROM(2)=$G(PATSFRM1)
 | 
|---|
| 102 |  S PART(1)=LAST
 | 
|---|
| 103 |  ; Return list of standard name pointer, title and mail code (IA #10060)
 | 
|---|
| 104 |  D LIST^DIC(200,,"@;8;28","MP",PATSROWS,.FROM,.PART,"B",SCR)
 | 
|---|
| 105 |  ; Set flag telling whether there are more entries to fetch).
 | 
|---|
| 106 |  S PATSMORE=$S(FROM(1)="":0,1:1)
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 |  ;
 | 
|---|
| 109 | HDR ; Build header node
 | 
|---|
| 110 |  S ^TMP("PatsPersonXml",$J,1)="<?xml version=""1.0"" encoding=""utf-8""?>"
 | 
|---|
| 111 |  S ^TMP("PatsPersonXml",$J,2)="<PersonDataSet hasMore="""_PATSMORE_""" patsFrom0="""_FROM(1)_""" patsFrom1="""_FROM(2)_""" vistAError="""_PATSERR_""">"
 | 
|---|
| 112 |  Q
 | 
|---|
| 113 |  ;
 | 
|---|
| 114 | EN2(OUTCNT) ; Build output for individual persons.
 | 
|---|
| 115 |  N TAGLIST,IENS,TITLE,MAILCODE,NAMECOMP,I,J,X,Y
 | 
|---|
| 116 |  ; Build list of XML tags to use in output.
 | 
|---|
| 117 |  D BLDLST(.TAGLIST)
 | 
|---|
| 118 |  ; Read through lister results and build output
 | 
|---|
| 119 |  F I=0:0 S I=$O(^TMP("DILIST",$J,I)) Q:'I  S X=$G(^(I,0)) D
 | 
|---|
| 120 |  . S OUTCNT=OUTCNT+1
 | 
|---|
| 121 |  . S ^TMP("PatsPersonXml",$J,OUTCNT)="<PatsPerson>"
 | 
|---|
| 122 |  . S IENS=$P(X,"^") Q:IENS=""  S IENS=IENS_","
 | 
|---|
| 123 |  . ; NOTE: removes reserved XML characters (see $$SYMENC^MXMLUTL, IA#4153)
 | 
|---|
| 124 |  . S TITLE=$$SYMENC^MXMLUTL($E($P(X,"^",2),1,30))
 | 
|---|
| 125 |  . S MAILCODE=$$SYMENC^MXMLUTL($E($P(X,"^",3),1,30))
 | 
|---|
| 126 |  . ; Get the individual name components and add them to the output (IA #3065)
 | 
|---|
| 127 |  . K NAMECOMP
 | 
|---|
| 128 |  . S NAMECOMP=$P($G(^VA(200,+IENS,0)),"^")
 | 
|---|
| 129 |  . ; If name contains apostrophes or spaces, use current standardization
 | 
|---|
| 130 |  . I ($P(NAMECOMP,",")["'")!($P(NAMECOMP,",")[" ") D
 | 
|---|
| 131 |  .. S NAMECOMP=$$FORMAT^XLFNAME7(.NAMECOMP,1,35,,,,,2)
 | 
|---|
| 132 |  .. S NAMECOMP=NAMECOMP("FAMILY")_"^"_NAMECOMP("GIVEN")_"^"_NAMECOMP("MIDDLE")_"^"_NAMECOMP("SUFFIX")
 | 
|---|
| 133 |  .. Q
 | 
|---|
| 134 |  . ; Else, use old standardization routine.
 | 
|---|
| 135 |  . E  D
 | 
|---|
| 136 |  .. K NAMECOMP S NAMECOMP("FILE")=200,NAMECOMP("FIELD")=.01,NAMECOMP("IENS")=IENS
 | 
|---|
| 137 |  .. S NAMECOMP=$$HLNAME^XLFNAME(.NAMECOMP,"S")
 | 
|---|
| 138 |  . F J=1:1:6 D
 | 
|---|
| 139 |  .. S OUTCNT=OUTCNT+1
 | 
|---|
| 140 |  .. S Y=$P(NAMECOMP,"^",J)
 | 
|---|
| 141 |  .. S ^TMP("PatsPersonXml",$J,OUTCNT)="<"_TAGLIST(J)_">"_Y_"</"_TAGLIST(J)_">"
 | 
|---|
| 142 |  .. Q
 | 
|---|
| 143 |  . S OUTCNT=OUTCNT+1
 | 
|---|
| 144 |  . S ^TMP("PatsPersonXml",$J,OUTCNT)="<Title>"_TITLE_"</Title>"
 | 
|---|
| 145 |  . S OUTCNT=OUTCNT+1
 | 
|---|
| 146 |  . S ^TMP("PatsPersonXml",$J,OUTCNT)="<MailCode>"_MAILCODE_"</MailCode>"
 | 
|---|
| 147 |  . S OUTCNT=OUTCNT+1
 | 
|---|
| 148 |  . S ^TMP("PatsPersonXml",$J,OUTCNT)="<VistaIen>"_$P(X,"^")_"</VistaIen>"
 | 
|---|
| 149 |  . S OUTCNT=OUTCNT+1
 | 
|---|
| 150 |  . S ^TMP("PatsPersonXml",$J,OUTCNT)="</PatsPerson>"
 | 
|---|
| 151 |  . Q
 | 
|---|
| 152 |  Q
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 | FOOTER(OUTCNT) ; Add the footer
 | 
|---|
| 155 |  S ^TMP("PatsPersonXml",$J,OUTCNT+1)="</PersonDataSet>"
 | 
|---|
| 156 |  K ^TMP("DILIST",$J)
 | 
|---|
| 157 |  Q
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 | CONV(NAMEPART) ; Convert a name part to mixed case
 | 
|---|
| 160 |  N LEN,TEMP,UPPER,I,X
 | 
|---|
| 161 |  S LEN=$L(NAMEPART),UPPER=1,TEMP=""
 | 
|---|
| 162 |  F I=1:1:LEN S X=$E(NAMEPART,I,I) D
 | 
|---|
| 163 |  . I UPPER=1 D
 | 
|---|
| 164 |  .. I X?1L S X=$C($A(X)-32)
 | 
|---|
| 165 |  .. S UPPER=0 Q
 | 
|---|
| 166 |  . E  I X?1U S X=$C($A(X)+32)
 | 
|---|
| 167 |  . S TEMP=TEMP_X
 | 
|---|
| 168 |  . I X'?1L,X'?1U S UPPER=1
 | 
|---|
| 169 |  . Q
 | 
|---|
| 170 |  Q TEMP
 | 
|---|
| 171 |  ;
 | 
|---|
| 172 | BLDLST(TAGLIST) ; Build list of XML data tags
 | 
|---|
| 173 |  S TAGLIST(1)="LastName"
 | 
|---|
| 174 |  S TAGLIST(2)="FirstName"
 | 
|---|
| 175 |  S TAGLIST(3)="MiddleName"
 | 
|---|
| 176 |  S TAGLIST(4)="NameSuffix"
 | 
|---|
| 177 |  S TAGLIST(5)="NamePrefix"
 | 
|---|
| 178 |  S TAGLIST(6)="Degree"
 | 
|---|
| 179 |  Q
 | 
|---|
| 180 |  ;
 | 
|---|