185 lines
8.9 KiB
PHP
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($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;
|
|
}
|
|
}
|