%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/TimecardsController.php

<?php

namespace App\Http\Controllers\Api\v1;


use App\Exports\TimecardsExport;
use App\Http\Controllers\Api\ApiController;
use App\Http\Requests\Api\v1\Timecards\ApproveTimecardRequest;
use App\Http\Requests\Api\v1\Timecards\BulkApproveTimecardRequest;
use App\Http\Requests\Api\v1\Timecards\BulkUnApproveTimecardRequest;
use App\Http\Requests\Api\v1\Timecards\CreateTimecardRequest;
use App\Models\BaseModel;
use App\Models\Timecard;
use App\Models\User;
use App\Transformers\DayTransformer;
use App\Transformers\TimecardTransformer;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Throwable;

class TimecardsController extends ApiController
{
    /**
     * @var DayTransformer
     */
    private $transformer;

    /**
     * @var User
     */
    private $user;

    public function __construct(TimecardTransformer $transformer)
    {
        $this->transformer = $transformer;
        $this->user = BaseModel::getLoggedInUser();
    }

    public function index(Request $request)
    {
        $timecards = Timecard::query()
                             ->where('user_id', $this->user->id);

        if ($from = $request->get('from')) {
            $timecards = $timecards->where('date', '>=', Carbon::parse($from)
                                                               ->startOfDay());
        }

        if ($to = $request->get('to')) {
            $timecards = $timecards->where('date', '<=', Carbon::parse($to)
                                                               ->endOfDay());
        }

        $timecards = $timecards->orderBy('date', 'desc')
                               ->paginate($request->get('per_page'));
        return $this->paginate($timecards, $this->transformer);
    }

    public function show($timecard)
    {
        $timecard = Timecard::query()
                            ->findOrFail($timecard);
        return $this->item($timecard, $this->transformer);
    }

    public function store(CreateTimecardRequest $request)
    {
        try {
            $timecard = Timecard::createItem($request->only([
                'date',
                'start_time',
                'end_time',
                'notes',
                'project_id',
            ]));
            return $this->item($timecard, $this->transformer);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function update(CreateTimecardRequest $request, $timecard)
    {
        try {
            /** @var Timecard $timecard */
            $timecard = Timecard::query()
                                ->findOrFail($timecard);
            $timecard->updateItem($request->only([
                'date',
                'start_time',
                'end_time',
                'notes',
                'project_id',
            ]));
            return $this->item($timecard, $this->transformer);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function destroy($timecard)
    {
        /** @var Timecard $timecard */
        $timecard = Timecard::query()
                            ->findOrFail($timecard);
        try {
            $timecard->deleteItem();
            return $this->noContent();
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function approve(ApproveTimecardRequest $request, $timecard)
    {
        try {
            $timecard = Timecard::query()
                                ->findOrFail($timecard);
            $timecard->approve($request->get('approved_hours'));
            return $this->item($timecard, $this->transformer);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function bulkApprove(BulkApproveTimecardRequest $request)
    {
        try {
            Timecard::bulkApprove($request->get('timecards'));
            return response()->json([
                'message' => 'ok',
            ], 200);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function bulkUnApprove(BulkUnApproveTimecardRequest $request)
    {
        try {
            Timecard::bulkUnApprove($request->get('timecards'));
            return response()->json([
                'message' => 'ok',
            ], 200);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function toApprove(Request $request)
    {
        $timecards = $this->filterTimecards($request);
        $timecards = $timecards->orderBy('date')
                               ->orderBy('start_time')
                               ->paginate($request->get('per_page'));
        return $this->paginate($timecards, $this->transformer);
    }

    private function filterTimecards(Request $request)
    {
        $user = BaseModel::getLoggedInUser();
        /** @var Builder $timecards */
        $timecards = Timecard::query()
                             ->private($user);
        if (!filter_var($request->get('show_approved'), FILTER_VALIDATE_BOOLEAN)) {
            $timecards = $timecards->where('status', Timecard::TO_APPROVE);
        }

        if ($user->isManager()) {
            $timecards = $timecards->whereHas('project', function (Builder $p) use ($user) {
                $p->where('manager_id', $user->id);
            });
        }

        if ($project = $request->get('project_id')) {
            $timecards = $timecards->where('project_id', $project);
        }

        if ($from = $request->get('from')) {
            $timecards = $timecards->where('date', '>=', $from);
        }

        if ($to = $request->get('to')) {
            $timecards = $timecards->where('date', '<=', $to);
        }

        if ($userId = $request->get('user_id')) {
            $timecards = $timecards->where('user_id', '<=', $userId);
        }
        return $timecards;
    }

    public function approveAll()
    {
        try {
            Timecard::approveAll();
            return response()->json([
                'message' => 'ok',
            ], 200);
        } catch (Throwable $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function export(Request $request)
    {
        $timecards = $this->filterTimecards($request);
        $timecards = $timecards->orderBy('date')
                               ->orderBy('start_time');
        return (new TimecardsExport($timecards))->download('timecards.xlsx');
    }

}

Zerion Mini Shell 1.0