$n === null ? '' : nombre($n); $mois = static fn (?string $d): string => $d ? (new DateTimeImmutable($d))->format('m/Y') : t('en cours'); $adresse = implode(', ', array_filter([$c['rue'], trim(($c['code_postal'] ?? '') . ' ' . ($c['ville'] ?? '')), $c['pays']])); $taille = static fn (int $o): string => $o >= 1048576 ? number_format($o / 1048576, 1, ',', '') . ' Mo' : max(1, (int) round($o / 1024)) . ' Ko'; $categories = array_map('t', [ 'langage' => 'Langage', 'framework' => 'Framework', 'base_de_donnees' => 'Base de données', 'outil' => 'Outil', 'cloud' => 'Cloud', 'methode' => 'Méthode', 'autre' => 'Autre', ]); $archive = $c['archive_le'] !== null; $dateHeure = static fn (string $d): string => date_fr($d, !str_ends_with($d, '00:00:00')); $aujourdhui = date('Y-m-d'); $nonRenseigne = static fn (string $texte = 'non renseigné'): string => '' . e(t($texte)) . ''; // Ce qui demande une action : alimente la ligne « À faire » du bandeau et les pastilles des onglets $relancesOuvertes = array_values(array_filter($c['relances'], static fn ($r) => $r['fait_le'] === null)); $relancesEchues = array_filter($relancesOuvertes, static fn ($r) => $r['echeance'] <= $aujourdhui); $entretiensAVenir = array_filter($c['entretiens'], static fn ($x) => substr($x['date_entretien'], 0, 10) >= $aujourdhui); $prochainEntretien = $entretiensAVenir ? min(array_column($entretiensAVenir, 'date_entretien')) : null; $avisADonner = array_filter($c['entretiens'], static fn ($x) => substr($x['date_entretien'], 0, 10) < $aujourdhui && !$x['avis']); $conservationDepassee = $c['conserver_jusqu_au'] !== null && $c['conserver_jusqu_au'] < $aujourdhui; $aSuivre = count($relancesEchues) + count($avisADonner); // Disponibilité : la valeur choisie dans la liste ; à défaut, le texte du CV $disponibilite = libelle_disponibilite($c) ?: (string) $c['disponibilite']; // Permis de travail : non requis avec une nationalité UE, EEE ou suisse ; sinon le texte saisi et la date de fin du titre $nationalites = implode(', ', array_map(static fn ($code) => nom_pays($code), $c['nationalites_codes'])); $permisLibre = $c['hors_ue'] !== null && (int) $c['hors_ue'] === 0; $titreExpire = !$permisLibre && $c['permis_expire_le'] !== null && $c['permis_expire_le'] < $aujourdhui; $titreBientot = !$permisLibre && $c['permis_expire_le'] !== null && !$titreExpire && $c['permis_expire_le'] <= date('Y-m-d', strtotime('+2 months')); // Traduction du contenu dans la langue de l'interface $tr = $c['traduction']; $langueNom = ['fr' => t('en français'), 'en' => t('en anglais')][langue_courante()] ?? langue_courante(); // Repli : les plus récents d'abord, le reste se déplie $nbExperiences = 3; $nbTechnologies = 10; $experiencesVisibles = array_slice($c['experiences'], 0, $nbExperiences); $experiencesAnciennes = array_slice($c['experiences'], $nbExperiences); $technologiesVisibles = array_slice($c['technologies'], 0, $nbTechnologies); $technologiesAutres = array_slice($c['technologies'], $nbTechnologies); $onglets = [ 'profil' => ['libelle' => t('Profil'), 'pastille' => 0, 'titre' => ''], 'suivi' => ['libelle' => t('Suivi'), 'pastille' => $aSuivre, 'titre' => t('Relances en retard et avis à donner')], 'missions' => ['libelle' => t('Missions'), 'pastille' => 0, 'titre' => ''], 'dossier' => ['libelle' => t('Dossier'), 'pastille' => $conservationDepassee ? 1 : 0, 'titre' => t('Conservation dépassée')], ]; $compteurs = ['suivi' => count($c['entretiens']) + count($c['commentaires']), 'missions' => count($c['besoins']), 'dossier' => count($c['documents'])]; /** Une expérience professionnelle. */ $experience = static function (array $x) use ($mois): void { ?>

→ ·

$x['besoin_id'], 'client' => $x['besoin_client'], 'intitule' => $x['besoin_intitule']]; } ?>

/ /

:

  • ' . e(implode(' · ', array_filter([$dates, $f['lieu'] ?? null]))) . '' : '' ?>

= $aujourdhui; ?>

·

·

!in_array((int) $b['id'], array_map('intval', array_column($c['besoins'], 'id')), true)); ?>

  • · · ,

$libelle): if (!$c['mots_cles'][$type]) { continue; } ?>

    >

  • ·