Files
nutzwerte_fi4/app/Actions/Generate/ExcelAufstellung.php
T
2026-07-05 18:14:23 +02:00

185 lines
8.9 KiB
PHP

<?php
namespace App\Actions\Generate;
use App\Actions\Generate\Tabellen\LadeProjekt;
use App\Models\Aufstellung;
use App\Models\Gutachter;
use App\Models\Projekte;
use App\Models\ProjektMethode;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Style\Fill;
class ExcelAufstellung
{
public static function make(int $projekte_id)
{
$black = 'ff62748e';
$blue = 'ff2b7fff';
$green = 'ff00bc7d';
$border = 'ff57534d';
$projekt = Projekte::where('id', $projekte_id)->first();
$gutachter = Gutachter::where('id', $projekt->gutachter_id)->first();
$filepath = Storage::disk('public')->path("/download/$projekte_id/");
$filename = 'Aufstellung '.preg_replace("'[^0-9a-zA-Z]'", '', $projekt->interner_name).'.xlsx';
if (! File::isDirectory($filepath)) {
File::makeDirectory($filepath, 0777, true, true);
}
$file = $filepath.$filename;
// SPREADSHEET start
$spreadsheet = new Spreadsheet;
$spreadsheet->getProperties()->setCreator($gutachter->company)
->setLastModifiedBy($gutachter->name)
->setTitle($projekt->offizieller_name)
->setDescription($projekt->interner_name.' - '.date('d-m-Y H:i:s'));
$activeWorksheet = $spreadsheet->getActiveSheet();
$activeWorksheet->getStyle('A1:Z1')->getAlignment()->setTextRotation(90);
$activeWorksheet->getRowDimension('1')->setRowHeight(180);
$activeWorksheet->getStyle('A1:Z3')->getFont()->getColor()->setARGB(Color::COLOR_WHITE);
$activeWorksheet->getStyle('A1:Z3')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$activeWorksheet->getStyle('A1:D3')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($black);
$key = 'A';
$titels = ['Top Nummer', 'Geschoß', 'Orientierung', 'Type'];
foreach ($titels as $titel) {
$activeWorksheet->setCellValue($key.'1', ' '.$titel);
$activeWorksheet->setCellValue($key.'2', ' ');
$activeWorksheet->setCellValue($key.'3', ' ');
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getBorders()->getRight()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->getStyle($key.'3')->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->getColumnDimension($key)->setAutoSize(true);
$key++;
}
$raumarten = ProjektMethode::where('projekte_id', $projekte_id)->where('methode_id', 1)->orderBy('raumart')->pluck('raumart');
$raumarten_map = [];
foreach ($raumarten as $raumart) {
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($blue);
$activeWorksheet->setCellValue($key.'1', ' '.$raumart);
$raumarten_map[$raumart] = $key;
$activeWorksheet->getStyle($key.'3')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getBorders()->getRight()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->getStyle($key.'3')->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->setCellValue($key.'3', 'm²');
$activeWorksheet->getColumnDimension($key)->setAutoSize(true);
$key++;
}
$raumarten_map['next'] = $key;
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($black);
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getBorders()->getRight()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->setCellValue($key.'1', ' Summe Nutzflächen');
$activeWorksheet->setCellValue($key.'3', 'm²');
$activeWorksheet->getStyle($key.'3')->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->getColumnDimension($key)->setAutoSize(true);
$key++;
$titels = Aufstellung::pluck('name', 'id');
foreach ($titels as $k => $titel) {
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($green);
$activeWorksheet->setCellValue($key.'1', ' '.$titel);
$activeWorksheet->getStyle($key.'3')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$activeWorksheet->getStyle($key.'1:'.$key.'3')->getBorders()->getRight()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->getStyle($key.'3')->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$activeWorksheet->setCellValue($key.'3', 'm²');
$activeWorksheet->getColumnDimension($key)->setAutoSize(true);
$raumarten_map[$k] = $key;
$key++;
}
$_projekt = LadeProjekt::project($projekte_id, false);
$row = 4;
foreach ($_projekt as $top_number => $value) {
$key = 'A';
$activeWorksheet->setCellValue($key.$row, $top_number);
$activeWorksheet->getStyle($key.$row)->getFont()->getColor()->setARGB(Color::COLOR_WHITE);
$activeWorksheet->getStyle($key.$row)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($black);
$activeWorksheet->getStyle($key.$row)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$activeWorksheet->getStyle($key.$row)->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$key++;
$activeWorksheet->setCellValue($key.$row, $value[1][0]['geschoss']);
$key++;
$activeWorksheet->setCellValue($key.$row, $value[1][0]['orientierung']);
$key++;
$activeWorksheet->setCellValue($key.$row, $value[1][0]['type']);
$key++;
$summe_flaechen = 0;
foreach ($value[1] as $raeume) {
$raumart_key = $raumarten_map[$raeume['raumart']];
$activeWorksheet->setCellValue($raumart_key.$row, $raeume['flaeche']);
$activeWorksheet->getStyle($raumart_key.$row)->getNumberFormat()->setFormatCode('0.00');
$summe_flaechen += $raeume['flaeche'];
}
$key = $raumarten_map['next'];
$activeWorksheet->setCellValue($key.$row, $summe_flaechen);
$activeWorksheet->getStyle($key.$row)->getNumberFormat()->setFormatCode('0.00');
$activeWorksheet->getStyle($key.$row)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setARGB($black);
$activeWorksheet->getStyle($key.$row)->getFont()->getColor()->setARGB(Color::COLOR_WHITE);
$activeWorksheet->getStyle($key.$row)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
$activeWorksheet->getStyle($key.$row)->getBorders()->getBottom()->setBorderStyle(Border::BORDER_HAIR)->setColor(new Color($border));
$key++;
$summen = self::filter_flaechen($value);
foreach ($summen as $k => $value) {
$key = $raumarten_map[$k];
$activeWorksheet->setCellValue($key.$row, $value);
$activeWorksheet->getStyle($key.$row)->getNumberFormat()->setFormatCode('0.00');
}
$row++;
}
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$spreadsheet->setActiveSheetIndex(0);
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
// $writer->save('php://output');
$writer->save($file);
$headers = [
'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Cache-Control: max-age=0',
'Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT',
'Cache-Control: cache, must-revalidate',
];
return Response::download($file, $filename, $headers);
}
public static function filter_flaechen($arr)
{
$sum = [];
foreach ($arr as $key => $methode) {
if ($key > 1) {
foreach ($methode as $k => $v) {
if (! isset($sum[$v['aufstellung_id']])) {
$sum[$v['aufstellung_id']] = $v['flaeche'];
} else {
$sum[$v['aufstellung_id']] += $v['flaeche'];
}
}
}
}
return $sum;
}
}