MHV7BU	;WAS/EFJ - HL7 message builder UTILITY ; [12/14/06 11:10am]
	;;1.0;My HealtheVet;**2**;Aug 23, 2005;Build 22
	;;Per VHA Directive 2004-038, this routine should not be modified.
	;
	; Utilities common to message and segment builders.
	;
	Q
	;
PID3(PID,ICN,DFN,SSN)	;Build PID3 - Patient Identifier List
	;  Populates PID array with Patient Identifier List Entries for 
	; ICN, DFN, and SSN.
	;
	;  Integration Agreements:
	;        10112 : $$SITE^VASITE
	;
	;  Input:
	;     ICN, DFN, SSN - Identifiers
	;
	;  Output:
	;     PID - PID array
	;
	N STATION,IDCNT
	S STATION=$P($$SITE^VASITE,"^",3)
	S IDCNT=0
	I ICN'="" D
	. S IDCNT=IDCNT+1
	. S PID(3,IDCNT,1)=ICN                 ;Patient ID - ICN
	. S PID(3,IDCNT,4,1)="USVHA"           ;assigning authority ID
	. S PID(3,IDCNT,4,3)="HL70363"         ;assigning authority type
	. S PID(3,IDCNT,5)="NI"                ;Patient ID type
	. S PID(3,IDCNT,6,1)="VA FACILITY ID"  ;assigning facility
	. S PID(3,IDCNT,6,2)=STATION           ;Station number
	. S PID(3,IDCNT,6,3)="L"               ;facility ID type
	;
	I DFN'="" D
	. S IDCNT=IDCNT+1
	. S PID(3,IDCNT,1)=DFN                 ;Patient ID - DFN
	. S PID(3,IDCNT,4,1)="USVHA"           ;assigning authority ID
	. S PID(3,IDCNT,4,3)="HL70363"         ;assigning authority type
	. S PID(3,IDCNT,5)="PI"                ;Patient ID type
	. S PID(3,IDCNT,6,1)="VA FACILITY ID"  ;assigning facility
	. S PID(3,IDCNT,6,2)=STATION           ;Station number
	. S PID(3,IDCNT,6,3)="L"               ;facility ID type
	;
	I SSN'="" D
	. S IDCNT=IDCNT+1
	. S PID(3,IDCNT,1)=SSN                 ;Patient ID - SSN
	. S PID(3,IDCNT,4,1)="USSSA"           ;assigning authority ID
	. S PID(3,IDCNT,4,3)="HL70363"         ;assigning authority type
	. S PID(3,IDCNT,5)="SS"                ;Patient ID type
	. S PID(3,IDCNT,6,1)="VA FACILITY ID"  ;assigning facility
	. S PID(3,IDCNT,6,2)=STATION           ;Station number
	. S PID(3,IDCNT,6,3)="L"               ;facility ID type
	Q
	;
FMTNAME(NAME,SUBSEG,HL,DATATYPE)	;Format comma/space delimited name
	;  Populates SUBSEG array with formatted and escaped name components
	; based on the DATATYPE passed.  XCN types and XPN types differ in
	; that XCN has an ID in the first component effectively shifting the
	; name components by one.
	;
	;  Integration Agreements:
	;         3065 : NAMEFMT^XLFNAME
	;
	;  Input:
	;         NAME - FileMan formatted name  Ex: PATIENT,FIRST M
	;           HL - HL7 package array variable
	;     DATATYPE - HL7 data type to be formatted Ex: XCN, XPN
	;
	;  Output:
	;       SUBSEG - Array to hold the formatted name.
	;
	; Example Usage:
	;      S NAME="SMITH,BOB A"
	;      K NMARR
	;      D FMTNAME^MHV7BU(NAME,.NMARR,.HL,"XCN")
	;      M PD1(4,1)=NMARR
	;
	N OFFSET
	S OFFSET=(DATATYPE="XCN")
	S NAME=$$NAMEFMT^XLFNAME(.NAME,"F","DSP")
	S SUBSEG(1+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",1),.HL)  ;family
	S SUBSEG(2+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",2),.HL)  ;given
	S SUBSEG(3+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",3),.HL)  ;middle
	S SUBSEG(4+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",4),.HL)  ;suffix
	S SUBSEG(5+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",5),.HL)  ;prefix
	S SUBSEG(6+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",6),.HL)  ;degree
	Q
	;
FMTNAME2(IEN,FILE,SUBSEG,HL,DATATYPE)	;Lookup and format name
	;  Looks up name components based on IEN and FILE passed.
	; Populates SUBSEG array with formatted and escaped name components
	; based on the DATATYPE passed.  XCN types and XPN types differ in
	; that XCN has an ID in the first component effectively shifting the
	; name components by one.
	;
	;  Integration Agreements:
	;         3065 : NAMEFMT^XLFNAME
	;
	;  Input:
	;          IEN - IEN of patient/person in FILE
	;         FILE - File number of file   Ex: 2 - PATIENT file
	;           HL - HL7 package array variable
	;     DATATYPE - HL7 data type to be formatted Ex: XCN, XPN
	;
	;  Output:
	;       SUBSEG - Array to hold the formatted name.
	;
	; Example Usage:
	;      K NMARR
	;      D FMTNAME^MHV7BU(DFN,2,.NMARR,.HL,"XPN")
	;      M PID(5,1)=NMARR
	;
	N NAME,OFFSET
	S OFFSET=(DATATYPE="XCN")
	S NAME("FILE")=FILE,NAME("FIELD")=.01,NAME("IENS")=IEN_","
	S NAME=$$NAMEFMT^XLFNAME(.NAME,"F","DSP")
	S SUBSEG(1+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",1),.HL)  ;family
	S SUBSEG(2+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",2),.HL)  ;given
	S SUBSEG(3+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",3),.HL)  ;middle
	S SUBSEG(4+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",4),.HL)  ;suffix
	S SUBSEG(5+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",5),.HL)  ;prefix
	S SUBSEG(6+OFFSET)=$$ESCAPE^MHV7U($P(NAME," ",6),.HL)  ;degree
	Q
	;
FMTHL7(DT)	;Convert Fileman formatted dates to HL7 format
	; Handles imprecise dates properly because $$FMTHL7^XLFDT does not.
	; Strips Timezone offset
	;
	;  Integration Agreements:
	;        10103 : FMTHL7^XLFDT
	;
	;  Input:
	;     DT - Fileman formatted date/time
	;
	;  Output:  Returns HL7 formatted date/time
	;
	S DT=$$FMTHL7^XLFDT(DT)
	I $E(DT,7,8)="00" S DT=$E(DT,1,6)
	I $E(DT,5,6)="00" S DT=$E(DT,1,4)
	S DT=$P(DT,"-")
	S DT=$P(DT,"+")
	Q DT
	;
