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 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 _reconciled_days(log, s, search_from):
229
- runs = {}
230
-
231
- records = [
232
- r
233
- for r in api_records(log, s, "e0e163cb-ba36-416d-83fe-976992d61516")
234
- if r["Settlement_Date"] > search_from
235
- ]
236
- if len(records) > 0:
237
- prev_settlement_date = _parse_date(records[0]["Settlement_Date"])
238
- runs = {}
239
- for record in records:
240
- settlement_date = _parse_date(record["Settlement_Date"])
241
- if settlement_date != prev_settlement_date:
242
- yield prev_settlement_date, runs
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
- for run_type, record in lcc_runs.items():
261
- runs[run_type] = record
244
+ try:
245
+ day = quarter[settlement_date]
246
+ except KeyError:
247
+ day = quarter[settlement_date] = {}
262
248
 
263
- settlement_next_ct = to_ct(settlement_date) + relativedelta(days=1)
249
+ settlement_run_type = record["Settlement_Run_Type"]
250
+ day[settlement_run_type] = record
264
251
 
265
- if settlement_next_ct.month in (1, 4, 7, 10) and settlement_next_ct.day == 1:
266
- yield quarter
267
- quarter = {}
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 = "1996-04-01"
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.strftime("%Y-%m-%d")
297
+ search_from = to_utc(quarter_finish_ct)
309
298
  else:
310
299
  break
311
300
 
312
- for quarter in _reconciled_daily_quarters(log, s, search_from):
313
- quarter_start = sorted(quarter.keys())[0]
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
- return render_template("scenario.html", scenario=scenario)
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")
@@ -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
- data_source_bill = Object()
1034
- data_source_bill.start_date = month_start
1035
- data_source_bill.finish_date = month_finish
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
- None,
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
- by_hh = req_bool("by_hh")
1157
- scenario_props = {
1158
- "scenario_start_year": start_date.year,
1159
- "scenario_start_month": start_date.month,
1160
- "scenario_duration": months,
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:
@@ -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
- for bill in bills:
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
- for bill in bills:
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')}}
@@ -136,6 +136,7 @@
136
136
  2017-10-09 11:00, 3.5"
137
137
  }
138
138
  }
139
+ "is_bill_check": false, /* Use the bill check rates */
139
140
  }</pre>
140
141
 
141
142
  <h3>HH Data</h3>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: chellow
3
- Version: 1724062841.0.0
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=RvJRLDLY-KvT299a8xF-HRmslPZczqTgJ9C1zBo55U8,14456
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=Kptq1umJm8_E3Dv__0kfllFDwspZxB9zGCZGvkG17NQ,215553
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=LMq3QQ5h1ipTYRxiE79kbkDEMEZuNDjAHnXwWbECT6Y,46223
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=FGXgKhJwKGBfa0lknaDfvZshV3KRoz5NRbFkbB1f73w,48010
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=8B-eDtHOnW5KYrRLX1R9ylg1_lyuOe5n8aHicyqhJfY,1367
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=apBfJY3RcieKsVmNIgyRJEJ89bEYlN-dmX9yXgOkJ7w,1153
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=K-T_f-u4h5-eEaroypNsryneezEk5rdlawUxjUtkOKE,4820
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-1724062841.0.0.dist-info/METADATA,sha256=L-vg7G-J1TW5xMY0_1DmdfO8vbz6ON965HNP1o1FIvk,12241
369
- chellow-1724062841.0.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
370
- chellow-1724062841.0.0.dist-info/RECORD,,
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,,