@php use App\Filament\Admin\Resources\Transactions\TransactionResource; use App\Support\Money; $etat = $getState(); $rows = $etat['rows'] ?? []; $projectId = $etat['project_id'] ?? null; $structure = $etat['structure'] ?? []; $cle = $etat['cle'] ?? null; $totalEngage = array_sum(array_column($rows, 'montant')); $totalStructure = array_sum(array_column($structure, 'montant')); $totalGeneral = $totalEngage + $totalStructure; $parasites = array_filter($rows, fn (array $r): bool => $r['parasite'] ?? false); @endphp {{-- v3.3 §4 puis v3.5 §1 — Les dépenses du marché, catégorie par catégorie (assiette du coût direct : opérations validées, sorties, flux standard). Un clic mène aux opérations filtrées. ⚠️ DEUX BLOCS, et c'est le fond du correctif. Une dépense engagée est une écriture ; une quote-part de structure est un calcul. Les poser côte à côte sans le dire fausse la lecture de la marge. Le total général les additionne — explicitement. --}}
@if (count($parasites) > 0) {{-- v3.5 §1 — L'écran dit la vérité : c'est la donnée qui est fausse. Plutôt que de masquer le défaut par un correctif d'affichage, on le nomme et on donne l'outil. --}}
Cette ventilation ne dit rien de la nature des dépenses.

{{ count($parasites) === 1 ? 'Une catégorie porte' : count($parasites).' catégories portent' }} le nom du marché : la reprise des données a créé une catégorie par marché au lieu de classer les dépenses par nature (déplacement, impression, marketing, gazoil…). Le reclassement se fait par la commande de reprise reprise:reclasser-categories-marche, après essai à blanc.

@endif {{-- Bloc 1 — Dépenses engagées --}}
Dépenses engagées
Des écritures réelles : opérations validées, sorties, flux standard, rattachées à ce marché.
@forelse ($rows as $row) @empty @endforelse @if (count($rows) > 0) @endif
Catégorie Montant (HT) Opérations Part
@if ($row['category_id'] !== null && $projectId !== null) {{ $row['libelle'] }} @else {{ $row['libelle'] }} @endif @if ($row['parasite'] ?? false) à reclasser @endif {{ Money::format($row['montant']) }} {{ $row['nb'] }} {{ number_format($row['part'], 1, ',', ' ') }} %
Aucune dépense validée rattachée à ce marché : s'il devrait y en avoir, c'est le rattachement des opérations au marché qui manque en base.
Sous-total — dépenses engagées {{ Money::format($totalEngage) }} {{ array_sum(array_column($rows, 'nb')) }} 100 %
{{-- Bloc 2 — Structure allouée --}}
Structure allouée
Ce n'est pas une dépense du marché : c'est une quote-part calculée des charges de fonctionnement de la société. Personne n'a payé cette somme « pour ce marché ». @if ($cle) Clé employée : {{ $cle }} @endif
@forelse ($structure as $mois) @empty @endforelse @if (count($structure) > 0) @endif
Mois Détail Montant
{{ $mois['label'] }} @foreach ($mois['sources'] as $source) {{ $source['libelle'] }} {{ Money::format($source['montant']) }}@unless ($loop->last) · @endunless @endforeach {{ Money::format($mois['montant']) }}
Aucune quote-part de structure calculée sur ce marché. Si des mois d'activité manquent, c'est la ventilation mensuelle qui n'a pas été lancée.
Sous-total — structure allouée {{ Money::format($totalStructure) }}
{{-- Total général — dit à voix haute ce qu'il additionne. --}}
Total général — dépenses engagées + structure allouée
{{ Money::format($totalGeneral) }}