📊 Heatmap Metrics Analysis Report

Generated on {{ generated_date }} {% if project_group_name %}
Project Group: {{ project_group_name }} {% endif %} {% if analysis.available_files and analysis.available_files|length == 1 %}
Analyzing: {{ analysis.available_files[0] }} {% elif analysis.available_files and analysis.available_files|length > 1 %}
Analyzing {{ analysis.available_files|length }} files (combined data) {% endif %}
{% if analysis.available_years %}
{% endif %}
Total Files
{{ analysis.summary.total_files }}
Total Records
{{ analysis.summary.total_rows | default('N/A') }}
Unique Projects
{{ analysis.summary.unique_projects | default('N/A') }}
Total Scans
{{ analysis.summary.total_scans | default('N/A') }}
Successful Scans
{{ analysis.summary.successful_scans | default('N/A') }}
Failed Scans
{{ analysis.summary.failed_scans | default('N/A') }}
Success Rate
{% if analysis.summary.total_scans and analysis.summary.total_scans > 0 %} {{ "%.1f" | format((analysis.summary.successful_scans / analysis.summary.total_scans * 100)) }}% {% else %} N/A {% endif %}
🔥 Busiest Hours
{% if analysis.summary.busiest_hour is not none %} {{ "%02d:00" | format(analysis.summary.busiest_hour) }}-{{ "%02d:00" | format(analysis.summary.busiest_hour_end) }} {% else %} N/A {% endif %}
{% if analysis.summary.busiest_count %} {{ analysis.summary.busiest_count }} scans ({{ "%.1f" | format(analysis.summary.busiest_percentage) }}%) {% else %} N/A {% endif %}
😴 Quietest Hours
{% if analysis.summary.quietest_hour is not none %} {{ "%02d:00" | format(analysis.summary.quietest_hour) }}-{{ "%02d:00" | format(analysis.summary.quietest_hour_end) }} {% else %} N/A {% endif %}
{% if analysis.summary.quietest_count %} {{ analysis.summary.quietest_count }} scans ({{ "%.1f" | format(analysis.summary.quietest_percentage) }}%) {% else %} N/A {% endif %}
{% if analysis.aggregated %}

🎯 Black Duck Scan Overview

{% if analysis.aggregated.scan_types %} {% set total_scans = analysis.aggregated.scan_types.values()|sum %}

🔍 Scan Types Breakdown

{% for scan_type, count in analysis.aggregated.scan_types.items() %} {% set percentage = ((count / total_scans) * 100)|round(1) if total_scans > 0 else 0 %}
{{ scan_type }} {{ count }} ({{ percentage }}%)
{% endfor %}
{% endif %}

Top Projects

{% if analysis.aggregated.projects_by_time_block %}

🕐 Top Projects by Time Block (3-hour intervals)

{% endif %}
{% endif %}

📈 Time Series Trends

{% if chart_data %}

Scan Type Evolution Over Time

{% for scan_type in analysis.aggregated.scan_types.keys() %} {% endfor %}
{% else %}

No chart data available

{% endif %}

⏱️ Capacity Usage – Scans Per Hour (SPH)

Loading SPH data…