feat: add sous-devis generation from commandes

From a commande, users can now create one or more sub-quotes
(sous-devis) to ventilate purchases across communes for approval.

- Add parent_devis_id and commande_id FKs on devis table
- Order model: sousDevis() hasMany relation
- Devis model: commande() and parent() relations
- DevisController: createFromCommande / storeFromCommande methods
- OrderController: load and pass sous_devis on show
- Commandes/Show: "Créer un sous-devis" button + ventilation panel
- Devis/CreateFromCommande: form pre-loaded with commande context
- Devis/Index: badge "Sous-devis · CMD-XXXX" on linked quotes
- Devis/Show: back-link to originating commande

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mrKamoo
2026-06-19 15:14:45 +02:00
co-authored by Claude Sonnet 4.6
parent 7312c7640b
commit 8d51f4de3e
12 changed files with 874 additions and 15 deletions
+4
View File
@@ -65,6 +65,8 @@ Route::middleware('auth')->group(function () {
// Suivi des commandes
Route::post('/commandes/{commande}/transition', [OrderController::class, 'transition'])->name('commandes.transition');
Route::get('/commandes/{commande}/sous-devis/create', [DevisController::class, 'createFromCommande'])->name('commandes.sous-devis.create');
Route::post('/commandes/{commande}/sous-devis', [DevisController::class, 'storeFromCommande'])->name('commandes.sous-devis.store');
Route::resource('commandes', OrderController::class);
// Pièces jointes
@@ -82,6 +84,8 @@ Route::middleware('auth')->group(function () {
Route::get('/devis/settings', [DevisController::class, 'settings'])->name('devis.settings');
Route::put('/devis/settings', [DevisController::class, 'updateSettings'])->name('devis.settings.update');
Route::get('/devis/{devi}/pdf', [DevisController::class, 'downloadPdf'])->name('devis.pdf');
Route::get('/devis/{devi}/sous-devis/create', [DevisController::class, 'createSousDevis'])->name('devis.sous-devis.create');
Route::post('/devis/{devi}/sous-devis', [DevisController::class, 'storeSousDevis'])->name('devis.sous-devis.store');
Route::resource('devis', DevisController::class)->parameters([
'devis' => 'devi',
]);