from django.utils.safestring import mark_safe from django.template.loader import render_to_string from copy import deepcopy BASE_PATH = './reallocation/tax/' class Worker: tax = None def __init__(self, allocation, worker_type, points_per_task, tasks_to_do): for k, v in locals().items(): setattr(self, k, v) def profit(self): return self.points_per_task * self.tasks_to_do def tax_amount(self): return round(self.profit() * self.tax.rate, 2) def income_after_tax(self): after_income = self.profit() - self.tax_amount() + self.allocation.transfer() if after_income.is_integer(): return int(after_income) else: return round(self.profit() - self.tax_amount() + self.allocation.transfer(), 2) def __hash__(self): return hash(self.worker_type) def __repr__(self): return f'Worker {self.worker_type}' class Allocation: __tax = None def __init__(self, nLow, nHigh, tasks_for_low, tasks_for_high, points_for_low, points_for_high, choice): for k, v in locals().items(): setattr(self, k, v) self.is_allocated, self.title = choice low_worker = Worker(allocation=self, worker_type='A', points_per_task=points_for_low, tasks_to_do=tasks_for_low) high_worker = Worker(allocation=self, worker_type='B', points_per_task=points_for_high, tasks_to_do=tasks_for_high) self.workers = [low_worker] * nLow + [high_worker] * nHigh def transfer(self): total_tax = sum([p.tax_amount() for p in self.workers]) return total_tax / len(self.workers) @property def tax(self): return self.__tax @tax.setter def tax(self, t): self.__tax = t for i in self.workers: i.tax = t def worker_types(self): return list(set(self.workers)) class Tax: """AN object represents consequence for choices depending on certain tax rate""" rate = None def __init__(self, rate: float, allocations: list): self.rate = rate self.allocations = allocations.copy() for i in self.allocations: i.tax = self def rate_desc(self) -> str: """Return formatted tax rate""" return "{0:.0%}".format(self.rate) def get_css_id(self) -> str: return f'tax-{str(self.rate).replace(".", "-")}' def get_earning_table(self): return mark_safe(render_to_string(BASE_PATH + 'earning_per_tax.html', { 'tax': self, })) def get_income_table(self): return mark_safe(render_to_string(BASE_PATH + 'income_per_tax.html', { 'tax': self }))