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

}