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>
This commit is contained in:
commit
ba15a574ab
205 files changed
+56772
No files matched your search
Vendored
+208
@@ -0,0 +1,208 @@
|
||||
<!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>
|
||||
Reference in new issue
Block a user