257 lines
9 KiB
PHP
257 lines
9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Bo;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Bo\AppUser\StoreAppUserRequest;
|
|
use App\Http\Requests\Bo\AppUser\UpdateAppUserRequest;
|
|
use App\Http\Requests\Bo\ImportRequest;
|
|
use App\Http\Requests\Bo\UpdateChangeOrderRequest;
|
|
use App\Imports\AppUserImport;
|
|
use App\Models\AppUser;
|
|
use App\Models\Directory;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Session;
|
|
use Illuminate\Support\Str;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
|
class AppUserController extends Controller
|
|
{
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function index(Request $request): \Illuminate\View\View
|
|
{
|
|
/** @var \Illuminate\Database\Eloquent\Builder $query */
|
|
$query = AppUser::query();
|
|
|
|
if ($request->search) {
|
|
$this->searchQuery(
|
|
$query,
|
|
$request->search,
|
|
null,
|
|
'lastname',
|
|
'firstname',
|
|
'email'
|
|
);
|
|
}
|
|
$searchFields = \implode(', ', [
|
|
trans('validation.attributes.last_name'),
|
|
trans('validation.attributes.first_name'),
|
|
trans('validation.attributes.email'),
|
|
]);
|
|
|
|
/** Sort columns with a query */
|
|
$this->sortQuery($query);
|
|
|
|
$app_users = $this->paginate($query);
|
|
|
|
return view('bo.pages.app-users.index', compact('app_users', 'searchFields'));
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function create(): \Illuminate\View\View
|
|
{
|
|
$directories = Directory::renderDirectories(
|
|
Directory::query()->where('needAuthorization', 1)->orderBy('name', 'ASC')->get()
|
|
);
|
|
|
|
return view('bo.pages.app-users.create', compact('directories'));
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \App\Http\Requests\Bo\AppUser\StoreAppUserRequest $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function store(StoreAppUserRequest $request): \Illuminate\Http\RedirectResponse
|
|
{
|
|
return DB::transaction(function () use ($request) {
|
|
$app_user = new AppUser();
|
|
$app_user->fill($request->validated());
|
|
|
|
if ($app_user->saveOrFail()) {
|
|
$app_user->directories()->sync(collect($request->directories)->pluck('id'));
|
|
return redirect()
|
|
->route('bo.app-users.edit', ['tenant' => \tenant(), 'app_user' => $app_user])
|
|
->with('success', trans(
|
|
':model a été créé',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
}
|
|
|
|
return redirect()
|
|
->back()
|
|
->with('error', trans(
|
|
':model n\'a pas été créé',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param \App\Models\AppUser $app_user
|
|
* @return \Illuminate\View\View
|
|
*/
|
|
public function edit(AppUser $app_user): \Illuminate\View\View
|
|
{
|
|
$directories = Directory::renderDirectories(
|
|
Directory::query()->where('needAuthorization', 1)->orderBy('name', 'ASC')->get()
|
|
);
|
|
// @phpstan-ignore assign.propertyReadOnly
|
|
$app_user->directories = Directory::renderDirectories($app_user->directories);
|
|
|
|
return view('bo.pages.app-users.edit', [
|
|
'app_userModel' => $app_user,
|
|
'directories' => $directories
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \App\Http\Requests\Bo\AppUser\UpdateAppUserRequest $request
|
|
* @param \App\Models\AppUser $app_user
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function update(UpdateAppUserRequest $request, AppUser $app_user): \Illuminate\Http\RedirectResponse
|
|
{
|
|
$app_user->directories()->sync(collect($request->directories)->pluck('id'));
|
|
$params = $request->validated();
|
|
if (\is_null($params['password'])) {
|
|
unset($params['password']);
|
|
}
|
|
return DB::transaction(function () use ($params, $app_user) {
|
|
$app_user->fill($params);
|
|
|
|
if ($app_user->saveOrFail()) {
|
|
return redirect()
|
|
->route('bo.app-users.edit', ['tenant' => \tenant(), 'app_user' => $app_user])
|
|
->with('success', trans(
|
|
':model a été mis à jour',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
}
|
|
return redirect()
|
|
->back()
|
|
->with('error', trans(
|
|
':model n\'a pas été mis à jour',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param \App\Models\AppUser $app_user
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function destroy(AppUser $app_user): \Illuminate\Http\RedirectResponse
|
|
{
|
|
if ($app_user->deleteOrFail()) {
|
|
return redirect()
|
|
->route('bo.app-users.index', ['tenant' => \tenant()])
|
|
->with('warning', trans(
|
|
':model a bien été supprimé',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
}
|
|
|
|
return redirect()
|
|
->back()
|
|
->with('error', trans(
|
|
':model n\'a pas été supprimé',
|
|
['model' => Str::singular(trans('models.classes.app_users'))]
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Mass import by CSV.
|
|
* matricule;lastname;firstname;email
|
|
* default role = user
|
|
*
|
|
* @param \App\Http\Requests\Bo\ImportRequest $request
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function import(ImportRequest $request): \Illuminate\Http\RedirectResponse
|
|
{
|
|
Excel::import(new AppUserImport(), $request->import, null, \Maatwebsite\Excel\Excel::CSV);
|
|
|
|
return redirect()->route('bo.app-users.index', ['tenant' => \tenant()])->with('success', 'Import terminé.');
|
|
}
|
|
|
|
/**
|
|
* Change order.
|
|
*
|
|
* @param \App\Http\Requests\Bo\UpdateChangeOrderRequest $request
|
|
* @param mixed ...$params
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
* @throws \RuntimeException Si le nom du parametre de la route ne correspond pas au params utilisé.
|
|
*/
|
|
public function changeOrder(UpdateChangeOrderRequest $request, mixed ...$params): \Illuminate\Http\RedirectResponse
|
|
{
|
|
$paramNames = collect(request()->route()->parameterNames);
|
|
$className = Str::of($paramNames->get($paramNames->count() - 2))->lower()->studly();
|
|
$className = "\\App\\Models\\AppUser";
|
|
$modelId = Arr::get($params, $paramNames->count() - 2);
|
|
$model = AppUser::find($modelId);
|
|
|
|
if (!class_exists($className)) {
|
|
throw new \RuntimeException("The {$className} class doesn't exist.");
|
|
}
|
|
|
|
if (!\is_object($model)) {
|
|
throw new \RuntimeException("The second last param isn't an object.");
|
|
}
|
|
|
|
if (get_class($model) !== (string) Str::of($className)->replaceStart('\\', '')) {
|
|
throw new \RuntimeException("The {$className} doesn't match second last binded param.");
|
|
}
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Model|null */
|
|
$model = $className::query()
|
|
->where('tenant_id', \tenant())
|
|
->where($model->getRouteKeyName(), $model->getRouteKey())
|
|
->first();
|
|
|
|
if (!$model) {
|
|
return back()->with('error', trans('crud.messages.order_not_changed'));
|
|
}
|
|
|
|
return DB::transaction(function () use ($request, $className, $model) {
|
|
/** @var \Illuminate\Database\Eloquent\Model|null */
|
|
$tmp = $className::query()
|
|
->where('tenant_id', \tenant())
|
|
->where('order', $request->direction ? '<' : '>', $model->getOriginal('order'))
|
|
->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first();
|
|
|
|
if (!$tmp) {
|
|
return back()->with('error', trans('crud.messages.order_not_changed'));
|
|
}
|
|
|
|
$newOrder = $tmp->getOriginal('order');
|
|
// @phpstan-ignore property.notFound
|
|
$tmp->order = $model->getOriginal('order');
|
|
$tmp->saveQuietly();
|
|
// @phpstan-ignore property.notFound
|
|
$model->order = $newOrder;
|
|
$model->saveQuietly();
|
|
Session::flash('success', trans('crud.messages.order_changed'));
|
|
|
|
return back();
|
|
});
|
|
}
|
|
}
|