@php
/**
* Note d'analyse PDF d'un appel d'offres (Prompt 29 §3). Données pré-normalisées et nettoyées
* (PdfText) par App\Support\TenderAnalysisReport — la vue ne fait que mettre en page.
* Charte de l'installation : teintes neutres, la couleur primaire venant des réglages.
*/
$logo = \App\Support\Identite::cheminLogo();
$d = $report['decision'];
@endphp
{{-- Pied de page charté (répété en bas de chaque page). Le numéro « Page X / Y » est dessiné par le
script text/php ci-dessous (TOTAL réel des pages, Prompt 30 §4). --}}
{{-- Pagination fiable « Page X / Y » : DomPDF substitue {PAGE_NUM}/{PAGE_COUNT} au rendu final
(isPhpEnabled activé côté contrôleur). Remplace counter(pages) qui affichait « / 0 ». --}}
{{-- (A) En-tête : logo + société à gauche, titre à droite --}}
@if ($logo !== null)
 |
@endif
{{ $company['name'] }}
@if ($company['phone']){{ $company['phone'] }}@endif@if ($company['email']) · {{ $company['email'] }}@endif
|
|
Note d'analyse
Appel d'offres@if ($report['reference']) {{ $report['reference'] }}@endif
Analyse du : {{ $generatedAt->format('d/m/Y') }}
|
@if ($report['object'])
{{ $report['object'] }}
@endif
{{-- Bandeau « délai dépassé » (Prompt 14 §C) : la date limite est antérieure à la date d'analyse --}}
@if ($report['deposit_overdue'])
Délai dépassé — cette analyse est postérieure à l'échéance de remise des plis.
@endif
{{-- Encadré GO / NO-GO (couleur selon faisabilité) — verdict tranché + recommandation --}}
Faisabilité : {{ $d['label'] }}
@if ($d['recommendation'])
{{ $d['recommendation'] }}
@endif
@if (count($d['reasons']))
@foreach ($d['reasons'] as $reason)- {{ $reason }}
@endforeach
@endif
@if ($d['condition'])
Condition décisive : {{ $d['condition'] }}
@endif
@if (count($d['eligibility']))
Éligibilité (critères éliminatoires — à vérifier en priorité)
@foreach ($d['eligibility'] as $line)- {{ $line }}
@endforeach
@endif
{{-- Éligibilité & pièces qualifiantes (Prompt 30 §3) — section DÉCISIVE, juste après le GO/NO-GO --}}
Éligibilité & pièces qualifiantes (décisif pour le GO / NO-GO)
| Condition | Ce qui est exigé | Détail (nombre / ancienneté / seuils) | Élim. | Adéquation |
@forelse ($report['eligibility_conditions'] as $i => $c)
| {{ $c['category'] }} |
{{ $c['requirement'] }} |
{{ $c['details'] }} |
@if ($c['eliminatory'])Oui@else Non @endif |
{{ $c['status'] }} |
@empty
| Conditions d'éligibilité non détaillées dans le dossier — à vérifier (attestations de référence, agréments, CNSS / fiscal / RC, capacités juridiques-techniques-financières art. 43). |
@endforelse
{{-- Identité --}}
Identité de l'appel d'offres
@foreach (array_chunk($report['identity'], 2) as $pair)
@foreach ($pair as $cell)
| {{ $cell['label'] }} | {{ $cell['value'] }} |
@endforeach
@if (count($pair) === 1) | | @endif
@endforeach
{{-- Analyse prix & règle d'attribution (Prompt 14 §B) — indicatif, à valider --}}
@php($pricing = $report['pricing'])
Analyse prix & attribution (indicatif, à valider)
@if ($pricing['has_data'])
| Prix de référence (HT) | {{ $pricing['reference_ht'] ?? '—' }}@if ($pricing['tax_assumed']) (TVA 20 % présumée)@endif |
Prix de référence (TTC) | {{ $pricing['reference_ttc'] ?? '—' }} |
| Coût unitaire | {{ $pricing['unit'] ?? '—' }} |
Fourchette conseillée (HT) | {{ $pricing['advised_range'] ?? '—' }} |
| Prix proposé | {{ $pricing['proposed_price'] ?? 'à compléter' }} |
Marge estimée | {{ $pricing['margin'] ?? '—' }}@if ($pricing['margin'] && $pricing['direct_costs']) (coûts directs {{ $pricing['direct_costs'] }})@endif |
Règle d'attribution. {{ $pricing['award_rule'] }}
{{ $pricing['abnormally_low_note'] }}
@else
Estimation du marché non chiffrée dans le dossier — prix de référence et marge à établir manuellement.
@endif
{{-- Missions --}}
Missions / prestations
| Intitulé | Contenu | Durée (j) |
@forelse ($report['missions'] as $i => $m)
| {{ $m['label'] }} | {{ $m['description'] }} | {{ $m['duration_days'] }} |
@empty
| Aucune mission détaillée dans le dossier. |
@endforelse
{{-- Équipe --}}
Équipe demandée
| Profil | Nombre | Expérience | Diplôme |
@forelse ($report['team'] as $i => $t)
| {{ $t['profile'] }} | {{ $t['count'] }} | {{ $t['experience'] }} | {{ $t['diploma'] }} |
@empty
| Aucune équipe imposée par le dossier. |
@endforelse
{{-- Pièces par ENVELOPPE (Prompt 30 §4) : dossier administratif et technique, offre technique, offre financière --}}
@foreach ($report['pieces'] as $envelope)
{{ $envelope['envelope'] }}
@foreach ($envelope['subgroups'] as $group)
{{ $group['dossier'] }}
| Pièce | Description | Notée | Éliminatoire |
@forelse ($group['rows'] as $i => $p)
| {{ $p['name'] }} | {{ $p['description'] }} | {{ $p['scored'] }} | {{ $p['eliminatory'] }} |
@empty
| {{ $group['note'] ?? 'Aucune pièce détaillée par le dossier pour cette partie.' }} |
@endforelse
@endforeach
@endforeach
{{-- Grille d'évaluation --}}
Grille d'évaluation
| Critère | Sous-critère | Points | Document |
@forelse ($report['criteria']['rows'] as $i => $c)
| {{ $c['criterion'] }} | {{ $c['subcriterion'] }} | {{ $c['points'] }} | {{ $c['document'] }} |
@empty
| Grille non détaillée dans le dossier. |
@endforelse
@if ($report['criteria']['display_total'])
| Barème total | {{ $report['criteria']['display_total'] }} | @if ($report['criteria']['partial'])Barème annoncé retenu — somme extraite : {{ $report['criteria']['sum'] }}@elseif ($report['criteria']['total'])Barème annoncé@endif |
@endif
@if ($report['criteria']['partial'])
Barème annoncé ({{ $report['criteria']['total'] }}) retenu : il diffère de la somme des critères extraite ({{ $report['criteria']['sum'] }}). À vérifier sur le dossier — options de notation exclusives non additionnées, ou critère récapitulatif compté en double avec ses sous-critères.
@endif
{{-- Décomptes prévus --}}
Décomptes prévus (selon les modalités de règlement)
| Décompte | Durée (j) | Date de fin estimée | Montant |
@forelse ($report['decomptes'] as $i => $s)
| {{ $s['label'] }} | {{ $s['duration_days'] }} | {{ $s['end_date'] }} | {{ $s['amount'] }} |
@empty
| Échéancier non déterminé (missions ou montant manquants). |
@endforelse
{{-- Exigences par dossier (adéquation colorée) --}}
Exigences par dossier — adéquation
| Dossier | Exigence | Adéquation |
@forelse ($d['requirements'] as $i => $r)
| {{ $r['dossier'] }} | {{ $r['item'] }} | {{ $r['status'] }} |
@empty
| Aucune exigence particulière relevée. |
@endforelse
{{-- Points de vigilance (niveau coloré) --}}
Points de vigilance
| Point | Niveau |
@forelse ($d['vigilance'] as $i => $v)
| {{ $v['label'] }} | {{ $v['severity'] }} |
@empty
| Aucun point de vigilance particulier. |
@endforelse
{{-- Listes complémentaires --}}
@if (count($report['references']) || count($report['agrement']) || count($report['other']))
Compléments
@if (count($report['references']))
Références exigées
@foreach ($report['references'] as $r)- {{ $r }}
@endforeach
@endif
@if (count($report['agrement']))
Agréments / qualifications
@foreach ($report['agrement'] as $r)- {{ $r }}
@endforeach
@endif
@if (count($report['other']))
Autres informations
@foreach ($report['other'] as $r)- {{ $r }}
@endforeach
@endif
@endif
@if (count($report['documents']))
Pièces analysées : {{ implode(', ', $report['documents']) }}.
@endif
Document d'aide à la décision — à valider par un responsable.