diff options
| author | Dylan Bolger <dylan.bolger00@gmail.com> | 2024-06-09 14:49:16 -0500 |
|---|---|---|
| committer | Dylan Bolger <dylan.bolger00@gmail.com> | 2024-06-09 14:49:16 -0500 |
| commit | 61f47dd7798b5c1bc6a6a0716a9fcf7248520d83 (patch) | |
| tree | 83208de160bd8dc5214cfcb7f3821ef54e54f7ae /app/utils | |
| parent | afb2cd37ceb8bff93fcc94be81b7e32b80dd95c0 (diff) | |
| download | city-utilities-restful-wrapper-calculate.tar.xz city-utilities-restful-wrapper-calculate.zip | |
implement calculation endpointcalculate
Diffstat (limited to 'app/utils')
| -rw-r--r-- | app/utils/calculate/constants.py | 26 | ||||
| -rw-r--r-- | app/utils/calculate/energy_calculation.py | 84 |
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 + } |
