Fees¶
Fee structures are assigned to students, payments are collected at the desk or online, and every payment gets a printable receipt.
Money model¶
- Amounts are integer paise everywhere.
- Charged = assigned structure lines − discount + unwaived fines.
- Outstanding = charged − completed payments + approved refunds.
- A cancelled payment is void. An approved refund reduces revenue but not what the drawer received.
Collecting¶
Staff record desk payments (cash, UPI, card, cheque) against a student. Learners and guardians can pay dues online from the portal.
Online payments go to the institution¶
Each institution connects its own Razorpay account in Fees → Settings (fees managers only). Money settles into the institution's bank account. Kwilo is never in the funds flow, and ERP payments can't fall back to Kwilo's own B2C keys.
- The key secret is encrypted at rest (AES-256-GCM) and never returned, logged or written to audit.
- If an institution hasn't connected Razorpay, the portal says: "Online payments are not set up for your school. Pay at the school office."
Receipts¶
Every desk and online payment has a receipt. Staff and payers see the same document: letterhead from the institution record, receipt number and date, student and admission number, the structure paid towards, mode and reference, amount in figures and in Indian-system words ("Rupees Thirty Thousand Only"), who received it, and a CANCELLED watermark when voided. Printing uses the browser, so Save as PDF works everywhere.
A part payment can be split across fee heads at the desk, and the receipt then lists each head paid (see splitting a payment by fee head).
Reports and overview¶
In build. A report builder over collections and dues, filterable by period, mode, cohort, structure and head, with CSV and PDF export, plus an overview dashboard:
- KPIs: collected today, collected this month, outstanding, collection efficiency, fully paid / partial / unpaid counts
- Charts: collection trend, payment status, collection by mode, outstanding by cohort, ageing (0-30, 31-60, 61-90, 90+ days)
Reports key off paid_on, the date money was received, not when the row was keyed in. Head-level figures are apportioned from lump-sum payments and labelled as such. The dimension list only offers what the tenant has data for, so an engineering college never sees an empty Class filter.
Where it lives¶
- Web:
apps/web/src/erp/pages/ErpFeesPage,ErpFeeReceiptPage,ErpStudentFeesCard - Backend:
apps/backend/src/erp/fees/,apps/backend/src/erp/portal/