Flow: service billing (transport, hostel, meals)
Transport, boarding and catering are separate apps, but a family never gets three bills. Each service posts its charge onto the student's one fee assignment through a bridge — with no double entry.
Mechanics per service
| Service | Source object | Method | Fee category | Amount field |
|---|---|---|---|---|
| Transport | ep.transport.assignment | _create_fee_line() | ep_fees.fee_cat_transport | effective_fee |
| Hostel | ep.hostel.allocation | _create_fee_lines() | boarding category | room / term fee |
| Meals | ep.meals.subscription | _create_fee_line() | meals category | plan price |
| Library | overdue loan | fine posting | fines | fine amount |
Recompute, never duplicate
Each bridge calls _compute_totals() and _compute_paid() on the ep.fee.assignment after writing the line, so the invoice and the family balance are instantly correct. Removing the service (_remove_fee_line()) unlinks the line and recomputes — no orphan charges.
Edge cases
- Staff who commute:
staff_commuterassignments are skipped — staff ride free, no fee line. - Mid-year join: if there is no active
ep.fee.assignmentyet, the bridge posts a note and creates the line at enrolment instead. - Pausing a service: pausing the assignment removes the line; the family stops being billed from that point.
No manual entry — Never type transport/hostel/meal charges into Fees by hand — the bridge owns them, so the invoice is always complete and reversible.
Was this page helpful?

