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