## Finance Services Notes

- `IncomeExpenseService` materializes ledger rows for system events (currently purchase income).
- Purchase ingestion is idempotent via `source + source_id + type` unique key and `updateOrCreate`.
- `TeacherSalaryExpenseGenerator` is an extension hook for future salary batch generation.
- Planned salary rows should use:
  - `source = salary`
  - `type = teacher_salary`
  - `direction = expense`
- Future phase can add a dedicated salary batch table and link entries through `source_id`.

