{{-- Questionnaire METIER d'un sous-traitant (electricien, chauffage/sanitaire). Rendu GENERIQUE : toute la structure vient de config/questionnaires-metier.php, lue via App\Services\Partenaires\SpecificationQuestionnaire. Ajouter un champ a la config l'affiche ici et le valide cote serveur, sans toucher a cette vue. Navigation entre etapes : reutilise le socle du formulaire partenaire (public/js/site.js::initFormulairePartenaireEtapes) — memes attributs data-*, donc NE PAS LES RENOMMER. Sans JavaScript, toutes les etapes restent visibles et le formulaire s'envoie d'un bloc. Cette page n'est pas dans la navigation du site : on y arrive par un lien personnalise. Elle n'est donc pas indexable (noindex pose ci-dessous). --}} @extends('layouts.site') @section('titre', 'Questionnaire '.$specification->libelle().' - Biome Constructions') @section('meta') {{-- Page atteinte par lien prive : jamais dans un index. --}} @endsection @section('contenu') @php $etapes = $specification->etapes(); $clesParEtape = $specification->clesParEtape(); $champsTous = $specification->champs(); // Valeurs a afficher : la saisie en cours (apres une erreur) prime sur // ce qui est deja enregistre. $valeur = function (string $cle) use ($reponses) { return old('reponses.'.$cle, $reponses[$cle] ?? null); }; // Valeurs courantes de TOUS les champs, calculees une fois : elles // servent a evaluer les conditions d'affichage cote serveur (le JS // reprend le relais ensuite). $valeursActuelles = []; foreach (array_keys($champsTous) as $cleChamp) { $valeursActuelles[$cleChamp] = $valeur($cleChamp); } $afficherErreurs = $errors->hasAny(array_map(fn ($c) => 'reponses.'.$c, array_keys($champsTous))); $afficherSucces = (bool) session('succes') && ! $afficherErreurs; // Premiere etape en erreur, pour rouvrir le formulaire au bon endroit. $etapeErreur = 1; foreach ($clesParEtape as $numero => $cles) { if ($errors->hasAny(array_map(fn ($c) => 'reponses.'.$c, $cles))) { $etapeErreur = $numero; break; } } // Styles reprises du formulaire partenaire, pour que les deux // formulaires publics se ressemblent. $bordure = fn (string $cle): string => $errors->has('reponses.'.$cle) ? '#D64545' : '#DCE3EC'; $styleChamp = fn (string $cle): string => 'width:100%;box-sizing:border-box;height:50px;border:1.5px solid '.$bordure($cle).';border-radius:9px;padding:0 14px;font-family:var(--police-texte);font-size:15px;outline:none;color:var(--couleur-texte-titre-carte);background:#fff;'; $styleErreur = 'display:block;color:#D64545;font-size:12px;margin-top:5px;'; $styleLabel = 'display:block;font-family:var(--police-texte);font-size:14px;font-weight:600;color:var(--couleur-texte-titre-carte);margin-bottom:6px;'; $styleAide = 'display:block;font-size:12.5px;color:#9AA6B6;margin-top:4px;'; $styleFieldset = fn (string $cle): string => 'border:1.5px solid '.$bordure($cle).';border-radius:9px;padding:12px 16px 14px;margin:0;min-width:0;'; $styleLegende = 'padding:0 6px;font-family:var(--police-texte);font-size:14px;font-weight:600;color:var(--couleur-texte-titre-carte);'; $styleCase = 'display:flex;align-items:center;gap:9px;font-family:var(--police-texte);font-size:14.5px;color:var(--couleur-texte-titre-carte);cursor:pointer;'; $styleInputCase = 'width:17px;height:17px;flex:none;accent-color:var(--couleur-bleu-principal);cursor:pointer;'; $styleBoutonPrincipal = 'display:flex;align-items:center;justify-content:center;gap:9px;background:var(--couleur-bleu-principal);color:#fff;border:none;border-radius:10px;height:54px;padding:0 26px;font-family:var(--police-titres);font-size:16px;font-weight:600;cursor:pointer;'; $styleBoutonSecondaire = 'display:flex;align-items:center;justify-content:center;gap:8px;background:#fff;color:var(--couleur-texte-titre-carte);border:1.5px solid #DCE3EC;border-radius:10px;height:54px;padding:0 22px;font-family:var(--police-titres);font-size:15px;font-weight:600;cursor:pointer;'; @endphp
Partenaires & sous-traitants

Questionnaire {{ $specification->libelle() }}

@if ($candidature->societe) {{ $candidature->societe }} — @endif Ces informations nous permettent de vous proposer les chantiers qui correspondent vraiment à votre façon de travailler.

@if ($afficherSucces)

Merci !

{{ session('succes') }}

Revoir mes réponses
@else
@csrf {{-- Progression --}}
@foreach ($etapes as $etape) {{ $etape['titre'] ?? '' }} @endforeach
Étape 1 sur {{ count($etapes) }}
@foreach ($etapes as $index => $etape) @php $numero = $index + 1; @endphp

{{ $etape['titre'] ?? '' }}

@if (! empty($etape['aide']))

{{ $etape['aide'] }}

@endif @foreach ((array) ($etape['champs'] ?? []) as $cle => $champ) @php $type = $champ['type'] ?? 'texte'; $options = App\Services\Partenaires\SpecificationQuestionnaire::options($champ); $obligatoire = (bool) ($champ['obligatoire'] ?? false); $conditionnel = isset($champ['si']); $visible = ! $conditionnel || $specification->conditionRemplie($champ, $valeursActuelles); @endphp
@if (in_array($type, ['cases', 'radio'], true))
{{ $champ['label'] ?? $cle }}@if ($obligatoire) *@endif @if ($type === 'cases') (plusieurs choix possibles)@endif
@foreach ($options as $valeurOption => $libelleOption) @php $courant = $valeur($cle); $coche = $type === 'cases' ? in_array((string) $valeurOption, array_map('strval', (array) $courant), true) : (string) $courant === (string) $valeurOption; @endphp @endforeach
@if ($type === 'cases' && $obligatoire) Selectionnez au moins une option. @endif @else @if ($type === 'liste') @elseif ($type === 'zone') @elseif ($type === 'prix')
@elseif ($type === 'nombre') @else @endif @endif @if (! empty($champ['aide'])) {{ $champ['aide'] }} @endif @error('reponses.'.$cle){{ $message }}@enderror
@endforeach
@if ($numero > 1) @endif @if ($numero < count($etapes)) @else @endif
@endforeach
Vos prix restent confidentiels et ne sont utilisés que par l'équipe Biome.
@endif
@endsection