Case File — UAT-FIN-2026-01 Prepared for BMV Tunde Limited ← All Modules

UAT Test 1 · Finance & Accounting

Finance & Accounting, tested phase by phase.

BMV's Finance UAT runs across 16 phases, from Chart-of-Accounts setup through a full end-to-end simulation. This page walks through every phase that's been run so far — the real scenario tested, the exact steps taken, what we expected, and what actually happened — and lists what's still ahead with the process we'll follow to test it.

Phases 1–6 tested · Phases 7–16 ongoing
6 / 16
Finance UAT phases run so far
13
Defects found across those phases, all fixed
5 Oct
Target: all 16 phases complete, production-ready

How to read this page

Each phase below is tested against the live, running ERP — not reviewed on paper. We describe the real BMV business scenario simulated, the exact steps carried out, what the system was expected to do, and what it actually did. Where a test turned up something broken, that defect and its fix sit directly under the test that found it. Phases not yet run are listed further down with the process we intend to follow for each, so nothing is a surprise when we get there.

PASS / FIXED & VERIFIED — tested live, working as expected IN PROGRESS — built, live test underway ONGOING — not yet started, process planned below
1

Finance Configuration & Controls

Does the foundation everything else depends on actually exist and work?

CLOSED · PASS
1

Chart of Accounts — do the core control accounts exist?

FIXED & VERIFIED
Scenario
Nearly every later phase — purchase invoices, sales invoices, inventory receipts, opening balances — needs a working Bank, Accounts Receivable, Accounts Payable, and Inventory control account in the Chart of Accounts. If any of these are missing or mislabeled, everything built on top of them breaks.
Steps taken
  1. Searched the live Chart of Accounts for Bank, Receivable, Payable, and Inventory accounts.
  2. Checked for Nigerian/UK-style alternate naming too (Debtors/Creditors, Trade Receivables) in case the gap was just a search/terminology issue rather than a real one.
Expected result
All four control account types present and correctly structured.
Actual result
Confirmed as a genuine gap, not a naming issue.
DEFECT-FIN-001 · CRITICAL · Fixed & Verified
Core control accounts were missing or incorrectly structured — this would have blocked nearly every other phase of Finance UAT. The Chart of Accounts was restructured properly before any further testing continued, and every phase since has built on it successfully.
2

Opening Balances

Can the company's starting financial position be entered, posted, and trusted?

CLOSED · PASS
1

Posting the opening balance entry

FIXED & VERIFIED
Scenario
BMV's starting position — Bank, Cash, Inventory, Fixed Assets, Receivables, Payables and Share Capital — needs to post as one balanced entry before any ongoing transaction can be trusted.
Steps taken
  1. Built the 7-line opening balance entry (₦49,000,000 total) and saved it as a draft.
  2. Attempted to Post it.
Expected result
The entry posts, status moves to Posted, and the Trial Balance reflects it, balanced.
Actual result
Blocked with "Only draft entries can be posted" — even though it genuinely was a draft.
DEFECT · CRITICAL · Fixed & Verified
Root cause: a naming mismatch between the route ({entry}) and the controller's expected parameter ($journalEntry) meant Laravel silently handed every request an empty, blank entry instead of the real one. This wasn't specific to this one entry — nothing could be posted, reversed, approved, rejected, or submitted for approval anywhere in the ERP until this was fixed. Corrected by renaming the route parameter to match the controller. Verified: the entry then posted cleanly, Trial Balance showed ₦49,000,000 = ₦49,000,000, balanced.
2

General Ledger drill-down

PASS
Scenario
Staff need to click into any account and see exactly which entries built its balance, with a correct running total, not just a final number.
Steps taken
Opened the General Ledger for FCMB Bank Naira and checked the opening line, the running balance after each subsequent entry, and that entry references link back to the journal entry itself.
Expected result
Correct opening line, correct running balance line-by-line, clickable references.
Actual result
All mechanics correct. Also surfaced something worth flagging separately (not a failure of this test): the account had gone negative after payments exceeding the opening balance posted with no warning or block — logged and addressed under Phase 3 below, since that's where it actually originates.
3

Manual journal entry — create, draft, post

PASS
Scenario
Day-to-day accounting depends on staff being able to create an ordinary entry, save it as a draft, and post it only when ready — with the draft having no effect on the books.
Steps taken
Created a ₦50,000 test entry, saved as draft, confirmed it did not yet appear in the Trial Balance, then posted it.
Expected result
Draft has no effect; posting updates the books correctly.
Actual result
Office Utilities Expense moved from ₦300,000 to ₦350,000 exactly on posting, and not a moment before.
4

Journal entry reversal

FIXED & VERIFIED
Scenario
Staff need to undo a wrongly-posted entry with a proper reversal — not a silent edit — leaving both the mistake and its correction visible for audit.
Steps taken
Reversed the test entry from Test 3 and checked that both accounts returned to their balances from before that entry.
Expected result
The original entry stays on record, marked "Reversed"; a mirror entry is added; together they net to zero change.
Actual result
Initially failed: a ₦50,000 swing landed in the wrong direction instead of returning to baseline.
DEFECT · CRITICAL · Fixed & Verified
The moment an entry's status changed to "Reversed", its lines dropped out of every balance calculation (Trial Balance, General Ledger) entirely — so only the new mirror entry counted, producing a full swing instead of a net-zero. Fixed in the core balance-calculation logic. Verified: every reversal processed since (including bank-charge and receipt corrections later in testing) has netted to zero correctly.
Also closed out here: the opening entry had posted to five GL control accounts (Bank, Inventory, Fixed Assets, AR, AP) without creating the matching subledger records behind any of them — no opening stock lot, no opening customer balance, no opening vendor balance. Backfilled all three (Inventory, AR, AP) from the opening entry's own lines, so every reconciliation phase from here on starts clean. See Phase 4 for the Inventory side of this in detail.
3

Purchase-to-Pay / Accounts Payable

Can BMV pay a supplier correctly, against the right account, without overdrawing the bank?

CLOSED · PASS
1

Supplier payment posting & AP Aging

FIXED & VERIFIED
Scenario
When BMV pays a supplier against a received goods invoice, the payment needs to debit the correct Accounts Payable sub-account for that commodity (Cocoa, Cashew, etc.) and credit the right bank account — and the payment should be checked against what's actually owed before it posts.
Steps taken
  1. Processed three supplier payments (PV-2026-0001/2/3) against goods-received invoices.
  2. Checked AP Aging and the paying bank account's balance afterward.
Expected result
Each payment posts to the correct per-commodity AP account; AP Aging reflects every payment voucher; the bank account is checked for available funds.
Actual result
Payments posted and were validated against each invoice's own outstanding balance correctly, but two further issues turned up underneath.
DEFECT-AP-01 · HIGH · Fixed & Verified
Every supplier payment posted to Cocoa Vendors AP (21100.1) regardless of the invoice's actual commodity — a Cashew or Soya payment would have silently corrupted the AP subledger by commodity. Fixed to use the same per-commodity account lookup already used correctly for goods receipts.
DEFECT-GL-01 · HIGH · Fixed
Nothing checked whether the paying bank account actually had enough funds before posting — three legitimate, correctly-validated payments (₦33.25M) pushed FCMB Bank Naira to -₦13,250,000 with no warning or block. This is the issue first surfaced during the Phase 2 ledger drill-down. Logged and fixed as an insufficient-funds check on bank payment posting.
4

Inventory → Finance Integration

Does stock on the warehouse floor match stock in the General Ledger?

CLOSED · PASS
1

GL inventory value vs. warehouse stock lots

FIXED & VERIFIED
Scenario
The Inventory value sitting in the General Ledger needs to match actual stock lots in the warehouse — if they disagree, nobody can trust either number.
Steps taken
Compared the GL's Inventory – Cocoa Beans balance against the warehouse's recorded stock lots for the same commodity.
Expected result
GL quantity and warehouse quantity should agree exactly.
Actual result
A 3 MT gap — GL showed more inventory value (₦15,000,000, i.e. 3 MT at ₦5,000,000/MT) than the warehouse had a stock lot for.
DEFECT · HIGH · Fixed & Verified
Traced to the same root cause flagged in Phase 2: the opening balance entry posted ₦15,000,000 straight to the Inventory GL account but never created the matching opening stock lot in the warehouse. Fixed by backfilling the missing 3 MT opening stock lot directly from the opening entry's own figures — no re-posting, no double-counting. GL and warehouse now agree exactly.
5

Order-to-Cash / Accounts Receivable

Can BMV invoice a customer, collect payment, and enforce credit terms correctly?

CLOSED · PASS
1

Customer invoice & payment — core workflow

FIXED & VERIFIED
Scenario
BMV invoices an export customer, the invoice needs to recognize revenue and VAT correctly in the GL, and when the customer pays, that receipt needs to hit the right AR account and clear correctly.
Steps taken
  1. Created a customer invoice (BMV-2026-0008, ₦35,000,000) and checked its GL posting.
  2. Recorded the customer's payment against it and checked the Bank and AR balances afterward.
Expected result
Revenue, VAT, and AR post correctly on the invoice; the payment clears the AR balance and lands in the right bank account; reports reconcile to the GL.
Actual result
Revenue recognizedDr AR ₦37,625,000 / Cr Local Sales ₦35,000,000 / Cr VAT Payable ₦2,625,000 — correct
Customer StatementCorrect balance, after a fix below
Sales ReportBuilt (didn't exist before) — reconciles to GL exactly
Trial BalanceBalanced, ₦124,122,500.00 = ₦124,122,500.00
Customer paymentCorrect after a fix below — Bank and AR both tie out exactly
DEFECT-FIN-07 & FIN-08 · HIGH · Fixed & Verified
Customer Statement had no working page at all (missing route, blank view) and, once fixed, showed the wrong currency label for some customers. Both corrected; found the same missing-route pattern independently on the Cash Flow report and fixed it too.
DEFECT · CRITICAL · Fixed & Verified
A customer payment posted a journal entry that looked balanced but never actually touched Accounts Receivable — the invoice and AR Aging still showed the right balance (they read the invoice's own fields, not the GL), so nothing in the UI hinted anything was wrong; only opening the raw journal entry and checking both lines caught it. This is exactly the kind of defect that would otherwise surface at month-end close or first audit. Fixed in code, and the bad GL entry already posted was corrected live with a reversal plus a proper manual entry. Verified: Bank and AR both tie out exactly to the correct figures afterward.
2

Credit Hold — blocking sales to customers over their limit

PASS
Scenario
A customer (A & B Cocoa) has already exceeded their approved credit limit. Staff should not be able to raise a new sales invoice for them until the account is cleared or the hold is lifted.
Steps taken
  1. Confirmed the customer record was flagged as on Credit Hold.
  2. Opened the New Invoice form and selected that customer.
  3. Filled in the invoice as normal and attempted to save.
Expected result
The system should refuse to create the invoice and explain why, before anything is saved — not a warning staff can click past.
Actual result
Blocked exactly as expected, with the message "A & B Cocoa is on Credit Hold — new sales invoices are blocked..." shown before save. Previously this was only a soft warning shown after the invoice had already been created.
3

Overdue Status — invoices flip to "Overdue" automatically

PASS
Scenario
Once an invoice's due date has passed without payment, it should show as "Overdue" everywhere in the ERP automatically, without anyone manually changing its status.
Steps taken
  1. Ran the scheduled background check that compares every invoice's due date against today's date.
  2. Opened the invoice list immediately after to check the result.
Expected result
Every invoice past its due date should automatically switch to Overdue status.
Actual result
The check reported "Marked 2 invoice(s) overdue", and both invoices (BMV-2026-0001 and BMV-2026-0003) showed the Overdue badge immediately.
DEFECT-FIN-49 · CRITICAL · Fixed & Verified
This logic already existed in the code but nothing ever triggered it — every "Overdue" count across the entire ERP had been silently reading zero since the feature was built. Fixed by adding a scheduled command. Action needed: still needs to be wired into Windows Task Scheduler on the live server to run daily on its own.
4

Realized FX Gain/Loss — payment arrives after the exchange rate moved

PASS
Scenario
BMV invoices an export customer in US Dollars. By the time payment arrives, the Naira/Dollar rate has moved — the books need to recognize that gain or loss correctly, in Naira, without throwing the entry out of balance.
Steps taken
  1. Recorded a payment receipt against a USD invoice at a different exchange rate than the invoice was raised at.
  2. Opened the resulting Journal Entry to inspect how it posted.
Expected result
A separate FX Gain/Loss line posts for the difference, in Naira, and the full entry still balances even though its lines are in two different original currencies.
Actual result
Journal Entry JNL-2026-000052 posted a realized gain of ₦1,505,000 correctly, confirmed balanced in Naira terms by hand.
DEFECT-FIN-44 & FIN-45 · HIGH · Fixed & Verified
Found in this same area: payment receipts weren't routing to the correct Accounts Receivable account, and the exchange rate wasn't always applied correctly on foreign-currency receipts. Both fixed by making receipts reuse the same account-resolution rule invoices already used correctly. Verified via a full Trial Balance report: ₦765,325,000.00 matched $575,000 × 1,331 exactly.
5

Split Receipts — one payment covering two invoices at once

IN PROGRESS
Scenario
In real business, customers rarely pay invoice-by-invoice — one payment often needs to be split across two or more open invoices at once.
Steps taken
Built the ability to record one receipt and allocate portions of it across two open invoices in a single transaction; live test instructions issued to confirm it posts one correctly balanced journal entry.
Expected result
One receipt, split across two invoices, reduces both invoice balances correctly and posts as a single balanced journal entry.
Actual result
Code-complete; the live retest was starting when this report was generated — result not yet confirmed.
6

Unapplied Cash — holding a payment until it's matched to an invoice

NOT YET RETESTED
Scenario
Sometimes a customer pays before BMV has even raised the invoice, or sends more than an invoice's total — that money needs somewhere to sit until it's matched to something specific.
Steps taken
Built the ability to record a receipt without forcing it to match an invoice immediately, plus a dedicated "Unapplied Receipts" screen to apply that balance later.
Expected result
An unapplied receipt is clearly visible on its own list and can be allocated to one or more invoices at any later date, without losing the original receipt record.
Actual result
Built and code-complete; not yet exercised on the live system. Scheduled directly after Test 5 above.
7

Collections & Dunning — reminding customers who are overdue

PASS
Scenario
BMV needs to send a formal payment reminder to overdue customers, reachable by staff across more than one role, not just one admin account.
Steps taken
  1. Checked whether the Collections & Dunning screen was reachable from the sidebar for each relevant staff role.
  2. Attempted to send a dunning reminder notice by email.
Expected result
The menu link appears for every role that needs it, and sending a reminder completes without error.
Actual result
Both now work correctly after the two fixes below.
DEFECT-FIN-47 · MEDIUM · Fixed & Verified
The Collections link only existed in one of three staff sidebars. Added to the other two. (A first attempt at the fix used the wrong web address and caused a page-not-found error live — caught immediately and corrected before anything shipped.)
DEFECT-FIN-48 · HIGH · Fixed & Verified
Sending a dunning notice failed because the email pointed at a template file that didn't exist. Corrected; sending now completes successfully.
6

COGS & Profitability

When BMV sells, does the true cost of the sale post alongside the revenue?

IN PROGRESS
1

Cost of Goods Sold posting on a sale

FIXED & VERIFIED
Scenario
When BMV sells cocoa, the system needs to post the cost side (COGS) automatically alongside the revenue side — otherwise the sale looks profitable on paper with no real cost ever recorded, and gross profit is wrong.
Steps taken
Posted the cost side of a cocoa sale (5,000 KG × ₦5,000/KG = ₦25,000,000) and reviewed the resulting entry and its audit trail.
Expected result
COGS posts correctly to the GL and is logged for audit.
Actual result
Posted correctly once the two defects below were fixed; without the fix, a failure here would have been completely silent.
DEFECT-FIN-09 · CRITICAL · Fixed
The automatic COGS-posting method had a silent-failure catch block — if posting failed for any reason, nothing told anyone. A real sale could complete with no cost ever recorded and no error raised. Fixed so a COGS-posting failure surfaces instead of disappearing.
DEFECT-FIN-10 · HIGH · Fixed
The same method wasn't writing the audit-trail record it was supposed to for every COGS posting. Fixed alongside FIN-09.
Still open for this phase: the manual COGS test above confirms the posting logic itself is correct. What hasn't been exercised yet is the automatic trigger — COGS firing on its own the moment a real export shipment goes in-transit. That fires from the Shipment workflow, so it's being tested as part of Operations UAT rather than repeated here, and this phase stays marked In Progress until that's confirmed live.
02

Phases 7–16 — ongoing

Not yet started. Each will be tested live against the running ERP the same way Phases 1–6 were — a real BMV scenario, exact steps, expected vs. actual — and this page will be updated as each closes.


Phase 7
Operating Expenses

Recording day-to-day expenses (fuel, utilities, office costs) and confirming they hit the Profit & Loss correctly.

Process: post a sample expense against Bank, verify the P&L moves by exactly that amount and nothing else.

Phase 8
Accruals & Prepayments

Expenses incurred but not yet paid, and payments made in advance of the period they cover, recognized in the right period.

Process: post an accrual and a prepayment, confirm each lands in the correct accounting period and reverses/releases correctly afterward.

Phase 9
Bank & Cash Management

Bank reconciliation against a statement, and whether the Bank Account dashboard reflects real postings.

Process: run a bank reconciliation to a known statement balance and confirm Difference = ₦0. Already known going in: the Bank Account dashboard doesn't yet sync from real GL postings (flagged during Phase 2/3) — this phase will confirm whether the dedicated Reconciliation module has the same gap or works independently, and close it out either way.

Phase 10
Tax

VAT/WHT calculation on invoices and bills, and correct posting to tax payable/receivable accounts.

Process: raise a transaction with tax applied, verify the tax line posts to the right account and appears correctly on the VAT/WHT report.

Phase 11
Foreign Currency / FX

Broader FX handling beyond the receipt-level gain/loss already verified in Phase 5 — multi-currency balances and period-end revaluation.

Process: revalue an open foreign-currency balance at a new rate and confirm the unrealized gain/loss posts correctly without affecting realized figures already booked.

Phase 12
Fixed Assets & Depreciation

Whether the opening ₦5,000,000 office equipment asset has a proper fixed-asset register entry, and whether depreciation runs correctly against it.

Process: confirm/create the register entry, run a depreciation period, verify the expense and accumulated depreciation post correctly.

Phase 13
Journals, Controls & Audit Trail

The control tests that run underneath every phase above, tested directly and deliberately: duplicate transactions, closed-period protection, invalid transactions, permissions/security, and the audit trail itself.

Process: deliberately attempt a duplicate entry, a post into a closed period, an invalid/unbalanced entry, and an action outside a role's permissions — each should be blocked, and the audit trail should show who did what, when.

Phase 14
Month-End Close

Running an actual period close — locking the period, confirming nothing can post into it afterward.

Process: close a test period, attempt to post into it afterward (should be blocked — this is also where closed-period protection from Phase 13 gets its real exercise), confirm opening balances roll forward correctly into the next period.

Phase 15
Financial Reports & Reconciliation

Balance Sheet, P&L, Cash Flow, and the full set of module-to-GL reconciliations.

Process: run each report and reconcile AP, AR, Inventory, Bank, Tax, and Fixed Assets against the GL individually, plus trace a sample of source documents through to their accounting entries. Already known going in: the Balance Sheet is missing Retained Earnings/Current Year Earnings, so Total Assets won't yet equal Total Liabilities + Equity by exactly the period's Net Income — flagged during earlier testing, to be fixed and verified as part of this phase.

Phase 16
Full Agro-Company Simulation

One end-to-end run through a realistic BMV business cycle — purchase, receive, process, sell, export, collect, close — touching every module at once, the way the business actually operates.

Process: a single simulated scenario from purchase order through to month-end close, checked against every control above in sequence rather than in isolation.

Duplicate transactionsTested in Phase 13
Closed-period protectionTested in Phases 13 & 14
Invalid transactionsTested in Phase 13
Permissions / securityTested in Phase 13
Audit trailTested in Phase 13
AP / AR / Inventory / Bank / Tax / Fixed Asset ↔ GL reconciliationTested in Phase 15
Source-document → accounting-document traceabilityTested in Phase 15