chellow 1729012049.0.0__py3-none-any.whl → 1729269304.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.
Potentially problematic release.
This version of chellow might be problematic. Click here for more details.
- chellow/e/bill_parsers/engie_export_xlsx.py +167 -0
- chellow/gas/bill_parser_total_edi.py +132 -12
- chellow/templates/user.html +4 -4
- chellow/templates/users.html +2 -28
- {chellow-1729012049.0.0.dist-info → chellow-1729269304.0.0.dist-info}/METADATA +1 -1
- {chellow-1729012049.0.0.dist-info → chellow-1729269304.0.0.dist-info}/RECORD +7 -6
- {chellow-1729012049.0.0.dist-info → chellow-1729269304.0.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from datetime import datetime as Datetime
|
|
2
|
+
from decimal import Decimal, InvalidOperation
|
|
3
|
+
|
|
4
|
+
from dateutil.relativedelta import relativedelta
|
|
5
|
+
|
|
6
|
+
from openpyxl import load_workbook
|
|
7
|
+
|
|
8
|
+
from werkzeug.exceptions import BadRequest
|
|
9
|
+
|
|
10
|
+
from chellow.utils import HH, parse_mpan_core, to_ct, to_utc
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_cell(sheet, col, row):
|
|
14
|
+
try:
|
|
15
|
+
coordinates = f"{col}{row}"
|
|
16
|
+
return sheet[coordinates]
|
|
17
|
+
except IndexError:
|
|
18
|
+
raise BadRequest(f"Can't find the cell {coordinates} on sheet {sheet}.")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_date_ct(sheet, col, row):
|
|
22
|
+
date_str = get_str(sheet, col, row)
|
|
23
|
+
return to_ct(Datetime.strptime(date_str, "%d/%m/%Y"))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def get_str(sheet, col, row):
|
|
27
|
+
return get_cell(sheet, col, row).value.strip()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_dec(sheet, col, row):
|
|
31
|
+
cell = get_cell(sheet, col, row)
|
|
32
|
+
try:
|
|
33
|
+
return Decimal(str(cell.value))
|
|
34
|
+
except InvalidOperation as e:
|
|
35
|
+
raise BadRequest(f"Problem parsing the number at {cell.coordinate}. {e}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def get_int(sheet, col, row):
|
|
39
|
+
return int(get_cell(sheet, col, row).value)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
ELEM_LOOKUP = {
|
|
43
|
+
"Admin Fee": {
|
|
44
|
+
"gbp": "admin-gbp",
|
|
45
|
+
"units": None,
|
|
46
|
+
"rate": None,
|
|
47
|
+
},
|
|
48
|
+
"VAT": None,
|
|
49
|
+
"GDUOS Charges": {
|
|
50
|
+
"gbp": "duos-gbp",
|
|
51
|
+
"units": None,
|
|
52
|
+
"rate": None,
|
|
53
|
+
},
|
|
54
|
+
"Power Generation": {
|
|
55
|
+
"gbp": "ssp-gbp",
|
|
56
|
+
"units": "ssp-kwh",
|
|
57
|
+
"rate": "ssp-rate",
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _make_raw_bills(book):
|
|
63
|
+
bills = {}
|
|
64
|
+
mpan_lookup = {}
|
|
65
|
+
sheet = book.worksheets[0]
|
|
66
|
+
for row in range(2, len(sheet["A"]) + 1):
|
|
67
|
+
val = get_cell(sheet, "A", row).value
|
|
68
|
+
if val is None or val == "":
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
description = get_str(sheet, "T", row)
|
|
72
|
+
desc_parts = [d.strip() for d in description.split("-")]
|
|
73
|
+
if len(desc_parts) > 1:
|
|
74
|
+
start_date_ct = to_ct(Datetime.strptime(desc_parts[1], "%b %y"))
|
|
75
|
+
finish_date_ct = start_date_ct + relativedelta(months=1) - HH
|
|
76
|
+
else:
|
|
77
|
+
start_date_ct = get_date_ct(sheet, "M", row)
|
|
78
|
+
finish_date_ct = get_date_ct(sheet, "N", row) + relativedelta(
|
|
79
|
+
hours=23, minutes=30
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
desc_elem = desc_parts[0]
|
|
83
|
+
start_date = to_utc(start_date_ct)
|
|
84
|
+
finish_date = to_utc(finish_date_ct)
|
|
85
|
+
reference = get_str(sheet, "G", row)
|
|
86
|
+
issue_date = to_utc(get_date_ct(sheet, "I", row))
|
|
87
|
+
|
|
88
|
+
bill_key = reference, start_date
|
|
89
|
+
try:
|
|
90
|
+
bill = bills[bill_key]
|
|
91
|
+
except KeyError:
|
|
92
|
+
bill = bills[bill_key] = {
|
|
93
|
+
"bill_type_code": "N",
|
|
94
|
+
"kwh": Decimal(0),
|
|
95
|
+
"vat": Decimal("0.00"),
|
|
96
|
+
"net": Decimal("0.00"),
|
|
97
|
+
"gross": Decimal("0.00"),
|
|
98
|
+
"reads": [],
|
|
99
|
+
"breakdown": {},
|
|
100
|
+
"issue_date": issue_date,
|
|
101
|
+
"start_date": start_date,
|
|
102
|
+
"finish_date": finish_date,
|
|
103
|
+
"reference": reference,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
net = round(get_dec(sheet, "V", row), 2)
|
|
107
|
+
vat = round(get_dec(sheet, "W", row), 2)
|
|
108
|
+
gross = round(get_dec(sheet, "X", row), 2)
|
|
109
|
+
bill["net"] += net
|
|
110
|
+
bill["vat"] += vat
|
|
111
|
+
bill["gross"] += gross
|
|
112
|
+
|
|
113
|
+
mpan_core_str = get_str(sheet, "E", row)
|
|
114
|
+
if len(mpan_core_str) > 0:
|
|
115
|
+
mpan_lookup[reference] = parse_mpan_core(mpan_core_str)
|
|
116
|
+
|
|
117
|
+
mpan_core = mpan_lookup[reference]
|
|
118
|
+
|
|
119
|
+
bill["mpan_core"] = mpan_core
|
|
120
|
+
bill["account"] = mpan_core
|
|
121
|
+
|
|
122
|
+
titles = ELEM_LOOKUP[desc_elem]
|
|
123
|
+
if titles is None:
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
breakdown = bill["breakdown"]
|
|
127
|
+
breakdown[titles["gbp"]] = net
|
|
128
|
+
|
|
129
|
+
units_title = titles["units"]
|
|
130
|
+
rate_title = titles["rate"]
|
|
131
|
+
units = get_dec(sheet, "P", row)
|
|
132
|
+
rate = get_dec(sheet, "U", row) / Decimal(1000)
|
|
133
|
+
|
|
134
|
+
if units_title is not None:
|
|
135
|
+
breakdown[units_title] = units
|
|
136
|
+
if rate_title is not None:
|
|
137
|
+
breakdown[rate_title] = [rate]
|
|
138
|
+
return bills.values()
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class Parser:
|
|
142
|
+
def __init__(self, f):
|
|
143
|
+
self.book = load_workbook(f, data_only=True)
|
|
144
|
+
|
|
145
|
+
self.last_line = None
|
|
146
|
+
self._line_number = None
|
|
147
|
+
self._title_line = None
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def line_number(self):
|
|
151
|
+
return None if self._line_number is None else self._line_number + 1
|
|
152
|
+
|
|
153
|
+
def _set_last_line(self, i, line):
|
|
154
|
+
self._line_number = i
|
|
155
|
+
self.last_line = line
|
|
156
|
+
if i == 0:
|
|
157
|
+
self._title_line = line
|
|
158
|
+
return line
|
|
159
|
+
|
|
160
|
+
def make_raw_bills(self):
|
|
161
|
+
row = bills = None
|
|
162
|
+
try:
|
|
163
|
+
bills = _make_raw_bills(self.book)
|
|
164
|
+
except BadRequest as e:
|
|
165
|
+
raise BadRequest(f"Row number: {row} {e.description}")
|
|
166
|
+
|
|
167
|
+
return bills
|
|
@@ -4,9 +4,12 @@ from decimal import Decimal
|
|
|
4
4
|
|
|
5
5
|
from dateutil.relativedelta import relativedelta
|
|
6
6
|
|
|
7
|
+
from sqlalchemy import select
|
|
8
|
+
|
|
7
9
|
from werkzeug.exceptions import BadRequest
|
|
8
10
|
|
|
9
11
|
from chellow.edi_lib import parse_edi, to_date, to_decimal
|
|
12
|
+
from chellow.models import GEra, Session
|
|
10
13
|
from chellow.utils import HH, to_ct, to_utc
|
|
11
14
|
|
|
12
15
|
# From Total 2024-05-29
|
|
@@ -28,6 +31,7 @@ SUPPLIER_CODE_MAP = {
|
|
|
28
31
|
"STD": ("standing", Decimal("1000"), Decimal("1")),
|
|
29
32
|
"MET": ("commodity", Decimal("100000"), Decimal("1000")),
|
|
30
33
|
"CCL": ("ccl", Decimal("100000"), Decimal("1000")),
|
|
34
|
+
"SUN": ("sundry", Decimal("1000"), Decimal("100")),
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
UNIT_MAP = {"M3": "M3", "HH": "HCUF", "HCUF": "HCUF"}
|
|
@@ -110,14 +114,19 @@ def _process_CCD2(elements, headers):
|
|
|
110
114
|
units_billed = to_decimal(nuct) / units_divisor
|
|
111
115
|
breakdown[key] += units_billed
|
|
112
116
|
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
start_date = to_date(csdt[0])
|
|
118
|
+
if start_date is not None and (tpref == "standing" or "start_date" not in headers):
|
|
119
|
+
headers["start_date"] = start_date
|
|
115
120
|
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
finish_date = _to_finish_date(cedt[0])
|
|
122
|
+
if finish_date is not None and (
|
|
123
|
+
tpref == "standing" or "finish_date" not in headers
|
|
124
|
+
):
|
|
125
|
+
headers["finish_date"] = finish_date
|
|
118
126
|
|
|
119
|
-
|
|
120
|
-
|
|
127
|
+
mprn = mloc[0]
|
|
128
|
+
if "mprn" not in headers and len(mprn) > 0:
|
|
129
|
+
headers["mprn"] = mprn
|
|
121
130
|
|
|
122
131
|
if len(conb) > 0 and len(conb[0]) > 0:
|
|
123
132
|
headers["breakdown"]["units_consumed"] += to_decimal(conb) / Decimal("1000")
|
|
@@ -152,6 +161,93 @@ def _process_CCD2(elements, headers):
|
|
|
152
161
|
)
|
|
153
162
|
|
|
154
163
|
|
|
164
|
+
def _process_CCD3(elements, headers):
|
|
165
|
+
breakdown = headers["breakdown"]
|
|
166
|
+
ccde = elements["CCDE"]
|
|
167
|
+
nuct = elements["NUCT"]
|
|
168
|
+
mtnr = elements["MTNR"]
|
|
169
|
+
conb = elements["CONB"]
|
|
170
|
+
adjf = elements["ADJF"]
|
|
171
|
+
prdt = elements["PRDT"]
|
|
172
|
+
pvdt = elements["PVDT"]
|
|
173
|
+
prrd = elements["PRRD"]
|
|
174
|
+
cppu = elements["CPPU"]
|
|
175
|
+
ctot = elements["CTOT"]
|
|
176
|
+
csdt = elements["CSDT"]
|
|
177
|
+
cedt = elements["CEDT"]
|
|
178
|
+
mloc = elements["MLOC"]
|
|
179
|
+
|
|
180
|
+
ccde_supplier_code = ccde[2]
|
|
181
|
+
tpref, rate_divisor, units_divisor = SUPPLIER_CODE_MAP[ccde_supplier_code]
|
|
182
|
+
|
|
183
|
+
rate_str = cppu[0]
|
|
184
|
+
if len(rate_str.strip()) > 0:
|
|
185
|
+
rate_key = f"{tpref}_rate"
|
|
186
|
+
if rate_key not in breakdown:
|
|
187
|
+
breakdown[rate_key] = set()
|
|
188
|
+
rate = Decimal(rate_str) / rate_divisor
|
|
189
|
+
breakdown[rate_key].add(rate)
|
|
190
|
+
|
|
191
|
+
breakdown[f"{tpref}_gbp"] += to_decimal(ctot) / Decimal("100")
|
|
192
|
+
|
|
193
|
+
if len(nuct) > 1:
|
|
194
|
+
suff = NUCT_LOOKUP[nuct[1].strip()]
|
|
195
|
+
key = f"{tpref}_{suff}"
|
|
196
|
+
units_billed = to_decimal(nuct) / units_divisor
|
|
197
|
+
breakdown[key] += units_billed
|
|
198
|
+
|
|
199
|
+
start_date = to_date(csdt[0])
|
|
200
|
+
if start_date is not None and (tpref == "standing" or "start_date" not in headers):
|
|
201
|
+
headers["start_date"] = start_date
|
|
202
|
+
|
|
203
|
+
finish_date = _to_finish_date(cedt[0])
|
|
204
|
+
if finish_date is not None and (
|
|
205
|
+
tpref == "standing" or "finish_date" not in headers
|
|
206
|
+
):
|
|
207
|
+
headers["finish_date"] = finish_date
|
|
208
|
+
|
|
209
|
+
mprn = mloc[0]
|
|
210
|
+
if "mprn" not in headers and len(mprn) > 0:
|
|
211
|
+
headers["mprn"] = mprn
|
|
212
|
+
|
|
213
|
+
if len(conb) > 0 and len(conb[0]) > 0:
|
|
214
|
+
headers["breakdown"]["units_consumed"] += to_decimal(conb) / Decimal("1000")
|
|
215
|
+
|
|
216
|
+
if tpref == "commodity":
|
|
217
|
+
headers["kwh"] += units_billed
|
|
218
|
+
|
|
219
|
+
if len(prrd) > 0 and len(prrd[0]) > 0:
|
|
220
|
+
pres_read_date = to_date(prdt[0])
|
|
221
|
+
prev_read_date = to_date(pvdt[0])
|
|
222
|
+
|
|
223
|
+
pres_read_value = Decimal(prrd[0])
|
|
224
|
+
pres_read_type = READ_TYPE_MAP[prrd[1]]
|
|
225
|
+
prev_read_value = Decimal(prrd[2])
|
|
226
|
+
prev_read_type = READ_TYPE_MAP[prrd[3]]
|
|
227
|
+
msn = mtnr[0]
|
|
228
|
+
unit = UNIT_MAP[conb[1]]
|
|
229
|
+
correction_factor = Decimal(adjf[1]) / Decimal(100000)
|
|
230
|
+
|
|
231
|
+
headers["reads"].append(
|
|
232
|
+
{
|
|
233
|
+
"msn": msn,
|
|
234
|
+
"unit": unit,
|
|
235
|
+
"correction_factor": correction_factor,
|
|
236
|
+
"prev_date": prev_read_date,
|
|
237
|
+
"prev_value": prev_read_value,
|
|
238
|
+
"prev_type_code": prev_read_type,
|
|
239
|
+
"pres_date": pres_read_date,
|
|
240
|
+
"pres_value": pres_read_value,
|
|
241
|
+
"pres_type_code": pres_read_type,
|
|
242
|
+
}
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _process_CLO(elements, headers):
|
|
247
|
+
cloc = elements["CLOC"]
|
|
248
|
+
headers["account"] = cloc[2]
|
|
249
|
+
|
|
250
|
+
|
|
155
251
|
def _process_MTR(elements, headers):
|
|
156
252
|
if headers["message_type"] == "UTLBIL":
|
|
157
253
|
breakdown = headers["breakdown"]
|
|
@@ -159,11 +255,35 @@ def _process_MTR(elements, headers):
|
|
|
159
255
|
if isinstance(v, set):
|
|
160
256
|
breakdown[k] = sorted(v)
|
|
161
257
|
|
|
258
|
+
account = headers["account"]
|
|
259
|
+
try:
|
|
260
|
+
mprn = headers["mprn"]
|
|
261
|
+
except KeyError:
|
|
262
|
+
with Session() as sess:
|
|
263
|
+
g_era = sess.scalars(
|
|
264
|
+
select(GEra)
|
|
265
|
+
.where(GEra.account == account)
|
|
266
|
+
.order_by(GEra.start_date)
|
|
267
|
+
).first()
|
|
268
|
+
if g_era is None:
|
|
269
|
+
raise BadRequest(
|
|
270
|
+
f"Couldn't find an MPRN, and then couldn't fine a supply "
|
|
271
|
+
f"with account {account}."
|
|
272
|
+
)
|
|
273
|
+
else:
|
|
274
|
+
mprn = g_era.g_supply.mprn
|
|
275
|
+
|
|
276
|
+
start_date = headers["start_date"]
|
|
277
|
+
if "finish_date" in headers:
|
|
278
|
+
finish_date = headers["finish_date"]
|
|
279
|
+
else:
|
|
280
|
+
finish_date = start_date
|
|
281
|
+
|
|
162
282
|
return {
|
|
163
283
|
"raw_lines": "\n".join(headers["raw_lines"]),
|
|
164
|
-
"mprn":
|
|
284
|
+
"mprn": mprn,
|
|
165
285
|
"reference": headers["reference"],
|
|
166
|
-
"account":
|
|
286
|
+
"account": account,
|
|
167
287
|
"reads": headers["reads"],
|
|
168
288
|
"kwh": headers["kwh"],
|
|
169
289
|
"breakdown": headers["breakdown"],
|
|
@@ -171,8 +291,8 @@ def _process_MTR(elements, headers):
|
|
|
171
291
|
"vat_gbp": headers["vat"],
|
|
172
292
|
"gross_gbp": headers["gross"],
|
|
173
293
|
"bill_type_code": headers["bill_type_code"],
|
|
174
|
-
"start_date":
|
|
175
|
-
"finish_date":
|
|
294
|
+
"start_date": start_date,
|
|
295
|
+
"finish_date": finish_date,
|
|
176
296
|
"issue_date": headers["issue_date"],
|
|
177
297
|
}
|
|
178
298
|
|
|
@@ -215,10 +335,10 @@ CODE_FUNCS = {
|
|
|
215
335
|
"BTL": _process_NOOP,
|
|
216
336
|
"CCD1": _process_NOOP,
|
|
217
337
|
"CCD2": _process_CCD2,
|
|
218
|
-
"CCD3":
|
|
338
|
+
"CCD3": _process_CCD3,
|
|
219
339
|
"CCD4": _process_NOOP,
|
|
220
340
|
"CDT": _process_NOOP,
|
|
221
|
-
"CLO":
|
|
341
|
+
"CLO": _process_CLO,
|
|
222
342
|
"END": _process_NOOP,
|
|
223
343
|
"FIL": _process_NOOP,
|
|
224
344
|
"MHD": _process_MHD,
|
chellow/templates/user.html
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<form method="post">
|
|
24
24
|
<fieldset>
|
|
25
25
|
<legend>Update details</legend>
|
|
26
|
-
<label>Username</label>
|
|
26
|
+
<label>Username (case sensitive)</label>
|
|
27
27
|
<input name="email_address" size="100" value="
|
|
28
28
|
{%- if request.values.email_address -%}
|
|
29
29
|
{{ request.values.email_address }}
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
<fieldset>
|
|
68
68
|
<legend>Change password</legend>
|
|
69
69
|
<input type="hidden" name="change_password">
|
|
70
|
-
<label>Current password</label>
|
|
70
|
+
<label>Current password (case sensitive)</label>
|
|
71
71
|
<input type="password" name="current_password">
|
|
72
|
-
<label>New password</label>
|
|
72
|
+
<label>New password (case sensitive)</label>
|
|
73
73
|
<input type="password" name="new_password">
|
|
74
|
-
<label>Confirm new Password</label>
|
|
74
|
+
<label>Confirm new Password (case sensitive)</label>
|
|
75
75
|
<input type="password" name="confirm_new_password">
|
|
76
76
|
<input type="submit" value="Change">
|
|
77
77
|
</fieldset>
|
chellow/templates/users.html
CHANGED
|
@@ -4,14 +4,6 @@
|
|
|
4
4
|
» Users
|
|
5
5
|
{% endblock %}
|
|
6
6
|
|
|
7
|
-
{% block inside_head %}
|
|
8
|
-
<style type="text/css">
|
|
9
|
-
label {
|
|
10
|
-
width: 10em;
|
|
11
|
-
}
|
|
12
|
-
</style>
|
|
13
|
-
{% endblock %}
|
|
14
|
-
|
|
15
7
|
{% block nav %}
|
|
16
8
|
Users
|
|
17
9
|
{% endblock %}
|
|
@@ -50,10 +42,10 @@
|
|
|
50
42
|
<fieldset>
|
|
51
43
|
<legend>Add new user</legend>
|
|
52
44
|
|
|
53
|
-
<label>Username</label>
|
|
45
|
+
<label>Username (case sensitive)</label>
|
|
54
46
|
{{input_text('email_address')}}
|
|
55
47
|
{% if not ad_auth_on %}
|
|
56
|
-
<label>Password</label>
|
|
48
|
+
<label>Password (case sensitive)</label>
|
|
57
49
|
<input type="password" name="password">
|
|
58
50
|
{% endif %}
|
|
59
51
|
<fieldset>
|
|
@@ -74,24 +66,6 @@
|
|
|
74
66
|
checked
|
|
75
67
|
{% endif %}
|
|
76
68
|
>
|
|
77
|
-
<label>Party Viewer</label>
|
|
78
|
-
<input type="radio" name="user_role_code" value="party-viewer"
|
|
79
|
-
{% if request.values.user_role_code == 'party-viewer' %}
|
|
80
|
-
checked
|
|
81
|
-
{% endif %}
|
|
82
|
-
>
|
|
83
|
-
<label>Party Viewer Party</label>
|
|
84
|
-
<select name="party_id">
|
|
85
|
-
{% for party in parties %}
|
|
86
|
-
<option value="{{ party.id }}"
|
|
87
|
-
{%- if request.values.user_role_id == party.id -%}
|
|
88
|
-
selected
|
|
89
|
-
{% endif %}
|
|
90
|
-
>{{ party.name }} {{ party.participant.code }}
|
|
91
|
-
{{ party.market_role.description }}
|
|
92
|
-
</option>
|
|
93
|
-
{% endfor %}
|
|
94
|
-
</select>
|
|
95
69
|
</fieldset>
|
|
96
70
|
<input type="submit" value="Add">
|
|
97
71
|
</fieldset>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: chellow
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1729269304.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)
|
|
@@ -49,6 +49,7 @@ chellow/e/bill_parsers/bgb_edi.py,sha256=GuwHeYbAGk7BVg5n19FcTANFDyKI-y0z3f9niQa
|
|
|
49
49
|
chellow/e/bill_parsers/csv.py,sha256=U5zcIaZ6B5QTTpFDAcBnk4G2r8B3j5kJhDPL4AJNkEk,5640
|
|
50
50
|
chellow/e/bill_parsers/edf_export_xlsx.py,sha256=t-M9-dGNWXu3VDI1DbS5Ez1oHW33oopJryNgMTvTjys,6307
|
|
51
51
|
chellow/e/bill_parsers/engie_edi.py,sha256=CTobTskDjzdcqqf_qk2ukDSaTLrVpGZMM0sYlwehog4,14985
|
|
52
|
+
chellow/e/bill_parsers/engie_export_xlsx.py,sha256=oZO0qHdDlOxjJ6J5Ate82CkAoX4bxed1EJyUKHxBcpk,4690
|
|
52
53
|
chellow/e/bill_parsers/engie_xls.py,sha256=jrut2heH_ZWmSjcn7celOydZS9Y49GfpYjDk_EKwamI,14453
|
|
53
54
|
chellow/e/bill_parsers/engie_xlsx.py,sha256=4Hu3ls1uNMH7vjDHgcP6QARlGlvb616CqG3xZVjAKWo,16888
|
|
54
55
|
chellow/e/bill_parsers/gdf_csv.py,sha256=ZfK3Oc6oP28p_P9DIevLNB_zW2WLcEJ3Lvb1gL310YU,7382
|
|
@@ -63,7 +64,7 @@ chellow/e/bill_parsers/sww_xls.py,sha256=QEjiuvwvr5FuWCfqqVw8LaA_vZyAKsvRAS5fw3x
|
|
|
63
64
|
chellow/gas/bill_import.py,sha256=w0lPgK_Drzh8rtnEBQe3qFuxrgzZ6qQSgpaGrrGznMU,6549
|
|
64
65
|
chellow/gas/bill_parser_csv.py,sha256=Ecdy-apFT-mWAxddAsM4k1s-9-FpIaOfjP0oFc0rdQg,5557
|
|
65
66
|
chellow/gas/bill_parser_engie_edi.py,sha256=Ko0vZP-QdVQ1uuhS_5cdrii60_cM4b_LFJMoY0pZqnk,8950
|
|
66
|
-
chellow/gas/bill_parser_total_edi.py,sha256=
|
|
67
|
+
chellow/gas/bill_parser_total_edi.py,sha256=bMAeIkzHwNhv0qdKYXtRl-tzUUYtjNkbM3PMl3NurFc,11225
|
|
67
68
|
chellow/gas/ccl.py,sha256=DMlcPUELZi00CaDekVJINYk3GgH5apFrImVdmkbyba0,2913
|
|
68
69
|
chellow/gas/cv.py,sha256=4cdYYQ8Qak6NeYdBCB4YaQ0jX8-UkaydIIdibCQuXxM,7344
|
|
69
70
|
chellow/gas/dn_rate_parser.py,sha256=Mq8rAcUEUxIQOks59bsCKl8GrefvoHbrTCHqon9N0z0,11340
|
|
@@ -155,9 +156,9 @@ chellow/templates/sites.html,sha256=4ouJ5xYqYHjXCv3cDucTjgbOd_whReFPPHopLBdW6Go,
|
|
|
155
156
|
chellow/templates/supplies.html,sha256=Ie_4K4-KwXqrCBwaUcjWxmV27rYjeESI_DCS9gLUipk,3488
|
|
156
157
|
chellow/templates/system.html,sha256=PP8MN8mieil3AwLS1WlQBcgbl0J61bksN-Cy4toYNqo,1871
|
|
157
158
|
chellow/templates/tester.html,sha256=4DYrtcnFY0y6o3K6_tSmFpPlCRngZj1zo8nJ1NI4pk8,623
|
|
158
|
-
chellow/templates/user.html,sha256=
|
|
159
|
+
chellow/templates/user.html,sha256=bv1AuqnU_GFELaIbDaXSZ3FK6XJaM8so5fOkE8pVpPY,2480
|
|
159
160
|
chellow/templates/user_roles.html,sha256=Pfjr4uApEmJl8t9s0qJTxigQcAVYw7gpV_ECE8c0Cto,399
|
|
160
|
-
chellow/templates/users.html,sha256=
|
|
161
|
+
chellow/templates/users.html,sha256=8jZTeMlV0Bg5FhLJrIVhsMggQUnd9ipc1dw6-SXdVP8,1601
|
|
161
162
|
chellow/templates/e/asset_comparison.html,sha256=QyN3WMw8YoFaSWUvD2NOnRLdLdB3Kv6m3t8Id8Mb6_A,678
|
|
162
163
|
chellow/templates/e/channel.html,sha256=R5fhdsHvhB7k57Rw_gviUQ7_EXBGwP05E691V1BUNSQ,2056
|
|
163
164
|
chellow/templates/e/channel_add.html,sha256=szwQJBHx2kAoSFomXDHD0N_7PSd4drqOoAWhM-jvSqM,1676
|
|
@@ -369,6 +370,6 @@ chellow/templates/g/supply_note_edit.html,sha256=b8mB6_ucBwoljp03iy6AgVaZUhGw3-1
|
|
|
369
370
|
chellow/templates/g/supply_notes.html,sha256=6epNmZ3NKdXZz27fvmRUGeffg_oc1kmwuBeyRzQe3Rg,854
|
|
370
371
|
chellow/templates/g/unit.html,sha256=KouNVU0-i84afANkLQ_heJ0uDfJ9H5A05PuLqb8iCN8,438
|
|
371
372
|
chellow/templates/g/units.html,sha256=p5Nd-lAIboKPEOO6N451hx1bcKxMg4BDODnZ-43MmJc,441
|
|
372
|
-
chellow-
|
|
373
|
-
chellow-
|
|
374
|
-
chellow-
|
|
373
|
+
chellow-1729269304.0.0.dist-info/METADATA,sha256=OwkMhByEZZ_kZ86oUHDEOo73f69mk8jiX9KoFziS20M,12204
|
|
374
|
+
chellow-1729269304.0.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
375
|
+
chellow-1729269304.0.0.dist-info/RECORD,,
|
|
File without changes
|