wip zuabschlaege pdf

This commit is contained in:
salam committed 2025-10-28 13:40:01 +01:00
1 parent 88d561675d
commit 7917777b93
23 files changed
+510 -604

No files matched your search

+12 -4
View File
@@ -9,13 +9,21 @@ class CreateProjektMethoden
{
public function create($record)
{
ProjektMethode::where('projekte_id', $record->id)->delete();
$projekt_raeumealles = ProjektObjekteImDetail::where('projekte_id', $record->id)->get();
foreach ($projekt_raeumealles as $raeumealle) {
$objekte_im_detail = ProjektObjekteImDetail::where('projekte_id', $record->id)->get();
$arr = [];
foreach ($objekte_im_detail as $row) {
$arr[] = $row->raumart;
ProjektMethode::firstOrCreate([
'projekte_id' => $record->id,
'raumart' => $raeumealle->raumart,
'raumart' => $row->raumart,
]);
}
ProjektMethode::where('projekte_id', $record->id)->whereNotIn('raumart', $arr)->delete();
}
}
+1 -2
View File
@@ -10,8 +10,7 @@ class Inhalt
{
public static function create($projekte_id)
{
$html = '<div class="header">INHALTSVERZEICHNIS</div>';
$html .= '<table class="inhalt">';
$html = '<table class="inhalt">';
$inhalte = ProjektInhaltsverzeichnis::where('projekte_id', $projekte_id)->orderBy('sort')->get();
foreach ($inhalte as $inhalt) {
if ($inhalt->ueberschrift_anzeigen) {
@@ -16,5 +16,6 @@ class Ueberschrift
}
}
return false;
}
}
+6 -6
View File
@@ -71,13 +71,13 @@ class MakeGutachten
$textblock = Format::fix_str($textblock);
}
if ($inhalt->name == 'DECKBLATT') {
$html = Deckblatt::create($textblock);
} elseif ($inhalt->name == 'INHALTSVERZEICHNIS') {
$html = Inhalt::create($projekte_id);
} else {
$html = Ueberschrift::create($inhalt);
$html = Ueberschrift::create($inhalt);
if ($inhalt->name == 'DECKBLATT') {
$html .= Deckblatt::create($textblock);
} elseif ($inhalt->name == 'INHALTSVERZEICHNIS') {
$html .= Inhalt::create($projekte_id);
} else {
if ($inhalt->textblock) {
$html .= $textblock;
+10 -10
View File
@@ -70,25 +70,25 @@ class MakeNutzwerte
$mpdf->AddPage();
}
$html = Ueberschrift::create($inhalt);
if ($inhalt->textblock) {
$html .= Platzhalter::replace($platzhalter, $inhalt->textblock);
$textblock = Platzhalter::replace($platzhalter, $inhalt->textblock);
$textblock = Format::fix_str($textblock);
}
$html = Ueberschrift::create($inhalt);
switch ($inhalt->tabellen_id) {
case '5':
$html .= ZuUndAbschlaege::load($projekte_id);
break;
}
}
if ($inhalt->seitenzahl_anzeige == 1) {
$mpdf->SetHTMLFooter('<div class="center">Seite {PAGENO}<br><br></div>');
}
if ($html) {
$mpdf->WriteHTML($html, HTMLParserMode::HTML_BODY);
if ($inhalt->seitenzahl_anzeige) {
$mpdf->SetHTMLFooter('<div class="center">Seite {PAGENO}<br><br></div>');
}
if ($html != '') {
$mpdf->WriteHTML($html, HTMLParserMode::HTML_BODY);
}
}
// foreach ($inhalte as $inhalt) {
@@ -2,72 +2,70 @@
namespace App\Actions\Generate\Nutzwerte;
use App\Actions\Generate\Utilities\Format;
use App\Actions\Generate\Utilities\Html;
use App\Models\Merkmale;
use App\Models\ProjektObjekte;
use App\Models\Raumalles;
use App\Models\Raumorientierung;
use App\Utilities\Format;
use App\Utilities\Html;
class ZuUndAbschlaege
{
public static function load(int $projekte_id)
{
$orientierungen = ProjektObjekte::select()
$objekte = ProjektObjekte::select()
->with('orientierung')
->with('projektobjekteimdetail')
->where('projekte_id', $projekte_id)
->where('nicht_in_orientierung', 0)
->get();
foreach ($orientierungen as $orientierung) {
dd($orientierung);
}
$header_row = ['Top Nummer', 'Geschoß', 'Typ', 'Nutzfläche', 'Loggia / sonst. Zusatzflächen', 'Gesamtnutzfläche'];
// $total = Invoice::where('status', 'Completed')->sum('amount');
$merkmale = Merkmale::where('projekte_id', $projekte_id)->pluck('name', 'code');
$header_row = ['Top', 'Geschoß', 'Typ', 'Nutzfläche', 'Loggia / sonst. Zusatzflächen', 'Gesamtnutzfläche'];
$merkmale = Merkmale::merkmale($projekte_id);
$markmale_col = [];
foreach ($merkmale as $value) {
$markmale_col[] = $value['col'];
$header_row[] = $value['name'];
$markmale_codes = [];
foreach ($merkmale as $key => $value) {
$markmale_codes[] = $key;
$header_row[] = $value;
}
$header_row[] = 'Summe Merkmale';
$header_row[] = 'Wohnungsbewertung';
$html = Html::table_header_90($header_row);
$res = Raumalles::select('raumorientierung_id', 'geschoss')->where('projekte_id', $projekte_id)->where('methodes_id', 1)->get();
$geschoss = [];
foreach ($res as $value) {
$id = $value->raumorientierung_id;
$geschoss[$id] = $value['geschoss'];
}
$html = '<table class="table-striped">';
$html .= Html::table_header_90($header_row);
$res = Raumorientierung::select()->where('projekte_id', $projekte_id)->where('nicht_in_orientierung', 0)->whereNotNull('top_nr')->orderBy('top_nr')->get();
foreach ($res as $value) {
$id = $value->id;
$html .= '<tr>';
$html .= Html::td($value->top_nr, 'left bl br bb');
$html .= Html::td($geschoss[$value['id']], 'center br bb');
$html .= Html::td($value->type, 'wp20 br bb');
// Nutzfläache
$html .= Html::td(Format::numeric($value->qm_m1, 2), 'right br bb');
// Loggia
$loggia = Raumalles::loggia($id);
$gesnutzfl = $loggia + $value->qm_m1;
$loggia = $loggia != 0 ? $loggia : '';
$html .= Html::td($loggia, 'right br bb');
// Gesammtnutzfläche = Nutzfläache + Loggia
$html .= Html::td(Format::numeric($gesnutzfl, 2), 'right br bb');
foreach ($markmale_col as $col) {
$tmp = (float) $value[$col] != 0 ? $value[$col] : '';
$html .= Html::td(Format::numeric($tmp, 2), 'right br bb');
foreach ($objekte as $objekt) {
// dd($objekt);
$flaeche = 0;
foreach ($objekt->projektobjekteimdetail as $key => $value) {
$geschoss = $value['geschoss'];
$flaeche += $value['flaeche'];
}
$html .= Html::td(Format::numeric($value->summe_az, 2), 'right br bb');
$html .= Html::td(Format::numeric($value->bewertung, 2), 'right br bb');
$html .= '<tr>';
$html .= Html::td($objekt->top_nummer, 'left bl br bb');
$html .= Html::td($geschoss, 'center br bb');
$html .= Html::td($objekt->type, 'wp20 br bb');
// Nutzfläache
$html .= Html::td(Format::dezimal($flaeche, 2), 'right br bb');
// Loggia
// $loggia = Raumalles::loggia($id);
// $gesnutzfl = $loggia + $objekt->qm_m1;
// $loggia = $loggia != 0 ? $loggia : '';
// $html .= Html::td($loggia, 'right br bb');
// // Gesammtnutzfläche = Nutzfläache + Loggia
// $html .= Html::td(Format::numeric($gesnutzfl, 2), 'right br bb');
// foreach ($markmale_codes as $code) {
// $tmp = (float) $objekt[$code] != 0 ? $objekt[$code] : '';
// $html .= Html::td(Format::numeric($tmp, 2), 'right br bb');
// }
// $html .= Html::td(Format::numeric($objekt->summe_az, 2), 'right br bb');
// $html .= Html::td(Format::numeric($objekt->bewertung, 2), 'right br bb');
$html .= '</tr>';
}
$html .= '</table>';
return $html;
}
+2 -18
View File
@@ -6,32 +6,16 @@ class Html
{
public static function table_header_90($_row)
{
$html = '<thead><tr text-rotate="90deg">';
$html = '<thead><tr>';
$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 .= '<td class="rotated right bl bt br bb" style="background-color:#eff6ff; 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.'"' : '';
@@ -155,7 +155,7 @@ class EditProjekte extends EditRecord
ActionGroup::make([
Action::make('make_gutachten')
->hidden(fn ($record): bool => (! $record->bezahlt_am || $record->pdf_gutachten_status || ! $record->evaluation_gutachten) ? true : false)
->label('Gutachten berechnen')
->label('Standard Texte')
->icon('phosphor-calculator')
->url(fn ($record) => route('standard.download', ['record' => $record, 'mode' => 'new']))
->openUrlInNewTab(),
@@ -164,7 +164,7 @@ class EditProjekte extends EditRecord
*/
Action::make('make_nutzwerte')
->hidden(fn ($record): bool => (! $record->bezahlt_am || $record->pdf_nutzwerte_status || ! $record->evaluation_gutachten) ? true : false)
->label('Nutzwerte berechnen')
->label('Nutzwerte')
->icon('phosphor-calculator')
->url(fn ($record) => route('nutzwerte.download', ['record' => $record, 'mode' => 'new']))
->openUrlInNewTab(),
@@ -30,6 +30,7 @@ use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\HtmlString;
class ProjektInhaltsverzeichnisRelationManager extends RelationManager
{
@@ -50,7 +51,7 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
Tabs::make('Tabs')
->tabs([
Tab::make('Überschrift')
->hidden(fn ($record) => $record->name == 'DECKBLATT' ? true : false)
->hidden(fn ($record) => $record?->name == 'DECKBLATT' ? true : false)
->schema([
Checkbox::make('neue_seite')
->label('Start neuer Seite'),
@@ -86,13 +87,15 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
->columnSpan(1),
]),
Tab::make('Textblock')
->hidden(fn ($record) => in_array($record?->name, ['INHALTSVERZEICHNIS']) ? true : false)
->schema([
Grid::make()
->columns(6)
->schema([
TextInput::make('konto_textblock_id')->hidden(),
RichEditor::make('textblock')
->aboveLabel('Ausgabe Textblock vor Tabelle')
->hiddenLabel()
->aboveLabel(fn ($record): string => $record?->tabellen_id != 0 ? 'Ausgabe Textblock vor Tabelle' : '')
->columnSpan(5)
->extraInputAttributes(['style' => 'min-height: 20rem; max-height: 50vh; overflow-y: auto;'])
->toolbarButtons([
@@ -124,11 +127,11 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
TextInput::make('name')->required()
->label('Ändern sie gegebeben Falls den Namen')
->default(function ($record) {
return KontoTextblock::where('id', $record['konto_textblock_id'])->pluck('name')->first();
return KontoTextblock::where('id', $record?->konto_textblock_id)->pluck('name')->first();
}),
])
->hidden(function ($record) {
return (bool) ! $record['konto_textblock_id'];
return (bool) ! $record?->konto_textblock_id;
})
->action(function (array $mountedActions, array $data) {
$record = $mountedActions[0]->getRawData();
@@ -144,7 +147,7 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
TextInput::make('name')->required()
->label('Geben sie der Vorlage einen eindeutigen Namen')
->default(function ($record) {
return $record['name'];
return $record?->name;
}),
])
->modalSubmitActionLabel('Sichern')
@@ -185,12 +188,12 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
]),
]),
Tab::make('Tabellen')
->hidden(fn ($record) => in_array($record?->name, ['DECKBLATT']) ? true : false)
->schema([
Select::make('tabellen_id')->label('Tabelle')
->aboveLabel('Ausgabe Textblock vor Tabelle')
->prefixIcon('phosphor-table')
->prefixIconColor(
fn ($record): string => $record->tabellen_id == 0 ? 'gray' : 'primary'
fn ($record): string => $record?->tabellen_id == 0 ? 'gray' : 'primary'
)
->default(0)
->options(function () {
@@ -250,6 +253,7 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
IconColumn::make('textblock')
->alignCenter()
->icon('phosphor-article')
->tooltip(fn ($record): HtmlString => new HtmlString($record->textblock))
->color(fn (string $state): string => match ($state) {
'0' => 'gray',
default => 'info',
@@ -10,6 +10,7 @@ use Filament\Actions\BulkAction;
use Filament\Actions\BulkActionGroup;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\TextColumn;
@@ -19,6 +20,7 @@ use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\HtmlString;
use Livewire\Component;
class ProjektMethodesRelationManager extends RelationManager
@@ -90,11 +92,26 @@ class ProjektMethodesRelationManager extends RelationManager
->action(fn (CreateProjektMethoden $createProjektMethoden) => $createProjektMethoden->create($this->ownerRecord))
->requiresConfirmation()
->modalHeading('Raum Methoden erstellen')
->modalDescription('Alle bestehenden Daten in dieser Tabelle werden vorher gelöscht.')
->modalDescription(new HtmlString('Daten werden aus der Tabelle "Objekte im Detail" generiert. Änderungen werden übernommen nicht mehr verwendete Objekte gelöscht. <br>Um die Tabelle neu zu generieren bitte die Tabelle vorher leeren.'))
->modalSubmitActionLabel('Generieren')
->label('Generieren')
->tooltip('Daten werden aus "Räume Alle" Tabelle gefiltert.')
->tooltip('Daten werden aus der Tabelle "Objekte im Detail" generiert.')
->icon('heroicon-o-cog-8-tooth')
->extraModalFooterActions([
Action::make('delete')
->label('Leeren')
->color('danger')
->requiresConfirmation()
->action(function () {
ProjektMethode::where('projekte_id', $this->ownerRecord->id)->delete();
Notification::make()
->title('Tabelle "Raum Methode" wurde geleert')
->success()
->send();
}),
])
->after(function (Component $livewire) {
$livewire->dispatch('refreshMethods');
}),
@@ -44,13 +44,17 @@ class ProjektObjekteImDetailRelationManager extends RelationManager
Select::make('projekt_objekte_id')
->relationship('top_nummer', 'top_nummer', fn (Builder $query) => $query->where('projekte_id', $this->getOwnerRecord()->id))
->required()
->searchable(),
TextInput::make('geschoss')
->required()
->maxLength(255),
->searchable()
->columnSpan(3),
TextInput::make('raumart')
->required()
->maxLength(255),
->maxLength(255)
->columnSpan(3),
TextInput::make('geschoss')
->required()
->maxLength(255)
->suffixIcon('phosphor-building')
->columnSpan(2),
TextInput::make('flaeche')
->suffix(new HtmlString(' m&sup2;'))
->rules(['required', 'flaeche' => 'decimal:2'])
@@ -61,7 +65,8 @@ class ProjektObjekteImDetailRelationManager extends RelationManager
])
->afterStateUpdated(function (Component $livewire) {
$livewire->dispatch('refreshProjektAllgemeinflaechen');
}),
})
->columnSpan(2),
TextInput::make('faktor')
->suffixIcon('phosphor-function')
->rules(['required', 'faktor' => 'decimal:0,2'])
@@ -70,8 +75,9 @@ class ProjektObjekteImDetailRelationManager extends RelationManager
})->validationMessages([
'required' => 'Die Eingabe eines Faktors ist erforderlich.',
'decimal' => 'Für den Faktors sind zwei Dezimalstellen erforderlich.',
]),
]);
])
->columnSpan(2),
])->columns(6);
}
public function table(Table $table): Table
@@ -2,34 +2,34 @@
namespace App\Filament\Resources\Projektes\RelationManagers;
use Livewire\Component;
use App\Actions\Create\CreateProjektObjekte;
use App\Models\Merkmale;
use Filament\Tables\Table;
use App\Models\Orientierung;
use Filament\Actions\Action;
use Filament\Schemas\Schema;
use App\Models\ProjektObjekte;
use Filament\Actions\Action;
use Filament\Actions\BulkAction;
use Filament\Actions\EditAction;
use Filament\Support\Enums\Width;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Illuminate\Support\HtmlString;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Radio;
use Filament\Actions\BulkActionGroup;
use Filament\Forms\Components\Select;
use Illuminate\Support\Facades\Blade;
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\TextColumn;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Columns\CheckboxColumn;
use App\Actions\Create\CreateProjektObjekte;
use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextInputColumn;
use Illuminate\Database\Eloquent\Collection;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\Width;
use Filament\Tables\Columns\CheckboxColumn;
use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\Summarizers\Sum;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\TextInputColumn;
use Filament\Tables\Filters\TernaryFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\HtmlString;
use Livewire\Component;
class ProjektObjekteRelationManager extends RelationManager
{
@@ -48,9 +48,10 @@ class ProjektObjekteRelationManager extends RelationManager
return $schema
->components([
TextInput::make('top_nummer')
->label('Top Nummer')
->required()
->maxLength(255),
]);
])->columns(1);
}
public function table(Table $table): Table
@@ -62,7 +63,7 @@ class ProjektObjekteRelationManager extends RelationManager
// ->striped()
->emptyStateDescription('Schalten Sie das Projekt frei und importieren Sie die Daten der Objekte.')
->recordTitleAttribute('top_nummer')
->description(new HtmlString('<span class="flex gap-1.5">Orientierungen, Zu- und Abschläge, '. Blade::render('<x-lucide-locate-off class="w-3 h-3 mt-1" />'). ' Nicht in Orientierung</span>'))
->description(new HtmlString('<span class="flex gap-1.5">Orientierungen, Zu- und Abschläge, '.Blade::render('<x-lucide-locate-off class="w-3 h-3 mt-1" />').' Nicht in Orientierung</span>'))
->columns([
TextColumn::make('top_nummer')
->alignCenter()
@@ -248,6 +249,8 @@ class ProjektObjekteRelationManager extends RelationManager
])
->headerActions([
CreateAction::make()
->modalHeading('Objekt erstellen')
->modalDescription('Die dazugehörigen Räume werde in "Objekte im Detail" erstellt.')
->icon('phosphor-file-plus')
->createAnother(false),
Action::make('merkmale')
@@ -268,7 +271,7 @@ class ProjektObjekteRelationManager extends RelationManager
// ->modalDescription('Alle bestehenden Daten in dieser Tabelle werden vorher gelöscht.')
// ->modalSubmitActionLabel('Generieren')
// ->label('Generieren')
// ->tooltip('Daten werden aus "Räume Alle" gefiltert.')
// ->tooltip('Daten werden aus "Objekte im Detail" gefiltert.')
// ->icon('heroicon-o-cog-8-tooth')
// ->after(function (Component $livewire) {
// $livewire->dispatch('refreshOrientierung');
@@ -18,6 +18,7 @@ class WidgetMethoden extends TableWidget
->query(fn (): Builder => Methode::query())
->paginated(false)
->columns([
TextColumn::make('id')->label(''),
TextColumn::make('name')
->label('')
->weight(FontWeight::Bold)
+13
View File
@@ -18,6 +18,19 @@ class Inhaltsverzeichnis extends Model
'seitenzahl_anzeige',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'ueberschrift_anzeigen' => 'boolean',
'seitenzahl_anzeige' => 'boolean',
];
}
public function textblock()
{
return $this->hasMany(Textblock::class, 'id', 'textblock_id');
-5
View File
@@ -12,11 +12,6 @@ class Merkmale extends Model
'name',
];
public static function map($projekte_id)
{
return static::getModel()::where('projekte_id', $projekte_id)->pluck('name', 'code')->toArray();
}
public static function getfreecode($projekte_id)
{
+1 -1
View File
@@ -59,7 +59,7 @@ class ProjektObjekte extends Model
return $this->hasOne(Orientierung::class, 'id', 'orientierung_id');
}
public function ProjektObjekteImDetail(): HasMany
public function projektobjekteimdetail(): HasMany
{
return $this->hasMany(ProjektObjekteImDetail::class, 'projekt_objekte_id', 'id');
}