mirror of
https://github.com/escalante29/WealthySmart.git
synced 2026-07-17 11:08:47 +02:00
Constraint and query pass: FK delete rules, grouped queries, tiebreakers
- FK rules via migration 7884505b16b3 (verified on dev with a rolled- back probe): transactions/recurring items SET NULL on category delete (this also fixes the 500 that DELETE /categories raised for in-use categories), water readings CASCADE with their receipt. Models declare ondelete to stay in sync. (ARCH-09, BE-11) - compute_actuals_by_source: 3 grouped queries replace 10 single- aggregate round-trips; behavior pinned by the existing cycle suite. (BE-21) - compute_cc_by_category prefetches category names (ARCH-15); agent pension latest-per-fund resolved in SQL (BE-04); municipal water consumption batched into one grouped query (BE-05). - Deterministic pagination: date DESC, id DESC on all transaction listings. (ARCH-12) - New agent-tool tests (session binding, JSON-safe output, batched queries): 64 tests green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -266,16 +266,27 @@ def get_pension_snapshots(
|
||||
) -> list[dict]:
|
||||
"""Pension fund snapshots. Each snapshot covers a period with balances,
|
||||
contributions, returns, fees and the ending balance (saldo_final)."""
|
||||
q = select(PensionSnapshot).order_by(col(PensionSnapshot.period_end).desc())
|
||||
if latest_only:
|
||||
# Latest snapshot per fund resolved in SQL instead of scanning all rows
|
||||
latest = (
|
||||
select(
|
||||
PensionSnapshot.fund.label("fund"),
|
||||
func.max(PensionSnapshot.period_end).label("period_end"),
|
||||
)
|
||||
.group_by(PensionSnapshot.fund)
|
||||
.subquery()
|
||||
)
|
||||
q = select(PensionSnapshot).join(
|
||||
latest,
|
||||
(PensionSnapshot.fund == latest.c.fund)
|
||||
& (PensionSnapshot.period_end == latest.c.period_end),
|
||||
)
|
||||
else:
|
||||
q = select(PensionSnapshot)
|
||||
q = q.order_by(col(PensionSnapshot.period_end).desc())
|
||||
if fund:
|
||||
q = q.where(PensionSnapshot.fund == fund)
|
||||
rows = _s().exec(q).all()
|
||||
if latest_only:
|
||||
seen: dict[str, PensionSnapshot] = {}
|
||||
for r in rows:
|
||||
if r.fund.value not in seen:
|
||||
seen[r.fund.value] = r
|
||||
rows = list(seen.values())
|
||||
return [
|
||||
{
|
||||
"fund": r.fund.value,
|
||||
@@ -322,11 +333,21 @@ def get_municipal_receipts(
|
||||
q = q.where(MunicipalReceipt.account == account)
|
||||
q = q.limit(limit)
|
||||
rows = _s().exec(q).all()
|
||||
# One grouped query for all receipts instead of one per receipt
|
||||
consumption: dict[int, float] = {}
|
||||
ids = [r.id for r in rows if r.id is not None]
|
||||
if ids:
|
||||
grouped = _s().exec(
|
||||
select(
|
||||
WaterMeterReading.receipt_id,
|
||||
func.sum(WaterMeterReading.consumption_m3),
|
||||
)
|
||||
.where(col(WaterMeterReading.receipt_id).in_(ids))
|
||||
.group_by(WaterMeterReading.receipt_id)
|
||||
).all()
|
||||
consumption = {rid: float(total) for rid, total in grouped}
|
||||
out: list[dict] = []
|
||||
for r in rows:
|
||||
readings = _s().exec(
|
||||
select(WaterMeterReading).where(WaterMeterReading.receipt_id == r.id)
|
||||
).all()
|
||||
out.append(
|
||||
{
|
||||
"id": r.id,
|
||||
@@ -338,7 +359,7 @@ def get_municipal_receipts(
|
||||
"interests": float(r.interests),
|
||||
"iva": float(r.iva),
|
||||
"total": float(r.total),
|
||||
"water_consumption_m3": float(sum(w.consumption_m3 for w in readings)),
|
||||
"water_consumption_m3": consumption.get(r.id, 0.0),
|
||||
}
|
||||
)
|
||||
return out
|
||||
|
||||
Reference in New Issue
Block a user