Dossiers publiques */ $publicFolders = Dossier::query() ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id'))) ->where('is_private', false) ->whereDoesntHave('dossierParent') ->select($select)->get(); // * On récupère les dossiers privés. /** @var \Illuminate\Database\Eloquent\Builder */ $privateQuery = Dossier::query() ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id'))) ->where('is_private', true) ->select($select); // ? Is admin ? if (!$user->hasRole(config('roles.const.ADMIN'))) { // * If not admin, get using brands. /** @var \Illuminate\Database\Eloquent\Collection Codes marques */ $marques = $user->marques()->pluck('codMarq'); $privateQuery->whereHas('marques', fn (Builder $q) => $q->whereIn('codMarq', $marques)); } /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */ $privateFolders = $privateQuery->get(); $foldersCollection = $publicFolders->merge($privateFolders); $foldersCollection = $foldersCollection ->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE) ->sortBy('favoris')->values(); // ? Is admin ? if ($user->hasRole(config('roles.const.ADMIN'))) { // * Ajout du dépôt de fichier pour les admin. /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers depots */ $depotQuery = Dossier::query() ->whereDoesntHave('dossierParent') ->where('system', true) ->orderBy('libelle', 'ASC') ->get(); $foldersCollection = $foldersCollection->merge($depotQuery); } $folders['data'] = new NestedDossiersListResource($foldersCollection); $folders['racineCount'] = Media::query() ->whereHas('sujet', fn (Builder $q) => $q->where('id', $request->input('sujet_id'))) ->whereDoesntHave('dossier') ->where( fn (Builder $q) => $q->where('statut', MediaStatut::public_etendu) ->orWhere('statut', MediaStatut::public) ->orWhere('created_by', $user->id) )->count(); return response()->json($folders); } /** * Chargement des dossiers * * @param \App\Http\Requests\Bo\Ajax\FetchFoldersRequest $request * @return \Illuminate\Http\JsonResponse */ public function loadFolder(FetchFoldersRequest $request): JsonResponse { /** @var \App\Models\User */ $user = auth()->user(); $response = []; $response['variantes'] = Variante::query() ->whereHas('sujet', fn (Builder $q) => $q->where('id', $request->input('sujetId'))) ->get(); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */ $FormatsSujet = Format::query() ->whereHas('sujets', fn (Builder $q) => $q->where('sujet_id', $request->input('sujetId'))) ->get(); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */ $FormatsSystem = Format::query() ->withoutGlobalScope('App\Scopes\SystemScope') ->where('system', true)->get(); $response['formats'] = $FormatsSujet->merge($FormatsSystem); $response['draggable'] = $user->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); // Envoi du role . $response['role'] = $user->role; return \response()->json($response); } // * CRUD /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { /** @var \App\Models\User */ $user = auth()->user(); $user->authorizeRoles(config('roles.const.ADMIN')); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */ $dossiers = Dossier::query() ->whereDoesntHave('dossierParent') ->where('system', false) ->orderBy('libelle', 'asc') ->get(); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ $sujets = Sujet::query()->where('sujet_dam', true)->get(); return view('dossiers.index', [ 'dossiers' => $dossiers, 'sujets' => $sujets, ]); } /** * Show the form for creating a new resource. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ public function create(Request $request) { if ($request->sub) { /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */ $dossiers = Dossier::query() ->whereDoesntHave('dossierParent') ->where('system', false) ->orderBy('libelle', 'asc')->get(); return view('dossiers.create-sub', [ 'dossiers' => $dossiers ]); } /** @var \App\Models\User */ $user = auth()->user(); $user->authorizeRoles(config('roles.const.ADMIN')); $marques = Marque::all(); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ $sujets = Sujet::query()->where('sujet_dam', true)->get(); return view('dossiers.create')->with([ 'marques' => $marques, 'sujets' => $sujets ]); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Folders\StoreFolderRequest $request * @return \Illuminate\Http\Response */ public function store(StoreFolderRequest $request) { DB::transaction(function () use ($request) { /** @var \App\Models\User */ $user = auth()->user(); $user->authorizeRoles(config('roles.const.ADMIN')); // ---- Le dossier $dossier = new Dossier(); $dossier->fill($request->validated()); if ($request->sub) { /** @var \App\Models\Dossier */ $parent_dossier = Dossier::query()->findOrFail($request->input('parent_id')); $dossier->sujet()->associate($parent_dossier->sujet); } else { $dossier->sujet()->associate($request->input('sujet')); } if ($dossier->saveOrFail()) { // ---- Les marques if ($request->input('marques')) { $dossier->marques()->sync($request->input('marques')); } return redirect()->route('dossier.edit', ['dossier' => $dossier]) ->with('success', 'Le dossier a été enregistré'); } }); return back(); } /** * Show the form for editing the specified resource. * * @param \App\Models\Dossier $dossier * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ public function edit(Dossier $dossier) { /** @var \App\Models\User */ $user = auth()->user(); $user->authorizeRoles(config('roles.const.ADMIN')); $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::query()->where('sujet_dam', true)->get(); return view('dossiers.edit', [ 'dossier' => $dossier, 'dossierMarques' => $dossierMarques, 'marques' => $marques, 'sujets' => $sujets ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Folders\UpdateFolderRequest $request * @param \App\Models\Dossier $dossier * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateFolderRequest $request, Dossier $dossier): RedirectResponse { DB::transaction(function () use ($request, $dossier) { /** @var \App\Models\User */ $user = auth()->user(); $user->authorizeRoles(config('roles.const.ADMIN')); // ---- 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', trans('Le dossier a été mis à jour')); } }); return back(); } /** * Remove the specified resource from storage. * * @param \App\Models\Dossier $dossier * @return \Illuminate\Http\RedirectResponse */ public function destroy(Dossier $dossier): RedirectResponse { /** @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é')); } return back(); } /** * Ajouter un dossier de dépôt * * @param \App\Http\Requests\Bo\Folders\StoreDepotFolderRequest $request * @return \Illuminate\Http\JsonResponse */ public function addDepotFolder(StoreDepotFolderRequest $request): JsonResponse { // ---- Le dossier $dossier = new Dossier($request->validated()); $dossier->parent_id = 1; $dossier->system = true; $dossier->saveOrFail(); return \response()->json([ 'folder_id' => $dossier->id ]); } }