header
//---------------------------------------------------------
// GrossPay6c.cpp
//
// Calculate and display the gross pay given the hourly
// wage and the number of hours worked.
//
// This version maintains the gross pay as a data member
// whose value is automatically updated whenever an
// employee's hours or wage is changed.
//
// D. Searls
// Asbury College
// Oct 2006
//---------------------------------------------------------

#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

const int MAXSIZE = 100;

class employeeRecord
{
private:

// Data members

    string id;        // Employee identifier
    double hours;     // Hours worked
    double wage;      // Hourly wage
    double grossPay;  // Gross pay
    
// Gross pay function

    //-----------------------------------------------------
    // findGrossPay
    //
    // Calculates the gross pay.
    //-----------------------------------------------------
    void findGrossPay()
    {
        static const double MAXHOURS = 40.0;
        static double OT_MULTIPLIER = 1.5;
        
        if (hours <= MAXHOURS)
        {
            grossPay = hours * wage;
        }
        else
        {
            grossPay = MAXHOURS * wage
                       + (hours - MAXHOURS)
                         * OT_MULTIPLIER * wage;
        }
    }
  
public:

// Class constructors

    //-----------------------------------------------------
    // Default Constructor
    //
    // Construct a new employee whose identifier is the
    // empty string and whose hours and hourly wage are
    // both zero.
    //-----------------------------------------------------
    employeeRecord()
    {
        id = "";
        hours = 0.0;
        wage = 0.0;
        findGrossPay();
    }
    
    //-----------------------------------------------------
    // Initialization Constructor
    //
    // Preconditions: empHours >= 0
    //                empWage  >= 0
    //
    // Construct a new employee with the specified
    // identifier, hours, and hourly wage. If the specified
    // hours is negative, the employee's hours will be set
    // to zero. If the specified hourly wage is negative,
    // the employee's hourly wage will be set to zero.
    //
    // In Parameters: empId, empHours, empWage
    //-----------------------------------------------------
    employeeRecord(string empId, double empHours, double empWage)
    {
        id = empId;
        
        if (empHours >= 0.0)
        {
            hours = empHours;
        }
        else
        {
            hours = 0.0;
        }
        
        if (empWage >= 0.0)
        {
            wage = empWage;
        }
        else
        {
            wage = 0.0;
        }
        findGrossPay();
    }
    
    //-----------------------------------------------------
    // Copy Constructor
    //
    // Construct a new employee having the same state as
    // the specified employee.
    //
    // In Parameter: emp
    //-----------------------------------------------------
    employeeRecord(const employeeRecord& emp)
    {
        id = emp.id;
        hours = emp.hours;
        wage = emp.wage;
        grossPay = emp.grossPay;
    }

// Member functions

    //-----------------------------------------------------
    // setIdentifier
    //
    // Set the employee's identifier to the specifed value.
    //-----------------------------------------------------
    void setIdentifier(string newId)
    {
        id = newId;
    }
    
    //-----------------------------------------------------
    // setHours
    //
    // Precondition: newHours >= 0
    //
    // Set the employee's hours worked to the specifed
    // value. If the specified value is negative, the
    // employee's hours will not be changed.
    //-----------------------------------------------------
    void setHours(double newHours)
    {
        if (newHours >= 0.0)
        {
            hours = newHours;
            findGrossPay();
        }
    }
    
    //-----------------------------------------------------
    // setWage
    //
    // Precondition: newWage >= 0
    //
    // Set the employee's hourly wage to the specifed value.
    // If the specified value is negative, the employee's
    // wage will not be changed.
    //-----------------------------------------------------
    void setWage(double newWage)
    {
        if (newWage >= 0)
        {
            wage = newWage;
            findGrossPay();
        }
    }
    
    //-----------------------------------------------------
    // getIdentifier
    //
    // Get the employee's identifier.
    //-----------------------------------------------------
    string getIdentifier() const
    {
        return id;
    }

    //-----------------------------------------------------
    // getHours
    //
    // Get the employee's hours worked.
    //-----------------------------------------------------
    double getHours() const
    {
        return hours;
    }

    //-----------------------------------------------------
    // getWage
    //
    // Get the employee's hourly wage.
    //-----------------------------------------------------
    double getWage() const
    {
        return wage;
    }
    
    //-----------------------------------------------------
    // getGrossPay
    //
    // Get the employee's gross pay.
    //-----------------------------------------------------
    double getGrossPay() const
    {
        return grossPay;
    }      
};

//*********************************************************
// getEmployeeData
//
// Out Parameters: data, n
//
// Returns: void
//*********************************************************
void getEmployeeData(employeeRecord data[], int& n)
{
    ifstream infile;
    string identity;
    double wageRate;
    double hours;
    
    infile.open("EmployeeData.txt");
    n = 0;
    infile >> identity >> wageRate >> hours;
    while (!infile.fail() && n < MAXSIZE)
    {
        data[n].setIdentifier(identity);
        data[n].setHours(hours);
        data[n].setWage(wageRate);
        n = n+1;
        
        infile >> identity >> wageRate >> hours;
    }
    infile.close();
}

//*********************************************************
// displayGrossPay
//
// In Parameters: data, n
//
// Returns: void
//*********************************************************
void displayGrossPay(const employeeRecord data[], int n)
{
    cout << fixed << setprecision(2);
    cout << "Employee  Gross Pay" << endl;
    cout << "--------  ---------" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << setw(8) << data[i].getIdentifier()
                << setw(11) << data[i].getGrossPay() << endl;
    }
}

//*********************************************************
//              M A I N   D R I V E R
//*********************************************************
int main()
{
    int n;              // Number of employees
    employeeRecord empData[MAXSIZE];

    getEmployeeData(empData, n);
    displayGrossPay(empData, n);
    
    return 0;
}