$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 { ?>
= e($mois($x['date_debut'])) ?> → = e($mois($x['date_fin'])) ?> · = e(t(TYPES_EXPERIENCE[$x['type']] ?? $x['type'])) ?>
= e($x['poste']) ?>
= e(implode(' · ', array_filter([$x['employeur'], $x['client'] ? t('client : %s', $x['client']) : null, $x['lieu']]))) ?>
= e(implode(' · ', array_filter([$x['projet'] ? t('Projet : %s', $x['projet']) : null, $x['charge'] ? t('Charge : %s', $x['charge']) : null]))) ?>
= nl2br(e($x['mission'])) ?>
= nl2br(e($x['description'])) ?>
= e($t) ?>
= e($t['nom']) ?> = e($categories[$t['categorie']]) ?> = e($fr($t['annees'])) ?>
$x['besoin_id'], 'client' => $x['besoin_client'], 'intitule' => $x['besoin_intitule']];
}
?>
= e(t('Date')) ?>
= e(t('Heure, facultative')) ?>
= e(t('Type')) ?>
$libelle): ?>>= e(t($libelle)) ?>
= e(t('Mené par')) ?>
= e(t('Besoin client concerné')) ?>
= e(t('Aucun')) ?>
>= e($b['client'] . ' : ' . $b['intitule']) ?>
= e(t('Avis')) ?>
= e(t('Pas encore d\'avis')) ?>
$libelle): ?>>= e(t($libelle)) ?>
= e(t('Compte rendu')) ?>
= e(t('Profils archivés')) ?> / = e(t(STATUTS[$c['statut']])) ?>
= e(t('Kanban')) ?> / = e(t(STATUTS[$c['statut']])) ?>
= avatar($c, 'grand') ?>
= echelle($c['statut'], 'grande') ?>
= e($c['prenom'] . ' ' . $c['nom']) ?>
= e($c['titre']) ?>
= e(t(SENIORITES[$c['seniorite']])) ?>
= e(t('%s d\'expérience', annees($c['annees_experience']))) ?>
= e(t('Profil archivé le %s.', date_fr($c['archive_le']))) ?> = e(t('Il n\'apparaît plus dans le Kanban ni dans les chiffres. Ses données et ses documents sont conservés.')) ?>
= e(t('Vous lisez le texte d\'origine de ce profil.')) ?> = e(t('Voir la traduction %s', $langueNom)) ?>
= e($tr['etat'] === 'perimee'
? t('La fiche a changé depuis sa traduction : le texte s\'affiche dans sa langue d\'origine.')
: t('Ce profil n\'est pas encore traduit %s : le texte s\'affiche dans sa langue d\'origine.', $langueNom)) ?>
= e(t('La traduction se fait en arrière-plan.')) ?>
= e($tr['origine'] === 'automatique' ? t('Texte traduit automatiquement le %s.', date_fr($tr['cree_le'])) : t('Texte traduit le %s.', date_fr($tr['cree_le']))) ?>
= e(t('Voir l\'original')) ?>
= e(t(STATUTS[$c['statut']])) ?>
= e(t('Disponibilité')) ?> = $disponibilite !== '' ? e($disponibilite) : $nonRenseigne('non renseignée') ?>
= e(t('TJM souhaité')) ?> = e(euros($c['tjm'])) ?: $nonRenseigne() ?>
= e(t('Lieu')) ?> = e($c['ville'] ?: $c['pays']) ?>
= e(t('Motif du refus')) ?> : = e($c['motif_refus']) ?>
$o): ?>
= e($o['libelle']) ?>
= $cle === 'dossier' ? '!' : (int) $o['pastille'] ?>
= (int) $compteurs[$cle] ?>
= e(t('Profil')) ?>
= e(t('Synthèse')) ?>
= nl2br(e($c['resume'])) ?>
= e(t('Points d\'attention')) ?>
= e(t('Expériences')) ?> = count($c['experiences']) ?>
= e(tn(count($experiencesAnciennes), 'Voir %d expérience plus ancienne', 'Voir %d expériences plus anciennes')) ?>
= e(t('Aucune expérience renseignée.')) ?>
= e(t('Technologies')) ?> = count($c['technologies']) ?>
= e(t('Technologie')) ?> = e(t('Catégorie')) ?> = e(t('Années')) ?>
= e(tn(count($technologiesAutres), 'Voir %d autre technologie', 'Voir %d autres technologies')) ?>
= e(t('Aucune technologie renseignée.')) ?>
= e(t('Formation et certifications')) ?>
= e($f['diplome']) ?> = $f['etablissement'] ? ', ' . e($f['etablissement']) : '' ?>= $dates !== '' || ($f['lieu'] ?? '') ? ' ' . e(implode(' · ', array_filter([$dates, $f['lieu'] ?? null]))) . ' ' : '' ?>
= e($f['nom']) ?> = $f['organisme'] ? ', ' . e($f['organisme']) : '' ?>= $f['annee'] ? ' (' . (int) $f['annee'] . ')' : '' ?>
= e(t('Suivi')) ?>
= e(t('Entretiens')) ?> = count($c['entretiens']) ?>
= $aujourdhui; ?>
= e($dateHeure($x['date_entretien'])) ?> · = e(t(TYPES_ENTRETIEN[$x['type']])) ?>
= e(t('à venir')) ?>
= e(t(AVIS_ENTRETIEN[$x['avis']])) ?> = e(t('avis à donner')) ?>
= e(implode(' · ', array_filter([
$x['interlocuteur'] ? t('mené par %s', $x['interlocuteur']) : null,
$x['besoin_intitule'] ? $x['besoin_client'] . ' : ' . $x['besoin_intitule'] : null,
t('saisi par %s', $x['nom_affiche']),
]))) ?>
= nl2br(e($x['compte_rendu'])) ?>
= e($x['avis'] ? t('Modifier') : t('Donner l\'avis et le compte rendu')) ?>
= e(t('Aucun entretien enregistré.')) ?>
= e(t('Ajouter un entretien')) ?>
= e(t('Missions')) ?>
= e(t('Besoins clients')) ?> = count($c['besoins']) ?>
= e($b['client'] . ' : ' . $b['intitule']) ?>
= e(t(ETATS_PROPOSITION[$b['etat']])) ?>= $b['statut'] !== 'ouvert' ? ' · ' . e(t('besoin %s', mb_strtolower(t(ETATS_BESOIN[$b['statut']])))) : '' ?>= $b['note'] ? ' · ' . e($b['note']) : '' ?>
= e(t('Ce profil n\'est proposé pour aucun besoin.')) ?>
!in_array((int) $b['id'], array_map('intval', array_column($c['besoins'], 'id')), true)); ?>
= e(t('Données commerciales')) ?>
= e(t('Disponibilité')) ?> = e(libelle_disponibilite($c)) ?: $nonRenseigne('non renseignée') ?>
= e(t('Note')) ?> = e($c['disponibilite']) ?>
= e(t('TJM souhaité')) ?> = e(euros($c['tjm'])) ?: $nonRenseigne() ?>
= e(t('Salaire souhaité')) ?> = $c['salaire_souhaite'] !== null ? e(t('%s brut par an', euros($c['salaire_souhaite']))) : $nonRenseigne() ?>
= e(t('Mobilité')) ?> = e($c['mobilite']) ?: $nonRenseigne('non renseignée') ?>
= e(t('Télétravail')) ?> = $c['teletravail'] ? e(t(TELETRAVAIL[$c['teletravail']])) : $nonRenseigne() ?>
= e(t('Réservées à IT Club. Elles ne figurent sur aucun CV exporté.')) ?>
= e(t('Modifier')) ?>
= e(t('Dossier')) ?>
= e(t('Documents')) ?> = count($c['documents']) ?>
= e(t('Aucun document.')) ?>
= e(t('Ajouter un document')) ?>
= e(t('Mots-clés et classement')) ?>
= e(t('Études')) ?> = e(t(NIVEAUX_ETUDES[$c['niveau_etudes']] ?? $c['niveau_etudes'])) ?>
= e(t('Encadrement')) ?> = e($c['encadrement'] ? t('Oui') : t('Non')) ?>
$libelle): if (!$c['mots_cles'][$type]) { continue; } ?>
= e(t($libelle)) ?>
= e(t('Aucun mot-clé. La recherche s\'appuie sur le reste de la fiche.')) ?>
= e(t('Historique')) ?> = count($c['historique']) ?>
= e(date_fr($h['cree_le'], true)) ?> · = e($h['nom_affiche']) ?>
= e(t(ACTIONS_JOURNAL[$h['action']] ?? $h['action'])) ?>= $detail !== '' ? ' : ' . e($detail) : '' ?>
= e(tn(count($anciennes), '%d action plus ancienne', '%d actions plus anciennes')) ?>
= e(t('Données personnelles')) ?>
= e(t('Conservation')) ?> = e(t('jusqu\'au %s', date_fr($c['conserver_jusqu_au']))) ?>
= e(t('Accord')) ?>
= $c['consentement_le']
? e(t('donné le %s', date_fr($c['consentement_le']))) . ($c['consentement_note'] ? '' . e($c['consentement_note']) . ' ' : '')
: $nonRenseigne('non enregistré') ?>
= e($c['consentement_le'] ? t('Modifier l\'accord') : t('Enregistrer l\'accord du candidat')) ?>
= e(t('Notez la date à laquelle le candidat a accepté que IT Club conserve son CV, et la façon dont il l\'a dit.')) ?>
= e(t('Un fichier zip avec tout ce que Vivier détient sur cette personne. À lui remettre s\'il demande l\'accès à ses données.')) ?>
= e(t('Photo')) ?>
= e(t('Sert à reconnaître le candidat dans Vivier. Elle ne figure pas sur les CV exportés.')) ?>
= e($c['photo'] ? t('Remplacer la photo') : t('Ajouter une photo')) ?>
= e(t('Gestion')) ?>
= e(t('Mettre à jour depuis une nouvelle analyse')) ?>
= e(t('Remplace les expériences, technologies, langues et mots-clés. Garde le statut, les commentaires, les documents et les mots ajoutés à la main.')) ?>
= e(t('Seul le gestionnaire des comptes peut supprimer un profil.')) ?>