I'm writing a program with the following conceptual mode.
A User can apply to become an employee, which places their account in a Pending state. They can then be Approved or Rejected. The only person who can put an account in the Pending state is the user themselves.
An Administrator can move users to and between the Approved and Rejected states (they are notified whenever a user enters the Pending state). They can also promote the account to become an Supervisor (I), Supervisor (II), or Administrator.
All Supervisors have the privileges of an Approved user in relation to their own account (e.g. schedule a vacation). They also have additional privileges (e.g. view any employee's phone number). No class of Supervisors necessarily has all the privileges of any other Supervisor class. A user can be more than one type of Supervisor at once.
Administrators have the privileges of Approved users in relation to their own account, as well as he privileges of all types of Supervisors.
However, I'm having trouble finding a good way to represent this. In particular, the bolded line means that it doesn't make sense to just use a single user_status enum.
Because I also want promotion to Supervisor/Administrator access from regular employee status to require re-authentication for the Administrator, it seems to make sense to distinguish (None)/Pending/Approved/Rejected (which are inherently mutually exclusive) from the Supervisor/Administrator statuses.
The best thing I've come up with so far is essentially something along the lines of the following:
public class Employee {
    // user id, name, etc.
    ArrayList<EmployeeRole> roles;
    EmployeeStatus status;
}
public enum EmployeeRole {
    Employee, SupervisorI, SupervisorII, ..., Administrator
}
public enum EmployeeStatus {
    None, Pending, Approved, Rejected
}
However, this doesn't represent the privilege model well (such that I'm not sure what a compatible design for that would even look like). Any suggestions for a better solution?