{{-- La photo ouverte : ce que le chantier dit d'elle (rempli par
l'indexation, en lecture), puis ce qu'on y ajoute à la main — les
étiquettes, les retouches — et où elle en est (à traiter, à la
corbeille). --}}
@php
$peutModifier = auth()->user()?->can('photos.edit');
// Jeter et remplacer : photos.delete, la permission de celui qui trie.
$peutTrier = auth()->user()?->can('photos.delete');
$nomDe = fn ($user) => $user ? trim($user->prenom . ' ' . $user->nom) : __('quelqu\'un');
@endphp
@if (!$photo)
{{ __('Cliquez une photo pour voir sa fiche.') }}
@else
@php
// `document` est l'originale ; on montre la retouche choisie.
$document = $photo->document;
$url = ($affichee = $photo->affichee()) ? asset('storage/' . $affichee->url) : null;
$urlOriginale = $document ? asset('storage/' . $document->url) : null;
$nomClient = $photo->client?->libelle
?? $photo->client_nom
?? ($photo->client_id ? __('Client :id', ['id' => $photo->client_id]) : __('Client inconnu'));
$auteur = $photo->user ? trim($photo->user->prenom . ' ' . $photo->user->nom) : $photo->photographe;
@endphp
{{-- Une vidéo se lit ici, ou en grand par « Agrandir ». --}}
@if ($url && $photo->video)
@elseif ($url)
@endif
{{-- La visionneuse d'une photo hors de la page de la grille, ouverte
par son adresse : elle n'y a pas de loupe. --}}
@if ($url)
video) data-video @endif
data-legende="{{ collect([$nomClient, $photo->date_chantier?->translatedFormat('j M Y'), $document?->description])->filter()->implode(' — ') }}">
@endif
{{ $nomClient }}
@if ($url)
@endif
@if ($photo->estSupprimee())
{{ __('À la corbeille') }}
{{ __('depuis le :d, par :qui.', ['d' => $photo->supprimee_le->format('d/m/Y'), 'qui' => $nomDe($photo->supprimeePar)]) }}
{{ __('Effacée le :d.', ['d' => $photo->supprimee_le->copy()->addDays(\App\Models\Photo::JOURS_CORBEILLE)->format('d/m/Y')]) }}
@if ($peutTrier)
@endif
{{-- Où en est le tri : l'affaire de qui trie (photos.edit), pas
de qui ne fait que regarder. --}}
@elseif (!$peutModifier)
@elseif ($photo->estTraitee())
{{ $photo->traitee_par
? __('Traitée par :qui le :d', ['qui' => $nomDe($photo->traiteePar), 'd' => $photo->traitee_le->format('d/m/Y')])
: __('Traitée le :d', ['d' => $photo->traitee_le->format('d/m/Y')]) }}
@else
{{ __('À traiter') }}
@endif
@if ($document?->description)
« {{ $document->description }} »
@endif
{{ __('Chantier') }}
@if ($photo->video)
{{ __('vidéo reprise de digiKam') }}
@elseif ($photo->source)
{{ __('repris de digiKam') }}
@else
{{ __('rempli tout seul') }}
@endif
{{ __('Client') }}
@if ($photo->client_id)
{{ $nomClient }}
@else
{{ $nomClient }}
@endif
{{-- Le nom de digiKam resté en texte : on le rattache à
sa fiche Gestan, toutes ses photos avec
(PhotoController::rattacherClient). La fenêtre de
recherche est dans la page, hors du panneau
(photos/index) ; elle pose l'id dans le champ, et
js/phototheque.js demande confirmation. --}}
@if ($photo->client_nom !== null && !$photo->client_id)
@php $memeNom = \App\Models\Photo::whereNull('client_id')->where('client_nom', $photo->client_nom)->count(); @endphp
{{ __('Nom repris de digiKam, sans fiche Gestan.') }}
@if ($peutModifier)
@endif
@elseif ($photo->client_nom !== null)
{{ __('Rattaché à la main, « :nom » dans digiKam.', ['nom' => $photo->client_nom]) }}
@if ($peutModifier)
@endif
@endif
{{ $photo->video ? __('Ce que montre la vidéo') : __('Ce que montre la photo') }}
{{-- Ce que digiKam disait de moins qu'une ligne posée à la main
ne se montre pas : « Battant » sous « Battant B-82 RAL
7016 » (ProduitsALaMain::couvertes). Retirer la ligne à
la main le fait revenir. --}}
@php $couvertes = \App\Services\Photos\ProduitsALaMain::couvertes($photo->produits); @endphp
@foreach ($photo->produits->reject(fn ($p) => in_array($p->id, $couvertes, true)) as $produit)
{{-- Une ligne de devis touchée : son code (RB600BDKE-),
sauf quand il se retrouve au catalogue. --}}
{{ collect([
$produit->type?->nom ? \Illuminate\Support\Str::ucfirst(mb_strtolower($produit->type->nom)) : null,
$produit->categorie?->nom ? \Illuminate\Support\Str::ucfirst(mb_strtolower($produit->categorie->nom)) : null,
$produit->variation?->nom ?? $produit->modeleCatalogue?->nom ?? ($produit->categorie_id ? null : (mb_strtoupper($produit->modele ?? '') ?: $produit->article)),
])->filter()->implode($produit->categorie_id ? ' · ' : ' ') }}
@if ($produit->couleur)
{{ $produit->couleur }}
@elseif ($produit->article_libelle)
{{ \Illuminate\Support\Str::ucfirst(mb_strtolower($produit->article_libelle)) }}
@endif
@if ($produit->commande_id)
{{ __('Cde :n', ['n' => $produit->commande_id]) }}
@elseif ($produit->devis_id)
{{ __('Devis :n', ['n' => $produit->devis_id]) }}
@elseif ($produit->estALaMain())
{{-- Posée à la main (« Rattacher ») : par qui, et sa croix. --}}
{{ __('à la main · :qui', ['qui' => $produit->ajoutePar?->prenom ?? '?']) }}
@if ($peutModifier)
@php $nomLigne = collect([mb_strtoupper((string) ($produit->variation?->getRawOriginal('nom') ?? $produit->modeleCatalogue?->getRawOriginal('nom'))), $produit->couleur])->filter()->implode(' · '); @endphp
@endif
@elseif ($produit->modele !== null && !$produit->modele_id && !$produit->categorie_id && $peutModifier)
{{-- Un libellé de digiKam absent du catalogue : il se
rattache sur l'écran des produits, toutes ses
photos avec (RattachementsModeles). --}}
{{ __('Rattacher') }}
@endif
@if ($peutModifier)
{{-- Le même choix que la barre de sélection (js/phototheque.js),
le menu sous le champ. --}}
@endif
{{-- Le site vitrine : sous quels modèles et variations la photo se
montre, choisis à la main (PublicationsSite). Les modèles que
la photo porte déjà sont proposés, pas posés : une commande
dit ce qui a été posé, pas ce que la photo met en valeur.
Pastilles et menu : js/phototheque-site.js. --}}
@php
$peutPublier = auth()->user()?->can('photos.publier');
$surLeSite = \App\Services\Photos\PublicationsSite::choisis($photo);
$proposes = $photo->produits
->map(fn ($p) => $p->variation_id
? ['v' => 'v:' . $p->variation_id, 'nom' => mb_strtoupper((string) $p->variation?->getRawOriginal('nom'))]
: ($p->modele_id ? ['v' => 'm:' . $p->modele_id, 'nom' => mb_strtoupper((string) $p->modeleCatalogue?->getRawOriginal('nom'))] : null))
->filter(fn ($p) => $p && $p['nom'] !== '')
->unique('v')
->reject(fn ($p) => in_array($p['v'], array_column($surLeSite, 'v'), true))
->values();
@endphp
{{-- Ni site ni retouches pour une vidéo (PhotoController les refuse). --}}
@if (!$photo->video && ($photo->estPubliee() || ($peutPublier && !$photo->estSupprimee())))
{{ __('Publiée le :d, par :qui.', ['d' => $photo->publiee_le->format('d/m/Y'), 'qui' => $photo->publieePar ? $nomDe($photo->publieePar) : __('le dossier du site')]) }}
@if ($photo->estRetouchee())
{{ __('C\'est la retouche affichée qui part sur le site.') }}
@endif
@foreach ($surLeSite as $choisi)
{{ $choisi['nom'] }}
@endforeach
@endif
@endif
{{-- Les retouches : l'originale ne change jamais, chaque retouche
s'ajoute, et l'on choisit celle qu'on montre. --}}
@if (!$photo->video && ($photo->versions->isNotEmpty() || $photo->retouchee_digikam || $peutTrier))
@endif
@if ($peutTrier && !$photo->estSupprimee())
{{-- Réduite dans le navigateur avant l'envoi (js/reduire-image.js),
puis par PieceJointe : comme toute photo de terrain. --}}
@endif
@endif
{{ $photo->video ? __('Filmée le') : __('Prise de vue') }} :
{{ $photo->prise_le ? $photo->prise_le->format('d/m/Y H:i') : __('inconnue (réduite par le téléphone)') }}
{{ __('Envoyée le :d', ['d' => $photo->created_at?->format('d/m/Y à H:i')]) }}