From 04e27976670d239d822fdf6a14bcb9320ba26301 Mon Sep 17 00:00:00 2001 From: salam Date: Sun, 21 Sep 2025 08:28:49 +0200 Subject: [PATCH] agb registrierung wip --- app/Filament/Pages/Auth/Register.php | 58 +++-- .../Resources/Kontos/Tables/KontosTable.php | 2 +- app/Models/Konto.php | 19 ++ app/Models/User.php | 13 +- app/Providers/AppServiceProvider.php | 2 +- composer.lock | 42 +-- ...0001_01_01_000000__create_kontos_table.php | 4 +- .../0001_01_01_000000_create_users_table.php | 3 + ...1_01_01_000002_add_role_to_users_table.php | 18 -- ...5_09_05_131323_create_gutachter_tables.php | 2 +- database/seeders/KontoSeeder.php | 2 +- .../pages/auth/register-page.blade.php | 3 + resources/views/pages/agb.blade.php | 243 ++++++++++++++++++ 13 files changed, 343 insertions(+), 68 deletions(-) delete mode 100644 database/migrations/0001_01_01_000002_add_role_to_users_table.php create mode 100644 resources/views/filament/pages/auth/register-page.blade.php create mode 100644 resources/views/pages/agb.blade.php diff --git a/app/Filament/Pages/Auth/Register.php b/app/Filament/Pages/Auth/Register.php index 84bb68e..77d73e6 100644 --- a/app/Filament/Pages/Auth/Register.php +++ b/app/Filament/Pages/Auth/Register.php @@ -5,11 +5,13 @@ namespace App\Filament\Pages\Auth; use App\Models\Konto; use Danielebarbaro\LaravelVatEuValidator\Rules\VatNumber; use Filament\Auth\Pages\Register as BaseRegister; +use Filament\Forms\Components\Checkbox; use Filament\Forms\Components\Select; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Fieldset; use Filament\Schemas\Components\Utilities\Get; +use Filament\Schemas\Components\View; use Filament\Schemas\Components\Wizard; use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Schema; @@ -36,32 +38,53 @@ class Register extends BaseRegister ->icon('lucide-key-square') ->description('Mit einem Konto verbinden.') ->schema([ - $this->getKontoFormComponent(), + $this->getKontoModusFormComponent(), /** OLD */ - $this->selectKontoFormComponent(), + $this->getKontoFormComponent(), /** NEU */ Fieldset::make('Rechnungsdaten') ->visible(fn (Get $get): bool => $get('konto') == 'new') ->schema([ $this->getCompanyFormComponent(), $this->getUIDFormComponent(), - $this->getPlaceFormComponent(), + $this->getLocationFormComponent(), $this->getPLZFormComponent(), $this->getCountryFormComponent(), $this->getAdresseFormComponent(), $this->getGenderFormComponent(), $this->getFirstNameFormComponent(), $this->getLastNameFormComponent(), - $this->getPhoneFormComponent(), $this->getKontoEmailFormComponent(), + $this->getPhoneFormComponent(), ])->columnSpan(4), ]), + Wizard\Step::make('AGB') + ->icon('lucide-key-square') + ->visible(fn (Get $get): bool => $get('konto') == 'new') + ->description(' Allgemein Geschäftsbedignugen') + ->schema([ + Fieldset::make('Bitte lesen und akzeptieren Sie die allgemeinen Geschäftsbedignungen um die Registrierung abzuschließen.') + ->visible(fn (Get $get): bool => $get('konto') == 'new') + ->schema([ + $this->getABGFormComponent(), + ])->columnSpan(4), + + View::make('pages.agb'), + ]), ]), ]); } + protected function getABGFormComponent(): Checkbox + { + return Checkbox::make('agb_akzeptiert') + ->label('ABG akzeptieren') + ->visible(fn (Get $get): bool => $get('konto') == 'new') + ->required(); + } + protected function getPhoneFormComponent(): PhoneInput { return PhoneInput::make('phone') @@ -74,16 +97,17 @@ class Register extends BaseRegister { return TextInput::make('country') ->label('Land') - ->placeholder('Österreich') + ->default('Österreich') ->visible(fn (Get $get): bool => $get('konto') == 'new') ->required(); } protected function getKontoEmailFormComponent(): TextInput { - return TextInput::make('konto-email') + return TextInput::make('kontoemail') ->label('E-Mail') ->visible(fn (Get $get): bool => $get('konto') == 'new') + ->unique(table: Konto::class) ->required(); } @@ -95,9 +119,9 @@ class Register extends BaseRegister ->required(); } - protected function getPlaceFormComponent(): TextInput + protected function getLocationFormComponent(): TextInput { - return TextInput::make('place') + return TextInput::make('location') ->label('Ort') ->visible(fn (Get $get): bool => $get('konto') == 'new') ->required(); @@ -144,17 +168,6 @@ class Register extends BaseRegister ->required(); } - protected function getRoleFormComponent(): Select - { - return Select::make('role') - ->options([ - 'gutachter' => 'Gutachter', - 'super_admin' => 'Administrator', - ]) - ->default('gutachter') - ->required(); - } - protected function getGenderFormComponent(): Select { return Select::make('gender') @@ -169,7 +182,7 @@ class Register extends BaseRegister ->required(); } - protected function getKontoFormComponent(): Select + protected function getKontoModusFormComponent(): Select { return Select::make('konto') ->columnSpan(4) @@ -187,11 +200,14 @@ class Register extends BaseRegister ->required(); } - protected function selectKontoFormComponent(): Select + protected function getKontoFormComponent(): Select { return Select::make('konto_id') ->columnSpan(4) ->label('Konto auswählen') + ->belowLabel([ + 'Um das erstellte Profil zu aktivieren muß der Kontoinhaber die Anmeldung im Programm freischalten', + ]) ->visible(fn (Get $get): bool => $get('konto') == 'old') ->options(Konto::query()->pluck('company', 'id')) ->searchable() diff --git a/app/Filament/Resources/Kontos/Tables/KontosTable.php b/app/Filament/Resources/Kontos/Tables/KontosTable.php index 5e5d10e..a886ddd 100644 --- a/app/Filament/Resources/Kontos/Tables/KontosTable.php +++ b/app/Filament/Resources/Kontos/Tables/KontosTable.php @@ -21,7 +21,7 @@ class KontosTable TextColumn::make('last_name')->label('Nachname'), TextColumn::make('company')->label('Firma'), TextColumn::make('address')->label('Adresse'), - TextColumn::make('place')->label('Ort'), + TextColumn::make('location')->label('Ort'), TextColumn::make('code')->label('PLZ'), TextColumn::make('phone')->label('Telefon'), TextColumn::make('uid_number')->label('UID Nummer'), diff --git a/app/Models/Konto.php b/app/Models/Konto.php index c1396e1..0589124 100644 --- a/app/Models/Konto.php +++ b/app/Models/Konto.php @@ -7,6 +7,25 @@ use Illuminate\Database\Eloquent\Model; class Konto extends Model { + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'title', + 'gender', + 'first_name', + 'last_name', + 'company', + 'address', + 'location', + 'code', + 'country', + 'kontoemail', + 'phone', + 'uid_number', + ]; // protected static function booted(): void // { // static::addGlobalScope('konto', function (Builder $query) { diff --git a/app/Models/User.php b/app/Models/User.php index ca9d125..b01c34e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -27,6 +27,8 @@ class User extends Authenticatable implements FilamentUser, HasAppAuthentication */ protected $fillable = [ 'name', + 'first_name', + 'last_name', 'email', 'konto_id', 'password', @@ -36,12 +38,16 @@ class User extends Authenticatable implements FilamentUser, HasAppAuthentication 'first_name', 'last_name', 'gender', + + 'title', 'company', - 'uid_number', 'address', - 'place', + 'location', 'code', + 'country', + 'kontoemail', 'phone', + 'uid_number', ]; /** @@ -78,6 +84,9 @@ class User extends Authenticatable implements FilamentUser, HasAppAuthentication static::addGlobalScope(new KontoScope); static::creating(function (User $user) { + + dd($user); + $user->role = 'gutachter'; }); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9d88313..322ef76 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -28,7 +28,7 @@ class AppServiceProvider extends ServiceProvider 'danger' => Color::Red, 'gray' => Color::Zinc, 'info' => Color::Indigo, - 'primary' => Color::Yellow, + 'primary' => Color::Blue, 'success' => Color::Green, 'warning' => Color::Amber, ]); diff --git a/composer.lock b/composer.lock index 8e497b7..cc6c32e 100644 --- a/composer.lock +++ b/composer.lock @@ -671,16 +671,16 @@ }, { "name": "chillerlan/php-qrcode", - "version": "5.0.3", + "version": "5.0.4", "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "42e215640e9ebdd857570c9e4e52245d1ee51de2" + "reference": "390393e97a6e42ccae0e0d6205b8d4200f7ddc43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/42e215640e9ebdd857570c9e4e52245d1ee51de2", - "reference": "42e215640e9ebdd857570c9e4e52245d1ee51de2", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/390393e97a6e42ccae0e0d6205b8d4200f7ddc43", + "reference": "390393e97a6e42ccae0e0d6205b8d4200f7ddc43", "shasum": "" }, "require": { @@ -691,13 +691,13 @@ "require-dev": { "chillerlan/php-authenticator": "^4.3.1 || ^5.2.1", "ext-fileinfo": "*", - "phan/phan": "^5.4.5", + "phan/phan": "^5.5.1", "phpcompatibility/php-compatibility": "10.x-dev", "phpmd/phpmd": "^2.15", "phpunit/phpunit": "^9.6", "setasign/fpdf": "^1.8.2", - "slevomat/coding-standard": "^8.15", - "squizlabs/php_codesniffer": "^3.11" + "slevomat/coding-standard": "^8.23.0", + "squizlabs/php_codesniffer": "^4.0.0" }, "suggest": { "chillerlan/php-authenticator": "Yet another Google authenticator! Also creates URIs for mobile apps.", @@ -760,7 +760,7 @@ "type": "Ko-Fi" } ], - "time": "2024-11-21T16:12:34+00:00" + "time": "2025-09-19T17:30:27+00:00" }, { "name": "chillerlan/php-settings-container", @@ -4783,21 +4783,21 @@ }, { "name": "pragmarx/google2fa-qrcode", - "version": "v3.0.0", + "version": "v3.0.1", "source": { "type": "git", "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", - "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b" + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b", - "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/c23ebcc3a50de0d1566016a6dd1486e183bb78e1", + "reference": "c23ebcc3a50de0d1566016a6dd1486e183bb78e1", "shasum": "" }, "require": { "php": ">=7.1", - "pragmarx/google2fa": ">=4.0" + "pragmarx/google2fa": "^4.0|^5.0|^6.0|^7.0|^8.0" }, "require-dev": { "bacon/bacon-qr-code": "^2.0", @@ -4844,9 +4844,9 @@ ], "support": { "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", - "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0" + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.1" }, - "time": "2021-08-15T12:53:48+00:00" + "time": "2025-09-19T23:02:26+00:00" }, { "name": "propaganistas/laravel-phone", @@ -5334,16 +5334,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.10", + "version": "v0.12.12", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22" + "reference": "cd23863404a40ccfaf733e3af4db2b459837f7e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6e80abe6f2257121f1eb9a4c55bf29d921025b22", - "reference": "6e80abe6f2257121f1eb9a4c55bf29d921025b22", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/cd23863404a40ccfaf733e3af4db2b459837f7e7", + "reference": "cd23863404a40ccfaf733e3af4db2b459837f7e7", "shasum": "" }, "require": { @@ -5406,9 +5406,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.10" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.12" }, - "time": "2025-08-04T12:39:37+00:00" + "time": "2025-09-20T13:46:31+00:00" }, { "name": "ralouphie/getallheaders", diff --git a/database/migrations/0001_01_01_000000__create_kontos_table.php b/database/migrations/0001_01_01_000000__create_kontos_table.php index f3b1088..2e0efa7 100644 --- a/database/migrations/0001_01_01_000000__create_kontos_table.php +++ b/database/migrations/0001_01_01_000000__create_kontos_table.php @@ -18,11 +18,11 @@ return new class extends Migration $table->string('first_name'); $table->string('last_name'); $table->string('company'); + $table->string('kontoemail')->nullable(); $table->string('address')->nullable(); - $table->string('place')->nullable(); + $table->string('location')->nullable(); $table->string('code')->nullable(); $table->string('country')->nullable(); - $table->string('konto-email')->nullable(); $table->string('phone')->nullable(); $table->string('uid_number')->nullable(); $table->timestamps(); 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 9213173..108601f 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -16,9 +16,12 @@ return new class extends Migration $table->foreignId('konto_id')->constrained()->cascadeOnDelete()->default(0); $table->string('gender')->nullable(); $table->string('name'); + $table->string('first_name'); + $table->string('last_name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->string('role'); $table->boolean('super_admin')->default(0); $table->text('app_authentication_secret')->nullable(); diff --git a/database/migrations/0001_01_01_000002_add_role_to_users_table.php b/database/migrations/0001_01_01_000002_add_role_to_users_table.php deleted file mode 100644 index da17d1f..0000000 --- a/database/migrations/0001_01_01_000002_add_role_to_users_table.php +++ /dev/null @@ -1,18 +0,0 @@ -string('role')->nullable()->after('password'); - }); - } -}; diff --git a/database/migrations/2025_09_05_131323_create_gutachter_tables.php b/database/migrations/2025_09_05_131323_create_gutachter_tables.php index 21b62a3..72451ec 100644 --- a/database/migrations/2025_09_05_131323_create_gutachter_tables.php +++ b/database/migrations/2025_09_05_131323_create_gutachter_tables.php @@ -17,7 +17,7 @@ return new class extends Migration $table->string('name')->nullable(); $table->string('logo')->nullable(); $table->string('address')->nullable(); - $table->string('place')->nullable(); + $table->string('location')->nullable(); $table->string('code')->nullable(); $table->string('phone')->nullable(); $table->timestamp('deleted_at')->nullable(); diff --git a/database/seeders/KontoSeeder.php b/database/seeders/KontoSeeder.php index 2d4fb03..475790c 100644 --- a/database/seeders/KontoSeeder.php +++ b/database/seeders/KontoSeeder.php @@ -12,7 +12,7 @@ class KontoSeeder extends Seeder */ public function run(): void { - $sql = "INSERT INTO `kontos` (`id`, `title`, `gender`, `first_name`, `last_name`, `company`, `address`, `place`, `code`, `phone`, `uid_number`) + $sql = "INSERT INTO `kontos` (`id`, `title`, `gender`, `first_name`, `last_name`, `company`, `address`, `location`, `code`, `phone`, `uid_number`) VALUES ('1', 'Architekt', 'Herr','Bruno','Kunz','Architekt Kunz','Pradlerstraße 11','Innbsruck', '6020', '0512 457328', 'ATU 234578'), ('2', 'Architekt', 'Herr','Sepp','Unterlugauer','Architekt Unterlugauer','Seestraße 1','Innbsruck', '6020', '0512 457328', 'ATU 234578'); diff --git a/resources/views/filament/pages/auth/register-page.blade.php b/resources/views/filament/pages/auth/register-page.blade.php new file mode 100644 index 0000000..bb8ed15 --- /dev/null +++ b/resources/views/filament/pages/auth/register-page.blade.php @@ -0,0 +1,3 @@ + + {{-- Page content --}} + diff --git a/resources/views/pages/agb.blade.php b/resources/views/pages/agb.blade.php new file mode 100644 index 0000000..ce67e6e --- /dev/null +++ b/resources/views/pages/agb.blade.php @@ -0,0 +1,243 @@ +
+ + Allgemeine Geschäftsbedingungen (AGB) + + + + 1. Geltungsbereich + + Diese Allgemeinen Geschäftsbedingungen (AGB) regeln die Nutzung der SaaS-Anwendung zur Nutzwertberechnung für + Architekten (nachfolgend „Software“ oder „Dienstleistung“) der [Dein Unternehmen] (nachfolgend „Anbieter“, „wir“ + oder „uns“). Mit der Nutzung der Software erklärt sich der Nutzer (nachfolgend „Kunde“ oder „Sie“) mit diesen + AGB einverstanden. + + + + 2. Vertragsgegenstand + + Der Anbieter stellt dem Kunden eine webbasierte Software zur Verfügung, mit der der Kunde die Nutzwertberechnung + für Bauprojekte durchführen kann. Die Software wird als Software-as-a-Service (SaaS) angeboten, die über das + Internet zugänglich ist. + + + + 3. Nutzungsrechte + +
    +
  1. + Der Anbieter gewährt dem Kunden ein nicht-exklusives, nicht übertragbares, zeitlich begrenztes Recht + zur Nutzung + der Software gemäß den Bestimmungen dieses Vertrages. +
  2. +
  3. + Der Kunde darf die Software nur im Rahmen der vertraglich vorgesehenen Nutzung verwenden. Jegliche + kommerzielle + Weiterverbreitung oder -verwertung der Software ist untersagt. +
  4. +
+
+ + + 5. Leistungen des Anbieters + +
    +
  1. + Um die Software zu nutzen, muss sich der Kunde auf der Website des Anbieters registrieren und ein + Benutzerkonto + anlegen. Der Kunde ist verpflichtet, wahrheitsgemäße und vollständige Angaben zu machen. +
  2. +
  3. + Der Kunde ist verantwortlich für die Sicherheit seiner Zugangsdaten (Benutzername und Passwort) und hat + sicherzustellen, dass diese nicht an Dritte weitergegeben werden. Im Falle eines Missbrauchs der + Zugangsdaten ist der Kunde verpflichtet, den Anbieter unverzüglich zu informieren. +
  4. +
+
+ + + 4. Registrierung und Zugangsdaten + +
    +
  1. + Der Anbieter stellt die Software in der jeweils aktuellsten Version zur Verfügung und gewährleistet eine + betriebsbereite Anwendung, vorbehaltlich geplanter Wartungsarbeiten und unvorhersehbarer + Systemstörungen. +
  2. +
  3. + Der Anbieter kann jederzeit Funktionen der Software ändern, erweitern oder entfernen, wenn dies im + Interesse der + Verbesserung der Software liegt oder aus rechtlichen bzw. technischen Gründen notwendig ist. Der Kunde + wird über + wesentliche Änderungen rechtzeitig informiert. +
  4. +
+
+ + + 6. Verfügbarkeit und Wartung + +
    +
  1. + Der Anbieter verpflichtet sich zu einer Verfügbarkeit der Software von 99% pro Jahr, mit Ausnahme + geplanter + Wartungsfenster und unvorhergesehener technischer Störungen. Der Anbieter wird sich bemühen, geplante + Wartungsarbeiten außerhalb der üblichen Arbeitszeiten durchzuführen und diese dem Kunden im Voraus + mitzuteilen. +
  2. +
  3. + Im Falle von Störungen oder Ausfällen wird der Anbieter umgehend Maßnahmen ergreifen, um den Betrieb der + Software + wiederherzustellen. +
  4. +
+
+ + + 7. Gebühren und Zahlungsbedingungen + +
    +
  1. + Die Nutzung der Software ist kostenpflichtig. Die Preise und Zahlungsbedingungen sind im jeweiligen + Vertrag oder + auf der Website des Anbieters einsehbar. +
  2. +
  3. + Die Zahlung erfolgt nach den im Vertrag vereinbarten Modalitäten, z. B. monatlich oder jährlich, im + Voraus. +
  4. +
+
+ + + 7. Gebühren und Zahlungsbedingungen + +
    +
  1. + Die Nutzung der Software ist kostenpflichtig. Die Preise und Zahlungsbedingungen sind im jeweiligen + Vertrag oder + auf der Website des Anbieters einsehbar. +
  2. +
  3. + Die Zahlung erfolgt nach den im Vertrag vereinbarten Modalitäten, z. B. monatlich oder jährlich, im + Voraus. +
  4. +
  5. + Bei Zahlungsverzug behält sich der Anbieter das Recht vor, den Zugang zur Software zu sperren oder den + Vertrag + fristlos zu kündigen. +
  6. +
+
+ + + 8. Rechte an den Daten + +
    +
  1. + Der Kunde bleibt Eigentümer aller Daten, die er in die Software eingibt (z. B. Berechnungen, + Projektinformationen). Der Anbieter erhält lediglich das Recht, diese Daten im Rahmen der Nutzung der + Software zu + verarbeiten. +
  2. +
  3. + Der Anbieter verpflichtet sich, die Daten des Kunden vertraulich zu behandeln und nur im Einklang mit + den + geltenden Datenschutzgesetzen zu verwenden. Der Anbieter wird die Daten nicht ohne Zustimmung des Kunden + an Dritte + weitergeben, es sei denn, dies ist gesetzlich erforderlich. +
  4. +
+
+ + + 9. Haftung und Gewährleistung + +
    +
  1. + Der Anbieter haftet nur für Schäden, die durch vorsätzliche oder grob fahrlässige Handlungen verursacht + wurden. + Eine Haftung für leichte Fahrlässigkeit ist ausgeschlossen, es sei denn, es handelt sich um die + Verletzung + wesentlicher Vertragspflichten. +
  2. +
  3. + Der Anbieter übernimmt keine Haftung für die Richtigkeit der Berechnungen, die durch die Software + durchgeführt + werden. Der Kunde ist verpflichtet, die Ergebnisse vor der Verwendung zu überprüfen. +
  4. +
  5. + Der Anbieter übernimmt keine Haftung für Schäden, die durch unsachgemäße Nutzung der Software durch den + Kunden + entstehen. +
  6. +
+
+ + + 10. Datenschutz + +
    +
  1. + Der Anbieter verpflichtet sich, alle gesetzlichen Bestimmungen zum Datenschutz zu beachten. Weitere + Informationen + zum Datenschutz sind in der Datenschutzerklärung des Anbieters einsehbar. +
  2. +
  3. + Der Kunde erklärt sich mit der Verarbeitung seiner Daten durch den Anbieter im Rahmen der Nutzung der + Software + einverstanden. Der Kunde hat jederzeit das Recht, auf seine gespeicherten Daten zuzugreifen, diese zu + berichtigen + oder zu löschen. +
  4. +
+
+ + + 11. Laufzeit und Kündigung + +
    +
  1. + Der Vertrag wird auf unbestimmte Zeit geschlossen, es sei denn, eine feste Laufzeit wurde vereinbart. +
  2. +
  3. + Der Vertrag kann von beiden Parteien jederzeit mit einer Frist von 30 Tagen schriftlich gekündigt + werden. +
  4. +
  5. Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt.
  6. +
+
+ + + 12. Änderungen der AGB + +
    +
  1. + Der Anbieter behält sich das Recht vor, diese AGB jederzeit zu ändern. Änderungen werden dem Kunden per + E-Mail + oder über die Software selbst mitgeteilt. +
  2. +
  3. + Die Änderungen gelten als akzeptiert, wenn der Kunde die Software nach der Mitteilung weiterhin nutzt + oder nicht + innerhalb von 30 Tagen nach Erhalt der Mitteilung widerspricht. +
  4. +
+
+ + + 13. Schlussbestimmungen + +
    +
  1. + Auf diesen Vertrag ist deutsches Recht anwendbar. Gerichtsstand ist, soweit gesetzlich zulässig, der + Sitz des + Anbieters. +
  2. +
  3. + Sollten einzelne Bestimmungen dieses Vertrages unwirksam oder undurchführbar sein, bleibt der Vertrag im + Übrigen + wirksam. +
  4. +
+
+