{{-- v4.2.0 §C1 — Les panneaux de saisie de la fiche, EN LIGNE : jamais une seconde page. Même grammaire de champs que partout ailleurs — les composants Filament. --}} @php use App\Enums\EspaceClient\CanalDecision; use App\Enums\EspaceClient\CanalDemande; use App\Enums\EspaceClient\FamilleDocument; use App\Enums\EspaceClient\ModeAcces; use App\Enums\EspaceClient\ModeLettre; use App\Enums\EspaceClient\RoleAcces; use App\Enums\EspaceClient\TypeDecision; use App\Models\EspaceClient\DocumentClient; @endphp @if ($panneau === 'livrable') @php // v4.12.0 §A1 — Le MÊME panneau crée et corrige : `saisie.livrable` dit lequel des deux. $livrableEnEdition = $this->livrableEnEdition(); @endphp {{ $livrableEnEdition ? 'Modifier '.$livrableEnEdition->reference : '+ Nouveau livrable' }} @if ($livrableEnEdition) La référence, le statut et les versions ne changent pas : ils ont pu partir dans un e-mail ou un bordereau. On corrige la fiche, on ne réécrit pas l'histoire. @else L'échéance se calcule depuis le poste quand il porte une règle de délai ; elle reste modifiable. @endif
@foreach ($espace->postes as $poste) @endforeach
@foreach ($this->collaborateurs() as $id => $nom) @endforeach
@foreach ($this->acces() as $acces) @endforeach
@foreach (['document' => 'Document', 'video' => 'Vidéo', 'photo' => 'Photo', 'publication' => 'Publication', 'rapport' => 'Rapport', 'autre' => 'Autre'] as $cle => $libelle) @endforeach
@if ($livrableEnEdition) {{-- La case « créer aussi la tâche » n'a de sens qu'à la création : à la correction, la tâche existe ou n'existe pas, et ce n'est pas cet écran qui en décide. --}} @elseif (\App\Services\Pilotage\Pilotage::actif()) {{-- v4.30.0 §B5 — Pilotage éteint : plus de tâche interne née d'un livrable. --}} @endif
{{ $livrableEnEdition ? 'Enregistrer' : 'Créer' }} Fermer
@endif {{-- ─── v4.12.0 §A2 — Supprimer un livrable : la confirmation, et ce qu'elle emporte ───────── --}} @if ($panneau === 'suppression-livrable') Supprimer {{ $saisie['reference'] ?? 'le livrable' }} « {{ $saisie['titre'] ?? '' }} » — la suppression est sans retour.
@if ($saisie['engage'] ?? false)

Ce livrable a déjà été validé, réceptionné ou diffusé.

La suppression effacera aussi son historique : {{ $saisie['versions'] ?? 0 }} version(s) remise(s) et {{ $saisie['decisions'] ?? 0 }} décision(s) du client. Les e-mails déjà partis, eux, restent au journal.

@else

Emporte {{ $saisie['versions'] ?? 0 }} version(s) et {{ $saisie['decisions'] ?? 0 }} décision(s).

@endif

Ce qui reste : les publications, comptes rendus et réunions qui le citaient perdent le lien mais ne sont pas supprimés, et la tâche interne du responsable non plus — c'est du travail réellement fait.

Supprimer définitivement Annuler
@endif @if ($panneau === 'conversation') {{-- v4.17.0 §B2.6 — Le fil de discussion, le même que dans l'app du client et dans Studio. --}} Conversation — {{ $saisie['titre'] ?? '' }} Les messages des deux côtés, les remises et les décisions, dans l'ordre. Un message ne change jamais l'état : pour valider ou demander une modification, c'est une décision.
Fermer
@endif @if ($panneau === 'remise') Remettre au client Une remise crée une VERSION neuve — jamais un écrasement — et envoie l'e-mail au valideur et au référent, avec la date de réponse souhaitée.
Remettre Fermer
@endif @if ($panneau === 'decision') Reporter une décision reçue La décision est tracée avec SON auteur et SON canal, et la mention de qui l'a reportée : une décision reportée ne se fait jamais passer pour une décision prononcée.
@foreach ([TypeDecision::Valide, TypeDecision::ValideAvecModifications, TypeDecision::Corrections, TypeDecision::Refus] as $decision) @endforeach
@foreach ([CanalDecision::WhatsappReporte, CanalDecision::Email, CanalDecision::Reunion] as $canal) @endforeach
Enregistrer Fermer
@endif @if ($panneau === 'demande') + Saisir une demande reçue Le même formulaire que celui du client, avec le canal et la date de réception.
@foreach (CanalDemande::cases() as $canal) @endforeach
@foreach (ModeLettre::cases() as $mode) @endforeach
Enregistrer Fermer
@endif @if ($panneau === 'lettre') Préparer la lettre de commande Les quantités commandées, poste par poste. Le montant est figé à l'écriture.
@foreach ($espace->postes as $poste)

{{ $poste->numero }} · {{ $poste->libelle }}

{{ $poste->unite ?: 'unité' }} · {{ $poste->pu_ht !== null ? number_format((float) $poste->pu_ht, 2, ',', ' ').' DH' : 'sans prix' }}

@endforeach
Préparer Fermer
@endif {{-- v4.4.2 §3 — Un poste du bordereau, saisi à la main : un marché sans appel d'offres a droit à ses postes, sans quoi tout l'onglet « Commandes » reste mort. --}} @if ($panneau === 'poste') {{ ($saisie['poste'] ?? null) ? 'Modifier le poste' : '+ Poste du bordereau' }} Le montant du poste est quantité prévue × prix unitaire HT. Un poste sans prix ni quantité est un poste de pilotage : il se suit, il ne se facture pas.
Enregistrer Fermer
@endif @if ($panneau === 'creneau') Proposer un créneau Le client confirme, ou en propose un autre, depuis son espace.
@foreach (['hebdo' => 'Hebdomadaire', 'comite' => 'Comité de suivi', 'cadrage' => 'Cadrage', 'autre' => 'Autre'] as $cle => $libelle) @endforeach
Proposer Fermer
@endif @if ($panneau === 'compte-rendu') Compte rendu de la réunion Envoyé, il apparaît chez le client dans « À valider ». Sans remarque dans le délai convenu, il sera réputé approuvé. La réunion suivante est créée si vous en fixez la date.
Envoyer au client Fermer
@endif @if ($panneau === 'document') @php // v4.13.0 §D — Le MÊME panneau dépose et corrige : `saisie.document` dit lequel des deux. $documentEnEdition = $this->documentEnEdition(); @endphp {{ $documentEnEdition ? 'Modifier le document' : '+ Ajouter un document' }} Un lien ou un fichier : au choix, document par document. Le client ne voit que les pièces partagées. @if ($documentEnEdition) Le faire passer d'interne à partagé l'annonce au client ; l'inverse le retire sans rien dire. @endif
@foreach (FamilleDocument::cases() as $famille) @endforeach
{{ $documentEnEdition ? 'Enregistrer' : 'Ajouter' }} Fermer
@endif @if ($panneau === 'message') Message de la semaine Cinq lignes, relues et modifiables. Rien ne part vers une messagerie extérieure : on copie, ou on envoie par courriel au référent.
Enregistrer le brouillon Envoyer par e-mail au référent Fermer
@endif @if ($panneau === 'invitation') Inviter une personne du client Un compte nominatif, un mot de passe temporaire envoyé par courriel, changé à la première connexion. Le mot de passe n'apparaît jamais ici.
@foreach (RoleAcces::cases() as $role) @endforeach
Inviter Fermer
@endif {{-- ─── v4.7.0 §A2 — Modifier l'adresse (le slug) de l'espace ──────────────────────────── --}} @if ($panneau === 'adresse') Modifier l'adresse de l'espace Minuscules, chiffres et tirets, 3 à 140 caractères ; l'adresse est unique. L'ancienne adresse courte ne répondra plus. Les liens à jeton déjà partagés continuent de fonctionner.
Enregistrer la nouvelle adresse Fermer
@endif {{-- ─── v4.7.0 §E — Identité visuelle et envois : logos, expéditeur, signature, e-mail de test ── --}} @if ($panneau === 'identite') Identité visuelle et envois La marque qui exécute ce marché, le logo du client, l'adresse d'où partent les e-mails de l'espace et la signature qui les ferme. Tous les e-mails de l'espace en portent les traces.

Doit exister sur le serveur mail (boîte ou alias cPanel). Vide : l'adresse de l'installation.

{{-- v4.9.0 §C2 — DEUX LISTES d'adresses, et non plus un champ unique : on ajoute, on retire, ligne par ligne. Une ligne laissée vide est écartée à l'enregistrement ; une liste vide est un choix parfaitement valable. --}}
@foreach ([ 'emails_cc' => ['titre' => 'Copies (Cc)', 'aide' => 'Visibles de tous les destinataires. Les gestionnaires de l\'espace y sont ajoutés automatiquement.'], 'emails_cci' => ['titre' => 'Copies cachées (Cci)', 'aide' => 'Invisibles des autres destinataires. Le destinataire principal n\'y est jamais remis.'], ] as $liste => $entree)

{{ $entree['titre'] }}

@forelse ((array) ($this->saisie[$liste] ?? []) as $index => $adresse)
@empty

Aucune adresse.

@endforelse
Ajouter une adresse

{{ $entree['aide'] }}

@endforeach
@if ($espace->logo_prestataire) @endif
@if ($espace->logo_path) @endif
Enregistrer Fermer

Envoyer un e-mail de test

Un vrai message, avec les logos et la signature enregistrés, à l'adresse ci-dessous. Le résultat s'affiche tel quel : succès, ou l'erreur exacte du serveur.

Envoyer un e-mail de test
@endif @if ($panneau === 'reglages') Réglages de l'espace Identité du client, mode d'accès, règles de délai et canaux. Les adresses d'envoi, les logos et la signature vivent dans « Identité visuelle et envois », juste en dessous.
@foreach (ModeAcces::cases() as $mode) @endforeach
{{-- v4.8.0 §D4 — Le pont espace client → tâches, par espace. v4.30.0 §B5 — Pilotage éteint : la case est masquée (la valeur reste en base). --}} @if (\App\Services\Pilotage\Pilotage::actif()) @endif
Enregistrer Fermer
@endif {{-- ═══════════════════════════════════════════════════════════════════════════════════════ v4.3.0 — LES PANNEAUX DU LOT 2 : publications, événements, indicateurs, décomptes. Même grammaire que ceux du lot 1 : en ligne, jamais une seconde page. ═══════════════════════════════════════════════════════════════════════════════════════ --}} @if ($panneau === 'publication') {{ filled($saisie['publication'] ?? null) ? 'Publication' : '+ Nouvelle publication' }} Une publication validée par le client est FIGÉE : pour la changer, on l'annule et on la recrée.
@foreach (\App\Enums\EspaceClient\TypePublication::cases() as $type) @endforeach
@foreach ($this->livrables() as $livrable) @endforeach
{{-- v4.16.1 §D1 — LA PHOTO, depuis la galerie ou l'appareil photo du téléphone (`accept="image/*"` ouvre les deux sur iOS et Android). Elle s'affiche chez le client EN PRIORITÉ sur le lien. Aperçu de ce qu'on vient de choisir, et de ce qui est déjà en place ; « Retirer » efface le fichier, jamais le lien. --}}
@php $photoChoisie = $saisie['visuel_fichier'] ?? null; $apercuPhoto = null; if ($photoChoisie instanceof \Livewire\Features\SupportFileUploads\TemporaryUploadedFile) { try { $apercuPhoto = $photoChoisie->temporaryUrl(); } catch (\Throwable) { $apercuPhoto = null; } } @endphp
@if ($apercuPhoto || ($saisie['visuel_actuel'] ?? null))
@endif

Envoi de la photo…

@error('saisie.visuel_fichier')

{{ $message }}

@enderror @if ($apercuPhoto)

Cette photo sera enregistrée avec la publication{{ ($saisie['visuel_actuel'] ?? null) ? ' et remplacera l\'actuelle' : '' }}.

@elseif ($saisie['visuel_actuel'] ?? null) @endif
@foreach ($espace->reseauxConfigures() as $reseau) @endforeach
Enregistrer @if (filled($saisie['publication'] ?? null)) Envoyer au client @endif Fermer
@endif @if ($panneau === 'publication-lien') Marquer publiée Le lien est obligatoire : sans lui, « publié » est une affirmation ; avec lui, c'est une pièce.
Enregistrer Fermer
@endif @if ($panneau === 'publication-annulation') Annuler la publication Le motif est obligatoire et journalisé. Si le client l'avait vue passer, il est prévenu.
Annuler la publication Fermer
@endif @if ($panneau === 'publication-decision') Décision reçue sur une publication Une décision REPORTÉE : la trace dira qui l'a prononcée, par quel canal, et qui l'a saisie.
@foreach ([TypeDecision::Valide, TypeDecision::ValideAvecModifications, TypeDecision::Corrections] as $decision) @endforeach
@foreach (CanalDecision::cases() as $canal) @endforeach
Enregistrer Fermer
@endif @if ($panneau === 'evenement' || $panneau === 'evenement-qualification') {{ $panneau === 'evenement-qualification' ? 'Qualifier l\'événement signalé' : '+ Planifier un événement' }} La chronologie du tableau de bord est recopiée avec ses échéances, calculées depuis la date et l'heure de début. Sans heure : 09:00.
@foreach ($espace->zonesConfigurees() as $zone) @endforeach
@foreach ($this->affectations() as $id => $nom) @endforeach
@foreach ($this->lettres() as $lettre) @endforeach
@if ($saisie['voie_express'] ?? false)
@endif
{{ $panneau === 'evenement-qualification' ? 'Qualifier' : 'Planifier' }} Fermer
@endif @if ($panneau === 'evenement-etape') Marquer l'étape faite L'heure est enregistrée, et l'e-mail part aux deux parties avec le lien. C'est ce message-là qui tient la promesse, pas la case cochée.
Marquer faite Fermer
@endif @if ($panneau === 'evenement-galerie') Lien de la galerie Le client le lit avec son QR code, depuis la vue « Événements ».
Enregistrer Fermer
@endif @if ($panneau === 'indicateurs') Saisir les indicateurs digitaux du mois Ces chiffres viennent du rapport de performance : ils ne se recalculent pas, et le calcul ne les efface jamais.
@foreach ($espace->reseauxConfigures() as $reseau) @foreach (['abonnes', 'publications', 'portee', 'engagement', 'delai_moderation_h'] as $champ) @endforeach @endforeach
Réseau Abonnés Publications Portée Engagement Modération (h)
{{ $reseau['libelle'] }}
Enregistrer Fermer
@endif @if ($panneau === 'recalcul') Recalculer les indicateurs Si le mois est clôturé, le rouvrir exige un motif — il a peut-être déjà été présenté en comité. La saisie digitale, elle, n'est jamais touchée.
Recalculer Fermer
@endif @if ($panneau === 'decompte') Préparer le décompte Les lignes sont calculées depuis les livrables VALIDÉS de la période, non déjà comptés ailleurs. Les pénalités sont reprises du simulateur et restent modifiables.
Préparer Fermer
@endif @if ($panneau === 'pv') PV signé La pièce est archivée dans les documents du client, famille « Commandes et réceptions », et partagée : c'est une pièce qui l'engage.
Enregistrer Fermer
@endif @if ($panneau === 'facture') Créer la facture La facture est celle du socle, créée en BROUILLON : elle attend d'être relue et émise depuis le module de facturation. « Réglée » se lira ensuite de la facture, jamais d'ici.
@foreach ($this->jalons() as $id => $libelle) @endforeach
Créer la facture Fermer
@endif @if ($panneau === 'parametres-avances') Zones, réseaux, chronologie, pénalités et réceptions Les listes se collent depuis un document du marché : une ligne par entrée, plutôt que huit formulaires à remplir un par un.
@foreach ([ ['cible_delais', 'Cible — délais tenus (%)', 'number'], ['cible_premier_passage', 'Cible — premier passage (%)', 'number'], ['cible_retour', 'Cible — délai de retour (j ouvrés)', 'number'], ['cible_moderation', 'Cible — modération (h)', 'number'], ['penalite_taux', 'Pénalité — taux ‰ par jour', 'number'], ['penalite_plafond', 'Pénalité — plafond (%)', 'number'], ['montant_ht', 'Montant du marché HT', 'number'], ['montant_ttc', 'Montant du marché TTC', 'number'], ['taux_tva', 'Taux de TVA (%)', 'number'], ['nb_periodes', 'Nombre de périodes de réception', 'number'], ['prochaine_reception', 'Prochaine réception (repli saisi)', 'date'], ] as [$champ, $libelle, $type])
@endforeach
Enregistrer Fermer
@endif {{-- ─── v4.5.0 §4 — Confier l'espace à un collaborateur ──────────────────────────────────── --}} @if ($panneau === 'gestionnaire') Confier cet espace à un collaborateur Il fera, sur cet espace, tout ce que fait la direction — depuis son propre espace, sous « Espaces à gérer ». Il ne verra que les espaces qu'on lui a confiés, et rien d'autre de l'administration.
@foreach ($this->tousLesCollaborateurs() as $id => $nom) @endforeach
Ajouter Fermer
@endif {{-- ─── v4.5.0 §5 — Supprimer l'espace : le nom recopié, sinon rien ──────────────────────── --}} @if ($panneau === 'suppression-espace') Supprimer « {{ $espace->nom }} » Sans retour. Livrables, publications, événements, réunions, réceptions, documents et comptes clients de cet espace sont supprimés avec lui. Le marché, ses factures et sa trésorerie ne sont pas touchés.
Supprimer définitivement Fermer
@endif {{-- ─── v4.13.0 §D — Supprimer un objet de l'espace : UN seul panneau pour les cinq ──────── Document, publication, événement, réunion, demande. Le geste est réel et sans retour ; le panneau dit ce qu'il emporte ET ce qu'il laisse debout, avant le clic. Cinq panneaux jumeaux auraient divergé au premier correctif. --}} @if ($panneau === 'suppression-objet') Supprimer {{ $saisie['quoi'] ?? 'cet élément' }} « {{ $saisie['titre'] ?? '' }} » — la suppression est sans retour.

{{ $saisie['emporte'] ?? '' }}

@if (filled($saisie['reste'] ?? null))

{{ $saisie['reste'] }}

@endif
Supprimer définitivement Annuler
@endif