XUSER2 ;ISF/RWF - New Person File Utilities ;02/01/2012
 ;;8.0;KERNEL;**267,251,344,534,580,765**;Jul 10, 1995;Build 3
 ;Per VHA Directive 2004-038, this routine should not be modified.
 Q
VALDEA(X,F) ;Check for a valid DEA#
 ;Returns 0 for NOT Valid, 1 for Valid
 ;F = 1 for Facility DEA check.
 N VAPR,VADUP,VADUPNAM,VASTER
 S $P(VASTER,"*",80)="*"
 I $D(X) K:$L(X)>9!($L(X)<9)!'(X?2U7N) X
 S F=$G(F)
 I $D(X),'F,$D(DA),$D(^VA(200,"PS1",X)) D
 . S VADUP=0,VAPR=0 F  S VAPR=$O(^VA(200,"PS1",X,VAPR)) Q:'VAPR  I VAPR'=DA S VADUP=VAPR
 . I VADUP D  K X
 .. D EN^DDIOL($C(7)_$E(VASTER,1,70))
 .. D EN^DDIOL($C(7)_" DEA number "_X_" has already been assigned to another provider:")
 .. S VADUPNAM=$P($G(^VA(200,+VADUP,0)),U)
 .. D EN^DDIOL($C(7)_"     NAME: "_$G(VADUPNAM))
 .. D EN^DDIOL($C(7)_"      IEN: "_VADUP)
 .. D EN^DDIOL($C(7)_$E(VASTER,1,70))
 .. D EN^DDIOL($C(7)_"Please check the number entered.")
 I $D(X),'F,$D(DA),$E(X,2)'=$E($P(^VA(200,DA,0),"^")) D EN^DDIOL($C(7)_"WARNING: DEA# FORMAT MISMATCH -- CHECK SECOND LETTER")
 I $D(X),'$$DEANUM(X) D EN^DDIOL($C(7)_"CAN'T FILE: DEA# FORMAT MISMATCH -- NUMERIC ALGORITHM FAILED") K X
 Q $D(X)
 ;
DEANUM(X) ;Check DEA # part
 N VA1,VA2
 S VA1=$E(X,3)+$E(X,5)+$E(X,7)+(2*($E(X,4)+$E(X,6)+$E(X,8)))
 S VA1=VA1#10,VA2=$E(X,9)
 Q VA1=VA2
 ;
VANUM ;Check that the VA# is not Active for anybody else. Called from ^DD(200,53.3,0)
 ;Needs DA, DT and X
 Q:'$D(X)!'$D(DA)
 N %
 I $D(^VA(200,"PS2",X)) D
 . S %=0
 . F  S %=$O(^VA(200,"PS2",X,%)) Q:'%  I %'=DA,$S('$P($G(^VA(200,%,"PS")),"^",4):1,1:$P(^("PS"),"^",4)'<DT) K X Q
 . Q
 I '$D(X) D EN^DDIOL($C(7)_"That VA# is in active use.  ","","!,?5")
 Q
 ;
GETUPN(RET) ;Get SUBJECT ALTERNATIVE NAME for PIV card check. -p580
 S RET=$P($G(^VA(200,DUZ,501)),U,2)
 Q
 ;
SETUPN(RET,V) ;Set the SUBJECT ALTERNATIVE NAME from the PIV card. -p580
 N FDA,ERR
 S RET=0,FDA(200,DUZ_",",501.2)=V
 D FILE^DIE("KE","FDA","ERR") I '$D(ERR) S RET=1
 Q
 ;
REQ(XUV,XUFLAG) ;Called from forms:
 ; XUEXISTING USER, XUNEW USER, XUREACT USER, XU-CLINICAL TRAINEE
 ;from the:
 ; - Form-level pre-action
 ; - Post action on change for "Is this person a Clinical Trainee?"
 ;In:
 ; XUV = 1 if user is a clinical trainee; 0 otherwise
 ;          If XUV is not passed, its value is obtained from the
 ;          CLINICAL CORE TRAINEE(#12.6).
 ; XUFLAG = 1 if called from the XU-CLINICAL TRAINEE form;
 ;          otherwise, called from the other forms
 ;
 N BLOCK,PAGE,FIELD,F126
 ; BLOCK = Block
 ; PAGE = Page number
 ; FIELD = Field number
 I $G(XUFLAG) S BLOCK="XU-CLINICAL TRAINEE 1",PAGE=1
 E  D
 . S BLOCK="XUEXISTING USER TRAINEE"
 . S PAGE=5
 ;
 I $G(XUV)="" D  ;Value not Passed get current value
 . N ZERR
 . S XUV=$$GET^DDSVAL(200,DA,"CLINICAL CORE TRAINEE",.ZERR,"I")
 . S XUV=$S(XUV="N":0,XUV="":0,1:1)
 S F126=XUV
 ;
 ;CURRENT DEGREE LEVEL 12.1
 ;PROGRAM OF STUDY 12.2
 ;LAST TRAINING MONTH & YEAR 12.3
 ;VHA TRAINING FACILITY 12.4
 ;DATE HL7 TRAINEE RECORD BUILT 12.5
 ;CLINICAL CORE TRAINEE 12.6
 ;DATE NO LONGER TRAINEE 12.7
 ;START OF TRAINING 12.8
 ;
 I F126 D  Q  ;Logic for when field 12.6 equals YES or Null
 . N FIELD
 . ;Make fields required
 . F FIELD="12.2F","12.4F" D REQ^DDSUTL(FIELD,BLOCK,PAGE,1)
 . ;Delete value in field 12.7 & make it uneditable
 . S FIELD=12.7 D PUT^DDSVAL(200,DA,FIELD,"@","","I")
 . S FIELD="12.7F" D UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 . D REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 . ;Make the following fields editable
 . F FIELD="12.1F","12.2F","12.3F","12.4F","12.8F" D UNED^DDSUTL(FIELD,BLOCK,PAGE,0)
 . Q
 I 'F126 D  Q  ;Logic for when field 12.6 equals NO
 . N FIELD,ZERR,F122,F127
 . S F122=$$GET^DDSVAL(200,DA,12.2,.ZERR,"I")
 . S F127=$$GET^DDSVAL(200,DA,12.7,.ZERR,"I")
 . I F122="" D  Q  ;Not a trainee, probably a mistake
 .. ;Make fields not required
 .. F FIELD="12.2F","12.4F" D REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 .. ;Make field uneditable
 .. F FIELD="12.1F","12.2F","12.3F","12.4F","12.7F","12.8F" D UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 .. Q
 . I F122]"",F127]"" Q
 . ;Make fields not required
 . F FIELD="12.2F","12.4F" D REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 . ;Make the following field required & editable
 . S FIELD="12.7F" D REQ^DDSUTL(FIELD,BLOCK,PAGE,1)
 . S FIELD="12.7F" D UNED^DDSUTL(FIELD,BLOCK,PAGE,0)
 . ;Don't allow editing of the following fields
 . F FIELD="12.1F","12.2F","12.3F","12.4F","12.8F" D UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 . Q
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUSER2   4489     printed  Sep 23, 2025@19:48:35                                                                                                                                                                                                      Page 2
XUSER2    ;ISF/RWF - New Person File Utilities ;02/01/2012
 +1       ;;8.0;KERNEL;**267,251,344,534,580,765**;Jul 10, 1995;Build 3
 +2       ;Per VHA Directive 2004-038, this routine should not be modified.
 +3        QUIT 
VALDEA(X,F) ;Check for a valid DEA#
 +1       ;Returns 0 for NOT Valid, 1 for Valid
 +2       ;F = 1 for Facility DEA check.
 +3        NEW VAPR,VADUP,VADUPNAM,VASTER
 +4        SET $PIECE(VASTER,"*",80)="*"
 +5        IF $DATA(X)
               if $LENGTH(X)>9!($LENGTH(X)<9)!'(X?2U7N)
                   KILL X
 +6        SET F=$GET(F)
 +7        IF $DATA(X)
               IF 'F
                   IF $DATA(DA)
                       IF $DATA(^VA(200,"PS1",X))
                           Begin DoDot:1
 +8                            SET VADUP=0
                               SET VAPR=0
                               FOR 
                                   SET VAPR=$ORDER(^VA(200,"PS1",X,VAPR))
                                   if 'VAPR
                                       QUIT 
                                   IF VAPR'=DA
                                       SET VADUP=VAPR
 +9                            IF VADUP
                                   Begin DoDot:2
 +10                                   DO EN^DDIOL($CHAR(7)_$EXTRACT(VASTER,1,70))
 +11                                   DO EN^DDIOL($CHAR(7)_" DEA number "_X_" has already been assigned to another provider:")
 +12                                   SET VADUPNAM=$PIECE($GET(^VA(200,+VADUP,0)),U)
 +13                                   DO EN^DDIOL($CHAR(7)_"     NAME: "_$GET(VADUPNAM))
 +14                                   DO EN^DDIOL($CHAR(7)_"      IEN: "_VADUP)
 +15                                   DO EN^DDIOL($CHAR(7)_$EXTRACT(VASTER,1,70))
 +16                                   DO EN^DDIOL($CHAR(7)_"Please check the number entered.")
                                   End DoDot:2
                                   KILL X
                           End DoDot:1
 +17       IF $DATA(X)
               IF 'F
                   IF $DATA(DA)
                       IF $EXTRACT(X,2)'=$EXTRACT($PIECE(^VA(200,DA,0),"^"))
                           DO EN^DDIOL($CHAR(7)_"WARNING: DEA# FORMAT MISMATCH -- CHECK SECOND LETTER")
 +18       IF $DATA(X)
               IF '$$DEANUM(X)
                   DO EN^DDIOL($CHAR(7)_"CAN'T FILE: DEA# FORMAT MISMATCH -- NUMERIC ALGORITHM FAILED")
                   KILL X
 +19       QUIT $DATA(X)
 +20      ;
DEANUM(X) ;Check DEA # part
 +1        NEW VA1,VA2
 +2        SET VA1=$EXTRACT(X,3)+$EXTRACT(X,5)+$EXTRACT(X,7)+(2*($EXTRACT(X,4)+$EXTRACT(X,6)+$EXTRACT(X,8)))
 +3        SET VA1=VA1#10
           SET VA2=$EXTRACT(X,9)
 +4        QUIT VA1=VA2
 +5       ;
VANUM     ;Check that the VA# is not Active for anybody else. Called from ^DD(200,53.3,0)
 +1       ;Needs DA, DT and X
 +2        if '$DATA(X)!'$DATA(DA)
               QUIT 
 +3        NEW %
 +4        IF $DATA(^VA(200,"PS2",X))
               Begin DoDot:1
 +5                SET %=0
 +6                FOR 
                       SET %=$ORDER(^VA(200,"PS2",X,%))
                       if '%
                           QUIT 
                       IF %'=DA
                           IF $SELECT('$PIECE($GET(^VA(200,%,"PS")),"^",4):1,1:$PIECE(^("PS"),"^",4)'<DT)
                               KILL X
                               QUIT 
 +7                QUIT 
               End DoDot:1
 +8        IF '$DATA(X)
               DO EN^DDIOL($CHAR(7)_"That VA# is in active use.  ","","!,?5")
 +9        QUIT 
 +10      ;
GETUPN(RET) ;Get SUBJECT ALTERNATIVE NAME for PIV card check. -p580
 +1        SET RET=$PIECE($GET(^VA(200,DUZ,501)),U,2)
 +2        QUIT 
 +3       ;
SETUPN(RET,V) ;Set the SUBJECT ALTERNATIVE NAME from the PIV card. -p580
 +1        NEW FDA,ERR
 +2        SET RET=0
           SET FDA(200,DUZ_",",501.2)=V
 +3        DO FILE^DIE("KE","FDA","ERR")
           IF '$DATA(ERR)
               SET RET=1
 +4        QUIT 
 +5       ;
REQ(XUV,XUFLAG) ;Called from forms:
 +1       ; XUEXISTING USER, XUNEW USER, XUREACT USER, XU-CLINICAL TRAINEE
 +2       ;from the:
 +3       ; - Form-level pre-action
 +4       ; - Post action on change for "Is this person a Clinical Trainee?"
 +5       ;In:
 +6       ; XUV = 1 if user is a clinical trainee; 0 otherwise
 +7       ;          If XUV is not passed, its value is obtained from the
 +8       ;          CLINICAL CORE TRAINEE(#12.6).
 +9       ; XUFLAG = 1 if called from the XU-CLINICAL TRAINEE form;
 +10      ;          otherwise, called from the other forms
 +11      ;
 +12       NEW BLOCK,PAGE,FIELD,F126
 +13      ; BLOCK = Block
 +14      ; PAGE = Page number
 +15      ; FIELD = Field number
 +16       IF $GET(XUFLAG)
               SET BLOCK="XU-CLINICAL TRAINEE 1"
               SET PAGE=1
 +17      IF '$TEST
               Begin DoDot:1
 +18               SET BLOCK="XUEXISTING USER TRAINEE"
 +19               SET PAGE=5
               End DoDot:1
 +20      ;
 +21      ;Value not Passed get current value
           IF $GET(XUV)=""
               Begin DoDot:1
 +22               NEW ZERR
 +23               SET XUV=$$GET^DDSVAL(200,DA,"CLINICAL CORE TRAINEE",.ZERR,"I")
 +24               SET XUV=$SELECT(XUV="N":0,XUV="":0,1:1)
               End DoDot:1
 +25       SET F126=XUV
 +26      ;
 +27      ;CURRENT DEGREE LEVEL 12.1
 +28      ;PROGRAM OF STUDY 12.2
 +29      ;LAST TRAINING MONTH & YEAR 12.3
 +30      ;VHA TRAINING FACILITY 12.4
 +31      ;DATE HL7 TRAINEE RECORD BUILT 12.5
 +32      ;CLINICAL CORE TRAINEE 12.6
 +33      ;DATE NO LONGER TRAINEE 12.7
 +34      ;START OF TRAINING 12.8
 +35      ;
 +36      ;Logic for when field 12.6 equals YES or Null
           IF F126
               Begin DoDot:1
 +37               NEW FIELD
 +38      ;Make fields required
 +39               FOR FIELD="12.2F","12.4F"
                       DO REQ^DDSUTL(FIELD,BLOCK,PAGE,1)
 +40      ;Delete value in field 12.7 & make it uneditable
 +41               SET FIELD=12.7
                   DO PUT^DDSVAL(200,DA,FIELD,"@","","I")
 +42               SET FIELD="12.7F"
                   DO UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 +43               DO REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 +44      ;Make the following fields editable
 +45               FOR FIELD="12.1F","12.2F","12.3F","12.4F","12.8F"
                       DO UNED^DDSUTL(FIELD,BLOCK,PAGE,0)
 +46               QUIT 
               End DoDot:1
               QUIT 
 +47      ;Logic for when field 12.6 equals NO
           IF 'F126
               Begin DoDot:1
 +48               NEW FIELD,ZERR,F122,F127
 +49               SET F122=$$GET^DDSVAL(200,DA,12.2,.ZERR,"I")
 +50               SET F127=$$GET^DDSVAL(200,DA,12.7,.ZERR,"I")
 +51      ;Not a trainee, probably a mistake
                   IF F122=""
                       Begin DoDot:2
 +52      ;Make fields not required
 +53                       FOR FIELD="12.2F","12.4F"
                               DO REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 +54      ;Make field uneditable
 +55                       FOR FIELD="12.1F","12.2F","12.3F","12.4F","12.7F","12.8F"
                               DO UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 +56                       QUIT 
                       End DoDot:2
                       QUIT 
 +57               IF F122]""
                       IF F127]""
                           QUIT 
 +58      ;Make fields not required
 +59               FOR FIELD="12.2F","12.4F"
                       DO REQ^DDSUTL(FIELD,BLOCK,PAGE,0)
 +60      ;Make the following field required & editable
 +61               SET FIELD="12.7F"
                   DO REQ^DDSUTL(FIELD,BLOCK,PAGE,1)
 +62               SET FIELD="12.7F"
                   DO UNED^DDSUTL(FIELD,BLOCK,PAGE,0)
 +63      ;Don't allow editing of the following fields
 +64               FOR FIELD="12.1F","12.2F","12.3F","12.4F","12.8F"
                       DO UNED^DDSUTL(FIELD,BLOCK,PAGE,1)
 +65               QUIT 
               End DoDot:1
               QUIT 
 +66       QUIT