%PDF- %PDF-
Direktori : /var/www/html/hr/api/app/Http/Controllers/Api/v1/ |
Current File : /var/www/html/hr/api/app/Http/Controllers/Api/v1/UsersController.php |
<?php namespace App\Http\Controllers\Api\v1; use App\Exceptions\AppException; use App\Http\Controllers\Api\ApiController; use App\Http\Requests\Api\v1\Configurations\CreateConfigurationRequest; use App\Http\Requests\Api\v1\Users\CreateUserRequest; use App\Http\Requests\Api\v1\Users\UpdateUserRequest; use App\Imports\UsersImport; use App\Models\Configuration; use App\Models\Role; use App\Models\User; use App\Transformers\AnnualLeaveTransformer; use App\Transformers\ConfigurationTransformer; use App\Transformers\ProjectTransformer; use App\Transformers\RoleTransformer; use App\Transformers\UserDetailsTransformer; use App\Transformers\UserTransformer; use Carbon\Carbon; use Flow\Config; use Flow\File; use Flow\Request as FlowRequest; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Maatwebsite\Excel\Validators\ValidationException; use Spatie\Fractal\Fractal; use Throwable; class UsersController extends ApiController { /** * User $user. */ protected $user; /** * @var UserTransformer */ private $transformer; /** * @var UserDetailsTransformer */ private $detailsTransformer; /** * @var RoleTransformer */ private $roleTransformer; /** * PostsController constructor. * @param UserTransformer $transformer * @param UserDetailsTransformer $detailsTransformer * @param RoleTransformer $roleTransformer */ public function __construct(UserTransformer $transformer, UserDetailsTransformer $detailsTransformer, RoleTransformer $roleTransformer) { $this->transformer = $transformer; $this->detailsTransformer = $detailsTransformer; $this->roleTransformer = $roleTransformer; } /** * @param Request $request * @return Fractal */ public function index(Request $request) { /** @var LengthAwarePaginator $result */ $result = $this->filterUsers($request) ->paginate($request->get('per_page')); return $this->paginate($result, $this->transformer); } private function filterUsers(Request $request) { $result = User::query() ->whereHas('roles'); if ($name = $request->get('name')) { $result = $result->where('name', 'like', "$name%"); } if ($surname = $request->get('surname')) { $result = $result->where('surname', 'like', "$surname%"); } if ($email = $request->get('email')) { $result = $result->where('email', 'like', "$email%"); } if ($search = $request->get('search')) { $result = $result->where('email', 'like', "%$search%") ->orWhere('surname', 'like', "%$search%") ->orWhere('name', 'like', "%$search%"); } return $result; } /** * @param $id * @return JsonResponse */ public function show($id) { $user = User::query() ->find($id); return $this->item($user, $this->detailsTransformer); } public function store(CreateUserRequest $request) { try { $data = $request->only([ 'name', 'surname', 'email', 'phone', 'birthday', 'roles', 'external_reference', ]); $data['role_ids'] = collect($data['roles'])->pluck('id'); $data['configurations']['valid_from'] = $request->get('started_working'); /** @var User $user */ $user = User::createItem($data, true); return $this->item($user, $this->detailsTransformer); } catch (Throwable $e) { return $this->wrongArguments([ 'message' => $e->getMessage(), ]); } } public function update(UpdateUserRequest $request, $id) { try { /** @var User $user */ $user = User::query() ->findOrFail($id); $data = $request->only([ 'name', 'surname', 'email', 'phone', 'birthday', 'roles', 'external_reference', ]); $data['role_ids'] = collect($data['roles'])->pluck('id'); $user->updateItem($data); return $this->item($user, $this->detailsTransformer); } catch (Throwable $e) { return $this->wrongArguments([ 'message' => $e->getMessage(), ]); } } /** * @param $id * @return JsonResponse */ public function enable($id) { /** @var User $user */ $user = User::query() ->findOrFail($id); $user->enable(); return $this->item($user, $this->detailsTransformer); } /** * @param $id * @return JsonResponse */ public function disable($id) { /** @var User $user */ $user = User::query() ->findOrFail($id); try { $user->disable(); } catch (AppException $e) { return $this->wrongArguments($e->getMessage()); } return $this->item($user, $this->detailsTransformer); } public function getRoles() { return $this->collection(Role::query() ->get(), $this->roleTransformer); } public function downloadExcelExample() { return response()->download(storage_path("users_import_example.xlsx")); } public function import() { $fileName = md5(time());; $request = new FlowRequest(); $config = new Config([ 'tempDir' => storage_path('app/flow/chunks'), ]); $file = new File($config, $request); $realFileName = $request->getParam('flowFilename'); $ext = last(explode('.', $realFileName)); $destination = storage_path("app/flow/uploads/$fileName.$ext"); if (request()->isMethod('GET')) { if (!$file->checkChunk()) { return response()->make('', 204); } } else { if ($file->validateChunk()) { $file->saveChunk(); } else { return $this->wrongArguments('test'); } } try { if ($file->validateFile() && $file->save($destination)) { $importer = new UsersImport(); try { $importer->import($destination); return response()->json([ 'message' => 'Done', ], 200); } catch (ValidationException $e) { $errors = collect(); $failures = $e->failures(); foreach ($failures as $failure) { $errors->push([ 'row' => $failure->row(), 'errors' => $failure->errors(), ]); } return response([ 'message' => trans('import.success_with_error'), 'errors' => $errors, ], 400); } } return response(['message' => 'ok'], 200); } catch (\Exception $e) { return $this->wrongArguments($e->getMessage()); } } public function getProjects(Request $request, User $user) { $date = Carbon::parse($request->get('date')); $projects = $user->getActiveProjects($date); return $this->collection($projects, new ProjectTransformer(), 'projects'); } public function getConfigurations(User $user) { $config = $user->currentConfigurations(); return $this->item($config, new ConfigurationTransformer()); } public function updateConfigurations(CreateConfigurationRequest $request, User $user) { /** @var Configuration $config */ $config = $user->currentConfigurations(); try { $config->updateItem($request->only([ 'should_get_holidays_from_working_day_overtime', 'holidays_percentage_from_working_day_overtime', 'should_get_holidays_from_non_working_day_overtime', 'holidays_percentage_from_non_working_day_overtime', 'should_postpone_holidays', 'holidays_validity_in_months', 'annual_leave_quantity', 'expected_daily_working_hours', 'overtime_percentage_on_working_day', 'overtime_percentage_on_non_working_day', 'out_sick_percentage', 'valid_from', 'valid_to', ])); return $this->item($config, new ConfigurationTransformer()); } catch (Throwable $e) { return $this->wrongArguments($e->getMessage()); } } public function getPerformance(Request $request, User $user) { return $user->performance($request->get('from'), $request->get('to')); } public function getPtoLogs(Request $request, User $user) { return $this->item($user->annualLeave, new AnnualLeaveTransformer()); } }