claims-dashboard.component.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <div class="dashboard-wrapper">
  2. <!-- Sidebar -->
  3. <aside class="sidebar">
  4. <div class="logo">
  5. <div class="logo-icon">AI</div>
  6. <span>SmartClaims</span>
  7. </div>
  8. <nav>
  9. <a routerLink="/" class="nav-item active">Dashboard</a>
  10. </nav>
  11. </aside>
  12. <!-- Main Content -->
  13. <main class="content">
  14. <header class="content-header">
  15. <div>
  16. <h1>Global Stats</h1>
  17. <p>Monitor and audit medical expenditure across the organization</p>
  18. </div>
  19. <div class="quick-actions">
  20. <button class="action-btn" routerLink="/new-claim">
  21. <lucide-icon [name]="Plus" class="icon-small"></lucide-icon> File New Claim
  22. </button>
  23. </div>
  24. </header>
  25. <div class="stats-overview">
  26. <div class="stat-card">
  27. <span class="label">Total Claims (Session)</span>
  28. <span class="value">{{ claims.length }}</span>
  29. </div>
  30. <div class="stat-card">
  31. <span class="label">Total Medical Payouts</span>
  32. <span class="value">RM {{ totalClaimed | number:'1.2-2' }}</span>
  33. </div>
  34. </div>
  35. <div class="claims-table-container">
  36. <table class="claims-table">
  37. <thead>
  38. <tr>
  39. <th>Employee</th>
  40. <th>Provider</th>
  41. <th>Visit Date</th>
  42. <th>Spent (Receipt)</th>
  43. <th>Claimed (Capped)</th>
  44. <th>Status</th>
  45. <th>Audit</th>
  46. </tr>
  47. </thead>
  48. <tbody>
  49. <tr *ngFor="let claim of claims" (click)="viewDetail(claim)" class="clickable-row">
  50. <td>
  51. <div class="user-cell">
  52. <span class="user-name">{{ claim.submitted_by }}</span>
  53. <span class="user-dept">{{ claim.department }}</span>
  54. </div>
  55. </td>
  56. <td>{{ claim.provider_name || claim.extraction_data?.provider_name || 'N/A' }}</td>
  57. <td>{{ (claim.visit_date || claim.extraction_data?.visit_date) | date:'mediumDate' }}</td>
  58. <td>RM {{ claim.amount_spent | number:'1.2-2' }}</td>
  59. <td [class.capped-text]="claim.amount_claimed < claim.amount_spent">
  60. RM {{ claim.amount_claimed | number:'1.2-2' }}
  61. </td>
  62. <td>
  63. <span class="status-pill" *ngIf="claim.extraction_data"
  64. [class.verified]="!claim.extraction_data.needs_manual_review"
  65. [class.review]="claim.extraction_data.needs_manual_review">
  66. {{ claim.extraction_data.needs_manual_review ? 'In Review' : 'AI Verified' }}
  67. </span>
  68. <span class="status-pill manually-verified" style="background: rgba(148, 163, 184, 0.1); color: #475569;" *ngIf="!claim.extraction_data">
  69. Manual Entry
  70. </span>
  71. </td>
  72. <td class="actions-cell">
  73. <lucide-icon [name]="ExternalLink" class="icon-tiny" title="View Audit"></lucide-icon>
  74. <button class="delete-icon-btn" (click)="deleteClaim($event, claim.id)" title="Delete Claim">
  75. <lucide-icon [name]="Trash2" class="icon-tiny"></lucide-icon>
  76. </button>
  77. </td>
  78. </tr>
  79. </tbody>
  80. </table>
  81. <div *ngIf="loading" class="table-loading">Syncing secure data...</div>
  82. <div *ngIf="!loading && claims.length === 0" class="empty-table">No claims recorded in this session.</div>
  83. </div>
  84. </main>
  85. <!-- Detail Modal -->
  86. <div class="modal-overlay" *ngIf="selectedClaim" (click)="closeDetail()">
  87. <div class="modal-content" (click)="$event.stopPropagation()">
  88. <button class="close-btn" (click)="closeDetail()">
  89. <lucide-icon [name]="X" class="icon-small"></lucide-icon>
  90. </button>
  91. <div class="modal-header">
  92. <h2>Claim Audit Details</h2>
  93. <span class="claim-id">Transaction ID: {{ selectedClaim.id.substring(0,8) }}</span>
  94. </div>
  95. <div class="modal-body">
  96. <div class="audit-grid">
  97. <div class="receipt-audit" *ngIf="selectedClaim.extraction_data">
  98. <h3>Evidence Preview</h3>
  99. <div class="mock-receipt-view">
  100. <lucide-icon [name]="FileText" class="icon-large" style="margin-bottom: 1rem; color: var(--text-secondary)"></lucide-icon>
  101. <p>Medical Receipt Evidence</p>
  102. <p style="font-size: 0.8rem">Verified by OpenAI 4o-mini</p>
  103. </div>
  104. <div class="extraction-summary">
  105. <h4>AI Extracted Items:</h4>
  106. <ul>
  107. <li *ngFor="let item of selectedClaim.extraction_data.items">{{ item }}</li>
  108. </ul>
  109. </div>
  110. </div>
  111. <div class="receipt-audit" *ngIf="!selectedClaim.extraction_data" style="display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center;">
  112. <lucide-icon [name]="FileText" class="icon-large" style="margin-bottom: 1rem; color: var(--text-secondary); opacity: 0.5;"></lucide-icon>
  113. <h3 style="margin-bottom: 0.5rem; color: var(--text-secondary)">Manual Entry</h3>
  114. <p style="font-size: 0.85rem; color: var(--text-secondary)">No AI assistant or receipt evidence was provided for this claim.</p>
  115. </div>
  116. <div class="financial-audit">
  117. <h3>Claim Metadata & Policy</h3>
  118. <div class="audit-item">
  119. <span class="label">Benefit Category:</span>
  120. <span class="val">{{ selectedClaim.extraction_data?.claim_category || 'General' }}</span>
  121. </div>
  122. <div class="audit-item">
  123. <span class="label">Treatment Type:</span>
  124. <span class="val">{{ selectedClaim.treatment_type }}</span>
  125. </div>
  126. <div class="audit-item">
  127. <span class="label">Cost Center:</span>
  128. <span class="val">{{ selectedClaim.cost_center }}</span>
  129. </div>
  130. <div class="audit-divider"></div>
  131. <div class="audit-item">
  132. <span class="label">Receipt Ref:</span>
  133. <span class="val">{{ selectedClaim.extraction_data?.receipt_ref_no || 'N/A' }}</span>
  134. </div>
  135. <div class="audit-item">
  136. <span class="label">Clinic Reg No:</span>
  137. <span class="val">{{ selectedClaim.extraction_data?.clinic_reg_no || 'N/A' }}</span>
  138. </div>
  139. <div class="audit-item">
  140. <span class="label">Diagnosis:</span>
  141. <span class="val" style="text-align: right; max-width: 60%;">{{ selectedClaim.extraction_data?.diagnosis_brief || 'Manual Entry' }}</span>
  142. </div>
  143. <div class="audit-divider"></div>
  144. <div class="audit-item">
  145. <span class="label">Gross Spent:</span>
  146. <span class="val">RM {{ selectedClaim.amount_spent | number:'1.2-2' }}</span>
  147. </div>
  148. <div class="audit-item">
  149. <span class="label">Policy Ceiling:</span>
  150. <span class="val">{{ selectedClaim.amount_claimed < selectedClaim.amount_spent ? 'Capped' : 'N/A' }}</span>
  151. </div>
  152. <div class="audit-item" *ngIf="selectedClaim.amount_claimed < selectedClaim.amount_spent">
  153. <span class="label">Deduction:</span>
  154. <span class="val" style="color: #ef4444">- RM {{ (selectedClaim.amount_spent - selectedClaim.amount_claimed) | number:'1.2-2' }}</span>
  155. </div>
  156. <div class="audit-item total">
  157. <span class="label">Final Payout:</span>
  158. <span class="val">RM {{ selectedClaim.amount_claimed | number:'1.2-2' }}</span>
  159. </div>
  160. <div *ngIf="selectedClaim.extraction_data">
  161. <div class="ai-confidence-box">
  162. <span class="label">AI Confidence Score</span>
  163. <div class="conf-bar">
  164. <div class="conf-fill" [style.width.%]="selectedClaim.extraction_data.confidence_score * 100"></div>
  165. </div>
  166. <span class="conf-val">{{ (selectedClaim.extraction_data.confidence_score * 100).toFixed(1) }}% Match</span>
  167. </div>
  168. <div class="ai-reasoning-summary" style="margin-top: 1.5rem; padding-top: 1.5rem; border-top: 1px solid var(--border-color)">
  169. <h4 style="font-size: 0.9rem; margin-bottom: 0.5rem">AI Reasoning:</h4>
  170. <p style="font-size: 0.85rem; color: var(--text-secondary); font-style: italic">"{{ selectedClaim.extraction_data.ai_reasoning }}"</p>
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. </div>
  176. </div>
  177. </div>
  178. </div>