SDVWHLI3 ;ENHANCED HL7 RECEIVE APPLICATION DRIVER (CONTINUED)  FOR SDAPI and MAKE AN APPOINTMENT API 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
 ;
CYCLE(SDDFN,SDCLIEN,SDDATE,SDAPPT,ERETURN) ;PID,PV1,PV2,NTE,NTE
 N SDFNNAME,SDFNSSN,TEMP,OUTIN,SDLOCATE
 ;;;N EXTRET,ERROR2,LOCACKCD,ACKCDER,TEMP8,SEG
 ;;;N ERR,ERROR3,HLMSTATE,WHO,APPARMS,XQ,RETURN1 ; NEW ONES SO CANNOT USE OLD HLMSTATE TO RETURN REAL ACK
 I IJCOUNT#2=0 G OVER8  ; EVERY OTHER (EVEN) APPOINTMENT IN SAME  MESSAGE NOT REPEAT INITIALIZATION
 S EXTRET=0
 ;S SEG=""
 S ERROR2=""
 S XQ=""
 ;
 ;
 ; SEND ACK MESSAGE COMMENTED OUT BELOW. INSTEAD JUST SEND NORMAL MESSAGE WITH ADDED SEGMENTS
 ;
 ;;;;S APPARMS("ACK CODE")="AA"
 ;;;;S APPARMS("ACCEPT ACK TYPE")="NE"
 ;;;;I (ERROR'="")!(SDCOUNT<0) D
 ;;;;.S APPARMS("ACK CODE")="AE"
 ;;;.S APPARMS("ERROR MESSAGE")=ERROR_"^"_SDCOUNT
 ;;;;S APPARMS("MESSAGE TYPE")="ACK"
 ;;;;;S APPARMS("EVENT")="A19"
 ;;
 ;;
 S APPARMS("MESSAGE TYPE")="ADT"
 S APPARMS("EVENT")="A19" ; RESPONSE
 S APPARMS("COUNTRY")="USA"
 S APPARMS("FIELD SEPARATOR")="|"
 S APPARMS("ENCODING CHARACTERS")="^~\&"
 S APPARMS("VERSION")=2.4
 ;
 ;
 S APPARMS("SECURITY")=MSGCTRL
 ;
 S ERR=""
 S ERROR3=""
 S ERROR1=""
 ;
 ;
 I '$$NEWMSG^HLOAPI(.APPARMS,.HLMSTATE,.ERROR3) S ERETURN="NEW MESSAGE ERROR"
 ;
 I (ERETURN'=0)!(ERROR'="")!(SDCOUNT<0)!(ERROR1'="")!(IER'=1) S EXTRET=$$ERRORW^SDVWHLI1(XQ)
 ;
 D
 .D SET^HLOAPI(.SEG,"QRD",0)
 .D SET^HLOAPI(.SEG,$$HLDATE^HLFNC($$NOW^XLFDT(),"TS"),1)
 .D SET^HLOAPI(.SEG,ORDRSORT,8)
 .;I (ERROR="")&(SDCOUNT'="") D SET^HLOAPI(.SEG,SDCOUNT,11)
 .D SET^HLOAPI(.SEG,SDCOUNT,11)
 .;
 .;
 .;
 .;; ADD SEGMENT
 .I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERR="QRD"
 .I $D(ERROR2) D
 ..;
 .E  D
 ..;
 ;;CREATE SEGMENT PID
 ; PUT IN INTERNAL PATIENTID, NAME AND SSN 
 ;
 ;
OVER8 ;
 D SET^HLOAPI(.SEG,"PID",0)
 D SET^HLOAPI(.SEG,SDDFN,3)
 S SDFNNAME=$P($G(^DPT(SDDFN,0)),"^",1)
 D SET^HLOAPI(.SEG,SDFNNAME,5)
 S SDFNSSN=$P($G(^DPT(SDDFN,0)),"^",9)
 D SET^HLOAPI(.SEG,SDFNSSN,19)
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERETURN="PID"
 ;
 ;NEXT PV1 SEGMENT
 ;
 ;CREATE SEGMENT PV1
 ;
 ;
 D SET^HLOAPI(.SEG,"PV1",0)
 ; IF NOT ADMITTED THEN OUTPATIENT
 S OUTIN="O"
 D SET^HLOAPI(.SEG,OUTIN,2) ;PATIENT CLASS
 D SET^HLOAPI(.SEG,SDCLIEN,3) ;HOSP LOCATION IEN
 S TEMP=$P(SDAPPT,"^",18)
 S TEMP=$P(TEMP,";",1)
 D SET^HLOAPI(.SEG,TEMP,10) ;HOSPITAL SERVICE > PURPOSE OF VISIT(IEN)
 S TEMP=$P(SDAPPT,"^",13)
 S TEMP=$P(TEMP,";",1)
 D SET^HLOAPI(.SEG,TEMP,18) ; PATIENT TYPE > PRIMARY STOP CODE IEN
 S TEMP=$P(SDAPPT,"^",14)
 S TEMP=$P(TEMP,";",1)
 D SET^HLOAPI(.SEG,TEMP,41) ; PATIENT TYPE > CREDIT STOP CODE IEN
 D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(SDDATE,"TS"),44) ; APPOINTMENT/UNSCHEDULED VISIT DATE
 ;
 ;
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERETURN="PV1"
 ;
 ;NEXT PV2 SEGMENT
 ;
 ;CREATE SEGMENT PV2
 ;
 ;
 D SET^HLOAPI(.SEG,"PV2",0)
 ; GET PURPOSE OF VISIT AGAIN
 ;IF UNSCHEDULED VISIT SET ELIGIBILITY IN PV2-7
 S TEMP=$P(SDAPPT,"^",18)
 S TEMP=$P(TEMP,";",1)
 I TEMP=4 D
 .S TEMP=$P(SDAPPT,"^",8)
 .S TEMP=$P(TEMP,";",1)
 .D SET^HLOAPI(.SEG,OUTIN,7) ;ELIGIBILITY
 D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(SDDATE,"TS"),8) ; DESIRED EXPECTED APPOINTMENT/UNSCHEDULED VISIT DATE
 S TEMP=$P(SDAPPT,"^",3)
 D SET^HLOAPI(.SEG,TEMP,24) ;APPOINTMENT/UNSCHEDULED VISIT STATUS
 S TEMP=$P(SDAPPT,"^",16)
 D SET^HLOAPI(.SEG,$$HLDATE^HLFNC(TEMP,"TS"),46) ; DATE APPOINTMENT/UNSCHEDULED VISIT ACTUALLY MADE
 ;
 ;
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERETURN="PV2"
 ;
 ;NEXT NTE SEGMENT FOR EXTERNAL LOCATION NAME
 ;
 ;CREATE SEGMENT NTE
 ;
 ;
 ;
 D SET^HLOAPI(.SEG,"NTE",0)
 S SDLOCATE=$P($G(^SC(SDCLIEN,0)),"^",1)
 D SET^HLOAPI(.SEG,"SDLOCATE="_""""_SDLOCATE_"""",3)
 ;
 ;;
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERETURN="NTE"_SDLOCATE
 ;
 ;NEXT NTE SEGMENT FOR SDAPPT 
 ;
 ;CREATE SEGMENT NTE
 ;
 ;FIRST CONVERT ALL FM DATE/TIMES TO EXTERNAL FORMAT
 ;
 ; FIELDS 1,9,11,16,17,19,20,21,24,25
 S DATETIM=$P(SDAPPT,"^",1)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",1)=Y
 S DATETIM=$P(SDAPPT,"^",9)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",9)=Y
 S DATETIM=$P(SDAPPT,"^",11)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",11)=Y
 S DATETIM=$P(SDAPPT,"^",16)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",16)=Y
 S DATETIM=$P(SDAPPT,"^",17)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",17)=Y
 S DATETIM=$P(SDAPPT,"^",19)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",19)=Y
 S DATETIM=$P(SDAPPT,"^",20)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",20)=Y
 S DATETIM=$P(SDAPPT,"^",21)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",21)=Y
 S DATETIM=$P(SDAPPT,"^",124)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",24)=Y
 S DATETIM=$P(SDAPPT,"^",25)
 S Y=DATETIM D DD^%DT S $P(SDAPPT,"^",25)=Y
 ;
 ;
 D SET^HLOAPI(.SEG,"NTE",0)
 ;TAKE OUT "^" AND REPLACE WITH "#" AS "^" IN NOT A CHARACTER
 ;THAT CAN BE USED IN HL7 DATA PART OF SEGMENT
 S TEMP8=SDAPPT
 D REPLACE(.TEMP8)
 S SDAPPT=TEMP8
 D SET^HLOAPI(.SEG,SDAPPT,3)
 ;
 ;; ADD SEGMENT
 I '$$ADDSEG^HLOAPI(.HLMSTATE,.SEG) S ERETURN="NTE"_SDAPPT
 ;
 ;SKIP MESSAGE IF ODD IJCOUNT AND ICOUNT'=SDCOUNT
 I (IJCOUNT#2'=0)&(IJCOUNT'=SDCOUNT) Q
 ; DEFINE SENDING AND RECEIVING PARAMETERS
    S APPARMS("SENDING APPLICATION")="VWSD RECEIVER"
 S APPARMS("ACCEPT ACK TYPE")="NE" ;"AL"
 ;S APPARMS("APP ACK RESPONSE")="APPACKRR^SDVWHLIN"
 ;S APPARMS("ACCEPT ACK RESPONSE")="MSGPROC^SDVWHLIN"
 ;REVERSE BELOW 
 S APPARMS("ACCEPT ACK RESPONSE")="APPACKRR^SDVWHLIN" ; WHEN COMIT ACK , SU OR AE RETURN MADE
 S APPARMS("APP ACK RESPONSE")="MSGPROC^SDVWHLIN" ; WHEN NO ACK RETURN MADE 
 S APPARMS("APP ACK TYPE")="NE" ;"AL"
 S WHO("RECEIVING APPLICATION")="VWSD HLO EXT"
 S WHO("FACILITY LINK NAME")="VWSD_PEASL"
 ;
 ;SEND MESSAGE
 ;
 S ERROR3=""
 S RETURN1=$$SENDONE^HLOAPI1(.HLMSTATE,.APPARMS,.WHO,.ERROR3)
 ;;;;;I '$$SENDONE^HLOAPI1(.HLMSTATE,.APPARMS,.WHO,.ERROR3) Q ;Q "ERR="_ERR_" ERROR="_ERROR
 ;;
 I IJCOUNT'=SDCOUNT H 5
 ;
 ;
 Q
REPLACE(TEMP8) ;
 N REST,LEN8,L8,PIEC8
 S REST=TEMP8
 S LEN8=$L(TEMP8)
 F  Q:REST=""  D
 .S PIEC8=$P(TEMP8,"^",1)
 .S L8=$L(PIEC8)+2
 .I L8>LEN8 D
 ..S REST="" I $E(TEMP8,LEN8,LEN8)="^" S $E(TEMP8,LEN8,LEN8)="#"
 .E  D
 ..S REST=$E(TEMP8,L8,LEN8)
 .I (PIEC8'="")&(REST'="") D
 ..S TEMP8=PIEC8_"#"_REST
 Q
