class IEmployee
{
public:
virtual double salary() const = 0;
};
class Employee : public IEmployee
{
public:
Employee(unsigned id);
double salary() const override;
private:
double baseRate() const;
double workExperience() const;
double extraPercents() const;
double percentsPerYear() const;
double extraPay(double base, double percents) const;
unsigned id;
};
Employee::Employee(unsigned id)
: id(id)
{
}
double Employee::extraPay(double baseRate, double extraPayPercents) const
{
static const double EXTRA_PAY_LIMIT = 0.3;
if (extraPayPercents < EXTRA_PAY_LIMIT)
return baseRate * extraPayPercents;
else
return baseRate * EXTRA_PAY_LIMIT;
}
double Employee::percentsPerYear() const
{
return 0.03;
}
double Employee::extraPercents() const
{
return percentsPerYear() * workExperience();
}
double Employee::salary() const
{
double rate = baseRate();
return rate + extraPay(rate, extraPercents());
}
double Employee::baseRate() const
{
QSqlQuery q("SELECT base_rate FROM employee WHERE id = " + QString::number(id));
if (q.next())
{
return q.value(0).toInt();
}
return 0.0;
}
double Employee::workExperience() const
{
QSqlQuery q("SELECT DATE('now') - (SELECT hire_date FROM employee " \
" WHERE id = " + QString::number(id) + ")");
if (q.next())
{
return q.value(0).toInt();
}
return 0.0;
}