chellow 1751036864.0.0__py3-none-any.whl → 1751477752.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.

@@ -44,7 +44,8 @@ class Parser:
44
44
  val = cell.value
45
45
  if not isinstance(val, Datetime):
46
46
  raise BadRequest(
47
- f"Problem reading {val} as a timestamp at {cell.coordinate}."
47
+ f"The value {val} at {cell.coordinate} is of type {type(val)}, but "
48
+ f"expected a timestamp."
48
49
  )
49
50
  return val
50
51
 
@@ -1,16 +1,16 @@
1
1
  import csv
2
+ from collections import defaultdict
2
3
  from datetime import datetime as Datetime
3
4
  from decimal import Decimal, InvalidOperation
4
5
  from enum import Enum, auto
5
6
  from io import BytesIO
6
7
 
7
- from dateutil.relativedelta import relativedelta
8
8
 
9
9
  from openpyxl import load_workbook
10
10
 
11
11
  from werkzeug.exceptions import BadRequest
12
12
 
13
- from chellow.utils import to_ct, to_utc
13
+ from chellow.utils import c_months_u, to_ct, to_utc
14
14
 
15
15
 
16
16
  class Title(Enum):
@@ -35,17 +35,14 @@ class Title(Enum):
35
35
 
36
36
  COLUMNS = {
37
37
  Title.CUSTOMER: ["Customer"],
38
- Title.PRODUCT: ["Product"],
39
- Title.BROKER_NAME: ["Broker Name"],
40
38
  Title.ACCOUNT: ["Account"],
41
39
  Title.MPRN: ["MPRN"],
42
40
  Title.BILL: ["Bill"],
43
- Title.SUPPLY_ADDRESS: ["Supply Address"],
44
- Title.BILL_DATE: ["Bill Date"],
45
- Title.BILLING_PERIOD: ["Billing Period"],
46
- Title.CHARGE_TYPE: ["Charge Type"],
47
- Title.CHARGE_PERIOD_FROM: ["Charge Period From"],
48
- Title.CHARGE_PERIOD_END: ["Charge Period End"],
41
+ Title.BILL_DATE: ["Bill Date", "BillDate"],
42
+ Title.BILLING_PERIOD: ["Billing Period", "BillingPeriod"],
43
+ Title.CHARGE_TYPE: ["Charge Type", "ChargeType"],
44
+ Title.CHARGE_PERIOD_FROM: ["Charge Period From", "ChargePeriodFrom"],
45
+ Title.CHARGE_PERIOD_END: ["Charge Period End", "ChargePeriodEnd"],
49
46
  Title.QUANTITY: ["Quantity"],
50
47
  Title.QUNIT: ["QUnit"],
51
48
  Title.CHARGE: ["Charge"],
@@ -127,34 +124,21 @@ def get_int(sheet, row, col):
127
124
  )
128
125
 
129
126
 
130
- """
131
- def _bd_add(bd, el_name, val):
132
- if el_name.split("-")[-1] in ("rate", "kva"):
133
- if el_name not in bd:
134
- bd[el_name] = set()
135
- bd[el_name].add(val)
136
- else:
137
- if el_name not in bd:
138
- bd[el_name] = 0
139
- try:
140
- bd[el_name] += val
141
- except TypeError as e:
142
- raise BadRequest(
143
- f"Problem with element name {el_name} and value '{val}': {e}"
144
- )
145
- """
146
-
147
127
  ELEMENT_LOOKUP = {
128
+ "CCL": "ccl",
129
+ "Fixed Management Fee": "admin_fixed",
130
+ "Gas": "admin_variable",
148
131
  "Management Fee": "admin_variable",
132
+ "Metering and Data": "metering",
149
133
  "LDZ Customer Capacity": "dn_customer_capacity_fixed",
134
+ "LDZ Customer Fixed": "dn_customer_fixed",
150
135
  "LDZ System Capacity": "dn_system_capacity_fixed",
151
- "LDZ System Commodity": "dn_system_capacity",
152
- "Metering Charges": "metering",
136
+ "LDZ System Commodity": "dn_system_commodity",
153
137
  "NTS Exit Capacity (ECN)": "dn_ecn_fixed",
154
138
  "NTS SO Exit": "so_exit_commodity",
155
139
  "NTS TO Exit": "to_exit_commodity",
156
140
  "Unidentified Gas": "ug",
157
- "WAP": "wap",
141
+ "WAP": "commodity",
158
142
  }
159
143
 
160
144
  QUNIT_LOOKUP = {
@@ -165,15 +149,15 @@ QUNIT_LOOKUP = {
165
149
 
166
150
  def _parse_row(bills, sheet, row, title_row):
167
151
  column_map = make_column_map(title_row)
168
- mprn = get_value(sheet, row, column_map[Title.MPRN])
152
+ mprn_raw = get_value(sheet, row, column_map[Title.MPRN])
153
+ mprn = str(mprn_raw)
169
154
  reference = get_value(sheet, row, column_map[Title.BILL])
170
155
  account = get_value(sheet, row, column_map[Title.ACCOUNT])
171
156
  issue_date = get_date(sheet, row, column_map[Title.BILL_DATE])
172
- start_date = get_date(sheet, row, column_map[Title.CHARGE_PERIOD_FROM])
173
- finish_date = to_utc(
174
- to_ct(get_date_naive(sheet, row, column_map[Title.CHARGE_PERIOD_END]))
175
- + relativedelta(hours=23, minutes=30)
176
- )
157
+ period_naive = get_date_naive(sheet, row, column_map[Title.BILLING_PERIOD])
158
+ start_date, finish_date = list(
159
+ c_months_u(start_year=period_naive.year, start_month=period_naive.month)
160
+ )[0]
177
161
 
178
162
  try:
179
163
  mprn_values = bills[mprn]
@@ -181,14 +165,9 @@ def _parse_row(bills, sheet, row, title_row):
181
165
  mprn_values = bills[mprn] = {}
182
166
 
183
167
  try:
184
- start_date_values = mprn_values[start_date]
185
- except KeyError:
186
- start_date_values = mprn_values[start_date] = {}
187
-
188
- try:
189
- bill = start_date_values[finish_date]
168
+ bill = mprn_values[period_naive]
190
169
  except KeyError:
191
- bill = start_date_values[finish_date] = {
170
+ bill = mprn_values[period_naive] = {
192
171
  "bill_type_code": "N",
193
172
  "mprn": mprn,
194
173
  "reference": reference,
@@ -197,10 +176,12 @@ def _parse_row(bills, sheet, row, title_row):
197
176
  "start_date": start_date,
198
177
  "finish_date": finish_date,
199
178
  "kwh": Decimal("0"),
179
+ "breakdown": defaultdict(int, {}),
200
180
  "net_gbp": Decimal("0.00"),
201
181
  "vat_gbp": Decimal("0.00"),
202
182
  "gross_gbp": Decimal("0.00"),
203
- "breakdown": {},
183
+ "raw_lines": str([(c.value) for c in sheet[row]]),
184
+ "reads": [],
204
185
  }
205
186
 
206
187
  bd = bill["breakdown"]
@@ -209,38 +190,42 @@ def _parse_row(bills, sheet, row, title_row):
209
190
  qunit = get_value(sheet, row, column_map[Title.QUNIT])
210
191
  charge = get_dec(sheet, row, column_map[Title.CHARGE]) / Decimal("100")
211
192
  total = get_dec(sheet, row, column_map[Title.TOTAL])
212
- if element_desc.startswith("20% VAT on "):
193
+ if element_desc == "VAT":
213
194
  bill["net_gbp"] += quantity
214
195
  bill["vat_gbp"] += total
215
196
  bill["gross_gbp"] += quantity + total
197
+ if "vat_rate" not in bd:
198
+ bd["vat_rate"] = set()
199
+ bd["vat_rate"].add(charge)
216
200
  else:
217
201
  element_name = ELEMENT_LOOKUP[element_desc]
218
- if element_name == "admin_variable":
202
+ if element_name == "commodity":
219
203
  bill["kwh"] += quantity
220
- bd[f"{element_name}_gbp"] = total
204
+ bd[f"{element_name}_gbp"] += total
221
205
  element_qunit = QUNIT_LOOKUP[qunit]
222
- bd[f"{element_name}_{element_qunit}"] = quantity
223
- bd[f"{element_name}_rate"] = charge
206
+ bd[f"{element_name}_{element_qunit}"] += quantity
207
+ rate_name = f"{element_name}_rate"
208
+ if rate_name not in bd:
209
+ bd[rate_name] = set()
210
+ bd[rate_name].add(charge)
224
211
 
225
212
 
226
213
  def _make_raw_bills(sheet):
227
214
  bills = {}
228
215
  rows = tuple(sheet.rows)
229
- title_row = rows[1]
230
- for row_index, row in enumerate(rows[2:], start=3):
216
+ title_row = rows[0]
217
+ for row_index, row in enumerate(rows[1:], start=2):
231
218
  val = row[0].value
232
219
  if val not in (None, ""):
233
220
  try:
234
221
  _parse_row(bills, sheet, row_index, title_row)
235
222
  except BadRequest as e:
236
- raise BadRequest(f"On row {row_index + 1}: {e.description}")
237
- print("bills", bills)
223
+ raise BadRequest(f"On row {row_index}: {e.description}")
238
224
 
239
225
  raw_bills = []
240
226
  for mprn, mprn_values in bills.items():
241
- for period_stat, period_start_values in mprn_values.items():
242
- for period_finish, bill in period_start_values.items():
243
- raw_bills.append(bill)
227
+ for period, raw_bill in mprn_values.items():
228
+ raw_bills.append(raw_bill)
244
229
 
245
230
  return raw_bills
246
231
 
chellow/general_import.py CHANGED
@@ -21,6 +21,7 @@ from chellow.models import (
21
21
  DtcMeterType,
22
22
  EnergisationStatus,
23
23
  Era,
24
+ GBill,
24
25
  GContract,
25
26
  GEra,
26
27
  GExitZone,
@@ -1151,6 +1152,77 @@ def general_import_g_bill(sess, action, vals, args):
1151
1152
  )
1152
1153
 
1153
1154
 
1155
+ def general_import_g_register_read(sess, action, vals, args):
1156
+ if action == "insert":
1157
+ contract_name = add_arg(args, "Supplier Contract Name", vals, 0)
1158
+
1159
+ g_contract = GContract.get_supplier_by_name(sess, contract_name)
1160
+
1161
+ batch_reference = add_arg(args, "Batch Reference", vals, 1)
1162
+
1163
+ g_batch = g_contract.get_g_batch_by_reference(sess, batch_reference)
1164
+
1165
+ mprn = add_arg(args, "MPRN", vals, 2)
1166
+ g_supply = GSupply.get_by_mprn(sess, mprn)
1167
+
1168
+ bill_start_date_str = add_arg(args, "Bill Start Date", vals, 3)
1169
+ bill_start_date = parse_hh_start(bill_start_date_str)
1170
+
1171
+ g_bill = sess.scalars(
1172
+ select(GBill).where(
1173
+ GBill.g_batch == g_batch,
1174
+ GBill.g_supply == g_supply,
1175
+ GBill.start_date == bill_start_date,
1176
+ )
1177
+ ).first()
1178
+
1179
+ if g_bill is None:
1180
+ raise BadRequest(
1181
+ f"Can't find a bill in batch {batch_reference} in contract "
1182
+ f"{contract_name} with MPRN {mprn} starting at "
1183
+ f"{hh_format(bill_start_date)}"
1184
+ )
1185
+
1186
+ for i in range(4, len(vals), 10):
1187
+ msn = add_arg(args, "Meter Serial Number", vals, i)
1188
+ g_unit_code = add_arg(args, "Unit", vals, i + 1)
1189
+ g_unit = GUnit.get_by_code(sess, g_unit_code)
1190
+ correction_factor_str = add_arg(args, "Correction Factor", vals, i + 2)
1191
+ correction_factor = Decimal(correction_factor_str)
1192
+ calorific_value_str = add_arg(args, "Calorific Value", vals, i + 3)
1193
+ calorific_value = Decimal(calorific_value_str)
1194
+
1195
+ prev_date_str = add_arg(args, "Previous Date", vals, i + 4)
1196
+ prev_date = parse_hh_start(prev_date_str)
1197
+ prev_value_str = add_arg(args, "Previous Value", vals, i + 5)
1198
+ prev_value = Decimal(prev_value_str)
1199
+
1200
+ prev_type_str = add_arg(args, "Previous Type", vals, i + 6)
1201
+ prev_type = GReadType.get_by_code(sess, prev_type_str)
1202
+
1203
+ pres_date_str = add_arg(args, "Present Date", vals, i + 7)
1204
+ pres_date = parse_hh_start(pres_date_str)
1205
+ pres_value_str = add_arg(args, "Present Value", vals, i + 8)
1206
+ pres_value = Decimal(pres_value_str)
1207
+
1208
+ pres_type_str = add_arg(args, "Present Type", vals, i + 9)
1209
+ pres_type = GReadType.get_by_code(sess, pres_type_str)
1210
+
1211
+ g_bill.insert_g_read(
1212
+ sess,
1213
+ msn,
1214
+ g_unit,
1215
+ correction_factor,
1216
+ calorific_value,
1217
+ prev_value,
1218
+ prev_date,
1219
+ prev_type,
1220
+ pres_value,
1221
+ pres_date,
1222
+ pres_type,
1223
+ )
1224
+
1225
+
1154
1226
  def general_import_register_read(sess, action, vals, args):
1155
1227
  if action == "insert":
1156
1228
  pass
@@ -33,7 +33,7 @@
33
33
  </ul>
34
34
 
35
35
  {% if failed_bills|length > 0 %}
36
- <table>
36
+ <table class="sticky">
37
37
  <caption>Failed Bills</caption>
38
38
  <thead>
39
39
  <tr>
@@ -77,7 +77,7 @@
77
77
  <td>{{bill.net_gbp}}</td>
78
78
  <td>{{bill.vat_gbp}}</td>
79
79
  <td>{{bill.gross_gbp}}</td>
80
- <td>{{bill.breakdown|dumps}}</td>
80
+ <td><pre>{{bill.breakdown|dumps}}</pre></td>
81
81
  {% for read in bill.reads %}
82
82
  <td>{{read.calorific_value}}</td>
83
83
  <td>{{read.correction_factor}}</td>
@@ -97,7 +97,7 @@
97
97
  {% endif %}
98
98
 
99
99
  {% if successful_bills|length > 0 %}
100
- <table>
100
+ <table class="sticky">
101
101
  <caption>Successful Bills</caption>
102
102
  <thead>
103
103
  <tr>
@@ -141,7 +141,7 @@
141
141
  <td>{{bill.net_gbp}}</td>
142
142
  <td>{{bill.vat_gbp}}</td>
143
143
  <td>{{bill.gross_gbp}}</td>
144
- <td>{{bill.breakdown|dumps}}</td>
144
+ <td><pre>{{bill.breakdown|dumps}}</pre></td>
145
145
  {% for g_read in bill.reads %}
146
146
  <td>{{g_read.msn}}</td>
147
147
  <td>{{g_read.prev_date|hh_format}}</td>
@@ -511,6 +511,24 @@
511
511
  <td>Present Value</td>
512
512
  <td>Present Type)*</td>
513
513
  </td>
514
+ <tr>
515
+ <td><em>insert</em></td>
516
+ <td><em>g_register_read</em></td>
517
+ <td>Contract Name</td>
518
+ <td>Batch Reference</td>
519
+ <td>MPRN</td>
520
+ <td>Bill Start Date (YYYY-MM-dd hh:mm)</td>
521
+ <td>(Meter Serial Number</td>
522
+ <td>Unit</td>
523
+ <td>Correction Factor</td>
524
+ <td>Calorific Value</td>
525
+ <td>Previous Date (YYYY-MM-dd hh:mm)</td>
526
+ <td>Previous Value</td>
527
+ <td>Previous Type</td>
528
+ <td>Present Date (YYYY-MM-dd hh:mm)</td>
529
+ <td>Present Value</td>
530
+ <td>Present Type)*</td>
531
+ </td>
514
532
  <tr>
515
533
  <td><em>insert</em></td>
516
534
  <td><em>valid_mtc_llfc_ssc_pc</em></td>
chellow/views.py CHANGED
@@ -1696,7 +1696,8 @@ def report_run_row_get(row_id):
1696
1696
  toks = t.split("_")
1697
1697
  if toks[0] in ("covered", "virtual", "difference"):
1698
1698
  tail = "_".join(toks[1:])
1699
- for element in elements.keys():
1699
+ for element in sorted(elements.keys(), key=len, reverse=True):
1700
+
1700
1701
  table = elements[element]
1701
1702
  elstr = f"{element}_"
1702
1703
  if tail.startswith(elstr):
@@ -1705,6 +1706,7 @@ def report_run_row_get(row_id):
1705
1706
  table["parts"].add(part)
1706
1707
  if t.startswith("difference_") and t.endswith("_gbp"):
1707
1708
  table["order"] = abs(values[t])
1709
+ break
1708
1710
 
1709
1711
  tables.sort(key=lambda t: t["order"], reverse=True)
1710
1712
  return render_template(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chellow
3
- Version: 1751036864.0.0
3
+ Version: 1751477752.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)
@@ -11,7 +11,7 @@ Requires-Dist: flask-restx==1.3.0
11
11
  Requires-Dist: flask==3.1.1
12
12
  Requires-Dist: jsonschema==4.17.3
13
13
  Requires-Dist: odio==0.0.23
14
- Requires-Dist: openpyxl==3.1.2
14
+ Requires-Dist: openpyxl==3.1.5
15
15
  Requires-Dist: paramiko==3.4.1
16
16
  Requires-Dist: pep3143daemon==0.0.6
17
17
  Requires-Dist: pg8000==1.31.1
@@ -5,7 +5,7 @@ chellow/commands.py,sha256=ESBe9ZWj1c3vdZgqMZ9gFvYAB3hRag2R1PzOwuw9yFo,1302
5
5
  chellow/dloads.py,sha256=dixp-O0MF2_mlwrnKx3D9DH09Qu05BjTo0rZfigTjR4,5534
6
6
  chellow/edi_lib.py,sha256=alu20x9ZX06iPfnNI9dEJzuP6RIf4We3Y_M_bl7RrcY,51789
7
7
  chellow/fake_batch_updater.py,sha256=khAmvSUn9qN04w8C92kRg1UeyQvfLztE7QXv9tUz6nE,11611
8
- chellow/general_import.py,sha256=y8X-FzQJzVrfvVMyErNHns2MGI511KwDC19AjIX3nTk,65325
8
+ chellow/general_import.py,sha256=bm8FoaC9xUajGvJYShuS5GEwPwcL5eCF9D9g6o_AkB0,68089
9
9
  chellow/models.py,sha256=XD5wl3Pa8vZFGA0aB1Pu-xJs3iBoBoeX44E8Myho_68,244648
10
10
  chellow/national_grid.py,sha256=-c_vqNRtpNIQOcm0F1NDhS3_QUiOaLgEJYWzysSNc5Y,4369
11
11
  chellow/proxy.py,sha256=cVXIktPlX3tQ1BYcwxq0nJXKE6r3DtFTtfFHPq55HaM,1351
@@ -13,7 +13,7 @@ chellow/rate_server.py,sha256=fg-Pf_9Hk3bXmC9riPQNGQxBvLvBa_WtNYdwDCjnCSg,5678
13
13
  chellow/rrun.py,sha256=1Kt2q_K9UoDG_nsZz-Q6XJiMNKroWqlqFdxn2M6Q8CA,2088
14
14
  chellow/testing.py,sha256=Dj2c1NX8lVlygueOrh2eyYawLW6qKEHxNhXVVUaNRO0,3637
15
15
  chellow/utils.py,sha256=i3GQK9MIcweosZk2gi-nX_IFq2DxURAJDyNoLBg6YwM,19421
16
- chellow/views.py,sha256=GVmmChaMaFmZmcsgvR9Z5xfSh4Y1mPEBDR90kiZH5Xk,85292
16
+ chellow/views.py,sha256=7nk7kZALoSGeyMSVU-_DzYSLt7ypPFQ6zBpx8--AER4,85354
17
17
  chellow/e/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  chellow/e/aahedc.py,sha256=d2usudp7KYWpU6Pk3fal5EQ47EbvkvKeaFGylnb3NWw,606
19
19
  chellow/e/bill_importer.py,sha256=7UcnqNlKbJc2GhW9gy8sDp9GuqambJVpZLvbafOZztA,7411
@@ -46,7 +46,7 @@ chellow/e/tnuos.py,sha256=NBmc-f3oezrl4gviAKobljHfICTpBKxxxEGBGJi_lRk,4927
46
46
  chellow/e/triad.py,sha256=lIQj7EdUrcFwEqleuHZXYU_bfzIwNOqUVVxB3NPQt4A,13710
47
47
  chellow/e/views.py,sha256=e5rMZFT2fNO3P14_0nCyOEwNWnMiayx2wqo4PJmBwRM,220111
48
48
  chellow/e/bill_parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- chellow/e/bill_parsers/activity_mop_stark_xlsx.py,sha256=UgWXDPzQkQghyj_lfgBqoSJpHB-t-qOdSaB8qY6GLog,4071
49
+ chellow/e/bill_parsers/activity_mop_stark_xlsx.py,sha256=opjXRrqrgBTbSKzL0JfTLP0fnz3DL3oRZZ4P0DifQ3I,4119
50
50
  chellow/e/bill_parsers/annual_mop_stark_xlsx.py,sha256=-HMoIfa_utXYKA44RuC0Xqv3vd2HLeQU_4P0iBUd3WA,4219
51
51
  chellow/e/bill_parsers/bgb_edi.py,sha256=GuwHeYbAGk7BVg5n19FcTANFDyKI-y0z3f9niQaPSSw,4828
52
52
  chellow/e/bill_parsers/csv.py,sha256=U5zcIaZ6B5QTTpFDAcBnk4G2r8B3j5kJhDPL4AJNkEk,5640
@@ -67,7 +67,7 @@ chellow/e/bill_parsers/settlement_dc_stark_xlsx.py,sha256=osCpUYUdLcPtlo7ngXWGw0
67
67
  chellow/e/bill_parsers/sse_edi.py,sha256=L85DOfNkqexeEIEr8pCBn_2sHJI-zEaw6cogpE3YyYM,15204
68
68
  chellow/e/bill_parsers/sww_xls.py,sha256=QEjiuvwvr5FuWCfqqVw8LaA_vZyAKsvRAS5fw3xtFhM,7533
69
69
  chellow/gas/bill_import.py,sha256=w0lPgK_Drzh8rtnEBQe3qFuxrgzZ6qQSgpaGrrGznMU,6549
70
- chellow/gas/bill_parser_bgs_xlsx.py,sha256=PxjFMEB91QcGvyarCc9qHfO3-Rs_Twdo9iJU9uBYfa4,7834
70
+ chellow/gas/bill_parser_bgs_xlsx.py,sha256=ySYAa6fq990DW01bQMk8Ix_sziWfm_5d2Il7IrYz9Ys,7522
71
71
  chellow/gas/bill_parser_csv.py,sha256=Ecdy-apFT-mWAxddAsM4k1s-9-FpIaOfjP0oFc0rdQg,5557
72
72
  chellow/gas/bill_parser_engie_edi.py,sha256=Ko0vZP-QdVQ1uuhS_5cdrii60_cM4b_LFJMoY0pZqnk,8950
73
73
  chellow/gas/bill_parser_total_edi.py,sha256=8HZH5Le24bVNFDc7vaKbauMaYR-n9P6u0ZG7gDdqbIA,11325
@@ -128,7 +128,7 @@ chellow/templates/downloads.html,sha256=R9QPcFz-PLJOX7rDlmquIk-Hp9Iq-thzWCTfOexS
128
128
  chellow/templates/edi_viewer.html,sha256=szUthgHOdph6Of-7f_1LeC_zYlNJaMeS5ctn6xTAeiM,1437
129
129
  chellow/templates/fake_batch_updater.html,sha256=aRQbxtNUlIzxwgSUy2pr-Km5NbhZkse4WSBtlqFIJMg,1885
130
130
  chellow/templates/general_import.html,sha256=9ezzieDjaPBZ0nUJkMkzoDxWVzYtr4D-Dr2UCA5xV8U,1370
131
- chellow/templates/general_imports.html,sha256=9sYN7FdzfxFypAUbUJ4VbhU3WhJrjArtqneohgX1hGE,13171
131
+ chellow/templates/general_imports.html,sha256=-uQRJBtpwZHODcWM1JuECJ_H_AHsu8frtwEFQ6s_7Sk,13690
132
132
  chellow/templates/home.html,sha256=EZbvIvNw0RiuIlaUTOojYSZMTd3VMbTkulABgTB_lAc,5732
133
133
  chellow/templates/input_date.html,sha256=rpgB5n0LfN8Y5djN_ZiuSxqdskxzCoKrEqI7hyJkVQo,1248
134
134
  chellow/templates/local_report.html,sha256=pV7_0QwyQ-D3OS9LXrly5pq3qprZnwTCoq6vCnMTkS4,1332
@@ -348,7 +348,7 @@ chellow/templates/g/batches.html,sha256=T6_2ndBfIYyzHrZzwaELYGCcvdFvsLFmn3zSQENn
348
348
  chellow/templates/g/bill.html,sha256=S8moZ06CDl4_nQQgqyy4mdkyhfvgoQJGZS8ppsluT_E,3455
349
349
  chellow/templates/g/bill_add.html,sha256=sDSpUgEbdalDsea1Ma5lgVRgtbFf0bZ042jUdOFeDDk,1674
350
350
  chellow/templates/g/bill_edit.html,sha256=ynfUR_lZXLgTK3T0x9GjzAHahuR823ykMpjCWrY8ot8,2754
351
- chellow/templates/g/bill_import.html,sha256=gns_IbE7eynbbchydzLtuJ3SgJU2VXlr5211aqiRhe8,4630
351
+ chellow/templates/g/bill_import.html,sha256=IhzABz_cb4r_pnYhfhDThQUpv-06oxsNC3Ov_n3Brl0,4682
352
352
  chellow/templates/g/bill_imports.html,sha256=AHC0l0Wkr1RZ9fdGWTqihOEcn8lTZ63Uh9BHqPxfRCU,3157
353
353
  chellow/templates/g/dn.html,sha256=ttEdvFANFUCBV8e9tVrZy35-tzsC9dU-biZhAPxE2Bw,481
354
354
  chellow/templates/g/dns.html,sha256=RuxXvQ9eHs6B7nVGHtTbW8pdmSAaMbQw2f_BwiLZptM,403
@@ -385,6 +385,6 @@ chellow/templates/g/supply_note_edit.html,sha256=b8mB6_ucBwoljp03iy6AgVaZUhGw3-1
385
385
  chellow/templates/g/supply_notes.html,sha256=6epNmZ3NKdXZz27fvmRUGeffg_oc1kmwuBeyRzQe3Rg,854
386
386
  chellow/templates/g/unit.html,sha256=KouNVU0-i84afANkLQ_heJ0uDfJ9H5A05PuLqb8iCN8,438
387
387
  chellow/templates/g/units.html,sha256=p5Nd-lAIboKPEOO6N451hx1bcKxMg4BDODnZ-43MmJc,441
388
- chellow-1751036864.0.0.dist-info/METADATA,sha256=Ibv1Kc4XId9-HTuNeU9f1P-gSNH-_BtFhxHeAjwCmEk,12238
389
- chellow-1751036864.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
390
- chellow-1751036864.0.0.dist-info/RECORD,,
388
+ chellow-1751477752.0.0.dist-info/METADATA,sha256=SMC0kIII5STfrFFJtcp-1ItxYWQwx9OunE-nbBb3WNQ,12238
389
+ chellow-1751477752.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
390
+ chellow-1751477752.0.0.dist-info/RECORD,,