Skip to content

URS-038 · Bill-Only status fields visible on main BO page

Title: Bill-Only status fields visible on main BO page Date: 2026-04-23T03:41:40.950Z Duration: 76.0s Overall Status: ✅ PASS

The system shall support tagging and visibility of the processing status of Bill-Only Orders

Source: User_Requirement_Specifications_ZuriMED_DeviceFlow.xlsx — the run below proves the system meets this requirement.

Status: ✅ PASS

Each step below corresponds to one Playwright test that ran sequentially. Screenshots and video recordings provide visual evidence of the UI behaviour.

1. Step 1: Main Bill-Only page loads — ✅ PASS

Section titled “1. Step 1: Main Bill-Only page loads — ✅ PASS”

What this step proves:

Logs in as alex.admin@zurimed.com and navigates to /billing with the “All Orders” filter active. Confirms the page heading “Bill Only” is visible and all four seeded Bill-Only Orders appear in the table.

Screenshots:

step 01 billing main page

Video recording:


2. Step 2: Status column visible — ✅ PASS

Section titled “2. Step 2: Status column visible — ✅ PASS”

What this step proves:

Asserts a sortable “Status” column header is rendered in the Bill-Only Orders DataTable. The column must be present for any status badge to be associated with a specific order row.

Screenshots:

step 02 status column visible

Video recording:


3. Step 3a: ZBO-2025-001 status badge — ✅ PASS

Section titled “3. Step 3a: ZBO-2025-001 status badge — ✅ PASS”

What this step proves:

Confirms that ZBO-2025-001 (status: draft) displays the “Draft” badge label in its table row. Maps to URS-038 BO-001: enteredInQb=false, invoiced=false.

Screenshots:

step 03 zbo 2025 001 status badge

Video recording:


4. Step 3b: ZBO-2025-002 status badge — ✅ PASS

Section titled “4. Step 3b: ZBO-2025-002 status badge — ✅ PASS”

What this step proves:

Confirms that ZBO-2025-002 (status: submitted) displays the “Submitted” badge label. Maps to URS-038 BO-002: enteredInQb=false, invoiced=false (awaiting QB entry).

Screenshots:

step 03 zbo 2025 002 status badge


5. Step 3c: ZBO-2025-003 status badge — ✅ PASS

Section titled “5. Step 3c: ZBO-2025-003 status badge — ✅ PASS”

What this step proves:

Confirms that ZBO-2025-003 (status: invoice_sent) displays the “Invoice Sent” badge label. Maps to URS-038 BO-003: enteredInQb=true, invoiced=true.

Screenshots:

step 03 zbo 2025 003 status badge


6. Step 3d: ZBO-2025-004 status badge — ✅ PASS

Section titled “6. Step 3d: ZBO-2025-004 status badge — ✅ PASS”

What this step proves:

Confirms that ZBO-2025-004 (status: invoice_voided) displays the “Invoice Voided” badge label. Maps to URS-038 BO-004: enteredInQb=true, invoiced=true (voided edge case).

Screenshots:

step 03 zbo 2025 004 status badge


7. Step 4: Status badges color styling — ✅ PASS

Section titled “7. Step 4: Status badges color styling — ✅ PASS”

What this step proves:

Verifies each status badge renders with the Tailwind color class configured in billingStatusConfig: Draft=bg-gray-100, Submitted=bg-blue-100, Invoice Sent=bg-blue-100, Invoice Voided=bg-red-100. Note: Submitted and Invoice Sent intentionally share the same color class.

Screenshots:

step 04 status badges color styling

Video recording:


8. Step 5a: Filter by Invoice Voided — ✅ PASS

Section titled “8. Step 5a: Filter by Invoice Voided — ✅ PASS”

What this step proves:

Navigates to /billing?filter=invoice_voided and confirms only ZBO-2025-004 is shown. All other seeded orders must be absent from the rendered table, proving the filter correctly narrows the list to one lifecycle stage.

Screenshots:

step 05 filter invoice voided

Video recording:


9. Step 5b: Filter by Submitted — ✅ PASS

Section titled “9. Step 5b: Filter by Submitted — ✅ PASS”

What this step proves:

Navigates to /billing?filter=submitted and confirms only ZBO-2025-002 is shown. All other seeded orders must be absent, proving the filter correctly narrows the list.

Screenshots:

step 05 filter submitted


10. Step 6a: Sort by status (asc) — ✅ PASS

Section titled “10. Step 6a: Sort by status (asc) — ✅ PASS”

What this step proves:

Navigates to /billing?filter=all&sortBy=status&sortOrder=asc and confirms the four seeded BOs appear in alphabetical enum order: draft, invoice_sent, invoice_voided, submitted.

Screenshots:

step 06 sort status asc

Video recording:


11. Step 6b: Sort by status (desc) — ✅ PASS

Section titled “11. Step 6b: Sort by status (desc) — ✅ PASS”

What this step proves:

Navigates to /billing?filter=all&sortBy=status&sortOrder=desc and confirms the four seeded BOs appear in reverse alphabetical enum order, validating bidirectional sort.

Screenshots:

step 06 sort status desc


12. Step 7: Status visible on detail page — ✅ PASS

Section titled “12. Step 7: Status visible on detail page — ✅ PASS”

What this step proves:

Drills into ZBO-2025-003 (Invoice Sent) and confirms the “Invoice Sent” badge label is visible on the BO detail page. The same status badge component used in the list must also render on the detail view.

Screenshots:

step 07 detail page status

Video recording:


13. Step 8: Status persistence — ✅ PASS

Section titled “13. Step 8: Status persistence — ✅ PASS”

What this step proves:

Captures the status badges before and after a navigation-away + hard refresh cycle. Confirms all four badge labels remain unchanged, proving status is persisted in the database and not held only in client-side state.

Screenshots:

step 08 before refresh

step 08 after refresh

Video recording:


14. Step 9: Responsive layout — ✅ PASS

Section titled “14. Step 9: Responsive layout — ✅ PASS”

What this step proves:

Verifies the Status column and badge labels remain visible across two desktop viewport sizes: 1920×1080 (wide) and 1366×768 (narrow). Confirms the column is not hidden or truncated at common desktop resolutions.

Audit events generated by this step:

(Evidence scoped to step execution window: 2026-04-23T03:42:50.705Z → 2026-04-23T03:42:54.861Z)

TimeTypeActionUserOrgPerformed
2026-04-23 03:42:52Zuser_loguser:loginalex.admin@zurimed.comZuriMED

Screenshots:

step 09 1920x1080

step 09 1366x768

Video recording:


The following SQL queries ran against the application database after the Playwright scenarios completed. Each query asserts a specific condition that proves the feature under test persisted its data correctly.

All four seeded Bill-Only Orders have the expected status enum values — ✅ PASS

Section titled “All four seeded Bill-Only Orders have the expected status enum values — ✅ PASS”

Assertion: ZBO-2025-001..004 must exist with statuses ZBO-2025-001=draft, ZBO-2025-002=submitted, ZBO-2025-003=invoice_sent, ZBO-2025-004=invoice_voided

SELECT order_number, status, manufacturer_organization_id
FROM billing_orders
WHERE order_number = ANY($1)
ORDER BY order_number
order_numberstatusmanufacturer_organization_id
ZBO-2025-001drafta1b2c3d4-e5f6-7890-abcd-ef1234567890
ZBO-2025-002submitteda1b2c3d4-e5f6-7890-abcd-ef1234567890
ZBO-2025-003invoice_senta1b2c3d4-e5f6-7890-abcd-ef1234567890
ZBO-2025-004invoice_voideda1b2c3d4-e5f6-7890-abcd-ef1234567890

All four BOs belong to the ZuriMED manufacturer organization — ✅ PASS

Section titled “All four BOs belong to the ZuriMED manufacturer organization — ✅ PASS”

Assertion: All 4 BOs should be owned by ZuriMED

SELECT manufacturer_organization_id, count(*)::int AS bo_count
FROM billing_orders
WHERE order_number = ANY($1)
GROUP BY manufacturer_organization_id
manufacturer_organization_idbo_count
a1b2c3d4-e5f6-7890-abcd-ef12345678904

Seeded BOs span four distinct status values — ✅ PASS

Section titled “Seeded BOs span four distinct status values — ✅ PASS”

Assertion: Four seeded BOs should have 4 distinct status values

SELECT DISTINCT status
FROM billing_orders
WHERE order_number = ANY($1)
ORDER BY status
status
draft
invoice_sent
invoice_voided
submitted

Every row written to audit_events while this test was running (scoped to the demo organizations). Provides compliance evidence that user actions are traced end-to-end (URS-003).

Capture window start: 2026-04-23T03:41:39.014Z

SELECT
ae.created_at,
ae.event_type,
ae.action,
ae.user_id,
u.email AS user_email,
ae.organization_id,
o.name AS organization_name,
ae.object_id,
ae.secondary_object_id,
ae.payload,
ae.route,
ae.trace_id
FROM audit_events ae
LEFT JOIN users u ON u.id = ae.user_id
LEFT JOIN organizations o ON o.id = ae.organization_id
WHERE ae.created_at >= $1
AND ae.organization_id = ANY($2::uuid[])
ORDER BY ae.created_at ASC

10 event(s) captured:

TimeTypeActionUserOrgObject IDPerformedReason
2026-04-23 03:41:43Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:41:50Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:41:56Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:08Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:15Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:24Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:32Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:39Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:47Zuser_loguser:loginalex.admin@zurimed.comZuriMED
2026-04-23 03:42:52Zuser_loguser:loginalex.admin@zurimed.comZuriMED

The following screencast recordings were captured but could not be matched to a specific test step. Step-matched recordings appear inline in their respective step sections above.