Question: Modify the payroll system to include an additional Employee subclass PieceWorker that represents an employee whose pay is based on the number of pieces of

Modify the payroll system to include an additional Employee subclass PieceWorker that represents an employee whose pay is based on the number of pieces of merchandise produced. Class PieceWorker should contain private instance variables wage (to store the employees wage per piece) and pieces (to store the number of pieces produced). Provide a concrete implementation of method earnings in class PieceWorker that calculates the employees earnings by multiplying the number of pieces produced by the wage per piece. Create an array of Employee variables to store references to objects of each concrete class in the new Employee hierarchy. For each Employee, display its string representation and earnings. This is a java program.

In this exercise, we modify the accounts payable application to include the complete functionality of the payroll application. The application should still process two invoice objects, but now should process one object of each of the four Employee subclasses. If the object currently being processed is aBasePlusCommissionEmployee, the application should increase the BasePlusCommissionEmployees base salary by 10%.Finally, the application should output the payment amount for each object.Complete the following steps to create the new application: a) Modify classes HourlyEmployee and CommissionEmployee to place them in the Payable hierarchy as subclasses of the version of Employee that implements Payable. [Hint: You should introduce a getPaymentAmount method in each subclass so that the class satisfies its inherited contract with interface Payable. The getPaymentAmount can call earning to calculate the payable salary. b) Modify class BasePlusCommissionEmployee such that it extends the version of class CommissionEmployee created in Part a. c) Modify PayableInterfaceTest to polymorphically process two Invoices, one SalariedEmployee, one HourlyEmployee, oneCommissionEmployee and one BasePlusCommissionEmployee. First output a string representation of each Payable object. Next, if an object is a BasePlusCommissionEmployee, increase its base salary by 10%. Finally, output the payment amount for each Payable object.

Code so far:

Driver Class:

public class PayrollSystemTest { public static void main( String args[] ) { 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); Employee employees[] = new Employee[ 4 ]; employees[ 0 ] = salariedEmployee; employees[ 1 ] = hourlyEmployee; employees[ 2 ] = commissionEmployee; employees[ 3 ] = basePlusCommissionEmployee; System.out.println( "Employees processed polymorphically:" ); for ( Employee currentEmployee : employees ) { System.out.println( currentEmployee ); if ( currentEmployee instanceof BasePlusCommissionEmployee ) { BasePlusCommissionEmployee employee = ( BasePlusCommissionEmployee ) currentEmployee; double oldBaseSalary = employee.getBaseSalary(); employee.setBaseSalary( 1.10 * oldBaseSalary ); System.out.printf( "new base salary with 10%% increase is: $%,.2f ", employee.getBaseSalary() ); } System.out.printf( "earned $%,.2f ", currentEmployee.earnings() ); } } }

Employee Class:

//Employee abstract superclass. 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;

} // end method setFirstName

// return first name

public String getFirstName()

{

return firstName;

} // end method getFirstName

// set last name

public void setLastName( String last )

{

lastName = last;

} // 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

public String toString()

{

return String.format( "%s %s social security number: %s"+" ",

getFirstName(), getLastName(), getSocialSecurityNumber()); } // end method toString

// abstract method overridden by subclasses

public abstract double earnings(); // no implementation here

} // end abstract class Employee

Commission Employee Class:

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

public double earnings()

{

return getCommissionRate() * getGrossSales();

} // end method earnings

// return String representation of CommissionEmployee object

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

Base Plus Commission Employee Class:

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

public double earnings()

{

return getBaseSalary() + super.earnings();

} // end method earnings

// return String representation of BasePlusCommissionEmployee object

public String toString()

{

return String.format( "%s %s; %s: $%,.2f",

"base-salaried", super.toString(),

"base salary", getBaseSalary() );

} // end method toString

} // end class BasePlusCommissionEmployee

Hourly Employee Class:

//HourlyEmployee class extends Employee.

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

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

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

Salaried Employee:

//SalariedEmployee class extends 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

public double earnings()

{

return getWeeklySalary();

} // end method earnings

// return String representation of SalariedEmployee object

public String toString()

{

return String.format( "salaried employee: %s%s: $%,.2f",

super.toString(), "weekly salary", getWeeklySalary() );

} // end method toString

} // end class SalariedEmployee

Pieceworker Class Template:

// Problem 1: PieceWorker.java // PieceWorker class extends Employee.

public class PieceWorker extends Employee { /* declare instance variable wage */ /* declare instance variable pieces */

// five-argument constructor public PieceWorker( String first, String last, String ssn, double wagePerPiece, int piecesProduced ) { /* write code to initialize a PieceWorker */ } // end five-argument PieceWorker constructor

// set wage /* write a set method that validates and sets the PieceWorker's wage */

// return wage /* write a get method that returns the PieceWorker's wage */

// set pieces produced /* write a set method that validates and sets the number of pieces produced */

// return pieces produced /* write a get method that returns the number of pieces produced */

// calculate earnings; override abstract method earnings in Employee public double earnings() { /* write code to return the earnings for a PieceWorker */ } // end method earnings

// return String representation of PieceWorker object public String toString() { /* write code to return a string representation of a PieceWorker */ } // end method toString } // end class PieceWorker

Invoice Class Template:

// Problem 2: Invoice.java // Invoice class implements Payable.

public class Invoice implements Payable { private String partNumber; private String partDescription; private int quantity; private double pricePerItem;

// four-argument constructor public Invoice( String part, String description, int count, double price ) { partNumber = part; partDescription = description; setQuantity( count ); // validate and store quantity setPricePerItem( price ); // validate and store price per item } // end four-argument Invoice constructor

// set part number public void setPartNumber( String part ) { partNumber = part; } // end method setPartNumber

// get part number public String getPartNumber() { return partNumber; } // end method getPartNumber

// set description public void setPartDescription( String description ) { partDescription = description; } // end method setPartDescription

// get description public String getPartDescription() { return partDescription; } // end method getPartDescription

// set quantity public void setQuantity( int count ) { quantity = ( count < 0 ) ? 0 : count; // quantity cannot be negative } // end method setQuantity

// get quantity public int getQuantity() { return quantity; } // end method getQuantity

// set price per item public void setPricePerItem( double price ) { pricePerItem = ( price < 0.0 ) ? 0.0 : price; // validate price } // end method setPricePerItem

// get price per item public double getPricePerItem() { return pricePerItem; } // end method getPricePerItem

// return String representation of Invoice object public String toString() { return String.format( "%s: %s: %s (%s) %s: %d %s: $%,.2f", "invoice", "part number", getPartNumber(), getPartDescription(), "quantity", getQuantity(), "price per item", getPricePerItem() ); } // end method toString

// method required to carry out contract with interface Payable public double getPaymentAmount() { return getQuantity() * getPricePerItem(); // calculate total cost } // end method getPaymentAmount } // end class Invoice

Payable Template:

// Problem 2: Payable.java // Payable interface declaration.

public interface Payable { double getPaymentAmount(); // calculate payment; no implementation } // end interface Payable

PayableInterface Test Template:

// Problem 2: PayableInterfaceTest.java // Tests interface Payable.

public class PayableInterfaceTest { public static void main( String args[] ) { // create six-element Payable array Payable payableObjects[] = new Payable[ 6 ]; // populate array with objects that implement Payable payableObjects[ 0 ] = new Invoice( "01234", "seat", 2, 375.00 ); payableObjects[ 1 ] = new Invoice( "56789", "tire", 4, 79.95 ); payableObjects[ 2 ] = new SalariedEmployee( "John", "Smith", "111-11-1111", 800.00 ); payableObjects[ 3 ] = /* create an HourlyEmployee object */ payableObjects[ 4 ] = /* create a CommissionEmployee object */ payableObjects[ 5 ] = /* create a BasePlusCommissionEmployee object */

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

// generically process each element in array payableObjects for ( Payable currentPayable : payableObjects ) { // output currentPayable and its appropriate payment amount System.out.printf( "%s ", currentPayable.toString() ); /* write code to determine whether currentPayable is a BasePlusCommissionEmployee object */ { /* write code to give a raise */ /* write code to ouput results of the raise */ } // end if

System.out.printf( "%s: $%,.2f ", "payment due", currentPayable.getPaymentAmount() ); } // end for } // end main } // end class PayableInterfaceTest

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!