summaryrefslogtreecommitdiff
path: root/app/utils
diff options
context:
space:
mode:
Diffstat (limited to 'app/utils')
-rw-r--r--app/utils/calculate/constants.py26
-rw-r--r--app/utils/calculate/energy_calculation.py84
2 files changed, 110 insertions, 0 deletions
diff --git a/app/utils/calculate/constants.py b/app/utils/calculate/constants.py
new file mode 100644
index 0000000..dfd2646
--- /dev/null
+++ b/app/utils/calculate/constants.py
@@ -0,0 +1,26 @@
+# Electric
+## Residental
+
+electric_residential_base = 12.50
+electric_residential_per_kwh = 0.0585
+
+# October to May
+winter_demand_per_kwh = 0.0453 # First 900 kWH
+winter_demand_extended_per_kwh = 0.0355 # After the first 900 kWh
+
+# June to September
+summer_demand_per_kwh = 0.0453 # First 500 kWh
+summer_demand_extended_per_kwh = 0.0683 # After the first 500 kWh
+
+# Water
+## Residental
+
+water_residential_base = 19.60 # 19.25 + 0.35?
+
+# October to May
+winter_demand_per_ccf = 2.97
+
+# June to September
+summer_demand_initial_per_ccf = 2.97 # First 5 CCF
+summer_demand_secondary_per_ccf = 3.64 # For the next 10 CCF
+summer_demand_extended_per_ccf = 4.32 # For any more CCF
diff --git a/app/utils/calculate/energy_calculation.py b/app/utils/calculate/energy_calculation.py
new file mode 100644
index 0000000..b4da861
--- /dev/null
+++ b/app/utils/calculate/energy_calculation.py
@@ -0,0 +1,84 @@
+from ...utils.calculate.constants import *
+import datetime
+
+def is_summer(month: str):
+ return month in ['June', 'July', 'August', 'September']
+
+def calculate_water(current_ccf, is_summer):
+ if is_summer:
+ if current_ccf > 15:
+ summer_demand_initial_usage = 5
+ summer_demand_secondary_usage = 10
+ summer_demand_extended_usage = current_ccf - 15
+ elif current_ccf <= 15 and current_ccf >= 10:
+ summer_demand_initial_usage = 5
+ summer_demand_secondary_usage = current_ccf - 5
+ summer_demand_extended_usage = 0
+ else:
+ summer_demand_initial_usage = current_ccf
+ summer_demand_secondary_usage = 0
+ summer_demand_extended_usage = 0
+ summer_demand_initial_charge = summer_demand_initial_usage * summer_demand_initial_per_ccf
+ summer_demand_secondary_charge = summer_demand_secondary_usage * summer_demand_secondary_per_ccf
+ summer_demand_extended_charge = summer_demand_extended_usage * summer_demand_extended_per_ccf
+ return round(water_residential_base + summer_demand_initial_charge + summer_demand_secondary_charge + summer_demand_extended_charge, 2)
+
+
+def calculate_eletric(current_kwh, is_summer):
+ kwh_base_charge = current_kwh * electric_residential_per_kwh
+ fuel_adjusted_factor = -0.0055 # hardcoded, need to pull from page :/
+ fuel_adjusted_usage = fuel_adjusted_factor * current_kwh
+ if is_summer:
+ if current_kwh >= 500:
+ summer_demand_usage = 500
+ summer_demand_extended_usage = current_kwh - 500
+ else:
+ summer_demand_usage = current_kwh
+ summer_demand_extended_usage = 0
+ summer_demand_charge = summer_demand_per_kwh * summer_demand_usage
+ summer_demand_extended_charge = summer_demand_extended_usage * summer_demand_extended_per_kwh
+ return round(electric_residential_base + kwh_base_charge + fuel_adjusted_usage + summer_demand_charge + summer_demand_extended_charge, 2)
+ else:
+ if current_kwh >= 900:
+ winter_demand_usage = 900
+ winter_demand_extended_usage = current_kwh - 900
+ else:
+ winter_demand_usage = current_kwh
+ winter_demand_extended_usage = 0
+ winter_demand_charge = winter_demand_per_kwh * winter_demand_usage
+ winter_demand_extended_charge = winter_demand_extended_per_kwh * winter_demand_extended_usage
+ return round(electric_residential_base + kwh_base_charge + fuel_adjusted_usage + winter_demand_charge + winter_demand_extended_charge, 2)
+
+def calculate_electric_charges(usage):
+ electric_month = datetime.datetime.strptime(usage['electric']['month']['tentativeData'][0]['UsageDate'], "%m/%d/%y").strftime("%B")
+ kwh_so_far = usage['electric']['month']['tentativeData'][0]['SoFar']
+ kwh_expected = usage['electric']['month']['tentativeData'][0]['ExpectedUsage']
+ return {
+ "current": calculate_eletric(kwh_so_far, is_summer(electric_month)),
+ "expected": calculate_eletric(kwh_expected, is_summer(electric_month))
+ }
+
+def calculate_water_charges(usage):
+ water_month = datetime.datetime.strptime(usage['water']['month']['tentativeData'][0]['UsageDate'], "%m/%d/%y").strftime("%B")
+ ccf_so_far = usage['water']['month']['tentativeData'][0]['SoFar']
+ ccf_expected = usage['water']['month']['tentativeData'][0]['ExpectedUsage']
+ return {
+ "current": calculate_water(ccf_so_far, is_summer(water_month)),
+ "expected": calculate_water(ccf_expected, is_summer(water_month))
+ }
+
+def calculate_total_charges(electric, water):
+ return {
+ "current": electric['current'] + water['current'],
+ "expected": electric['expected'] + water['expected']
+ }
+
+def calculate_running_bill(usage):
+ electric = calculate_electric_charges(usage)
+ water = calculate_water_charges(usage)
+ total = calculate_total_charges(electric, water)
+ return {
+ "electric": electric,
+ "water": water,
+ "total": total
+ }