PROC validate_user, valu (
  user, u                    : name = $required
  password, pw               : name = $optional
  project, p                 : list 2 of name = (account, project)
  user_prolog, up            : string = '$USER.PROLOG'
  user_epilog, ue            : string = '$USER_EPILOG'
  job_classes, job_class, jc : list of key batch, b, interactive, i, maintenance, m = (batch interactive)
  minimum_ring, mr           : integer 1..15 = 11
  nominal_ring, nr           : integer 1..15 = 11
  status                     : var of status = $optional
  )

  create_variable name=create_status kind=status

  CREATE_USER $value(user)
  create: ..
    BLOCK
      IF $specified(password) THEN
        change_login_password new_password=$value(password) status=create_status
      ELSE
        change_login_password new_password=$name($string($value(user))//'X') status=create_status
      IFEND
      EXIT create WHEN NOT create_status.normal
      IF $specified(password) THEN
        change_link_attribute_password value=$string($value(password)) status=create_status
      ELSE
        change_link_attribute_password value=$string($value(user))//'X' status=create_status
      IFEND
      EXIT create WHEN NOT create_status.normal
      change_account_project_default account=$value(project 1) project=$value(project 2) status=create_status
      EXIT create WHEN NOT create_status.normal
      change_user_prolog value=$value(user_prolog) status=create_status
      EXIT create WHEN NOT create_status.normal
      change_user_epilog value=$value(user_epilog) status=create_status
      EXIT create WHEN NOT create_status.normal
      change_job_class delete=all interactive_default=none batch_default=none status=create_status
      EXIT create WHEN NOT create_status.normal
      FOR i = 1 TO $set_count(job_classes) DO
        IF ($string($value(job_classes, i)) = 'BATCH') OR ($string($value(job_classes, i)) = 'B') THEN
          change_job_class add=batch batch_default=batch status=create_status
        ELSEIF ($string($value(job_classes, i)) = 'INTERACTIVE') OR ($string($value(job_classes, i)) = 'I') ..
              THEN
          change_job_class add=interactive interactive_default=interactive status=create_status
        ELSEIF ($string($value(job_classes, i)) = 'MAINTENANCE') OR ($string($value(job_classes, i)) = 'M') ..
              THEN
          change_job_class add=maintenance status=create_status
        IFEND
        EXIT create WHEN NOT create_status.normal
      FOREND
      change_ring_privilege minimum_ring=$value(minimum_ring) nominal_ring=$value(nominal_ring) ..
            status=create_status
    BLOCKEND create
  END_CREATE_USER
  IF NOT create_status.normal THEN
    delete_user $value(user)
  IFEND
  EXIT_PROC WITH create_status

PROCEND validate_user
