---
suivi: 1040
date: 2026-07-29
sujet: Fix AuthorizesRequests — bloc Proposition Aktor invisible (500 silencieux)
chantier: aktor
type: fix
statut: poussé
hash: d35cce32
fichiers:
  - app/Http/Controllers/AssistantPropositionController.php
  - docs/suivi/SUIVI_1040_fix_authorize_proposition_aktor.md
---

## PROMPT ENVOYÉ

SUIVI #1040

⚠️ NUMÉROTATION — LIRE D'ABORD
Ce lot a été initialement rédigé sous le numéro « #1032 » dans une AUTRE conversation.
Ce numéro est DÉJÀ CONSOMMÉ (#1032 = diagnostic BILAN engagé, commit 2a95008d, fiche
docs/suivi/SUIVI_1032_diag_bilan_engage.md). Un numéro ne se réutilise JAMAIS.
Le numéro correct de ce lot est **#1040**. Ignorer toute occurrence de « 1032 » dans le
texte d'origine et nommer TOUS les livrables en 1040.

⚠️ EXÉCUTION EN PARALLÈLE DU LOT #1039 — RÈGLES STRICTES
Le lot #1039 (fix de la règle « NV1 franchie » dans le bilan) est lancé en parallèle.
Il touche `app/Models/DepotFacture.php`, `app/Services/BilanFinancierService.php` et
`tools/diag/`. Ce lot #1040 ne doit toucher AUCUN de ces fichiers.
- Les deux lots doivent produire **DEUX COMMITS DISTINCTS**. Vécu : Cursor a déjà fusionné
  deux lots dans un seul commit (#1008 noyé dans f5eae3f1) — c'est interdit ici.
- Ce commit ne doit contenir QUE les fichiers listés au LIVRABLE ci-dessous. Vérifier avec
  `git status --short` et `git show --stat <hash>` avant de conclure.
- AUCUN `.vue` n'est modifié dans ce lot NI dans le #1039 → aucun rebuild, `public/build/`
  ne doit apparaître dans AUCUN des deux commits.

CONTEXTE
ERP Hectarion (Laravel 13 / PHP 8.3 / Vue 3 + Inertia). Repo HECTAREG/erp-immo,
prod envol.hectare.fr.

LE BUG
Le lot #1027 a livré la fiche de cadrage Aktor. Le mécanisme FONCTIONNE côté données mais
le bloc « Proposition Aktor » ne s'affiche JAMAIS.

CAUSE RACINE
`AssistantPropositionController` appelle `$this->authorize()` sans le trait `AuthorizesRequests`
(disponible depuis Laravel 11 uniquement par import explicite sur chaque contrôleur).

FIX ATTENDU
1. Rendre `authorize()` disponible en suivant la convention du projet.
2. Audit des autres contrôleurs appelant `$this->authorize()`.
3. Ne rien changer d'autre à show() / updateStatut().

## SYNTHÈSE

### Convention constatée — `AuthorizesRequests`

Le contrôleur de base `app/Http/Controllers/Controller.php` est **vide** (pas de trait depuis Laravel 11).
Chaque contrôleur qui appelle `$this->authorize()` déclare **individuellement** sur la classe :

- `use Illuminate\Foundation\Auth\Access\AuthorizesRequests;`
- `use AuthorizesRequests;`

Exemples existants : `TacheSuiviController`, `ProjetController`, `TacheSuiviDocumentController`, `AppelOffreController`.

### Correctif (#1040)

`AssistantPropositionController` : ajout du trait `AuthorizesRequests` (2 lignes).

### Audit `$this->authorize()` — contrôleurs

| Contrôleur | Appelle `$this->authorize()` | Trait `AuthorizesRequests` | Action #1040 |
|---|---|---|---|
| `TacheSuiviController` | OUI (9 appels) | OUI | — |
| `AssistantPropositionController` | OUI (2 appels) | **NON → OUI** | **corrigé** |
| `ProjetController` | OUI (8 appels) | OUI | — |
| `TacheSuiviDocumentController` | OUI (3 appels) | OUI | — |
| `AppelOffreController` | OUI (3 appels) | OUI | — |
| `DepotFactureController` | NON | NON | hors périmètre (zone commune) |
| `ComptabilisationController` | NON | NON | hors périmètre (zone commune) |

Aucun autre contrôleur sous `app/Http/Controllers/` n'appelle `$this->authorize()`.

### Journal (#412) — pas d'entrée

**Décision : non.** L'entrée `aktor-fiche-cadrage-2026-07-28` (#1027) annonce déjà la fiche de cadrage pour `GS_ADMIN_ERP`. Ce lot corrige un fatal 500 silencieux (axios + catch) qui empêchait l'affichage d'une fonctionnalité déjà documentée — correctif technique au sens de la règle journal, pas une nouvelle capacité utilisateur.

### Fichiers modifiés

- `app/Http/Controllers/AssistantPropositionController.php` (+trait)
- `docs/suivi/SUIVI_1040_fix_authorize_proposition_aktor.md` (cette fiche)

Aucun `.vue` modifié. Aucun `public/build/` dans le commit.

### Tests (sorties brutes)

MySQL local indisponible (`127.0.0.1:3306` connexion refusée, pas de driver sqlite). Tests exécutés via container DI + `Auth::setUser` + sous-classe de test injectant la fiche (logique `show`/`updateStatut` identique, `authorize()` sur le contrôleur réel du container).

```
=== php -l ===
No syntax errors detected in app/Http/Controllers/AssistantPropositionController.php

=== Reflection + authorize ===
class: App\Http\Controllers\AssistantPropositionController
method_exists authorize: YES
hasMethod authorize: YES
traits: AuthorizesRequests

=== TEST authorize() direct (container controller) ===
authorize('view', tache 83): OK (pas undefined method)

=== TEST 1 show() tache 83 (avec fiche) ===
--- show() tache 83 status=200 ---
{"success":true,"proposition":{"id":183,"tache_suivi_id":83,...,"statut":"a_cadrer",...}}

=== TEST 2 show() tache 84 (sans fiche) ===
--- show() tache 84 status=200 ---
{"success":true,"proposition":null}

=== TEST 3 updateStatut() statut=traite ===
--- updateStatut() traite tache 83 status=200 ---
{"success":true,"proposition":{...,"statut":"traite","traite_at":"2026-07-29T09:44:55+00:00",...}}

=== TEST 4 updateStatut() statut invalide ===
--- updateStatut() invalide ValidationException status=422 ---
{"message":"The selected statut is invalid.","errors":{"statut":["The selected statut is invalid."]}}
```

Test post-déploiement OVH recommandé : `GET /taches-suivi/83/proposition-aktor` (admin ERP) → `proposition` non null.

## DÉPLOIEMENT / TEST

(vide)

## LEÇON

Depuis Laravel 11, `AuthorizesRequests` n'est plus dans le contrôleur de base — un `$this->authorize()` sans le trait produit un 500 SILENCIEUX quand l'appelant est un axios avec catch : la fonctionnalité paraît absente alors que la donnée existe.
