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
]);
}
}