This commit is contained in:
salam committed 2025-10-20 18:37:56 +02:00
1 parent 9eb19cf8fd
commit 551ad2369e
17 files changed
+277 -38

No files matched your search

+3 -2
View File
@@ -7,7 +7,7 @@ use Filament\Forms\Components\RichEditor\RichContentRenderer;
class Deckblatt class Deckblatt
{ {
public static function create() public static function create($textblock)
{ {
// $table->boolean('logo_anzeigen')->default(0); // $table->boolean('logo_anzeigen')->default(0);
// $table->boolean('text_anzeigen')->default(0); // $table->boolean('text_anzeigen')->default(0);
@@ -33,8 +33,9 @@ class Deckblatt
$html .= '</div>'; $html .= '</div>';
$html .= '<div id="deckblatt-festsetzung">'; $html .= '<div id="deckblatt-festsetzung">';
$html .= '<h2>Zur Festsetzung der Nutzwerte'; $html .= '<h2>ZUR FESTSETZUNG DER NUTZWERTE';
$html .= '<div class="base bold">'.trim(MakeGutachten::$projekt->offizieller_name).'</div>'; $html .= '<div class="base bold">'.trim(MakeGutachten::$projekt->offizieller_name).'</div>';
$html .= '<div class="base">'.trim($textblock).'</div>';
$html .= '</h2>'; $html .= '</h2>';
$html .= '</div>'; $html .= '</div>';
@@ -0,0 +1,13 @@
<?php
namespace App\Actions\Generate\Gutachten;
use App\Actions\Generate\MakeGutachten;
class Platzhalter
{
public static function replace($standardtext)
{
return str_replace(array_keys(MakeGutachten::$platzhalter), array_values(MakeGutachten::$platzhalter), $standardtext);
}
}
@@ -1,13 +0,0 @@
<?php
namespace App\Actions\Generate\Gutachten;
use App\Actions\Generate\GenerateStandardTexte;
class Standardtext
{
public static function replace($standardtext)
{
return str_replace(array_keys(GenerateStandardTexte::$platzhalter), array_values(GenerateStandardTexte::$platzhalter), $standardtext);
}
}
+34 -7
View File
@@ -6,12 +6,16 @@ use App\Actions\Generate\Gutachten\AllgemeinTabelle;
use App\Actions\Generate\Gutachten\Deckblatt; use App\Actions\Generate\Gutachten\Deckblatt;
use App\Actions\Generate\Gutachten\Inhalt; use App\Actions\Generate\Gutachten\Inhalt;
use App\Actions\Generate\Gutachten\Paragraph6Tabelle; use App\Actions\Generate\Gutachten\Paragraph6Tabelle;
use App\Actions\Generate\Gutachten\Platzhalter;
use App\Actions\Generate\Gutachten\Standardtext; use App\Actions\Generate\Gutachten\Standardtext;
use App\Actions\Generate\Gutachten\Tabelle; use App\Actions\Generate\Gutachten\Tabelle;
use App\Actions\Generate\Utilities\Format;
use App\Actions\Generate\Utilities\Html;
use App\Models\Auftraggeber; use App\Models\Auftraggeber;
use App\Models\Gutachter; use App\Models\Gutachter;
use App\Models\Inhaltsverzeichnis; use App\Models\Inhaltsverzeichnis;
use App\Models\Projekte; use App\Models\Projekte;
use App\Models\ProjektInhaltsverzeichnis;
use App\Models\ProjektPlatzhalter; use App\Models\ProjektPlatzhalter;
use Mpdf\HTMLParserMode; use Mpdf\HTMLParserMode;
use Mpdf\Mpdf; use Mpdf\Mpdf;
@@ -29,8 +33,6 @@ class MakeGutachten
public static function generate($filepath, $projekte_id) public static function generate($filepath, $projekte_id)
{ {
exit;
self::$projekt = Projekte::where('id', $projekte_id)->first(); self::$projekt = Projekte::where('id', $projekte_id)->first();
self::$gutachter = Gutachter::where('id', self::$projekt->gutachter_id)->first(); self::$gutachter = Gutachter::where('id', self::$projekt->gutachter_id)->first();
@@ -61,11 +63,36 @@ class MakeGutachten
$mpdf->SetCreator('nutzwerte.at'); $mpdf->SetCreator('nutzwerte.at');
$mpdf->SetAuthor(self::$gutachter->title.' '.self::$gutachter->gender.' '.self::$gutachter->name); $mpdf->SetAuthor(self::$gutachter->title.' '.self::$gutachter->gender.' '.self::$gutachter->name);
/** $inhalte = ProjektInhaltsverzeichnis::where('projekte_id', $projekte_id)->orderBy('sort')->get();
* DECKBLATT
*/ foreach ($inhalte as $inhalt) {
$html = Deckblatt::create(); /**
$mpdf->WriteHTML($html, HTMLParserMode::HTML_BODY); * DECKBLATT
*/
if ($inhalt->name == 'DECKBLATT') {
$textblock = Platzhalter::replace($inhalt->textblock);
$html = Deckblatt::create($textblock);
$mpdf->WriteHTML($html, HTMLParserMode::HTML_BODY);
}
/**
* INHALTSVERZEICHNIS
*/
if ($inhalt->name == 'INHALTSVERZEICHNIS') {
$mpdf->AddPage();
$html = '<div class="header">INHALTSVERZEICHNIS</div>';
$html .= '<table class="inhalt">';
foreach ($inhalte as $data) {
$html .= '<tr>';
$html .= Html::td(Format::numeric($data->ordnungszahl, 2));
$html .= Html::td($data->name);
$html .= Html::td(Format::numeric($data->seite, 0));
$html .= '</tr>';
}
$html .= '</table>';
$mpdf->SetHTMLFooter('<div class="size09 center">Seite {PAGENO}<br><br></div>');
$mpdf->WriteHTML($html, HTMLParserMode::HTML_BODY);
}
}
// $inhalte = Inhaltsverzeichnis::where('projekte_id', $projekte_id)->where('is_active', 1)->orderBy('pos')->get(); // $inhalte = Inhaltsverzeichnis::where('projekte_id', $projekte_id)->where('is_active', 1)->orderBy('pos')->get();
// if (count($inhalte) == 0) { // if (count($inhalte) == 0) {
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace App\Actions\Generate\Utilities;
class Filter
{
public static function filter_array($array, $filter)
{
$return = [];
foreach ($array as $value) {
if (isset($value[$filter])) {
$return[] = $value[$filter];
}
}
return $return;
}
public static function get_separator($row)
{
if (substr_count($row, '|') == 3) {
return '|';
} elseif (substr_count($row, ';') == 3) {
return ';';
} elseif (substr_count($row, ',' == 3)) {
return ',';
}
}
public static function is_active(array $documents): array
{
foreach ($documents as $key => $row) {
if ($row['is_active'] == 1) {
return $row;
}
}
return [];
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
namespace App\Actions\Generate\Utilities;
class Format
{
public static function numeric($value, $stellen)
{
if (is_numeric($value) && $value * 1 > 0) {
return number_format($value, $stellen, '.', '.');
} else {
return '';
}
}
}
+42
View File
@@ -0,0 +1,42 @@
<?php
namespace App\Actions\Generate\Utilities;
class Html
{
public static function table_header_90($_row)
{
$html = '<thead><tr text-rotate="90deg">';
$mm = 190 / \count($_row);
foreach ($_row as $value) {
$html .= '<td class="head right bl bt br bb" style="background-color:#d1d1d1; width: '.$mm.'mm;">'.$value.'</td>';
}
$html .= '</tr></thead>';
return $html;
}
public static function make_table($str)
{
$array = explode('<br />', $str);
$html = '<table class="table-striped bt bl">';
foreach ($array as $value) {
$tmp = explode('|', $value);
$html .= '<tr>';
$html .= self::td($tmp[0], 'br bb');
$html .= self::td($tmp[1], 'br bb');
$html .= '</tr>';
}
$html .= '</table>';
return $html;
}
public static function td($value = '', $classname = '', $colspan = 0)
{
$cls = $classname != '' ? ' class="'.$classname.'"' : '';
$spn = $colspan != '' ? ' colspan="'.$colspan.'"' : '';
return "<td $cls $spn>".$value.'</td>';
}
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Actions\Generate\Utilities;
class Notice
{
// note
public static function note($message, $color = '', $exit = false)
{
switch ($color) {
case 'g':
echo "\e[32m";
break;
case 'r':
echo "\e[31m";
break;
case 'b':
echo "\e[1;34m";
break;
default:
echo "\e[39m";
break;
}
echo PHP_EOL.'-----------------------------------------------------------'.PHP_EOL;
if (is_array($message)) {
print_r($message);
} else {
echo $message.PHP_EOL;
}
echo '-----------------------------------------------------------'.PHP_EOL;
echo "\e[39m";
if ($exit) {
exit();
}
}
public static function html($message, $color = '', $exit = false)
{
switch ($color) {
case 'g':
echo '<div style="margin:10px; padding:3px; color:green; width=20rem; text-align:center; border:solid 1px green; background-color:lightgreen;">';
break;
case 'r':
echo '<div style="margin:10px; padding:3px; color:red; width=20rem; text-align:center; border:solid 1px red; background-color:#fdd;">';
break;
case 'b':
echo '<div style="margin:10px; padding:3px; color:blue; width=20rem; text-align:center; border:solid 1px blue; background-color:lightblue;">';
break;
default:
echo '<div style="margin:10px; padding:3px; color:black; width=20rem; text-align:center; border:solid 1px black; background-color:#eee;">';
break;
}
if (is_array($message)) {
print_r($message);
} else {
echo $message;
}
echo '</div>';
if ($exit) {
exit();
}
}
}
@@ -19,6 +19,9 @@ class InhaltsverzeichnisForm
->components([ ->components([
Section::make('Überschrift') Section::make('Überschrift')
->schema([ ->schema([
Checkbox::make('neue_seite')
->label('Start neuer Seite')
->columnSpan(2),
Textarea::make('name') Textarea::make('name')
->required() ->required()
->label('Kapitel / Absatz') ->label('Kapitel / Absatz')
@@ -44,7 +47,7 @@ class InhaltsverzeichnisForm
]) ])
->columnSpan(1), ->columnSpan(1),
])->columnSpanFull(), ])->columnSpanFull(),
Section::make('Tabelle & Textblöcke') Section::make('Tabellen & Textblöcke')
->hiddenLabel() ->hiddenLabel()
->schema([ ->schema([
Select::make('tabellen_id')->label('Tabelle') Select::make('tabellen_id')->label('Tabelle')
@@ -54,10 +57,11 @@ class InhaltsverzeichnisForm
) )
->default(0) ->default(0)
->options(function () { ->options(function () {
return Tabellen::all()->pluck('name', 'id')->toArray(); $res = Tabellen::all()->pluck('name', 'id')->toArray();
})->belowContent([ array_unshift($res, 'Ohne Tabelle');
'Kann auch frei bleiben',
]), return $res;
}),
Select::make('textblock_id')->label('Textblock') Select::make('textblock_id')->label('Textblock')
->prefixIcon('phosphor-article') ->prefixIcon('phosphor-article')
@@ -66,10 +70,11 @@ class InhaltsverzeichnisForm
) )
->default(0) ->default(0)
->options(function () { ->options(function () {
return Textblock::all()->pluck('name', 'id')->toArray(); $res = Textblock::all()->pluck('name', 'id')->toArray();
})->belowContent([ array_unshift($res, 'Ohne Textblock');
'Kann auch frei bleiben',
]), return $res;
}),
])->columnSpanFull(), ])->columnSpanFull(),
]); ]);
} }
@@ -5,6 +5,7 @@ namespace App\Filament\Resources\Inhaltsverzeichnis\Tables;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Support\Enums\FontWeight; use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn; use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -20,6 +21,12 @@ class InhaltsverzeichnisTable
TextColumn::make('ordnungszahl') TextColumn::make('ordnungszahl')
->label('Index') ->label('Index')
->getStateUsing(fn ($record): string => $record->ordnungszahl == '0' ? '' : number_format($record->ordnungszahl, 2)), ->getStateUsing(fn ($record): string => $record->ordnungszahl == '0' ? '' : number_format($record->ordnungszahl, 2)),
IconColumn::make('neue_seite')
->label('Seite')
->icon(fn (string $state): string => match ($state) {
'1' => 'phosphor-file-plus',
default => ''
}),
TextColumn::make('name') TextColumn::make('name')
->label('Überschrift') ->label('Überschrift')
->wrap() ->wrap()
@@ -5,6 +5,7 @@ namespace App\Filament\Resources\Projektes\RelationManagers;
use App\Actions\Create\CreateProjektInhaltsverzeichnis; use App\Actions\Create\CreateProjektInhaltsverzeichnis;
use App\Models\KontoTextblock; use App\Models\KontoTextblock;
use App\Models\ProjektInhaltsverzeichnis; use App\Models\ProjektInhaltsverzeichnis;
use App\Models\Tabellen;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup; use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction; use Filament\Actions\CreateAction;
@@ -48,7 +49,11 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
Tabs::make('Tabs') Tabs::make('Tabs')
->tabs([ ->tabs([
Tab::make('Überschrift') Tab::make('Überschrift')
->hidden(fn ($record) => $record->name == 'DECKBLATT' ? true : false)
->schema([ ->schema([
Checkbox::make('neue_seite')
->label('Start neuer Seite')
->columnSpan(2),
Textarea::make('name') Textarea::make('name')
->required() ->required()
->label('Kapitel / Absatz') ->label('Kapitel / Absatz')
@@ -158,6 +163,21 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
])->columns(1), ])->columns(1),
]), ]),
]), ]),
Tab::make('Tabellen')
->schema([
Select::make('tabellen_id')->label('Tabelle')
->prefixIcon('phosphor-table')
->prefixIconColor(
fn ($record): string => $record->tabellen_id == 0 ? 'gray' : 'primary'
)
->default(0)
->options(function () {
$res = Tabellen::all()->pluck('name', 'id')->toArray();
array_unshift($res, 'Ohne Tabelle');
return $res;
}),
]),
])->columnSpanFull(), ])->columnSpanFull(),
]); ]);
} }
@@ -171,6 +191,12 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
->width('2rem') ->width('2rem')
->label('Index') ->label('Index')
->getStateUsing(fn ($record): string => $record->ordnungszahl == '0' ? '' : number_format($record->ordnungszahl, 2)), ->getStateUsing(fn ($record): string => $record->ordnungszahl == '0' ? '' : number_format($record->ordnungszahl, 2)),
IconColumn::make('neue_seite')
->label('Seite')
->icon(fn (string $state): string => match ($state) {
'1' => 'phosphor-file-plus',
default => ''
}),
TextColumn::make('name') TextColumn::make('name')
->wrap() ->wrap()
->weight(fn ($record): FontWeight => match ($record->ueberschrift_nicht_anzeigen) { ->weight(fn ($record): FontWeight => match ($record->ueberschrift_nicht_anzeigen) {
@@ -221,7 +247,7 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
->createAnother(false), ->createAnother(false),
]) ])
->recordActions([ ->recordActions([
EditAction::make()->iconButton(), EditAction::make()->iconButton()->hidden(fn ($record) => $record->name == 'INHALTSVERZEICHNIS' ? true : false),
DeleteAction::make()->iconButton(), DeleteAction::make()->iconButton(),
]) ])
->toolbarActions([ ->toolbarActions([
+1
View File
@@ -14,6 +14,7 @@ class Inhaltsverzeichnis extends Model
'sort', 'sort',
'ordnungszahl', 'ordnungszahl',
'seite', 'seite',
'neue_seite',
'ohne_seitenzahl_anzeige', 'ohne_seitenzahl_anzeige',
]; ];
+1
View File
@@ -15,6 +15,7 @@ class ProjektInhaltsverzeichnis extends Model
'sort', 'sort',
'ordnungszahl', 'ordnungszahl',
'seite', 'seite',
'neue_seite',
'ohne_seitenzahl_anzeige', 'ohne_seitenzahl_anzeige',
'textblock', 'textblock',
]; ];
@@ -29,7 +29,6 @@ return new class extends Migration
$table->boolean('pdf_gutachten_status')->default(0); $table->boolean('pdf_gutachten_status')->default(0);
$table->boolean('excel_nutzwerte_status')->default(0); $table->boolean('excel_nutzwerte_status')->default(0);
$table->boolean('evaluation_gutachten')->default(0); $table->boolean('evaluation_gutachten')->default(0);
$table->boolean('evaluation_nutzwerte')->default(0);
$table->timestamp('bezahlt_am')->nullable(); $table->timestamp('bezahlt_am')->nullable();
$table->timestamps(); $table->timestamps();
$table->softDeletes(); $table->softDeletes();
@@ -20,6 +20,7 @@ return new class extends Migration
$table->integer('sort')->default(0); $table->integer('sort')->default(0);
$table->double('ordnungszahl')->default(0); $table->double('ordnungszahl')->default(0);
$table->integer('seite')->default(0); $table->integer('seite')->default(0);
$table->integer('neue_seite')->default(0);
$table->integer('ohne_seitenzahl_anzeige')->default(0); $table->integer('ohne_seitenzahl_anzeige')->default(0);
$table->timestamps(); $table->timestamps();
}); });
@@ -22,6 +22,7 @@ return new class extends Migration
$table->integer('sort')->default(0); $table->integer('sort')->default(0);
$table->double('ordnungszahl')->default(0); $table->double('ordnungszahl')->default(0);
$table->integer('seite')->default(0); $table->integer('seite')->default(0);
$table->integer('neue_seite')->default(0);
$table->integer('ohne_seitenzahl_anzeige')->default(0); $table->integer('ohne_seitenzahl_anzeige')->default(0);
$table->text('textblock')->nullable(); $table->text('textblock')->nullable();
$table->timestamps(); $table->timestamps();
+13 -5
View File
@@ -1,7 +1,7 @@
body, body,
table, table,
.base { .base {
font-family: DejaVuSans; font-family: Helvetica, Arial, sans-serif;
font-size: 10px; font-size: 10px;
line-height: 16px; line-height: 16px;
margin: 0; margin: 0;
@@ -38,7 +38,7 @@ table,
#deckblatt-auftraggeber { #deckblatt-auftraggeber {
position: absolute; position: absolute;
top: 240mm; top: 220mm;
width: 185mm; width: 185mm;
text-align: right; text-align: right;
} }
@@ -55,20 +55,28 @@ table,
/** FORMATTING */ /** FORMATTING */
.header {
padding: 1.3mm 3mm;
margin: 2rem 0;
font-size: 1.5rem;
border: 0.5px solid #f3f4f6;
background-color: #eff6ff;
}
h1 { h1 {
font-size: 24px; font-size: 22px;
line-height: 26px; line-height: 26px;
margin: 0; margin: 0;
} }
h2 { h2 {
font-size: 20px; font-size: 18px;
line-height: 22px; line-height: 22px;
margin: 0; margin: 0;
} }
h3 { h3 {
font-size: 16px; font-size: 14px;
line-height: 18px; line-height: 18px;
margin: 0; margin: 0;
} }