summaryrefslogtreecommitdiff
path: root/app/utils/calculate/energy_calculation.py
blob: b4da861c2e4df9532d5e56bb5d3bc39e10b540c1 (plain)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
    }