CareWell clinic / billing-pay
billing-pay
Pay two invoices. The home page's Invoices button opens CW_BILLING without a patient: LOAD_INVOICES shows the invoices still to be paid. Choosing invoice 3850 (open, 75) coordinates its lines and payments (ON-CLEAR-DETAILS, ON-POPULATE-DETAILS, QUERY_MASTER_DETAILS). A payment of 30 (PAID_ON defaults to today, $$DATE$$) is saved with File > Save, which runs the form's KEY-COMMIT: PRE-INSERT takes the sequence, POST-INSERT sets the invoice PARTIAL, and the list is queried again. Invoice 3852 (partial, 42.50 of 85 paid) gets the remaining 42.50 (a click into a new row lands on its first item, PAID_ON, so AMOUNT is clicked twice): POST-INSERT sets it PAID and the new query no longer lists it.
Three runs from a fresh database gave byte-identical diffs. Behaviour that looks odd in the migrated app but is the original's: faithful to the original and waivers. Files: scenario, golden record, target record, diff (JSON).
Scenario steps
Items are addressed by their Forms name (BLOCK.ITEM[row]), the same name in the
original and, through the mapping, in the migrated app.
| # | Step | Action | Checked on the original |
|---|---|---|---|
| 0 | Open form cw_login | ||
| 1 | Type CTL.USERNAME = ADMIN | ||
| 2 | sign in | Click CTL.SIGN_IN | |
| 3 | invoices | Click HOME.INVOICES | |
| 4 | open invoice | Click INVOICES.INVOICE_ID[1] | |
| 5 | Type PAYMENTS.AMOUNT[0] = 30 | ||
| 6 | save part payment | Click Toolbar.Save | |
| 7 | partial invoice | Click INVOICES.INVOICE_ID[0] | |
| 8 | new payment row | Click PAYMENTS.AMOUNT[1] | |
| 9 | Type PAYMENTS.AMOUNT[1] = 42.5 | ||
| 10 | leave the amount | Press Tab | |
| 11 | save final payment | Click Toolbar.Save |
Screens, step by step
Left: the original Oracle Forms application, recorded on a virtual display. Right: the migrated application in headless Chromium. Screenshots are evidence only; the comparison works on the recorded values.
No step screenshots of the original were kept for this app; the comparison uses the recorded values, which are in the golden record below.
Step 0: open cw_login
Step 1: type
Step 2: sign in
Step 3: invoices
Step 4: open invoice
Step 5: type
Step 6: save part payment
Step 7: partial invoice
Step 8: new payment row
Step 9: type
Step 10: leave the amount
Step 11: save final payment
Golden record of the original
After each step: the focus, the displayed values that changed, the message line and any alert. The full record (every item of every step, windows, lists of values) is in the JSON file.
| # | Step | Action (by name) | Focus after | Displayed values that changed | Message line | Alert | Expect |
|---|---|---|---|---|---|---|---|
| 0 | Open form cw_login | CTL.USERNAME[0] | |||||
| 1 | Type CTL.USERNAME = ADMIN | CTL.USERNAME[0] | CTL.USERNAME[0] = ADMIN | ||||
| 2 | sign in | Click CTL.SIGN_IN | HOME.SCHEDULE[0] | HOME.CHECKED_IN[0] = <any>HOME.OPEN_AMOUNT[0] = 15,015HOME.OPEN_INVOICES[0] = 180HOME.TODAY_TOTAL[0] = <any>HOME.WELCOME[0] = Welcome, Clinic Administrator | |||
| 3 | invoices | Click HOME.INVOICES | INVOICES.INVOICE_ID[0] | CTL.SHOWING[0] = Invoices to be paidINVOICES.INVOICE_DATE[0] = 24-SEP-2026INVOICES.INVOICE_DATE[1] = 23-SEP-2026INVOICES.INVOICE_DATE[2] = 18-SEP-2026INVOICES.INVOICE_DATE[3] = 17-SEP-2026INVOICES.INVOICE_DATE[4] = 17-SEP-2026INVOICES.INVOICE_ID[0] = 3852INVOICES.INVOICE_ID[1] = 3850INVOICES.INVOICE_ID[2] = 3835INVOICES.INVOICE_ID[3] = 3832INVOICES.INVOICE_ID[4] = 3831INVOICES.PAID[0] = 42.50INVOICES.PAID[1] = 0.00INVOICES.PAID[2] = 40.00INVOICES.PAID[3] = 0.00INVOICES.PAID[4] = 0.00INVOICES.PATIENT_NAME[0] = Yusuf BanerjeeINVOICES.PATIENT_NAME[1] = Maya DSouzaINVOICES.PATIENT_NAME[2] = Omar PatelINVOICES.PATIENT_NAME[3] = Aisha MathewINVOICES.PATIENT_NAME[4] = Fatima VermaINVOICES.STATUS[0] = PARTIALINVOICES.STATUS[1] = OPENINVOICES.STATUS[2] = PARTIALINVOICES.STATUS[3] = OPENINVOICES.STATUS[4] = OPENINVOICES.TOTAL_AMOUNT[0] = 85.00INVOICES.TOTAL_AMOUNT[1] = 75.00INVOICES.TOTAL_AMOUNT[2] = 80.00INVOICES.TOTAL_AMOUNT[3] = 70.00INVOICES.TOTAL_AMOUNT[4] = 80.00INVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Maya WilsonINVOICE_LINES.LINE_NO[0] = 1INVOICE_LINES.QUANTITY[0] = 1INVOICE_LINES.UNIT_PRICE[0] = 85.00PAYMENTS.AMOUNT[0] = 42.50PAYMENTS.METHOD[0] = CashPAYMENTS.PAID_ON[0] = 24-SEP-2026 | |||
| 4 | open invoice | Click INVOICES.INVOICE_ID[1] | INVOICES.INVOICE_ID[1] | INVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Isha SaxenaINVOICE_LINES.DESCRIPTION[1] = Injection chargeINVOICE_LINES.LINE_NO[1] = 2INVOICE_LINES.QUANTITY[1] = 1INVOICE_LINES.UNIT_PRICE[0] = 45.00INVOICE_LINES.UNIT_PRICE[1] = 30.00PAYMENTS.PAID_ON[0] = <date> | |||
| 5 | Type PAYMENTS.AMOUNT[0] = 30 | PAYMENTS.AMOUNT[0] | PAYMENTS.AMOUNT[0] = 30 | ||||
| 6 | save part payment | Click Toolbar.Save | INVOICES.INVOICE_ID[0] | INVOICES.PAID[1] = 30.00INVOICES.STATUS[1] = PARTIALINVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Maya WilsonINVOICE_LINES.UNIT_PRICE[0] = 85.00PAYMENTS.AMOUNT[0] = 42.50PAYMENTS.PAID_ON[0] = 24-SEP-2026 | Saved. Invoice 3850 is PARTIAL. | ||
| 7 | partial invoice | Click INVOICES.INVOICE_ID[0] | INVOICES.INVOICE_ID[0] | Saved. Invoice 3850 is PARTIAL. | |||
| 8 | new payment row | Click PAYMENTS.AMOUNT[1] | PAYMENTS.PAID_ON[1] | PAYMENTS.METHOD[1] = CashPAYMENTS.PAID_ON[1] = <date> | |||
| 9 | Type PAYMENTS.AMOUNT[1] = 42.5 | PAYMENTS.AMOUNT[1] | PAYMENTS.AMOUNT[1] = 42.5 | ||||
| 10 | leave the amount | Press Tab | PAYMENTS.METHOD[1] | PAYMENTS.AMOUNT[1] = 42.50 | Amount Required 42.50 | ||
| 11 | save final payment | Click Toolbar.Save | FWindow/PushButton:OK | FRM-40401: No changes to save. | FRM-40401: No changes to save. |
Database effects
INVOICES updated: {"key": {"INVOICE_ID": 3850}, "changed": {"STATUS": {"before": "OPEN", "after": "PARTIAL"}}}
PAYMENTS inserted: {"PAYMENT_ID": 6733, "INVOICE_ID": 3850, "PAID_ON": "<date>", "AMOUNT": 30, "METHOD": "CASH"}
sequence PAYMENTS_SEQ: next 6733 -> 6735, drawn [6733, 6734]
generated: PAYMENTS.PAYMENT_ID = 6733 is PAYMENTS_SEQ#1
Classified diff against the migrated app
Diff: billing-pay counts: match 466, tolerated 148, waived 54, defect 0, unmapped 0, harness 0 generated-id pairs (source -> target): PAYMENTS_SEQ#1 -> PAYMENTS_SEQ#1 waivers: C1 [proposed] Oracle's frame title before sign-in: applied to 2 value(s) C2 [proposed] The home page's collected-today gauge reads empty: applied to 10 value(s) C3 [proposed] Help > About names nobody: applied to 0 value(s) C4 [proposed] The home page forgets the user after File > Exit of a module: applied to 0 value(s) C5 [proposed] No item has the focus after a fetched record is refused: applied to 0 value(s) C6 [proposed] The second payment of billing-pay is lost: applied to 42 value(s) [tolerated] ui.values.HOME.CHECKED_IN rule=mask:today-counts x10 [tolerated] ui.values.HOME.OPEN_AMOUNT rule=text x10 [tolerated] ui.values.HOME.TODAY_TOTAL rule=mask:today-counts x10 [tolerated] ui.values.INVOICES.PAID rule=text x42 [tolerated] ui.values.INVOICES.TOTAL_AMOUNT rule=text x40 [tolerated] ui.values.INVOICE_LINES.UNIT_PRICE rule=text x10 [tolerated] ui.values.PAYMENTS.AMOUNT rule=text x7 [tolerated] ui.values.PAYMENTS.METHOD rule=text x14 [tolerated] ui.values.PAYMENTS.PAID_ON rule=mask:payment-date x5 [waived] db.INVOICES.updated rule=waiver:C6 (update only in the target) x1 db.INVOICES.updated[3852]: source null | target {"key": {"INVOICE_ID": 3852}, "changed": {"STATUS": {"after": "PAID... [waived] db.PAYMENTS.inserted rule=waiver:C6 (row only in the target) x1 db.PAYMENTS.inserted[target 1]: source null | target {"AMOUNT": "42.50", "INVOICE_ID": 3852, "METHOD": "CASH", "PAID_ON"... [waived] ui.alert rule=waiver:C6 (alert missing in the target) x1 step11.alert: source {"title": "Forms", "message": ["FRM-40401: No changes to save."], "... | target null [waived] ui.focus rule=waiver:C6 (expected dialog) x1 step11.focus: source 'FWindow/PushButton:OK' | target 'invoices.invoice_id[0]' [waived] ui.message rule=waiver:C6 x2 step10.message: source 'Amount Required 42.50' | target '' step11.message: source 'FRM-40401: No changes to save.' | target 'Saved. Invoice 3852 is PAID.' [waived] ui.record rule=waiver:C6 x1 step11.record: source 'Record: 0/1' | target 'Record: 1/?' [waived] ui.values.HOME.COLLECTED rule=waiver:C2 x10 step02.values.HOME.COLLECTED[0]: source '' | target '83' step03.values.HOME.COLLECTED[0]: source '' | target '83' step04.values.HOME.COLLECTED[0]: source '' | target '83' step05.values.HOME.COLLECTED[0]: source '' | target '83' step06.values.HOME.COLLECTED[0]: source '' | target '83' step07.values.HOME.COLLECTED[0]: source '' | target '83' step08.values.HOME.COLLECTED[0]: source '' | target '83' step09.values.HOME.COLLECTED[0]: source '' | target '83' step10.values.HOME.COLLECTED[0]: source '' | target '83' step11.values.HOME.COLLECTED[0]: source '' | target '83' [waived] ui.values.INVOICES.INVOICE_DATE rule=waiver:C6 x4 step11.values.INVOICES.INVOICE_DATE[0]: source '24-SEP-2026' | target '23-SEP-2026' step11.values.INVOICES.INVOICE_DATE[1]: source '23-SEP-2026' | target '18-SEP-2026' step11.values.INVOICES.INVOICE_DATE[2]: source '18-SEP-2026' | target '17-SEP-2026' step11.values.INVOICES.INVOICE_DATE[4]: source '17-SEP-2026' | target '15-SEP-2026' [waived] ui.values.INVOICES.INVOICE_ID rule=waiver:C6 x5 step11.values.INVOICES.INVOICE_ID[0]: source '3852' | target '3850' step11.values.INVOICES.INVOICE_ID[1]: source '3850' | target '3835' step11.values.INVOICES.INVOICE_ID[2]: source '3835' | target '3832' step11.values.INVOICES.INVOICE_ID[3]: source '3832' | target '3831' step11.values.INVOICES.INVOICE_ID[4]: source '3831' | target '3823' [waived] ui.values.INVOICES.PAID rule=waiver:C6 x3 step11.values.INVOICES.PAID[0]: source ' 42.50' | target '30.00' step11.values.INVOICES.PAID[1]: source ' 30.00' | target '40.00' step11.values.INVOICES.PAID[2]: source ' 40.00' | target '0.00' [waived] ui.values.INVOICES.PATIENT_NAME rule=waiver:C6 x5 step11.values.INVOICES.PATIENT_NAME[0]: source 'Yusuf Banerjee' | target 'Maya DSouza' step11.values.INVOICES.PATIENT_NAME[1]: source 'Maya DSouza' | target 'Omar Patel' step11.values.INVOICES.PATIENT_NAME[2]: source 'Omar Patel' | target 'Aisha Mathew' step11.values.INVOICES.PATIENT_NAME[3]: source 'Aisha Mathew' | target 'Fatima Verma' step11.values.INVOICES.PATIENT_NAME[4]: source 'Fatima Verma' | target 'Lina Thomas' [waived] ui.values.INVOICES.STATUS rule=waiver:C6 x1 step11.values.INVOICES.STATUS[2]: source 'PARTIAL' | target 'OPEN' [waived] ui.values.INVOICES.TOTAL_AMOUNT rule=waiver:C6 x5 step11.values.INVOICES.TOTAL_AMOUNT[0]: source ' 85.00' | target '75.00' step11.values.INVOICES.TOTAL_AMOUNT[1]: source ' 75.00' | target '80.00' step11.values.INVOICES.TOTAL_AMOUNT[2]: source ' 80.00' | target '70.00' step11.values.INVOICES.TOTAL_AMOUNT[3]: source ' 70.00' | target '80.00' step11.values.INVOICES.TOTAL_AMOUNT[4]: source ' 80.00' | target '45.00' [waived] ui.values.INVOICE_LINES.DESCRIPTION rule=waiver:C6 x2 step11.values.INVOICE_LINES.DESCRIPTION[0]: source 'Consultation - Dr. Maya Wilson' | target 'Consultation - Dr. Isha Saxena' step11.values.INVOICE_LINES.DESCRIPTION[1]: source '' | target 'Injection charge' [waived] ui.values.INVOICE_LINES.LINE_NO rule=waiver:C6 x1 step11.values.INVOICE_LINES.LINE_NO[1]: source '' | target '2' [waived] ui.values.INVOICE_LINES.QUANTITY rule=waiver:C6 x1 step11.values.INVOICE_LINES.QUANTITY[1]: source '' | target '1' [waived] ui.values.INVOICE_LINES.UNIT_PRICE rule=waiver:C6 x2 step11.values.INVOICE_LINES.UNIT_PRICE[0]: source ' 85.00' | target '45.00' step11.values.INVOICE_LINES.UNIT_PRICE[1]: source '' | target '30.00' [waived] ui.values.PAYMENTS.AMOUNT rule=waiver:C6 x2 step11.values.PAYMENTS.AMOUNT[0]: source ' 42.50' | target '30.00' step11.values.PAYMENTS.AMOUNT[1]: source ' 42.50' | target '' [waived] ui.values.PAYMENTS.METHOD rule=waiver:C6 x1 step11.values.PAYMENTS.METHOD[1]: source 'Cash' | target '' [waived] ui.values.PAYMENTS.PAID_ON rule=waiver:C6 (run date value in the source only) x1 step11.values.PAYMENTS.PAID_ON[1]: source '<date>' | target '' [waived] ui.values.PAYMENTS.PAID_ON rule=waiver:C6 (run date value in the target only) x1 step11.values.PAYMENTS.PAID_ON[0]: source '24-SEP-2026' | target '<date>' [waived] ui.windows rule=waiver:C1 x2 step00.windows: source [["FRAME", "Oracle Fusion Middleware Forms Services"], ["MAIN_WIN",... | target [["FRAME", "CareWell Clinic"], ["MAIN_WIN", "CareWell Clinic - Sign... step01.windows: source [["FRAME", "Oracle Fusion Middleware Forms Services"], ["MAIN_WIN",... | target [["FRAME", "CareWell Clinic"], ["MAIN_WIN", "CareWell Clinic - Sign... [waived] ui.windows rule=waiver:C6 x1 step11.windows: source [["FRAME", "CareWell Clinic - Front Desk One (Reception)"], ["MAIN_... | target [["FRAME", "CareWell Clinic - Front Desk One (Reception)"], ["MAIN_...
Waivers
| Id | Waiver | Values | Reason |
|---|---|---|---|
| C1 | Oracle's frame title before sign-in | 2 | Until CW_NAV.START_FORM sets the MDI title, the Forms frame shows the runtime's own title "Oracle Fusion Middleware Forms Services". The target's frame reads "CareWell Clinic" from the start: the web page is the clinic's application, not Oracle's runtime. From sign-in on, both show the same title. |
| C2 | The home page's collected-today gauge reads empty | 10 | HOME.COLLECTED is a display item drawn as a half gauge on the original canvas; the Forms client's component tree exposes no text for it, so the source records '' at every step. The target shows the amount REFRESH_HOME computes (the same query as the source), as a number with a bar. |
| C6 | The second payment of billing-pay is lost | 42 | In billing-pay, after the 42.50 is typed into the new payment row and Tab leaves AMOUNT, the Forms client reports "Amount Required 42.50" on the message line, and File > Save then shows the alert "FRM-40401: No changes to save." (record indicator 0/1). PRE-INSERT has drawn PAYMENTS_SEQ (the source draws 6733 and 6734, as the target does), yet nothing is saved: payment 6734 is not in PAYMENTS and invoice 3852 stays PARTIAL, while the screen still shows the unsaved payment. Identical in all three runs. The target saves the payment as the form's code says: POST-INSERT sets invoice 3852 PAID, KEY-COMMIT queries the invoices to be paid again (3852 is no longer among them) and shows "Saved. Invoice 3852 is PAID.". Replicating would mean losing a payment the user entered. |











