- SCMSVPR1 ;ALB/ESD HL7 PR1 Segment Validation ;06/24/99
- ;;5.3;Scheduling;**44,66,142,180,1015**;Aug 13, 1993;Build 21
- ;06/24/99 ACS - Added CPT modifier to the validation process
- ;
- EN(PR1ARRY,HLQ,HLFS,HLECH,VALERR,ENCDT) ;
- ; Entry point to return the HL7 PR1 (Procedure) validation segment
- ;
- ; Input: PR1ARRY - Array of PR1 Segments
- ; HLQ - HL7 null variable
- ; HLFS - HL7 field separator
- ; HLECH - HL7 encoding characters
- ; VALERR - Array to put errors in
- ; ENCDT - Date of encounter
- ;
- ; Output: 1 if PR1 passed validity check
- ; Error message if PR1 failed validity check in form of:
- ; -1^"xxx failed validity check" (xxx=element in PR1 segment)
- ;
- ; NOTE: This validity check will pass if at least ONE PR1 segment in
- ; the PR1 array passes the validity checks.
- ;
- N I,J,MSG,OUT,PR1SEG,PR1ASEG,PRTYPE,VALID,X,CNT,SCSETID,SEG,OLD
- S X="",(I,OUT)=0,MSG="-1^Element in PR1 segment failed validity check",(SCSETID,CNT)=1,SEG="PR1"
- S PR1ARRY=$G(PR1ARRY)
- S:(PR1ARRY="") PR1ARRY="^TMP(""VAFHL"",$J,""PROCEDURE"")"
- F S I=+$O(@PR1ARRY@(I)) Q:'I D
- . S VALID(I)=1
- . S J="",J=$O(@PR1ARRY@(I,J)) Q:J=""
- . ;S PR1SEG=$G(@PR1ARRY@(I,J))
- . ;-----------------------------------------------------------
- . ; After the merge, PR1SEG looks like this:
- . ; PR1SEG=PR1^n^...^cpt^...
- . ; PR1SEG(1)=|mod~desc~meth|mod~desc~meth|...
- . ; PR1SEG(2)=|mod~desc~meth|mod~desc~meth|...
- . ;-----------------------------------------------------------
- . M PR1SEG=@PR1ARRY@(I,J)
- . S OLD=CNT
- . D VALIDATE^SCMSVUT0(SEG,PR1SEG,"0009",VALERR,.CNT)
- . I $G(@VALERR@(SEG,OLD))="0009" Q
- . S PR1SEG=$$CONVERT^SCMSVUT0(PR1SEG,HLFS,HLQ)
- . ;
- . ;- Validate procedure fields
- . ;D PROCVAL(PR1SEG)
- . D PROCVAL(.PR1SEG)
- . Q
- ;
- I '$D(VALID) D VALIDATE^SCMSVUT0(SEG,"","0009",VALERR,.CNT)
- ENQ Q $S($D(@VALERR@(SEG)):MSG,1:1)
- ;
- PROCVAL(PR1SEG) ; -Validate procedure fields
- ;
- ;N Z,DATA,CMPSEP
- N Z,DATA,CMPSEP,REPSEP
- S CMPSEP=$E(HLECH,1)
- S REPSEP=$E(HLECH,2)
- F Z="0101","0201","0401","0403" D
- . S DATA=$P(PR1SEG,HLFS,+$E(Z,1,2))
- . S DATA=$P(DATA,CMPSEP,+$E(Z,3,4))
- . D VALIDATE^SCMSVUT0(SEG,DATA,$P($T(@(Z)),";",3),VALERR,.CNT)
- ;
- ;--------------------------------------------------------------
- ; VALIDATE PROCEDURE MODIFIER FIELDS
- ;
- ; The modifier, cpt+modifier, and modifier coding method are
- ; validated
- ;
- ; MODDATA = mod seq, piece 17: mod~desc~code meth|mod~desc~...
- ; CTR = continuation segment counter
- ; PROC = CPT procedure code
- ;--------------------------------------------------------------
- ;
- ;- validate modifier components in the first PR1 array seg
- N MODDATA,PROC
- S PROC=$P($P(PR1SEG,HLFS,4),CMPSEP,1)
- S MODDATA=$P(PR1SEG,HLFS,17)
- Q:'MODDATA
- D SETUP(MODDATA,PROC)
- ;
- ;- validate modifier components in the PR1 continuation segments
- N CTR,MODDATA
- S CTR=1,MODDATA=""
- F S MODDATA=$E($G(PR1SEG(CTR)),2,245) Q:'MODDATA D
- . D SETUP(MODDATA,PROC)
- . S CTR=CTR+1
- . Q
- Q
- ;
- SETUP(MODDATA,PROC) ;
- ;
- ;---------------------------------------------------------------
- ; SET UP AND VALIDATE MODIFIER COMPONENTS
- ;
- ; INPUT: MODDATA = modifier components
- ; format: mod~desc~meth|mod~desc~meth|...
- ; PROC = CPT procedure
- ;
- ; OTHER:
- ; REPSEP = repetition separator ("|")
- ; SEG = PR1
- ; CNT = 1
- ; VALERR = error message array
- ; MCOMPNUM = modifier component number to validate
- ; REPCTR = modifier repetition counter
- ; MODDATA1 = each repetition of modifier info
- ; format: mod~desc~meth
- ; DATA = modifier data to validate (i.e. mod or meth)
- ;---------------------------------------------------------------
- ;
- N MCOMPNUM,REPCTR,MODDATA1,DATA
- S REPCTR=1
- ; add repetition separator to end of input data
- S MODDATA=MODDATA_REPSEP
- ;
- ; validate the modifier and coding method for each repetition
- F S MODDATA1=$P(MODDATA,REPSEP,REPCTR) Q:'MODDATA1 D
- . F Z="1701","1703" D
- .. S MCOMPNUM=$E(Z,3,4)
- .. S DATA=$P(MODDATA1,"~",MCOMPNUM)
- .. ;
- .. ;- pass procedure AND modifier if validating modifier
- .. S:MCOMPNUM="01" DATA=PROC_"~"_DATA
- .. D VALIDATE^SCMSVUT0(SEG,DATA,$P($T(@(Z)),";",3),VALERR,.CNT)
- .. Q
- . S REPCTR=REPCTR+1
- . Q
- Q
- ;
- ;
- ;
- ;- PR1 data elements validated
- ;
- ;
- 0101 ;;0035;HL7 SEGMENT NAME
- 0201 ;;6250;HL7 SEQUENTIAL NUMBER (SET ID)
- 0401 ;;6050;PROCEDURE CODE (CPT)
- 0403 ;;6000;PROCEDURE CODING METHOD
- 1701 ;;6300;PROCEDURE MODIFIER AND PROC+MOD COMBINATION
- 1703 ;;6370;PROCEDURE MODIFIER CODING METHOD
- SCMSVPR1 ;ALB/ESD HL7 PR1 Segment Validation ;06/24/99
- +1 ;;5.3;Scheduling;**44,66,142,180,1015**;Aug 13, 1993;Build 21
- +2 ;06/24/99 ACS - Added CPT modifier to the validation process
- +3 ;
- EN(PR1ARRY,HLQ,HLFS,HLECH,VALERR,ENCDT) ;
- +1 ; Entry point to return the HL7 PR1 (Procedure) validation segment
- +2 ;
- +3 ; Input: PR1ARRY - Array of PR1 Segments
- +4 ; HLQ - HL7 null variable
- +5 ; HLFS - HL7 field separator
- +6 ; HLECH - HL7 encoding characters
- +7 ; VALERR - Array to put errors in
- +8 ; ENCDT - Date of encounter
- +9 ;
- +10 ; Output: 1 if PR1 passed validity check
- +11 ; Error message if PR1 failed validity check in form of:
- +12 ; -1^"xxx failed validity check" (xxx=element in PR1 segment)
- +13 ;
- +14 ; NOTE: This validity check will pass if at least ONE PR1 segment in
- +15 ; the PR1 array passes the validity checks.
- +16 ;
- +17 NEW I,J,MSG,OUT,PR1SEG,PR1ASEG,PRTYPE,VALID,X,CNT,SCSETID,SEG,OLD
- +18 SET X=""
- SET (I,OUT)=0
- SET MSG="-1^Element in PR1 segment failed validity check"
- SET (SCSETID,CNT)=1
- SET SEG="PR1"
- +19 SET PR1ARRY=$GET(PR1ARRY)
- +20 IF (PR1ARRY="")
- SET PR1ARRY="^TMP(""VAFHL"",$J,""PROCEDURE"")"
- +21 FOR
- SET I=+$ORDER(@PR1ARRY@(I))
- IF 'I
- QUIT
- Begin DoDot:1
- +22 SET VALID(I)=1
- +23 SET J=""
- SET J=$ORDER(@PR1ARRY@(I,J))
- IF J=""
- QUIT
- +24 ;S PR1SEG=$G(@PR1ARRY@(I,J))
- +25 ;-----------------------------------------------------------
- +26 ; After the merge, PR1SEG looks like this:
- +27 ; PR1SEG=PR1^n^...^cpt^...
- +28 ; PR1SEG(1)=|mod~desc~meth|mod~desc~meth|...
- +29 ; PR1SEG(2)=|mod~desc~meth|mod~desc~meth|...
- +30 ;-----------------------------------------------------------
- +31 MERGE PR1SEG=@PR1ARRY@(I,J)
- +32 SET OLD=CNT
- +33 DO VALIDATE^SCMSVUT0(SEG,PR1SEG,"0009",VALERR,.CNT)
- +34 IF $GET(@VALERR@(SEG,OLD))="0009"
- QUIT
- +35 SET PR1SEG=$$CONVERT^SCMSVUT0(PR1SEG,HLFS,HLQ)
- +36 ;
- +37 ;- Validate procedure fields
- +38 ;D PROCVAL(PR1SEG)
- +39 DO PROCVAL(.PR1SEG)
- +40 QUIT
- End DoDot:1
- +41 ;
- +42 IF '$DATA(VALID)
- DO VALIDATE^SCMSVUT0(SEG,"","0009",VALERR,.CNT)
- ENQ QUIT $SELECT($DATA(@VALERR@(SEG)):MSG,1:1)
- +1 ;
- PROCVAL(PR1SEG) ; -Validate procedure fields
- +1 ;
- +2 ;N Z,DATA,CMPSEP
- +3 NEW Z,DATA,CMPSEP,REPSEP
- +4 SET CMPSEP=$EXTRACT(HLECH,1)
- +5 SET REPSEP=$EXTRACT(HLECH,2)
- +6 FOR Z="0101","0201","0401","0403"
- Begin DoDot:1
- +7 SET DATA=$PIECE(PR1SEG,HLFS,+$EXTRACT(Z,1,2))
- +8 SET DATA=$PIECE(DATA,CMPSEP,+$EXTRACT(Z,3,4))
- +9 DO VALIDATE^SCMSVUT0(SEG,DATA,$PIECE($TEXT(@(Z)),";",3),VALERR,.CNT)
- End DoDot:1
- +10 ;
- +11 ;--------------------------------------------------------------
- +12 ; VALIDATE PROCEDURE MODIFIER FIELDS
- +13 ;
- +14 ; The modifier, cpt+modifier, and modifier coding method are
- +15 ; validated
- +16 ;
- +17 ; MODDATA = mod seq, piece 17: mod~desc~code meth|mod~desc~...
- +18 ; CTR = continuation segment counter
- +19 ; PROC = CPT procedure code
- +20 ;--------------------------------------------------------------
- +21 ;
- +22 ;- validate modifier components in the first PR1 array seg
- +23 NEW MODDATA,PROC
- +24 SET PROC=$PIECE($PIECE(PR1SEG,HLFS,4),CMPSEP,1)
- +25 SET MODDATA=$PIECE(PR1SEG,HLFS,17)
- +26 IF 'MODDATA
- QUIT
- +27 DO SETUP(MODDATA,PROC)
- +28 ;
- +29 ;- validate modifier components in the PR1 continuation segments
- +30 NEW CTR,MODDATA
- +31 SET CTR=1
- SET MODDATA=""
- +32 FOR
- SET MODDATA=$EXTRACT($GET(PR1SEG(CTR)),2,245)
- IF 'MODDATA
- QUIT
- Begin DoDot:1
- +33 DO SETUP(MODDATA,PROC)
- +34 SET CTR=CTR+1
- +35 QUIT
- End DoDot:1
- +36 QUIT
- +37 ;
- SETUP(MODDATA,PROC) ;
- +1 ;
- +2 ;---------------------------------------------------------------
- +3 ; SET UP AND VALIDATE MODIFIER COMPONENTS
- +4 ;
- +5 ; INPUT: MODDATA = modifier components
- +6 ; format: mod~desc~meth|mod~desc~meth|...
- +7 ; PROC = CPT procedure
- +8 ;
- +9 ; OTHER:
- +10 ; REPSEP = repetition separator ("|")
- +11 ; SEG = PR1
- +12 ; CNT = 1
- +13 ; VALERR = error message array
- +14 ; MCOMPNUM = modifier component number to validate
- +15 ; REPCTR = modifier repetition counter
- +16 ; MODDATA1 = each repetition of modifier info
- +17 ; format: mod~desc~meth
- +18 ; DATA = modifier data to validate (i.e. mod or meth)
- +19 ;---------------------------------------------------------------
- +20 ;
- +21 NEW MCOMPNUM,REPCTR,MODDATA1,DATA
- +22 SET REPCTR=1
- +23 ; add repetition separator to end of input data
- +24 SET MODDATA=MODDATA_REPSEP
- +25 ;
- +26 ; validate the modifier and coding method for each repetition
- +27 FOR
- SET MODDATA1=$PIECE(MODDATA,REPSEP,REPCTR)
- IF 'MODDATA1
- QUIT
- Begin DoDot:1
- +28 FOR Z="1701","1703"
- Begin DoDot:2
- +29 SET MCOMPNUM=$EXTRACT(Z,3,4)
- +30 SET DATA=$PIECE(MODDATA1,"~",MCOMPNUM)
- +31 ;
- +32 ;- pass procedure AND modifier if validating modifier
- +33 IF MCOMPNUM="01"
- SET DATA=PROC_"~"_DATA
- +34 DO VALIDATE^SCMSVUT0(SEG,DATA,$PIECE($TEXT(@(Z)),";",3),VALERR,.CNT)
- +35 QUIT
- End DoDot:2
- +36 SET REPCTR=REPCTR+1
- +37 QUIT
- End DoDot:1
- +38 QUIT
- +39 ;
- +40 ;
- +41 ;
- +42 ;- PR1 data elements validated
- +43 ;
- +44 ;
- 0101 ;;0035;HL7 SEGMENT NAME
- 0201 ;;6250;HL7 SEQUENTIAL NUMBER (SET ID)
- 0401 ;;6050;PROCEDURE CODE (CPT)
- 0403 ;;6000;PROCEDURE CODING METHOD
- 1701 ;;6300;PROCEDURE MODIFIER AND PROC+MOD COMBINATION
- 1703 ;;6370;PROCEDURE MODIFIER CODING METHOD