/* hourly.h                                                         -*- C++ -*-
**    Include file for Hourly class
** 
** COPYRIGHT (C) 1994 Bradley M. Kuhn
**
** Written   :   Bradley M. Kuhn                                 Loyola College
**   By
**
** Written   :   David W. Binkley                                Loyola College
**   For         
**
** Acknowledgements:
**    This code is based on code that appears in:
**       C++ How to Program by H. M. Deitel and P. J. Deitel
**         Prentice Hall, New Jersey, p. 536
**
** RCS       :
**
** $Source$
** $Revision$
** $Date$
**
** $Log$
** Revision 1.2  2004/10/05 00:37:32  lattner
** Stop using deprecated headers
**
** Revision 1.1  2004/10/04 20:01:13  lattner
** Initial checkin of all of the source
**
** Revision 0.2  1994/12/31  01:22:16  bkuhn
**   -- version were getting data from
**
** Revision 0.1  1994/12/24  01:43:50  bkuhn
**   # initial version
**
**
*/

#ifndef _HOURLY_H
#define _HOURLY_H

#include "wage.h"

#define HOURLY_ID 5
#include <iostream>
#include <stdlib.h>
using namespace std;


/* An hourly worker gets paid for every hour worked */

class HourlyWorker : public WageWorker {
  private:
    float  thisWeekHours;             // hours worked this week

  protected:
    float ThisWeekHours()                 { return thisWeekHours; };
    void  SetThisWeekHours(float);

  public:
    HourlyWorker(const char *, const char * , float = 0.0);

    virtual void  Print();
    virtual void  NewWeek();
    virtual void  Raise(int);

    // pure virtual function
    virtual float Earnings() = 0;
};
/*****************************************************************************/
HourlyWorker::HourlyWorker(const char *first, const char *last,
                           float startWage) 
 : WageWorker(first, last, startWage)    // this will call Wage's constructor
{
    dollarsToRaise = 0.5;
    thisWeekHours = 0.0;
}
/*****************************************************************************/
void
HourlyWorker::SetThisWeekHours(float hours) 
{
    thisWeekHours = hours;
}
/*****************************************************************************/
void
HourlyWorker::Print() {
    cout << "      Hourly Worker: " << FirstName() << ' ' << LastName();
}
/*****************************************************************************/
void
HourlyWorker::Raise(int units)
{
    if (units > 0)
      SetWage(Wage() + (units * dollarsToRaise));
}
/*****************************************************************************/
void
HourlyWorker::NewWeek()
{
    float hours;

    hours = 44; // ( float(rand()) / float(RAND_MAX) ) * 80.0;

    SetThisWeekHours(hours);
}

#endif
