Skip to content

URS-074 · Virtual kit pricing modes (fixed and component-sum)

Title: Virtual kit pricing modes (fixed and component-sum) Date: 2026-08-03T23:05:39.857Z Duration: 139.8s Overall Status: ✅ PASS

The system shall support fixed and component-sum pricing modes for virtual kits, where fixed mode bills the kit at its stored per-account approved price and component-sum mode computes the kit price at billing time as the sum of each component’s effective approved price multiplied by its BOM quantity, blocking billing when any component lacks active pricing.

Source: User_Requirement_Specifications_Vantis_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: Fixed-price kit billing — ✅ PASS

Section titled “1. Step 1: Fixed-price kit billing — ✅ PASS”

What this step proves:

Documents that IK2025LL (LiraLock® Implant Kit) is configured with pricing_mode=‘fixed’ on the ROSS account, and that a bill-only order charges the kit at the stored per-account approved price — not a computed sum. The billing order item unit_price is frozen at submission time.

Audit events generated by this step:

(Evidence scoped to step execution window: 2026-08-03T23:05:46.438Z → 2026-08-03T23:06:15.555Z)

TimeTypeActionUserOrgPerformed
2026-08-03 23:05:51Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:06:13Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantisyes
2026-08-03 23:06:13Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Groupno
2026-08-03 23:06:13Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantisno
2026-08-03 23:06:13Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis
2026-08-03 23:06:13Ztransactional_emailnew_bill_onlyCorveta Surgical Group

Screenshots:

step 01 fixed kit product

step 01 fixed kit account pricing

step 01 fixed kit selected

step 01 review

step 01 submitted

Video recording:


2. Step 2: Component-sum pricing — ✅ PASS

Section titled “2. Step 2: Component-sum pricing — ✅ PASS”

What this step proves:

Documents that IK2025CS (LiraLock® Surgical System CS) is configured with pricing_mode=‘component_sum’ on the ROSS account. The account pricing page displays a read-only computed price equal to the sum of its component approved prices (LL516SNA $3,000 + NP019N1A $1,500 = $4,500). No stored price input is available. The bill-only order captures this computed sum as the kit unit_price.

Audit events generated by this step:

(Evidence scoped to step execution window: 2026-08-03T23:06:21.196Z → 2026-08-03T23:06:50.071Z)

TimeTypeActionUserOrgPerformed
2026-08-03 23:06:25Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:06:47Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantisyes
2026-08-03 23:06:47Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Groupno
2026-08-03 23:06:47Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantisno
2026-08-03 23:06:47Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis
2026-08-03 23:06:48Ztransactional_emailnew_bill_onlyCorveta Surgical Group

Screenshots:

step 02 cs kit product

step 02 cs account pricing

step 02 cs kit selected

step 02 review

step 02 submitted

Video recording:


3. Step 3: Automatic recalculation — ✅ PASS

Section titled “3. Step 3: Automatic recalculation — ✅ PASS”

What this step proves:

Shows that updating the LL516SNA component price on ROSS from $3,000 to $2,750 immediately changes the kit effective price from $4,500 to $4,250. A new bill-only order billed after the update captures $4,250. The original bill-only snapshot from Step 2 is unaffected — each billing order freezes the component-sum price at the moment of submission.

Audit events generated by this step:

(Evidence scoped to step execution window: 2026-08-03T23:06:56.156Z → 2026-08-03T23:07:24.989Z)

TimeTypeActionUserOrgPerformed
2026-08-03 23:07:00Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:07:22Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Groupno
2026-08-03 23:07:22Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantisyes
2026-08-03 23:07:22Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantisno
2026-08-03 23:07:22Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis
2026-08-03 23:07:23Ztransactional_emailnew_bill_onlyCorveta Surgical Group

Screenshots:

step 03 price before

step 03 price after

step 03 review

step 03 updated submitted

Video recording:


4. Step 4: Missing component price blocks billing — ✅ PASS

Section titled “4. Step 4: Missing component price blocks billing — ✅ PASS”

What this step proves:

Deactivating the NP019N1A approved pricing row on ROSS causes the kit pricing widget to display “Missing component prices” instead of a dollar amount. IK2025CS is absent from the bill-only product picker (or shown as unavailable) while a component lacks active pricing. Restoring the pricing row re-enables billing.

Audit events generated by this step:

(Evidence scoped to step execution window: 2026-08-03T23:07:31.042Z → 2026-08-03T23:07:47.918Z)

TimeTypeActionUserOrgPerformed
2026-08-03 23:07:33Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group

Screenshots:

step 04 missing component price warning

step 04 billing no cs kit

Video recording:


5. Step 5: Derived price not proposable — ✅ PASS

Section titled “5. Step 5: Derived price not proposable — ✅ PASS”

What this step proves:

The pricing proposal form for IK2025CS on the ROSS account shows no price-entry field — the kit price is derived from its components and cannot be stored. Only an enabled/disabled toggle is available. The product settings page confirms pricing_mode=‘component_sum’.

Screenshots:

step 05 account pricing before

step 05 proposal form no price input

step 05 product settings component sum

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.

IK2025LL has pricing_mode=fixed and an effective, enabled pricing row on ROSS — ✅ PASS

Section titled “IK2025LL has pricing_mode=fixed and an effective, enabled pricing row on ROSS — ✅ PASS”

Assertion: IK2025LL has pricing_mode=‘fixed’, active pricing with status=‘effective’ and enabled=true

SELECT p.sku, p.pricing_mode,
ap.price, ap.status, ap.active AS pricing_active, ap.enabled
FROM org_products p
JOIN sales_account_approved_pricing ap
ON ap.org_product_id = p.id
AND ap.sales_account_id = $2
AND ap.active = true
WHERE p.id = $1
skupricing_modepricestatuspricing_activeenabled
IK2025LLfixed4750.00effectivetruetrue

Bill-only for IK2025LL records the stored approved price as unit_price — ✅ PASS

Section titled “Bill-only for IK2025LL records the stored approved price as unit_price — ✅ PASS”

Assertion: IK2025LL billing order item unit_price matches the stored per-account approved price

SELECT boi.unit_price, bo.status
FROM billing_orders bo
JOIN billing_order_items boi ON boi.billing_order_id = bo.id
WHERE boi.product_id = $1
AND bo.notes LIKE $2
unit_pricestatus
4750.00submitted

IK2025CS has pricing_mode=component_sum and a two-component BOM — ✅ PASS

Section titled “IK2025CS has pricing_mode=component_sum and a two-component BOM — ✅ PASS”

Assertion: IK2025CS is a virtual_kit with pricing_mode=‘component_sum’ and LL516SNA + NP019N1A in the BOM

SELECT p.sku, p.pricing_mode, cp.sku AS component_sku, pc.quantity
FROM org_products p
JOIN product_components pc ON pc.composite_product_id = p.id
JOIN org_products cp ON cp.id = pc.component_product_id
WHERE p.id = $1
ORDER BY pc.sort_order
skupricing_modecomponent_skuquantity
IK2025CScomponent_sumLL516SNA1
IK2025CScomponent_sumNP019N1A1

First IK2025CS bill-only has unit_price = $4500 (= $3,000 + $1,500) — ✅ PASS

Section titled “First IK2025CS bill-only has unit_price = $4500 (= $3,000 + $1,500) — ✅ PASS”

Assertion: IK2025CS bill-only unit_price = 4500 (sum of component approved prices)

SELECT boi.unit_price, bo.status
FROM billing_orders bo
JOIN billing_order_items boi ON boi.billing_order_id = bo.id
WHERE boi.product_id = $1
AND bo.notes LIKE $2
unit_pricestatus
4500.00submitted

Second IK2025CS bill-only has unit_price = $4250 after LL516SNA price update — ✅ PASS

Section titled “Second IK2025CS bill-only has unit_price = $4250 after LL516SNA price update — ✅ PASS”

Assertion: IK2025CS second bill-only unit_price = 4250 (computed from $2,750 + $1,500)

SELECT boi.unit_price, bo.status
FROM billing_orders bo
JOIN billing_order_items boi ON boi.billing_order_id = bo.id
WHERE boi.product_id = $1
AND bo.notes LIKE $2
unit_pricestatus
4250.00submitted

Original IK2025CS bill-only snapshot still shows $4500 after component price change — ✅ PASS

Section titled “Original IK2025CS bill-only snapshot still shows $4500 after component price change — ✅ PASS”

Assertion: Unit price = 4500 (frozen at billing time, not recalculated after component update)

SELECT boi.unit_price
FROM billing_orders bo
JOIN billing_order_items boi ON boi.billing_order_id = bo.id
WHERE boi.product_id = $1
AND bo.notes LIKE $2
unit_price
4500.00

Attempting to bill IK2025CS with a missing component price creates no billing order line — ✅ PASS

Section titled “Attempting to bill IK2025CS with a missing component price creates no billing order line — ✅ PASS”

Assertion: No billing order line created for IK2025CS when a component price is missing (billing blocked)

SELECT boi.id, bo.notes
FROM billing_orders bo
JOIN billing_order_items boi ON boi.billing_order_id = bo.id
WHERE boi.product_id = $1
AND bo.notes LIKE $2

No rows returned

LL516SNA pricing row on ROSS shows the recalculation price ($2750.00) — ✅ PASS

Section titled “LL516SNA pricing row on ROSS shows the recalculation price ($2750.00) — ✅ PASS”

Assertion: price = 2750.00 (set by scenario 3’s component price update)

SELECT price, active FROM sales_account_approved_pricing
WHERE id = $1
priceactive
2750.00true

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-08-03T23:05:37.901Z

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

24 event(s) captured:

TimeTypeActionUserOrgObject IDPerformedReason
2026-08-03 23:05:43Zuser_loguser:loginalex.admin@vantismedical.comVantis
2026-08-03 23:05:51Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:06:13Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantis019fc9e0-af2e-764a-847d-eb5541624026yesinventory_items_decremented
2026-08-03 23:06:13Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Group019fc9e0-af2e-764a-847d-eb5541624026nono_purchase_order_selected
2026-08-03 23:06:13Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantis019fc9e0-af2e-764a-847d-eb5541624026noNo uploaded PO documents
2026-08-03 23:06:13Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis019fc9e0-af2e-764a-847d-eb5541624026
2026-08-03 23:06:13Ztransactional_emailnew_bill_onlyCorveta Surgical Group019fc9e0-af2e-764a-847d-eb5541624026
2026-08-03 23:06:18Zuser_loguser:loginalex.admin@vantismedical.comVantis
2026-08-03 23:06:25Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:06:47Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantis019fc9e1-366e-75d6-850b-cf8e5c7ba8abyesinventory_items_decremented
2026-08-03 23:06:47Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Group019fc9e1-366e-75d6-850b-cf8e5c7ba8abnono_purchase_order_selected
2026-08-03 23:06:47Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantis019fc9e1-366e-75d6-850b-cf8e5c7ba8abnoNo uploaded PO documents
2026-08-03 23:06:47Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis019fc9e1-366e-75d6-850b-cf8e5c7ba8ab
2026-08-03 23:06:48Ztransactional_emailnew_bill_onlyCorveta Surgical Group019fc9e1-366e-75d6-850b-cf8e5c7ba8ab
2026-08-03 23:06:52Zuser_loguser:loginalex.admin@vantismedical.comVantis
2026-08-03 23:07:00Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:07:22Zdecisionbill_only.link_purchase_orderblair.bennett@corvetasurgical.comCorveta Surgical Group019fc9e1-be4a-7bfd-9ca2-e70517827075nono_purchase_order_selected
2026-08-03 23:07:22Zdecisionbill_only_order.inventory_items_decrementblair.bennett@corvetasurgical.comVantis019fc9e1-be4a-7bfd-9ca2-e70517827075yesinventory_items_decremented
2026-08-03 23:07:22Zdecisionbill_only_order.direct_po_import_on_createblair.bennett@corvetasurgical.comVantis019fc9e1-be4a-7bfd-9ca2-e70517827075noNo uploaded PO documents
2026-08-03 23:07:22Zbilling_orderstatus_changeblair.bennett@corvetasurgical.comVantis019fc9e1-be4a-7bfd-9ca2-e70517827075
2026-08-03 23:07:23Ztransactional_emailnew_bill_onlyCorveta Surgical Group019fc9e1-be4a-7bfd-9ca2-e70517827075
2026-08-03 23:07:27Zuser_loguser:loginalex.admin@vantismedical.comVantis
2026-08-03 23:07:33Zuser_loguser:loginblair.bennett@corvetasurgical.comCorveta Surgical Group
2026-08-03 23:07:50Zuser_loguser:loginalex.admin@vantismedical.comVantis

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.