From b6871df3bf1fc79578dab088fd93c10ecf99b693 Mon Sep 17 00:00:00 2001 From: salam Date: Sat, 4 Oct 2025 18:22:44 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A4ume=20Alle=20wip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ARTISAN.md | 10 +- .../Imports/AllgemeinflaechenImporter.php | 73 +++++ .../Resources/Projektes/ProjekteResource.php | 2 + .../AllgemeinflaechensRelationManager.php | 34 ++- .../RaeumeallesRelationManager.php | 62 ++++ app/Models/Allgemeinflaechen.php | 1 + app/Models/Projekte.php | 5 + app/Providers/Filament/AdminPanelProvider.php | 1 + bootstrap/cache/filament/panels/admin.php | 1 + bootstrap/cache/routes-v7.php | 42 +-- .../0001_01_01_000000_create_users_table.php | 2 +- ...154046_create_allgemeinflaechens_table.php | 4 +- ..._10_03_154047_create_raeumealles_table.php | 2 +- ...0_04_070015_create_notifications_table.php | 31 ++ ...2025_10_04_070016_create_imports_table.php | 35 +++ ...2025_10_04_070017_create_exports_table.php | 35 +++ ...070018_create_failed_import_rows_table.php | 30 ++ database/seeders/DatabaseSeeder.php | 1 - database/seeders/ProjekteSeeder.php | 21 -- storage/testdaten/allgemeineTabelle.txt | 52 ++-- storage/testdaten/basisTabelle.txt | 288 +++++++++--------- 21 files changed, 501 insertions(+), 231 deletions(-) create mode 100644 app/Filament/Imports/AllgemeinflaechenImporter.php create mode 100644 app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php create mode 100644 database/migrations/2025_10_04_070015_create_notifications_table.php create mode 100644 database/migrations/2025_10_04_070016_create_imports_table.php create mode 100644 database/migrations/2025_10_04_070017_create_exports_table.php create mode 100644 database/migrations/2025_10_04_070018_create_failed_import_rows_table.php delete mode 100644 database/seeders/ProjekteSeeder.php diff --git a/ARTISAN.md b/ARTISAN.md index 6ff9b02..dbad7f5 100644 --- a/ARTISAN.md +++ b/ARTISAN.md @@ -12,16 +12,13 @@ a make:factory GutachterFactory https://fakerphp.org/ -Thomas Schranz -Adamgasse 9a -2.Stock a make:mode ProjekteImport -ms a make:filament-resource ProjekteImport --nested a make:filament-relation-manager ProjekteResource ProjekteImports name -a make:filament-relation-manager AllgemeinflaechenResource allgemeinflaechens geschoss +a make:filament-relation-manager RaeumealleResource Raeumealles geschoss a make:model Allgemeinflaechen -ms @@ -30,6 +27,9 @@ a make:model Raeumealle -ms A make:filament-resource Allgemeinflaechen --nested +php artisan make:filament-relation-manager Raeumealle lessons title -php artisan make:filament-relation-manager CourseResource lessons title +for import in prod run +a queue:listen +in supervisord \ No newline at end of file diff --git a/app/Filament/Imports/AllgemeinflaechenImporter.php b/app/Filament/Imports/AllgemeinflaechenImporter.php new file mode 100644 index 0000000..7e41527 --- /dev/null +++ b/app/Filament/Imports/AllgemeinflaechenImporter.php @@ -0,0 +1,73 @@ +projekte_id = $this->options['projekte_id']; + + return $allgemeinflaechen; + } + + public static function getColumns(): array + { + return [ + ImportColumn::make('geschoss') + ->validationAttribute('Geschoss') + ->requiredMapping() + ->example('EG') + ->rules(['required', 'max:255']) + ->castStateUsing(function (string $state) { + $state = trim($state); + + return iconv(mb_detect_encoding($state, mb_detect_order(), true), 'UTF-8', $state); + }), + ImportColumn::make('raumart') + ->validationAttribute('Raumart') + ->requiredMapping() + ->example('Stiegenhaus') + ->rules(['required', 'max:32']) + ->castStateUsing(function (string $state) { + $state = trim($state); + + return iconv(mb_detect_encoding($state, mb_detect_order(), true), 'UTF-8', $state); + }), + ImportColumn::make('flaeche') + ->validationAttribute('Fläche') + ->rules(['required']) + ->example('52,75') + ->castStateUsing(function (string $state): ?float { + if (blank($state)) { + return '0.00'; + } + + $state = str_replace(',', '.', $state); + $state = preg_replace('/[^0-9.]/', '', $state); + + return round($state, precision: 2); + }), + ]; + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = ' Der Import der Allgemeinflächen 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.'; + } + + return $body; + } +} diff --git a/app/Filament/Resources/Projektes/ProjekteResource.php b/app/Filament/Resources/Projektes/ProjekteResource.php index 0129340..82d6f55 100644 --- a/app/Filament/Resources/Projektes/ProjekteResource.php +++ b/app/Filament/Resources/Projektes/ProjekteResource.php @@ -7,6 +7,7 @@ use App\Filament\Resources\Projektes\Pages\CreateProjekte; use App\Filament\Resources\Projektes\Pages\EditProjekte; use App\Filament\Resources\Projektes\Pages\ListProjektes; use App\Filament\Resources\Projektes\RelationManagers\AllgemeinflaechensRelationManager; +use App\Filament\Resources\Projektes\RelationManagers\RaeumeallesRelationManager; use App\Filament\Resources\Projektes\Schemas\ProjekteForm; use App\Filament\Resources\Projektes\Tables\ProjektesTable; use App\Models\Projekte; @@ -47,6 +48,7 @@ class ProjekteResource extends Resource { return [ AllgemeinflaechensRelationManager::class, + RaeumeallesRelationManager::class, ]; } diff --git a/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php b/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php index bfef621..7c22f87 100644 --- a/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php +++ b/app/Filament/Resources/Projektes/RelationManagers/AllgemeinflaechensRelationManager.php @@ -2,24 +2,26 @@ namespace App\Filament\Resources\Projektes\RelationManagers; -use Filament\Actions\AssociateAction; +use App\Filament\Imports\AllgemeinflaechenImporter; use Filament\Actions\BulkActionGroup; use Filament\Actions\CreateAction; use Filament\Actions\DeleteAction; use Filament\Actions\DeleteBulkAction; -use Filament\Actions\DissociateAction; -use Filament\Actions\DissociateBulkAction; use Filament\Actions\EditAction; +use Filament\Actions\ImportAction; use Filament\Forms\Components\TextInput; use Filament\Resources\RelationManagers\RelationManager; use Filament\Schemas\Schema; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; +use Illuminate\Validation\Rules\File; class AllgemeinflaechensRelationManager extends RelationManager { protected static string $relationship = 'allgemeinflaechens'; + protected static ?string $title = 'Allgemeinflächen'; + public function form(Schema $schema): Schema { return $schema @@ -35,7 +37,13 @@ class AllgemeinflaechensRelationManager extends RelationManager return $table ->recordTitleAttribute('geschoss') ->columns([ - TextColumn::make('geschoss') + TextColumn::make('geschoss')->searchable(), + TextColumn::make('raumart')->searchable(), + TextColumn::make('flaeche') + ->alignment('right') + ->formatStateUsing(fn ($state) => "{$state} m²") + ->label('Fläche') + // ->numeric(decimalPlaces: 2) ->searchable(), ]) ->filters([ @@ -43,16 +51,24 @@ class AllgemeinflaechensRelationManager extends RelationManager ]) ->headerActions([ CreateAction::make(), - AssociateAction::make(), + ImportAction::make() + ->importer(AllgemeinflaechenImporter::class) + ->label('Hochladen') + ->icon('phosphor-upload') + ->color('info') + ->options([ + 'projekte_id' => $this->getOwnerRecord()->id, + ]) + ->fileRules([ + File::types(['csv', 'txt'])->max(1024), + ]), ]) ->recordActions([ - EditAction::make(), - DissociateAction::make(), - DeleteAction::make(), + EditAction::make()->iconButton()->color('gray'), + DeleteAction::make()->iconButton(), ]) ->toolbarActions([ BulkActionGroup::make([ - DissociateBulkAction::make(), DeleteBulkAction::make(), ]), ]); diff --git a/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php b/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php new file mode 100644 index 0000000..25f7809 --- /dev/null +++ b/app/Filament/Resources/Projektes/RelationManagers/RaeumeallesRelationManager.php @@ -0,0 +1,62 @@ +components([ + TextInput::make('geschoss') + ->required() + ->maxLength(255), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('geschoss') + ->columns([ + TextColumn::make('geschoss') + ->searchable(), + ]) + ->filters([ + // + ]) + ->headerActions([ + CreateAction::make(), + ]) + ->recordActions([ + EditAction::make(), + DeleteAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Models/Allgemeinflaechen.php b/app/Models/Allgemeinflaechen.php index d9b0583..9b10950 100644 --- a/app/Models/Allgemeinflaechen.php +++ b/app/Models/Allgemeinflaechen.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; class Allgemeinflaechen extends Model { protected $fillable = [ + 'projekte_id', 'geschoss', 'raumart', 'flaeche', diff --git a/app/Models/Projekte.php b/app/Models/Projekte.php index fa912ec..6e9183b 100644 --- a/app/Models/Projekte.php +++ b/app/Models/Projekte.php @@ -31,4 +31,9 @@ class Projekte extends Model { return $this->hasMany(Allgemeinflaechen::class); } + + public function raeumealles() + { + return $this->hasMany(Raeumealle::class); + } } diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index c86ba91..3c5ace9 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -42,6 +42,7 @@ class AdminPanelProvider extends PanelProvider ->passwordReset() ->emailVerification() ->emailChangeVerification() + ->databaseNotifications() ->profile(isSimple: false) ->default() ->registration(Register::class) diff --git a/bootstrap/cache/filament/panels/admin.php b/bootstrap/cache/filament/panels/admin.php index cd8fd78..0664ac7 100644 --- a/bootstrap/cache/filament/panels/admin.php +++ b/bootstrap/cache/filament/panels/admin.php @@ -29,6 +29,7 @@ 'app.filament.resources.projektes.pages.edit-projekte' => 'App\\Filament\\Resources\\Projektes\\Pages\\EditProjekte', 'app.filament.resources.projektes.pages.list-projektes' => 'App\\Filament\\Resources\\Projektes\\Pages\\ListProjektes', 'app.filament.resources.projektes.relation-managers.allgemeinflaechens-relation-manager' => 'App\\Filament\\Resources\\Projektes\\RelationManagers\\AllgemeinflaechensRelationManager', + 'app.filament.resources.projektes.relation-managers.raeumealles-relation-manager' => 'App\\Filament\\Resources\\Projektes\\RelationManagers\\RaeumeallesRelationManager', 'app.filament.resources.textblocks.pages.create-textblock' => 'App\\Filament\\Resources\\Textblocks\\Pages\\CreateTextblock', 'app.filament.resources.textblocks.pages.edit-textblock' => 'App\\Filament\\Resources\\Textblocks\\Pages\\EditTextblock', 'app.filament.resources.textblocks.pages.list-textblocks' => 'App\\Filament\\Resources\\Textblocks\\Pages\\ListTextblocks', diff --git a/bootstrap/cache/routes-v7.php b/bootstrap/cache/routes-v7.php index 8f8ff9a..5ed43fb 100644 --- a/bootstrap/cache/routes-v7.php +++ b/bootstrap/cache/routes-v7.php @@ -511,7 +511,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::HOWCkOTiX3xEetvh', + '_route' => 'generated::fRgalZgdgLutYooA', ), 1 => NULL, 2 => @@ -531,7 +531,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::78HgTUSPeu1dgt2O', + '_route' => 'generated::ehGEtdVA59MvLnTN', ), 1 => NULL, 2 => @@ -589,7 +589,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::yW0VncmgKb6iy7Da', + '_route' => 'generated::t8jqNF3M4FSM7iYY', ), 1 => NULL, 2 => @@ -609,7 +609,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::jPsFyYpvjP2gCTdD', + '_route' => 'generated::ofL3RQiGDD5QTkU1', ), 1 => NULL, 2 => @@ -629,7 +629,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::NnWxDqihf6rtT4sP', + '_route' => 'generated::dp8f68KJns4OcFMw', ), 1 => NULL, 2 => @@ -649,7 +649,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::zRwWsHyW6pLwmIAb', + '_route' => 'generated::PWm6NXGdwH5Nl0zY', ), 1 => NULL, 2 => @@ -669,7 +669,7 @@ app('router')->setCompiledRoutes( array ( 0 => array ( - '_route' => 'generated::6xZk6tZY1pg2BE87', + '_route' => 'generated::rdH5yu4CuBT2btx2', ), 1 => NULL, 2 => @@ -2595,7 +2595,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::HOWCkOTiX3xEetvh' => + 'generated::fRgalZgdgLutYooA' => array ( 'methods' => array ( @@ -2607,7 +2607,7 @@ app('router')->setCompiledRoutes( array ( 'uses' => 'Livewire\\Mechanisms\\FrontendAssets\\FrontendAssets@returnJavaScriptAsFile', 'controller' => 'Livewire\\Mechanisms\\FrontendAssets\\FrontendAssets@returnJavaScriptAsFile', - 'as' => 'generated::HOWCkOTiX3xEetvh', + 'as' => 'generated::fRgalZgdgLutYooA', ), 'fallback' => false, 'defaults' => @@ -2623,7 +2623,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::78HgTUSPeu1dgt2O' => + 'generated::ehGEtdVA59MvLnTN' => array ( 'methods' => array ( @@ -2635,7 +2635,7 @@ app('router')->setCompiledRoutes( array ( 'uses' => 'Livewire\\Mechanisms\\FrontendAssets\\FrontendAssets@maps', 'controller' => 'Livewire\\Mechanisms\\FrontendAssets\\FrontendAssets@maps', - 'as' => 'generated::78HgTUSPeu1dgt2O', + 'as' => 'generated::ehGEtdVA59MvLnTN', ), 'fallback' => false, 'defaults' => @@ -2737,7 +2737,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::yW0VncmgKb6iy7Da' => + 'generated::t8jqNF3M4FSM7iYY' => array ( 'methods' => array ( @@ -2766,7 +2766,7 @@ app('router')->setCompiledRoutes( \'exception\' => $exception, ]), status: $exception ? 500 : 200); }";s:5:"scope";s:54:"Illuminate\\Foundation\\Configuration\\ApplicationBuilder";s:4:"this";N;s:4:"self";s:32:"0000000000000f2c0000000000000000";}}', - 'as' => 'generated::yW0VncmgKb6iy7Da', + 'as' => 'generated::t8jqNF3M4FSM7iYY', ), 'fallback' => false, 'defaults' => @@ -2782,7 +2782,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::jPsFyYpvjP2gCTdD' => + 'generated::ofL3RQiGDD5QTkU1' => array ( 'methods' => array ( @@ -2804,7 +2804,7 @@ app('router')->setCompiledRoutes( 'where' => array ( ), - 'as' => 'generated::jPsFyYpvjP2gCTdD', + 'as' => 'generated::ofL3RQiGDD5QTkU1', ), 'fallback' => false, 'defaults' => @@ -2820,7 +2820,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::NnWxDqihf6rtT4sP' => + 'generated::dp8f68KJns4OcFMw' => array ( 'methods' => array ( @@ -2842,7 +2842,7 @@ app('router')->setCompiledRoutes( 'where' => array ( ), - 'as' => 'generated::NnWxDqihf6rtT4sP', + 'as' => 'generated::dp8f68KJns4OcFMw', ), 'fallback' => false, 'defaults' => @@ -2858,7 +2858,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::zRwWsHyW6pLwmIAb' => + 'generated::PWm6NXGdwH5Nl0zY' => array ( 'methods' => array ( @@ -2880,7 +2880,7 @@ app('router')->setCompiledRoutes( 'where' => array ( ), - 'as' => 'generated::zRwWsHyW6pLwmIAb', + 'as' => 'generated::PWm6NXGdwH5Nl0zY', ), 'fallback' => false, 'defaults' => @@ -2896,7 +2896,7 @@ app('router')->setCompiledRoutes( 'waitSeconds' => NULL, 'withTrashed' => false, ), - 'generated::6xZk6tZY1pg2BE87' => + 'generated::rdH5yu4CuBT2btx2' => array ( 'methods' => array ( @@ -2918,7 +2918,7 @@ app('router')->setCompiledRoutes( 'where' => array ( ), - 'as' => 'generated::6xZk6tZY1pg2BE87', + 'as' => 'generated::rdH5yu4CuBT2btx2', ), 'fallback' => false, 'defaults' => diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index e30694c..405a567 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('users', function (Blueprint $table) { $table->id(); - $table->foreignId('konto_id')->constrained()->cascadeOnDelete()->default(0); + $table->foreignId('konto_id')->constrained()->cascadeOnDelete(); $table->string('gender')->nullable(); $table->string('name'); $table->string('email')->unique(); diff --git a/database/migrations/2025_10_03_154046_create_allgemeinflaechens_table.php b/database/migrations/2025_10_03_154046_create_allgemeinflaechens_table.php index 7f660e3..e680ca0 100644 --- a/database/migrations/2025_10_03_154046_create_allgemeinflaechens_table.php +++ b/database/migrations/2025_10_03_154046_create_allgemeinflaechens_table.php @@ -13,10 +13,10 @@ return new class extends Migration { Schema::create('allgemeinflaechens', function (Blueprint $table) { $table->id(); - $table->foreignId('projekte_id')->constrained()->cascadeOnDelete()->default(0); + $table->foreignId('projekte_id')->constrained()->cascadeOnDelete(); $table->string('geschoss')->nullable(); $table->string('raumart')->nullable(); - $table->string('flaeche')->nullable(); + $table->decimal('flaeche', 7, 2)->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2025_10_03_154047_create_raeumealles_table.php b/database/migrations/2025_10_03_154047_create_raeumealles_table.php index 2bb4df8..529030a 100644 --- a/database/migrations/2025_10_03_154047_create_raeumealles_table.php +++ b/database/migrations/2025_10_03_154047_create_raeumealles_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('raeumealles', function (Blueprint $table) { $table->id(); - $table->foreignId('projekte_id')->constrained()->cascadeOnDelete()->default(0); + $table->foreignId('projekte_id')->constrained()->cascadeOnDelete(); $table->integer('methode_id')->default(0); $table->integer('orientierung_id')->default(0); $table->string('top_nummer')->nullable(); diff --git a/database/migrations/2025_10_04_070015_create_notifications_table.php b/database/migrations/2025_10_04_070015_create_notifications_table.php new file mode 100644 index 0000000..d738032 --- /dev/null +++ b/database/migrations/2025_10_04_070015_create_notifications_table.php @@ -0,0 +1,31 @@ +uuid('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('notifications'); + } +}; diff --git a/database/migrations/2025_10_04_070016_create_imports_table.php b/database/migrations/2025_10_04_070016_create_imports_table.php new file mode 100644 index 0000000..1d9c09d --- /dev/null +++ b/database/migrations/2025_10_04_070016_create_imports_table.php @@ -0,0 +1,35 @@ +id(); + $table->timestamp('completed_at')->nullable(); + $table->string('file_name'); + $table->string('file_path'); + $table->string('importer'); + $table->unsignedInteger('processed_rows')->default(0); + $table->unsignedInteger('total_rows'); + $table->unsignedInteger('successful_rows')->default(0); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('imports'); + } +}; diff --git a/database/migrations/2025_10_04_070017_create_exports_table.php b/database/migrations/2025_10_04_070017_create_exports_table.php new file mode 100644 index 0000000..6a87ac3 --- /dev/null +++ b/database/migrations/2025_10_04_070017_create_exports_table.php @@ -0,0 +1,35 @@ +id(); + $table->timestamp('completed_at')->nullable(); + $table->string('file_disk'); + $table->string('file_name')->nullable(); + $table->string('exporter'); + $table->unsignedInteger('processed_rows')->default(0); + $table->unsignedInteger('total_rows'); + $table->unsignedInteger('successful_rows')->default(0); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('exports'); + } +}; diff --git a/database/migrations/2025_10_04_070018_create_failed_import_rows_table.php b/database/migrations/2025_10_04_070018_create_failed_import_rows_table.php new file mode 100644 index 0000000..2f77805 --- /dev/null +++ b/database/migrations/2025_10_04_070018_create_failed_import_rows_table.php @@ -0,0 +1,30 @@ +id(); + $table->json('data'); + $table->foreignId('import_id')->constrained()->cascadeOnDelete(); + $table->text('validation_error')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('failed_import_rows'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d55f573..bd13998 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -21,7 +21,6 @@ class DatabaseSeeder extends Seeder PlansSeeder::class, TextblockSeeder::class, InhaltsverzeichnisSeeder::class, - ProjekteSeeder::class, ]); if (app()->isLocal()) { diff --git a/database/seeders/ProjekteSeeder.php b/database/seeders/ProjekteSeeder.php deleted file mode 100644 index c4abee9..0000000 --- a/database/seeders/ProjekteSeeder.php +++ /dev/null @@ -1,21 +0,0 @@ -dasD

', '2025-10-10', 'entwurf', '2025-10-03 15:58:28', '2025-10-03 15:58:28', NULL); - "; - DB::unprepared($sql); - } -} diff --git a/storage/testdaten/allgemeineTabelle.txt b/storage/testdaten/allgemeineTabelle.txt index 0e30077..f262ee6 100644 --- a/storage/testdaten/allgemeineTabelle.txt +++ b/storage/testdaten/allgemeineTabelle.txt @@ -1,26 +1,26 @@ -Allgemein | EG | Dachfläche | 52,75 -Allgemein | EG | Freifläche | 116,21 -Allgemein | EG | Freifläche/ Gründach | 207,52 -Allgemein | EG | Gang | 10,09 -Allgemein | EG | Gang | 25,62 -Allgemein | EG | Stiegenhaus | 26,20 -Allgemein | OG1 | Gang | 30,25 -Allgemein | OG1 | Gang | 30,66 -Allgemein | OG1 | Stiegenhaus | 30,19 -Allgemein | OG2 | Lüftungszentrale | 20,19 -Allgemein | UG | Einsp. KFZ | 6,83 -Allgemein | UG | Einspurige Fahrzeuge | 16,74 -Allgemein | UG | Erschließung | 78,68 -Allgemein | UG | ET-Raum | 6,47 -Allgemein | UG | Fahrradraum | 20,58 -Allgemein | UG | Garage | 180,16 -Allgemein | UG | Hausmeisterr. | 5,83 -Allgemein | UG | Heizraum/HT | 11,69 -Allgemein | UG | Müllraum | 13,75 -Allgemein | UG | Stellplatz 22 | 12,04 -Allgemein | UG | Stellplatz 24 | 15,00 -Allgemein | UG | Stellplatz 25 | 15,00 -Allgemein | UG | Stellplatz 11 H | 18,88 -Allgemein | UG | Stiegenhaus | 36,12 -Allgemein | UG | VR | 44,88 -Allgemein | UG | Wasch/Trochenr. | 16,42 \ No newline at end of file +"EG","Dachfläche"," 52,75" +"EG","Freifläche","116,21" +"EG","Freifläche/ Gründach","207,52" +"EG","Gang"," 10,09" +"EG","Gang"," 25,62" +"EG","Stiegenhaus "," 26,20" +"OG1","Gang"," 30,25" +"OG1","Gang"," 30,66" +"OG1","Stiegenhaus "," 30,19" +"OG2","Lüftungszentrale"," 20,19" +"UG","Einsp. KFZ","6,83" +"UG","Einspurige Fahrzeuge"," 16,74" +"UG","Erschließung"," 78,68" +"UG","ET-Raum ","6,47" +"UG","Fahrradraum "," 20,58" +"UG","Garage","180,16" +"UG","Hausmeisterr. ","5,83" +"UG","Heizraum/HT "," 11,69" +"UG","Müllraum"," 13,75" +"UG","Stellplatz22"," 12,04" +"UG","Stellplatz24"," 15,00" +"UG","Stellplatz25"," 15,00" +"UG","Stellplatz 11 H "," 18,88" +"UG","Stiegenhaus "," 36,12" +"UG","VR"," 44,88" +"UG","Wasch/Trochenr."," 16,42" \ No newline at end of file diff --git a/storage/testdaten/basisTabelle.txt b/storage/testdaten/basisTabelle.txt index b9ac887..7d5c7fb 100644 --- a/storage/testdaten/basisTabelle.txt +++ b/storage/testdaten/basisTabelle.txt @@ -1,144 +1,144 @@ -APG 01 | UG | Stellplatz+ | 14,25 -APG 02 | UG | Stellplatz | 12,94 -APG 03 | UG | Stellplatz | 13,38 -APG 04 | UG | Stellplatz | 12,94 -APG 05 | UG | Stellplatz | 12,50 -APG 06 | UG | Stellplatz | 12,94 -APG 07 | UG | Stellplatz+ | 14,81 -APG 08 | UG | Stellplatz+ | 14,81 -APG 09 | UG | Stellplatz | 12,94 -APG 10 | UG | Stellplatz | 12,94 -APG 11 | UG | Stellplatz | 12,94 -APG 12 | UG | Stellplatz+ | 14,24 -APG 13 | UG | Stellplatz+ | 13,91 -APG 14 | UG | Stellplatz+ | 14,78 -APG 15 | UG | Stellplatz | 13,02 -APG 16 | UG | Stellplatz | 13,02 -APG 17 | UG | Stellplatz | 13,02 -APG 18 | UG | Stellplatz | 12,59 -APG 19 | UG | Stellplatz+ | 14,59 -W01 | EG | Abstellraum | 3,85 -W01 | EG | Bad | 5,92 -W01 | EG | Gang | 7,97 -W01 | EG | Garten G01_1 | 147,72 -W01 | EG | Garten G01_2 | 7,72 -W01 | EG | Terrasse | 18,16 -W01 | EG | WC | 2,46 -W01 | EG | Wohnen | 25,00 -W01 | EG | Wohnküche | 33,94 -W01 | EG | Zimmer 1 | 13,40 -W01 | EG | Zimmer 2 | 10,66 -W01 | UG | KA01 | 5,01 -W02 | EG | Bad | 3,86 -W02 | EG | Bad | 5,54 -W02 | EG | Gang | 10,42 -W02 | EG | Garten G02 | 37,27 -W02 | EG | Terrasse | 16,25 -W02 | EG | WC | 2,13 -W02 | EG | Wohnküche | 27,43 -W02 | EG | Zimmer 1 | 10,82 -W02 | EG | Zimmer 2 | 11,69 -W02 | UG | KA02 | 5,01 -W03 | EG | Abstellraum | 3,22 -W03 | EG | Bad | 6,51 -W03 | EG | Gang | 11,73 -W03 | EG | Garten G03 | 232,99 -W03 | EG | Terrasse | 22,64 -W03 | EG | WC | 2,46 -W03 | EG | Wohnküche | 35,69 -W03 | EG | Zimmer 1 | 14,70 -W03 | EG | Zimmer 2 | 10,89 -W03 | EG | Zimmer 3 | 11,52 -W03 | UG | KA03 | 5,01 -W04 | OG1 | Abstellraum | 3,09 -W04 | OG1 | Bad | 5,92 -W04 | OG1 | Balkon | 21,98 -W04 | OG1 | Gang | 11,50 -W04 | OG1 | WC | 2,46 -W04 | OG1 | Wohnküche | 33,93 -W04 | OG1 | Zimmer 1 | 10,88 -W04 | OG1 | Zimmer 2 | 10,86 -W04 | OG1 | Zimmer 3 | 14,67 -W04 | UG | KA04 | 5,01 -W05 | OG1 | Bad | 7,19 -W05 | OG1 | Balkon | 11,34 -W05 | OG1 | Wohnküche | 27,83 -W05 | OG1 | Zimmer | 13,62 -W05 | UG | KA05 | 5,01 -W06 | OG1 | Abstellraum | 4,11 -W06 | OG1 | Bad | 5,54 -W06 | OG1 | Balkon | 16,71 -W06 | OG1 | Gang | 10,42 -W06 | OG1 | WC | 2,13 -W06 | OG1 | Wohnküche | 27,43 -W06 | OG1 | Zimmer 1 | 10,97 -W06 | OG1 | Zimmer 2 | 12,08 -W06 | UG | KA06 | 5,13 -W07 | OG1 | Abstellraum | 3,22 -W07 | OG1 | Bad | 6,51 -W07 | OG1 | Balkon | 22,46 -W07 | OG1 | Gang | 11,73 -W07 | OG1 | WC | 2,46 -W07 | OG1 | Wohnküche | 35,68 -W07 | OG1 | Zimmer 1 | 14,70 -W07 | OG1 | Zimmer 2 | 10,89 -W07 | OG1 | Zimmer 3 | 11,52 -W07 | UG | KA07 | 5,13 -W08 | OG2 | Abstellraum | 3,09 -W08 | OG2 | Bad | 5,92 -W08 | OG2 | Balkon | 21,98 -W08 | OG2 | Gang | 11,50 -W08 | OG2 | WC | 2,46 -W08 | OG2 | Wohnküche | 33,93 -W08 | OG2 | Zimmer 1 | 10,88 -W08 | OG2 | Zimmer 2 | 10,86 -W08 | OG2 | Zimmer 3 | 14,67 -W08 | UG | KA08 | 5,13 -W09 | OG2 | Bad | 7,19 -W09 | OG2 | Balkon | 11,34 -W09 | OG2 | Wohnküche | 27,83 -W09 | OG2 | Zimmer | 13,62 -W09 | UG | KA09 | 5,13 -W10 | OG2 | Abstellraum | 4,11 -W10 | OG2 | Bad | 5,54 -W10 | OG2 | Balkon | 16,70 -W10 | OG2 | Gang | 10,42 -W10 | OG2 | WC | 2,13 -W10 | OG2 | Wohnküche | 27,43 -W10 | OG2 | Zimmer 1 | 10,97 -W10 | OG2 | Zimmer 2 | 12,08 -W10 | UG | KA10 | 5,13 -W11 | OG2 | Abstellraum | 3,22 -W11 | OG2 | Bad | 6,51 -W11 | OG2 | Balkon | 22,46 -W11 | OG2 | Gang | 11,73 -W11 | OG2 | WC | 2,46 -W11 | OG2 | Wohnküche | 35,68 -W11 | OG2 | Zimmer 1 | 14,70 -W11 | OG2 | Zimmer 2 | 10,89 -W11 | OG2 | Zimmer 3 | 11,52 -W11 | UG | KA11 | 4,06 -W12 | OG3 | Abstellraum | 3,09 -W12 | OG3 | Bad | 5,92 -W12 | OG3 | Balkon | 21,97 -W12 | OG3 | Gang | 11,50 -W12 | OG3 | WC | 2,46 -W12 | OG3 | Wohnküche | 33,93 -W12 | OG3 | Zimmer 1 | 10,88 -W12 | OG3 | Zimmer 2 | 10,86 -W12 | OG3 | Zimmer 3 | 14,67 -W12 | UG | KA12 | 4,06 -W13 | OG3 | Bad | 7,19 -W13 | OG3 | Balkon | 11,34 -W13 | OG3 | Wohnküche | 27,83 -W13 | OG3 | Zimmer | 13,62 -W13 | UG | KA13 | 4,06 -W14 | OG3 | Abstellraum | 4,11 -W14 | OG3 | Bad | 5,54 -W14 | OG3 | Balkon | 17,20 -W14 | OG3 | Gang | 10,42 -W14 | OG3 | WC | 2,13 -W14 | OG3 | Wohnküche | 27,08 -W14 | OG3 | Zimmer 1 | 10,97 -W14 | OG3 | Zimmer 2 | 12,08 -W14 | UG | KA14 | 4,06 \ No newline at end of file +"APG 01","UG ","Stellplatz+ ","14,25" +"APG 02","UG ","Stellplatz","12,94" +"APG 03","UG ","Stellplatz","13,38" +"APG 04","UG ","Stellplatz","12,94" +"APG 05","UG ","Stellplatz","12,50" +"APG 06","UG ","Stellplatz","12,94" +"APG 07","UG ","Stellplatz+ ","14,81" +"APG 08","UG ","Stellplatz+ ","14,81" +"APG 09","UG ","Stellplatz","12,94" +"APG 10","UG ","Stellplatz","12,94" +"APG 11","UG ","Stellplatz","12,94" +"APG 12","UG ","Stellplatz+ ","14,24" +"APG 13","UG ","Stellplatz+ ","13,91" +"APG 14","UG ","Stellplatz+ ","14,78" +"APG 15","UG ","Stellplatz","13,02" +"APG 16","UG ","Stellplatz","13,02" +"APG 17","UG ","Stellplatz","13,02" +"APG 18","UG ","Stellplatz","12,59" +"APG 19","UG ","Stellplatz+ ","14,59" +"W01","EG ","Abstellraum "," 3,85" +"W01","EG ","Bad "," 5,92" +"W01","EG ","Gang"," 7,97" +"W01","EG ","Garten G01_1"," 147,72" +"W01","EG ","Garten G01_2"," 7,72" +"W01","EG ","Terrasse","18,16" +"W01","EG ","WC"," 2,46" +"W01","EG ","Wohnen","25,00" +"W01","EG ","Wohnküche","33,94" +"W01","EG ","Zimmer 1","13,40" +"W01","EG ","Zimmer 2","10,66" +"W01","UG ","KA01"," 5,01" +"W02","EG ","Bad "," 3,86" +"W02","EG ","Bad "," 5,54" +"W02","EG ","Gang","10,42" +"W02","EG ","Garten G02","37,27" +"W02","EG ","Terrasse","16,25" +"W02","EG ","WC"," 2,13" +"W02","EG ","Wohnküche","27,43" +"W02","EG ","Zimmer 1","10,82" +"W02","EG ","Zimmer 2","11,69" +"W02","UG ","KA02"," 5,01" +"W03","EG ","Abstellraum "," 3,22" +"W03","EG ","Bad "," 6,51" +"W03","EG ","Gang","11,73" +"W03","EG ","Garten G03"," 232,99" +"W03","EG ","Terrasse","22,64" +"W03","EG ","WC"," 2,46" +"W03","EG ","Wohnküche","35,69" +"W03","EG ","Zimmer 1","14,70" +"W03","EG ","Zimmer 2","10,89" +"W03","EG ","Zimmer 3","11,52" +"W03","UG ","KA03"," 5,01" +"W04","OG1","Abstellraum "," 3,09" +"W04","OG1","Bad "," 5,92" +"W04","OG1","Balkon","21,98" +"W04","OG1","Gang","11,50" +"W04","OG1","WC"," 2,46" +"W04","OG1","Wohnküche","33,93" +"W04","OG1","Zimmer 1","10,88" +"W04","OG1","Zimmer 2","10,86" +"W04","OG1","Zimmer 3","14,67" +"W04","UG ","KA04"," 5,01" +"W05","OG1","Bad "," 7,19" +"W05","OG1","Balkon","11,34" +"W05","OG1","Wohnküche","27,83" +"W05","OG1","Zimmer","13,62" +"W05","UG ","KA05"," 5,01" +"W06","OG1","Abstellraum "," 4,11" +"W06","OG1","Bad "," 5,54" +"W06","OG1","Balkon","16,71" +"W06","OG1","Gang","10,42" +"W06","OG1","WC"," 2,13" +"W06","OG1","Wohnküche","27,43" +"W06","OG1","Zimmer 1","10,97" +"W06","OG1","Zimmer 2","12,08" +"W06","UG ","KA06"," 5,13" +"W07","OG1","Abstellraum "," 3,22" +"W07","OG1","Bad "," 6,51" +"W07","OG1","Balkon","22,46" +"W07","OG1","Gang","11,73" +"W07","OG1","WC"," 2,46" +"W07","OG1","Wohnküche","35,68" +"W07","OG1","Zimmer 1","14,70" +"W07","OG1","Zimmer 2","10,89" +"W07","OG1","Zimmer 3","11,52" +"W07","UG ","KA07"," 5,13" +"W08","OG2","Abstellraum "," 3,09" +"W08","OG2","Bad "," 5,92" +"W08","OG2","Balkon","21,98" +"W08","OG2","Gang","11,50" +"W08","OG2","WC"," 2,46" +"W08","OG2","Wohnküche","33,93" +"W08","OG2","Zimmer 1","10,88" +"W08","OG2","Zimmer 2","10,86" +"W08","OG2","Zimmer 3","14,67" +"W08","UG ","KA08"," 5,13" +"W09","OG2","Bad "," 7,19" +"W09","OG2","Balkon","11,34" +"W09","OG2","Wohnküche","27,83" +"W09","OG2","Zimmer","13,62" +"W09","UG ","KA09"," 5,13" +"W10","OG2","Abstellraum "," 4,11" +"W10","OG2","Bad "," 5,54" +"W10","OG2","Balkon","16,70" +"W10","OG2","Gang","10,42" +"W10","OG2","WC"," 2,13" +"W10","OG2","Wohnküche","27,43" +"W10","OG2","Zimmer 1","10,97" +"W10","OG2","Zimmer 2","12,08" +"W10","UG ","KA10"," 5,13" +"W11","OG2","Abstellraum "," 3,22" +"W11","OG2","Bad "," 6,51" +"W11","OG2","Balkon","22,46" +"W11","OG2","Gang","11,73" +"W11","OG2","WC"," 2,46" +"W11","OG2","Wohnküche","35,68" +"W11","OG2","Zimmer 1","14,70" +"W11","OG2","Zimmer 2","10,89" +"W11","OG2","Zimmer 3","11,52" +"W11","UG ","KA11"," 4,06" +"W12","OG3","Abstellraum "," 3,09" +"W12","OG3","Bad "," 5,92" +"W12","OG3","Balkon","21,97" +"W12","OG3","Gang","11,50" +"W12","OG3","WC"," 2,46" +"W12","OG3","Wohnküche","33,93" +"W12","OG3","Zimmer 1","10,88" +"W12","OG3","Zimmer 2","10,86" +"W12","OG3","Zimmer 3","14,67" +"W12","UG ","KA12"," 4,06" +"W13","OG3","Bad "," 7,19" +"W13","OG3","Balkon","11,34" +"W13","OG3","Wohnküche","27,83" +"W13","OG3","Zimmer","13,62" +"W13","UG ","KA13"," 4,06" +"W14","OG3","Abstellraum "," 4,11" +"W14","OG3","Bad "," 5,54" +"W14","OG3","Balkon","17,20" +"W14","OG3","Gang","10,42" +"W14","OG3","WC"," 2,13" +"W14","OG3","Wohnküche","27,08" +"W14","OG3","Zimmer 1","10,97" +"W14","OG3","Zimmer 2","12,08" +"W14","UG ","KA14"," 4,06" \ No newline at end of file