docs(shared): record the grouped-payment allocation
ci / lint-test (push) Successful in 49s

Sonu's two "transfer" payments are split by scope, Europe first and the
remainder to household, chronologically so each settles what was outstanding
when it was made. Both Europe tabs now read $0.00.

No schema change was needed and that is the point worth writing down:
split_payments has no unique constraint on linked_transaction_id, so one bank
transfer carries one row per scope and the rows re-add to the transfer --
verified, 4111 sums to $3,779.33 and 4121 to $4,794.06.

Her overall balance is unchanged at $5,428.08. Allocation moves money between
tabs, never between people; that invariance is the check to repeat on any
future re-allocation.
This commit is contained in:
2026-07-28 13:02:56 +10:00
parent 4fc8eeac95
commit 3b9d302ce2
+21 -9
View File
@@ -203,15 +203,7 @@ fortnight of principal into spend, the error migration 0014 exists to prevent.
marks Molina's money in all six known cases, but it is a description match on marks Molina's money in all six known cases, but it is a description match on
a free-text field. Acceptable as a *suggestion* requiring confirmation, not a free-text field. Acceptable as a *suggestion* requiring confirmation, not
as an automatic rule. as an automatic rule.
3. **Two unattributable Sonu payments.** #3 ($3,779.33, 12 Apr) and #8 3. **The solo leg.** A Qantas booking on 23 Apr (txn 2849, $1,366.40) is the
($4,794.06, 16 May) are narrated only as "transfer", and payments are made
grouped — one transfer can cover a trip and the household tab together. That
is already expressible: `split_payments` has no unique constraint on
`linked_transaction_id`, so one bank transfer can carry several rows, each
with its own `trip_id`. What is missing is the breakdown. Both currently sit
whole on the household tab; splitting them moves money between tabs without
changing her overall balance.
4. **The solo leg.** A Qantas booking on 23 Apr (txn 2849, $1,366.40) is the
flight to Bangkok that begins a solo leg, and the Singapore spending flight to Bangkok that begins a solo leg, and the Singapore spending
($2,242.05, 40 rows, to 9 May) is solo — not shared. It has no trip record. ($2,242.05, 40 rows, to 9 May) is solo — not shared. It has no trip record.
Worth one if trip *cost* is wanted for it; nothing about sharing depends on Worth one if trip *cost* is wanted for it; nothing about sharing depends on
@@ -224,3 +216,23 @@ fortnight of principal into spend, the error migration 0014 exists to prevent.
invisible to trip analytics. Includes one advance booking on 17 Mar invisible to trip analytics. Includes one advance booking on 17 Mar
(Ticketmaster Nanterre) and the 12 Apr handover-day rows, which were already (Ticketmaster Nanterre) and the 12 Apr handover-day rows, which were already
held out of Europe 2026. held out of Europe 2026.
- **Grouped payments, split by scope.** Payments are made grouped — one transfer
covers several tabs — and that needs no schema change, because
`split_payments` has no unique constraint on `linked_transaction_id`. So one
bank transfer carries one row per scope, and the rows re-add to the transfer.
Sonu's two "transfer" payments were allocated Europe-first, remainder to
household, chronologically so each settles what was outstanding when it was
made:
| Transfer | Scope | Amount |
|---|---|---:|
| $3,779.33, 12 Apr (txn 4111) | Europe 2026 | 1,084.61 |
| | Europe — Sonu + Sunny | 2,694.72 |
| $4,794.06, 16 May (txn 4121) | Europe — Sonu + Sunny | 1,145.52 |
| | household | 3,648.54 |
Both Europe tabs now read $0.00 and her overall balance is unchanged at
$5,428.08 — allocation moves money between tabs, never between people. That
invariance is the check worth repeating on any future re-allocation.