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 Codes marques */ $marques = $user->marques()->pluck('codMarq'); $privateQuery->whereHas('marques', function ($q) use ($marques) { $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(); // 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) { $query->where('statut', config('services.statut.public_etendu')) ->orWhere('statut', config('services.statut.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::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); $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::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(); return view('dossiers.index')->with([ '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::whereNull('parent_id')->where('system', false) ->orderBy('libelle', 'asc')->get(); return view('dossiers.create-sub')->with(['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::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::findOrFail($request->parent_id); $dossier->sujet()->associate($parent_dossier->sujet); } else { $dossier->sujet()->associate($request->sujet); } 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(); } /** * 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::where('sujet_dam', true)->get(); return view('dossiers.edit')->with([ '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', '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 ]); } }