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