Initial commit with contrats and domaines modules
This commit is contained in:
115
app/Http/Controllers/PieceJointeController.php
Normal file
115
app/Http/Controllers/PieceJointeController.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Commande;
|
||||
use App\Models\PieceJointe;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
|
||||
class PieceJointeController extends Controller
|
||||
{
|
||||
/**
|
||||
* Upload une pièce jointe sur une commande.
|
||||
*/
|
||||
public function store(Request $request, Commande $commande): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'type' => 'required|in:devis,bon_commande,bon_livraison,facture,autre',
|
||||
'fichier' => [
|
||||
'required',
|
||||
'file',
|
||||
'max:20480', // 20 Mo max
|
||||
'mimes:pdf,jpg,jpeg,png,gif,webp,doc,docx,xls,xlsx,odt,ods,csv,zip',
|
||||
],
|
||||
'description' => 'nullable|string|max:500',
|
||||
], [
|
||||
'fichier.mimes' => 'Types autorisés : PDF, images, Word, Excel, OpenDocument, CSV, ZIP.',
|
||||
'fichier.max' => 'La pièce jointe ne peut pas dépasser 20 Mo.',
|
||||
]);
|
||||
|
||||
$fichier = $request->file('fichier');
|
||||
$chemin = $fichier->store(
|
||||
'commandes/' . $commande->id,
|
||||
'private'
|
||||
);
|
||||
|
||||
$commande->piecesJointes()->create([
|
||||
'user_id' => $request->user()->id,
|
||||
'type' => $request->type,
|
||||
'nom_original' => $fichier->getClientOriginalName(),
|
||||
'chemin' => $chemin,
|
||||
'mime_type' => $fichier->getMimeType(),
|
||||
'taille' => $fichier->getSize(),
|
||||
'description' => $request->description,
|
||||
]);
|
||||
|
||||
return back()->with('success', 'Pièce jointe ajoutée avec succès.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload une pièce jointe sur un contrat.
|
||||
*/
|
||||
public function storeContrat(Request $request, \App\Models\Contrat $contrat): RedirectResponse
|
||||
{
|
||||
$request->validate([
|
||||
'type' => 'required|in:contrat,avenant,autre',
|
||||
'fichier' => [
|
||||
'required',
|
||||
'file',
|
||||
'max:20480', // 20 Mo max
|
||||
'mimes:pdf,jpg,jpeg,png,gif,webp,doc,docx,xls,xlsx,odt,ods,csv,zip',
|
||||
],
|
||||
'description' => 'nullable|string|max:500',
|
||||
], [
|
||||
'fichier.mimes' => 'Types autorisés : PDF, images, Word, Excel, OpenDocument, CSV, ZIP.',
|
||||
'fichier.max' => 'La pièce jointe ne peut pas dépasser 20 Mo.',
|
||||
]);
|
||||
|
||||
$fichier = $request->file('fichier');
|
||||
$chemin = $fichier->store(
|
||||
'contrats/' . $contrat->id,
|
||||
'private'
|
||||
);
|
||||
|
||||
$contrat->piecesJointes()->create([
|
||||
'user_id' => $request->user()->id,
|
||||
'type' => $request->type,
|
||||
'nom_original' => $fichier->getClientOriginalName(),
|
||||
'chemin' => $chemin,
|
||||
'mime_type' => $fichier->getMimeType(),
|
||||
'taille' => $fichier->getSize(),
|
||||
'description' => $request->description,
|
||||
]);
|
||||
|
||||
return back()->with('success', 'Pièce jointe ajoutée avec succès au contrat.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Télécharger une pièce jointe (accès sécurisé, sans URL publique).
|
||||
*/
|
||||
public function download(PieceJointe $pieceJointe): StreamedResponse
|
||||
{
|
||||
// Vérifier que l'utilisateur est authentifié (middleware auth déjà sur le groupe)
|
||||
abort_unless(Storage::disk('private')->exists($pieceJointe->chemin), 404);
|
||||
|
||||
return Storage::disk('private')->download(
|
||||
$pieceJointe->chemin,
|
||||
$pieceJointe->nom_original
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Supprimer une pièce jointe.
|
||||
*/
|
||||
public function destroy(PieceJointe $pieceJointe): RedirectResponse
|
||||
{
|
||||
$this->authorize('delete', $pieceJointe);
|
||||
|
||||
$pieceJointe->supprimer();
|
||||
|
||||
return back()->with('success', 'Pièce jointe supprimée.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user