-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathbu_subsidy_processor.py
More file actions
60 lines (48 loc) · 1.98 KB
/
Copy pathbu_subsidy_processor.py
File metadata and controls
60 lines (48 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from dataclasses import dataclass, field
from decimal import Decimal
from process_report.loader import loader
from process_report.invoices import invoice
from process_report.processors import discount_processor
@dataclass
class BUSubsidyProcessor(discount_processor.DiscountProcessor):
IS_DISCOUNT_BY_NERC = False
subsidy_amount: int = field(default_factory=loader.get_bu_subsidy_amount)
def _prepare(self):
def get_project(row):
project_alloc = row[invoice.PROJECT_FIELD]
if project_alloc.rfind("-") == -1:
return project_alloc
else:
return project_alloc[: project_alloc.rfind("-")]
self.data[invoice.PROJECT_NAME_FIELD] = self.data.apply(get_project, axis=1)
self.data[invoice.SUBSIDY_FIELD] = Decimal(0)
def _process(self):
self.data = self._apply_subsidy(self.data, self.subsidy_amount)
@staticmethod
def _get_subsidy_eligible_projects(data):
filtered_data = data[
data[invoice.IS_BILLABLE_FIELD] & ~data[invoice.MISSING_PI_FIELD]
]
filtered_data = filtered_data[
filtered_data[invoice.INSTITUTION_FIELD] == "Boston University"
]
filtered_data = filtered_data[
~(filtered_data[invoice.CLUSTER_NAME_FIELD] == "bm")
]
return filtered_data
def _apply_subsidy(self, dataframe, subsidy_amount):
subsidy_eligible_projects = self._get_subsidy_eligible_projects(dataframe)
pi_list = subsidy_eligible_projects[invoice.PI_FIELD].unique()
for pi in pi_list:
pi_projects = subsidy_eligible_projects[
subsidy_eligible_projects[invoice.PI_FIELD] == pi
]
self.apply_flat_discount(
dataframe,
pi_projects,
invoice.PI_BALANCE_FIELD,
subsidy_amount,
invoice.SUBSIDY_FIELD,
invoice.BALANCE_FIELD,
)
return dataframe