Files
ecw-charge-validation/tests/fixtures/dental_claim.html
T
ManikandanandClaude Opus 5.5 ba15a574ab Initial import: eCW Charge Validation bot and results Portal
Snapshot of the working project as of 2026-10-23 (local 2d4d4fc), one
commit with no earlier history: the tracked files were de-identified
first (synthetic claim ids and patient data only; see Context.md
section 7). Credentials, run logs, screenshots, claim reports and client
workbooks are gitignored and not included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:38:17 +05:30

209 lines
11 KiB
HTML

<!doctype html>
<!--
A cut-down of eCW's Dental Claim screen (mapped from live claim 9125000 —
DentaQuest; the claim number, patient and account here are made up). A THIRD claim-form shape, distinct from both the UB form and
the professional/HCFA "Claim" screen: its own modal entirely
(id="dentalClaim<timestamp>"), closeDntl() instead of
closeUBClaimScreen()/closeClaimScreen(), saveData() instead of
saveAllData(true)/saveAllData(), and a completely different tab set
("ICD & CDT" / "Services Rendered" rather than "ICD & CPT" / "CPT/HCPCS").
Since 2026-10-12 Dental claims run the same conditions as UB/HCFA, so
this fixture carries the screen's real shapes (from Dom.txt's capture):
the Services Rendered grid, the ICD list, the insurance grid, the Billing
Notes and the Prog. Notes button — see the comments on each. The claim
number and the web_cptcode inputs are also what
claim_form.wait_claim_loaded() watches (review item D7). Codes are
generic CDT/CPT codes; nothing comes from a real claim. Every id carries the per-open timestamp 7777777777777,
deliberately different from both hcfa_claim.html's 8888888888888 and
ub_claim.html's 9999999999999.
-->
<html>
<body>
<div class="modal fade bluetheme billing-width dentalClaimModalBackdrop right-panel-mode in" id="dentalClaim7777777777777" style="display:block">
<div class="modal-dialog visible" style="width: 1286px;">
<div class="modal-content" id="dentalClaimModalContent7777777777777">
<div class="modal-header">
<h4 class="modal-title">Dental Claim
<span class="ml5 fs11 patient-identifier-span">TESTPATIENT, Demo &nbsp; Jan 01, 1970 (56 yo F) &nbsp; Acc No. 000000</span>
</h4>
</div>
<div class="modal-body">
<table class="table"><tbody><tr>
<td><label>Claim No</label></td>
<td><span ng-bind="ClaimData.claimNo">5000000</span></td>
</tr></tbody></table>
<!--
"Services Rendered" (2026-10-12, Dental claims run the conditions):
the live grid's shape from Dom.txt — rows are
tr[ng-repeat="CPT in CPTCodes track by $index"], no CPTROW_ id; the
fields go by data-fieldname (web_cptcode, web_icd1-4, web_units,
web_billedFee); the checkbox is the same updateBillToIns() one as
UB/HCFA. No per-row POS and no modifier columns. The trailing "new
code" row has no data-fieldname. Codes are generic CDT/CPT codes, fees
made up.
-->
<table id="claimCPTCodesTable7777777777777" class="table">
<thead><tr>
<th></th><th>&nbsp;</th><th>Tth No</th><th>Srfc</th>
<th>Description of Service Performed</th><th>DOS</th><th>Proc No</th>
<th>ICD1</th><th>ICD2</th><th>ICD3</th><th>ICD4</th><th>Units</th>
<th>Fee</th><th></th>
</tr></thead>
<tbody ng-model="CPTCodes">
<tr ng-repeat="CPT in CPTCodes track by $index">
<td>1</td>
<td><input type="checkbox" id="claimCPTBillToInsChk0" ng-click="updateBillToIns($index)" checked></td>
<td id="TthNo0"></td><td></td><td>PERIODIC ORAL EVALUATION</td>
<td><input id="DentalClaimCPTSDOS0" data-fieldname="DentalClaimCPTSDOS" type="text" value="09/01/2026"></td>
<td><input id="dentalClaimCPTCode0" data-fieldname="web_cptcode" type="text" value="D0120"></td>
<td><input id="dentalClaimIcd10" data-fieldname="web_icd1" type="text" value="1"></td>
<td><input id="dentalClaimIcd20" data-fieldname="web_icd2" type="text" value=""></td>
<td><input id="dentalClaimIcd30" data-fieldname="web_icd3" type="text" value=""></td>
<td><input id="dentalClaimIcd40" data-fieldname="web_icd4" type="text" value=""></td>
<td><input id="DentalClaimCPTUnits0" data-fieldname="web_units" type="text" value="1"></td>
<td><input id="DentalClaimIpt1ngR0" data-fieldname="web_billedFee" type="text" value="45.00"></td>
<td><button id="DentalClaimBtn1ngR0" ng-click="removeCPT($index)"></button></td>
</tr>
<tr ng-repeat="CPT in CPTCodes track by $index">
<td>2</td>
<td><input type="checkbox" id="claimCPTBillToInsChk1" ng-click="updateBillToIns($index)" checked></td>
<td id="TthNo1"></td><td></td><td>DENTAL CONSULT</td>
<td><input id="DentalClaimCPTSDOS1" data-fieldname="DentalClaimCPTSDOS" type="text" value="09/01/2026"></td>
<td><input id="dentalClaimCPTCode1" data-fieldname="web_cptcode" type="text" value="DCONS"></td>
<td><input id="dentalClaimIcd11" data-fieldname="web_icd1" type="text" value="1"></td>
<td><input id="dentalClaimIcd21" data-fieldname="web_icd2" type="text" value=""></td>
<td><input id="dentalClaimIcd31" data-fieldname="web_icd3" type="text" value=""></td>
<td><input id="dentalClaimIcd41" data-fieldname="web_icd4" type="text" value=""></td>
<td><input id="DentalClaimCPTUnits1" data-fieldname="web_units" type="text" value="1"></td>
<td><input id="DentalClaimIpt1ngR1" data-fieldname="web_billedFee" type="text" value="30.00"></td>
<td><button id="DentalClaimBtn1ngR1" ng-click="removeCPT($index)"></button></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td>
<td ng-click="enterCPT($event)"><input type="text" id="editableTDTextNewCPTcode" ng-model="newCPT"></td>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
</tbody>
</table>
<!-- "ICD & CDT": the diagnosis list (#icdTable #addTable on the live screen) -->
<div class="allbrd white-bg icdTbl" id="icdTable">
<table class="table" id="addTable">
<thead><tr><th></th><th>Code</th><th>Name</th><th></th></tr></thead>
<tbody ng-model="ICDData">
<tr ng-repeat="ICDCode in ICDData">
<td>1</td>
<td ng-click="enterICD($event)"><input type="text" value="Z01.20"></td>
<td>Encounter for dental exam</td>
<td><button id="DentalClaimBtn2ngR0" ng-click="removeICD($index)"></button></td>
</tr>
<tr id="2">
<td></td>
<td ng-click="enterICD($event)"><input type="text" id="txtnewIcd7777777777777"></td>
<td></td><td></td>
</tr>
</tbody>
</table>
</div>
<!-- Insurance (#DentalClaimTbl2 on the live screen) -->
<table id="DentalClaimTbl2" class="table">
<thead><tr>
<th></th><th>Bill To</th><th>Ins Id</th><th>Name</th><th>State</th>
<th>Subscriber No</th><th>Rel</th><th>Insured</th><th>Group No</th>
</tr></thead>
<tbody>
<tr ng-repeat="insurance in Insurances">
<td><span ng-bind="insurance.sequanceNo">P</span></td>
<td><input id="DentalClaimIpt20ngR0" type="checkbox" ng-model="insurance.PrimIns" checked></td>
<td><span ng-bind="insurance.InsId">1001</span></td>
<td><span ng-bind="insurance.InsName">DentaQuest</span></td>
<td><span ng-bind="insurance.InsState">CO</span></td>
<td><span ng-bind="insurance.SubscriberNo">X000000</span></td>
<td><span ng-bind="insurance.SubscriberRel">Self</span></td>
<td><span ng-bind="insurance.SubscriberName">TESTPATIENT, Demo</span></td>
<td><span ng-bind="insurance.GroupNo"></span></td>
</tr>
</tbody>
</table>
<textarea id="dentalClaimNotes">Routine visit.</textarea>
</div>
<div class="modal-footer grey-bg claimOptionMenu">
<button type="button" class="btn btn-lgrey btn-sm btn-xs pull-left" ng-click="viewProgNote()"
id="dentalClaimProgressNoteBtn7777777777777">Prog. Notes</button>
<button id="cancelDentalClaimButton" type="button" class="btn btn-lgrey btn-sm btn-xs pull-right ml10"
ng-click="closeDntl();">Cancel</button>
<button id="DentalClaimBtn17" type="button" class="btn btn-blue btn-sm btn-xs pull-right ml10"
ng-click="saveData()">OK</button>
</div>
</div></div></div>
<script>
// Cancel and OK both hide the same backdrop the real closeDntl() /
// saveData() do — same reasoning hcfa_claim.html's script block uses.
document.getElementById('cancelDentalClaimButton').addEventListener('click', function () {
document.getElementById('dentalClaim7777777777777').style.display = 'none';
});
document.getElementById('DentalClaimBtn17').addEventListener('click', function () {
document.getElementById('dentalClaim7777777777777').style.display = 'none';
});
</script>
<script>
// ?footer=wrapped (review of unit C, 2026-10-05): wraps Cancel in a div
// whose id also starts with "dentalClaim", inside the modal. The form's
// window is found by walking up from the visible Cancel; an id-prefix-only
// window selector stopped at this wrapper, which holds neither the claim
// number nor the service lines. Runs before the load script so ?load=
// combines with it. The click handler stays on the moved button.
(function () {
if (!/[?&]footer=wrapped(&|$)/.test(location.search)) return;
var cancel = document.getElementById('cancelDentalClaimButton');
var wrap = document.createElement('div');
wrap.id = 'dentalClaimFooter7777777777777';
cancel.parentNode.insertBefore(wrap, cancel);
wrap.appendChild(cancel);
})();
</script>
<script>
// Angular's load, simulated (review item D7) — opt-in through the query
// string, so every test that loads this fixture plainly still sees a form
// that is already filled.
// ?load=delayed claim number and codes blank, filled 800 ms later
// ?load=never blank, and never filled (the timeout path)
// ?load=wrong filled 800 ms later with a DIFFERENT claim number
// ?load=noclaimno claim-number element removed; codes filled 800 ms later
// Codes are blanked as the .value PROPERTY only, which is where Angular
// keeps them: the value="" attribute still holds the template's code, so a
// reader that took the attribute would call the form loaded at once.
(function () {
var m = /[?&]load=(\w+)/.exec(location.search);
if (!m) return;
var mode = m[1];
var no = document.querySelector('[id^="dentalClaim"] [ng-bind="ClaimData.claimNo"]');
var codes = Array.prototype.slice.call(
document.querySelectorAll('[id^="dentalClaim"] [data-fieldname="web_cptcode"]'));
var want = codes.map(function (e) { return e.value; });
var claimNo = no ? no.textContent : '';
if (no) no.textContent = '';
if (mode === 'noclaimno' && no) { no.remove(); no = null; }
codes.forEach(function (e) { e.value = ''; });
if (mode === 'never') return;
setTimeout(function () {
if (no) no.textContent = (mode === 'wrong' ? '5000001' : claimNo);
codes.forEach(function (e, i) { e.value = want[i]; });
}, 800);
})();
</script>
</body>
</html>