---
suivi: 1819
date: 2026-10-07
sujet: Option marché non créé réservée admin
chantier: depot_factures
type: correctif
statut: poussé
hash: bf150dfec
fichiers:
  - app/Http/Controllers/DepotFactureController.php
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1819_option_marche_non_cree_admin.md
  - public/build/
---

# SUIVI #1819 — Marché non encore créé réservé aux administrateurs

## PROMPT ENVOYÉ

Restreindre l’option « Marché non encore créé — à relier ultérieurement » aux
groupes bruts `GS_ADMIN_ERP` (`m365GroupNames()`, pas `hasM365Group`). Refus
422 serveur pour les autres à l’enregistrement, à l’envoi en validation et à la
comptabilisation. Factures déjà en `sans_marche` : affichage inchangé,
réenregistrables sans toucher le champ. Option poste budgétaire inchangée.

## Fiches lues

- #1191 / #1193 — sentinelles marché, `sans_marche` vs poste direct, poste
  optionnel sur sans_marché.
- #1803 — même formulaire saisie ; ne pas toucher plafond / CIE / montants.

## Mapping champ Marché

| Libellé affiché | Valeur postée | Relu / colonne | Visibilité |
|---|---|---|---|
| Marché non encore créé — à relier ultérieurement | `__sans_marche__` → `sans_marche=true`, `marche_id=null` | `sans_marche` | GS_ADMIN_ERP brut ; ou facture déjà `sans_marche` (affichage) |
| Pas de marché, rattacher à un poste budgétaire… | `__rattachement_poste__` → `rattachement_poste_direct=true` | `rattachement_poste_direct` | Tous |
| Référence — poste — fournisseur | `marche_id` (int) | `marche_id` | Tous (marchés du programme) |

## Correctif

- Front : option sentinelle absente si non-admin, sauf `form.sans_marche` déjà vrai ;
  setter ignore la sentinelle pour un non-admin qui n’y est pas déjà.
- Serveur : dans `assertRattachementProgrammeBudgetValide`, si `sans_marche` et
  dépôt pas déjà sans marché, et programme pas hors ERP → exiger
  `DepotRetenuesNv1Lock::userEstAdminErpBrut` sinon 422
  « Choisissez un marché, ou rattachez la facture à un poste budgétaire. »

## LEÇON

Ne pas utiliser `hasM365Group` / `is_admin_erp` pour une réserve admin : le
court-circuit admin ferait passer tout le monde. Groupes bruts uniquement.
Ne pas bloquer le `sans_marche` forcé des programmes hors ERP.

## DÉPLOIEMENT-TEST

git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync

1. Compte GS_ADMIN_ERP : option proposée.
2. Usurpation comptable / chargé d’opération : option absente ; POST
   `sans_marche=true` → 422.
3. Facture existante sans marché ouverte par non-admin : affichée,
   enregistrable sans toucher le marché.
4. Facture avec marché réel : inchangée.
