ECMS Finance & VietQR
Tuition, invoices, wallets and subscription plans, with VietQR payment codes and a reconciliation webhook that refuses to run unsigned
Overview
Tuition is where an education centre actually loses money, and almost always in the same way: a parent transfers, nobody matches the transfer to the student, and three weeks later the class list and the bank statement disagree.
The finance module carries fee schedules, invoices, per-student wallets, transactions and subscription plans, and closes the loop with VietQR - a payment code carries the reference that identifies the invoice, and the bank's webhook writes the payment back against it automatically.
The webhook is the part worth being strict about: without VIETQR_WEBHOOK_SECRET configured it is rejected outright rather than processed blindly, because a payment endpoint that anyone can POST to is a way to mark invoices paid for free.