Files
Aegis/backend/app/templates/reports/executive_summary.html
Kitos 31e116b4ba
Some checks failed
Aegis CI / lint-and-test (push) Has been cancelled
feat(phase-37): timer pause/resume + professional reporting engine
Pause/Resume timer:
- Add paused_at, red_paused_seconds, blue_paused_seconds fields to Test model
- Add pause_timer/resume_timer workflow functions with accumulated pause tracking
- Auto-resume on phase submit; subtract paused time from worklog duration
- Add POST /tests/{id}/pause-timer and resume-timer endpoints
- Update LiveTimer component with pause/resume button and paused visual state
- Wire pause/resume mutations through TestDetailPage and TestDetailHeader

Professional Reporting Engine - Fase 2:
- Add ReportEngine service with Jinja2 HTML rendering, WeasyPrint PDF, and docxtpl DOCX
- Add corporate CSS stylesheet with cover page, data tables, stats grid, findings
- Create purple_campaign, coverage_report, and executive_summary HTML templates
- Add report_generation_service collecting domain data for each report type
- Add professional_reports router: GET /reports/generate/purple-campaign/{id}, coverage-summary, executive-summary
- Add analytics router with flat JSON endpoints for PowerBI: /coverage, /tests, /trends, /operators
- Add advanced_metrics router: /coverage-by-tactic, /never-tested, /avg-validation-time, /detection-rate-trend
- Add weasyprint and docxtpl to requirements.txt
- Add REPORT_TEMPLATES_DIR, REPORT_OUTPUT_DIR, COMPANY_NAME, COMPANY_LOGO_PATH to config
2026-02-17 17:20:45 +01:00

75 lines
2.3 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="styles/report.css">
<title>Executive Summary — {{ company_name }}</title>
</head>
<body>
<section class="cover-page">
<img src="assets/logo.png" class="logo" alt="Logo">
<h1>Executive Security Summary</h1>
<h2>{{ company_name }}</h2>
<p class="date">{{ generated_at }}</p>
</section>
<section>
<h2>Security Posture Overview</h2>
<div class="stats-grid">
<div class="stat">
<span class="number">{{ org_score.overall | default(0) }}%</span>
<span class="label">Overall Score</span>
</div>
<div class="stat">
<span class="number">{{ total_tests }}</span>
<span class="label">Tests Conducted</span>
</div>
<div class="stat">
<span class="number">{{ active_campaigns }}</span>
<span class="label">Active Campaigns</span>
</div>
</div>
</section>
<section>
<h2>Key Metrics</h2>
<table class="data-table">
<thead>
<tr><th>Metric</th><th>Value</th></tr>
</thead>
<tbody>
<tr><td>Techniques validated</td><td>{{ summary.validated }} / {{ summary.total_techniques }}</td></tr>
<tr><td>Detection rate</td><td>{{ detection_rate }}%</td></tr>
<tr><td>Tests this quarter</td><td>{{ tests_this_quarter }}</td></tr>
<tr><td>Open remediations</td><td>{{ open_remediations }}</td></tr>
</tbody>
</table>
</section>
<section>
<h2>Top Gaps</h2>
{% if top_gaps %}
<table class="data-table">
<thead>
<tr><th>Tactic</th><th>Coverage</th></tr>
</thead>
<tbody>
{% for gap in top_gaps %}
<tr>
<td>{{ gap.tactic }}</td>
<td>{{ gap.coverage_pct }}%</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>No significant gaps identified.</p>
{% endif %}
</section>
<footer>
<p>{{ company_name }} — Confidential</p>
</footer>
</body>
</html>