diff --git a/app/Filament/Resources/Contactgroups/ContactgroupResource.php b/app/Filament/Resources/Contactgroups/ContactgroupResource.php new file mode 100644 index 0000000..7a83b7f --- /dev/null +++ b/app/Filament/Resources/Contactgroups/ContactgroupResource.php @@ -0,0 +1,50 @@ + ListContactgroups::route('/'), + 'create' => CreateContactgroup::route('/create'), + 'edit' => EditContactgroup::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Contactgroups/Pages/CreateContactgroup.php b/app/Filament/Resources/Contactgroups/Pages/CreateContactgroup.php new file mode 100644 index 0000000..733820b --- /dev/null +++ b/app/Filament/Resources/Contactgroups/Pages/CreateContactgroup.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Contactgroups/Tables/ContactgroupsTable.php b/app/Filament/Resources/Contactgroups/Tables/ContactgroupsTable.php new file mode 100644 index 0000000..d81f1fd --- /dev/null +++ b/app/Filament/Resources/Contactgroups/Tables/ContactgroupsTable.php @@ -0,0 +1,40 @@ +columns([ + TextColumn::make('name') + ->searchable(), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Contacts/ContactResource.php b/app/Filament/Resources/Contacts/ContactResource.php new file mode 100644 index 0000000..dbc20df --- /dev/null +++ b/app/Filament/Resources/Contacts/ContactResource.php @@ -0,0 +1,52 @@ + ListContacts::route('/'), + 'create' => CreateContact::route('/create'), + 'edit' => EditContact::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Contacts/Pages/CreateContact.php b/app/Filament/Resources/Contacts/Pages/CreateContact.php new file mode 100644 index 0000000..c169fb5 --- /dev/null +++ b/app/Filament/Resources/Contacts/Pages/CreateContact.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('type') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Contacts/Tables/ContactsTable.php b/app/Filament/Resources/Contacts/Tables/ContactsTable.php new file mode 100644 index 0000000..ecb833b --- /dev/null +++ b/app/Filament/Resources/Contacts/Tables/ContactsTable.php @@ -0,0 +1,42 @@ +columns([ + TextColumn::make('name') + ->searchable(), + TextColumn::make('type') + ->searchable(), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Contracts/ContractResource.php b/app/Filament/Resources/Contracts/ContractResource.php new file mode 100644 index 0000000..ff4a957 --- /dev/null +++ b/app/Filament/Resources/Contracts/ContractResource.php @@ -0,0 +1,50 @@ + ListContracts::route('/'), + 'create' => CreateContract::route('/create'), + 'edit' => EditContract::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Contracts/Pages/CreateContract.php b/app/Filament/Resources/Contracts/Pages/CreateContract.php new file mode 100644 index 0000000..9852204 --- /dev/null +++ b/app/Filament/Resources/Contracts/Pages/CreateContract.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('type') + ->required(), + Select::make('responsible_id') + ->relationship('responsible', 'name') + ->required(), + MorphToSelect::make('contractable') + ->types([ + MorphToSelect\Type::make(User::class) + ->titleAttribute('name'), + MorphToSelect\Type::make(Contact::class) + ->titleAttribute('name'), + ]) + ]); + } +} diff --git a/app/Filament/Resources/Contracts/Tables/ContractsTable.php b/app/Filament/Resources/Contracts/Tables/ContractsTable.php new file mode 100644 index 0000000..05a858f --- /dev/null +++ b/app/Filament/Resources/Contracts/Tables/ContractsTable.php @@ -0,0 +1,49 @@ +columns([ + TextColumn::make('name') + ->searchable(), + TextColumn::make('type') + ->searchable(), + TextColumn::make('responsible.name') + ->searchable(), + TextColumn::make('contractable_type') + ->searchable(), + TextColumn::make('contractable_id') + ->numeric() + ->sortable(), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Documents/DocumentResource.php b/app/Filament/Resources/Documents/DocumentResource.php new file mode 100644 index 0000000..10d7b45 --- /dev/null +++ b/app/Filament/Resources/Documents/DocumentResource.php @@ -0,0 +1,50 @@ + ListDocuments::route('/'), + 'create' => CreateDocument::route('/create'), + 'edit' => EditDocument::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Documents/Pages/CreateDocument.php b/app/Filament/Resources/Documents/Pages/CreateDocument.php new file mode 100644 index 0000000..70e8125 --- /dev/null +++ b/app/Filament/Resources/Documents/Pages/CreateDocument.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('documentable_type') + ->required(), + TextInput::make('documentable_id') + ->required() + ->numeric(), + ]); + } +} diff --git a/app/Filament/Resources/Documents/Tables/DocumentsTable.php b/app/Filament/Resources/Documents/Tables/DocumentsTable.php new file mode 100644 index 0000000..2c3c504 --- /dev/null +++ b/app/Filament/Resources/Documents/Tables/DocumentsTable.php @@ -0,0 +1,45 @@ +columns([ + TextColumn::make('name') + ->searchable(), + TextColumn::make('documentable_type') + ->searchable(), + TextColumn::make('documentable_id') + ->numeric() + ->sortable(), + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Users/RelationManagers/DocumentsRelationManager.php b/app/Filament/Resources/Users/RelationManagers/DocumentsRelationManager.php deleted file mode 100644 index 884ba33..0000000 --- a/app/Filament/Resources/Users/RelationManagers/DocumentsRelationManager.php +++ /dev/null @@ -1,77 +0,0 @@ -components([ - TextInput::make('name') - ->required(), - TextInput::make('documentable_type') - ->required(), - TextInput::make('documentable_id') - ->required() - ->numeric(), - ]); - } - - public function table(Table $table): Table - { - return $table - ->recordTitleAttribute('name') - ->columns([ - TextColumn::make('name') - ->searchable(), - TextColumn::make('documentable_type') - ->searchable(), - TextColumn::make('documentable_id') - ->numeric() - ->sortable(), - TextColumn::make('created_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - TextColumn::make('updated_at') - ->dateTime() - ->sortable() - ->toggleable(isToggledHiddenByDefault: true), - ]) - ->filters([ - // - ]) - ->headerActions([ - CreateAction::make(), - AssociateAction::make(), - ]) - ->recordActions([ - EditAction::make(), - DissociateAction::make(), - DeleteAction::make(), - ]) - ->toolbarActions([ - BulkActionGroup::make([ - DissociateBulkAction::make(), - DeleteBulkAction::make(), - ]), - ]); - } -} diff --git a/app/Filament/Resources/Users/UserResource.php b/app/Filament/Resources/Users/UserResource.php index fff49d9..0aa9980 100644 --- a/app/Filament/Resources/Users/UserResource.php +++ b/app/Filament/Resources/Users/UserResource.php @@ -5,6 +5,8 @@ namespace App\Filament\Resources\Users; use App\Filament\Resources\Users\Pages\CreateUser; use App\Filament\Resources\Users\Pages\EditUser; use App\Filament\Resources\Users\Pages\ListUsers; +use App\Filament\Resources\Users\RelationManagers\ContractsRelationManager; +use App\Filament\Resources\Users\RelationManagers\DocumentsRelationManager; use App\Filament\Resources\Users\Schemas\UserForm; use App\Filament\Resources\Users\Tables\UsersTable; use App\Models\User; diff --git a/app/HasContactgroups.php b/app/HasContactgroups.php new file mode 100644 index 0000000..9db30ba --- /dev/null +++ b/app/HasContactgroups.php @@ -0,0 +1,15 @@ +morphToMany(Contactgroup::class, 'contactgroupable'); + } + +} diff --git a/app/HasContracts.php b/app/HasContracts.php index f100ebf..276640d 100644 --- a/app/HasContracts.php +++ b/app/HasContracts.php @@ -2,13 +2,13 @@ namespace App; -use App\Models\Document; +use App\Models\Contract; +use Illuminate\Database\Eloquent\Relations\MorphMany; trait HasContracts { - public function contracts() + public function contracts(): MorphMany { - return $this->morphMany(Document::class, 'contractable'); + return $this->morphMany(Contract::class, 'contractable'); } - } diff --git a/app/Models/Contact.php b/app/Models/Contact.php index 5e8c8ec..0a10b09 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -2,13 +2,15 @@ namespace App\Models; +use App\HasContactgroups; use App\HasContracts; use App\HasDocuments; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Contact extends Model { - use HasDocuments, HasContracts; + use HasContactgroups; protected $fillable = ['name', 'type']; diff --git a/app/Models/Contactgroup.php b/app/Models/Contactgroup.php new file mode 100644 index 0000000..33538f8 --- /dev/null +++ b/app/Models/Contactgroup.php @@ -0,0 +1,19 @@ +morphTo(); + } + +} diff --git a/app/Models/Contract.php b/app/Models/Contract.php index 0cef398..68d9003 100644 --- a/app/Models/Contract.php +++ b/app/Models/Contract.php @@ -4,16 +4,23 @@ namespace App\Models; use App\HasDocuments; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphTo; class Contract extends Model { use HasDocuments; - protected $fillable = ['name', 'type']; + protected $fillable = ['name', 'type', 'responsible_id', 'contractable_type', 'contractable_id']; - public function contractable() + public function contractable(): MorphTo { return $this->morphTo(); } + public function responsible(): BelongsTo + { + return $this->belongsTo(User::class); + } + } diff --git a/app/Models/Documentpermission.php b/app/Models/Documentpermission.php new file mode 100644 index 0000000..aac3170 --- /dev/null +++ b/app/Models/Documentpermission.php @@ -0,0 +1,10 @@ + */ use HasFactory, Notifiable; - use HasDocuments; + use HasContactgroups; + use HasContracts; /** * The attributes that are mass assignable. diff --git a/database/migrations/2026_02_08_135341_create_contracts_table.php b/database/migrations/2026_02_08_135341_create_contracts_table.php index b48f0c1..05277c3 100644 --- a/database/migrations/2026_02_08_135341_create_contracts_table.php +++ b/database/migrations/2026_02_08_135341_create_contracts_table.php @@ -16,8 +16,9 @@ return new class extends Migration $table->id(); $table->string('name'); $table->string('type'); - $table->foreignIdFor(User::class, 'responsible'); - $table->morphs('contractable'); + $table->foreignIdFor(User::class, 'responsible_id'); + $table->integer('contractable_id')->nullable(); + $table->string('contractable_type')->nullable(); $table->timestamps(); }); } diff --git a/database/migrations/2026_02_08_151554_create_documentpermissions_table.php b/database/migrations/2026_02_08_151554_create_documentpermissions_table.php new file mode 100644 index 0000000..f59a006 --- /dev/null +++ b/database/migrations/2026_02_08_151554_create_documentpermissions_table.php @@ -0,0 +1,30 @@ +id(); + $table->string("type"); + $table->string("class"); + $table->string("acl"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('documentpermissions'); + } +}; diff --git a/database/migrations/2026_02_08_154945_create_contactgroups_table.php b/database/migrations/2026_02_08_154945_create_contactgroups_table.php new file mode 100644 index 0000000..19bfd1a --- /dev/null +++ b/database/migrations/2026_02_08_154945_create_contactgroups_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('contactgroups'); + } +}; diff --git a/database/migrations/2026_02_08_155115_create_contactgroupables_table.php b/database/migrations/2026_02_08_155115_create_contactgroupables_table.php new file mode 100644 index 0000000..13e19cc --- /dev/null +++ b/database/migrations/2026_02_08_155115_create_contactgroupables_table.php @@ -0,0 +1,27 @@ +foreignId('contactgroup_id')->constrained(); + $table->morphs('contactgroupable'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('contactgroupables'); + } +}; diff --git a/database/seeders/ContactgroupSeeder.php b/database/seeders/ContactgroupSeeder.php new file mode 100644 index 0000000..1e5abb0 --- /dev/null +++ b/database/seeders/ContactgroupSeeder.php @@ -0,0 +1,28 @@ + $contactgroup]); + } + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index bb23c17..c50bcff 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -16,13 +16,15 @@ class DatabaseSeeder extends Seeder public function run(): void { - User::firstOrCreate( - ['email' => 'info@geoventis.de'], - [ - 'name' => 'Max Mustermann', - 'password' => bcrypt('servo3000'), - ] - ); + $this->call([ + UserSeeder::class, + DocumentpermissionSeeder::class, + ContactgroupSeeder::class, + ]); + + + + } } diff --git a/database/seeders/DocumentpermissionSeeder.php b/database/seeders/DocumentpermissionSeeder.php new file mode 100644 index 0000000..6ba985f --- /dev/null +++ b/database/seeders/DocumentpermissionSeeder.php @@ -0,0 +1,22 @@ +insert([ + 'type' => 'Krankmeldung', + 'class' => 'App\Models\User', + 'acl' => 'default:|self:cr|memberOf(contactgroups.Personalabteilung)', + ]); + } +} diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..8259e05 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,31 @@ + 'info@geoventis.de'], + [ + 'name' => 'Max Mustermann', + 'password' => bcrypt('servo3000'), + ] + ); + User::firstOrCreate( + ['email' => 'alexander.gabriel@digital-infinity.de'], + [ + 'name' => 'Alexander Gabriel', + 'password' => bcrypt('servo3000'), + ] + ); + } +}