File: D:/HostingSpaces/MdnDirecteur/hours.komma.cloud/app/Komma/Expenses/ExpenseController.php
<?php
namespace App\Komma\Expenses;
use App\Http\Controllers\Controller;
use App\Komma\HoursService;
use Carbon\Carbon;
use App\Komma\Cache\CacheService;
use App\Komma\Messages\MessageController;
use App\Komma\Projects\ProjectService;
use App\Komma\Hours\HourService;
use App\Komma\Settings\ExpenseTypes\ExpenseType;
use App\Komma\Settings\ExpenseTypes\ExpenseTypeRepository;
use App\Komma\Subprojects\SubprojectService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Session;
class ExpenseController extends Controller
{
private $homeService;
private $messageController;
private $cacheService;
private $hourService;
private $expenseService;
public function __construct(HoursService $homeService, MessageController $messageController, CacheService $cacheService, HourService $hourService, ExpenseService $expenseService)
{
$this->middleware('auth');
$this->homeService = $homeService;
$this->messageController = $messageController;
$this->cacheService = $cacheService;
$this->hourService = $hourService;
$this->expenseService = $expenseService;
}
/**
* @param HoursService $homeService
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index(Request $request, ProjectService $projectService, SubprojectService $subprojectService)
{
//get cache
$cache = Cache::has('createHour') ? (object)Cache::pull('createHour') : "";
//get id's
$project = $this->cacheService->fillSelectBox("project", $cache);
$subproject = $this->cacheService->fillSelectBox("subproject", $cache);
$cacheExpense = $this->cacheService->fillSelectBox("expense", $cache);
$travelProject = $projectService->getTravelProject();
//get all data
$data = (object)$this->homeService->home($request);
$getHour = null;
if (\Request::get('expense')) {
$getHour = Expense::find(\Request::get('expense'));
}
//if project is chosen
if (!empty($project)) {
//find project
if (!$getProject = $projectService->getProject($project)) {
if ($request->ajax()) {
abort(500, "Project niet gevonden!", ['pjax-error-test' => "Project niet gevonden!"]);
} else {
Session::flash('message', 'Project niet gevonden!');
return redirect('/expense');
}
}
//order subprojects
$subprojects = sortByColumn($getProject->Subprojects, "name", "created_at");
//get budgets of project
$budgets = (object)$projectService->getBudgets($getProject);
//if subproject is chosen
if (!empty($subproject)) {
//find subproject
if (!$getSubproject = $getProject->Subprojects->find($subproject)) {
if ($request->ajax()) {
//abort(500, "Deelproject niet gevonden!", ['pjax-error-test' => "Deelproject niet gevonden!"]);
} else {
Session::flash('message', 'Deelproject niet gevonden!');
return redirect('/expense?project=' . $project);
}
} else {
//get hours of subproject
$subprojectHours = (object)$subprojectService->getSumSubprojectHours($getSubproject);
}
}
}
else {
$subprojects = null;
$cacheProject = null;
$budgets = null;
$getProject = null;
$subprojectHours = null;
$getSubproject = null;
}
$expense = true;
return view('hours.index', compact('data', 'project', 'subproject', 'subprojects', 'cacheExpense', 'getHour', 'expense', 'cache', 'cacheProject', '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',
'expense' => 'required',
'hours' => 'required',
'description' => 'required',
'billable' => 'required',
'date' => 'date',
]);
// extra check to prevent duplicate expenses
$user = \Request::filled('user') ? \Request::get('user') : Auth::id();
if(!$this->expenseService->checkIfExists($request, $user)) {
\DB::transaction(function () use ($request, $user) {
$expense = new Expense();
$expense->user_id = $user;
$expense->subproject_id = $request->subproject;
$expense->expense_type_id = $request->expense;
$expense->value = $request->hours;
$expense->costs = ExpenseType::find($request->expense)->costs;
$expense->description = $request->description;
$expense->intern_description = $request->internDescription;
$expense->date = Carbon::parse($request->date)->toDateString();
$expense->billable = $request->billable;
$expense->bug = $request->bug ? 1 : 0;
$expense->save();
//message + activity
$subject = Expense::find($expense->id);
$value = "Onkosten";
$this->messageController->saved($value, $subject);
});
}
// 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('/expense');
}
/**
* @param Request $request
* @param $expense
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function update(Request $request, $expense)
{
$this->validate($request, [
'project' => 'required',
'subproject' => 'required',
'expense' => 'required',
'hours' => 'required',
'description' => 'required',
'billable' => 'required',
'date' => 'date',
]);
$expense = Expense::find($expense);
//if expense is billed
if (!empty($expense->billed_at) && $expense->billed_at != 0 && $expense->billed_at != '0000-00-00 00:00:00') return back()->with('message', 'Deze onkosten zijn al gefactureerd!' . $expense->billed_at);
\DB::transaction(function () use ($request, $expense) {
$expense->subproject_id = $request->subproject;
$expense->expense_type_id = $request->expense;
$expense->value = $request->hours;
$expense->costs = ExpenseType::find($request->expense)->costs;
$expense->description = $request->description;
$expense->intern_description = $request->internDescription;
$expense->billable = $request->billable;
$expense->date = Carbon::parse($request->date)->toDateString();
$expense->bug = $request->bug ? 1 : 0;
$expense->save();
//message + activity
$subject = Expense::find($expense->id);
$value = "Onkosten";
$this->messageController->changed($value, $subject, true);
});
$redirectRoute = "expense";
// 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]);
return redirect($redirectRoute);
}
/**
* @param $expense
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy($expense, Request $request)
{
//if expense is billed
if (!empty($expense->billed_at) && $expense->billed_at != '0000-00-00 00:00:00') return back()->with('message', 'Deze onkosten zijn al gefactureerd!');
$getExpense = Expense::find($expense);
$getExpense->delete();
//message + activity
$value = "Onkosten";
$this->messageController->destroyed($value, $getExpense);
// 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 back();
}
/**
* @param $expense
* @return \Illuminate\Http\RedirectResponse
*/
public function restore($expense)
{
\DB::transaction(function () use ($expense) {
Expense::withTrashed()->find($expense)->restore();
//message + activity
$subject = Expense::find($expense);
$value = "Onkosten";
$this->messageController->recovered($value, $subject);
});
//return
return back();
}
public function billed($expense)
{
//find expense
$expense = Expense::find($expense);
//get the reverse data
(!empty($expense->billed_at) && $expense->billed_at != '0000-00-00 00:00:00') ? $billed = '0000-00-00 00:00:00' : $billed = Carbon::now();
//update expense
$expense->billed_at = $billed;
$expense->locked_at = $billed;
$expense->save();
//return
return back()->with('message', 'De onkosten is gefactureerd.');
}
public function getExpenseFormData(Request $request, ProjectService $projectService, SubprojectService $subprojectService, ExpenseTypeRepository $expenseTypeRepository) {
$projectProgressBar = $projectService->getProjectProgressBarByID($request->project);
$subprojects = $projectService->getProjectSubprojectsByID($request->project);
$subproject = $subprojectService->getSubProjectByID($request->subproject);
$subprojectProgressBar = $subprojectService->getProjectSubProgressBarByID($request->subproject)->render();
$expenses = $expenseTypeRepository->allExpenseTypes();
$foundExpense = $this->expenseService->getExpenseByID($request->expense);
return response()->json([
"projectProgressBar" => $projectProgressBar,
"subprojects" => $subprojects,
"subproject" => $subproject,
"subprojectProgressBar" => $subprojectProgressBar,
"expense" => $foundExpense,
"expenses" => $expenses
]);
}
public function getExpenseTypesAndUnits(ExpenseTypeRepository $expenseTypeRepository){
return response()->json(['expenses' => $expenseTypeRepository->allExpenseTypes()] );
}
}