*DECK FFSUVUC 
USETEXT TEXTFFS 
PROC FFSUVUC ((CHARGEN), (PROJECT), CSTATUS, ADDR$MSG); 
*CALL COPYRITE
# TITLE FFSUVUC - VALIDATE USER CHARGE.                               # 
  
      BEGIN  # FFSUVUC #
  
# 
**    FFSUVUC- VALIDATE USER CHARGE.
* 
*     'FFSUVUC' VALIDATES THE USER-ENTERED CHARGE / PROJECT.
* 
*     PROC FFSUVUC ((CHARGEN), (PROJECT), CSTATUS)
* 
*     ENTRY      (CHARGEN)  = 1-10 CHARACTER, ZERO-FILLED CHARGE
*                             NUMBER. 
*                (PROJECT)  = 1-20 CHARACTER, ZERO-FILLED PROJECT 
*                             NUMBER. 
*                VAL$BLOCK  = PREVIOUSLY DEFINED BY 'FFSUVUI' AS
*                             PART OF SUCCESSFUL USER VALIDATION.  IN 
*                             PARTICULAR, THE VAL$USER, VAL$AACW, 
*                             VAL$CHARGE, AND VAL$PROJCT FIELDS MUST
*                             BE DEFINED. 
*                VAL$STATE  = DEFINED IN 'VAL$COM' COMMON BLOCK.
* 
*     EXIT       CSTATUS      SET TO RETURN STATUS AS DEFINED BY
*                             'VRS$STATUS' IN 'COMVVAL'.
*                MORE$TEXT    ERROR MESSAGE IF UNSUCCESSFUL.
* 
*     MESSAGES.  "CHARGE, CHARGE-NUMBER, PROJECT-NUMBER." IS ISSUED TO
*                TO THE DAYFILE FOR EVERY CHARGE NUMBER WHICH IS
*                ATTEMPTED TO BE SET.  (IF THE CURRENT STATE DOES NOT 
*                ALLOW A CHARGE TO BE ISSUED, THEN NO MESSAGE IS
*                ISSUED).  MESSAGES RECEIVED FROM 'COMCCHG' ARE ECHOED
*                TO THE DAYFILE IF CHARGE VALIDATION IS REJECTED.  SEE
*                NOS DECK 'COMCCHG' FOR A LIST OF THESE MESSAGES. 
* 
*     DESCRIPTION.
*       IF A VALID USER STATEMENT IS NOT ACTIVE THEN
*         RETURN NOUSER ERROR STATUS. 
*       ISSUE THE CHARGE STATEMENT TO THE DAYFILE.
*       SET PARAMETERS AND CALL SETCHG. 
*       IF SETCHG RETURNED AN ERROR MESSAGE THEN
*         ISSUE THE MESSAGE TO THE DAYFILE. 
*         SET CHARGE VALIDATION FAILED STATUS.
*       ELSEIF SETCHG RETURNED NO ERROR THEN
*         ISSUE THE ACTIVE CHARGE/PROJECT TO THE DAYFILE. 
*         SET THE STATE TO VALID USER.
*     RETURN. 
* 
# 
  
      ITEM CHARGEN    C(10);         # CHARGE NUMBER                  # 
      ITEM PROJECT    C(20);         # PROJECT NUMBER                 # 
      ITEM CSTATUS    S:VRS$STATUS;  # 'CHARGE' RETURN STATUS         # 
  
      XREF
        BEGIN 
        FUNC FFSUTBZ C(240) ;        # CONVERT TRAILING BLANKS TO ZERO# 
        PROC MESSAGE ;               # SEND MESSAGE TO DAYFILE/ACCOUNT# 
        PROC SETCHG;                 # SET NEW CHARGE/PROJECT         # 
        PROC XSNM;                   # SET NAME IN MESSAGE            # 
        END 
  
  
      ARRAY ZEROFILL S(1) ; 
        BEGIN 
        ITEM ZEROWORD C(00,00,10) ; 
        ITEM ZERO     U(00,00,60) = [0] ; 
        END 
  
      ITEM ADDR$MSG   U;             # MESSAGE ADDRESS FROM 'SETCHG'  # 
      ITEM DEFAULT    B;             # CHARGE IS USER DEFAULT         # 
      ITEM MSG$BUFF   C(80);         # ACCOUNT/DAYFILE MESSAGE BUFFER # 
      ITEM MSG$CHARGE C(80) =        # CHARGE DAYFILE MESSAGE TMPLATE # 
                          "CHARGE, !!!!!!!!!!, ++++++++++----------.";
      ITEM MSG$ACHG   C(80) =        # ACTIVATED CHARGE DAYFILE MSG   # 
               "CHARGE = !!!!!!!!!!, PROJECT = ++++++++++----------.";
  
      BASED ARRAY CHG$MSGA [0:0] S(8); # CHARGE MESSAGE TEMPLATE      # 
        BEGIN 
        ITEM CHG$MSG  C(00,00,80);   # CHARGE MESSAGE STRING          # 
        END 
      BASED ARRAY DUMMYBA[0:0] ;; 
  
                                               CONTROL EJECT; 
  
# 
*     CHARGE/PROJECT NUMBERS REQUIRE THAT A VALID USER NAME BE ACTIVE.
*     CHECK THAT A VALID USER NAME IS ACTIVE. 
# 
      IF VAL$STATE NQ S"VST$CHARGE" 
       AND
         VAL$STATE NQ S"VST$USER" 
      THEN
        BEGIN 
        CSTATUS = S"VRS$NOUSER";     # NO USER ACTIVE ERROR           # 
        RETURN; 
        END 
  
      DEFAULT = FALSE;               # RESET DEFAULT CHARGE INDICATOR # 
      ADDR$MSG = 0 ;
      P<VAL$BLOCK> = LOC (JOB$VAL);  # POSITION VALIDATION BLOCK      # 
      P<AACW>      = LOC (VAL$AACW); # POSITION ACCOUNT ACCESS WORD   # 
  
      JBC$CHARGE = CHARGEN;          # SET CHARGE NUMBER              # 
      JBC$PROJCT = PROJECT;          # SET PROJECT NUMBER             # 
      JBC$VALID  = FALSE;            # CHARGE NOT YET VALIDATED       # 
      MORE$T[0] = 0;
      FTP$HYPHEN[MSG$500] = " ";
  
      C<0, 80>MSG$BUFF = FFSUTBZ(MSG$CHARGE, 80); 
      XSNM (MSG$BUFF, "!", JBC$CHARGE, MSG$BUFF); 
      XSNM (MSG$BUFF, "+", JBC$PROJCT, MSG$BUFF); 
      XSNM (MSG$BUFF, "-", JBC$PROJC2, MSG$BUFF); 
      MESSAGE (MSG$BUFF, 0);         # ISSUE CHARGE TO DAYFILE        # 
  
      P<DUMMYBA> = LOC(JBC$PROJCT); 
      SETCHG (JBC$CHARGE, DUMMYBA, FFSUTBZ(VAL$USER, 10), 
              DEFAULT, ADDR$MSG); 
      IF ADDR$MSG NQ 0
      THEN                           # CHARGE REQUEST FAILED          # 
        BEGIN 
        CSTATUS = S"VRS$CHGFAIL";    # CHARGE VALIDATION FAILED ERROR # 
        P<CHG$MSGA> = ADDR$MSG;      # POSITION MESSAGE TEMPLATE      # 
        MESSAGE (CHG$MSG, 0);        # SET MESSAGE FROM CHARGE PROC   # 
        END 
  
      ELSE                           # CHARGE IS VALIDATED            # 
        BEGIN 
        JBC$VALID = TRUE;            # SET VALID CHARGE INDICATOR     # 
        CSTATUS = S"VRS$VALID"; 
        C<0, 80>MSG$BUFF = FFSUTBZ(MSG$ACHG, 80); 
        XSNM (MSG$BUFF, "!", JBC$CHARGE, MSG$BUFF); 
        XSNM (MSG$BUFF, "+", JBC$PROJCT, MSG$BUFF); 
        XSNM (MSG$BUFF, "-", JBC$PROJC2, MSG$BUFF); 
        MESSAGE (MSG$BUFF, 0);       # ISSUE ACTIVE CHARGE TO DAYFILE # 
        END 
  
      RETURN; 
  
      END    # FFSUVUC #
      TERM
