|
| 1 | +class _PayrollSystem: |
| 2 | + def __init__(self): |
| 3 | + self._employee_policies = { |
| 4 | + 1: SalaryPolicy(3000), |
| 5 | + 2: SalaryPolicy(1500), |
| 6 | + 3: CommissionPolicy(1000, 100), |
| 7 | + 4: HourlyPolicy(15), |
| 8 | + 5: HourlyPolicy(9), |
| 9 | + } |
| 10 | + |
| 11 | + def get_policy(self, employee_id): |
| 12 | + policy = self._employee_policies.get(employee_id) |
| 13 | + if not policy: |
| 14 | + return ValueError(employee_id) |
| 15 | + return policy |
| 16 | + |
| 17 | + def calculate_payroll(self, employees): |
| 18 | + print("Calculating Payroll") |
| 19 | + print("===================") |
| 20 | + for employee in employees: |
| 21 | + print(f"Payroll for: {employee.id} - {employee.name}") |
| 22 | + print(f"- Check amount: {employee.calculate_payroll()}") |
| 23 | + if employee.address: |
| 24 | + print("- Sent to:") |
| 25 | + print(employee.address) |
| 26 | + print("") |
| 27 | + |
| 28 | + |
| 29 | +class PayrollPolicy: |
| 30 | + def __init__(self): |
| 31 | + self.hours_worked = 0 |
| 32 | + |
| 33 | + def track_work(self, hours): |
| 34 | + self.hours_worked += hours |
| 35 | + |
| 36 | + |
| 37 | +class SalaryPolicy(PayrollPolicy): |
| 38 | + def __init__(self, weekly_salary): |
| 39 | + super().__init__() |
| 40 | + self.weekly_salary = weekly_salary |
| 41 | + |
| 42 | + def calculate_payroll(self): |
| 43 | + return self.weekly_salary |
| 44 | + |
| 45 | + |
| 46 | +class HourlyPolicy(PayrollPolicy): |
| 47 | + def __init__(self, hour_rate): |
| 48 | + super().__init__() |
| 49 | + self.hour_rate = hour_rate |
| 50 | + |
| 51 | + def calculate_payroll(self): |
| 52 | + return self.hours_worked * self.hour_rate |
| 53 | + |
| 54 | + |
| 55 | +class CommissionPolicy(SalaryPolicy): |
| 56 | + def __init__(self, weekly_salary, commission_per_sale): |
| 57 | + super().__init__(weekly_salary) |
| 58 | + self.commission_per_sale = commission_per_sale |
| 59 | + |
| 60 | + @property |
| 61 | + def commission(self): |
| 62 | + sales = self.hours_worked / 5 |
| 63 | + return sales * self.commission_per_sale |
| 64 | + |
| 65 | + def calculate_payroll(self): |
| 66 | + fixed = super().calculate_payroll() |
| 67 | + return fixed + self.commission |
| 68 | + |
| 69 | + |
| 70 | +class LTDPolicy: |
| 71 | + def __init__(self): |
| 72 | + self._base_policy = None |
| 73 | + |
| 74 | + def track_work(self, hours): |
| 75 | + self._check_base_policy() |
| 76 | + return self._base_policy.track_work(hours) |
| 77 | + |
| 78 | + def calculate_payroll(self): |
| 79 | + self._check_base_policy() |
| 80 | + base_salary = self._base_policy.calculate_payroll() |
| 81 | + return base_salary * 0.6 |
| 82 | + |
| 83 | + def apply_to_policy(self, base_policy): |
| 84 | + self._base_policy = base_policy |
| 85 | + |
| 86 | + def _check_base_policy(self): |
| 87 | + if not self._base_policy: |
| 88 | + raise RuntimeError("Base policy missing") |
| 89 | + |
| 90 | + |
| 91 | +_payroll_system = _PayrollSystem() |
| 92 | + |
| 93 | + |
| 94 | +def get_policy(employee_id): |
| 95 | + return _payroll_system.get_policy(employee_id) |
| 96 | + |
| 97 | + |
| 98 | +def calculate_payroll(employees): |
| 99 | + _payroll_system.calculate_payroll(employees) |
0 commit comments