# Prototype verification · Refunds & client credit

Date: 17 September 2026. Owning discovery issue: [ODI-1438](https://linear.app/odia/issue/ODI-1438/define-customer-cancellations-credit-notes-and-refunds).

Review site: https://odia-refunds-client-credit-prototype.pages.dev/

## Scope and review order

1. Record a refund already returned outside Odia, from its paid client Invoice.
2. Create a credit note from that Invoice, owned by its contact in the same currency.
3. Apply some or all of the available credit on a later Invoice.
4. Inspect corrections, cancellation, failures, permissions and financial effects after the three main flows.

The 40 screens are review states, not 40 new product pages. Six review groups organize the three main actions and their supporting states. This is an isolated interactive simulation, not an implementation plan or an approved financial specification.

## Verification

| Check | Result |
|---|---|
| `node verify-model.mjs` | Exit 0. 14 behavioral checks, including source totals, retained costs/commission, single adjustment, partial use, reversal, ownership/currency, caps and dated reporting. |
| `node verify-source.mjs` | Exit 0. 40 states, five notes each, repository anchors, required vocabulary, local assets and no production integration. |
| `node verify-prototype.mjs --screenshots` | Exit 0. 15 browser checks. No page or console errors. Final run: 2026-09-17T13:00:36.010Z. |
| Desktop | All 40 states at 1680 × 1120 CSS pixels, device scale factor 2. |
| 900px review | All 40 states captured and checked for document overflow. |
| Phone | Nine key states at 390 × 844 CSS pixels, device scale factor 2. |
| High-resolution exports | 40 clean app captures, each 3256 pixels wide; downloadable ZIP. |
| Visual inspection | All 40 clean captures inspected in grouped sheets, with full-size checks of form, contact, Invoice, record, conflict and Financials families. Representative desktop/900px/phone views inspected. |
| Repository | `git diff --check` passed. Unrelated Journey email planning edits preserved. |

Browser behaviors cover connected create/apply/remove flows, amount validation, exact-once simulated saves, error/retry with inputs retained, cancellation restoring credit, changed balance, multiple notes, protected voiding, financial permissions, matching contact/currency, correct Invoice breadcrumbs, filtered CSV export, selector/reset/URL state and keyboard focus.

## Corrections made during review

- Restored current seven-lens Financials order, sales in the Journey header, and contact metrics/tab composition from source.
- Kept original Invoice/payment values while showing adjustments separately.
- Prevented prospective balance previews from concealing invalid credit amounts.
- Kept each credit note's history and applications scoped to that note.
- Separated September credit issue dates from February applications in monthly reporting.
- Made CSV exports match the visible record filters.
- Corrected receiving-Invoice breadcrumbs across recovery states and record-specific detail breadcrumbs.
- Kept visible interactive focus while removing the accidental outline around a programmatically focused dialog title.

## Five-gate self-audit

Scores apply to the proposed default-theme prototype and its stated scope. They are an author self-audit, not stakeholder acceptance or live-app visual regression proof. The source inventory documents the reconstruction and its limits. Overall is the minimum gate, never an average.

| State | Fidelity | Pain point | Mental model | Data | Completeness | Overall | Evidence |
|---|---:|---:|---:|---:|---:|---:|---|
| journey-baseline | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-journey-baseline.png) · [900px](screenshots/review-900-journey-baseline.png) · [Clean PNG](screenshots/screen-journey-baseline.png) |
| invoice-paid | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-invoice-paid.png) · [900px](screenshots/review-900-invoice-paid.png) · [Clean PNG](screenshots/screen-invoice-paid.png) |
| refund-form | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-form.png) · [900px](screenshots/review-900-refund-form.png) · [Clean PNG](screenshots/screen-refund-form.png) |
| refund-full | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-full.png) · [900px](screenshots/review-900-refund-full.png) · [Clean PNG](screenshots/screen-refund-full.png) |
| refund-saving | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-saving.png) · [900px](screenshots/review-900-refund-saving.png) · [Clean PNG](screenshots/screen-refund-saving.png) |
| refund-error | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-error.png) · [900px](screenshots/review-900-refund-error.png) · [Clean PNG](screenshots/screen-refund-error.png) |
| refund-recorded | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-recorded.png) · [900px](screenshots/review-900-refund-recorded.png) · [Clean PNG](screenshots/screen-refund-recorded.png) |
| refund-detail | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-detail.png) · [900px](screenshots/review-900-refund-detail.png) · [Clean PNG](screenshots/screen-refund-detail.png) |
| credit-form | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-form.png) · [900px](screenshots/review-900-credit-form.png) · [Clean PNG](screenshots/screen-credit-form.png) |
| credit-created | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-created.png) · [900px](screenshots/review-900-credit-created.png) · [Clean PNG](screenshots/screen-credit-created.png) |
| contact-credits | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-contact-credits.png) · [900px](screenshots/review-900-contact-credits.png) · [Clean PNG](screenshots/screen-contact-credits.png) |
| contact-multiple | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-contact-multiple.png) · [900px](screenshots/review-900-contact-multiple.png) · [Clean PNG](screenshots/screen-contact-multiple.png) |
| contact-empty | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-contact-empty.png) · [900px](screenshots/review-900-contact-empty.png) · [Clean PNG](screenshots/screen-contact-empty.png) |
| credit-detail | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-detail.png) · [900px](screenshots/review-900-credit-detail.png) · [Clean PNG](screenshots/screen-credit-detail.png) |
| credit-part-used | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-part-used.png) · [900px](screenshots/review-900-credit-part-used.png) · [Clean PNG](screenshots/screen-credit-part-used.png) |
| credit-used | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-used.png) · [900px](screenshots/review-900-credit-used.png) · [Clean PNG](screenshots/screen-credit-used.png) |
| invoice-credit-available | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-invoice-credit-available.png) · [900px](screenshots/review-900-invoice-credit-available.png) · [Clean PNG](screenshots/screen-invoice-credit-available.png) |
| apply-credit | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-apply-credit.png) · [900px](screenshots/review-900-apply-credit.png) · [Clean PNG](screenshots/screen-apply-credit.png) |
| apply-multiple | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-apply-multiple.png) · [900px](screenshots/review-900-apply-multiple.png) · [Clean PNG](screenshots/screen-apply-multiple.png) |
| apply-partial | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-apply-partial.png) · [900px](screenshots/review-900-apply-partial.png) · [Clean PNG](screenshots/screen-apply-partial.png) |
| apply-saving | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-apply-saving.png) · [900px](screenshots/review-900-apply-saving.png) · [Clean PNG](screenshots/screen-apply-saving.png) |
| invoice-credit-applied | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-invoice-credit-applied.png) · [900px](screenshots/review-900-invoice-credit-applied.png) · [Clean PNG](screenshots/screen-invoice-credit-applied.png) |
| invoice-credit-covered | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-invoice-credit-covered.png) · [900px](screenshots/review-900-invoice-credit-covered.png) · [Clean PNG](screenshots/screen-invoice-credit-covered.png) |
| remove-credit | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-remove-credit.png) · [900px](screenshots/review-900-remove-credit.png) · [Clean PNG](screenshots/screen-remove-credit.png) |
| credit-restored | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-restored.png) · [900px](screenshots/review-900-credit-restored.png) · [Clean PNG](screenshots/screen-credit-restored.png) |
| cancel-invoice | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-cancel-invoice.png) · [900px](screenshots/review-900-cancel-invoice.png) · [Clean PNG](screenshots/screen-cancel-invoice.png) |
| invoice-cancelled | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-invoice-cancelled.png) · [900px](screenshots/review-900-invoice-cancelled.png) · [Clean PNG](screenshots/screen-invoice-cancelled.png) |
| apply-error | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-apply-error.png) · [900px](screenshots/review-900-apply-error.png) · [Clean PNG](screenshots/screen-apply-error.png) |
| credit-conflict | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-conflict.png) · [900px](screenshots/review-900-credit-conflict.png) · [Clean PNG](screenshots/screen-credit-conflict.png) |
| credit-wrong-currency | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-wrong-currency.png) · [900px](screenshots/review-900-credit-wrong-currency.png) · [Clean PNG](screenshots/screen-credit-wrong-currency.png) |
| credit-wrong-contact | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-wrong-contact.png) · [900px](screenshots/review-900-credit-wrong-contact.png) · [Clean PNG](screenshots/screen-credit-wrong-contact.png) |
| void-credit | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-void-credit.png) · [900px](screenshots/review-900-void-credit.png) · [Clean PNG](screenshots/screen-void-credit.png) |
| credit-voided | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-credit-voided.png) · [900px](screenshots/review-900-credit-voided.png) · [Clean PNG](screenshots/screen-credit-voided.png) |
| void-blocked | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-void-blocked.png) · [900px](screenshots/review-900-void-blocked.png) · [Clean PNG](screenshots/screen-void-blocked.png) |
| void-refund | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-void-refund.png) · [900px](screenshots/review-900-void-refund.png) · [Clean PNG](screenshots/screen-void-refund.png) |
| refund-voided | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-refund-voided.png) · [900px](screenshots/review-900-refund-voided.png) · [Clean PNG](screenshots/screen-refund-voided.png) |
| permission-read-only | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-permission-read-only.png) · [900px](screenshots/review-900-permission-read-only.png) · [Clean PNG](screenshots/screen-permission-read-only.png) |
| financials-adjusted | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-financials-adjusted.png) · [900px](screenshots/review-900-financials-adjusted.png) · [Clean PNG](screenshots/screen-financials-adjusted.png) |
| financials-full-refund | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-financials-full-refund.png) · [900px](screenshots/review-900-financials-full-refund.png) · [Clean PNG](screenshots/screen-financials-full-refund.png) |
| reporting | 5 | 5 | 5 | 5 | 5 | **5** | [Desktop](screenshots/desktop-reporting.png) · [900px](screenshots/review-900-reporting.png) · [Clean PNG](screenshots/screen-reporting.png) |

## Review decisions still open

These are design choices to review on the screens, not defects or implementation commitments:

- Whether the shared “Refund or credit” entry and the Contact “Credit notes” tab are the clearest places for the three main actions.
- Whether “Credit note” and “Available credit” are sufficiently distinct for Odia users. Formal credit-note document content is outside this prototype.
- Whether the proposed financial presentation is clear: reduce the original Journey once; reduce only the later Invoice's amount due; retain Supplier costs and manually managed commissions until separately changed.

The canceled service is intentionally retained in the financial baseline for this billed example. The production design must integrate the existing include/exclude rules without removing its revenue twice. This prototype does not validate every existing cancellation configuration.

## Boundaries

All names, contacts and amounts are fictional. All saves, failures, concurrent changes and financial permissions are simulated in browser memory. The prototype preserves current-source navigation and layout anchors; unrelated existing actions show context feedback. It is not a live app session or a guarantee of every tenant theme. Formal PDF documents, accounting sync, payment execution, unpaid-source corrections, credit transfers, currency conversion, automated cancellation policies, commission automation and credit-to-cash conversion are outside this review.

No production application, database, bank, payment provider or accounting system was changed. No application dev server or production build was run. The only publication is this dedicated static Cloudflare Pages prototype; deployment HTTP status and asset hash evidence are recorded in the handoff.
