358 lines
9.8 KiB
PHP
Raw Normal View History

2017-09-14 22:21:00 +03:00
<?php
namespace App\Http\Controllers\Auth;
2019-11-16 10:21:14 +03:00
use App\Abstracts\Http\Controller;
2020-07-26 19:47:23 +03:00
use App\Events\Auth\LandingPageShowing;
2017-09-14 22:21:00 +03:00
use App\Http\Requests\Auth\User as Request;
2022-06-01 10:15:55 +03:00
use App\Jobs\Auth\CreateInvitation;
2019-11-16 10:21:14 +03:00
use App\Jobs\Auth\CreateUser;
use App\Jobs\Auth\DeleteUser;
use App\Jobs\Auth\UpdateUser;
2017-09-14 22:21:00 +03:00
use App\Models\Auth\Role;
2022-06-01 10:15:55 +03:00
use App\Models\Auth\User;
use App\Traits\Cloud;
use App\Traits\Uploads;
2019-11-16 10:21:14 +03:00
use Illuminate\Http\Request as BaseRequest;
2017-09-14 22:21:00 +03:00
class Users extends Controller
{
2022-06-01 10:15:55 +03:00
use Cloud, Uploads;
2020-06-21 18:48:05 +03:00
public function __construct()
{
$this->middleware('permission:create-auth-users')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-auth-users')->only('index', 'show', 'export');
$this->middleware('permission:update-auth-users')->only('enable', 'disable');
$this->middleware('permission:delete-auth-users')->only('destroy');
$this->middleware('permission:read-auth-users|read-auth-profile')->only('edit');
$this->middleware('permission:update-auth-users|update-auth-profile')->only('update');
}
2017-09-14 22:21:00 +03:00
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
2020-06-07 12:11:37 +03:00
$users = User::with('media', 'roles')->collect();
2017-09-14 22:21:00 +03:00
2020-11-06 00:43:46 +03:00
return $this->response('auth.users.index', compact('users'));
2017-09-14 22:21:00 +03:00
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show()
{
return redirect()->route('users.index');
}
2017-09-14 22:21:00 +03:00
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
2020-07-26 19:47:23 +03:00
$u = new \stdClass();
$u->landing_pages = [];
event(new LandingPageShowing($u));
$landing_pages = $u->landing_pages;
2020-01-21 11:59:52 +03:00
$roles = Role::all()->reject(function ($r) {
2019-11-16 10:21:14 +03:00
return $r->hasPermission('read-client-portal');
2022-06-01 10:15:55 +03:00
})->pluck('display_name', 'id');
2017-09-14 22:21:00 +03:00
$companies = user()->companies()->take(setting('default.select_limit'))->get()->sortBy('name')->pluck('name', 'id');
2017-09-14 22:21:00 +03:00
2022-06-01 10:15:55 +03:00
$roles_url = $this->getCloudRolesPageUrl();
return view('auth.users.create', compact('roles', 'companies', 'landing_pages', 'roles_url'));
2017-09-14 22:21:00 +03:00
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
2019-11-16 10:21:14 +03:00
$response = $this->ajaxDispatch(new CreateUser($request));
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
if ($response['success']) {
$response['redirect'] = route('users.index');
2022-06-01 10:15:55 +03:00
$message = trans('messages.success.invited', ['type' => trans_choice('general.users', 1)]);
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
flash($message)->success();
} else {
$response['redirect'] = route('users.create');
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
$message = $response['message'];
2017-09-14 22:21:00 +03:00
flash($message)->error()->important();
2019-11-16 10:21:14 +03:00
}
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
return response()->json($response);
2017-09-14 22:21:00 +03:00
}
/**
* Show the form for editing the specified resource.
*
* @param User $user
*
* @return Response
*/
public function edit(User $user)
{
2020-06-21 18:48:05 +03:00
if (user()->cannot('read-auth-users') && ($user->id != user()->id)) {
abort(403);
}
2020-07-26 19:47:23 +03:00
$u = new \stdClass();
$u->landing_pages = [];
event(new LandingPageShowing($u));
$landing_pages = $u->landing_pages;
2020-01-21 11:59:52 +03:00
2021-09-01 23:16:41 +03:00
if ($user->isCustomer()) {
2017-12-02 14:07:12 +03:00
// Show only roles with customer permission
$roles = Role::all()->reject(function ($r) {
2019-11-16 10:21:14 +03:00
return !$r->hasPermission('read-client-portal');
2022-06-01 10:15:55 +03:00
})->pluck('display_name', 'id');
2017-12-02 14:07:12 +03:00
} else {
// Don't show roles with customer permission
$roles = Role::all()->reject(function ($r) {
2019-11-16 10:21:14 +03:00
return $r->hasPermission('read-client-portal');
2022-06-01 10:15:55 +03:00
})->pluck('display_name', 'id');
2017-12-02 14:07:12 +03:00
}
2017-09-14 22:21:00 +03:00
$companies = user()->companies()->take(setting('default.select_limit'))->get()->sortBy('name')->pluck('name', 'id');
2017-09-14 22:21:00 +03:00
if ($user->company_ids) {
2022-06-01 10:15:55 +03:00
foreach ($user->company_ids as $company_id) {
2020-12-31 09:32:00 +03:00
if ($companies->has($company_id)) {
continue;
}
2022-06-01 10:15:55 +03:00
$company = company($company_id);
$companies->put($company->id, $company->name);
}
}
2022-06-01 10:15:55 +03:00
$roles_url = $this->getCloudRolesPageUrl();
$route = (request()->route()->getName() == 'profile.edit') ? 'profile.update' : 'users.update';
return view('auth.users.edit', compact('user', 'companies', 'roles', 'landing_pages', 'roles_url', 'route'));
2017-09-14 22:21:00 +03:00
}
/**
* Update the specified resource in storage.
*
2019-11-16 10:21:14 +03:00
* @param User $user
* @param Request $request
2017-09-14 22:21:00 +03:00
*
* @return Response
*/
public function update(User $user, Request $request)
{
2020-06-21 18:48:05 +03:00
if (user()->cannot('update-auth-users') && ($user->id != user()->id)) {
abort(403);
}
2019-11-16 10:21:14 +03:00
$response = $this->ajaxDispatch(new UpdateUser($user, $request));
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
if ($response['success']) {
2020-10-05 11:31:18 +03:00
$response['redirect'] = user()->can('read-auth-users') ? route('users.index') : route('users.edit', $user->id);
2019-11-16 10:21:14 +03:00
$message = trans('messages.success.updated', ['type' => $user->name]);
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
flash($message)->success();
} else {
$response['redirect'] = route('users.edit', $user->id);
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
$message = $response['message'];
2017-09-14 22:21:00 +03:00
flash($message)->error()->important();
2019-11-16 10:21:14 +03:00
}
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
return response()->json($response);
2017-09-14 22:21:00 +03:00
}
2018-06-11 11:19:30 +03:00
/**
* Enable the specified resource.
*
2019-11-16 10:21:14 +03:00
* @param User $user
2018-06-11 11:19:30 +03:00
*
* @return Response
*/
public function enable(User $user)
{
2019-11-16 10:21:14 +03:00
$response = $this->ajaxDispatch(new UpdateUser($user, request()->merge(['enabled' => 1])));
2018-06-11 11:19:30 +03:00
2019-11-16 10:21:14 +03:00
if ($response['success']) {
$response['message'] = trans('messages.success.enabled', ['type' => $user->name]);
}
2018-06-11 11:19:30 +03:00
2019-11-16 10:21:14 +03:00
return response()->json($response);
2018-06-11 11:19:30 +03:00
}
/**
* Disable the specified resource.
*
2019-11-16 10:21:14 +03:00
* @param User $user
2018-06-11 11:19:30 +03:00
*
* @return Response
*/
public function disable(User $user)
{
2019-11-16 10:21:14 +03:00
$response = $this->ajaxDispatch(new UpdateUser($user, request()->merge(['enabled' => 0])));
2018-06-11 11:19:30 +03:00
2019-11-16 10:21:14 +03:00
if ($response['success']) {
$response['message'] = trans('messages.success.disabled', ['type' => $user->name]);
}
2018-06-11 11:19:30 +03:00
2019-11-16 10:21:14 +03:00
return response()->json($response);
2018-06-11 11:19:30 +03:00
}
2017-09-14 22:21:00 +03:00
/**
* Remove the specified resource from storage.
*
2019-11-16 10:21:14 +03:00
* @param User $user
2017-09-14 22:21:00 +03:00
*
* @return Response
*/
public function destroy(User $user)
{
2019-11-16 10:21:14 +03:00
$response = $this->ajaxDispatch(new DeleteUser($user));
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
$response['redirect'] = route('users.index');
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
if ($response['success']) {
$message = trans('messages.success.deleted', ['type' => $user->name]);
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
flash($message)->success();
} else {
$message = $response['message'];
2017-09-14 22:21:00 +03:00
flash($message)->error()->important();
2019-11-16 10:21:14 +03:00
}
2017-09-14 22:21:00 +03:00
2019-11-16 10:21:14 +03:00
return response()->json($response);
2017-09-14 22:21:00 +03:00
}
/**
* Mark upcoming bills notifications are read and redirect to bills page.
*
2019-11-16 10:21:14 +03:00
* @param User $user
2017-09-14 22:21:00 +03:00
*
* @return Response
*/
public function readUpcomingBills(User $user)
{
// Mark bill notifications as read
foreach ($user->unreadNotifications as $notification) {
// Not a bill notification
2019-12-31 15:49:09 +03:00
if ($notification->getAttribute('type') != 'App\Notifications\Purchase\Bill') {
2017-09-14 22:21:00 +03:00
continue;
}
$notification->markAsRead();
}
2019-11-16 10:21:14 +03:00
return redirect()->route('bills.index');
2017-09-14 22:21:00 +03:00
}
/**
* Mark overdue invoices notifications are read and redirect to invoices page.
*
2019-11-16 10:21:14 +03:00
* @param User $user
2017-09-14 22:21:00 +03:00
*
* @return Response
*/
public function readOverdueInvoices(User $user)
{
// Mark invoice notifications as read
foreach ($user->unreadNotifications as $notification) {
// Not an invoice notification
2019-12-31 15:49:09 +03:00
if ($notification->getAttribute('type') != 'App\Notifications\Sale\Invoice') {
2017-09-14 22:21:00 +03:00
continue;
}
$notification->markAsRead();
}
2019-11-16 10:21:14 +03:00
return redirect()->route('invoices.index');
2017-11-21 23:37:15 +03:00
}
2019-11-16 10:21:14 +03:00
public function autocomplete(BaseRequest $request)
{
$user = false;
$data = false;
$column = $request['column'];
$value = $request['value'];
2022-06-01 10:15:55 +03:00
if (! empty($column) && ! empty($value)) {
switch ($column) {
case 'id':
$user = User::find((int) $value);
break;
case 'email':
$user = User::where('email', $value)->first();
break;
default:
$user = User::where($column, $value)->first();
}
$data = $user;
2022-06-01 10:15:55 +03:00
} elseif (! empty($column) && empty($value)) {
$data = trans('validation.required', ['attribute' => $column]);
}
return response()->json([
'errors' => ($user) ? false : true,
'success' => ($user) ? true : false,
2022-06-01 10:15:55 +03:00
'data' => $data,
]);
}
2022-06-01 10:15:55 +03:00
/**
* Process request for reinviting the specified resource.
*
* @param User $user
*
* @return Response
*/
public function invite(User $user)
{
$response = $this->ajaxDispatch(new CreateInvitation($user, company()));
$response['redirect'] = route('users.index');
if ($response['success']) {
$message = trans('messages.success.invited', ['type' => trans_choice('general.users', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
2017-09-14 22:21:00 +03:00
}