BPSJZPR ;BHAM ISC/CMW/LJF - Process Incoming HL7 ZPR Message ;01-DEC-2003
;;1.0;E CLAIMS MGMT ENGINE;**1,10,15,19**;JUN 2004;Build 18
;;Per VA Directive 6402, this routine should not be modified.
;
; Description:
; Process incoming HL7 ZPR Messages
; Update Payer Sheet File (9002313.92)
;
Q
;
; Entry point
EN(BPSJEN,BPSJSEG,BPSJROOT,BPSFILE) ;
;
N BPRCODE,BPSF,BPSFDIC,BPSEGID,BPORDER,BPMODE,BPNOTES,BPSETID
N FLN,FLNSC,FLNPN,FLNSPEC
N DIE,DIC,DLAYGO,DR,DA,DINUM
N C,X,Y,NCNT,BPND
;
I $G(BPSJEN),$G(BPSJROOT)]"",$G(BPSFILE)]"",$D(BPSJSEG)
E Q ; invalid info
;
S BPRCODE=$$ZPR(),DIE=$G(BPSJROOT),C=","
;
I BPRCODE,BPSEGID,BPORDER
E Q
;
S BPSF=DIE_BPSJEN_C_BPSEGID_",0)"
I '$D(@BPSF) D
. S FLNSPEC=$$GET1^DID(BPSFILE,BPSEGID,"","SPECIFIER")
. S @BPSF=U_FLNSPEC_U_U
;
S (X,DINUM)=BPORDER
S DA(1)=BPSJEN,DIC=DIE_BPSJEN_C_BPSEGID_C
S DIC(0)="L",(DIC("P"),DLAYGO)=FLN
D ^DIC
;
S DA=+Y
S DIE=DIC
S DR=".02////"_BPRCODE_";.03////"_BPMODE
D ^DIE
;
S BPSFDIC=DIC ; save dictionary ID
; NOTES
I $D(BPSJSEG(8)) D
. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",2,",BPSF=DIE_"0)"
. I '$D(@BPSF) S @BPSF=U_FLNPN_U_U
. S BPND="BPSJSEG(7,99)",NCNT=0
. F S BPND=$Q(@BPND) Q:BPND="" I $G(@BPND)]"" D
.. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",2,",BPSF=DIE_"0)"
.. K DA S DA(4)=BPSJEN,DA(3)=BPSEGID,DA(2)=BPORDER,DA(1)=2,(NCNT,DA)=NCNT+1
.. K DR S DR=".01////"_@BPND
.. D ^DIE
K BPSJSEG(8) ; kill 8 so $Q of 7 won't find it
;
; Special Code
I $D(BPSJSEG(7)) D
. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",1,",BPSF=DIE_"0)"
. I '$D(@BPSF) S @BPSF=U_FLNSC_U_U
. S BPND="BPSJSEG(6,99)",NCNT=0
. F S BPND=$Q(@BPND) Q:BPND="" I $G(@BPND)]"" D
.. S DIC=BPSFDIC,DIE=BPSFDIC_BPORDER_",1,",BPSF=DIE_"0)"
.. K DA S DA(4)=BPSJEN,DA(3)=BPSEGID,DA(2)=BPORDER,DA(1)=1,(NCNT,DA)=NCNT+1
.. K DR S DR=".01////"_@BPND
.. D ^DIE
Q
;
ZPR() ; Validate Fields and Initialize ZPR variables
N RCODE,WDATA
;
; Reject reasons: 1=Missing ,2=Invalid
; ^TMP($J,"BPSJ-ERROR" is killed before and after it is used in BPSJHLT
;
S BPSETID=$G(BPSJSEG(2))
;
S BPSEGID=$G(BPSJSEG(3))
I BPSEGID="" S BPSEGID=0 D
. S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-1,"_BPSETID
E S BPSEGID=$G(ZPRS(BPSEGID)) D
. I 'BPSEGID S BPSEGID=0 D Q
.. S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-2,"_BPSETID
. ;
. S FLN=$P(BPSEGID,U,2)
. S FLNSC=$P(BPSEGID,U,3)
. S FLNPN=$P(BPSEGID,U,4)
. S BPSEGID=+BPSEGID
;
S RCODE=$$GETPTR($$TRIM^XLFSTR($G(BPSJSEG(4))))
I 'RCODE S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-2,"_BPSETID
I $G(BPSJSEG(4))="" S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-1,"_BPSETID
;
S BPORDER=$G(BPSJSEG(5))
I BPORDER="" S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,4)="V634,"_BPSETID
;
S BPMODE=$G(BPSJSEG(6))
;
I BPMODE'="X",BPMODE'="S" D
. S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,5)="V635,"_BPSETID
;
I '$L($G(BPSJSEG(7))),$D(BPSJSEG(7))'>1 K BPSJSEG(7)
E D ;NOTES(.BPSJSEG(7))
. K WDATA M WDATA(7)=BPSJSEG(7) D NOTES(.WDATA)
. K BPSJSEG(7) M BPSJSEG(7)=WDATA K WDATA
;
; flag error if processing mode="X" and no special code
I BPMODE="X",'$D(BPSJSEG(7)) S ^TMP($J,"BPSJ-ERROR","ZPR",BPSETID,6)="V636,"_BPSETID
;
I '$L($G(BPSJSEG(8))),$D(BPSJSEG(8))'>1 K BPSJSEG(8)
E D ;NOTES(.BPSJSEG(8))
. K WDATA M WDATA(8)=BPSJSEG(8) D NOTES(.WDATA)
. K BPSJSEG(8) M BPSJSEG(8)=WDATA K WDATA
;
Q RCODE
;
NOTES(ARRAYIN,TRCH) ; fProgrammer Notes - Special Code handler
;
N II,ODAT,NODENM
N ISDATA,ISDATA1,ISDATA2,ISDATA3
;
I '$D(TRCH) D ; apply standard Vista/Vitria "Free Text" de-encoding
. S TRCH("\F\")="|",TRCH("\R\")="~",TRCH("\E\")="\"
. S TRCH("\T\")="&",TRCH("\S\")="^"
. S TRCH("\.b")=1,TRCH("\.br\")=1
;
S NODENM="ARRAYIN"
;
S (ODAT,ISDATA1)=""
F S NODENM=$Q(@NODENM) Q:NODENM="" S ISDATA=@NODENM D
. ; clean up partial string if any
. I $L(ISDATA1) D I '$L(ISDATA) Q
.. S ISDATA1=ISDATA1_$E(ISDATA,1,10)
.. S ISDATA3=$$DECODE(ISDATA1,.TRCH,.ODAT,.ISDATA2)
.. S $E(ISDATA,1,10)=ISDATA2
. ;
. S ISDATA2=$$DECODE(ISDATA,.TRCH,.ODAT,.ISDATA1)
;
S ODAT=ODAT_ISDATA1 D NWNODE(.ODAT) K ARRAYIN M ARRAYIN=ODAT
Q
;
NWNODE(FREERAY) ; build free text array
N CNT
S CNT=1+$O(FREERAY(""),-1),FREERAY(CNT)=FREERAY,FREERAY=""
Q
;
DECODE(INSTR,TCH,WDAT,INSTR1) ;
; INSTR - Input string
; TCH - translation array
; WDAT - Output in a Vista compliant "Free Text" array
; INSTR1 - Remainder of text when last or
; second to last INSTR char = "\"
;Development Note:
;\.br\ - removed and new node created
;\E\.br\E\ = \.br\ - (no further translation)
;non-printable character translation not supported
;Output Array nodes will contain no more than 200 characters each
;
N II,CH
S INSTR1="",WDAT=$G(WDAT)
F II=1:1:$L(INSTR) S CH=$E(INSTR,II) D:CH="\" S WDAT=WDAT_CH I $L(WDAT)>199 D NWNODE(.WDAT)
. ;
. ; Partial TCH string, if \.br\ (CR-LF) translation allowed
. I $L($E(INSTR,II,II+2))<3,$G(TCH("\.br\")) D Q
.. S INSTR1=$E(INSTR,II,II+2),II=$L(INSTR),CH=""
. ;
. I '$D(TCH($E(INSTR,II,II+2))) Q ; not one we're interested in
. I +$G(TCH($E(INSTR,II,II+2))) D Q ; \.br\ to <CR-LF> conversion
.. I (II+4)>$L(INSTR) S INSTR1=$E(INSTR,II,$L(INSTR)),II=$L(INSTR),CH="" Q
.. I +$G(TCH($E(INSTR,II,II+4))) S II=II+4,CH="" D NWNODE(.WDAT)
. ;
. S CH=TCH($E(INSTR,II,II+2)),II=II+2 ; std conversion
Q WDAT ; Return top node of WDAT - for strings less than 200 characters
;
GETPTR(BPDAT) ; Get pointer into BPS NCPDP FIELD DEFS
N BPSFNM,BPSFNO,BPSIX,BPSIXALT,BPSFX,BPNAMIX,BPNUMIX,BPSFNOCK
;
S BPSFNM=$P($G(BPDAT),"-",2),BPSFNO=$P($G(BPDAT),"-") ; allow for alphanumeric NCPDP number - BPS*1*15
I BPSFNM]"",BPSFNO]"" S (BPSIX,BPSIXALT)=0,BPSFX=BPSFNO_U_BPSFNM
E Q 0
S BPNAMIX=$O(^BPSF(9002313.91,"D",BPSFNM,""))
S BPNUMIX=$O(^BPSF(9002313.91,"B",BPSFNO,""))
;
;-if NAME and NUMBER point to the same IEN (but not 0)
I BPNAMIX,BPNUMIX=BPNAMIX Q BPNAMIX
;
;-else might be in another node of the "D" x-ref
I BPNAMIX,BPNUMIX F D Q:BPSIX Q:'BPNAMIX
. S BPNAMIX=$O(^BPSF(9002313.91,"D",BPSFNM,BPNAMIX))
. I BPNUMIX=BPNAMIX S BPSIX=BPNAMIX
;
;-If not found, try "B" x-ref value
I 'BPSIX,BPNUMIX D
. I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX Q
. I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX Q
. ;
. ;-try additional "B" x-ref's for this NUMBER
. F D Q:BPSIX Q:'BPNUMIX
.. S BPNUMIX=$O(^BPSF(9002313.91,"B",BPSFNO,BPNUMIX))
.. I BPNUMIX D
... I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX
... I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX
;
;-Last resort - go through all iens'
I 'BPSIX S BPNUMIX=0 F D Q:BPSIX Q:'BPNUMIX
. S BPNUMIX=$O(^BPSF(9002313.91,BPNUMIX))
. I BPNUMIX,+$G(^BPSF(9002313.91,BPNUMIX,0))[BPSFNO D
.. S BPSFNOCK=+$G(^BPSF(9002313.91,BPNUMIX,0))
.. ; Note: Special coding included for BPSFNO of 498 (498.nn)
.. I BPSFNOCK'=BPSFNO,$P(BPSFNOCK,".")'=498 Q
.. I $P($G(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM S BPSIX=BPNUMIX
.. I 'BPSIXALT,$P($G(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX S BPSIXALT=BPNUMIX
;
Q BPSIX
;
INITZPRS(ZPRS) ;BPSEGID^FLN^FLNSC^FLNPN
S ZPRS(0)="100^9002313.9205^9002313.92051^9002313.92052"
S ZPRS(1)="110^9002313.9206^9002313.92061^9002313.92062"
S ZPRS(2)="140^9002313.9209^9002313.92091^9002313.92092"
S ZPRS(3)="150^9002313.921^9002313.9211^9002313.9212"
S ZPRS(4)="120^9002313.9207^9002313.92071^9002313.92072"
S ZPRS(5)="160^9002313.9213^9002313.92131^9002313.92132"
S ZPRS(6)="170^9002313.9214^9002313.92141^9002313.92142"
S ZPRS(7)="130^9002313.9208^9002313.92081^9002313.92082"
S ZPRS(8)="180^9002313.9215^9002313.92151^9002313.92152"
S ZPRS(9)="200^9002313.9217^9002313.92171^9002313.92172"
S ZPRS(10)="210^9002313.9218^9002313.92181^9002313.92182"
S ZPRS(11)="190^9002313.9216^9002313.92161^9002313.92162"
S ZPRS(12)="220^9002313.9219^9002313.92191^9002313.92192"
S ZPRS(13)="230^9002313.922^9002313.9221^9002313.9222"
S ZPRS(14)="240^9002313.9223^9002313.92231^9002313.92232"
S ZPRS(15)="250^9002313.9224^9002313.92241^9002313.92242"
S ZPRS(16)="260^9002313.9225^9002313.92251^9002313.92252"
;BPS*1*15 - Purchaser and Provider segment added for D.1 - D.9 version
S ZPRS(17)="270^9002313.9227^9002313.92271^9002313.92272"
S ZPRS(18)="280^9002313.9228^9002313.92281^9002313.92282"
;BPS*1*19 - Intermediary and Last Known 4Rx segments added for E.0 - E.6 version
S ZPRS(19)="290^9002313.9229^9002313.92291^9002313.92292"
S ZPRS(37)="300^9002313.923^9002313.9231^9002313.9232"
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HBPSJZPR 8739 printed Oct 16, 2024@17:51:58 Page 2
BPSJZPR ;BHAM ISC/CMW/LJF - Process Incoming HL7 ZPR Message ;01-DEC-2003
+1 ;;1.0;E CLAIMS MGMT ENGINE;**1,10,15,19**;JUN 2004;Build 18
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 ;
+4 ; Description:
+5 ; Process incoming HL7 ZPR Messages
+6 ; Update Payer Sheet File (9002313.92)
+7 ;
+8 QUIT
+9 ;
+10 ; Entry point
EN(BPSJEN,BPSJSEG,BPSJROOT,BPSFILE) ;
+1 ;
+2 NEW BPRCODE,BPSF,BPSFDIC,BPSEGID,BPORDER,BPMODE,BPNOTES,BPSETID
+3 NEW FLN,FLNSC,FLNPN,FLNSPEC
+4 NEW DIE,DIC,DLAYGO,DR,DA,DINUM
+5 NEW C,X,Y,NCNT,BPND
+6 ;
+7 IF $GET(BPSJEN)
IF $GET(BPSJROOT)]""
IF $GET(BPSFILE)]""
IF $DATA(BPSJSEG)
+8 ; invalid info
IF '$TEST
QUIT
+9 ;
+10 SET BPRCODE=$$ZPR()
SET DIE=$GET(BPSJROOT)
SET C=","
+11 ;
+12 IF BPRCODE
IF BPSEGID
IF BPORDER
+13 IF '$TEST
QUIT
+14 ;
+15 SET BPSF=DIE_BPSJEN_C_BPSEGID_",0)"
+16 IF '$DATA(@BPSF)
Begin DoDot:1
+17 SET FLNSPEC=$$GET1^DID(BPSFILE,BPSEGID,"","SPECIFIER")
+18 SET @BPSF=U_FLNSPEC_U_U
End DoDot:1
+19 ;
+20 SET (X,DINUM)=BPORDER
+21 SET DA(1)=BPSJEN
SET DIC=DIE_BPSJEN_C_BPSEGID_C
+22 SET DIC(0)="L"
SET (DIC("P"),DLAYGO)=FLN
+23 DO ^DIC
+24 ;
+25 SET DA=+Y
+26 SET DIE=DIC
+27 SET DR=".02////"_BPRCODE_";.03////"_BPMODE
+28 DO ^DIE
+29 ;
+30 ; save dictionary ID
SET BPSFDIC=DIC
+31 ; NOTES
+32 IF $DATA(BPSJSEG(8))
Begin DoDot:1
+33 SET DIC=BPSFDIC
SET DIE=BPSFDIC_BPORDER_",2,"
SET BPSF=DIE_"0)"
+34 IF '$DATA(@BPSF)
SET @BPSF=U_FLNPN_U_U
+35 SET BPND="BPSJSEG(7,99)"
SET NCNT=0
+36 FOR
SET BPND=$QUERY(@BPND)
if BPND=""
QUIT
IF $GET(@BPND)]""
Begin DoDot:2
+37 SET DIC=BPSFDIC
SET DIE=BPSFDIC_BPORDER_",2,"
SET BPSF=DIE_"0)"
+38 KILL DA
SET DA(4)=BPSJEN
SET DA(3)=BPSEGID
SET DA(2)=BPORDER
SET DA(1)=2
SET (NCNT,DA)=NCNT+1
+39 KILL DR
SET DR=".01////"_@BPND
+40 DO ^DIE
End DoDot:2
End DoDot:1
+41 ; kill 8 so $Q of 7 won't find it
KILL BPSJSEG(8)
+42 ;
+43 ; Special Code
+44 IF $DATA(BPSJSEG(7))
Begin DoDot:1
+45 SET DIC=BPSFDIC
SET DIE=BPSFDIC_BPORDER_",1,"
SET BPSF=DIE_"0)"
+46 IF '$DATA(@BPSF)
SET @BPSF=U_FLNSC_U_U
+47 SET BPND="BPSJSEG(6,99)"
SET NCNT=0
+48 FOR
SET BPND=$QUERY(@BPND)
if BPND=""
QUIT
IF $GET(@BPND)]""
Begin DoDot:2
+49 SET DIC=BPSFDIC
SET DIE=BPSFDIC_BPORDER_",1,"
SET BPSF=DIE_"0)"
+50 KILL DA
SET DA(4)=BPSJEN
SET DA(3)=BPSEGID
SET DA(2)=BPORDER
SET DA(1)=1
SET (NCNT,DA)=NCNT+1
+51 KILL DR
SET DR=".01////"_@BPND
+52 DO ^DIE
End DoDot:2
End DoDot:1
+53 QUIT
+54 ;
ZPR() ; Validate Fields and Initialize ZPR variables
+1 NEW RCODE,WDATA
+2 ;
+3 ; Reject reasons: 1=Missing ,2=Invalid
+4 ; ^TMP($J,"BPSJ-ERROR" is killed before and after it is used in BPSJHLT
+5 ;
+6 SET BPSETID=$GET(BPSJSEG(2))
+7 ;
+8 SET BPSEGID=$GET(BPSJSEG(3))
+9 IF BPSEGID=""
SET BPSEGID=0
Begin DoDot:1
+10 SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-1,"_BPSETID
End DoDot:1
+11 IF '$TEST
SET BPSEGID=$GET(ZPRS(BPSEGID))
Begin DoDot:1
+12 IF 'BPSEGID
SET BPSEGID=0
Begin DoDot:2
+13 SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,2)="V632-2,"_BPSETID
End DoDot:2
QUIT
+14 ;
+15 SET FLN=$PIECE(BPSEGID,U,2)
+16 SET FLNSC=$PIECE(BPSEGID,U,3)
+17 SET FLNPN=$PIECE(BPSEGID,U,4)
+18 SET BPSEGID=+BPSEGID
End DoDot:1
+19 ;
+20 SET RCODE=$$GETPTR($$TRIM^XLFSTR($GET(BPSJSEG(4))))
+21 IF 'RCODE
SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-2,"_BPSETID
+22 IF $GET(BPSJSEG(4))=""
SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,3)="V633-1,"_BPSETID
+23 ;
+24 SET BPORDER=$GET(BPSJSEG(5))
+25 IF BPORDER=""
SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,4)="V634,"_BPSETID
+26 ;
+27 SET BPMODE=$GET(BPSJSEG(6))
+28 ;
+29 IF BPMODE'="X"
IF BPMODE'="S"
Begin DoDot:1
+30 SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,5)="V635,"_BPSETID
End DoDot:1
+31 ;
+32 IF '$LENGTH($GET(BPSJSEG(7)))
IF $DATA(BPSJSEG(7))'>1
KILL BPSJSEG(7)
+33 ;NOTES(.BPSJSEG(7))
IF '$TEST
Begin DoDot:1
+34 KILL WDATA
MERGE WDATA(7)=BPSJSEG(7)
DO NOTES(.WDATA)
+35 KILL BPSJSEG(7)
MERGE BPSJSEG(7)=WDATA
KILL WDATA
End DoDot:1
+36 ;
+37 ; flag error if processing mode="X" and no special code
+38 IF BPMODE="X"
IF '$DATA(BPSJSEG(7))
SET ^TMP($JOB,"BPSJ-ERROR","ZPR",BPSETID,6)="V636,"_BPSETID
+39 ;
+40 IF '$LENGTH($GET(BPSJSEG(8)))
IF $DATA(BPSJSEG(8))'>1
KILL BPSJSEG(8)
+41 ;NOTES(.BPSJSEG(8))
IF '$TEST
Begin DoDot:1
+42 KILL WDATA
MERGE WDATA(8)=BPSJSEG(8)
DO NOTES(.WDATA)
+43 KILL BPSJSEG(8)
MERGE BPSJSEG(8)=WDATA
KILL WDATA
End DoDot:1
+44 ;
+45 QUIT RCODE
+46 ;
NOTES(ARRAYIN,TRCH) ; fProgrammer Notes - Special Code handler
+1 ;
+2 NEW II,ODAT,NODENM
+3 NEW ISDATA,ISDATA1,ISDATA2,ISDATA3
+4 ;
+5 ; apply standard Vista/Vitria "Free Text" de-encoding
IF '$DATA(TRCH)
Begin DoDot:1
+6 SET TRCH("\F\")="|"
SET TRCH("\R\")="~"
SET TRCH("\E\")="\"
+7 SET TRCH("\T\")="&"
SET TRCH("\S\")="^"
+8 SET TRCH("\.b")=1
SET TRCH("\.br\")=1
End DoDot:1
+9 ;
+10 SET NODENM="ARRAYIN"
+11 ;
+12 SET (ODAT,ISDATA1)=""
+13 FOR
SET NODENM=$QUERY(@NODENM)
if NODENM=""
QUIT
SET ISDATA=@NODENM
Begin DoDot:1
+14 ; clean up partial string if any
+15 IF $LENGTH(ISDATA1)
Begin DoDot:2
+16 SET ISDATA1=ISDATA1_$EXTRACT(ISDATA,1,10)
+17 SET ISDATA3=$$DECODE(ISDATA1,.TRCH,.ODAT,.ISDATA2)
+18 SET $EXTRACT(ISDATA,1,10)=ISDATA2
End DoDot:2
IF '$LENGTH(ISDATA)
QUIT
+19 ;
+20 SET ISDATA2=$$DECODE(ISDATA,.TRCH,.ODAT,.ISDATA1)
End DoDot:1
+21 ;
+22 SET ODAT=ODAT_ISDATA1
DO NWNODE(.ODAT)
KILL ARRAYIN
MERGE ARRAYIN=ODAT
+23 QUIT
+24 ;
NWNODE(FREERAY) ; build free text array
+1 NEW CNT
+2 SET CNT=1+$ORDER(FREERAY(""),-1)
SET FREERAY(CNT)=FREERAY
SET FREERAY=""
+3 QUIT
+4 ;
DECODE(INSTR,TCH,WDAT,INSTR1) ;
+1 ; INSTR - Input string
+2 ; TCH - translation array
+3 ; WDAT - Output in a Vista compliant "Free Text" array
+4 ; INSTR1 - Remainder of text when last or
+5 ; second to last INSTR char = "\"
+6 ;Development Note:
+7 ;\.br\ - removed and new node created
+8 ;\E\.br\E\ = \.br\ - (no further translation)
+9 ;non-printable character translation not supported
+10 ;Output Array nodes will contain no more than 200 characters each
+11 ;
+12 NEW II,CH
+13 SET INSTR1=""
SET WDAT=$GET(WDAT)
+14 FOR II=1:1:$LENGTH(INSTR)
SET CH=$EXTRACT(INSTR,II)
if CH="\"
Begin DoDot:1
+15 ;
+16 ; Partial TCH string, if \.br\ (CR-LF) translation allowed
+17 IF $LENGTH($EXTRACT(INSTR,II,II+2))<3
IF $GET(TCH("\.br\"))
Begin DoDot:2
+18 SET INSTR1=$EXTRACT(INSTR,II,II+2)
SET II=$LENGTH(INSTR)
SET CH=""
End DoDot:2
QUIT
+19 ;
+20 ; not one we're interested in
IF '$DATA(TCH($EXTRACT(INSTR,II,II+2)))
QUIT
+21 ; \.br\ to <CR-LF> conversion
IF +$GET(TCH($EXTRACT(INSTR,II,II+2)))
Begin DoDot:2
+22 IF (II+4)>$LENGTH(INSTR)
SET INSTR1=$EXTRACT(INSTR,II,$LENGTH(INSTR))
SET II=$LENGTH(INSTR)
SET CH=""
QUIT
+23 IF +$GET(TCH($EXTRACT(INSTR,II,II+4)))
SET II=II+4
SET CH=""
DO NWNODE(.WDAT)
End DoDot:2
QUIT
+24 ;
+25 ; std conversion
SET CH=TCH($EXTRACT(INSTR,II,II+2))
SET II=II+2
End DoDot:1
SET WDAT=WDAT_CH
IF $LENGTH(WDAT)>199
DO NWNODE(.WDAT)
+26 ; Return top node of WDAT - for strings less than 200 characters
QUIT WDAT
+27 ;
GETPTR(BPDAT) ; Get pointer into BPS NCPDP FIELD DEFS
+1 NEW BPSFNM,BPSFNO,BPSIX,BPSIXALT,BPSFX,BPNAMIX,BPNUMIX,BPSFNOCK
+2 ;
+3 ; allow for alphanumeric NCPDP number - BPS*1*15
SET BPSFNM=$PIECE($GET(BPDAT),"-",2)
SET BPSFNO=$PIECE($GET(BPDAT),"-")
+4 IF BPSFNM]""
IF BPSFNO]""
SET (BPSIX,BPSIXALT)=0
SET BPSFX=BPSFNO_U_BPSFNM
+5 IF '$TEST
QUIT 0
+6 SET BPNAMIX=$ORDER(^BPSF(9002313.91,"D",BPSFNM,""))
+7 SET BPNUMIX=$ORDER(^BPSF(9002313.91,"B",BPSFNO,""))
+8 ;
+9 ;-if NAME and NUMBER point to the same IEN (but not 0)
+10 IF BPNAMIX
IF BPNUMIX=BPNAMIX
QUIT BPNAMIX
+11 ;
+12 ;-else might be in another node of the "D" x-ref
+13 IF BPNAMIX
IF BPNUMIX
FOR
Begin DoDot:1
+14 SET BPNAMIX=$ORDER(^BPSF(9002313.91,"D",BPSFNM,BPNAMIX))
+15 IF BPNUMIX=BPNAMIX
SET BPSIX=BPNAMIX
End DoDot:1
if BPSIX
QUIT
if 'BPNAMIX
QUIT
+16 ;
+17 ;-If not found, try "B" x-ref value
+18 IF 'BPSIX
IF BPNUMIX
Begin DoDot:1
+19 IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM
SET BPSIX=BPNUMIX
QUIT
+20 IF 'BPSIXALT
IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX
SET BPSIXALT=BPNUMIX
QUIT
+21 ;
+22 ;-try additional "B" x-ref's for this NUMBER
+23 FOR
Begin DoDot:2
+24 SET BPNUMIX=$ORDER(^BPSF(9002313.91,"B",BPSFNO,BPNUMIX))
+25 IF BPNUMIX
Begin DoDot:3
+26 IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM
SET BPSIX=BPNUMIX
+27 IF 'BPSIXALT
IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX
SET BPSIXALT=BPNUMIX
End DoDot:3
End DoDot:2
if BPSIX
QUIT
if 'BPNUMIX
QUIT
End DoDot:1
+28 ;
+29 ;-Last resort - go through all iens'
+30 IF 'BPSIX
SET BPNUMIX=0
FOR
Begin DoDot:1
+31 SET BPNUMIX=$ORDER(^BPSF(9002313.91,BPNUMIX))
+32 IF BPNUMIX
IF +$GET(^BPSF(9002313.91,BPNUMIX,0))[BPSFNO
Begin DoDot:2
+33 SET BPSFNOCK=+$GET(^BPSF(9002313.91,BPNUMIX,0))
+34 ; Note: Special coding included for BPSFNO of 498 (498.nn)
+35 IF BPSFNOCK'=BPSFNO
IF $PIECE(BPSFNOCK,".")'=498
QUIT
+36 IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,5)),U)=BPSFNM
SET BPSIX=BPNUMIX
+37 IF 'BPSIXALT
IF $PIECE($GET(^BPSF(9002313.91,BPNUMIX,0)),U,1,2)=BPSFX
SET BPSIXALT=BPNUMIX
End DoDot:2
End DoDot:1
if BPSIX
QUIT
if 'BPNUMIX
QUIT
+38 ;
+39 QUIT BPSIX
+40 ;
INITZPRS(ZPRS) ;BPSEGID^FLN^FLNSC^FLNPN
+1 SET ZPRS(0)="100^9002313.9205^9002313.92051^9002313.92052"
+2 SET ZPRS(1)="110^9002313.9206^9002313.92061^9002313.92062"
+3 SET ZPRS(2)="140^9002313.9209^9002313.92091^9002313.92092"
+4 SET ZPRS(3)="150^9002313.921^9002313.9211^9002313.9212"
+5 SET ZPRS(4)="120^9002313.9207^9002313.92071^9002313.92072"
+6 SET ZPRS(5)="160^9002313.9213^9002313.92131^9002313.92132"
+7 SET ZPRS(6)="170^9002313.9214^9002313.92141^9002313.92142"
+8 SET ZPRS(7)="130^9002313.9208^9002313.92081^9002313.92082"
+9 SET ZPRS(8)="180^9002313.9215^9002313.92151^9002313.92152"
+10 SET ZPRS(9)="200^9002313.9217^9002313.92171^9002313.92172"
+11 SET ZPRS(10)="210^9002313.9218^9002313.92181^9002313.92182"
+12 SET ZPRS(11)="190^9002313.9216^9002313.92161^9002313.92162"
+13 SET ZPRS(12)="220^9002313.9219^9002313.92191^9002313.92192"
+14 SET ZPRS(13)="230^9002313.922^9002313.9221^9002313.9222"
+15 SET ZPRS(14)="240^9002313.9223^9002313.92231^9002313.92232"
+16 SET ZPRS(15)="250^9002313.9224^9002313.92241^9002313.92242"
+17 SET ZPRS(16)="260^9002313.9225^9002313.92251^9002313.92252"
+18 ;BPS*1*15 - Purchaser and Provider segment added for D.1 - D.9 version
+19 SET ZPRS(17)="270^9002313.9227^9002313.92271^9002313.92272"
+20 SET ZPRS(18)="280^9002313.9228^9002313.92281^9002313.92282"
+21 ;BPS*1*19 - Intermediary and Last Known 4Rx segments added for E.0 - E.6 version
+22 SET ZPRS(19)="290^9002313.9229^9002313.92291^9002313.92292"
+23 SET ZPRS(37)="300^9002313.923^9002313.9231^9002313.9232"
+24 QUIT