2019-05-17 11:35:41 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
2022-07-26 13:20:21 +02:00
|
|
|
use App\Enums\MediaStatut;
|
2022-06-20 14:57:58 +02:00
|
|
|
use App\Http\Requests\Bo\Ajax\FetchFoldersRequest;
|
|
|
|
|
use App\Http\Requests\Bo\Ajax\LoadFoldersRequest;
|
|
|
|
|
use App\Http\Requests\Bo\Folders\StoreDepotFolderRequest;
|
|
|
|
|
use App\Http\Requests\Bo\Folders\StoreFolderRequest;
|
|
|
|
|
use App\Http\Requests\Bo\Folders\UpdateFolderRequest;
|
|
|
|
|
use App\Http\Resources\NestedDossiersListResource;
|
2019-09-12 11:08:25 +02:00
|
|
|
use App\Models\Dossier;
|
|
|
|
|
use App\Models\Sujet;
|
|
|
|
|
use App\Models\Marque;
|
|
|
|
|
use App\Models\Media;
|
|
|
|
|
use App\Models\Variante;
|
|
|
|
|
use App\Models\Format;
|
2022-06-20 14:57:58 +02:00
|
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
2019-05-17 11:35:41 +02:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
2022-06-20 14:57:58 +02:00
|
|
|
use Illuminate\Support\Facades\DB;
|
2019-05-17 11:35:41 +02:00
|
|
|
|
|
|
|
|
class DossierController extends Controller
|
|
|
|
|
{
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Ajax Load folders
|
2019-05-17 11:35:41 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Http\Requests\Bo\Ajax\LoadFoldersRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
2019-05-17 11:35:41 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function loadFolders(LoadFoldersRequest $request): JsonResponse
|
2019-05-17 11:35:41 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = Auth::user();
|
|
|
|
|
$folders = [];
|
|
|
|
|
|
|
|
|
|
$select = ['id', 'libelle', 'system'];
|
|
|
|
|
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */
|
|
|
|
|
$publicFolders = Dossier::whereHas('sujet', function ($q) use ($request) {
|
|
|
|
|
$q->where('codeSujet', $request->sujet_id);
|
|
|
|
|
})->whereIsPrivate(false)->whereNull('parent_id')->select($select)->get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// On récupère les dossiers privés.
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Builder */
|
|
|
|
|
$privateQuery = Dossier::whereHas('sujet', function ($q) use ($request) {
|
|
|
|
|
$q->where('codeSujet', $request->sujet_id);
|
|
|
|
|
})->select($select)->whereIsPrivate(true);
|
|
|
|
|
|
|
|
|
|
// If not admin, get using brands.
|
|
|
|
|
if (!$user->hasRole(config('roles.const.ADMIN'))) {
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<integer> Codes marques */
|
|
|
|
|
$marques = $user->marques()->pluck('codMarq');
|
|
|
|
|
$privateQuery->whereHas('marques', function ($q) use ($marques) {
|
|
|
|
|
$q->whereIn('codMarq', $marques);
|
|
|
|
|
});
|
|
|
|
|
}
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */
|
|
|
|
|
$privateFolders = $privateQuery->get();
|
2019-05-17 11:35:41 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
$foldersCollection = $publicFolders->merge($privateFolders);
|
|
|
|
|
$foldersCollection = $foldersCollection->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE)
|
|
|
|
|
->sortBy('favoris')->values();
|
2019-05-17 11:35:41 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
// Ajout du dépôt de fichier pour les admin.
|
|
|
|
|
if ($user->hasRole(config('roles.const.ADMIN'))) {
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers depots */
|
|
|
|
|
$depotQuery = Dossier::whereNull('parent_id')
|
|
|
|
|
->where('system', true)
|
|
|
|
|
->orderBy('libelle', 'ASC')
|
|
|
|
|
->get();
|
|
|
|
|
$foldersCollection = $foldersCollection->merge($depotQuery);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$folders['data'] = new NestedDossiersListResource($foldersCollection);
|
|
|
|
|
$folders['racineCount'] = Media::whereSujetId($request->sujet_id)
|
|
|
|
|
->whereNull('dossier_id')
|
|
|
|
|
->where(function ($query) use ($user) {
|
2022-07-26 13:20:21 +02:00
|
|
|
$query->where('statut', MediaStatut::public_etendu)
|
|
|
|
|
->orWhere('statut', MediaStatut::public)
|
2022-06-20 14:57:58 +02:00
|
|
|
->orWhere('created_by', $user->id);
|
|
|
|
|
})->count();
|
|
|
|
|
|
|
|
|
|
return response()->json($folders);
|
2020-07-17 11:17:54 +02:00
|
|
|
}
|
|
|
|
|
|
2019-05-17 11:35:41 +02:00
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Chargement des dossiers
|
2019-05-17 11:35:41 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Http\Requests\Bo\Ajax\FetchFoldersRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
2019-05-17 11:35:41 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function loadFolder(FetchFoldersRequest $request): JsonResponse
|
2019-05-17 11:35:41 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
|
|
|
|
|
$response = [];
|
|
|
|
|
$response['variantes'] = Variante::where('sujet_id', $request->sujetId)->get();
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
|
|
|
|
$FormatsSujet = Format::whereHas('sujets', function ($query) use ($request) {
|
|
|
|
|
$query->where('sujet_id', $request->sujetId);
|
|
|
|
|
})->get();
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
|
|
|
|
$FormatsSystem = Format::withoutGlobalScope('App\Scopes\SystemScope')
|
|
|
|
|
->where('system', true)->get();
|
|
|
|
|
$response['formats'] = $FormatsSujet->merge($FormatsSystem);
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
$response['draggable'] = $user->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
// Envoi du role .
|
|
|
|
|
$response['role'] = $user->role;
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
return \response()->json($response);
|
2019-05-17 11:35:41 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
// * CRUD
|
2020-07-17 11:17:54 +02:00
|
|
|
|
2019-05-17 11:35:41 +02:00
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Display a listing of the resource.
|
2019-05-17 11:35:41 +02:00
|
|
|
*
|
|
|
|
|
* @return \Illuminate\Http\Response
|
|
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function index()
|
2019-05-17 11:35:41 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
|
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
|
|
|
|
$dossiers = Dossier::whereNull('parent_id')
|
|
|
|
|
->where('system', false)
|
|
|
|
|
->orderBy('libelle', 'asc')
|
|
|
|
|
->get();
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
|
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
2019-05-17 11:35:41 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
return view('dossiers.index')->with([
|
|
|
|
|
'dossiers' => $dossiers,
|
|
|
|
|
'sujets' => $sujets,
|
|
|
|
|
]);
|
2019-05-17 11:35:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Show the form for creating a new resource.
|
2019-05-17 11:35:41 +02:00
|
|
|
*
|
2020-07-09 17:36:42 +02:00
|
|
|
* @param \Illuminate\Http\Request $request
|
2022-06-20 14:57:58 +02:00
|
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
2019-05-17 11:35:41 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function create(Request $request)
|
2019-05-17 11:35:41 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
if ($request->sub) {
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
|
|
|
|
$dossiers = Dossier::whereNull('parent_id')->where('system', false)
|
|
|
|
|
->orderBy('libelle', 'asc')->get();
|
|
|
|
|
return view('dossiers.create-sub')->with(['dossiers' => $dossiers]);
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
$marques = Marque::all();
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
|
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
return view('dossiers.create')->with([
|
|
|
|
|
'marques' => $marques, 'sujets' => $sujets
|
|
|
|
|
]);
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Store a newly created resource in storage.
|
2020-07-09 17:36:42 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Http\Requests\Bo\Folders\StoreFolderRequest $request
|
|
|
|
|
* @return \Illuminate\Http\Response
|
2020-07-09 17:36:42 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function store(StoreFolderRequest $request)
|
2020-07-09 17:36:42 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
DB::transaction(function () use ($request) {
|
|
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
// ---- Le dossier
|
|
|
|
|
$dossier = new Dossier();
|
|
|
|
|
$dossier->fill($request->validated());
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
if ($request->sub) {
|
|
|
|
|
/** @var \App\Models\Dossier */
|
|
|
|
|
$parent_dossier = Dossier::findOrFail($request->parent_id);
|
|
|
|
|
$dossier->sujet()->associate($parent_dossier->sujet);
|
|
|
|
|
} else {
|
|
|
|
|
$dossier->sujet()->associate($request->sujet);
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
if ($dossier->saveOrFail()) {
|
|
|
|
|
// ---- Les marques
|
|
|
|
|
if ($request->marques) {
|
|
|
|
|
$dossier->marques()->sync($request->marques);
|
|
|
|
|
}
|
|
|
|
|
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
|
|
|
|
->with('success', 'Le dossier a été enregistré');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return back();
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Show the form for editing the specified resource.
|
2020-07-09 17:36:42 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Models\Dossier $dossier
|
|
|
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
2020-07-09 17:36:42 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function edit(Dossier $dossier)
|
2020-07-09 17:36:42 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
$marques = Marque::all();
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Marque> */
|
|
|
|
|
$dossierMarques = $dossier->marques;
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
|
|
|
$dossierSujets = $dossier->sujets;
|
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
|
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
|
|
|
|
|
|
|
|
|
return view('dossiers.edit')->with([
|
|
|
|
|
'dossier' => $dossier,
|
|
|
|
|
'dossierMarques' => $dossierMarques,
|
|
|
|
|
'marques' => $marques,
|
|
|
|
|
'sujets' => $sujets
|
|
|
|
|
]);
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Update the specified resource in storage.
|
2020-07-09 17:36:42 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Http\Requests\Bo\Folders\UpdateFolderRequest $request
|
|
|
|
|
* @param \App\Models\Dossier $dossier
|
|
|
|
|
* @return \Illuminate\Http\RedirectResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function update(UpdateFolderRequest $request, Dossier $dossier): RedirectResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
DB::transaction(function () use ($request, $dossier) {
|
|
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
2020-07-09 17:36:42 +02:00
|
|
|
|
2022-06-20 14:57:58 +02:00
|
|
|
// ---- Le dossier
|
|
|
|
|
$dossier->fill($request->validated());
|
|
|
|
|
|
|
|
|
|
if ($dossier->saveOrFail()) {
|
|
|
|
|
// ---- Les marques
|
|
|
|
|
if ($request->marques) {
|
|
|
|
|
$dossier->marques()->sync($request->marques);
|
|
|
|
|
}
|
|
|
|
|
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
|
|
|
|
->with('success', 'Le dossier a été mis à jour');
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
2022-06-20 14:57:58 +02:00
|
|
|
});
|
|
|
|
|
return back();
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Remove the specified resource from storage.
|
2020-07-09 17:36:42 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Models\Dossier $dossier
|
|
|
|
|
* @return \Illuminate\Http\RedirectResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function destroy(Dossier $dossier): RedirectResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
{
|
2022-06-20 14:57:58 +02:00
|
|
|
/** @var \App\Models\User */
|
|
|
|
|
$user = auth()->user();
|
|
|
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
|
if ($dossier->deleteOrFail()) {
|
|
|
|
|
return \response()->redirectToRoute('dossier.index')
|
|
|
|
|
->with('warning', trans('Le dossier à été supprimé'));
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
2022-06-20 14:57:58 +02:00
|
|
|
return back();
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2022-06-20 14:57:58 +02:00
|
|
|
* Ajouter un dossier de dépôt
|
2020-07-09 17:36:42 +02:00
|
|
|
*
|
2022-06-20 14:57:58 +02:00
|
|
|
* @param \App\Http\Requests\Bo\Folders\StoreDepotFolderRequest $request
|
|
|
|
|
* @return \Illuminate\Http\JsonResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
*/
|
2022-06-20 14:57:58 +02:00
|
|
|
public function addDepotFolder(StoreDepotFolderRequest $request): JsonResponse
|
2020-07-09 17:36:42 +02:00
|
|
|
{
|
|
|
|
|
// ---- Le dossier
|
2022-06-20 14:57:58 +02:00
|
|
|
$dossier = new Dossier($request->validated());
|
|
|
|
|
$dossier->parent_id = 1;
|
|
|
|
|
$dossier->system = true;
|
|
|
|
|
$dossier->saveOrFail();
|
|
|
|
|
return \response()->json([
|
|
|
|
|
'folder_id' => $dossier->id
|
|
|
|
|
]);
|
2020-07-09 17:36:42 +02:00
|
|
|
}
|
2019-05-17 11:35:41 +02:00
|
|
|
}
|