HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/hours.komma.pro/app/Komma/Hours/HourController.php
<?php

namespace App\Komma\Hours;

use App\Komma\HoursService;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use App\Komma\Cache\CacheService;
use App\Komma\Messages\MessageController;
use App\Komma\Projects\ProjectService;
use App\Komma\Subprojects\SubprojectService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;

/**
 * Class HourController
 * @package App\Komma\Hours
 */
class HourController extends Controller
{
    private $homeService;
    private $messageController;
    private $cacheService;
    private $hourService;
    private $subprojectService;

    public function __construct(
        HoursService $homeService,
        MessageController $messageController,
        CacheService $cacheService,
        HourService $hourService,
        SubprojectService $subprojectService
    ) {
        $this->middleware('auth');
//        $this->middleware('permission:multi_select', ['only' => ['multiSelect', 'multiRestore']]); // FIXME: Is this a thing we want?
        $this->homeService = $homeService;
        $this->messageController = $messageController;
        $this->cacheService = $cacheService;
        $this->hourService = $hourService;
        $this->subprojectService = $subprojectService;
    }


    /**
     * @param ProjectService $projectService
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(
        Request $request,
        ProjectService $projectService,
        SubprojectService $subprojectService
    ) {
        // Show flash messages only once
        \Session::push('flash.old', 'flash_notification.message');
        \Session::push('flash.old', 'flash_notification.level');

        //get id's from cache
        $cache = Cache::has('createHour') ? (object)Cache::pull('createHour') : "";
        $project = $this->cacheService->fillSelectBox("project", $cache);
        $subproject = $this->cacheService->fillSelectBox("subproject", $cache);
        $task = $this->cacheService->fillSelectBox("task", $cache);
        $travelProject = $projectService->getTravelProject();

        //get all the hour related data
        $data = (object)$this->homeService->home($request);

        $getHour = null;
        //if hour is selected
        if (\Request::filled('hour')) {
            $hour = $request->hour;
            $getHour = !empty($data->hours->find($hour)) ? $data->hours->find($hour) : Hour::find($hour);
        }
        //expense is not active
        $expense = "";

        // set the project etc for the chosen hour
        if (!empty($getHour)) {
            // get the project, subproject and Task information from the hour
            $getProject = $getHour->task->subproject->project;
            $subprojects = sortByColumn($getProject->Subprojects, "name", "created_at");
            $budgets = (object)$projectService->getBudgets($getProject);
            $getSubproject = $getHour->task->subproject;
            $subprojectHours = (object)$subprojectService->getSumSubprojectHours($getSubproject);
        } else{
            $getProject = null;
            $subprojects = null;
            $budgets = null;
            $getSubproject = null;
            $subprojectHours = null;
        }

        return view('hours.index',
            compact('data', 'project', 'subproject', 'subprojects', 'task', 'getHour', 'expense', 'cache', 'budgets', 'getProject', 'subprojectHours', 'getSubproject', 'travelProject'));
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'project' => 'required',
            'subproject' => 'required',
            'task' => 'required',
            'hours' => 'required',
            'description' => 'required',
            'billable' => 'required',
            'date' => 'date',
        ]);

        $this->hourService->saveFromRequest($request);

        // added so the hours view retains the correct date, view  and/or user (admin only)
        session(['date' => $request->date, 'view' => $request->view, 'user' => $request->user]);

        $redirectRoute = '/hours';
        return redirect($redirectRoute);
    }

    /**
     * @param Request $request
     * @param $hour
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function update(Request $request, $hour)
    {
        $this->validate($request, [
            'project' => 'required',
            'subproject' => 'required',
            'task' => 'required',
            'hours' => 'required',
            'description' => 'required',
            'billable' => 'required',
            'date' => 'date',
        ]);
        //update hour
        $this->hourService->updateFromRequest($request, $hour);

        //make redirect route
        $redirectRoute = '/hours';

        // check for referer
        if ($request->filled('ref')) {
            //get ref
            $ref = $request->get('ref');
            $redirectRoute = str_replace('-', '/', $ref);
        }

        // added so the hours view retains the correct date, view  and/or user (admin only)
        session(['date' => $request->date, 'view' => $request->view, 'user' => $request->user]);

        //redirect
        return redirect($redirectRoute);
    }

    /**
     * @param $hour
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function destroy($hour, Request $request)
    {
        //delete hour
        $this->hourService->destroy($hour);

        $redirectRoute = "/hours";

        // check for referer
        if ($request->filled('ref')) {
            $redirectRoute = $request->get('ref');
        }

        // added so the hours view retains the correct date, view  and/or user (admin only)
        session(['date' => $request->deleteDate, 'view' => $request->view, 'user' => $request->user]);

        return redirect($redirectRoute);
    }


    /**
     * @param $hour
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function restore($hour, Request $request)
    {
        $user = \Request::filled('user') ? \Request::get('user') : Auth::id();
        $date = \Request::filled('date') ? \Request::get('date') : Carbon::today()->format('d-m-Y');
        //restore hour
        $this->hourService->restore($hour);

        $redirectRoute = "/hours";

        // check for referer
        if ($request->filled('ref')) {
            $redirectRoute = $request->get('ref');
        }

        // added so the hours view retains the correct date, view  and/or user (admin only)
        session(['date' => $request->date, 'view' => $request->view, 'user' => $request->user]);

        return redirect($redirectRoute);
    }


    /**
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function multiSelect(Request $request)
    {
        $hours = explode(',', $request->selectedHours);

        foreach ($hours as $hour) {
            $getHour = Hour::with(['Task'])->find($hour);
            $request->filled('subproject') ? $request->get('subproject') : $request->request->add(['subproject' => $getHour->Task->Subproject->id]);
            $request['user'] = $getHour->user_id;
            if ($request->filled('delete')) {
                //delete hour
                $this->hourService->destroy($hour, true);
            } else {
                //update
                $this->hourService->updateSelectedHour($getHour, $hour, $request);
                //message
                \Session::flash('message', ['message' => 'De uren zijn verplaatst', 'url' => '/multiSelect/restore']);
            }
        }

        //return
        return redirect("/subprojecten/" . $request->thisSubproject)->with('selected', $request->selectedHours);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function multiRestore(Request $request)
    {
        //make array of hours string
        $hours = explode(',', $request->selected);

        //loop though array
        foreach ($hours as $hour) {
            //check if must restore
            if (!empty($request->get('delete'))) {
                //restore
                $this->hourService->restore($hour);
            } else {//move back
                //find hour with related task
                $getHour = Hour::with(['Task'])->find($hour);
                //update
                $request['user'] = $getHour->user_id;
                $this->hourService->updateSelectedHour($getHour, $hour, $request);
            }
        }

        return redirect("/subprojecten/" . $request->subproject);
    }

    /**
     * Used to split an hour in the subproject hours view (admin only)
     *
     * @param Request $request
     * @param $hour
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function split(Request $request, $hour)
    {
        //find hour
        $hour = Hour::find($hour);
        //split hour
        $this->hourService->split($hour, $request->range, 0, 0);

        //redirect
        return redirect("/subprojecten/" . $request->subproject);
    }


    /**
     * API call used to fill the hour write form
     *
     * @param Request $request
     * @param ProjectService $projectService
     * @return \Illuminate\Http\JsonResponse
     * @throws \Throwable
     */
    public function getHourFormData(Request $request, ProjectService $projectService)
    {
        $projectProgressBar = $projectService->getProjectProgressBarByID($request->project);
        $subprojects = $projectService->getProjectSubprojectsByID($request->project);

        $subprojectWithTasks = $this->subprojectService->getSubProjectWithTasksByID($request->subproject);
        $subprojectProgressBar = $this->subprojectService->getProjectSubProgressBarByID($request->subproject)->render();

        $foundHour = $this->hourService->getHourByID($request->hour);

        return response()->json([
            "projectProgressBar" => $projectProgressBar,
            "subprojects" => $subprojects,
            "subprojectWithTasks" => $subprojectWithTasks,
            "subprojectProgressBar" => $subprojectProgressBar,
            "hour" => $foundHour
        ]);
    }


}