{{ __('pdf.report_title') }} - {{ $client['name'] }}

{{ __('pdf.iride_digital') }} | {{ $date }}
{{ $overallScore }}%

{{ __('pdf.overall_score') }}

{{ __('pdf.score_based_on', ['pages' => $totalPagesNotAction, 'actions' => $totalPagesAction ? __('pdf.with_actions', ['count' => $totalPagesAction]) : '']) }} @if($overallScore >= 95) {{ __('pdf.score_description_excellent') }} @elseif($overallScore >= 75) {{ __('pdf.score_description_good') }} @elseif($overallScore >= 50) {{ __('pdf.score_description_moderate') }} @else {{ __('pdf.score_description_poor') }} @endif

{{ $wcagLevel }}
{{ __('pdf.pages_analyzed') }}
{{ $totalPagesNotAction }}
{{ __('pdf.url_verified') }}
@if($totalPagesAction > 0)
{{ __('pdf.actions_analyzed') }}
{{ $totalPagesAction }}
@endif
{{ __('pdf.relevant_issues') }}
{{ $totalIssues - $totalErrors['negligible'] }}
{{ __('pdf.severity.high') }}{{ $totalErrors['high'] }} {{ __('pdf.severity.medium') }}{{ $totalErrors['medium'] }} {{ __('pdf.severity.low') }}{{ $totalErrors['low'] }}
{{ __('pdf.negligible_issues') }}
{{ $totalErrors['negligible'] }}
{{ __('pdf.severity.negligible') }}

{{ __('pdf.toc.title') }}

  1. {{ __('pdf.toc.executive_summary') }}
  2. {{ __('pdf.toc.methodology') }}
  3. {{ __('pdf.toc.page_results') }}
  4. @if($totalPagesNotAction > 1)
  5. {{ __('pdf.toc.common_errors') }}
  6. @endif
  7. {{ __('pdf.toc.main_issues') }}
  8. {{ __('pdf.toc.wcag_compliance') }}
  9. {{ __('pdf.toc.final_recommendations') }}

{{ __('pdf.toc.methodology') }}

{{ __('pdf.methodology.intro') }}

{{ __('pdf.methodology.scoring_intro') }}

{{ __('pdf.methodology.formula_title') }}

{!! __('pdf.methodology.formula_intro', ['strong' => ''.__('pdf.methodology.formula_strong').'']) !!}

{{ __('pdf.methodology.formula_weighted') }}
{{ __('pdf.methodology.formula_density') }}
{{ __('pdf.methodology.formula_base') }}
{{ __('pdf.methodology.formula_final') }}

{{ __('pdf.methodology.penalties_title') }}

{{ __('pdf.methodology.penalties_examples') }}

{{ __('pdf.methodology.advantages_intro') }}

{{ __('pdf.methodology.conclusion') }}

{{ __('pdf.toc.page_results') }}

@foreach($pagesData as $page) @php // Prepara i dati per il grafico circolare $totalErrors = $page['errors']['high'] + $page['errors']['medium'] + $page['errors']['low']; $scorePercentage = $page['score']; // Calcola gli angoli per il grafico circolare (conic-gradient) $highPercentage = $totalErrors > 0 ? ($page['errors']['high'] / $totalErrors) * (100 - $scorePercentage) : 0; $mediumPercentage = $totalErrors > 0 ? ($page['errors']['medium'] / $totalErrors) * (100 - $scorePercentage) : 0; $lowPercentage = $totalErrors > 0 ? ($page['errors']['low'] / $totalErrors) * (100 - $scorePercentage) : 0; $highEnd = $highPercentage * 3.6; // converti in gradi $mediumEnd = $highEnd + ($mediumPercentage * 3.6); $lowEnd = $mediumEnd + ($lowPercentage * 3.6); // Prepara i dati dei dispositivi if (!isset($page['deviceData'])) { $page['deviceData'] = [ 'desktop' => [ 'errors' => [ 'high' => $page['errors']['high'], 'medium' => $page['errors']['medium'], 'low' => $page['errors']['low'], 'negligible' => $page['errors']['negligible'] ] ] ]; } $devices = array_keys($page['deviceData']); $deviceIcons = [ 'desktop' => 'fas fa-desktop', 'tablet' => 'fas fa-tablet-alt', 'mobile' => 'fas fa-mobile-alt' ]; // Calcola i totali $totals = ['high' => 0, 'medium' => 0, 'low' => 0, 'negligible' => 0]; foreach($page['deviceData'] as $deviceData) { foreach($totals as $severity => &$total) { $total += $deviceData['errors'][$severity]; } } @endphp
{{ $scorePercentage }}%
@if($page['isPageBeforeActionLogin']) @else @endif {{ $page['name'] }}
@if(isset($page['url']) && !empty($page['url']))
{{ $page['url'] }}
@endif
@foreach($devices as $device) @endforeach
{{ __('pdf.page_results.severity_high') }} {{ __('pdf.page_results.severity_medium') }} {{ __('pdf.page_results.severity_low') }} {{ __('pdf.page_results.severity_negligible') }}
{{ $page['deviceData'][$device]['errors']['high'] }} {{ $page['deviceData'][$device]['errors']['medium'] }} {{ $page['deviceData'][$device]['errors']['low'] }} {{ $page['deviceData'][$device]['errors']['negligible'] }}
{{ __('pdf.page_results.total') }} {{ $totals['high'] }} {{ $totals['medium'] }} {{ $totals['low'] }} {{ $totals['negligible'] }}
@if((isset($page['actions']) && !empty($page['actions'])) || (isset($page['action']) && !empty($page['action'])))
{{ __('pdf.page_results.actions') }}
@if(isset($page['actions']) && !empty($page['actions'])) @foreach($page['actions'] as $action) @endforeach @elseif(isset($page['action']) && !empty($page['action'])) @endif
@if (in_array('desktop', $action['devices'])) @else @endif   @if (in_array('mobile', $action['devices'])) @else @endif @if ($hasLoginAction)   @if (strstr($action['before_scan_action'],'login')) @else @endif @endif {{ $action['metadata']['display_name'] ?? $action['metadata']['name'] ?? $action['name'] }}
{{ $page['actionMetadata']['display_name'] ?? $page['actionMetadata']['name'] ?? $page['action'] }}
@endif

{{ __('pdf.page_results.main_errors') }}

@if(count($page['groupedIssues']) > 0)
    @php // Riordina gli errori per gravità e occorrenze prima di visualizzarli // Questo garantisce l'ordinamento corretto anche per dati dal database $sortedIssues = $page['groupedIssues']; uasort($sortedIssues, function($a, $b) { // Prima per gravità $severityOrder = [ 'alta' => 1, 'high' => 1, 'media' => 2, 'medium' => 2, 'bassa' => 3, 'low' => 3, 'trascurabile' => 4, 'negligible' => 4 ]; $aSeverity = strtolower($a['severity'] ?? 'bassa'); $bSeverity = strtolower($b['severity'] ?? 'bassa'); $aOrder = isset($severityOrder[$aSeverity]) ? $severityOrder[$aSeverity] : 5; $bOrder = isset($severityOrder[$bSeverity]) ? $severityOrder[$bSeverity] : 5; if ($aOrder !== $bOrder) { return $aOrder <=> $bOrder; } // Poi per conteggio (dal più frequente al meno frequente) return ($b['count'] ?? 0) <=> ($a['count'] ?? 0); }); $displayCount = min(8, count($sortedIssues)); $remainingCount = count($sortedIssues) - $displayCount; @endphp @foreach(array_slice($sortedIssues, 0, $displayCount, true) as $issue => $data) @php $severityLower = strtolower($data['severity']); $severityClass = 'error-low'; if (strpos($severityLower, 'alta') !== false || strpos($severityLower, 'high') !== false) { $severityClass = 'error-high'; } elseif (strpos($severityLower, 'media') !== false || strpos($severityLower, 'medium') !== false) { $severityClass = 'error-medium'; } elseif (strpos($severityLower, 'bassa') !== false || strpos($severityLower, 'low') !== false) { $severityClass = 'error-low'; } elseif (strpos($severityLower, 'trascurabile') !== false || strpos($severityLower, 'negligible') !== false) { $severityClass = 'error-negligible'; } @endphp
  • {{ stripslashes(html_entity_decode($data['detail'])) }} @if($data['count'] > 1) x{{ $data['count'] }} @endif
  • @endforeach @if($remainingCount > 0)
  • {{ __('pdf.page_results.more_errors', ['count' => $remainingCount]) }}
  • @endif
@else

{{ __('pdf.page_results.no_issues') }}

@endif
@endforeach
@if($totalPagesNotAction > 1)

{{ __('pdf.common_errors.title') }}

@if(count($commonErrors) > 0) @php // Calcola il numero di errori comuni e la somma delle occorrenze $numeroErroriComuni = count($commonErrors); $sommaOccorrenzeErroriComuni = 0; foreach($commonErrors as $error) { $sommaOccorrenzeErroriComuni += (int)($error['totalOccurrences'] ?? 0); } @endphp

@if($hasExcludedUrls ?? false) {!! __('pdf.common_errors.intro_excluded', ['types' => $numeroErroriComuni, 'occurrences' => $sommaOccorrenzeErroriComuni]) !!}
{!! __('pdf.common_errors.note_excluded') !!}
@else {!! __('pdf.common_errors.intro_all', ['types' => $numeroErroriComuni, 'pages' => $totalPagesNotAction, 'occurrences' => $sommaOccorrenzeErroriComuni]) !!}
@endif @if ($numeroErroriComuni * $totalPagesNotAction != $sommaOccorrenzeErroriComuni) {{ __('pdf.common_errors.note_mobile') }} @endif

@if($improvementPercentage > 0)

{!! __('pdf.common_errors.improvement', ['current' => $overallScore, 'potential' => $potentialScore, 'improvement' => $improvementPercentage]) !!}

@else

{!! __('pdf.common_errors.no_improvement', ['score' => $overallScore]) !!}

@endif
@php $errorIndex = 1; @endphp @foreach($commonErrors as $error) @php $errorIndex++; @endphp @endforeach
{{ __('pdf.common_errors.table_number') }} {{ __('pdf.common_errors.table_error_type') }} {{ __('pdf.common_errors.table_severity') }} {{ __('pdf.common_errors.table_snippet') }}
{{ $errorIndex }} {{ $error['errorType'] }} {{ $error['severity'] }} {{ $error['snippet'] }}
@else
{{ __('pdf.common_errors.no_errors_found', ['pages' => $totalPagesNotAction]) }}
@endif
@endif

{{ __('pdf.main_issues.title') }}

@foreach($categoryPercentages as $category => $data) @php // Normalizza il nome della categoria per generare una classe CSS $normalizedCategory = preg_replace('/[^a-z0-9]/', '', strtolower($category)); @endphp @endforeach
{{ __('pdf.main_issues.table_category') }} {{ __('pdf.main_issues.table_percentage') }} {{ __('pdf.main_issues.table_issues') }} {{ __('pdf.main_issues.table_distribution') }}
{{ $category }} {{ $data['percentage'] }}% {{ $data['count'] }}
@if($data['gravityPercentages']['high'] > 0)
@endif @if($data['gravityPercentages']['medium'] > 0)
@endif @if($data['gravityPercentages']['low'] > 0)
@endif @if($data['gravityPercentages']['negligible'] > 0)
@endif
@foreach($categoryPercentages as $category => $data) @php // Normalizza il nome della categoria per generare una classe CSS $normalizedCategory = preg_replace('/[^a-z0-9]/', '', strtolower($category)); // Verifica se ci sono problemi per questa categoria $categoryIssuesWithCount = isset($categoryToIssuesMap[$category]) ? $categoryToIssuesMap[$category] : []; // Aggiorniamo la logica per ordinare i problemi per gravità usort($categoryIssuesWithCount, function($a, $b) { // Ordine di priorità per gravità $severityOrder = [ 'alta' => 1, 'high' => 1, 'media' => 2, 'medium' => 2, 'bassa' => 3, 'low' => 3, 'trascurabile' => 4, 'negligible' => 4 ]; // Ottieni la gravità (converti in lowercase per confronto case-insensitive) $aSeverity = isset($a['severity']) ? strtolower($a['severity']) : 'bassa'; $bSeverity = isset($b['severity']) ? strtolower($b['severity']) : 'bassa'; // Assegna un valore di ordinamento predefinito se non trovato $aOrder = isset($severityOrder[$aSeverity]) ? $severityOrder[$aSeverity] : 3; $bOrder = isset($severityOrder[$bSeverity]) ? $severityOrder[$bSeverity] : 3; // Ordina prima per gravità if ($aOrder !== $bOrder) { return $aOrder <=> $bOrder; } // Se stessa gravità, ordina per numero di occorrenze (decrescente) $aCount = isset($a['count']) ? $a['count'] : 0; $bCount = isset($b['count']) ? $b['count'] : 0; return $bCount <=> $aCount; }); // Determiniamo una classe di gravità per la categoria (per elementi non categorizzati) $defaultGravityClass = 'low'; if ($data['gravityStats']['high'] > 0) { $defaultGravityClass = 'high'; } elseif ($data['gravityStats']['medium'] > 0) { $defaultGravityClass = 'medium'; } // Limita la visualizzazione ai primi 5 errori $displayCount = min(5, count($categoryIssuesWithCount)); $remainingCount = count($categoryIssuesWithCount) - $displayCount; @endphp
{{ $category }}
    @if(count($categoryIssuesWithCount) > 0) @foreach(array_slice($categoryIssuesWithCount, 0, $displayCount) as $issueData) @php $issue = is_array($issueData) ? $issueData['detail'] : $issueData; $count = is_array($issueData) && isset($issueData['count']) ? $issueData['count'] : null; // Ottieni la gravità dell'elemento corrente $issueSeverity = is_array($issueData) && isset($issueData['severity']) ? strtolower($issueData['severity']) : 'bassa'; // Determina la classe di stile basata sulla gravità effettiva $issueGravityClass = $defaultGravityClass; // default if (strpos($issueSeverity, 'alta') !== false || strpos($issueSeverity, 'high') !== false) { $issueGravityClass = 'high'; } elseif (strpos($issueSeverity, 'media') !== false || strpos($issueSeverity, 'medium') !== false) { $issueGravityClass = 'medium'; } elseif (strpos($issueSeverity, 'bassa') !== false || strpos($issueSeverity, 'low') !== false) { $issueGravityClass = 'low'; } elseif (strpos($issueSeverity, 'trascurabile') !== false || strpos($issueSeverity, 'negligible') !== false) { $issueGravityClass = 'negligible'; } @endphp
  • {{ stripslashes(html_entity_decode($issue)) }} @if($count) ({{ __('pdf.category_details.occurrences', ['count' => $count]) }}) @endif
  • @endforeach @if($remainingCount > 0)
  • {{ __('pdf.category_details.more_errors', ['count' => $remainingCount]) }}
  • @endif @else
  • {{ __('pdf.category_details.no_errors') }}
  • @endif
@endforeach

{{ __('pdf.wcag_compliance.title') }}

{{ __('pdf.wcag_compliance.intro') }}

@foreach($wcagViolations as $wcagCode => $wcagData) @endforeach
{{ __('pdf.wcag_compliance.table_guideline') }} {{ __('pdf.wcag_compliance.table_issues') }}
{{ $wcagCode }} @if(is_array($wcagData['wcag_reference']) && !empty($wcagData['wcag_reference'][0]['link'])) @elseif(!is_array($wcagData['wcag_reference']) && !empty($wcagData['wcag_reference'])) @endif {{ $wcagData['count'] }}
{{ __('pdf.wcag_compliance.success_criteria_violated') }}
{{ count($wcagViolations) }}/{{ $wcagTotal }}
{{ __('pdf.wcag_compliance.wcag_not_met') }}
{{ __('pdf.wcag_compliance.compliance_level') }}
@if($wcagTotal == 0) {{ __('pdf.wcag_compliance.level_na') }} @elseif(count($wcagViolations) / $wcagTotal == 0) {{ __('pdf.wcag_compliance.level_excellent') }} @elseif (count($wcagViolations) / $wcagTotal < 0.5) {{ __('pdf.wcag_compliance.level_partial') }} @else {{ __('pdf.wcag_compliance.level_insufficient') }} @endif

{{ __('pdf.wcag_compliance.evaluation_intro') }}: {{ __('pdf.wcag_compliance.evaluation_score', ['score' => $overallScore]) }} @if($wcagTotal == 0) {{ __('pdf.wcag_compliance.eval_na') }} @elseif(count($wcagViolations) / $wcagTotal == 0) {{ __('pdf.wcag_compliance.eval_full') }} @elseif (count($wcagViolations) / $wcagTotal < 0.3) {{ __('pdf.wcag_compliance.eval_partial_good') }} @elseif (count($wcagViolations) / $wcagTotal < 0.5) {{ __('pdf.wcag_compliance.eval_partial_fair') }} @elseif (count($wcagViolations) / $wcagTotal < 0.6) {{ __('pdf.wcag_compliance.eval_almost') }} @else {{ __('pdf.wcag_compliance.eval_poor') }} @endif

{{ __('pdf.final_recommendations.title') }}

{{ __('pdf.final_recommendations.intro', ['client' => $client['name']]) }}

{{ __('pdf.final_recommendations.recommended_approach') }}

  1. {{ __('pdf.final_recommendations.priority_1') }}
  2. @if(count($commonErrors) > 0)
  3. {{ __('pdf.final_recommendations.priority_2', ['count' => count($commonErrors), 'improvement' => $improvementPercentage]) }}
  4. @endif
  5. {{ __('pdf.final_recommendations.priority_3') }}
  6. {{ __('pdf.final_recommendations.priority_4') }}
  7. {{ __('pdf.final_recommendations.priority_5') }}
  8. {{ __('pdf.final_recommendations.priority_6') }}
  9. {{ __('pdf.final_recommendations.priority_7') }}

{{ __('pdf.final_recommendations.timeline_title') }}

@if(count($commonErrors) > 0) @endif
{{ __('pdf.final_recommendations.timeline_phase') }} {{ __('pdf.final_recommendations.timeline_priority') }} {{ __('pdf.final_recommendations.timeline_suggested') }}
{{ __('pdf.final_recommendations.phase_common_errors') }} {{ __('pdf.final_recommendations.priority_maximum') }} {{ __('pdf.final_recommendations.within_15_days') }}
{{ __('pdf.final_recommendations.phase_high_severity') }} {{ __('pdf.final_recommendations.priority_immediate') }} {{ __('pdf.final_recommendations.within_30_days') }}
{{ __('pdf.final_recommendations.phase_medium_severity') }} {{ __('pdf.final_recommendations.priority_high') }} {{ __('pdf.final_recommendations.within_60_days') }}
{{ __('pdf.final_recommendations.phase_low_severity') }} {{ __('pdf.final_recommendations.priority_medium') }} {{ __('pdf.final_recommendations.within_90_days') }}
{{ __('pdf.final_recommendations.phase_monitoring') }} {{ __('pdf.final_recommendations.priority_high') }} {{ __('pdf.final_recommendations.within_45_days') }}
{{ __('pdf.final_recommendations.phase_followup') }} {{ __('pdf.final_recommendations.priority_high') }} {{ __('pdf.final_recommendations.after_90_days') }}