@php use App\Models\Cases;use App\Models\CasesInfo\Stage;use App\Services\Dashboard\DashboardService; @endphp
@inject('widgetHelper', '\App\Helpers\OnDemandReportWidgetHelper')
@include('reports.on-demand.templates.incl_style')
TLP AMBER CISO
EXECUTIVE REPORT
{{ $isLatam?'Sobre este reporte':'About this report' }}
{{ $isLatam?'Este informe a pedido proporciona información de nivel ejecutivo sobre el estado de la ciberseguridad para su organización, incluidos los principales indicadores de seguridad y rendimiento.':
'This on-demand report provides executive level information as of the state of Cybersecurity for your organization including top security indicators and performance.' }}
RISK
Actual Risk
{!! \App\Widgets\Dashboard\CurrentActualRiskWidget::renderBody() !!}
Accepted Risk
{!! \App\Widgets\Dashboard\CurrentAcceptedRiskWidget::renderBody() !!}
Confidence
{!! \App\Models\ServiceGroup::getRiskConfidence() !!}
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>529])
VULNERABILITY
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>179])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>520])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>528])
THREATS
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>515])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>518])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>521])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>522])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>523])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>524])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>530])
OPERATIONAL
Total Number of Cases
| Open |
{{ Cases::countByStatus([Cases::STATUS_OPEN]) }} |
| Answered |
{{ Cases::countByStatus([Cases::STATUS_INFORMATIVE, Cases::STATUS_SUSPENDED]) }} |
| Closed |
{{ Cases::countByStatus([Cases::STATUS_CLOSED]) }} |
Notable Events
| Notable Event Type |
How Many # |
@forelse($report->data['notableTypes'] ?? [] as $type => $qty)
| {{ $type }} |
{{ $qty }} |
@empty
|
N/A |
@endforelse
Total Remediation Cases by Stage
@php
$groupedByStageAndQueueCases=$report->data['groupedByStageAndQueueCases'] ?? [];
@endphp
|
@php
$rStages=\App\Models\CasesInfo\Stage::getRemediationStage();
$queues = \App\Models\Queue::getSkywatchList();
@endphp
@foreach($rStages as $stage)
{{ $stage->name }} |
@endforeach
@php
$totals = array_fill(0, count($rStages), 0);
@endphp
@foreach($groupedByStageAndQueueCases as $queue=>$casesByStages)
@if(isset($queues[$queue]))
only skywatch queues
| {{ $queues[$queue] }} |
@foreach($rStages as $index => $stage)
@php
$caseCount = $casesByStages[$stage->name] ?? 0;
$totals[$index] += $caseCount;
@endphp
{{ $caseCount }}
|
@endforeach
@endif
@endforeach
| Total |
@foreach($totals as $total)
{{ $total }} |
@endforeach
Operational Metrics per Queue Over Time
| Divisions |
AVG. Time To Resolve, H |
AVG. Time To Respond, H |
@php
$timeByQueue=$report->data['timeByQueue'] ?? []
@endphp
@foreach(\App\Models\Queue::getSkywatchList() as $qId=>$qName)
| {{ $qName }} |
{{ time_to_h(isset($timeByQueue[$qId])?(isset($timeByQueue[$qId]['time_to_resolve'])?$timeByQueue[$qId]['time_to_resolve']:0):0) }} |
{{ time_to_h(isset($timeByQueue[$qId])?(isset($timeByQueue[$qId]['time_to_respond'])?$timeByQueue[$qId]['time_to_respond']:0):0) }} |
@endforeach
@php
$groupedStages = Stage::query()
->select('id', 'group', 'case_type_id')
->groupBy(['case_type_id'])
->with('caseType')
->get();
function formatSecondsBlade($seconds): string
{
$seconds = (int)$seconds;
$d = floor($seconds / 86400);
$seconds %= 86400;
$h = floor($seconds / 3600);
$seconds %= 3600;
$m = floor($seconds / 60);
$s = $seconds % 60;
return "{$d}d {$h}h {$m}m {$s}s";
}
@endphp
@foreach($groupedStages as $stage)
{{$stage->group}}
@php
$additionalDashboardData = DashboardService::init()->handle($stage->case_type_id);
$stages = $additionalDashboardData['stages'];
$averageTimeRemediatePerStage = $additionalDashboardData['averageTimeRemediatePerStage'];
$countCasesPerStage = $additionalDashboardData['countCasesPerStage'];
@endphp
Average Time to Remediate
| Stages |
How Many # |
@php
$lastStage = $stages->last();
@endphp
@foreach($stages as $stage)
@if($stage->id !== $lastStage->id)
| {!! $stage->name !!} |
{{ formatSecondsBlade($averageTimeRemediatePerStage->get($stage->id)) }} |
@endif
@endforeach
Workload
| Stages |
How Many # |
@php
$lastStage = $stages->last();
@endphp
@foreach($stages as $stage)
| {!! $stage->name !!} |
{{ $countCasesPerStage->get($stage->id) ?? 0 }} |
@endforeach
@endforeach
DAILYBRIEF
Active High-Severity Items
@php
$caseAccountStatistic = $report->data['caseAccountStatistic'] ?? [];
$openCaseCountStatistic = $caseAccountStatistic['open_cases_count'] ?? 0;
$countOpenMssIntCases = $report->data['countOpenMssIntCases'] ?? 0;
if($countOpenMssIntCases - $openCaseCountStatistic > 0){
$class = 'red-color';
$arrow = '↑';
} elseif ($countOpenMssIntCases - $openCaseCountStatistic < 0) {
$class = 'green-color';
$arrow = '↓';
} else {
$class = 'grey-color';
$arrow = '';
}
@endphp
{{$countOpenMssIntCases}}
{!! $arrow !!}
{{ ($countOpenMssIntCases - $openCaseCountStatistic) > 0 ? '+' : '' }}{{$countOpenMssIntCases - $openCaseCountStatistic}}
Executive Action Required
@php
$executiveActionRequiredCaseIds = $report->data['executiveActionRequiredCaseIds'] ?? [];
@endphp
@if(!empty($executiveActionRequiredCaseIds))
▲
{{ count($executiveActionRequiredCaseIds) }}
{{ count($executiveActionRequiredCaseIds) === 1 ? 'item' : 'items' }}
pending executive awareness or decision
@else
✓
No executive action required today
@endif
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>680])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>681])
@include('reports.on-demand.templates.incl_splunk_widget',['widget_id'=>682])
| Case # |
Service |
Priority |
Hours |
Status |
@foreach($report->data['cases'] ?? [] as $case)
| {{ $case['id'] . ' ' . $case['name'] }} |
{{ $case['service']['short_name'] ?? '' }} |
{{ \App\Models\Cases::getPriorityName($case['priority']) ?? '' }} |
{{ \App\Models\Cases::getTimeCase($case['id']) ?? '' }} |
{{ \App\Models\Cases::getStatusName($case['status']) ?? '' }} |
@endforeach
| Title |
Categories |
Industries |
@foreach($report->data['news']['data'] ?? [] as $new)
| {{ $new['title']}} |
{{ implode(', ', array_column($new['categories'] ?? [], 'name')) }} |
{{ implode(', ', array_column($new['industries'] ?? [], 'name')) }} |
@endforeach
= Limited disclosure, restricted to
participants’ organizations.
Sources may use TLP:AMBER when information requires support to be effectively acted upon, yet
carries risks to privacy, reputation, or operations if shared outside of the organizations involved.
Recipients may only share TLP:AMBER information with members of their own organization, and
with clients or customers who need to know the information to protect themselves or prevent
further harm. Sources are at liberty to specify additional intended limits of the sharing: these
must be adhered to.