// employees of different types
// gets bonus in birth month

public abstract class Employee {
   private String firstName;
   private String lastName;
   private String socialSecurityNumber;
   private Date birthday;

   /
   public Employee( String first, String last, String ssn, Date b )
   {
      firstName = first;
      lastName = last;
      socialSecurityNumber = ssn;
      birthday = b;
   } 

   public void setFirstName( String first )
   {
      firstName = first;
   } 

   public String getFirstName()
   {
      return firstName;
   } 

   public void setLastName( String last )
   {
      lastName = last;
   } 

   public String getLastName()
   {
      return lastName;
   } 

   public void setSocialSecurityNumber( String number )
   {
      socialSecurityNumber = number;  // should validate
   } 

   public String getSocialSecurityNumber()
   {
      return socialSecurityNumber;
   } 

   public Date getBirthday()
   {return birthday;
   }

    
   public String toString()
   {
      return getFirstName() + " " + getLastName() +
         "\nsocial security number: " + getSocialSecurityNumber() + "birthday " + getBirthday()+"\n";
   } 

   public abstract double earnings();
   
} // end abstract class Employee
__________________________________________

public class BasePlusCommissionEmployee extends CommissionEmployee {
   private double baseSalary;  // base salary per week

   // constructor
   public BasePlusCommissionEmployee( String first, String last, 
      String socialSecurityNumber, Date b, double grossSalesAmount,
      double rate, double baseSalaryAmount )
   {
      super( first, last, socialSecurityNumber, b, grossSalesAmount, rate );
      setBaseSalary( baseSalaryAmount );
   } 

   // set base-salaried commission employee's base salary
   public void setBaseSalary( double salary )
   {
      baseSalary = salary < 0.0 ? 0.0 : salary;
   } 

   // return base-salaried commission employee's base salary
   public double getBaseSalary()
   {
      return baseSalary;
   } 

   // calculate base-salaried commission employee's earnings;
   // override method earnings in CommissionEmployee
   public double earnings()
   {
      return getBaseSalary() + super.earnings();
   } 

   // return String representation of BasePlusCommissionEmployee
   public String toString()
   {
      return "\nbase-salaried commission employee: " + super.toString();
      
      
      //super.getFirstName() + " " + super.getLastName() +
      //   "\nsocial security number: " + super.getSocialSecurityNumber()+ " "+super.getBirthday();
   } 
   
} // end class BasePlusCommissionEmployee

___________________________________________
public class CommissionEmployee extends Employee {
   private double grossSales;      // gross weekly sales
   private double commissionRate;  // commission percentage

   // constructor
   public CommissionEmployee( String first, String last, 
      String socialSecurityNumber, Date b,
      double grossWeeklySales, double percent )
   {
      super( first, last, socialSecurityNumber ,b);
      setGrossSales( grossWeeklySales );
      setCommissionRate( percent );
   } 

   // set commission employee's rate
   public void setCommissionRate( double rate )
   {
      commissionRate = ( rate > 0.0 && rate < 1.0 ) ? rate : 0.0;
   } 

   // return commission employee's rate
   public double getCommissionRate()
   {
      return commissionRate;
   } 

   // set commission employee's weekly base salary
   public void setGrossSales( double sales )
   {
      grossSales = sales < 0.0 ? 0.0 : sales;
   } 

   // return commission employee's gross sales amount
   public double getGrossSales()
   {
      return grossSales;
   } 

   // calculate commission employee's pay;
   // override abstract method earnings in Employee
   public double earnings()
   {
      return getCommissionRate() * getGrossSales();
   } 

   // return String representation of CommissionEmployee object
   public String toString()
   {
      return "\ncommission employee: " + super.toString();
   } 
   
} // end class CommissionEmployee
_______________________________________________
public class HourlyEmployee extends Employee {
   private double wage;   // wage per hour
   private double hours;  // hours worked for week

   // constructor
   public HourlyEmployee( String first, String last, 
      String socialSecurityNumber, Date b, double hourlyWage, double hoursWorked )
   {
      super( first, last, socialSecurityNumber, b );
      setWage( hourlyWage );
      setHours( hoursWorked );
   } 

   // set hourly employee's wage
   public void setWage( double wageAmount )
   {
      wage = wageAmount < 0.0 ? 0.0 : wageAmount;
   } 

   // return wage
   public double getWage()
   {
      return wage;
   } 

   // set hourly employee's hours worked
   public void setHours( double hoursWorked )
   {
      hours = ( hoursWorked >= 0.0 && hoursWorked <= 168.0 ) ?
         hoursWorked : 0.0;
   } 

   // return hours worked
   public double getHours()
   {
      return hours;
   } 

   // calculate hourly employee's pay;
   // override abstract method earnings in Employee
   public double earnings()
   {
      if ( hours <= 40 )  // no overtime
         return wage * hours;
      else
         return 40 * wage + ( hours - 40 ) * wage * 1.5;
   } 

   // return String representation of HourlyEmployee object
   public String toString()
   {
      return "\nhourly employee: " + super.toString();
   } 
   
} // end class HourlyEmployee
______________________________________________
public class SalariedEmployee extends Employee {
   private double weeklySalary;

   // constructor
   public SalariedEmployee( String first, String last, 
       String socialSecurityNumber, Date b,double salary )
   {
      super( first, last, socialSecurityNumber,b ); 
      setWeeklySalary( salary );
   } 

   // set salaried employee's salary
   public void setWeeklySalary( double salary )
   {
      weeklySalary = salary < 0.0 ? 0.0 : salary;
   } 

   // return salaried employee's salary
   public double getWeeklySalary()
   {
      return weeklySalary;
   } 

   // calculate salaried employee's pay;
   // override abstract method earnings in Employee
   public double earnings()
   {
      return getWeeklySalary();
   } 

   // return String representation of SalariedEmployee object
   public String toString()
   {
      return "\nsalaried employee: " + super.toString();
   } 
   
} // end class SalariedEmployee
__________________________________________
public class Date {
   private int month;  // 1-12
   private int day;    // 1-31 based on month
   private int year;   // any year

      public Date( int theMonth, int theDay, int theYear )
   {
      month =  theMonth ; 
      year = theYear;                
      day =  theDay ;       
   } // end Date constructor

   
   public String toString()
   { 
      return month + "/" + day + "/" + year; 
   }
  
   public int getMonth()
   { return month;
   }
   
} // end class Date

_______________________________________

import javax.swing.JOptionPane;


public class PayrollSystemTest {

   public static void main( String[] args ) 
   {
      
      Employee employees[] = new Employee[ 4 ];

      employees[ 0 ] = new SalariedEmployee( "John", "Smith", 
         "111-11-1111",new Date (12,10,1970), 800.00 );
      employees[ 1 ] = new CommissionEmployee( "Sue", "Jones", 
         "222-22-2222",new Date (10,10,1970), 10000, .06 );
      employees[ 2 ] = new BasePlusCommissionEmployee( "Bob", "Lewis", 
         "333-33-3333", new Date (9,10,1970),5000, .04, 300 );
      employees[ 3 ] = new HourlyEmployee( "Karen", "Price", 
         "444-44-4444",new Date (8,10,1970), 16.75, 40 );
      String output = "";
        // generically process each element in array employees
      for ( int i = 0; i < employees.length; i++ ) 
      {
         output += employees[ i ].toString() + "\n";
         if (employees[i].getBirthday().getMonth() == 10)
        	 output +="Earnings = " +employees[i].earnings()+ " Birthday Bonus "  + (employees[i].earnings() *.10 ) + " = " + (employees[i].earnings()* .10 + employees[i].earnings()) + "\n";
         else 
        	  output += "Earnings = "+employees[i].earnings();
         
         output += "\n";
      }
      JOptionPane.showMessageDialog( null, output );  // display output all at once
      System.exit( 0 );
   } // end main
} // end class PayrollSystemTest