VAFHLZTE ;SHRPE/YMG - Create HL7 ZTE segment ;06/17/19
;;5.3;Registration;**952,977**;Aug 13, 1993;Build 177
;;Per VA Directive 6402, this routine should not be modified.
;
Q
EN(DFN,VAFSTR,VAFCHK,VAFZTE) ; build HL7 ZTE segments.
; These segments contain VA-specific data for OTH (Other Than Honorable)
; patients. ZTE segments will be returned in the array VAFZTE.
;
; Input: DFN - Pointer to PATIENT file (#2)
; VAFSTR - String of fields requested separated by commas
; VAFCHK - 1 to only create ZTE segments if patient is OTH, 0 to create segments regardless of patient's OTH status (default)
; .VAFZEL - Array to return segments in
;
; Existence of HL7 encoding characters (HLFS,HLECH) is assumed
;
; Output: VAFZTE(X) = ZTE segment (first 245 characters)
; VAFZTE(X,Y) = Remaining portion of ZTE segment in 245 character chunks
;
; Notes: VAFZTE is initialized (KILLed) on input.
;
N DGOTHSTR,IEN33,IEN3301,IEN3303,IEN3311,VAFHLZTE,VAFSETID,VAFMAXL
K VAFZTE
S VAFMAXL=245
S VAFCHK=+$G(VAFCHK,0)
I VAFCHK,'$$ISOTHD^DGOTHD(DFN) Q
I '$G(DFN)!($G(VAFSTR)="") Q
S VAFSTR=","_VAFSTR_","
S IEN33=+$O(^DGOTH(33,"B",DFN,"")) I 'IEN33 Q
; Build ZTE segments
S VAFSETID=1
; ZTE for pending request
S DGOTHSTR=$$GETPEND^DGOTHUT1(DFN)
I $P(DGOTHSTR,U)>0 D GETDATA("P",DGOTHSTR),MAKESEG S VAFSETID=VAFSETID+1
; ZTE for denied requests
S IEN3303=0 F S IEN3303=$O(^DGOTH(33,IEN33,3,IEN3303)) Q:'IEN3303 D
.S DGOTHSTR=$$GETDEN^DGOTHUT1(IEN33,IEN3303)
.I $P(DGOTHSTR,U)>0 D GETDATA("D",DGOTHSTR),MAKESEG S VAFSETID=VAFSETID+1
.Q
; ZTE for approved requests
S IEN3301=0 F S IEN3301=$O(^DGOTH(33,IEN33,1,IEN3301)) Q:'IEN3301 D
.S IEN3311=0 F S IEN3311=$O(^DGOTH(33,IEN33,1,IEN3301,1,IEN3311)) Q:'IEN3311 D
..S DGOTHSTR=$$GETAUTH^DGOTHUT1(IEN33,IEN3301,IEN3311)
..I $P(DGOTHSTR,U)>0 D GETDATA("A",DGOTHSTR),MAKESEG S VAFSETID=VAFSETID+1
..Q
.Q
Q
;
GETDATA(DGTYPE,DGOTHSTR) ; Get information needed to build ZTE segment
; Input:
; DGTYPE = request type: "P" = Pending, "D" = Denied, "A" = Approved
; DGOTHSTR = "^" - delimited string containing data from file 33 to use
;
; Existence of the following variables is assumed
; DFN - Pointer to Patient (#2) file
; VAFSTR - Fields to extract (padded with commas)
; VAFSETID - Value to use for Set ID (optional)
; HL7 encoding characters (HLFS, HLENC, HLQ)
;
; Output: VAFHLZTE(SeqNum) = Value
;
; Notes: VAFHLZTE is initialized (KILLed) on entry
;
K VAFHLZTE
; Set ID
I VAFSTR[",1," S VAFHLZTE(1)=+$G(VAFSETID)
; Date request submitted
I VAFSTR[",2," S VAFHLZTE(2)=$$HLDATE^HLFNC($P(DGOTHSTR,U,$S(DGTYPE="A":4,1:2)))
; Request creation timestamp
I VAFSTR[",3," S VAFHLZTE(3)=$$HLDATE^HLFNC($P(DGOTHSTR,U,$S(DGTYPE="A":10,DGTYPE="D":7,1:6)))
; Authorization status
I VAFSTR[",4," S VAFHLZTE(4)=DGTYPE
; Request entered/edited timestamp
I VAFSTR[",5," S VAFHLZTE(5)=$$HLDATE^HLFNC($P(DGOTHSTR,U,$S(DGTYPE="A":7,DGTYPE="D":5,1:4)))
; Request entered by
I VAFSTR[",6," S VAFHLZTE(6)=$P(DGOTHSTR,U,$S(DGTYPE="A":6,DGTYPE="D":4,1:3)) ; DG*5.3*977 OTH-EXT
; Facility
I VAFSTR[",7," S VAFHLZTE(7)=$$STA^XUAF4($P(DGOTHSTR,U,$S(DGTYPE="A":9,DGTYPE="D":6,1:5)))
; 365 day period number
I VAFSTR[",8," S VAFHLZTE(8)=$S(DGTYPE="A":$P(DGOTHSTR,U),1:"")
; 90 day period number
I VAFSTR[",9," S VAFHLZTE(9)=$S(DGTYPE="A":$P(DGOTHSTR,U,2),1:"")
; Authorization date
I VAFSTR[10 S VAFHLZTE(10)=$S(DGTYPE="A":$$HLDATE^HLFNC($P(DGOTHSTR,U,5)),1:"")
; Request authorized by
I VAFSTR[11 S VAFHLZTE(11)=$S(DGTYPE="A":$P(DGOTHSTR,U,8),1:"") ; DG*5.3*977 OTH-EXT
; 90 day period start date
I VAFSTR[12 S VAFHLZTE(12)=$S(DGTYPE="A":$$HLDATE^HLFNC($P(DGOTHSTR,U,3)),1:"")
; Authorization comment
I VAFSTR[13 S VAFHLZTE(13)=$S(DGTYPE="D":$P(DGOTHSTR,U,3),1:"") ; DG*5.3*977 OTH-EXT
Q
;
MAKESEG ; Create segment using obtained data
; Input: Existence of the following variables is assumed
; VAFSETID = Number denoting Xth repetition of the ZTE segment
; VAFMAXL = Maximum length of each node (defaults to 245)
; VAFHLZTE(SeqNum) = Value
; HL7 encoding characters (HLFS, HLECH)
;
; Output: VAFZTE(VAFSETID) = ZTE segment (first VAFMAXL characters)
; VAFZTE(VAFSETID,x) = Remaining portion of ZTE segment in VAFMAXL character chunks (if needed), beginning with a field separator
;
; Notes: VAFZTE(VAFSETID) is initialized (KILLed) on input. Fields will not be split across nodes in VAFZTE()
;
N SEQ,SPILL,SPILLON,SPOT,LASTSEQ,VAFY
K VAFZTE(VAFSETID)
S VAFZTE(VAFSETID)="ZTE"
S:'+$G(VAFMAXL) VAFMAXL=245
S VAFY=$NA(VAFZTE(VAFSETID))
S (SPILL,SPILLON)=0
S LASTSEQ=+$O(VAFHLZTE(""),-1)
F SEQ=1:1:LASTSEQ D
.; Make sure maximum length won't be exceeded
.I ($L(@VAFY)+$L($G(VAFHLZTE(SEQ)))+1)>VAFMAXL D
..; Max length exceeded - start putting data on next node
..S SPILL=SPILL+1
..S SPILLON=SEQ-1
..S VAFY=$NA(VAFZTE(VAFSETID,SPILL))
.; Add to string
.S SPOT=(SEQ+1)-SPILLON
.S $P(@VAFY,HLFS,SPOT)=$G(VAFHLZTE(SEQ))
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HVAFHLZTE 5119 printed Dec 13, 2024@03:03:42 Page 2
VAFHLZTE ;SHRPE/YMG - Create HL7 ZTE segment ;06/17/19
+1 ;;5.3;Registration;**952,977**;Aug 13, 1993;Build 177
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 ;
+4 QUIT
EN(DFN,VAFSTR,VAFCHK,VAFZTE) ; build HL7 ZTE segments.
+1 ; These segments contain VA-specific data for OTH (Other Than Honorable)
+2 ; patients. ZTE segments will be returned in the array VAFZTE.
+3 ;
+4 ; Input: DFN - Pointer to PATIENT file (#2)
+5 ; VAFSTR - String of fields requested separated by commas
+6 ; VAFCHK - 1 to only create ZTE segments if patient is OTH, 0 to create segments regardless of patient's OTH status (default)
+7 ; .VAFZEL - Array to return segments in
+8 ;
+9 ; Existence of HL7 encoding characters (HLFS,HLECH) is assumed
+10 ;
+11 ; Output: VAFZTE(X) = ZTE segment (first 245 characters)
+12 ; VAFZTE(X,Y) = Remaining portion of ZTE segment in 245 character chunks
+13 ;
+14 ; Notes: VAFZTE is initialized (KILLed) on input.
+15 ;
+16 NEW DGOTHSTR,IEN33,IEN3301,IEN3303,IEN3311,VAFHLZTE,VAFSETID,VAFMAXL
+17 KILL VAFZTE
+18 SET VAFMAXL=245
+19 SET VAFCHK=+$GET(VAFCHK,0)
+20 IF VAFCHK
IF '$$ISOTHD^DGOTHD(DFN)
QUIT
+21 IF '$GET(DFN)!($GET(VAFSTR)="")
QUIT
+22 SET VAFSTR=","_VAFSTR_","
+23 SET IEN33=+$ORDER(^DGOTH(33,"B",DFN,""))
IF 'IEN33
QUIT
+24 ; Build ZTE segments
+25 SET VAFSETID=1
+26 ; ZTE for pending request
+27 SET DGOTHSTR=$$GETPEND^DGOTHUT1(DFN)
+28 IF $PIECE(DGOTHSTR,U)>0
DO GETDATA("P",DGOTHSTR)
DO MAKESEG
SET VAFSETID=VAFSETID+1
+29 ; ZTE for denied requests
+30 SET IEN3303=0
FOR
SET IEN3303=$ORDER(^DGOTH(33,IEN33,3,IEN3303))
if 'IEN3303
QUIT
Begin DoDot:1
+31 SET DGOTHSTR=$$GETDEN^DGOTHUT1(IEN33,IEN3303)
+32 IF $PIECE(DGOTHSTR,U)>0
DO GETDATA("D",DGOTHSTR)
DO MAKESEG
SET VAFSETID=VAFSETID+1
+33 QUIT
End DoDot:1
+34 ; ZTE for approved requests
+35 SET IEN3301=0
FOR
SET IEN3301=$ORDER(^DGOTH(33,IEN33,1,IEN3301))
if 'IEN3301
QUIT
Begin DoDot:1
+36 SET IEN3311=0
FOR
SET IEN3311=$ORDER(^DGOTH(33,IEN33,1,IEN3301,1,IEN3311))
if 'IEN3311
QUIT
Begin DoDot:2
+37 SET DGOTHSTR=$$GETAUTH^DGOTHUT1(IEN33,IEN3301,IEN3311)
+38 IF $PIECE(DGOTHSTR,U)>0
DO GETDATA("A",DGOTHSTR)
DO MAKESEG
SET VAFSETID=VAFSETID+1
+39 QUIT
End DoDot:2
+40 QUIT
End DoDot:1
+41 QUIT
+42 ;
GETDATA(DGTYPE,DGOTHSTR) ; Get information needed to build ZTE segment
+1 ; Input:
+2 ; DGTYPE = request type: "P" = Pending, "D" = Denied, "A" = Approved
+3 ; DGOTHSTR = "^" - delimited string containing data from file 33 to use
+4 ;
+5 ; Existence of the following variables is assumed
+6 ; DFN - Pointer to Patient (#2) file
+7 ; VAFSTR - Fields to extract (padded with commas)
+8 ; VAFSETID - Value to use for Set ID (optional)
+9 ; HL7 encoding characters (HLFS, HLENC, HLQ)
+10 ;
+11 ; Output: VAFHLZTE(SeqNum) = Value
+12 ;
+13 ; Notes: VAFHLZTE is initialized (KILLed) on entry
+14 ;
+15 KILL VAFHLZTE
+16 ; Set ID
+17 IF VAFSTR[",1,"
SET VAFHLZTE(1)=+$GET(VAFSETID)
+18 ; Date request submitted
+19 IF VAFSTR[",2,"
SET VAFHLZTE(2)=$$HLDATE^HLFNC($PIECE(DGOTHSTR,U,$SELECT(DGTYPE="A":4,1:2)))
+20 ; Request creation timestamp
+21 IF VAFSTR[",3,"
SET VAFHLZTE(3)=$$HLDATE^HLFNC($PIECE(DGOTHSTR,U,$SELECT(DGTYPE="A":10,DGTYPE="D":7,1:6)))
+22 ; Authorization status
+23 IF VAFSTR[",4,"
SET VAFHLZTE(4)=DGTYPE
+24 ; Request entered/edited timestamp
+25 IF VAFSTR[",5,"
SET VAFHLZTE(5)=$$HLDATE^HLFNC($PIECE(DGOTHSTR,U,$SELECT(DGTYPE="A":7,DGTYPE="D":5,1:4)))
+26 ; Request entered by
+27 ; DG*5.3*977 OTH-EXT
IF VAFSTR[",6,"
SET VAFHLZTE(6)=$PIECE(DGOTHSTR,U,$SELECT(DGTYPE="A":6,DGTYPE="D":4,1:3))
+28 ; Facility
+29 IF VAFSTR[",7,"
SET VAFHLZTE(7)=$$STA^XUAF4($PIECE(DGOTHSTR,U,$SELECT(DGTYPE="A":9,DGTYPE="D":6,1:5)))
+30 ; 365 day period number
+31 IF VAFSTR[",8,"
SET VAFHLZTE(8)=$SELECT(DGTYPE="A":$PIECE(DGOTHSTR,U),1:"")
+32 ; 90 day period number
+33 IF VAFSTR[",9,"
SET VAFHLZTE(9)=$SELECT(DGTYPE="A":$PIECE(DGOTHSTR,U,2),1:"")
+34 ; Authorization date
+35 IF VAFSTR[10
SET VAFHLZTE(10)=$SELECT(DGTYPE="A":$$HLDATE^HLFNC($PIECE(DGOTHSTR,U,5)),1:"")
+36 ; Request authorized by
+37 ; DG*5.3*977 OTH-EXT
IF VAFSTR[11
SET VAFHLZTE(11)=$SELECT(DGTYPE="A":$PIECE(DGOTHSTR,U,8),1:"")
+38 ; 90 day period start date
+39 IF VAFSTR[12
SET VAFHLZTE(12)=$SELECT(DGTYPE="A":$$HLDATE^HLFNC($PIECE(DGOTHSTR,U,3)),1:"")
+40 ; Authorization comment
+41 ; DG*5.3*977 OTH-EXT
IF VAFSTR[13
SET VAFHLZTE(13)=$SELECT(DGTYPE="D":$PIECE(DGOTHSTR,U,3),1:"")
+42 QUIT
+43 ;
MAKESEG ; Create segment using obtained data
+1 ; Input: Existence of the following variables is assumed
+2 ; VAFSETID = Number denoting Xth repetition of the ZTE segment
+3 ; VAFMAXL = Maximum length of each node (defaults to 245)
+4 ; VAFHLZTE(SeqNum) = Value
+5 ; HL7 encoding characters (HLFS, HLECH)
+6 ;
+7 ; Output: VAFZTE(VAFSETID) = ZTE segment (first VAFMAXL characters)
+8 ; VAFZTE(VAFSETID,x) = Remaining portion of ZTE segment in VAFMAXL character chunks (if needed), beginning with a field separator
+9 ;
+10 ; Notes: VAFZTE(VAFSETID) is initialized (KILLed) on input. Fields will not be split across nodes in VAFZTE()
+11 ;
+12 NEW SEQ,SPILL,SPILLON,SPOT,LASTSEQ,VAFY
+13 KILL VAFZTE(VAFSETID)
+14 SET VAFZTE(VAFSETID)="ZTE"
+15 if '+$GET(VAFMAXL)
SET VAFMAXL=245
+16 SET VAFY=$NAME(VAFZTE(VAFSETID))
+17 SET (SPILL,SPILLON)=0
+18 SET LASTSEQ=+$ORDER(VAFHLZTE(""),-1)
+19 FOR SEQ=1:1:LASTSEQ
Begin DoDot:1
+20 ; Make sure maximum length won't be exceeded
+21 IF ($LENGTH(@VAFY)+$LENGTH($GET(VAFHLZTE(SEQ)))+1)>VAFMAXL
Begin DoDot:2
+22 ; Max length exceeded - start putting data on next node
+23 SET SPILL=SPILL+1
+24 SET SPILLON=SEQ-1
+25 SET VAFY=$NAME(VAFZTE(VAFSETID,SPILL))
End DoDot:2
+26 ; Add to string
+27 SET SPOT=(SEQ+1)-SPILLON
+28 SET $PIECE(@VAFY,HLFS,SPOT)=$GET(VAFHLZTE(SEQ))
End DoDot:1
+29 QUIT