Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Modify the payroll system to include private instance variable birthDate in clas

ID: 3630901 • Letter: M

Question

Modify the payroll system to include private instance variable birthDate in class Employee. Use class Date to represent an employee's birthday. Add get methods to class Date. Assume that payroll is processed once per month. Create an array of Employee variable to store references to the various employee objects. In a loop, calculate the payroll for each Employee (polymorphically), and add a $100.00 bonus to the person's payroll amount if the current month is the one in which the Employee's birthday occurs.

public class PayrollSystemTest
{
public static void main( String[] args )
{
// create subclass objects
SalariedEmployee salariedEmployee =
new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 );
HourlyEmployee hourlyEmployee =
new HourlyEmployee( "Karen", "Price", "222-22-2222", 16.75, 40 );
CommissionEmployee commissionEmployee =
new CommissionEmployee(
"Sue", "Jones", "333-33-3333", 10000, .06 );
BasePlusCommissionEmployee basePlusCommissionEmployee =
new BasePlusCommissionEmployee(
"Bob", "Lewis", "444-44-4444", 5000, .04, 300 );

System.out.println( "Employees processed individually: " );

System.out.printf( "%s %s: $%,.2f ",
salariedEmployee, "earned", salariedEmployee.earnings() );
System.out.printf( "%s %s: $%,.2f ",
hourlyEmployee, "earned", hourlyEmployee.earnings() );
System.out.printf( "%s %s: $%,.2f ",
commissionEmployee, "earned", commissionEmployee.earnings() );
System.out.printf( "%s %s: $%,.2f ",
basePlusCommissionEmployee,
"earned", basePlusCommissionEmployee.earnings() );

// create four-element Employee array
Employee[] employees = new Employee[ 4 ];

// initialize array with Employees
employees[ 0 ] = salariedEmployee;
employees[ 1 ] = hourlyEmployee;
employees[ 2 ] = commissionEmployee;
employees[ 3 ] = basePlusCommissionEmployee;

System.out.println( "Employees processed polymorphically: " );

// generically process each element in array employees
for ( Employee currentEmployee : employees )
{
System.out.println( currentEmployee ); // invokes toString

// determine whether element is a BasePlusCommissionEmployee
if ( currentEmployee instanceof BasePlusCommissionEmployee )
{
// downcast Employee reference to
// BasePlusCommissionEmployee reference
BasePlusCommissionEmployee employee =
( BasePlusCommissionEmployee ) currentEmployee;

employee.setBaseSalary( 1.10 * employee.getBaseSalary() );

System.out.printf(
"new base salary with 10%% increase is: $%,.2f ",
employee.getBaseSalary() );
} // end if

System.out.printf(
"earned $%,.2f ", currentEmployee.earnings() );
} // end for

// get type name of each object in employees array
for ( int j = 0; j < employees.length; j++ )
System.out.printf( "Employee %d is a %s ", j,
employees[ j ].getClass().getName() );
} // end main
} // end class PayrollSystemTest

****************************************************************************

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

// three-argument constructor
public Employee( String first, String last, String ssn )
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
} // end three-argument Employee constructor

// set first name
public void setFirstName( String first )
{
firstName = first; // should validate
} // end method setFirstName

// return first name
public String getFirstName()
{
return firstName;
} // end method getFirstName

// set last name
public void setLastName( String last )
{
lastName = last; // should validate
} // end method setLastName

// return last name
public String getLastName()
{
return lastName;
} // end method getLastName

// set social security number
public void setSocialSecurityNumber( String ssn )
{
socialSecurityNumber = ssn; // should validate
} // end method setSocialSecurityNumber

// return social security number
public String getSocialSecurityNumber()
{
return socialSecurityNumber;
} // end method getSocialSecurityNumber

// return String representation of Employee object
@Override
public String toString()
{
return String.format( "%s %s social security number: %s",
getFirstName(), getLastName(), getSocialSecurityNumber() );
} // end method toString

// abstract method overridden by concrete subclasses
public abstract double earnings(); // no implementation here
} // end abstract class Employee

*********************************************************************

public class SalariedEmployee extends Employee
{
private double weeklySalary;

// four-argument constructor
public SalariedEmployee( String first, String last, String ssn,
double salary )
{
super( first, last, ssn ); // pass to Employee constructor
setWeeklySalary( salary ); // validate and store salary
} // end four-argument SalariedEmployee constructor

// set salary
public void setWeeklySalary( double salary )
{
weeklySalary = salary < 0.0 ? 0.0 : salary;
} // end method setWeeklySalary

// return salary
public double getWeeklySalary()
{
return weeklySalary;
} // end method getWeeklySalary

// calculate earnings; override abstract method earnings in Employee
@Override
public double earnings()
{
return getWeeklySalary();
} // end method earnings

// return String representation of SalariedEmployee object
@Override
public String toString()
{
return String.format( "salaried employee: %s %s: $%,.2f",
super.toString(), "weekly salary", getWeeklySalary() );
} // end method toString
} // end class SalariedEmployee

********************************************************************

public class HourlyEmployee extends Employee
{
private double wage; // wage per hour
private double hours; // hours worked for week

// five-argument constructor
public HourlyEmployee( String first, String last, String ssn,
double hourlyWage, double hoursWorked )
{
super( first, last, ssn );
setWage( hourlyWage ); // validate and store hourly wage
setHours( hoursWorked ); // validate and store hours worked
} // end five-argument HourlyEmployee constructor

// set wage
public void setWage( double hourlyWage )
{
wage = ( hourlyWage < 0.0 ) ? 0.0 : hourlyWage;
} // end method setWage

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

// set hours worked
public void setHours( double hoursWorked )
{
hours = ( ( hoursWorked >= 0.0 ) && ( hoursWorked <= 168.0 ) ) ?
hoursWorked : 0.0;
} // end method setHours

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

// calculate earnings; override abstract method earnings in Employee
@Override
public double earnings()
{
if ( getHours() <= 40 ) // no overtime
return getWage() * getHours();
else
return 40 * getWage() + ( getHours() - 40 ) * getWage() * 1.5;
} // end method earnings

// return String representation of HourlyEmployee object
@Override
public String toString()
{
return String.format( "hourly employee: %s %s: $%,.2f; %s: %,.2f",
super.toString(), "hourly wage", getWage(),
"hours worked", getHours() );
} // end method toString
} // end class HourlyEmployee

*******************************************************

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

// five-argument constructor
public CommissionEmployee( String first, String last, String ssn,
double sales, double rate )
{
super( first, last, ssn );
setGrossSales( sales );
setCommissionRate( rate );
} // end five-argument CommissionEmployee constructor

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

// return commission rate
public double getCommissionRate()
{
return commissionRate;
} // end method getCommissionRate

// set gross sales amount
public void setGrossSales( double sales )
{
grossSales = ( sales < 0.0 ) ? 0.0 : sales;
} // end method setGrossSales

// return gross sales amount
public double getGrossSales()
{
return grossSales;
} // end method getGrossSales

// calculate earnings; override abstract method earnings in Employee
@Override
public double earnings()
{
return getCommissionRate() * getGrossSales();
} // end method earnings

// return String representation of CommissionEmployee object
@Override
public String toString()
{
return String.format( "%s: %s %s: $%,.2f; %s: %.2f",
"commission employee", super.toString(),
"gross sales", getGrossSales(),
"commission rate", getCommissionRate() );
} // end method toString
} // end class CommissionEmployee

********************************************************************

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

// six-argument constructor
public BasePlusCommissionEmployee( String first, String last,
String ssn, double sales, double rate, double salary )
{
super( first, last, ssn, sales, rate );
setBaseSalary( salary ); // validate and store base salary
} // end six-argument BasePlusCommissionEmployee constructor

// set base salary
public void setBaseSalary( double salary )
{
baseSalary = ( salary < 0.0 ) ? 0.0 : salary; // non-negative
} // end method setBaseSalary

// return base salary
public double getBaseSalary()
{
return baseSalary;
} // end method getBaseSalary

// calculate earnings; override method earnings in CommissionEmployee
@Override
public double earnings()
{
return getBaseSalary() + super.earnings();
} // end method earnings

// return String representation of BasePlusCommissionEmployee object
@Override
public String toString()
{
return String.format( "%s %s; %s: $%,.2f",
"base-salaried", super.toString(),
"base salary", getBaseSalary() );
} // end method toString
} // end class BasePlusCommissionEmployee

************************************************************

public class Date
{
private int month; // 1-12
private int day; // 1-31 based on month
private int year; // any year

// constructor: call checkMonth to confirm proper value for month;
// call checkDay to confirm proper value for day
public Date( int theMonth, int theDay, int theYear )
{
month = checkMonth( theMonth ); // validate month
year = theYear; // could validate year
day = checkDay( theDay ); // validate day

System.out.printf(
"Date object constructor for date %s ", this );
} // end Date constructor

// utility method to confirm proper month value
private int checkMonth( int testMonth )
{
if ( testMonth > 0 && testMonth <= 12 ) // validate month
return testMonth;
else // month is invalid
{
System.out.printf(
"Invalid month (%d) set to 1.", testMonth );
return 1; // maintain object in consistent state
} // end else
} // end method checkMonth

// utility method to confirm proper day value based on month and year
private int checkDay( int testDay )
{
int[] daysPerMonth =
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

// check if day in range for month
if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
return testDay;

// check for leap year
if ( month == 2 && testDay == 29 && ( year % 400 == 0 ||
( year % 4 == 0 && year % 100 != 0 ) ) )
return testDay;

System.out.printf( "Invalid day (%d) set to 1.", testDay );
return 1; // maintain object in consistent state
} // end method checkDay

// return a String of the form month/day/year
public String toString()
{
return String.format( "%d/%d/%d", month, day, year );
} // end method toString
} // end class Date

Explanation / Answer

Here I do add the birthday bonus to the wages but only for show - if you want it to be included in the wages or weekly salary or commission then you'll have to give mode detail. but I still think this is all you're required to do, take the current earnings of the birthday boy/girl polymorphically and just add $100 to it and print that our. I use the Calendar object to get the current system date and extract the month from that.

Classes with major changes: Employee, Date, PayrollSystemTest
Classes with only constructor changes = all employee classes extending Employee

I hope this helps - maybe not exactly what you need but I'm sure it's a push in the right direction, so please rate ! :)

public class PayrollSystemTest {

    public static void main(String[] args) {
        
        int currentMonth = Calendar.getInstance().get(Calendar.MONTH)+1;
        
        // create subclass objects
        SalariedEmployee salariedEmployee =
                new SalariedEmployee("John", "Smith", "111-11-1111", 10, 1, 1981, 800.00);
        HourlyEmployee hourlyEmployee =
                new HourlyEmployee("Karen", "Price", "222-22-2222", 2, 22, 1982, 16.75, 40);
        CommissionEmployee commissionEmployee =
                new CommissionEmployee(
                "Sue", "Jones", "333-33-3333", 3, 3, 1983, 10000, .06);
        BasePlusCommissionEmployee basePlusCommissionEmployee =
                new BasePlusCommissionEmployee(
                "Bob", "Lewis", "444-44-4444", 10, 4, 1984, 5000, .04, 300);

        System.out.println("Employees processed individually: ");

        System.out.printf("%s %s: $%,.2f ",
                salariedEmployee, "earned", salariedEmployee.earnings());
        System.out.printf("%s %s: $%,.2f ",
                hourlyEmployee, "earned", hourlyEmployee.earnings());
        System.out.printf("%s %s: $%,.2f ",
                commissionEmployee, "earned", commissionEmployee.earnings());
        System.out.printf("%s %s: $%,.2f ",
                basePlusCommissionEmployee,
                "earned", basePlusCommissionEmployee.earnings());

// create four-element Employee array
        Employee[] employees = new Employee[4];

// initialize array with Employees
        employees[ 0] = salariedEmployee;
        employees[ 1] = hourlyEmployee;
        employees[ 2] = commissionEmployee;
        employees[ 3] = basePlusCommissionEmployee;

        System.out.println("Employees processed polymorphically: ");
// generically process each element in array employees
        for (Employee currentEmployee : employees) {
            System.out.println(currentEmployee); // invokes toString
           
// determine whether element is a BasePlusCommissionEmployee
            if (currentEmployee instanceof BasePlusCommissionEmployee) {
// downcast Employee reference to
// BasePlusCommissionEmployee reference
                BasePlusCommissionEmployee employee =
                        (BasePlusCommissionEmployee) currentEmployee;

                employee.setBaseSalary(1.10 * employee.getBaseSalary());

                System.out.printf(
                        "new base salary with 10%% increase is: $%,.2f ",
                        employee.getBaseSalary());
            } // end if

            System.out.printf(
                    "earned $%,.2f", currentEmployee.earnings());
            
            
            if (currentEmployee.getBirthDate().getMonth() == currentMonth)
                System.out.printf(" birthday bonus: $100.00 total earnings: $%,.2f ",
                        (currentEmployee.earnings() + 100.00) );
            else
                System.out.printf(" ");
            
        } // end for

// get type name of each object in employees array
        for (int j = 0; j < employees.length; j++) {
            System.out.printf("Employee %d is a %s ", j,
                    employees[ j].getClass().getName());
        }


    }
}

public abstract class Employee {

    private String firstName;
    private String lastName;
    private String socialSecurityNumber;
    private Date birthDate;

// three-argument constructor
    public Employee(String first, String last, String ssn,
            int month, int day, int year) {
        firstName = first;
        lastName = last;
        socialSecurityNumber = ssn;
        birthDate = new Date(month, day, year);
    } // end three-argument Employee constructor

// set first name
    public void setFirstName(String first) {
        firstName = first; // should validate
    } // end method setFirstName

// return first name
    public String getFirstName() {
        return firstName;
    } // end method getFirstName

// set last name
    public void setLastName(String last) {
        lastName = last; // should validate
    } // end method setLastName

// return last name
    public String getLastName() {
        return lastName;
    } // end method getLastName

// set social security number
    public void setSocialSecurityNumber(String ssn) {
        socialSecurityNumber = ssn; // should validate
    } // end method setSocialSecurityNumber

// return social security number
    public String getSocialSecurityNumber() {
        return socialSecurityNumber;
    } // end method getSocialSecurityNumber
    
    //set birthDate
    public void setBirthDate(Date date)
    {
        birthDate = date;
    }
    public Date getBirthDate()
    {
        return birthDate;
    }

// return String representation of Employee object
    @Override
    public String toString() {
        return String.format("%s %s social security number: %s birth date: %s",
                getFirstName(), getLastName(), getSocialSecurityNumber(),
                getBirthDate().toString());
    } // end method toString

// abstract method overridden by concrete subclasses
    public abstract double earnings(); // no implementation here
}

public class Date {

    private int month; // 1-12
    private int day; // 1-31 based on month
    private int year; // any year

// constructor: call checkMonth to confirm proper value for month;
// call checkDay to confirm proper value for day
    public Date(int theMonth, int theDay, int theYear) {
        month = checkMonth(theMonth); // validate month
        year = theYear; // could validate year
        day = checkDay(theDay); // validate day

        System.out.printf(
                "Date object constructor for date %s ", this);
    } // end Date constructor
    
    //Getter methods
    public int getMonth()
    {
        return this.month;
    }
    public int getDay()
    {
        return this.day;
    }
    public int getYear()
    {
        return this.year;
    }
   
// utility method to confirm proper month value
    private int checkMonth(int testMonth) {
        if (testMonth > 0 && testMonth <= 12) // validate month
        {
            return testMonth;
        } else // month is invalid
        {
            System.out.printf(
                    "Invalid month (%d) set to 1.", testMonth);
            return 1; // maintain object in consistent state
        } // end else
    } // end method checkMonth

// utility method to confirm proper day value based on month and year
    private int checkDay(int testDay) {
        int[] daysPerMonth = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// check if day in range for month
        if (testDay > 0 && testDay <= daysPerMonth[ month]) {
            return testDay;
        }

// check for leap year
        if (month == 2 && testDay == 29 && (year % 400 == 0
                || (year % 4 == 0 && year % 100 != 0))) {
            return testDay;
        }

        System.out.printf("Invalid day (%d) set to 1.", testDay);
        return 1; // maintain object in consistent state
    } // end method checkDay
// return a String of the form month/day/year
    public String toString() {
        return String.format("%d/%d/%d", month, day, year);
    } // end method toString
}

public class SalariedEmployee extends Employee {

    private double weeklySalary;

// four-argument constructor
    public SalariedEmployee(String first, String last, String ssn,
            int month, int day, int year,
            double salary) {
        super(first, last, ssn, month, day, year); // pass to Employee constructor
        setWeeklySalary(salary); // validate and store salary
    } // end four-argument SalariedEmployee constructor

// set salary
    public void setWeeklySalary(double salary) {
        weeklySalary = salary < 0.0 ? 0.0 : salary;
    } // end method setWeeklySalary

// return salary
    public double getWeeklySalary() {
        return weeklySalary;
    } // end method getWeeklySalary

// calculate earnings; override abstract method earnings in Employee
    @Override
    public double earnings() {
        return getWeeklySalary();
    } // end method earnings

// return String representation of SalariedEmployee object
    @Override
    public String toString() {
        return String.format("salaried employee: %s %s: $%,.2f",
                super.toString(), "weekly salary", getWeeklySalary());
    } // end method toString
}

public class HourlyEmployee extends Employee {

    private double wage; // wage per hour
    private double hours; // hours worked for week

// five-argument constructor
    public HourlyEmployee(String first, String last, String ssn,
            int month, int day, int year,
            double hourlyWage, double hoursWorked) {
        super(first, last, ssn, month, day, year);
        setWage(hourlyWage); // validate and store hourly wage
        setHours(hoursWorked); // validate and store hours worked
    } // end five-argument HourlyEmployee constructor

// set wage
    public void setWage(double hourlyWage) {
        wage = (hourlyWage < 0.0) ? 0.0 : hourlyWage;
    } // end method setWage

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

// set hours worked
    public void setHours(double hoursWorked) {
        hours = ((hoursWorked >= 0.0) && (hoursWorked <= 168.0))
                ? hoursWorked : 0.0;
    } // end method setHours

// return hours worked
    public double getHours() {
        return hours;
    } // end method getHours
// calculate earnings; override abstract method earnings in Employee
    @Override
    public double earnings() {
        if (getHours() <= 40) // no overtime
        {
            return getWage() * getHours();
        } else {
            return 40 * getWage() + (getHours() - 40) * getWage() * 1.5;
        }
    } // end method earnings

// return String representation of HourlyEmployee object
    @Override
    public String toString() {
        return String.format("hourly employee: %s %s: $%,.2f; %s: %,.2f",
                super.toString(), "hourly wage", getWage(),
                "hours worked", getHours());
    } // end method toString
}

public class CommissionEmployee extends Employee {

    private double grossSales; // gross weekly sales
    private double commissionRate; // commission percentage

// five-argument constructor
    public CommissionEmployee(String first, String last, String ssn,
            int month, int day, int year,
            double sales, double rate) {
        super(first, last, ssn, month, day, year);
        setGrossSales(sales);
        setCommissionRate(rate);
    } // end five-argument CommissionEmployee constructor

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

// return commission rate
    public double getCommissionRate() {
        return commissionRate;
    } // end method getCommissionRate

// set gross sales amount
    public void setGrossSales(double sales) {
        grossSales = (sales < 0.0) ? 0.0 : sales;
    } // end method setGrossSales

// return gross sales amount
    public double getGrossSales() {
        return grossSales;
    } // end method getGrossSales

// calculate earnings; override abstract method earnings in Employee
    @Override
    public double earnings() {
        return getCommissionRate() * getGrossSales();
    } // end method earnings

// return String representation of CommissionEmployee object
    @Override
    public String toString() {
        return String.format("%s: %s %s: $%,.2f; %s: %.2f",
                "commission employee", super.toString(),
                "gross sales", getGrossSales(),
                "commission rate", getCommissionRate());
    } // end method toString
}

public class BasePlusCommissionEmployee extends CommissionEmployee {

    private double baseSalary; // base salary per week

// six-argument constructor
    public BasePlusCommissionEmployee(String first, String last, String ssn,
            int month, int day, int year,
            double sales, double rate, double salary) {
        super(first, last, ssn, month, day, year, sales, rate);
        setBaseSalary(salary); // validate and store base salary
    } // end six-argument BasePlusCommissionEmployee constructor

// set base salary
    public void setBaseSalary(double salary) {
        baseSalary = (salary < 0.0) ? 0.0 : salary; // non-negative
    } // end method setBaseSalary

// return base salary
    public double getBaseSalary() {
        return baseSalary;
    } // end method getBaseSalary

// calculate earnings; override method earnings in CommissionEmployee
    @Override
    public double earnings() {
        return getBaseSalary() + super.earnings();
    } // end method earnings

// return String representation of BasePlusCommissionEmployee object
    @Override
    public String toString() {
        return String.format("%s %s; %s: $%,.2f",
                "base-salaried", super.toString(),
                "base salary", getBaseSalary());
    } // end method toString
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote