rename ProjektRaeumealle ro ProjektObjekte und ProjektObjekteImDetail

This commit is contained in:
salam committed 2025-10-26 09:14:01 +01:00
1 parent 7746b426b3
commit 967d6e5157
30 files changed
+342 -292

No files matched your search

@@ -2,28 +2,28 @@
namespace App\Actions\Create;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektRaeumealle;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
class CreateProjektOrientierungZuAbschlaege
class CreateProjektObjekte
{
public function create($record)
{
ProjektOrientierungZuAbschlaege::where('projekte_id', $record->id)->delete();
ProjektObjekte::where('projekte_id', $record->id)->delete();
$projekt_raeumealles = ProjektRaeumealle::select('top_nummer', 'geschoss')->where('projekte_id', $record->id)->get();
$projekt_raeumealles = ProjektObjekteImDetail::select('top_nummer', 'geschoss')->where('projekte_id', $record->id)->get();
$arr = [];
foreach ($projekt_raeumealles as $raeumealle) {
if (! in_array($raeumealle->top_nummer, $arr)) {
$orientierung = new ProjektOrientierungZuAbschlaege;
$orientierung = new ProjektObjekte;
$orientierung->projekte_id = $record->id;
$orientierung->top_nummer = $raeumealle->top_nummer;
$orientierung->geschoss = $raeumealle->geschoss ?? '';
$orientierung->save();
ProjektRaeumealle::where('projekte_id', $record->id)->where('top_nummer', $raeumealle->top_nummer)->update(['projekt_orientierung_zu_abschlaege_id' => $orientierung->id]);
ProjektObjekteImDetail::where('projekte_id', $record->id)->where('top_nummer', $raeumealle->top_nummer)->update(['projekt_objekte_id' => $orientierung->id]);
$arr[] = $raeumealle->top_nummer;
}
+2 -2
View File
@@ -3,14 +3,14 @@
namespace App\Actions\Create;
use App\Models\ProjektMethode;
use App\Models\ProjektRaeumealle;
use App\Models\ProjektObjekteImDetail;
class CreateProjektMethoden
{
public function create($record)
{
ProjektMethode::where('projekte_id', $record->id)->delete();
$projekt_raeumealles = ProjektRaeumealle::where('projekte_id', $record->id)->get();
$projekt_raeumealles = ProjektObjekteImDetail::where('projekte_id', $record->id)->get();
foreach ($projekt_raeumealles as $raeumealle) {
ProjektMethode::firstOrCreate([
'projekte_id' => $record->id,
@@ -3,14 +3,14 @@
namespace App\Actions\Generate\Gutachten;
use App\Actions\Generate\Utilities\Html;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektObjekte;
class Paragraph6Tabelle
{
public static function load($projekte_id)
{
$data = ProjektOrientierungZuAbschlaege::with('orientierung')
$data = ProjektObjekte::with('orientierung')
->where('projekte_id', $projekte_id)
->orderBy('nicht_in_orientierung')
->orderBy('top_nummer')
@@ -3,7 +3,7 @@
namespace App\Actions\Generate\Nutzwerte;
use App\Models\Merkmale;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektObjekte;
use App\Models\Raumalles;
use App\Models\Raumorientierung;
use App\Utilities\Format;
@@ -14,7 +14,7 @@ class ZuUndAbschlaege
public static function load(int $projekte_id)
{
$orientierungen = ProjektOrientierungZuAbschlaege::select()
$orientierungen = ProjektObjekte::select()
->with('orientierung')
->where('projekte_id', $projekte_id)
->where('nicht_in_orientierung', 0)
+91 -87
View File
@@ -6,9 +6,9 @@ use App\Models\ProjektAllgemeinflaechen;
use App\Models\Projekte;
use App\Models\ProjektInhaltsverzeichnis;
use App\Models\ProjektMethode;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
use App\Models\ProjektPlatzhalter;
use App\Models\ProjektRaeumealle;
use Filament\Notifications\Notification;
class GutachtenValidation
@@ -21,7 +21,7 @@ class GutachtenValidation
$res = ProjektAllgemeinflaechen::where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Allgemeinflächen')
->title('Tabelle Allgemeinflächen')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -33,7 +33,7 @@ class GutachtenValidation
foreach ($res as $value) {
if (! $value->geschoss) {
Notification::make()
->title('Allgemeinflächen')
->title('Tabelle Allgemeinflächen')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -44,7 +44,7 @@ class GutachtenValidation
}
if (! $value->raumart) {
Notification::make()
->title('Allgemeinflächen')
->title('Tabelle Allgemeinflächen')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -55,7 +55,7 @@ class GutachtenValidation
}
if ($value->flaeche == 0) {
Notification::make()
->title('Allgemeinflächen')
->title('Tabelle Allgemeinflächen')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -67,58 +67,113 @@ class GutachtenValidation
}
/**
* ProjektRaeumealle
* ProjektObjekte + nicht_in_orientierung
*/
$res = ProjektRaeumealle::where('projekte_id', $record->id)->get();
$res = ProjektObjekte::where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Räume Alle')
->title('Tabelle Objekte')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Die Tabelle <b>Räume Alle</b> ist leer.')
->body('Die Tabelle <b>Objekte</b> ist leer.')
->send();
return false;
}
$res = ProjektObjekte::where('projekte_id', $record->id)->where('nicht_in_orientierung', false)->get();
foreach ($res as $value) {
if (! $value->orientierung_id && ! $value->nicht_in_orientierung) {
Notification::make()
->title('Tabelle Objekte')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Bei der Top Nummer <b>'.$value->top_nummer.'</b> fehlt die <u>Orientierung</u>.')
->send();
return false;
}
if (! $value->orientierung_id && ! $value->type) {
Notification::make()
->title('Tabelle Objekte')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Bei der Top Nummer <b>'.$value->top_nummer.'</b> fehlt der <u>Type</u>.')
->send();
return false;
}
}
/**
* ProjektObjekte & ProjektObjekteImDetail
*/
$res = ProjektObjekte::with('ProjektObjekteImDetail')->where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Tabelle Objekte im Detail')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Die Tabelle <b>Objekte im Detail</b> ist leer.')
->send();
return false;
}
foreach ($res as $value) {
$raeume = $value->ProjektObjekteImDetail->toArray();
$raeume = $raeume[0] ?? [];
if (! count($raeume)) {
Notification::make()
->title('Tabelle Objekte')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Der Top Nummer <b>'.$value->top_nummer.'</b> sind keine Räume zugeordnet.')
->send();
return false;
}
if (! $value->top_nummer) {
Notification::make()
->title('Räume Alle')
->title('Tabelle Objekte')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Für den Raum <b>'.$value->raumart.'</b> im Geschoss <b>'.$value->geschoss.'</b> fehlt die Angabe der <u>Top Nummer</u>.')
->body('Für den Raum mit der ID <b>'.$value->id.'</b> fehlt die Angabe der <u>Top Nummer</u>.')
->send();
return false;
}
if (! $value->geschoss) {
if (! $raeume['geschoss']) {
Notification::make()
->title('Räume Alle')
->title('Tabelle Objekte im Detail')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Für den Raum <b>'.$value->raumart.'</b> mit der Top Nummer <b>'.$value->top_nummer.'</b> fehlt die Angabe der <u>Geschoßes</u>.')
->body('Beim Objekt Top Nummer <b>'.$value->top_nummer.'</b> fehlt die Angabe des <u>Geschoßes</u>.')
->send();
return false;
}
if (! $value->raumart) {
if (! $raeume['raumart']) {
Notification::make()
->title('Räume Alle')
->title('Tabelle Objekte im Detail')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Für den Raum mit der Top Nummer <b>'.$value->top_nummer.'</b> im Geschoßes <b>'.$value->geschoss.'</b> fehlt die Angabe der <u>Raumart</u>.')
->body('Beim Objekt Top Nummer <b>'.$value->top_nummer.'</b> fehlt die Angabe der <u>Raumart</u>.')
->send();
return false;
}
if ($value->flaeche == 0) {
if (! $raeume['flaeche']) {
Notification::make()
->title('Räume Alle')
->title('Tabelle Objekte im Detail')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -127,17 +182,6 @@ class GutachtenValidation
return false;
}
if ($value->faktor == 0) {
Notification::make()
->title('Räume Alle')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Für die Raumart <b>'.$value->raumart.'</b> mit der Top Nummer <b>'.$value->top_nummer.'</b> im Geschoss <b>'.$value->geschoss.'</b> fehlt die Angabe des <u>Faktors</u>.')
->send();
return false;
}
}
/**
@@ -146,7 +190,7 @@ class GutachtenValidation
$res = ProjektMethode::where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Räume Methoden')
->title('Tabelle Räume Methoden')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -158,7 +202,7 @@ class GutachtenValidation
foreach ($res as $value) {
if (! $value->methode_id) {
Notification::make()
->title('Räume Methoden')
->title('Tabelle Räume Methoden')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -167,58 +211,18 @@ class GutachtenValidation
return false;
}
if ($value->faktor == 0) {
Notification::make()
->title('Räume Methoden')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Für den Raum <b>'.$value->raumart.'</b> fehlt die Angabe des <u>Faktors</u>.')
->send();
// KANN 0 SEIN
// if ($value->faktor == 0) {
// Notification::make()
// ->title('Tabelle Räume Methoden')
// ->info()
// ->icon('heroicon-o-exclamation-triangle')
// ->duration(10000)
// ->body('Für den Raum <b>'.$value->raumart.'</b> fehlt die Angabe des <u>Faktors</u>.')
// ->send();
return false;
}
}
/**
* Orientierung Zu und Abschläge
*/
$res = ProjektOrientierungZuAbschlaege::where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Orientierung Zu und Abschläge')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Die Tabelle <b>Orientierung Zu und Abschläge</b> ist leer.')
->send();
return false;
}
$res = ProjektOrientierungZuAbschlaege::where('projekte_id', $record->id)->where('nicht_in_orientierung', false)->get();
foreach ($res as $value) {
if (! $value->orientierung_id && ! $value->nicht_in_orientierung) {
Notification::make()
->title('Orientierung Zu und Abschläge')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Bei der Top Nummer <b>'.$value->top_nummer.'</b> fehlt die <u>Orientierung</u>.')
->send();
return false;
}
if (! $value->orientierung_id && ! $value->type) {
Notification::make()
->title('Orientierung Zu und Abschläge')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
->body('Bei der Top Nummer <b>'.$value->top_nummer.'</b> fehlt der <u>Type</u>.')
->send();
return false;
}
// return false;
// }
}
/**
@@ -227,7 +231,7 @@ class GutachtenValidation
$res = ProjektInhaltsverzeichnis::where('projekte_id', $record->id)->get();
if (! $res->count()) {
Notification::make()
->title('Inhaltsverzeichnis')
->title('Tabelle Inhaltsverzeichnis')
->info()
->icon('heroicon-o-exclamation-triangle')
->body('Inhaltsverzeichnis fehlt!')
@@ -243,7 +247,7 @@ class GutachtenValidation
$res = ProjektPlatzhalter::where('projekte_id', $record->id)->whereNull('platzhaltertext')->orWhere('platzhaltertext', '=', '')->get();
if ($res->count()) {
Notification::make()
->title('Platzhalter')
->title('Tabelle Platzhalter')
->info()
->icon('heroicon-o-exclamation-triangle')
->duration(10000)
@@ -254,7 +258,7 @@ class GutachtenValidation
}
Notification::make()
->title('Evaluation')
->title('Evaluierung')
->success()
->duration(10000)
->body('Die Evaluierung des Projektes war erfolgreich.')
@@ -2,51 +2,47 @@
namespace App\Filament\Imports;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektRaeumealle;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Illuminate\Support\Number;
class ProjektRaeumealleImporter extends Importer
class ProjektObjekteImDetailImporter extends Importer
{
protected static ?string $model = ProjektRaeumealle::class;
protected function beforeValidate(): void
protected static ?string $model = ProjektObjekteImDetail::class;
public static $projekte_id;
public function resolveRecord(): ProjektObjekteImDetail
{
dd($this->data);
self::$projekte_id = $this->options['projekte_id'];
$res = ProjektOrientierungZuAbschlaege::firstOrCreate([
'projekte_id' => $this->options['projekte_id'],
'top_nummer' => trim($this->data['top_nummer']),
]);
$res = new ProjektObjekteImDetail;
$res->projekte_id = self::$projekte_id;
dd($res);
$this->data['orientierung_zu_abschlaege_id'] = $res->id;
}
public function resolveRecord(): ProjektRaeumealle
{
return ProjektRaeumealle::firstOrNew([
'projekt_orientierung_zu_abschlaege_id' => $this->data['orientierung_zu_abschlaege_id'],
'projekte_id' => $this->options['projekte_id'],
]);
return $res;
}
public static function getColumns(): array
{
return [
// ImportColumn::make('top_nummer')
// ->relationship('orientierung_zu_abschlaege'),
ImportColumn::make('top_nummer')
->label('Top Nummer')
->validationAttribute('Top Nummer')
->requiredMapping()
->example('EG')
->rules(['required', 'max:255'])
->relationship(resolveUsing: function (string $state, $data): ?ProjektObjekte {
return ProjektObjekte::query()
->where('projekte_id', self::$projekte_id)
->Where('top_nummer', $state)
->firstOrCreate([
'projekte_id' => self::$projekte_id,
'top_nummer' => $state,
]);
})
->castStateUsing(function (string $state) {
$state = trim($state);
@@ -93,10 +89,10 @@ class ProjektRaeumealleImporter extends Importer
public static function getCompletedNotificationBody(Import $import): string
{
$body = ' Der Import der Räume ist abgeschlossen. Es wurden '.Number::format($import->successful_rows).' '.str('row')->plural($import->successful_rows).' importiert.';
$body = ' Der Import der Objekte ist abgeschlossen. Es wurden '.Number::format($import->successful_rows).' '.str('row')->plural($import->successful_rows).' importiert.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' Bei '.Number::format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' ist der Import fehlgeschlagen.';
$body .= ' Bei '.Number::format($failedRowsCount).' '.@lang('Reihe|Reihen', $failedRowsCount).' ist der Import fehlgeschlagen.';
}
return $body;
@@ -4,13 +4,13 @@ namespace App\Filament\Resources\Projektes\Pages;
use App\Actions\Validation\GutachtenValidation;
use App\Filament\Imports\ProjektAllgemeinflaechenImporter;
use App\Filament\Imports\ProjektRaeumealleImporter;
use App\Filament\Imports\ProjektObjekteImDetailImporter;
use App\Filament\Resources\Projektes\ProjekteResource;
use App\Models\Konto;
use App\Models\ProjektAllgemeinflaechen;
use App\Models\Projekte;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektRaeumealle;
use App\Models\ProjektObjekte;
use App\Models\ProjektObjekteImDetail;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction;
@@ -24,7 +24,7 @@ class EditProjekte extends EditRecord
{
protected static string $resource = ProjekteResource::class;
#[On('refreshProjektAllgemeinflaechen'), On('refreshProjektRaeumealle'), On('refreshMethods'), On('refreshOrientierung')]
#[On('refreshProjektAllgemeinflaechen'), On('refreshProjektObjekteImDetail'), On('refreshMethods'), On('refreshOrientierung')]
public function refresh(): void {}
protected function getHeaderActions(): array
@@ -34,7 +34,7 @@ class EditProjekte extends EditRecord
* IMPORT
*/
ActionGroup::make([
ImportAction::make('allgemeinflaechen')
ImportAction::make('importallgemeinflaechen')
->hidden(fn ($record): bool => $record->bezahlt_am ? false : true)
->importer(ProjektAllgemeinflaechenImporter::class)
->modalHeading('Allgemeinflächen Import')
@@ -64,9 +64,9 @@ class EditProjekte extends EditRecord
->fileRules([
File::types(['csv', 'txt'])->max(1024),
]),
ImportAction::make()
ImportAction::make('import_objekte')
->hidden(fn ($record): bool => $record->bezahlt_am ? false : true)
->importer(ProjektRaeumealleImporter::class)
->importer(ProjektObjekteImDetailImporter::class)
->modalHeading('Objekte im Detail Import')
->modalContent(view('filament.pages.actions.import-objektemitraeumen'))
->modalContentFooter(view('filament.pages.actions.footer-objektemitraeumen'))
@@ -78,8 +78,8 @@ class EditProjekte extends EditRecord
->color('danger')
->requiresConfirmation()
->action(function ($record) {
ProjektRaeumealle::where('projekte_id', $record->id)->delete();
ProjektOrientierungZuAbschlaege::where('projekte_id', $record->id)->delete();
ProjektObjekteImDetail::where('projekte_id', $record->id)->delete();
ProjektObjekte::where('projekte_id', $record->id)->delete();
$this->record->refresh();
@@ -216,7 +216,8 @@ class EditProjekte extends EditRecord
->icon('phosphor-download')
->color('info')
->button(),
DeleteAction::make()->icon('heroicon-o-trash'),
DeleteAction::make()->icon('heroicon-o-trash')
->modalDescription('Möchten Sie dieses Projekt wirklich löschen? Die Daten werden unwiderbringlich gelöscht, dieser Vorgang kann nicht rückgängig gemacht werden.'),
];
}
@@ -7,9 +7,9 @@ use App\Filament\Resources\Projektes\Pages\ListProjektes;
use App\Filament\Resources\Projektes\RelationManagers\ProjektAllgemeinflaechensRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektInhaltsverzeichnisRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektMethodesRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektOrientierungZuAbschlaegesRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektObjekteImDetailRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektObjekteRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektPlatzhalterRelationManager;
use App\Filament\Resources\Projektes\RelationManagers\ProjektRaeumeallesRelationManager;
use App\Filament\Resources\Projektes\Schemas\ProjekteForm;
use App\Filament\Resources\Projektes\Tables\ProjektesTable;
use App\Models\Projekte;
@@ -48,8 +48,8 @@ class ProjekteResource extends Resource
{
return [
ProjektAllgemeinflaechensRelationManager::class,
ProjektOrientierungZuAbschlaegesRelationManager::class,
ProjektRaeumeallesRelationManager::class,
ProjektObjekteRelationManager::class,
ProjektObjekteImDetailRelationManager::class,
ProjektMethodesRelationManager::class,
ProjektInhaltsverzeichnisRelationManager::class,
ProjektPlatzhalterRelationManager::class,
@@ -54,12 +54,14 @@ class ProjektAllgemeinflaechensRelationManager extends RelationManager
public function table(Table $table): Table
{
return $table
->emptyStateDescription('Schalten Sie das Projekt frei und importieren Sie die Daten der Allgemeinflächen.')
->striped()
->recordTitleAttribute('geschoss')
->columns([
TextColumn::make('geschoss')->searchable(),
TextColumn::make('raumart')->searchable(),
TextInputColumn::make('flaeche')
->extraInputAttributes(['onClick' => 'this.select()'])
->summarize(Sum::make()->label('Gesammt')->numeric(
decimalPlaces: 2,
)->suffix(new HtmlString(' m&sup2;')))
@@ -207,6 +207,8 @@ class ProjektInhaltsverzeichnisRelationManager extends RelationManager
public function table(Table $table): Table
{
return $table
->emptyStateHeading('Kein Inhaltsverzeichnis')
->emptyStateDescription('Generiere ein Inhaltsverzeichnis um zu beginnen.')
->recordTitleAttribute('text')
// ->recordClasses(fn ($record) => $record->part == 'gutachten' ? 'border-l border-primary-500' : 'border-l border-success-500')
->columns([
@@ -52,6 +52,7 @@ class ProjektMethodesRelationManager extends RelationManager
TextColumn::make('raumart')
->searchable(),
TextInputColumn::make('faktor')
->extraInputAttributes(['onClick' => 'this.select()'])
->suffixIcon('phosphor-function')
->width('1rem')
->rules(['required', 'faktor' => 'decimal:0,2'])
@@ -2,13 +2,14 @@
namespace App\Filament\Resources\Projektes\RelationManagers;
use App\Models\ProjektRaeumealle;
use App\Models\ProjektObjekteImDetail;
use Filament\Actions\BulkAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema;
@@ -18,11 +19,12 @@ use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\TextInputColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\HtmlString;
use Livewire\Component;
class ProjektRaeumeallesRelationManager extends RelationManager
class ProjektObjekteImDetailRelationManager extends RelationManager
{
protected static string $relationship = 'projekt_raeumealles';
@@ -36,11 +38,13 @@ class ProjektRaeumeallesRelationManager extends RelationManager
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('top_nummer')
Select::make('projekt_objekte_id')
->relationship('top_nummer', 'top_nummer', fn (Builder $query) => $query->where('projekte_id', $this->getOwnerRecord()->id))
->required()
->maxLength(255),
->searchable(),
TextInput::make('geschoss')
->required()
->maxLength(255),
@@ -62,7 +66,7 @@ class ProjektRaeumeallesRelationManager extends RelationManager
->suffixIcon('phosphor-function')
->rules(['required', 'faktor' => 'decimal:0,2'])
->afterStateUpdated(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
})->validationMessages([
'required' => 'Die Eingabe eines Faktors ist erforderlich.',
'decimal' => 'Für den Faktors sind zwei Dezimalstellen erforderlich.',
@@ -73,27 +77,30 @@ class ProjektRaeumeallesRelationManager extends RelationManager
public function table(Table $table): Table
{
return $table
->emptyStateDescription('Schalten Sie das Projekt frei und importieren Sie die Daten der Objekte.')
->striped()
->recordTitleAttribute('top_nummer')
->columns([
TextColumn::make('top_nummer')
TextColumn::make('top_nummer.top_nummer')
->extraAttributes(['pointer-events' => 'none'])
->searchable()
->label('Top'),
TextColumn::make('geschoss')->searchable(),
TextColumn::make('raumart')->searchable(),
TextInputColumn::make('faktor')
->extraInputAttributes(['onClick' => 'this.select()'])
->suffixIcon('phosphor-function')
->width('1rem')
->rules(['required', 'faktor' => 'decimal:0,2'])
->searchable()
->afterStateUpdated(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
})->validationMessages([
'required' => 'Die Eingabe eines Faktors ist erforderlich.',
'decimal' => 'Für den Faktors sind zwei Dezimalstellen erforderlich.',
]),
TextInputColumn::make('flaeche')
->extraInputAttributes(['onClick' => 'this.select()'])
->summarize(Sum::make()->label('Gesammt')->numeric(
decimalPlaces: 2,
)->suffix(new HtmlString(' m&sup2;')))
@@ -104,7 +111,7 @@ class ProjektRaeumeallesRelationManager extends RelationManager
->label('Fläche')
->searchable()
->afterStateUpdated(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
})->validationMessages([
'required' => 'Die Eingabe einer Fläche ist erforderlich.',
'decimal' => 'Für die Fläche sind zwei Dezimalstellen erforderlich.',
@@ -117,22 +124,19 @@ class ProjektRaeumeallesRelationManager extends RelationManager
->filters([
SelectFilter::make('top_nummer')
->label('Top Nummer')
->searchable()
->options(function (): array {
return ProjektRaeumealle::where('projekte_id', $this->getOwnerRecord()->id)->groupBy('top_nummer')->orderBy('top_nummer')->pluck('top_nummer', 'top_nummer')->toArray();
}),
->relationship('top_nummer', 'top_nummer', fn (Builder $query) => $query->where('projekte_id', $this->getOwnerRecord()->id))
->searchable(),
SelectFilter::make('geschoss')
->searchable()
->preload()
->options(function (): array {
return ProjektRaeumealle::where('projekte_id', $this->getOwnerRecord()->id)->groupBy('geschoss')->orderBy('geschoss')->pluck('geschoss', 'geschoss')->toArray();
return ProjektObjekteImDetail::where('projekte_id', $this->getOwnerRecord()->id)->groupBy('geschoss')->orderBy('geschoss')->pluck('geschoss', 'geschoss')->toArray();
}),
SelectFilter::make('raumart')
->searchable()
->options(function (): array {
return ProjektRaeumealle::where('projekte_id', $this->getOwnerRecord()->id)->groupBy('raumart')->orderBy('raumart')->pluck('raumart', 'raumart')->toArray();
return ProjektObjekteImDetail::where('projekte_id', $this->getOwnerRecord()->id)->groupBy('raumart')->orderBy('raumart')->pluck('raumart', 'raumart')->toArray();
}),
])
// ], layout: FiltersLayout::AboveContentCollapsible)
->headerActions([
CreateAction::make()
->icon('phosphor-file-plus')
@@ -145,10 +149,10 @@ class ProjektRaeumeallesRelationManager extends RelationManager
return $data;
})->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
DeleteAction::make()->iconButton()->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
])
->toolbarActions([
@@ -166,7 +170,7 @@ class ProjektRaeumeallesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = round($data['faktor'] * $record->flaeche);
ProjektRaeumealle::where('id', '=', $record->id)
ProjektObjekteImDetail::where('id', '=', $record->id)
->update(
[
'faktor' => $data['faktor'],
@@ -175,10 +179,10 @@ class ProjektRaeumeallesRelationManager extends RelationManager
);
}
})->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
DeleteBulkAction::make()->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektRaeumealle');
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
]),
]);
@@ -2,17 +2,21 @@
namespace App\Filament\Resources\Projektes\RelationManagers;
use App\Actions\Create\CreateProjektOrientierungZuAbschlaege;
use App\Actions\Create\CreateProjektObjekte;
use App\Models\Merkmale;
use App\Models\Orientierung;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektObjekte;
use Filament\Actions\Action;
use Filament\Actions\BulkAction;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema;
use Filament\Support\Enums\FontWeight;
use Filament\Support\Enums\Width;
use Filament\Tables\Columns\CheckboxColumn;
@@ -25,7 +29,7 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Component;
class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
class ProjektObjekteRelationManager extends RelationManager
{
protected static string $relationship = 'projekt_orientierung_zu_abschlaeges';
@@ -37,6 +41,16 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
protected static ?string $pluralModelLabel = 'Objekte';
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('top_nummer')
->required()
->maxLength(255),
]);
}
public function table(Table $table): Table
{
@@ -44,6 +58,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
return $table
// ->striped()
->emptyStateDescription('Schalten Sie das Projekt frei und importieren Sie die Daten der Objekte.')
->recordTitleAttribute('top_nummer')
->description('Orientierungen, Zu- und Abschläge')
->columns([
@@ -59,9 +74,6 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
'style' => 'position: sticky; left: 0; z-index: 1;',
'class' => 'bg-gray-50 dark:bg-gray-900',
]),
TextInputColumn::make('geschoss')
->width('1rem')
->toggleable(),
CheckboxColumn::make('nicht_in_orientierung')
->label('NiO')
->toggleable()
@@ -69,6 +81,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
$livewire->dispatch('refreshOrientierung');
}),
TextInputColumn::make('type')
->extraInputAttributes(['onClick' => 'this.select()'])
->toggleable()
->disabled(fn ($record): bool => $record->nicht_in_orientierung)
->width('2rem')
@@ -217,7 +230,23 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
TernaryFilter::make('nicht_in_orientierung')
->label('Objekte "Nicht in Orientierung" anzeigen'),
])
->recordActions([
EditAction::make()->iconButton()
->mutateDataUsing(function (array $data): array {
$data['projekte_id'] = $this->ownerRecord->id;
return $data;
})->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
DeleteAction::make()->iconButton()->after(function (Component $livewire) {
$livewire->dispatch('refreshProjektObjekteImDetail');
}),
])
->headerActions([
CreateAction::make()
->icon('phosphor-file-plus')
->createAnother(false),
Action::make('merkmale')
->icon('phosphor-pen')
->modalCancelAction(fn (Action $action) => $action->label('Schließen'))
@@ -229,18 +258,18 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->after(function (Component $livewire) {
$livewire->dispatch('refreshOrientierung');
}),
Action::make('erstellen')
->action(fn (CreateProjektOrientierungZuAbschlaege $createProjektOrientierungZuAbschlaege) => $createProjektOrientierungZuAbschlaege->create($this->ownerRecord))
->requiresConfirmation()
->modalHeading('Objekte erstellen')
->modalDescription('Alle bestehenden Daten in dieser Tabelle werden vorher gelöscht.')
->modalSubmitActionLabel('Generieren')
->label('Generieren')
->tooltip('Daten werden aus "Räume Alle" gefiltert.')
->icon('heroicon-o-cog-8-tooth')
->after(function (Component $livewire) {
$livewire->dispatch('refreshOrientierung');
}),
// Action::make('erstellen')
// ->action(fn (CreateProjektObjekte $createProjektObjekte) => $createProjektObjekte->create($this->ownerRecord))
// ->requiresConfirmation()
// ->modalHeading('Objekte erstellen')
// ->modalDescription('Alle bestehenden Daten in dieser Tabelle werden vorher gelöscht.')
// ->modalSubmitActionLabel('Generieren')
// ->label('Generieren')
// ->tooltip('Daten werden aus "Räume Alle" gefiltert.')
// ->icon('heroicon-o-cog-8-tooth')
// ->after(function (Component $livewire) {
// $livewire->dispatch('refreshOrientierung');
// }),
])
->toolbarActions([
BulkActionGroup::make([
@@ -254,7 +283,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->icon('phosphor-align-center-horizontal-simple')
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->where('nicht_in_orientierung', '=', false)
->update(
['type' => $data['type']]
@@ -278,7 +307,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->icon('phosphor-compass')
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
['orientierung_id' => $data['methode_id']]
);
@@ -302,7 +331,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->icon('phosphor-check-square')
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
['nicht_in_orientierung' => 1]
);
@@ -323,7 +352,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('a', $data['a'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'a' => $data['a'],
@@ -346,7 +375,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('b', $data['b'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'b' => $data['b'],
@@ -369,7 +398,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('c', $data['c'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'c' => $data['c'],
@@ -392,7 +421,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('d', $data['d'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'd' => $data['d'],
@@ -415,7 +444,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('e', $data['e'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'e' => $data['e'],
@@ -438,7 +467,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('f', $data['f'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'f' => $data['f'],
@@ -461,7 +490,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('g', $data['g'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'g' => $data['g'],
@@ -484,7 +513,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('h', $data['h'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'h' => $data['h'],
@@ -507,7 +536,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('i', $data['i'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'i' => $data['i'],
@@ -530,7 +559,7 @@ class ProjektOrientierungZuAbschlaegesRelationManager extends RelationManager
->action(function (Collection $records, array $data): void {
foreach ($records as $record) {
$nutzwert = $this->sum_nutzwerte('j', $data['j'], $record);
ProjektOrientierungZuAbschlaege::where('id', '=', $record->id)
ProjektObjekte::where('id', '=', $record->id)
->update(
[
'j' => $data['j'],
@@ -41,10 +41,12 @@ class ProjektPlatzhalterRelationManager extends RelationManager
{
return $table
->recordTitleAttribute('name')
->emptyStateDescription('Generiere die Platzhalter aus dem Inhaltsverzeichnis.')
->columns([
TextColumn::make('platzhalter')
->searchable(),
TextInputColumn::make('platzhaltertext')
->extraInputAttributes(['onClick' => 'this.select()'])
->label('Platzhalter Text')
->searchable(),
])
@@ -3,7 +3,7 @@
namespace App\Filament\Resources\Projektes\Widgets;
use App\Models\Merkmale;
use App\Models\ProjektOrientierungZuAbschlaege;
use App\Models\ProjektObjekte;
use Filament\Actions\Action;
use Filament\Actions\DeleteAction;
use Filament\Actions\EditAction;
@@ -49,14 +49,14 @@ class WidgetMerkmale extends TableWidget
->color('gray')
->iconButton()
->after(function ($record) {
ProjektOrientierungZuAbschlaege::where('projekte_id', '=', $record->projekte_id)
ProjektObjekte::where('projekte_id', '=', $record->projekte_id)
->update(
[$record->code => 0]
);
$res = ProjektOrientierungZuAbschlaege::where('projekte_id', '=', $record->projekte_id)->get();
$res = ProjektObjekte::where('projekte_id', '=', $record->projekte_id)->get();
foreach ($res as $value) {
$nutzwert = round($value->a + $value->b + $value->c + $value->d + $value->e + $value->f + $value->g + $value->h + $value->i + $value->j);
ProjektOrientierungZuAbschlaege::where('id', '=', $value->id)
ProjektObjekte::where('id', '=', $value->id)
->update(
['nutzwert' => $nutzwert]
);
@@ -3,8 +3,10 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
class ProjektOrientierungZuAbschlaege extends Model
class ProjektObjekte extends Model
{
protected $fillable = [
'projekte_id',
@@ -52,8 +54,13 @@ class ProjektOrientierungZuAbschlaege extends Model
];
}
public function orientierung()
public function orientierung(): HasOne
{
return $this->hasOne(Orientierung::class, 'id', 'orientierung_id');
}
public function ProjektObjekteImDetail(): HasMany
{
return $this->hasMany(ProjektObjekteImDetail::class, 'projekt_objekte_id', 'id');
}
}
@@ -4,11 +4,11 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ProjektRaeumealle extends Model
class ProjektObjekteImDetail extends Model
{
protected $fillable = [
'projekte_id',
'projekt_orientierung_zu_abschlaege_id',
'projekt_objekte_id',
'methode_id',
'top_nummer',
'geschoss',
@@ -32,8 +32,8 @@ class ProjektRaeumealle extends Model
});
}
public function orientierung_zu_abschlaege()
public function top_nummer()
{
return $this->belongsTo(ProjektOrientierungZuAbschlaege::class, 'projekt_orientierung_zu_abschlaege_id', 'id');
return $this->belongsTo(ProjektObjekte::class, 'projekt_objekte_id', 'id');
}
}
+2 -2
View File
@@ -46,7 +46,7 @@ class Projekte extends Model
public function projekt_orientierung_zu_abschlaeges()
{
return $this->hasMany(ProjektOrientierungZuAbschlaege::class);
return $this->hasMany(ProjektObjekte::class);
}
public function auftraggeber()
@@ -71,7 +71,7 @@ class Projekte extends Model
public function projekt_raeumealles()
{
return $this->hasMany(ProjektRaeumealle::class);
return $this->hasMany(ProjektObjekteImDetail::class);
}
public function projekt_methodes()