*DECK     NVFTIAM 
USETEXT          TEXTNVF
USETEXT          TXTANVF
  
PROC NVFTIAM((PT),(MTYP));
# TITLE NVFTIAM - ISSUE ACCOUNTING MESSAGE                             #
  
      BEGIN  # NVFTIAM #
# 
**    NVFTIAM - ISSUE ACCOUNTING MESSAGE. 
* 
*     E. THAVIKULWAT    81/10/22
* 
*     THIS PROCEDURE ISSUES ACCOUNT MESSAGES TO THE SYSTEM'S ACCOUNT
*     DAYFILE.  IT IS CALLED INTO EXECUTION BY THE FOLLOWING
*     PROCEDURES: 
*       *NVFTACC*   *NVFTCRN*   *NVFTETC*   *NVFTPSV*   *NVFTRVD* 
*       *NVFTPUV* 
* 
*     PROC NVFTIAM((PT),(MTYP)) 
* 
*     ENTRY:  
*       PT   = POINTER TO PTAC ENTRY
*       MTYP = TYPE OF ACCOUNT MESSAGE TO ISSUE:  
*                 1 = ABUN
*                 2 = AEUN
*                 3 = ABAP
*                 4 = AEAP
*                 5 = ABER
*TEXT 
*                 6 = ABIC
*                 7 = SIPI
*ENDTEXT
* 
*     EXIT: 
*       APPROPRIATE ACCOUNT MESSAGE ISSUED TO THE SYSTEM'S ACCOUNT
*       DAYFILE.
* 
*     NOTES:  
*       FOLLOWING ARE THE FORMATS OF THE ACCOUNT MESSAGES:  
*         1) ABUN, USERNUM, FAMNAME, TRMNAME. 
*         2) AEUN, C1, USERNUM, FAMNAME, TRMNAME. 
*            AEUN, C2, XXXXXXSECS.
*         3) ABAP, C1, USERNUM, FAMNAME, TRMNAME. 
*            ABAP, C2, APPNAME. 
*         4) AEAP, C1, USERNUM, FAMNAME, TRMNAME. 
*            AEAP, C2, APPNAME, XXXXXXSECS. 
*         5) ABER, USERNUM, FAMNAME, TRMNAME. 
*TEXT 
*         6) ABIC, CHARNUMBER, PROJNUMBER, TRMNAME. 
*         7) SIPI, PERSONAL IDENTIFIER. 
*ENDTEXT
* 
*     METHOD: 
*       FOR EACH PARAMETER OF THE ACCOUNT MESSAGE, CALL INTERNAL
*       PROCEDURE *EXTRACT* TO DELETE TRAILING ZEROES AND BLANKS. 
*       WHEN MESSAGE IS COMPLETE, CALL MACREL ROUTINE *MESSAGE* TO
*       SEND IT TO THE ACCOUNT DAYFILE. 
# 
  
# 
****  PROC NVFTIAM - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC MESSAGE;        # SEND MESSAGE                            #
        PROC NVFTCCT;        # CALCULATE APPLICATION CONNECT TIME      #
        PROC SSBEBF;         # EXTRACT BIT FIELDS                      #
        PROC SSBSBF;         # STORE BIT FIELDS                        #
        END 
  
# 
****
# 
      DEF  COMMA$   #O"5655"#;         # COMMA FOLLOWED BY ONE BLANK   #
      DEF  PERIOD$  #O"57000000"#;     # PERIOD FOLLOWED BY ZERO BYTE  #
      DEF  SECS$    #O"2305032357000000"#; # "SECS." FOLLOWED BY 0 BYTE#
  
      ITEM BITSBF     I;     # STARTING BIT OF MESSAGE ASSEMBLY AREA   #
      ITEM EBFNAME    C(20); # NAME TO BE ENTERED IN MESSAGE           #
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM LEN        I;     # NUMBER OF BITS TO STORE                 #
      ITEM MTYP       I;     # TYPE OF ACCOUNT MESSAGE TO ISSUE        #
      ITEM ORDSBF     I;     # STARTING WORD OF MESSAGE ASSEMBLY AREA  #
      ITEM PT         I;     # SUBSCRIPT FOR ARRAY PTAC                #
      ITEM CNTYP         I;          # CONNECTION TYPE INDICATOR #
      ITEM TEMP       I;     # TEMPORARY STORAGE AREA                  #
      ITEM TERMVAL    I;     # NUMBER OF PARAMS IN ACCOUNT MESSAGE - 1 #
  
# 
*     FOLLOWING ARRAY IS THE ASSEMBLY AREA FOR THE ACCOUNT MESSAGES.
# 
      ARRAY ACCMSG[00:00] S(6); 
        BEGIN 
        ITEM ACC$TYP    C(00,00,10);   # MESSAGE TYP                   #
        ITEM ACC$C2     C(00,36,02);   # AREA FOR LITERAL C2           #
        END 
  
# 
*     FOLLOWING ARRAY DEFINES THE TYPE OF ACCOUNT MESSAGES. 
# 
      ARRAY ACCTYP[00:06] S(1); 
        BEGIN 
        ITEM ACT$WORD   C(00,00,10);   # FULL WORD REFERENCE           #
        ITEM ACT$TYPE   C(00,00,10) = 
            ["ABUN, ","AEUN, C1, ","ABAP, C1, ","AEAP, C1, ","ABER, ",
             "ABIC, ","SIPI, "];
        END 
  
# 
*     INFORMATION TO BE ENTERED INTO THE ACCOUNT MESSAGES ARE SAVED 
*     IN THE FOLLOWING ARRAY. 
# 
      ARRAY VALUES[00:02] S(2); 
        BEGIN 
        ITEM VAL$WORD   C(00,00,20);
        END 
  
      IF (MTYP EQ SIPI$)
      THEN                             # SET PERSONAL IDENTIFIER       #
        BEGIN 
        VAL$WORD[0] = PTA$PID[PT];
        END 
      ELSE
        BEGIN 
        IF (MTYP EQ ABIC$)
        THEN                           # SET CHARGE AND PROJECT NUMBER #
          BEGIN 
          VAL$WORD[0] = PTA$CHGNUM[PT];# CHARGE NUMBER                 #
          VAL$WORD[1] = PTA$PRJNUM[PT];# PROJECT NUMBER                #
          END 
        ELSE                           # SET USER NAME AND FAMILY NAME #
          BEGIN 
          VAL$WORD[0] = PTA$UNUM[PT];  # USER NAME                     #
          VAL$WORD[1] = PTA$FNAM[PT];  # FAMILY NAME                   #
          END 
        VAL$WORD[2] = PTA$TN[PT];      # SET TERMINAL NAME             #
        END 
  
      ACC$TYP[0] = ACT$WORD[MTYP-1];   # MESSAGE TYPE TO ASSEMBLY AREA #
# 
*     BUILD VARIABLE PORTION OF ACCOUNT MESSAGE.
# 
      IF (MTYP EQ ABUN$) OR (MTYP EQ ABIC$) 
         OR (MTYP EQ ABER$) OR (MTYP EQ SIPI$)
      THEN                             # ABUN/ABIC/ABER/SIPI MESG      #
        BEGIN 
        ORDSBF = 0; 
        BITSBF = 36;
        END 
      ELSE                             # ABAP/AEAP/AEUN ACCOUNT MESSAGE#
        BEGIN 
        ORDSBF = 1; 
        BITSBF = 0; 
        END 
  
      IF (MTYP EQ ABER$) AND PTA$IFU[PT]
      THEN
        BEGIN 
        PTA$IFU[PT]=FALSE;
        VAL$WORD[0]=0;
        VAL$WORD[1]=0;
        END 
  
      TEMP = COMMA$;
      LEN  = 12;
      IF (MTYP EQ SIPI$)
      THEN
        BEGIN 
        TERMVAL = 0;
        END 
      ELSE
        BEGIN 
        TERMVAL = 2;
        END 
  
      FOR I = 0 STEP 1 UNTIL TERMVAL
      DO
        BEGIN 
        EBFNAME = VAL$WORD[I];
        EXTRACT;                       # EXTRACT NONZERO/NONBLANK CHAR #
# 
*       UPON RETURN FROM *EXTRACT*, A COMMA FOLLOWED BY ONE BLANK WILL
*       BE INSERTED INTO THE MESSAGE STREAM EXCEPT FOR THE LAST 
*       PARAMETER.  FOR THE LAST PARAMETER, A PERIOD FOLLOWED BY 12 
*       BITS OF ZERO IS INSERTED INTO THE MESSAGE STREAM INSTEAD. 
# 
        IF I EQ TERMVAL 
        THEN                           # LAST PARAMETER                #
          BEGIN 
          TEMP = PERIOD$; 
          LEN  = 24;
          END 
  
        SSBSBF(ACCMSG,ORDSBF,BITSBF,LEN,TEMP);
        END 
  
      MESSAGE(ACCMSG,5);               # MESSAGE TO ACCOUNT DAYFILE    #
# 
*     FOR ABAP AND AEAP AND AEUN FORM A SECOND LINE OF MESSAGE. 
# 
      IF (MTYP EQ ABAP$) OR (MTYP EQ AEAP$) OR (MTYP EQ AEUN$)
      THEN
        BEGIN 
        ACC$C2[0] = "C2"; 
        ORDSBF    = 1;
        BITSBF    = 0;
        IF (MTYP NQ AEUN$)
        THEN
        BEGIN 
          EBFNAME = PTA$SWTAPP[PT]; 
  
          EXTRACT;                     # EXTRACT NONBLANK CHARACTERS   #
        END 
# 
*       IF THE ABAP MESSAGE, INSERT A PERIOD AND ZERO BYTE TERMINATIOR. 
*       IF AEAP, INSERT COMMA AND BLANK AND CALL *NVFTCCT* TO CALCULATE 
*       APPLICATION CONNECT TIME, IF AEUN, CALL *NVFTCCT* TO CALCULATE
*       TERMINAL SESSION CONNECT TIME.
# 
        IF (MTYP EQ ABAP$)
        THEN                           # ABAP ACCOUNT MESSAGE          #
          BEGIN 
          TEMP = PERIOD$; 
          LEN  = 24;
          END 
        ELSE IF (MTYP EQ AEAP$)        # AEAP ACCOUNT MESSAGE          #
        THEN
          BEGIN 
          TEMP = COMMA$;
          LEN  = 12;
          SSBSBF(ACCMSG,ORDSBF,BITSBF,LEN,TEMP);
          CNTYP = TATIME$;
          NVFTCCT(PT,0,EBFNAME,CNTYP); # CALC APPL CONNECT TIME   # 
          EXTRACT;                     # EXTRACT NONBLANK CHARACTERS   #
          TEMP = SECS$; 
          LEN  = 48;
          END 
        ELSE
          BEGIN                        # AEUN ACCOUNT MESSAGE          #
          CNTYP=TSTIME$;
          NVFTCCT(PT,0,EBFNAME,CNTYP); # CALC TERMINAL SESSION CONN TIM#
          EXTRACT;
          TEMP=SECS$; 
          LEN=48; 
          END 
  
        SSBSBF(ACCMSG,ORDSBF,BITSBF,LEN,TEMP);
        MESSAGE(ACCMSG,5);             # MESSAGE TO ACCOUNT DAYFILE    #
        END 
  
CONTROL EJECT;
  
PROC EXTRACT; 
# TITLE EXTRACT - EXTRACT NONZERO AND NONBLANK CHARACTERS              #
  
      BEGIN  # EXTRACT #
# 
**    EXTRACT - EXTRACT NONZERO AND NONBLANK CHARACTERS.
* 
*     E. THAVIKULWAT    81/10/22
* 
*     THIS PROCEDURE IS INTERNAL TO PROCEDURE *NVFTIAM* AND IS CALLED 
*     ONLY BY *NVFTIAM*.  IT'S MAIN FUNCTION IS TO DELETE TRAILING
*     ZEROES AND BLANKS FROM NAMES AND STORE IT INTO ACCOUNT MESSAGE
*     ASSEMBLY AREA.
* 
*     PROC EXTRACT
* 
*     ENTRY:  
*       *EBFNAME* CONTAINS THE NAME, LEFT JUSTIFIED.
*       *ORDSBF*  CONTAINS THE STARTING WORD OF MESSAGE ASSEMBLY AREA 
*       *BITSBF*  CONTAINS STARTING BIT OF MESSAGE ASSEMBLY AREA
* 
*     EXIT: 
*       NAME WITHOUT TRAILING ZEROES AND BLANKS PACKED INTO ACCOUNT 
*       MESSAGE ASSEMBLY AREA.
* 
*     NOTES:  
*       MAXIMUM LENGTH OF NAME IS 20 DISPLAY CODED CHARACTERS.
* 
*     METHOD: 
*       CALL *SSBEBF* TO EXTRACT A 6-BIT CHARACTER.  IF NONZERO AND 
*       NONBLANK, CALL *SSBSBF* TO STORE IT INTO THE MESSAGE ASSEMBLY 
*       AREA. 
# 
  
      ITEM BITEBF     I;     # STARTING BIT OF NAME                    #
      ITEM ENDSRCH    B;     # EXIT LOOP VARIABLE                      #
      ITEM I          I;     # LOOP VARIABLE                           #
      ITEM ORDEBF     I;     # STARTING WORD OF NAME                   #
      ITEM TMPCHAR    I;     # TEMPORARY STORAGE AREA                  #
  
# 
*     INITIALIZE VARIABLES. 
# 
      ORDEBF  = 0;
      BITEBF  = 0;
      ENDSRCH = FALSE;
# 
*     EXTRACT AND STORE NONZERO/NONBLANK CHARACTERS.
# 
      FOR I = 0 STEP 1 WHILE (NOT ENDSRCH AND I LS 20)
      DO
        BEGIN 
        SSBEBF(EBFNAME,ORDEBF,BITEBF,6,TMPCHAR);
        IF (TMPCHAR EQ 0) OR (TMPCHAR EQ " ") 
        THEN
          BEGIN 
          ENDSRCH = TRUE; 
          END 
        ELSE
          BEGIN 
          SSBSBF(ACCMSG,ORDSBF,BITSBF,6,TMPCHAR); 
          END 
        END 
  
      END  # END EXTRACT #
  
      END  # END NVFTIAM #
  
TERM
