A dependency-ordered walkthrough for the QA tester. Read the phase intros to understand why each step comes where it does. Follow the numbered test steps inside each phase to verify the entire integration.
Testing the GL engine is like testing a factory: you can't test the quality check at the end without first putting raw materials through the machine. That's why we test in phases that mirror the real accounting cycle โ input โ controls โ close โ reporting. Skipping ahead usually means retesting later.
Before touching a single test case, the tester needs a working environment. Don't skip this โ half the "bugs" QA teams file in GL systems are actually missing prereqs.
Navigate to https://dev.missio.io and log in as Admin for City Schools of Decatur (company ID 105).
Visit /account/chart-of-accounts. You should see the Decatur School District chart โ accounts like 1115 - Operating Account - DSD, 5213 - Salary - DSD, etc. If the list is empty or you see a red error banner, Frappe is not connected โ stop and escalate.
The AR test cases need parents + students seeded. Run on the server:
php artisan db:seed --class=ArCsdDemoSeeder
After this: visit /account/ar-customers. You should see Karoline Durbin, Melissa Bass, Thomas Decker, Raymond & Sue Leonard, and others.
Visit /account/finance/other/payroll-gl-mapping. You should see at least 21 active mappings (pto_expense, pto_liability, salary_expense, tax_expense, benefit_expense, etc.). If the table is empty, seeds didn't run โ escalate.
Start with the core general ledger operations, before touching any business module. If these fail, nothing else will work.
/account/period-close, pick October 2025 โ click Close โ supply reason.Now test the modules that feed data into the GL. Each of these represents a real CSD business event: a parent pays tuition, a bus gets bought, an employee gets paid.
/account/ar-invoices/cash-receipt/create, record a $150 miscellaneous receipt with no invoice linkage.Now that data is flowing, test the guards that prevent bad data from flowing in.
/account/journal-entries, use the Basis filter dropdown โ select GAAP (full accrual)..env file, add: GL_JE_APPROVAL_THRESHOLD=0 and GL_JE_ALLOW_SELF_APPROVAL=false. Then run php artisan config:clear. This makes every non-template JE require approval and prevents submitters from approving their own work.DRAFT approval badge and a yellow Submit button.DRAFT to amber PENDING. A green Approve button appears (visible because admin has approval rights).APPROVED.spawned_from_template_id is set.test.employee@local, password password123, role = Employee (NOT Admin). Save.test.employee@local.NOT GRANTED to green GRANTED. Button text changes to "Revoke Approver Role" (red).Close out the month to lock the books, then test the year-end close.
php artisan tinker --execute='(new App\Services\Gl\YearEndCloseService(105))->postClosingEntry(2025, "6212 - Fund Balance - DSD", null)'/account/financial-reports/trial-balance for the new FY.The pay-off. After closing, generate the statements and verify they reflect all the activity from phases 1โ4.
?subtotals_only=1 to the URL and refresh.Quick references for the most common questions that come up during testing.
/account/journal-entries โ sorted by date descending by default.
Open the JE detail page and look at the Frappe Voucher field. If empty, the local Missio JE was created but Frappe posting failed. The error is usually in the Laravel log (/storage/logs/laravel.log). On the specific subsystem, check that system's "failed" panel:
Payroll: /account/finance/other/payroll-gl-mapping (Failed Mirrors panel)
Open /account/docs/gl-test-checklist.html and find the case ID. Each case has a green PASSED banner with (1) what's built, (2) step-by-step test instructions, (3) expected result.
You generally DON'T need to. GL testing is additive โ each JE adds to the ledger without touching prior ones. If you truly need to reset, ask for a database refresh from the dev team.
Two options: (1) increase the budget allocation at /account/budgets, or (2) temporarily set GL_BUDGET_ENFORCEMENT_MODE=off in the server's .env file and run php artisan config:clear. Remember to restore it before finishing testing.
Go to /account/period-close and click Reopen on the relevant month. This is expected behavior โ the guard is working correctly. In production, reopening requires a documented reason.
Compare the Trial Balance total on /account/financial-reports/trial-balance with the totals in Frappe's own Trial Balance. They should match to the penny. If they don't, there's a skew โ escalate with the specific JE number.
Log it against the specific test case ID (e.g. "PAY-044: bus monitor allocation posts to wrong account"). Include: (1) the exact URL you were on, (2) the input you provided, (3) the actual vs expected result, (4) a screenshot if possible. Set the case to Fail in the checklist.
If all 117 test cases come back green, the GL integration is certified working against the current codebase. Export your results from the checklist page (Export Results as JSON button at the bottom) and archive them with the date.
If cases come back yellow (pending) or red (failing), go back to the specific phase, re-test just that case with the detailed instructions on gl-test-checklist.html, and escalate to the dev team with the case ID + the actual vs expected outcomes.