FormsRefresh

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.

0defects
466values match
148tolerated by policy
54waived
0unmapped

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.

#StepActionChecked on the original
0Open form cw_login
1Type CTL.USERNAME = ADMIN
2sign inClick CTL.SIGN_IN
3invoicesClick HOME.INVOICES
4open invoiceClick INVOICES.INVOICE_ID[1]
5Type PAYMENTS.AMOUNT[0] = 30
6save part paymentClick Toolbar.Save
7partial invoiceClick INVOICES.INVOICE_ID[0]
8new payment rowClick PAYMENTS.AMOUNT[1]
9Type PAYMENTS.AMOUNT[1] = 42.5
10leave the amountPress Tab
11save final paymentClick 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

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 00-open
Migrated (.NET, PostgreSQL)

Step 1: type

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 01-type
Migrated (.NET, PostgreSQL)

Step 2: sign in

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 02-sign-in
Migrated (.NET, PostgreSQL)

Step 3: invoices

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 03-invoices
Migrated (.NET, PostgreSQL)

Step 4: open invoice

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 04-open-invoice
Migrated (.NET, PostgreSQL)

Step 5: type

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 05-type
Migrated (.NET, PostgreSQL)

Step 6: save part payment

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 06-save-part-payment
Migrated (.NET, PostgreSQL)

Step 7: partial invoice

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 07-partial-invoice
Migrated (.NET, PostgreSQL)

Step 8: new payment row

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 08-new-payment-row
Migrated (.NET, PostgreSQL)

Step 9: type

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 09-type
Migrated (.NET, PostgreSQL)

Step 10: leave the amount

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 10-leave-the-amount
Migrated (.NET, PostgreSQL)

Step 11: save final payment

no screenshot
Original (Oracle Forms 14.1.2)
Migrated (.NET, PostgreSQL), step 11-save-final-payment
Migrated (.NET, PostgreSQL)

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.

#StepAction (by name)Focus afterDisplayed values that changedMessage lineAlertExpect
0Open form cw_loginCTL.USERNAME[0]
1Type CTL.USERNAME = ADMINCTL.USERNAME[0]CTL.USERNAME[0] = ADMIN
2sign inClick CTL.SIGN_INHOME.SCHEDULE[0]HOME.CHECKED_IN[0] = <any>
HOME.OPEN_AMOUNT[0] = 15,015
HOME.OPEN_INVOICES[0] = 180
HOME.TODAY_TOTAL[0] = <any>
HOME.WELCOME[0] = Welcome, Clinic Administrator
3invoicesClick HOME.INVOICESINVOICES.INVOICE_ID[0]CTL.SHOWING[0] = Invoices to be paid
INVOICES.INVOICE_DATE[0] = 24-SEP-2026
INVOICES.INVOICE_DATE[1] = 23-SEP-2026
INVOICES.INVOICE_DATE[2] = 18-SEP-2026
INVOICES.INVOICE_DATE[3] = 17-SEP-2026
INVOICES.INVOICE_DATE[4] = 17-SEP-2026
INVOICES.INVOICE_ID[0] = 3852
INVOICES.INVOICE_ID[1] = 3850
INVOICES.INVOICE_ID[2] = 3835
INVOICES.INVOICE_ID[3] = 3832
INVOICES.INVOICE_ID[4] = 3831
INVOICES.PAID[0] = 42.50
INVOICES.PAID[1] = 0.00
INVOICES.PAID[2] = 40.00
INVOICES.PAID[3] = 0.00
INVOICES.PAID[4] = 0.00
INVOICES.PATIENT_NAME[0] = Yusuf Banerjee
INVOICES.PATIENT_NAME[1] = Maya DSouza
INVOICES.PATIENT_NAME[2] = Omar Patel
INVOICES.PATIENT_NAME[3] = Aisha Mathew
INVOICES.PATIENT_NAME[4] = Fatima Verma
INVOICES.STATUS[0] = PARTIAL
INVOICES.STATUS[1] = OPEN
INVOICES.STATUS[2] = PARTIAL
INVOICES.STATUS[3] = OPEN
INVOICES.STATUS[4] = OPEN
INVOICES.TOTAL_AMOUNT[0] = 85.00
INVOICES.TOTAL_AMOUNT[1] = 75.00
INVOICES.TOTAL_AMOUNT[2] = 80.00
INVOICES.TOTAL_AMOUNT[3] = 70.00
INVOICES.TOTAL_AMOUNT[4] = 80.00
INVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Maya Wilson
INVOICE_LINES.LINE_NO[0] = 1
INVOICE_LINES.QUANTITY[0] = 1
INVOICE_LINES.UNIT_PRICE[0] = 85.00
PAYMENTS.AMOUNT[0] = 42.50
PAYMENTS.METHOD[0] = Cash
PAYMENTS.PAID_ON[0] = 24-SEP-2026
4open invoiceClick INVOICES.INVOICE_ID[1]INVOICES.INVOICE_ID[1]INVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Isha Saxena
INVOICE_LINES.DESCRIPTION[1] = Injection charge
INVOICE_LINES.LINE_NO[1] = 2
INVOICE_LINES.QUANTITY[1] = 1
INVOICE_LINES.UNIT_PRICE[0] = 45.00
INVOICE_LINES.UNIT_PRICE[1] = 30.00
PAYMENTS.PAID_ON[0] = <date>
5Type PAYMENTS.AMOUNT[0] = 30PAYMENTS.AMOUNT[0]PAYMENTS.AMOUNT[0] = 30
6save part paymentClick Toolbar.SaveINVOICES.INVOICE_ID[0]INVOICES.PAID[1] = 30.00
INVOICES.STATUS[1] = PARTIAL
INVOICE_LINES.DESCRIPTION[0] = Consultation - Dr. Maya Wilson
INVOICE_LINES.UNIT_PRICE[0] = 85.00
PAYMENTS.AMOUNT[0] = 42.50
PAYMENTS.PAID_ON[0] = 24-SEP-2026
Saved. Invoice 3850 is PARTIAL.
7partial invoiceClick INVOICES.INVOICE_ID[0]INVOICES.INVOICE_ID[0]Saved. Invoice 3850 is PARTIAL.
8new payment rowClick PAYMENTS.AMOUNT[1]PAYMENTS.PAID_ON[1]PAYMENTS.METHOD[1] = Cash
PAYMENTS.PAID_ON[1] = <date>
9Type PAYMENTS.AMOUNT[1] = 42.5PAYMENTS.AMOUNT[1]PAYMENTS.AMOUNT[1] = 42.5
10leave the amountPress TabPAYMENTS.METHOD[1]PAYMENTS.AMOUNT[1] = 42.50Amount Required 42.50
11save final paymentClick Toolbar.SaveFWindow/PushButton:OKFRM-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

IdWaiverValuesReason
C1Oracle's frame title before sign-in2Until 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.
C2The home page's collected-today gauge reads empty10HOME.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.
C6The second payment of billing-pay is lost42In 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.