chellow 1724062841.0.0__py3-none-any.whl → 1724313988.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chellow/e/cfd.py +30 -41
- chellow/e/views.py +15 -1
- chellow/reports/report_247.py +21 -89
- chellow/reports/report_59.py +46 -76
- chellow/templates/e/ods_monthly_duration.html +0 -3
- chellow/templates/e/scenario.html +3 -0
- chellow/templates/e/scenario_docs.html +1 -0
- {chellow-1724062841.0.0.dist-info → chellow-1724313988.0.0.dist-info}/METADATA +1 -1
- {chellow-1724062841.0.0.dist-info → chellow-1724313988.0.0.dist-info}/RECORD +10 -10
- {chellow-1724062841.0.0.dist-info → chellow-1724313988.0.0.dist-info}/WHEEL +0 -0
chellow/e/cfd.py
CHANGED
|
@@ -225,46 +225,35 @@ def import_operational_costs_levy(sess, log, set_progress, s):
|
|
|
225
225
|
RUN_TYPES = ("II", "SF", "R1", "R2", "R3", "RF", "DF")
|
|
226
226
|
|
|
227
227
|
|
|
228
|
-
def
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
runs = {}
|
|
244
|
-
|
|
245
|
-
settlement_run_type = record["Settlement_Run_Type"]
|
|
246
|
-
runs[settlement_run_type] = record
|
|
247
|
-
prev_settlement_date = settlement_date
|
|
248
|
-
|
|
249
|
-
yield settlement_date, runs
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def _reconciled_daily_quarters(log, s, search_from):
|
|
253
|
-
quarter = {}
|
|
254
|
-
for settlement_date, lcc_runs in _reconciled_days(log, s, search_from):
|
|
255
|
-
try:
|
|
256
|
-
runs = quarter[settlement_date]
|
|
257
|
-
except KeyError:
|
|
258
|
-
runs = quarter[settlement_date] = {}
|
|
228
|
+
def _reconciled_quarters(log, s, search_from):
|
|
229
|
+
quarters = {}
|
|
230
|
+
|
|
231
|
+
for record in api_records(log, s, "e0e163cb-ba36-416d-83fe-976992d61516"):
|
|
232
|
+
settlement_date = _parse_date(record["Settlement_Date"])
|
|
233
|
+
if settlement_date > search_from:
|
|
234
|
+
settlement_date_ct = to_ct(settlement_date)
|
|
235
|
+
quarter_start_ct_month = int((settlement_date_ct.month - 1) / 3) * 3 + 1
|
|
236
|
+
quarter_start = to_utc(
|
|
237
|
+
ct_datetime(settlement_date_ct.year, quarter_start_ct_month, 1)
|
|
238
|
+
)
|
|
239
|
+
try:
|
|
240
|
+
quarter = quarters[quarter_start]
|
|
241
|
+
except KeyError:
|
|
242
|
+
quarter = quarters[quarter_start] = {}
|
|
259
243
|
|
|
260
|
-
|
|
261
|
-
|
|
244
|
+
try:
|
|
245
|
+
day = quarter[settlement_date]
|
|
246
|
+
except KeyError:
|
|
247
|
+
day = quarter[settlement_date] = {}
|
|
262
248
|
|
|
263
|
-
|
|
249
|
+
settlement_run_type = record["Settlement_Run_Type"]
|
|
250
|
+
day[settlement_run_type] = record
|
|
264
251
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
252
|
+
# Only return complate quarters
|
|
253
|
+
if len(quarters) > 0:
|
|
254
|
+
last_start = sorted(quarters.keys())[-1]
|
|
255
|
+
del quarters[last_start]
|
|
256
|
+
return quarters
|
|
268
257
|
|
|
269
258
|
|
|
270
259
|
def import_reconciled_daily_levy_rates(sess, log, set_progress, s):
|
|
@@ -277,7 +266,7 @@ def import_reconciled_daily_levy_rates(sess, log, set_progress, s):
|
|
|
277
266
|
sess, contract_name, "", {}, to_utc(ct_datetime(1996, 4, 1)), None, {}
|
|
278
267
|
)
|
|
279
268
|
|
|
280
|
-
search_from =
|
|
269
|
+
search_from = to_utc(ct_datetime(1996, 4, 1))
|
|
281
270
|
for rs in sess.scalars(
|
|
282
271
|
select(RateScript)
|
|
283
272
|
.where(RateScript.contract == contract)
|
|
@@ -305,12 +294,12 @@ def import_reconciled_daily_levy_rates(sess, log, set_progress, s):
|
|
|
305
294
|
day_ct += relativedelta(days=1)
|
|
306
295
|
|
|
307
296
|
if complete:
|
|
308
|
-
search_from = quarter_finish_ct
|
|
297
|
+
search_from = to_utc(quarter_finish_ct)
|
|
309
298
|
else:
|
|
310
299
|
break
|
|
311
300
|
|
|
312
|
-
for quarter in
|
|
313
|
-
|
|
301
|
+
for quarter_start, quarter in _reconciled_quarters(log, s, search_from).items():
|
|
302
|
+
|
|
314
303
|
rs = sess.execute(
|
|
315
304
|
select(RateScript).where(
|
|
316
305
|
RateScript.contract == contract,
|
chellow/e/views.py
CHANGED
|
@@ -80,6 +80,7 @@ from chellow.models import (
|
|
|
80
80
|
)
|
|
81
81
|
from chellow.utils import (
|
|
82
82
|
HH,
|
|
83
|
+
c_months_c,
|
|
83
84
|
c_months_u,
|
|
84
85
|
csv_make_val,
|
|
85
86
|
ct_datetime,
|
|
@@ -3943,7 +3944,20 @@ def scenario_add_get():
|
|
|
3943
3944
|
@e.route("/scenarios/<int:scenario_id>")
|
|
3944
3945
|
def scenario_get(scenario_id):
|
|
3945
3946
|
scenario = Scenario.get_by_id(g.sess, scenario_id)
|
|
3946
|
-
|
|
3947
|
+
props = scenario.props
|
|
3948
|
+
_, finish_date_ct = list(
|
|
3949
|
+
c_months_c(
|
|
3950
|
+
start_year=props["scenario_start_year"],
|
|
3951
|
+
start_month=props["scenario_start_month"],
|
|
3952
|
+
months=props["scenario_duration"],
|
|
3953
|
+
)
|
|
3954
|
+
)[-1]
|
|
3955
|
+
return render_template(
|
|
3956
|
+
"scenario.html",
|
|
3957
|
+
scenario=scenario,
|
|
3958
|
+
scenario_finish_date=to_utc(finish_date_ct),
|
|
3959
|
+
scenario_duration=props["scenario_duration"],
|
|
3960
|
+
)
|
|
3947
3961
|
|
|
3948
3962
|
|
|
3949
3963
|
@e.route("/scenarios/<int:scenario_id>/edit")
|
chellow/reports/report_247.py
CHANGED
|
@@ -61,9 +61,6 @@ def write_spreadsheet(
|
|
|
61
61
|
site_rows,
|
|
62
62
|
era_rows,
|
|
63
63
|
read_rows,
|
|
64
|
-
bill_check_site_rows,
|
|
65
|
-
bill_check_era_rows,
|
|
66
|
-
is_bill_check,
|
|
67
64
|
):
|
|
68
65
|
fl.seek(0)
|
|
69
66
|
fl.truncate()
|
|
@@ -71,9 +68,6 @@ def write_spreadsheet(
|
|
|
71
68
|
f.append_table("Site Level", site_rows)
|
|
72
69
|
f.append_table("Era Level", era_rows)
|
|
73
70
|
f.append_table("Normal Reads", read_rows)
|
|
74
|
-
if is_bill_check:
|
|
75
|
-
f.append_table("Bill Check Site", bill_check_site_rows)
|
|
76
|
-
f.append_table("Bill Check Era", bill_check_era_rows)
|
|
77
71
|
|
|
78
72
|
|
|
79
73
|
def make_bill_row(titles, bill):
|
|
@@ -721,14 +715,7 @@ class Object:
|
|
|
721
715
|
pass
|
|
722
716
|
|
|
723
717
|
|
|
724
|
-
def content(
|
|
725
|
-
scenario_props,
|
|
726
|
-
base_name,
|
|
727
|
-
user_id,
|
|
728
|
-
compression,
|
|
729
|
-
now,
|
|
730
|
-
is_bill_check,
|
|
731
|
-
):
|
|
718
|
+
def content(scenario_props, base_name, user_id, compression, now):
|
|
732
719
|
report_context = {}
|
|
733
720
|
|
|
734
721
|
try:
|
|
@@ -750,8 +737,6 @@ def content(
|
|
|
750
737
|
site_rows = []
|
|
751
738
|
era_rows = []
|
|
752
739
|
normal_read_rows = []
|
|
753
|
-
bill_check_site_rows = []
|
|
754
|
-
bill_check_era_rows = []
|
|
755
740
|
try:
|
|
756
741
|
with RSession() as sess:
|
|
757
742
|
start_year = scenario_props["scenario_start_year"]
|
|
@@ -821,9 +806,6 @@ def content(
|
|
|
821
806
|
|
|
822
807
|
user = User.get_by_id(sess, user_id)
|
|
823
808
|
|
|
824
|
-
if is_bill_check:
|
|
825
|
-
base_name.append("bill_check")
|
|
826
|
-
|
|
827
809
|
rf = open_file("_".join(base_name) + ".ods", user, mode="wb")
|
|
828
810
|
|
|
829
811
|
for rate_script in scenario_props.get("rates", []):
|
|
@@ -1023,16 +1005,17 @@ def content(
|
|
|
1023
1005
|
)
|
|
1024
1006
|
site_rows.append(site_header_titles + summary_titles)
|
|
1025
1007
|
era_rows.append(era_titles)
|
|
1026
|
-
bill_check_site_rows.append(site_header_titles + summary_titles)
|
|
1027
|
-
bill_check_era_rows.append(era_titles)
|
|
1028
1008
|
|
|
1029
1009
|
sites = sites.all()
|
|
1030
1010
|
normal_reads = set()
|
|
1031
1011
|
|
|
1032
1012
|
for month_start, month_finish in month_pairs:
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1013
|
+
if scenario_props.get("is_bill_check", False):
|
|
1014
|
+
data_source_bill = Object()
|
|
1015
|
+
data_source_bill.start_date = month_start
|
|
1016
|
+
data_source_bill.finish_date = month_finish
|
|
1017
|
+
else:
|
|
1018
|
+
data_source_bill = None
|
|
1036
1019
|
for site in sites:
|
|
1037
1020
|
if by_hh:
|
|
1038
1021
|
sf = [
|
|
@@ -1058,25 +1041,8 @@ def content(
|
|
|
1058
1041
|
title_dict,
|
|
1059
1042
|
era_rows,
|
|
1060
1043
|
site_rows,
|
|
1061
|
-
|
|
1044
|
+
data_source_bill,
|
|
1062
1045
|
)
|
|
1063
|
-
if is_bill_check:
|
|
1064
|
-
_process_site(
|
|
1065
|
-
sess,
|
|
1066
|
-
report_context,
|
|
1067
|
-
forecast_from,
|
|
1068
|
-
start,
|
|
1069
|
-
finish,
|
|
1070
|
-
site,
|
|
1071
|
-
scenario_props,
|
|
1072
|
-
supply_ids,
|
|
1073
|
-
now,
|
|
1074
|
-
summary_titles,
|
|
1075
|
-
title_dict,
|
|
1076
|
-
bill_check_era_rows,
|
|
1077
|
-
bill_check_site_rows,
|
|
1078
|
-
data_source_bill,
|
|
1079
|
-
)
|
|
1080
1046
|
except BadRequest as e:
|
|
1081
1047
|
raise BadRequest(f"Site Code {site.code}: {e.description}")
|
|
1082
1048
|
|
|
@@ -1088,29 +1054,13 @@ def content(
|
|
|
1088
1054
|
normal_read_rows.append(row)
|
|
1089
1055
|
|
|
1090
1056
|
write_spreadsheet(
|
|
1091
|
-
rf,
|
|
1092
|
-
compression,
|
|
1093
|
-
site_rows,
|
|
1094
|
-
era_rows,
|
|
1095
|
-
normal_read_rows,
|
|
1096
|
-
bill_check_site_rows,
|
|
1097
|
-
bill_check_era_rows,
|
|
1098
|
-
is_bill_check,
|
|
1057
|
+
rf, compression, site_rows, era_rows, normal_read_rows
|
|
1099
1058
|
)
|
|
1100
1059
|
except BadRequest as e:
|
|
1101
1060
|
msg = e.description + traceback.format_exc()
|
|
1102
1061
|
sys.stderr.write(msg + "\n")
|
|
1103
1062
|
site_rows.append(["Problem " + msg])
|
|
1104
|
-
write_spreadsheet(
|
|
1105
|
-
rf,
|
|
1106
|
-
compression,
|
|
1107
|
-
site_rows,
|
|
1108
|
-
era_rows,
|
|
1109
|
-
normal_read_rows,
|
|
1110
|
-
bill_check_site_rows,
|
|
1111
|
-
bill_check_era_rows,
|
|
1112
|
-
is_bill_check,
|
|
1113
|
-
)
|
|
1063
|
+
write_spreadsheet(rf, compression, site_rows, era_rows, normal_read_rows)
|
|
1114
1064
|
except BaseException:
|
|
1115
1065
|
msg = traceback.format_exc()
|
|
1116
1066
|
sys.stderr.write(msg + "\n")
|
|
@@ -1121,16 +1071,7 @@ def content(
|
|
|
1121
1071
|
ef.write(msg + "\n")
|
|
1122
1072
|
ef.close()
|
|
1123
1073
|
else:
|
|
1124
|
-
write_spreadsheet(
|
|
1125
|
-
rf,
|
|
1126
|
-
compression,
|
|
1127
|
-
site_rows,
|
|
1128
|
-
era_rows,
|
|
1129
|
-
normal_read_rows,
|
|
1130
|
-
bill_check_site_rows,
|
|
1131
|
-
bill_check_era_rows,
|
|
1132
|
-
is_bill_check,
|
|
1133
|
-
)
|
|
1074
|
+
write_spreadsheet(rf, compression, site_rows, era_rows, normal_read_rows)
|
|
1134
1075
|
finally:
|
|
1135
1076
|
if rf is not None:
|
|
1136
1077
|
rf.close()
|
|
@@ -1145,22 +1086,22 @@ def do_post(sess):
|
|
|
1145
1086
|
scenario = Scenario.get_by_id(sess, scenario_id)
|
|
1146
1087
|
scenario_props = scenario.props
|
|
1147
1088
|
base_name.append(scenario.name)
|
|
1148
|
-
|
|
1149
1089
|
else:
|
|
1090
|
+
scenario_props = {}
|
|
1091
|
+
base_name.append("monthly_duration")
|
|
1092
|
+
|
|
1093
|
+
if "finish_year" in request.values:
|
|
1150
1094
|
year = req_int("finish_year")
|
|
1151
1095
|
month = req_int("finish_month")
|
|
1152
1096
|
months = req_int("months")
|
|
1153
1097
|
start_date, _ = next(
|
|
1154
1098
|
c_months_c(finish_year=year, finish_month=month, months=months)
|
|
1155
1099
|
)
|
|
1156
|
-
|
|
1157
|
-
scenario_props =
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
"by_hh": by_hh,
|
|
1162
|
-
}
|
|
1163
|
-
base_name.append("monthly_duration")
|
|
1100
|
+
scenario_props["scenario_start_year"] = start_date.year
|
|
1101
|
+
scenario_props["scenario_start_month"] = start_date.month
|
|
1102
|
+
scenario_props["scenario_duration"] = months
|
|
1103
|
+
|
|
1104
|
+
scenario_props["by_hh"] = req_bool("by_hh")
|
|
1164
1105
|
|
|
1165
1106
|
try:
|
|
1166
1107
|
if "site_id" in request.values:
|
|
@@ -1193,18 +1134,9 @@ def do_post(sess):
|
|
|
1193
1134
|
else:
|
|
1194
1135
|
compression = True
|
|
1195
1136
|
|
|
1196
|
-
is_bill_check = req_bool("is_bill_check")
|
|
1197
|
-
|
|
1198
1137
|
user = g.user
|
|
1199
1138
|
|
|
1200
|
-
args = (
|
|
1201
|
-
scenario_props,
|
|
1202
|
-
base_name,
|
|
1203
|
-
user.id,
|
|
1204
|
-
compression,
|
|
1205
|
-
now,
|
|
1206
|
-
is_bill_check,
|
|
1207
|
-
)
|
|
1139
|
+
args = (scenario_props, base_name, user.id, compression, now)
|
|
1208
1140
|
threading.Thread(target=content, args=args).start()
|
|
1209
1141
|
return chellow_redirect("/downloads", 303)
|
|
1210
1142
|
except BadRequest as e:
|
chellow/reports/report_59.py
CHANGED
|
@@ -84,6 +84,37 @@ def make_bill_row(titles, bill):
|
|
|
84
84
|
return [bill.get(t) for t in titles]
|
|
85
85
|
|
|
86
86
|
|
|
87
|
+
def _add_bills(month_data, bills, chunk_start, chunk_finish):
|
|
88
|
+
for bill in bills:
|
|
89
|
+
bill_role_code = bill.batch.contract.market_role.code
|
|
90
|
+
bill_start = bill.start_date
|
|
91
|
+
bill_finish = bill.finish_date
|
|
92
|
+
bill_duration = (bill_finish - bill_start).total_seconds() + (30 * 60)
|
|
93
|
+
overlap_duration = (
|
|
94
|
+
min(bill_finish, chunk_finish) - max(bill_start, chunk_start)
|
|
95
|
+
).total_seconds() + (30 * 60)
|
|
96
|
+
proportion = overlap_duration / bill_duration
|
|
97
|
+
bill_prop_kwh = proportion * float(bill.kwh)
|
|
98
|
+
bill_prop_net_gbp = proportion * float(bill.net)
|
|
99
|
+
bill_prop_vat_gbp = proportion * float(bill.vat)
|
|
100
|
+
bill_prop_gross_gbp = proportion * float(bill.gross)
|
|
101
|
+
if bill_role_code == "X":
|
|
102
|
+
role_name = "supplier"
|
|
103
|
+
elif bill_role_code == "C":
|
|
104
|
+
role_name = "dc"
|
|
105
|
+
elif bill_role_code == "M":
|
|
106
|
+
role_name = "mop"
|
|
107
|
+
else:
|
|
108
|
+
raise BadRequest("Role code not recognized.")
|
|
109
|
+
|
|
110
|
+
month_data["billed-import-kwh"] += bill_prop_kwh
|
|
111
|
+
month_data["billed-import-net-gbp"] += bill_prop_net_gbp
|
|
112
|
+
month_data[f"billed-import-{role_name}-kwh"] += bill_prop_kwh
|
|
113
|
+
month_data[f"billed-import-{role_name}-net-gbp"] += bill_prop_net_gbp
|
|
114
|
+
month_data[f"billed-import-{role_name}-vat-gbp"] += bill_prop_vat_gbp
|
|
115
|
+
month_data[f"billed-import-{role_name}-gross-gbp"] += bill_prop_gross_gbp
|
|
116
|
+
|
|
117
|
+
|
|
87
118
|
def _process_site(
|
|
88
119
|
sess,
|
|
89
120
|
report_context,
|
|
@@ -560,41 +591,13 @@ def _process_site(
|
|
|
560
591
|
vals[f"billed-import-dc-{suf}"] = 0
|
|
561
592
|
vals[f"billed-import-mop-{suf}"] = 0
|
|
562
593
|
|
|
563
|
-
|
|
564
|
-
bill_role_code = bill.batch.contract.market_role.code
|
|
565
|
-
bill_start = bill.start_date
|
|
566
|
-
bill_finish = bill.finish_date
|
|
567
|
-
bill_duration = (bill_finish - bill_start).total_seconds() + (
|
|
568
|
-
30 * 60
|
|
569
|
-
)
|
|
570
|
-
overlap_duration = (
|
|
571
|
-
min(bill_finish, chunk_finish)
|
|
572
|
-
- max(bill_start, chunk_start)
|
|
573
|
-
).total_seconds() + (30 * 60)
|
|
574
|
-
proportion = overlap_duration / bill_duration
|
|
575
|
-
bill_prop_kwh = proportion * float(bill.kwh)
|
|
576
|
-
bill_prop_net_gbp = proportion * float(bill.net)
|
|
577
|
-
bill_prop_vat_gbp = proportion * float(bill.vat)
|
|
578
|
-
bill_prop_gross_gbp = proportion * float(bill.gross)
|
|
579
|
-
if bill_role_code == "X":
|
|
580
|
-
key = "supplier"
|
|
581
|
-
elif bill_role_code == "C":
|
|
582
|
-
key = "dc"
|
|
583
|
-
elif bill_role_code == "M":
|
|
584
|
-
key = "mop"
|
|
585
|
-
else:
|
|
586
|
-
raise BadRequest("Role code not recognized.")
|
|
587
|
-
|
|
588
|
-
for data in vals, site_data:
|
|
589
|
-
data["billed-import-kwh"] += bill_prop_kwh
|
|
590
|
-
data["billed-import-net-gbp"] += bill_prop_net_gbp
|
|
591
|
-
data[f"billed-import-{key}-net-gbp"] += bill_prop_net_gbp
|
|
592
|
-
data[f"billed-import-{key}-vat-gbp"] += bill_prop_vat_gbp
|
|
593
|
-
data[
|
|
594
|
-
f"billed-import-{key}-gross-gbp"
|
|
595
|
-
] += bill_prop_gross_gbp
|
|
594
|
+
_add_bills(vals, bills, chunk_start, chunk_finish)
|
|
596
595
|
|
|
597
596
|
era_rows.append([make_val(vals.get(t)) for t in era_titles])
|
|
597
|
+
for t in summary_titles:
|
|
598
|
+
v = vals.get(t)
|
|
599
|
+
if v is not None:
|
|
600
|
+
site_data[t] += v
|
|
598
601
|
first_era = (
|
|
599
602
|
sess.execute(
|
|
600
603
|
select(Era).where(Era.supply == supply).order_by(Era.start_date)
|
|
@@ -640,49 +643,12 @@ def _process_site(
|
|
|
640
643
|
for sname in ("kwh", "net-gbp"):
|
|
641
644
|
month_data[f"{name}-{sname}"] = 0
|
|
642
645
|
for suf in ("kwh", "net-gbp", "vat-gbp", "gross-gbp"):
|
|
643
|
-
month_data["billed-import-{suf}"]
|
|
644
|
-
month_data["billed-import-supplier-{suf}"] = 0
|
|
645
|
-
month_data["billed-import-dc-{suf}"] = 0
|
|
646
|
-
month_data["billed-import-mop-{suf}"] = 0
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
bill_role_code = bill.batch.contract.market_role.code
|
|
650
|
-
bill_start = bill.start_date
|
|
651
|
-
bill_finish = bill.finish_date
|
|
652
|
-
bill_duration = (bill_finish - bill_start).total_seconds() + (
|
|
653
|
-
30 * 60
|
|
654
|
-
)
|
|
655
|
-
overlap_duration = (
|
|
656
|
-
min(bill_finish, chunk_finish)
|
|
657
|
-
- max(bill_start, chunk_start)
|
|
658
|
-
).total_seconds() + (30 * 60)
|
|
659
|
-
proportion = overlap_duration / bill_duration
|
|
660
|
-
bill_prop_kwh = proportion * float(bill.kwh)
|
|
661
|
-
bill_prop_net_gbp = proportion * float(bill.net)
|
|
662
|
-
bill_prop_vat_gbp = proportion * float(bill.vat)
|
|
663
|
-
bill_prop_gross_gbp = proportion * float(bill.gross)
|
|
664
|
-
if bill_role_code == "X":
|
|
665
|
-
role_name = "supplier"
|
|
666
|
-
elif bill_role_code == "C":
|
|
667
|
-
key = "dc"
|
|
668
|
-
elif bill_role_code == "M":
|
|
669
|
-
key = "mop"
|
|
670
|
-
else:
|
|
671
|
-
raise BadRequest("Role code not recognized.")
|
|
672
|
-
|
|
673
|
-
for data in month_data, site_data:
|
|
674
|
-
data["billed-import-kwh"] += bill_prop_kwh
|
|
675
|
-
data["billed-import-net-gbp"] += bill_prop_net_gbp
|
|
676
|
-
data[f"billed-import-{role_name}-kwh"] += bill_prop_kwh
|
|
677
|
-
data[
|
|
678
|
-
f"billed-import-{role_name}-net-gbp"
|
|
679
|
-
] += bill_prop_net_gbp
|
|
680
|
-
data[
|
|
681
|
-
f"billed-import-{role_name}-vat-gbp"
|
|
682
|
-
] += bill_prop_vat_gbp
|
|
683
|
-
data[
|
|
684
|
-
f"billed-import-{role_name}-gross-gbp"
|
|
685
|
-
] += bill_prop_gross_gbp
|
|
646
|
+
month_data[f"billed-import-{suf}"] = 0
|
|
647
|
+
month_data[f"billed-import-supplier-{suf}"] = 0
|
|
648
|
+
month_data[f"billed-import-dc-{suf}"] = 0
|
|
649
|
+
month_data[f"billed-import-mop-{suf}"] = 0
|
|
650
|
+
|
|
651
|
+
_add_bills(month_data, bills, chunk_start, chunk_finish)
|
|
686
652
|
|
|
687
653
|
imp_supplier_contract = first_era.imp_supplier_contract
|
|
688
654
|
exp_supplier_contract = first_era.exp_supplier_contract
|
|
@@ -715,6 +681,10 @@ def _process_site(
|
|
|
715
681
|
] + [month_data[t] for t in summary_titles]
|
|
716
682
|
|
|
717
683
|
era_rows.append([make_val(v) for v in out])
|
|
684
|
+
for t in summary_titles:
|
|
685
|
+
v = month_data.get(t)
|
|
686
|
+
if v is not None:
|
|
687
|
+
site_data[t] += v
|
|
718
688
|
|
|
719
689
|
for _, v in sorted(supplies_data.items()):
|
|
720
690
|
row = [make_val(v.get(t)) for t in supply_titles]
|
|
@@ -19,9 +19,6 @@
|
|
|
19
19
|
<label>Site Codes</label>
|
|
20
20
|
{{input_textarea('site_codes', '', 5, 40, placeholder='One on each line, includes all if left blank')}}
|
|
21
21
|
|
|
22
|
-
<label>Include bill check tabs?</label>
|
|
23
|
-
{{input_checkbox('is_bill_check')}}
|
|
24
|
-
|
|
25
22
|
<input type="submit" value="Download">
|
|
26
23
|
</fieldset>
|
|
27
24
|
</form>
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
<fieldset>
|
|
15
15
|
<legend>Run With Monthly Duration</legend>
|
|
16
16
|
<input type="hidden" name="scenario_id" value="{{scenario.id}}">
|
|
17
|
+
<label>Months</label> {{input_text('months', initial=scenario_duration, size=2, maxlength=2)}}
|
|
18
|
+
<label>Finish month</label>
|
|
19
|
+
{{input_date('finish', scenario_finish_date, resolution='month')}}
|
|
17
20
|
<label>Site Codes</label>
|
|
18
21
|
{{input_textarea('site_codes', '', 5, 40,
|
|
19
22
|
placeholder='One on each line, includes all if left blank')}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: chellow
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1724313988.0.0
|
|
4
4
|
Summary: Web Application for checking UK energy bills.
|
|
5
5
|
Project-URL: Homepage, https://github.com/WessexWater/chellow
|
|
6
6
|
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
@@ -18,7 +18,7 @@ chellow/e/bill_importer.py,sha256=7UcnqNlKbJc2GhW9gy8sDp9GuqambJVpZLvbafOZztA,74
|
|
|
18
18
|
chellow/e/bmarketidx.py,sha256=C0BaHn2RxIuWH2QzA-OmSP0fbUGvW9tqEUhLnzOEdmA,7968
|
|
19
19
|
chellow/e/bsuos.py,sha256=hdP9vnOJSuZl46OAkJeUg1XJYvYIBj4J6Sqce1Hy9Vs,15542
|
|
20
20
|
chellow/e/ccl.py,sha256=30dh_SvlgzsTQPPAJNZWILaMvbeDsv9-P-S1JxS5_SQ,3184
|
|
21
|
-
chellow/e/cfd.py,sha256=
|
|
21
|
+
chellow/e/cfd.py,sha256=Gm435c42LFwZx1n-1UY1Tdx6mL1is7E0vRLWQe8RPOo,14184
|
|
22
22
|
chellow/e/computer.py,sha256=CoYf9SA8zrh1NP_S1jKsfXsaBm5kFcjBbtPUJnx8M9A,67274
|
|
23
23
|
chellow/e/dno_rate_parser.py,sha256=A5TP6KjyfT5lVWh7dX4SiXRi6wnf2lGv-H_T4Sod8CI,21731
|
|
24
24
|
chellow/e/duos.py,sha256=nwviRjz-qIt3GxIMHk0hItIT4dtKsxOWq9TUC1z-hO8,30864
|
|
@@ -38,7 +38,7 @@ chellow/e/system_price.py,sha256=6w5J7bzwFAZubE2zdOFRiS8IIrVP8hkoIOaG2yCt-Ic,623
|
|
|
38
38
|
chellow/e/tlms.py,sha256=M33D6YpMixu2KkwSCzDRM3kThLgShg8exp63Obo75l8,8905
|
|
39
39
|
chellow/e/tnuos.py,sha256=XseYztPUsQXNKuBmystO2kzzwAG9ehCZgpGBTdgSk-A,4313
|
|
40
40
|
chellow/e/triad.py,sha256=lIQj7EdUrcFwEqleuHZXYU_bfzIwNOqUVVxB3NPQt4A,13710
|
|
41
|
-
chellow/e/views.py,sha256=
|
|
41
|
+
chellow/e/views.py,sha256=gxBqMpDaQ41MHEFhx6oZ1OgeDNYu700PBeRJCNvrVAQ,215951
|
|
42
42
|
chellow/e/bill_parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
chellow/e/bill_parsers/activity_mop_stark_xlsx.py,sha256=UgWXDPzQkQghyj_lfgBqoSJpHB-t-qOdSaB8qY6GLog,4071
|
|
44
44
|
chellow/e/bill_parsers/annual_mop_stark_xlsx.py,sha256=-HMoIfa_utXYKA44RuC0Xqv3vd2HLeQU_4P0iBUd3WA,4219
|
|
@@ -78,14 +78,14 @@ chellow/reports/report_219.py,sha256=cA0lfJKnJg41Zc4_gZB1KUXZ9JeJo0TiTlu5jm1bdDM
|
|
|
78
78
|
chellow/reports/report_231.py,sha256=uhO1algP7sibpZVaniqGs56HOCPCQeDO-Y-UfvFQwnI,5311
|
|
79
79
|
chellow/reports/report_233.py,sha256=cIatj-HHYW_GNIRsji-DlsmYjt8rUdm_5xujPLOYL8U,4537
|
|
80
80
|
chellow/reports/report_241.py,sha256=AlFmSHnfG2HWv_ICmWX7fNpPwLHjq7mo1QtOTjSKO3k,5384
|
|
81
|
-
chellow/reports/report_247.py,sha256=
|
|
81
|
+
chellow/reports/report_247.py,sha256=0Tvce9acMR5nWB0ITJh9n2V5qlEVtSWFEle-ca0P2Bw,44368
|
|
82
82
|
chellow/reports/report_29.py,sha256=KDFjgrLBv4WbG9efCdu_geMR7gT_QV9N97Wfdt7aDc4,2736
|
|
83
83
|
chellow/reports/report_291.py,sha256=rqBXy6s7hMeYWw-yNX6w_L5t2yz6rNEeos_4xO7wf90,7519
|
|
84
84
|
chellow/reports/report_33.py,sha256=laVz-itDbJTdvC6LxLEeuY0eKpYx43Un4adiExPTEEE,16730
|
|
85
85
|
chellow/reports/report_387.py,sha256=kmBZopb0AOivcowO2nPjRj6LnV0_QjCDXLwqPL7IGVE,5672
|
|
86
86
|
chellow/reports/report_41.py,sha256=QQeTshA1Og7N3wPaoZ8ynJzwsvZ1mgSFc7DDkVqIZoM,7447
|
|
87
87
|
chellow/reports/report_429.py,sha256=8WlLqyfMyvIF5Kc6CE0MKwcT5xwmR_Ao99Ef72yAOVc,12668
|
|
88
|
-
chellow/reports/report_59.py,sha256=
|
|
88
|
+
chellow/reports/report_59.py,sha256=LvG4sfX1R1-fNcdOsimzYKxK929oX3b0b_A_Vv7VDOM,45983
|
|
89
89
|
chellow/reports/report_81.py,sha256=NkT6dZeMo7Z0AkJemD_Xv8Ut5PIZ9vn8Ia1Q_DS9v54,5611
|
|
90
90
|
chellow/reports/report_87.py,sha256=j2gdBOapaVY1ZnlNlw14RPx58_k8eUkc3oRSnKuCsNA,7057
|
|
91
91
|
chellow/reports/report_asset_comparison.py,sha256=UN298MHuzyUDUiiZr7F_Ua6SrdVOlFLjgKjnIbrA-14,6118
|
|
@@ -261,7 +261,7 @@ chellow/templates/e/mtc_participants.html,sha256=QhJ7CCvio7HiCT3QWVeMN425EzJAob3
|
|
|
261
261
|
chellow/templates/e/mtc_ssc.html,sha256=4-N2CFEHXTjWTEbo8De2QVlKFRraW6z7V6ISSWXjrGg,985
|
|
262
262
|
chellow/templates/e/mtc_sscs.html,sha256=aiC8h7xETnxB77tj4Jll0d0ECBxvsVhxYKRootAPbE4,1405
|
|
263
263
|
chellow/templates/e/mtcs.html,sha256=1VC5VTNF6t7QNReDILHJh0vaVSx-ajKjjKe_KinRdgY,853
|
|
264
|
-
chellow/templates/e/ods_monthly_duration.html,sha256=
|
|
264
|
+
chellow/templates/e/ods_monthly_duration.html,sha256=EfSUD24jkxDu-pRYO2_fyx9ffB8uCKtQv6uIrk4Dr1g,1284
|
|
265
265
|
chellow/templates/e/participant.html,sha256=1GnUAavaektvmznO2UyA4LfHI96wtYpNZ_RNgjV2ivg,1022
|
|
266
266
|
chellow/templates/e/participants.html,sha256=ae5zloKGaWRCfHc0lCC7HKNZkLSlVAgmZyoFm8N-HAA,500
|
|
267
267
|
chellow/templates/e/parties.html,sha256=gx0fhzcbiUBstkty8M11dYosRZZ4RgF6X3kdVOFSHdM,666
|
|
@@ -272,9 +272,9 @@ chellow/templates/e/read_add.html,sha256=PGNPKTQiXkTEANMKOXCzBLGwJJJfQIkIgpGRAb-
|
|
|
272
272
|
chellow/templates/e/read_edit.html,sha256=JWnHn8Dcq3t_LUGLUV9IAMnhuacw38On7552kGn4QiU,3147
|
|
273
273
|
chellow/templates/e/read_type.html,sha256=volKteZB79famXrzN_Bgqy9JT9C4a50vXLkuZ0ObBq0,403
|
|
274
274
|
chellow/templates/e/read_types.html,sha256=CknHXNEkBnsAprqI66ftvnnMFBdR_kqI7o26rxjlrJA,473
|
|
275
|
-
chellow/templates/e/scenario.html,sha256=
|
|
275
|
+
chellow/templates/e/scenario.html,sha256=ZPkRsRcl_qgkFxSYanTfLDPQCzEqsV5u1m-swv4QNaU,1353
|
|
276
276
|
chellow/templates/e/scenario_add.html,sha256=qQpxvhlrQqrNYiIQTHu_NvSoeSKuRNEJQYwLqRlQ8_U,516
|
|
277
|
-
chellow/templates/e/scenario_docs.html,sha256=
|
|
277
|
+
chellow/templates/e/scenario_docs.html,sha256=hOg6hrrnOcvdk7jXRsMrk1wtwK7K0IpqcBukX_vlvRg,4878
|
|
278
278
|
chellow/templates/e/scenario_edit.html,sha256=Uf64v_qsBP0BxaFEIz214CC_dZXlvro4zvQXH_towhA,1070
|
|
279
279
|
chellow/templates/e/scenarios.html,sha256=zlNhZvQEcuwLgHObVHS-4THur5Lz9Jf1G6xD98-jamI,847
|
|
280
280
|
chellow/templates/e/site_add_e_supply.html,sha256=_gi1ejI4TMTMX9vCW7z2kToR2XKR6qoVh67qp_VrDsM,2731
|
|
@@ -365,6 +365,6 @@ chellow/templates/g/supply_note_edit.html,sha256=b8mB6_ucBwoljp03iy6AgVaZUhGw3-1
|
|
|
365
365
|
chellow/templates/g/supply_notes.html,sha256=6epNmZ3NKdXZz27fvmRUGeffg_oc1kmwuBeyRzQe3Rg,854
|
|
366
366
|
chellow/templates/g/unit.html,sha256=KouNVU0-i84afANkLQ_heJ0uDfJ9H5A05PuLqb8iCN8,438
|
|
367
367
|
chellow/templates/g/units.html,sha256=p5Nd-lAIboKPEOO6N451hx1bcKxMg4BDODnZ-43MmJc,441
|
|
368
|
-
chellow-
|
|
369
|
-
chellow-
|
|
370
|
-
chellow-
|
|
368
|
+
chellow-1724313988.0.0.dist-info/METADATA,sha256=t9QpJIWe-EWi4KGZqjLBITe47y-OEcQpgZcSWnG5wg4,12241
|
|
369
|
+
chellow-1724313988.0.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
370
|
+
chellow-1724313988.0.0.dist-info/RECORD,,
|
|
File without changes
|