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/Excel/ExcelController.php
<?php

namespace App\Komma\Excel;

use App\Http\Controllers\Controller;
use App\Komma\Absences\Absence;
use App\Komma\Companies\Company;
use App\Komma\Excel\Types\ExcelGroup;
use App\Komma\Excel\Types\Exports\AbsencesExport;
use App\Komma\Excel\Types\Row\AbsenceRow;
use App\Komma\Excel\Types\Row\FunctionRow;
use App\Komma\Excel\Types\Row\TitleRow;
use App\Komma\Projects\Project;
use App\Komma\Settings\AbsenceTypes\AbsenceType;
use App\Komma\Subprojects\Subproject;
use App\Komma\Users\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Facades\Excel;


class ExcelController extends Controller
{
    private ExcelService $excelService;
    private $excelExportRepository;
    private $excelExportOptions;

    private Carbon $startDate;
    private Carbon $endDate;

    public function __construct(ExcelExportRepository $excelExportRepository, ExcelExportOptions $excelExportOptions)
    {
        $this->middleware('auth');
        $this->excelService = app(ExcelService::class);
        $this->excelExportRepository = $excelExportRepository;
        $this->excelExportOptions = $excelExportOptions;

        $this->startDate = request()->has('begin') ? Carbon::createFromFormat('d-m-Y', request('begin'))->startOfDay() : today()->startOfYear();
        $this->endDate = request()->has('end') ? Carbon::createFromFormat('d-m-Y', request('end'))->endOfDay() : today()->endOfYear();
    }

    /**
     * Make export of the given subProject
     *
     * @param  Subproject  $subProject
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     */
    public function exportSubProject(Subproject $subProject) {

        $subProject->load('Project');

        $hourRows = $this->excelService->getHourRowsForSubProject($subProject, $this->startDate, $this->endDate);
        $expenseRows = $this->excelService->getExpenseRowsForSubProject($subProject, $this->startDate, $this->endDate);

        // If we only export a subProject we change the sum label to total instead of subtotal
        if($hourRows->count() > 1) {
            $hourRows->last()->label = __('excel.total');
        }

        $excelProjectHours = collect([ new ExcelGroup($hourRows) ]);
        $excelProjectExpenses = collect([ new ExcelGroup($expenseRows) ]);
        $fileName = Str::slug($subProject->Project->name . '-' . $subProject->name) . '-' . today()->format('Ymd-his');

        return $this->excelService->createExcel($excelProjectHours, $excelProjectExpenses, $fileName);
    }

    /**
     * Make export of the given Project
     *
     * @param  Project  $project
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     */
    public function exportProject(Project $project)
    {
        $project->load('Subprojects');

        $excelProjectHours = collect();
        $excelProjectExpenses = collect();

        foreach($project->Subprojects as $subProject)
        {
            $subProject->setRelation('Project', $project);

            $hourRows = $this->excelService->getHourRowsForSubProject($subProject, $this->startDate, $this->endDate);
            $expenseRows = $this->excelService->getExpenseRowsForSubProject($subProject, $this->startDate, $this->endDate);

            $excelProjectHours->push(new ExcelGroup($hourRows));
            $excelProjectExpenses->push(new ExcelGroup($expenseRows));
        }

        $excelProjectHours->push($this->excelService->getSummaryGroup());

        $fileName = Str::slug($project->name ) . '-' . today()->format('Ymd-his');

        return $this->excelService->createExcel($excelProjectHours, $excelProjectExpenses, $fileName);
    }

    public function exportCompany(Company $company)
    {

        $company->load('Projects', 'Projects.Subprojects');

        $excelProjectHours = collect();
        $excelProjectExpenses = collect();

        foreach($company->Projects as $project)
        {
            // Skip project if there aren't any Subprojects
            if($project->Subprojects->count() == 0) continue;

            $titleRow = new TitleRow($project->name);
            $projectTitleGroup = new ExcelGroup(collect([$titleRow]));
            $excelProjectHours->push($projectTitleGroup);

            foreach($project->Subprojects as $subProject)
            {
                $subProject->setRelation('Project', $project);

                $hourRows = $this->excelService->getHourRowsForSubProject($subProject, $this->startDate, $this->endDate);
                $expenseRows = $this->excelService->getExpenseRowsForSubProject($subProject, $this->startDate, $this->endDate);

                $excelProjectHours->push(new ExcelGroup($hourRows));
                $excelProjectExpenses->push(new ExcelGroup($expenseRows));
            }
        }

        $excelProjectHours->push($this->excelService->getSummaryGroup());

        $fileName = Str::slug($company->name ) . '-' . today()->format('Ymd-his');

        return $this->excelService->createExcel($excelProjectHours, $excelProjectExpenses, $fileName);
    }

    /**
     * @param Request $request
     * @return mixed
     */
    public function exportAbsence(Request $request)
    {
        $absenceQuery = Absence::where('date', '>=', $this->startDate)
            ->where('date', '<=', $this->endDate)
            ->orderBy('date')
            ->with('AbsenceType', 'user');

        // Append user query if in request
        $user = !empty($request->user) ? User::where('name', $request->user)->first() : Auth::user();
        if(isset($user)) $absenceQuery = $absenceQuery->where('user_id', $user->id);

        // Append type if in request
        $absenceType = !empty($request->absence) ? AbsenceType::find($request->absence) : null;
        if(isset($absenceType)) $absenceQuery = $absenceQuery->where('absence_type_id', $absenceType->id);

        // Query the absence
        $absences = $absenceQuery->get();

        // Group them by the type
        $absenceGroups = $absences->groupBy('absence_type_id');

        // Create for each group an excel group
        $excelRows = collect();
        foreach ($absenceGroups as $absenceGroup) {

            $rows = collect();
            $rows->push(new TitleRow($absenceGroup->first()->AbsenceType->name));

            foreach ($absenceGroup as $item) $rows->push(new AbsenceRow($item));

            $rows->push(new FunctionRow(__('excel.subtotal'), 'A', ['B' => FunctionRow::SUM]));
            $excelRows->push(new ExcelGroup($rows));
        }

        if(!isset($absenceType)) {

            $summaryRow = new FunctionRow(__('excel.total'), 'A', ['B' => FunctionRow::SUM]);
            $summaryRow->setFunctionType(FunctionRow::TYPE_CELLS);

            $summaryGroup = new ExcelGroup(collect([$summaryRow]));
            $summaryGroup->setCodeName('summary');
            $excelRows->push($summaryGroup);
        }

        $fileName =  isset($absenceType) ? Str::slug( $absenceType->name ) . '-' . today()->format('Ymd-his') : 'verlof-' . today()->format('Ymd-his');
        if(isset($user)) $fileName = Str::slug($user->name) . '-' . $fileName;

        return Excel::download(
            new AbsencesExport($excelRows),
            $fileName . '.xlsx'
        );
    }

}