SDVWHLE1 ;ENHANCED HL7 TRANSMIT DRIVERS (CONTINUED) FOR SDAPI and MAKE AN APPOINTMENT REQUEST 11/18/06
 ;;5.3;Scheduling;**502**;Aug 13, 1993  ;Build 14
 ; Copyright (C) 2007 WorldVistA
 ;
 ; This program is free software; you can redistribute it and/or modify
 ; it under the terms of the GNU General Public License as published by
 ; the Free Software Foundation; either version 2 of the License, or
 ; (at your option) any later version.
 ;
 ; This program is distributed in the hope that it will be useful,
 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ; GNU General Public License for more details.
 ;
 ; You should have received a copy of the GNU General Public License
 ; along with this program; if not, write to the Free Software
 ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 ;
TRNSMKPI(PATIENTN,SSN,SD1,SC,STYP,SDARRAY,OUTIN,MSGCTRL,SDVWNVAI) ;
 ;;
 ;;;
 ;;HL7TRANSMIT DRIVER FOR
 ; MAKE AN APPOINTMENT AS WITH ANALOGOUS $$EN^VWSDMKPI CALL
 ;
 ;
 ;HOWEVER, DATE/TIMES ARE EXTERNAL FORM,PATIENT SSN OR OTHER LOOKUP ID INSTEAD OF PATIENT DFN
 ;AND LOCATION (CLINIC) EXTERNAL NAMES INSTEAD OF INTERNAL IEN,
 ;
 ;
 ;;INPUT : MSGCTRL PASSED BY REFERENCE TO RECEIVE THIS BACK AFTER TRANSMITTING
 ;;THEN;
 ;
 ;SSN AS PATIENT SSN OR OTHER UNIQUE PATIENT LOOKUP ID INSTEAD OF DFN (REQUIRED)
 ;       PATIENTN PATIENT NAME (REQUIRED)
 ;;      SD1 APPOINTMENT DATE(EXTERNAL FORMAT)(REQUIRED)
 ;;;     SC CLINIC FOR APPOINTMENT(EXTERNAL FORMAT) (REQUIRED)
 ;;;;    STYP =(REQUIRED)
 ;;;;;        =1 c&p
 ;            =2 10-10
 ;            =3 SCHEDULED APPOINTMENT
 ;            =4 UNSCHEDULED VISIT
 ;     OUTIN= "O" for oupatient or "I" for inpatient
 ;     SDARRAY AS DEFINED BELOW ( WITH DATE/TIMES IN EXTERNAL DATE/TIME FORMAT)
 ;     (PASSED ARRAYS WITH NUMERIC INFO W/O QUOTES AND NON-NUMERIC ENCLOSED WITH QUOTES)
 ;     SDVWNVAI  OPTIONAL PASSED ARGUMENT WITH VALUES AS DEFINED BELOW REGARDING ICN CONNECTION
 ;
 ;
 ;;;;;OUTPUT;;;;;       Q
 ;"NEW MESSAGE ERROR"
 ;;        "PID"
 ;         "PV1"
 ;         "PV2"
 ;         "NTE"_INDEX
 ;         "STYP"
 ;         "HOSPLOC"
 ;
 ;       EXAMPLE AS IF ANALOGOUS CALL MADE AS BELOW:
 ;
 ;;       N DFN(SSN AND PATIENT NAME INSTEAD),SD1,SC(HOSP LOCATION
 ;;       (CLINIC) EXT FORMAT NAME INSTEAD,STYP,
 ;       N SDARRAY (DATE/TIMES IN EXTERNAL FORMAT),IER
 ;       N SDVWNVAI ; EXIST AS NON-VA RELATED PFSS EVENT MODE
 ;                                = "D" DISABLING THE NEED FOR ICN
 ;                                = "O" AS OTHER NON-VA ICN SYSTEM ( FUTURE)
 ;       S XQORMUTE = 1    ;SILENT MODE FOR NON-INTERACTIVE MODE W/O WRITE IN XQOR ROUTINES
 ;       S SDVWNVAI = "D"  ; NON-VA TESTING HERE WITH DISABLING THE NEED FOR ICN
 ;       S SSN=100001234 ; DFN=1
 ;       S SD1="JAN 23, 2007@09:30"; SD1=3070123.0930 
 ;       S SC="RADIOLOGY CLINIC" ; S SC=3 
 ;       S STYP=3
 ;       S OUTIN="O" for outpatient clinic
 ;       S SDARRAY("DATE NOW")= "DATE NOW" ; D NOW^%DTC S X2=X\1 S Y=X2 D DD^%DT S SDARRAY("DATE NOW")=Y 
 ;       S SDARRAY("APPT TYPE")=9
 ;       S SDARRAY("SCHED_REQ_TYPE")="O"
 ;       S SDARRAY("NEXT APPT IND")=0
 ;       S SDARRAY("FOLLOWUP VISIT INDICATOR")=0  ; 0 FOR NO
 ;       S SDARRAY("DATA ENTRY CLERK")="NEW PERSON NAME" ; DUZ
 ;       ;THEN PARAMETERS CONVERTED TO INTERNAL VALUE
 ;       S IER=$$EN^SDVWMKPI(DFN,SD1,SC,STYP,.SDARRAY)
 ;
 ;
 ;    SDARRAY ELEMENT DEFINITIONS FOLLOW:
 ;
 ;
 ;
 ;
 ;       SDARRAY("DATE NOW") (REQ AT TIME REQUEST MADE)
 ;
 ;       SDARRAY("LAB DATE TIME ASSOCIATED") =
 ;               "" OR DATE/TIME     (OPTIONAL)
 ;
 ;       SDARRAY("X-RAY DATE TIME ASSOCIATED") =
 ;               "" OR DATE/TIME    (OPTIONAL)
 ;               
 ;       SDARRAY("EKG DATE TIME ASSOCIATED") =
 ;               "" OR DATE/TIME     (OPTIONAL)
 ;
 ;       SDARRAY("APPT TYPE") = 9   (REQUIRED)
 ;              9 for REGULAR APPOINTMENT TYPE
 ;              ptr 409.1
 ;       SDARRAY("APPT SUB-CATEGORY") = "0" (NOT USED)
 ;              "0" for none
 ;              ptr 35.2
 ;
 ;;       SDARRAY("SCHED_REQ_TYPE")='O' (REQUIRED)
 ;             'O' FOR OTHER THAN 'NEXT AVA.' APPT.;
 ;              set of codes
 ;       SDARRAY("NEXT APPT IND")=0 (REQUIRED)
 ;              0 FOR NO
 ;       SDARRAY("DESIRED DATE TIME OF APPT")=SD (OPTIONAL)
 ;       SDARRAY("FOLLOWUP VISIT INDICATOR")= (REQUIRED)
 ;               "0" FOR NO
 ;               "1" FOR YES
 ;
 ;
 ;
 ;       SDARRAY("X RAY DATA FREE TEXT")=  (OPTIONAL)
 ;       SDARRAY("OTHER DATA FREE TEXT")=  (OPTIONAL)
 ;       SDARRAY("OTHER WARD LOCATION")=   (OPTIONAL)
 ;
 ;
 ;       SDARRAY("DATA ENTRY CLERK")=       (REQUIRED)
 ;               DUZ OF NEW PERSON (FILE 200) PTR
 ;
 ;       SDARRAY("PRIOR XRAY RESULTS TO CLINIC")= (OPTIONAL)
 ;            "Y" OR ""
 ;
 ;
 ;       SDARRAY("CHECKED-IN DATE")=  (OPTIONAL)
 ;            "" OR DATE APPOINTMENT MADE
 ;            FOR AN UNSCHEDULED VISIT
 ;
 ;            VWSDNVAI ; (OPTIONAL) EXIST AS NON-VA RELATED PFSS EVENT MODE
 ;                              = "D" DISABLING THE NEED FOR ICN
 ;                              = "O" AS OTHER NON-VA ICN SYSTEM ( FUTURE)
 ;
 ;
 N APPARMS,HLSTATS,ERROR,SEG,WHO
 N HLMSTATE,ERROR,INDEX,CONSTRUC,IFLAG,ERR
 N X,INTE,HOSPLOC,Y
 ;
 ;
 ;;BUILD PARAMETERS
 S APPARMS("COUNTRY")="USA"
 S APPARMS("FIELD SEPARATOR")="|"
 S APPARMS("ENCODING CHARACTERS")="^~\&"
 S APPARMS("VERSION")=2.4
 S APPARMS("MESSAGE TYPE")="ADT"
 S APPARMS("EVENT")="A08" ; PATIENT UPDATE
 S ERR=""
 S ERROR=""
 ;
 ;;CREATE NEW MESSAGE
 ;;
 I '$$NEWMSG^HLOAPI(.APPARMS,.HLMSTATE,.ERROR) Q "NEW MESSAGE ERROR"
 ;
 ;
 ;Use message control ID in MSH segment for sync flag
 ;
 ;
 ;CREATE SEGMENT
 D SET^HLOAPI(.SEG,"PID",0)
 D SET^HLOAPI(.SEG,SSN,3)
 D SET^HLOAPI(.SEG,PATIENTN,5)
 D SET^HLOAPI(.SEG,SSN,19)
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"PID"
 ;
 ;
 ;
 ;;CREATE SEGMENT
 ;
 D SET^HLOAPI(.SEG,"PV1",0)
 D SET^HLOAPI(.SEG,OUTIN,2) ;"O" or "I" oupatient or inpatient
 ;D SET^HLOAPI(.SEG,IEN,3) ;HOSP LOC IEN NOT AVAILABLE
 D SET^HLOAPI(.SEG,SDARRAY("APPT TYPE"),4) ;ADMISSION TYPE (APPOINTMENT TYPE)
 D SET^HLOAPI(.SEG,STYP,10) ; HOSPITAL SERVICE (PURPOSE OF  VISIT)
 ;CONVERT EXTERNAL DATE/TIME TO FM INTERNAL, THEN TO HL7
 S X=SD1 S %DT="T" D ^%DT S INTE=Y  ;EXT TO FM INTERNAL
 ;
 D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(INTE,"TS"),44) ; DATE/TIME TO MAKE APPT
 ;
 ;; ADD SEGMENT
 ;;
 ;TEMP BELOW;
 ;S X=$P(SDARRAY(1),";",1) D ^%DT S INTE=Y  ;EXT TO FM INTERNAL
 ;D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(INTE,"TS"),2) ;WHEN START DATE
 ;;
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"PV1"
 ;
 ;
 ;CREATE SEGMENT
 ;
 D SET^HLOAPI(.SEG,"PV2",0)
 I $D(SDARRAY("DESIRED DATE TIME OF APPT"))>0 D
 .S X=SDARRAY("DESIRED DATE TIME OF APPT") S %DT="T" D ^%DT S INTE=Y  ;EXT TO FM INTERNAL
 .D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(INTE,"TS"),8) ;EXPECTED(DESIRED) DATE/TIME OF VISIT
 E  D
 .S X=SD1 S %DT="T" D ^%DT S INTE=Y  ;EXT TO FM INTERNAL
 .D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(INTE,"TS"),8) ;EXPECTED(DESIRED) DATE/TIME OF VISIT
 S X=SDARRAY("DATE NOW") D ^%DT S INTE=Y\1  ;EXT TO FM INTERNAL
 D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(INTE,"TS"),46) ;EXPECTED(DESIRED) DATE/TIME OF VISIT
 ;
 ;ADD SEGMENT TO MESSAGE
 ;
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"PV2"
 ;
 ;
 ;
 ;CREATE NTE SEGMENT FOR STYP
 ;
 D SET^HLOAPI(.SEG,"NTE",0)
 D SET^HLOAPI(.SEG,"STYP="_STYP,3)
 ;
 ;; ADD SEGMENT
 ;
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"STYP"
 ;
 ;
 ;
 ;
 ;
 ;CREATE NTE SEGMENT FOR SC HOSPITAL LOCATION (CLINIC)
 ;
 D SET^HLOAPI(.SEG,"NTE",0)
 D SET^HLOAPI(.SEG,"SDLOCATE="_""""_SC_"""",3)
 ;
 ;; ADD SEGMENT
 ;
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"HOSPLOC"
 ;
 ;
 ;
 ;
 ;CREATE NTE SEGMENTS FROM SDARRAY ELEMENTS
 S INDEX=0
 F  S INDEX=$O(SDARRAY(INDEX)) Q:INDEX=""  D
 .D SET^HLOAPI(.SEG,"NTE",0)
 .I INDEX=+INDEX S CONSTRUC="SDARRAY("_INDEX_")="
 .I INDEX'=+INDEX S CONSTRUC="SDARRAY("_""""_INDEX_""""_")="
 .I SDARRAY(INDEX)=+SDARRAY(INDEX) S CONSTRUC=CONSTRUC_SDARRAY(INDEX)
 .I SDARRAY(INDEX)'=+SDARRAY(INDEX) S CONSTRUC=CONSTRUC_""""_SDARRAY(INDEX)_""""
 .D SET^HLOAPI(.SEG,CONSTRUC,3) ; COMMENTS STORING SDARRAY(?)ARRAY ELEMENT
 .;
 .;ADD SEGMENT TO MESSAGE
 .;
 .S IFLAG=0
 .I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S IFLAG="NTE"_INDEX
 .;
 .I IFLAG'=0 Q
 I IFLAG'=0 Q IFLAG
 ;
 ; NOW OPTIONAL NTE SEGMENT IF SDVWNVAI IS DEFINED
 ;
 I $D(SDVWNVAI) D
 .;
 .;CREATE NTE SEGMENT FOR SDVWNVAI
 .;
 .D SET^HLOAPI(.SEG,"NTE",0)
 .D SET^HLOAPI(.SEG,"SDVWNVAI="_SDVWNVAI,3)
 .;
 .;; ADD SEGMENT
 .;
 .I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR=ERR_"^"_"SDVWNVAI"
 .;
 .;
 .;
 ;
 ; DEFINE SENDING AND RECEIVING PARAMETERS
 S APPARMS("SENDING APPLICATION")="VWSD HLO EXT"
 S APPARMS("ACCEPT ACK TYPE")="NE" ;"AL" ;"NE" ;"AL"
 ;S APPARMS("APP ACK RESPONSE")="APPACKRR^SDVWHLEX"
 ;S APPARMS("ACCEPT ACK RESPONSE")="MSGPROC^SDVWHLEX"
 ;REVERSE BELOW 
 S APPARMS("ACCEPT ACK RESPONSE")="APPACKRR^SDVWHLEX" ; WHEN COMIT ACK , SU OR AE RETURN MADE
 S APPARMS("APP ACK RESPONSE")="MSGPROC^SDVWHLEX" ; WHEN NO ACK RETURN MADE
 S APPARMS("APP ACK TYPE")="NE" ;"AL" ;"NE" ;"AL"
 S WHO("RECEIVING APPLICATION")="VWSD RECEIVER"
 S WHO("FACILITY LINK NAME")="VWSDTSMML"
 ;
 ;SEND MESSAGE
 ;
 I '$$SENDONE^HLOAPI1(.HLMSTATE,.APPARMS,.WHO,.ERROR) Q "ERR="_ERR_" ERROR="_ERROR
 S MSGCTRL=HLMSTATE("HDR","MESSAGE CONTROL ID") ;HLMSTATE("ID")
 Q "OK"
