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>
209 lines
11 KiB
HTML
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 Jan 01, 1970 (56 yo F) 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> </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>
|