{{-- 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) {{ $document->description ?: $nomClient }} @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)
@csrf
@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)
@csrf
@endif @elseif ($photo->client_nom !== null) {{ __('Rattaché à la main, « :nom » dans digiKam.', ['nom' => $photo->client_nom]) }} @if ($peutModifier)
@csrf
@endif @endif
@if ($photo->ville)
{{ __('Lieu') }}
{{ trim($photo->code_postal . ' ' . $photo->ville) }}
@endif @if ($photo->date_chantier)
{{ __('Date') }}
{{ $photo->date_chantier->translatedFormat('j M Y') }} · S{{ $photo->date_chantier->isoWeek() }}
@endif @if ($photo->metier || $photo->planning?->equipe)
{{ __('Équipe') }}
{{ collect([$photo->planning?->equipe?->nom, $photo->metier ? config("rapport_chantiers.types.{$photo->metier}") : null])->filter()->implode(' · ') }}
@endif @if ($auteur)
{{ $photo->video ? __('Filmée par') : __('Photographe') }}
{{ $auteur }}
@endif
@if ($photo->produits->isNotEmpty())
{{ $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
    @csrf
    @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
  • @endforeach
@endif
{{ __('Étiquettes') }}
@forelse ($photo->etiquettes as $etiquette) {{ $etiquette->nom }} @if ($peutModifier)
@csrf @method('DELETE')
@endif
@empty {{ __('Aucune.') }} @endforelse
@if ($peutModifier) {{-- Le même choix que la barre de sélection (js/phototheque.js), le menu sous le champ. --}}
@csrf
@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())))
{{ __('Site vitrine') }} @if ($photo->estPubliee()) {{ __('publiée') }} @endif
@if ($photo->estPubliee())

{{ __('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

@endif @if ($peutPublier && !$photo->estSupprimee())
@csrf
@foreach ($surLeSite as $choisi) {{ $choisi['nom'] }} @endforeach
@if ($proposes->isNotEmpty())
{{ __('Ce que la photo porte :') }} @foreach ($proposes as $propose) @endforeach
@endif
@if ($photo->estPubliee())
@csrf
@endif @elseif ($surLeSite)
@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))
{{ __('Retouches') }} @if ($photo->estRetouchee()) {{ __('retouchée') }} @endif
@if ($photo->retouchee_digikam && $photo->versions->isEmpty())

{{ __('Retouchée dans digiKam : la photo reprise est déjà la retouche, l\'originale n\'a pas été gardée.') }}

@endif @if ($photo->versions->isNotEmpty())
  • {{ $photo->retouchee_digikam ? __('Retouche de digiKam') : __('Originale') }} {{ __('envoyée le :d', ['d' => $photo->created_at?->format('d/m/Y')]) }} @if ($photo->version_id !== null && $peutTrier)
    @csrf
    @elseif ($photo->version_id === null) {{ __('affichée') }} @endif
  • @foreach ($photo->versions as $rang => $version)
  • {{ __('Retouche :n', ['n' => $rang + 1]) }} {{ collect([$version->created_at?->format('d/m/Y'), $nomDe($version->user), $version->motif])->filter()->implode(' · ') }} @if ($photo->version_id === $version->id) {{ __('affichée') }} @elseif ($peutTrier)
    @csrf
    @endif
  • @endforeach
@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. --}}
@csrf {{-- Pourquoi on l'a retouchée : dit en face de la version, dans la liste. --}}
{{ __('La photo d\'origine est gardée : on peut y revenir.') }}
@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')]) }}
@if ($photo->planning_id) {{ __('Chantier') }} @endif @if ($url) {{ __('Télécharger') }} @endif
{{-- Pas de confirmation : la corbeille se défait pendant trente jours. --}} @if ($peutTrier && !$photo->estSupprimee())
@csrf
@endif
@endif