From 81f6286db36cfd68d8fa4c89afa01579aed2a5a0 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Tue, 29 Jul 2025 23:43:23 +0200 Subject: [PATCH 1/9] wip --- app/Actions/ViewDataAction.php | 4 +- app/Enums/ContactSectionEnum.php | 6 +- .../seeders/Codebar/ContactsTableSeeder.php | 104 +++++++++++++++--- .../Paperflakes/ContactsTableSeeder.php | 81 +++++++------- lang/de_CH.json | 3 +- resources/views/app/about-us/index.blade.php | 33 +----- .../views/components/list-grid.blade.php | 2 +- 7 files changed, 139 insertions(+), 94 deletions(-) diff --git a/app/Actions/ViewDataAction.php b/app/Actions/ViewDataAction.php index ab1abb6..403b1ad 100644 --- a/app/Actions/ViewDataAction.php +++ b/app/Actions/ViewDataAction.php @@ -82,9 +82,7 @@ public function contacts(string $locale): object ->get(); return (object) collect([ - ContactSectionEnum::EMPLOYEE_SERVICES, - ContactSectionEnum::EMPLOYEE_PRODUCTS, - ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES, ContactSectionEnum::COLLABORATIONS, ContactSectionEnum::BOARD_MEMBERS, ])->mapWithKeys(function (string $section) use ($publishedContacts, $locale): array { diff --git a/app/Enums/ContactSectionEnum.php b/app/Enums/ContactSectionEnum.php index 6c4be53..c3fdfc2 100644 --- a/app/Enums/ContactSectionEnum.php +++ b/app/Enums/ContactSectionEnum.php @@ -4,11 +4,7 @@ enum ContactSectionEnum: string { - const string EMPLOYEE_SERVICES = 'employee_services'; - - const string EMPLOYEE_PRODUCTS = 'employee_products'; - - const string EMPLOYEE_ADMINISTRATION = 'employee_administration'; + const string EMPLOYEES = 'employees'; const string COLLABORATIONS = 'collaborations'; diff --git a/database/seeders/Codebar/ContactsTableSeeder.php b/database/seeders/Codebar/ContactsTableSeeder.php index f43aa95..d0f448b 100644 --- a/database/seeders/Codebar/ContactsTableSeeder.php +++ b/database/seeders/Codebar/ContactsTableSeeder.php @@ -16,8 +16,8 @@ public function run(): void 'name' => 'Sebastian Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Software-Architekt', 'en_CH' => 'Software-Engineer', @@ -38,45 +38,115 @@ public function run(): void Contact::updateOrCreate( ['id' => 2], [ - 'name' => 'Rhys Lees', + 'name' => 'Melanie Bürgin-Fix', + 'published' => true, + 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'Administration', + 'en_CH' => 'Administration', + ], + ], + ContactSectionEnum::BOARD_MEMBERS => [ + 'key' => ContactSectionEnum::BOARD_MEMBERS, + ], + ], + 'icons' => [ + 'email' => 'melanie.buergin@codebar.ch', + 'linkedin' => 'https://www.linkedin.com/in/melanie-buergin', + ], + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + ] + ); + + Contact::updateOrCreate( + ['id' => 3], + [ + 'name' => 'Tobias Brogle', + 'published' => true, + 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'Applikationsentwickler', + 'en_CH' => 'Application Developer', + ], + ], + ], + 'icons' => [ + 'email' => 'tobias.brogle@codebar.ch', + 'linkedin' => null, + ], + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + ] + ); + + Contact::updateOrCreate( + ['id' => 4], + [ + 'name' => 'Alexander Christoph Boll', + 'published' => true, + 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'Produktentwickler', + 'en_CH' => 'Product Developer', + ], + ], + ], + 'icons' => [ + 'email' => 'alexander.boll@codebar.ch', + 'linkedin' => 'https://www.linkedin.com/in/alexanderboll', + ], + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + ] + ); + + Contact::updateOrCreate( + ['id' => 5], + [ + 'name' => 'Dominique Ernst', 'published' => false, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Entwickler', - 'en_CH' => 'Developer', + 'de_CH' => 'Projektleiter', + 'en_CH' => 'Project Manager', ], ], ], 'icons' => [ - 'email' => 'rhys.leess@codebar.ch', - 'linkedin' => 'https://www.linkedin.com/in/rhys-lees', + 'email' => 'info@paperflakes.ch', + 'website' => 'https://www.paperflakes.ch', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/r_lees_e_background_removal_f_png.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', ] ); Contact::updateOrCreate( - ['id' => 7], + ['id' => 6], [ - 'name' => 'Sebastian Bürgin-Fix', + 'name' => 'PST GmbH', 'published' => true, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, 'role' => [ - 'de_CH' => 'paperflakes AG', - 'en_CH' => 'paperflakes AG', + 'de_CH' => 'Finanzen', + 'en_CH' => 'Finance', ], ], ], 'icons' => [ - 'email' => 'info@paperflakes.ch', - 'website' => 'https://www.paperflakes.ch', + 'email' => 'info@pstgmbh.ch', + 'website' => 'https://www.pstgmbh.ch', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', ] ); + } } diff --git a/database/seeders/Paperflakes/ContactsTableSeeder.php b/database/seeders/Paperflakes/ContactsTableSeeder.php index bbe2b89..ba12ac8 100644 --- a/database/seeders/Paperflakes/ContactsTableSeeder.php +++ b/database/seeders/Paperflakes/ContactsTableSeeder.php @@ -16,20 +16,13 @@ public function run(): void 'name' => 'Sebastian Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, - 'role' => [ - 'de_CH' => 'DMS/ECM Spezialist', - 'en_CH' => 'DMS/ECM Specialist', - ], - ], - /* ContactSectionEnum::EMPLOYEE_PRODUCTS => [ - 'key' => ContactSectionEnum::EMPLOYEE_PRODUCTS, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Software-Architekt', 'en_CH' => 'Software-Engineer', ], - ],*/ + ], ContactSectionEnum::BOARD_MEMBERS => [ 'key' => ContactSectionEnum::BOARD_MEMBERS, ], @@ -48,8 +41,8 @@ public function run(): void 'name' => 'Mischa Lanz', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_SERVICES => [ - 'key' => ContactSectionEnum::EMPLOYEE_SERVICES, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'zunscan.ch', 'en_CH' => 'zunscan.ch', @@ -73,6 +66,13 @@ public function run(): void 'name' => 'Dominique Ernst', 'published' => true, 'sections' => [ + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, + 'role' => [ + 'de_CH' => 'DMS/ECM Berater', + 'en_CH' => 'DMS/ECM Consultant', + ], + ], ContactSectionEnum::BOARD_MEMBERS => [ 'key' => ContactSectionEnum::BOARD_MEMBERS, ], @@ -88,44 +88,47 @@ public function run(): void Contact::updateOrCreate( ['id' => 4], [ - 'name' => 'Rhys Lees', - 'published' => false, + 'name' => 'Katja Lanz', + 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_PRODUCTS => [ - 'key' => ContactSectionEnum::EMPLOYEE_PRODUCTS, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Entwickler', - 'en_CH' => 'Developer', + 'de_CH' => 'HR', + 'en_CH' => 'HR', ], ], ], 'icons' => [ - 'email' => 'rhys.leess@paperflakes.ch', - 'linkedin' => 'https://www.linkedin.com/in/rhys-lees', + 'email' => 'katja.lanz@paperflakes.ch', + 'linkedin' => 'https://www.linkedin.com/in/katja-lanz-a92372149/', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/r_lees_e_background_removal_f_png.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/652d4179a3494dedacf6555a_Katja_Jacke.webp', ] ); Contact::updateOrCreate( ['id' => 5], [ - 'name' => 'Katja Lanz', + 'name' => 'Melanie Bürgin-Fix', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_ADMINISTRATION => [ - 'key' => ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ - 'de_CH' => 'Finanzen & HR', - 'en_CH' => 'Finance & HR', + 'de_CH' => 'Administration', + 'en_CH' => 'Administration', ], ], + ContactSectionEnum::BOARD_MEMBERS => [ + 'key' => ContactSectionEnum::BOARD_MEMBERS, + ], ], 'icons' => [ - 'email' => 'katja.lanz@paperflakes.ch', - 'linkedin' => 'https://www.linkedin.com/in/katja-lanz-a92372149/', + 'email' => 'melanie.buergin@paperflakes.ch', + 'linkedin' => 'https://www.linkedin.com/in/melanie-buergin', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/652d4179a3494dedacf6555a_Katja_Jacke.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', ] ); @@ -135,8 +138,8 @@ public function run(): void 'name' => 'DR-G2110', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEE_ADMINISTRATION => [ - 'key' => ContactSectionEnum::EMPLOYEE_ADMINISTRATION, + ContactSectionEnum::EMPLOYEES => [ + 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'Digitalisierungs-Beauftragter', 'en_CH' => 'Head of Digital Transformation', @@ -149,29 +152,29 @@ public function run(): void ); Contact::updateOrCreate( - ['id' => 7], + ['id' => 6], [ - 'name' => 'Sebastian Bürgin-Fix', + 'name' => 'PST GmbH', 'published' => true, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, 'role' => [ - 'de_CH' => 'codebar Solutions AG', - 'en_CH' => 'codebar Solutions AG', + 'de_CH' => 'Finanzen', + 'en_CH' => 'Finance', ], ], ], 'icons' => [ - 'email' => 'info@codebar.ch', - 'website' => 'https://www.codebar.ch', + 'email' => 'info@pstgmbh.ch', + 'website' => 'https://www.pstgmbh.ch', ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/paperflakes.webp', ] ); Contact::updateOrCreate( - ['id' => 8], + ['id' => 7], [ 'name' => 'Dario Wieland', 'published' => true, diff --git a/lang/de_CH.json b/lang/de_CH.json index 5cb7e7e..51fa4b1 100644 --- a/lang/de_CH.json +++ b/lang/de_CH.json @@ -14,6 +14,7 @@ "Deutsch": "Deutsch", "DocuWare Silver Partner": "DocuWare Silber Partner", "Email": "E-Mail", + "Employees": "Mitarbeitende", "EN": "EN", "English": "English", "Google Maps": "Google Maps", @@ -44,4 +45,4 @@ "Update to english language": "Auf Englisch wechseln", "Update to german language": "Auf Deutsch wechseln", "Zefix": "Zefix" -} \ No newline at end of file +} diff --git a/resources/views/app/about-us/index.blade.php b/resources/views/app/about-us/index.blade.php index c0ed588..e19355d 100644 --- a/resources/views/app/about-us/index.blade.php +++ b/resources/views/app/about-us/index.blade.php @@ -7,14 +7,13 @@ - +
- @if(!empty($contacts->employee_services) && $contacts->employee_services->count()) - + @if(!empty($contacts->employees) && $contacts->employees->count()) - @foreach($contacts->employee_services as $contact) + @foreach($contacts->employees as $contact) @endif - @if(!empty($contacts->employee_products) && $contacts->employee_products->count()) - - - @foreach($contacts->employee_products as $contact) - - @endforeach - - @endif - - @if(!empty($contacts->employee_administration) && $contacts->employee_administration->count()) - - - @foreach($contacts->employee_administration as $contact) - - @endforeach - - @endif
- @if(!empty($contacts->employee_services) && $contacts->employee_services->count()) + @if(!empty($contacts->collaborations) && $contacts->collaborations->count()) @@ -76,4 +53,4 @@ - \ No newline at end of file + diff --git a/resources/views/components/list-grid.blade.php b/resources/views/components/list-grid.blade.php index bcfb128..c5f39e7 100644 --- a/resources/views/components/list-grid.blade.php +++ b/resources/views/components/list-grid.blade.php @@ -2,4 +2,4 @@
{{ $slot }} -
\ No newline at end of file + From 7796125ea31447fb3afc59b70c1a946d7e66cd50 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Tue, 29 Jul 2025 23:58:30 +0200 Subject: [PATCH 2/9] wip --- .../Controllers/News/NewsIndexController.php | 24 +++++++ app/Models/Configuration.php | 1 + ..._23_225051_create_configurations_table.php | 1 + .../Codebar/ConfigurationsTableSeeder.php | 1 + .../seeders/Codebar/ContactsTableSeeder.php | 26 +------- .../Paperflakes/ConfigurationsTableSeeder.php | 1 + .../Paperflakes/ContactsTableSeeder.php | 6 +- .../seeders/Paperflakes/PagesTableSeeder.php | 62 +++++++++++++++---- resources/views/app/news/index.blade.php | 14 +++++ resources/views/components/section.blade.php | 4 +- .../_partials/_navigation_desktop.blade.php | 12 +++- routes/web.php | 6 ++ 12 files changed, 114 insertions(+), 44 deletions(-) create mode 100644 app/Http/Controllers/News/NewsIndexController.php create mode 100644 resources/views/app/news/index.blade.php diff --git a/app/Http/Controllers/News/NewsIndexController.php b/app/Http/Controllers/News/NewsIndexController.php new file mode 100644 index 0000000..cf464dc --- /dev/null +++ b/app/Http/Controllers/News/NewsIndexController.php @@ -0,0 +1,24 @@ +getLocale(); + + return view('app.news.index')->with([ + 'page' => (new PageAction(locale: null, routeName: 'news.index'))->default(), + 'news' => (new ViewDataAction)->news($locale), + ]); + } +} diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php index afc2906..79924c7 100644 --- a/app/Models/Configuration.php +++ b/app/Models/Configuration.php @@ -10,6 +10,7 @@ class Configuration extends Model use HasFactory; protected $casts = [ + 'section_news' => 'boolean', 'section_services' => 'boolean', 'section_products' => 'boolean', 'section_technologies' => 'boolean', diff --git a/database/migrations/2025_06_23_225051_create_configurations_table.php b/database/migrations/2025_06_23_225051_create_configurations_table.php index 567deb5..4a342b3 100644 --- a/database/migrations/2025_06_23_225051_create_configurations_table.php +++ b/database/migrations/2025_06_23_225051_create_configurations_table.php @@ -16,6 +16,7 @@ public function up(): void $table->string('company')->nullable(); + $table->boolean('section_news')->default(false); $table->boolean('section_services')->default(false); $table->boolean('section_products')->default(false); $table->boolean('section_technologies')->default(false); diff --git a/database/seeders/Codebar/ConfigurationsTableSeeder.php b/database/seeders/Codebar/ConfigurationsTableSeeder.php index 48f3fc6..08fab80 100644 --- a/database/seeders/Codebar/ConfigurationsTableSeeder.php +++ b/database/seeders/Codebar/ConfigurationsTableSeeder.php @@ -16,6 +16,7 @@ public function run(): void 'company' => 'codebar Solutions AG', + 'section_news' => false, 'section_services' => false, 'section_products' => false, 'section_technologies' => true, diff --git a/database/seeders/Codebar/ContactsTableSeeder.php b/database/seeders/Codebar/ContactsTableSeeder.php index d0f448b..7e2b4c4 100644 --- a/database/seeders/Codebar/ContactsTableSeeder.php +++ b/database/seeders/Codebar/ContactsTableSeeder.php @@ -86,7 +86,7 @@ public function run(): void ['id' => 4], [ 'name' => 'Alexander Christoph Boll', - 'published' => true, + 'published' => false, 'sections' => [ ContactSectionEnum::EMPLOYEES => [ 'key' => ContactSectionEnum::EMPLOYEES, @@ -104,33 +104,11 @@ public function run(): void ] ); - Contact::updateOrCreate( - ['id' => 5], - [ - 'name' => 'Dominique Ernst', - 'published' => false, - 'sections' => [ - ContactSectionEnum::EMPLOYEES => [ - 'key' => ContactSectionEnum::EMPLOYEES, - 'role' => [ - 'de_CH' => 'Projektleiter', - 'en_CH' => 'Project Manager', - ], - ], - ], - 'icons' => [ - 'email' => 'info@paperflakes.ch', - 'website' => 'https://www.paperflakes.ch', - ], - 'image' => 'https://res.cloudinary.com/codebar/image/upload/w_400,h_400,f_auto,q_auto/www-paperflakes-ch/people/codebar.webp', - ] - ); - Contact::updateOrCreate( ['id' => 6], [ 'name' => 'PST GmbH', - 'published' => true, + 'published' => false, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, diff --git a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php index 9c371a0..db2d28e 100644 --- a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php +++ b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php @@ -15,6 +15,7 @@ public function run(): void Configuration::updateOrCreate([], [ 'company' => 'paperflakes AG', + 'section_news' => true, 'section_services' => true, 'section_products' => true, 'section_technologies' => false, diff --git a/database/seeders/Paperflakes/ContactsTableSeeder.php b/database/seeders/Paperflakes/ContactsTableSeeder.php index ba12ac8..eefd049 100644 --- a/database/seeders/Paperflakes/ContactsTableSeeder.php +++ b/database/seeders/Paperflakes/ContactsTableSeeder.php @@ -66,13 +66,13 @@ public function run(): void 'name' => 'Dominique Ernst', 'published' => true, 'sections' => [ - ContactSectionEnum::EMPLOYEES => [ + /* ContactSectionEnum::EMPLOYEES => [ 'key' => ContactSectionEnum::EMPLOYEES, 'role' => [ 'de_CH' => 'DMS/ECM Berater', 'en_CH' => 'DMS/ECM Consultant', ], - ], + ], */ ContactSectionEnum::BOARD_MEMBERS => [ 'key' => ContactSectionEnum::BOARD_MEMBERS, ], @@ -155,7 +155,7 @@ public function run(): void ['id' => 6], [ 'name' => 'PST GmbH', - 'published' => true, + 'published' => false, 'sections' => [ ContactSectionEnum::COLLABORATIONS => [ 'key' => ContactSectionEnum::COLLABORATIONS, diff --git a/database/seeders/Paperflakes/PagesTableSeeder.php b/database/seeders/Paperflakes/PagesTableSeeder.php index 79c8334..ad28001 100644 --- a/database/seeders/Paperflakes/PagesTableSeeder.php +++ b/database/seeders/Paperflakes/PagesTableSeeder.php @@ -31,7 +31,21 @@ private function enCH() 'title' => 'Your Digital Partner', 'description' => 'We support you with smart digital solutions that move your business forward.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); + + Page::updateOrCreate( + [ + 'key' => 'news.index', + 'locale' => $locale, + ], + [ + 'robots' => 'index,follow', + 'title' => '', + 'description' => '', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', + ] + ); Page::updateOrCreate( [ @@ -43,7 +57,8 @@ private function enCH() 'title' => 'About Us – paperflakes AG', 'description' => 'Get to know paperflakes AG – your Swiss partner for digital transformation and innovative software solutions.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -55,7 +70,8 @@ private function enCH() 'title' => 'Services that Support You', 'description' => 'From strategy to implementation - we\'re here to support you all the way.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -67,7 +83,8 @@ private function enCH() 'title' => 'Tools That Empower You', 'description' => 'Our products are built to help you work smarter, faster and better.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -79,7 +96,8 @@ private function enCH() 'title' => 'Legal Notice', 'description' => 'All legal details about paperflakes AG.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -91,7 +109,8 @@ private function enCH() 'title' => 'Let\'s Talk', 'description' => 'Have a question? We\'re here to support you - just reach out.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); } private function deCH() @@ -108,7 +127,21 @@ private function deCH() 'title' => 'Dein digitaler Partner', 'description' => 'Wir unterstützen dich mit cleveren Lösungen für deinen digitalen Erfolg.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); + + Page::updateOrCreate( + [ + 'key' => 'news.index', + 'locale' => $locale, + ], + [ + 'robots' => 'index,follow', + 'title' => '', + 'description' => '', + 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', + ] + ); Page::updateOrCreate( [ @@ -120,7 +153,8 @@ private function deCH() 'title' => 'Über uns – paperflakes AG', 'description' => 'Lerne die paperflakes AG kennen – dein Schweizer Partner für digitale Transformation und innovative Softwarelösungen.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -132,7 +166,8 @@ private function deCH() 'title' => 'Dienstleistungen für dich', 'description' => 'Von der Strategie bis zur Umsetzung - wir stehen dir zur Seite.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -144,7 +179,8 @@ private function deCH() 'title' => 'Tools, die dich stärken', 'description' => 'Unsere Produkte helfen dir, effizienter, schneller und einfacher zu arbeiten.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -156,7 +192,8 @@ private function deCH() 'title' => 'Rechtliches', 'description' => 'Alle rechtlichen Informationen zur paperflakes AG.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); Page::updateOrCreate( [ @@ -169,6 +206,7 @@ private function deCH() 'title' => 'Lass uns sprechen', 'description' => 'Fragen? Wir sind fürr dich da - melde dich jederzeit bei uns.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', - ]); + ] + ); } } diff --git a/resources/views/app/news/index.blade.php b/resources/views/app/news/index.blade.php new file mode 100644 index 0000000..f793eaa --- /dev/null +++ b/resources/views/app/news/index.blade.php @@ -0,0 +1,14 @@ + + + + + @foreach($news as $entry) + + @endforeach + + + diff --git a/resources/views/components/section.blade.php b/resources/views/components/section.blade.php index 22825a9..847a6fe 100644 --- a/resources/views/components/section.blade.php +++ b/resources/views/components/section.blade.php @@ -1,5 +1,5 @@ @props(['classAttributes' => ""]) -
+
{{ $slot }} -
\ No newline at end of file +
diff --git a/resources/views/layouts/_partials/_navigation_desktop.blade.php b/resources/views/layouts/_partials/_navigation_desktop.blade.php index 78befd5..44a3988 100644 --- a/resources/views/layouts/_partials/_navigation_desktop.blade.php +++ b/resources/views/layouts/_partials/_navigation_desktop.blade.php @@ -3,11 +3,17 @@ \ No newline at end of file + diff --git a/routes/web.php b/routes/web.php index 36cc70f..849f68b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,6 +10,7 @@ use App\Http\Controllers\Legal\TermsIndexController; use App\Http\Controllers\Locale\LocaleUpdateController; use App\Http\Controllers\Media\MediaIndexController; +use App\Http\Controllers\News\NewsIndexController; use App\Http\Controllers\News\NewsShowController; use App\Http\Controllers\OpenSource\OpenSoruceShowController; use App\Http\Controllers\OpenSource\OpenSourceIndexController; @@ -28,7 +29,10 @@ Route::group(['as' => Str::slug(LocaleEnum::EN->value).'.'], function () { Route::get('en-ch', StartIndexController::class)->name('start.index'); + + Route::get('news', NewsIndexController::class)->name('news.index'); Route::get('news/{locale}/{news}', NewsShowController::class)->name('news.show'); + Route::get('about-us', AboutUsIndexController::class)->name('about-us.index'); Route::get('services', ServicesIndexController::class)->name('services.index'); @@ -54,6 +58,8 @@ Route::group(['as' => Str::slug(LocaleEnum::DE->value).'.'], function () { Route::get('de-ch', StartIndexController::class)->name('start.index'); + + Route::get('aktuelles', NewsIndexController::class)->name('news.index'); Route::get('aktuelles/{locale}/{news}', NewsShowController::class)->name('news.show'); Route::get('ueber-uns', AboutUsIndexController::class)->name('about-us.index'); From 4078e3ea084afa4725fc386ec237bd704cd0b449 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:24:09 +0200 Subject: [PATCH 3/9] wip --- app/Models/Configuration.php | 1 + ..._23_225051_create_configurations_table.php | 3 + .../Codebar/ConfigurationsTableSeeder.php | 7 ++ .../Paperflakes/ConfigurationsTableSeeder.php | 7 ++ .../seeders/Paperflakes/PagesTableSeeder.php | 8 +- database/seeders/files/codebar_intro_de.md | 5 ++ database/seeders/files/codebar_intro_en.md | 5 ++ .../seeders/files/paperflakes_intro_de.md | 5 ++ .../seeders/files/paperflakes_intro_en.md | 5 ++ lang/de_CH.json | 2 + lang/de_CH/components.php | 6 +- lang/en_CH/components.php | 6 +- resources/css/app.css | 4 +- resources/views/app/start/index.blade.php | 6 +- .../components/docuware-showme.blade.php | 81 +++++++++--------- resources/views/components/intro.blade.php | 37 ++++++++ .../layouts/_partials/_navigation.blade.php | 10 ++- .../_partials/_navigation_desktop.blade.php | 34 +++----- .../_partials/_navigation_mobile.blade.php | 85 +++++++++---------- tests/Feature/Controllers/RouteStatusTest.php | 3 + 20 files changed, 202 insertions(+), 118 deletions(-) create mode 100644 database/seeders/files/codebar_intro_de.md create mode 100644 database/seeders/files/codebar_intro_en.md create mode 100644 database/seeders/files/paperflakes_intro_de.md create mode 100644 database/seeders/files/paperflakes_intro_en.md create mode 100644 resources/views/components/intro.blade.php diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php index 79924c7..bab2bd9 100644 --- a/app/Models/Configuration.php +++ b/app/Models/Configuration.php @@ -10,6 +10,7 @@ class Configuration extends Model use HasFactory; protected $casts = [ + 'component_intro' => 'json', 'section_news' => 'boolean', 'section_services' => 'boolean', 'section_products' => 'boolean', diff --git a/database/migrations/2025_06_23_225051_create_configurations_table.php b/database/migrations/2025_06_23_225051_create_configurations_table.php index 4a342b3..982e831 100644 --- a/database/migrations/2025_06_23_225051_create_configurations_table.php +++ b/database/migrations/2025_06_23_225051_create_configurations_table.php @@ -15,6 +15,9 @@ public function up(): void $table->id(); $table->string('company')->nullable(); + $table->string('company_primary_color')->nullable(); + + $table->json('component_intro'); $table->boolean('section_news')->default(false); $table->boolean('section_services')->default(false); diff --git a/database/seeders/Codebar/ConfigurationsTableSeeder.php b/database/seeders/Codebar/ConfigurationsTableSeeder.php index 08fab80..5e16918 100644 --- a/database/seeders/Codebar/ConfigurationsTableSeeder.php +++ b/database/seeders/Codebar/ConfigurationsTableSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders\Codebar; +use App\Enums\LocaleEnum; use App\Models\Configuration; use Illuminate\Database\Seeder; @@ -15,6 +16,12 @@ public function run(): void Configuration::updateOrCreate([], [ 'company' => 'codebar Solutions AG', + 'company_primary_color' => '#500472', + + 'component_intro' => [ + LocaleEnum::DE->value => file_get_contents(database_path('seeders/files/codebar_intro_de.md')), + LocaleEnum::EN->value => file_get_contents(database_path('seeders/files/codebar_intro_en.md')), + ], 'section_news' => false, 'section_services' => false, diff --git a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php index db2d28e..93a3662 100644 --- a/database/seeders/Paperflakes/ConfigurationsTableSeeder.php +++ b/database/seeders/Paperflakes/ConfigurationsTableSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders\Paperflakes; +use App\Enums\LocaleEnum; use App\Models\Configuration; use Illuminate\Database\Seeder; @@ -14,6 +15,12 @@ public function run(): void { Configuration::updateOrCreate([], [ 'company' => 'paperflakes AG', + 'company_primary_color' => '#69b3a1', + + 'component_intro' => [ + LocaleEnum::DE->value => file_get_contents(database_path('seeders/files/paperflakes_intro_de.md')), + LocaleEnum::EN->value => file_get_contents(database_path('seeders/files/paperflakes_intro_en.md')), + ], 'section_news' => true, 'section_services' => true, diff --git a/database/seeders/Paperflakes/PagesTableSeeder.php b/database/seeders/Paperflakes/PagesTableSeeder.php index ad28001..fb4d5f3 100644 --- a/database/seeders/Paperflakes/PagesTableSeeder.php +++ b/database/seeders/Paperflakes/PagesTableSeeder.php @@ -41,8 +41,8 @@ private function enCH() ], [ 'robots' => 'index,follow', - 'title' => '', - 'description' => '', + 'title' => 'News & Insights', + 'description' => 'Stay up to date with the latest news, expert insights and trends on DMS, ECM and digital transformation from paperflakes.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', ] ); @@ -137,8 +137,8 @@ private function deCH() ], [ 'robots' => 'index,follow', - 'title' => '', - 'description' => '', + 'title' => 'Neuigkeiten & Insights', + 'description' => 'Aktuelle News, Fachbeiträge und Trends rund um DMS, ECM und digitale Transformation mit paperflakes.', 'image' => 'https://res.cloudinary.com/codebar/image/upload/c_scale,dpr_2.0,f_auto,q_auto,w_1200/www-paperflakes-ch/seo/seo_paperflakes.webp', ] ); diff --git a/database/seeders/files/codebar_intro_de.md b/database/seeders/files/codebar_intro_de.md new file mode 100644 index 0000000..649039c --- /dev/null +++ b/database/seeders/files/codebar_intro_de.md @@ -0,0 +1,5 @@ +

Wer wir sind

+

Bei paperflakes unterstützen wir dich dabei, deine Informationsflüsse zu strukturieren und Geschäftsprozesse zu digitalisieren. Wir denken unternehmerisch, beraten mit Weitblick und setzen auf bewährte sowie offene Technologien. Unser Ziel: Lösungen, die auf deine echten Bedürfnisse zugeschnitten sind – und dir im Alltag spürbaren Mehrwert bringen.

+ +

Wie wir arbeiten

+

Am Anfang hören wir dir zu. Denn nur wer Prozesse und Herausforderungen wirklich versteht, kann sinnvolle und nachhaltige Lösungen entwickeln. Gemeinsam mit dir erarbeiten wir ein durchdachtes Konzept, das fachlich und technisch überzeugt. Liegt die Umsetzung in unserem Kompetenzbereich, begleiten wir dich bis zur erfolgreichen Einführung – und darüber hinaus. Falls nicht, sorgen wir dafür, dass deine Anforderungen sauber dokumentiert sind und zuverlässig umgesetzt werden können – von uns oder deinem bevorzugten Partner.

diff --git a/database/seeders/files/codebar_intro_en.md b/database/seeders/files/codebar_intro_en.md new file mode 100644 index 0000000..4c1dc97 --- /dev/null +++ b/database/seeders/files/codebar_intro_en.md @@ -0,0 +1,5 @@ +

Who we are

+

The team at codebar knows how to bring innovative ideas to life using digital tools. We think economically, enjoy working conceptually, and rely on open technologies and standards. This allows us to develop software that's built around the needs of its users – and delivers real value to you.

+ +

How we work

+

We start by listening. Because to develop effective software, you first need to understand exactly what it's meant to do. Next, we work with you to develop a concept based on the needs of future users. If the proposed solution fits our area of expertise, we're happy to support you through implementation as well. If not, we're just as pleased when others turn our plans into reality.

diff --git a/database/seeders/files/paperflakes_intro_de.md b/database/seeders/files/paperflakes_intro_de.md new file mode 100644 index 0000000..9944506 --- /dev/null +++ b/database/seeders/files/paperflakes_intro_de.md @@ -0,0 +1,5 @@ +

Wer wir sind

+

Bei paperflakes unterstützen wir dich dabei, deine Informationsflüsse zu strukturieren und Dokumentenprozesse digital abzubilden – effizient, sicher und zukunftsorientiert. Wir beraten dich individuell, denken ganzheitlich und setzen Lösungen um, die exakt zu deinen Anforderungen passen. Unser Ziel: messbarer Mehrwert im Alltag – durch mehr Transparenz, klare Abläufe und spürbare Entlastung bei der täglichen Arbeit.

+ +

Wie wir arbeiten

+

Am Anfang nehmen wir uns Zeit, deine Abläufe, Herausforderungen und Ziele genau zu verstehen. Denn nur wer wirklich durchblickt, kann sinnvolle und nachhaltige Lösungen entwickeln. Gemeinsam mit dir erstellen wir ein Umsetzungskonzept, das auf deine konkreten Anforderungen abgestimmt ist – fachlich fundiert und praxisnah. Auf dieser Basis erhältst du ein klar strukturiertes Angebot. Wenn du dich dafür entscheidest, setzen wir die Lösung gemeinsam mit dir um – von der Planung bis zur erfolgreichen Einführung.

diff --git a/database/seeders/files/paperflakes_intro_en.md b/database/seeders/files/paperflakes_intro_en.md new file mode 100644 index 0000000..c96dc38 --- /dev/null +++ b/database/seeders/files/paperflakes_intro_en.md @@ -0,0 +1,5 @@ +

Who we are

+

At paperflakes, we help you structure your information flows and digitise document-related processes – efficiently, securely, and with a future-focused approach. We offer tailored consulting, take a holistic perspective, and implement solutions that fit your specific requirements. Our goal: measurable added value in your day-to-day operations – through greater transparency, streamlined processes, and noticeable relief in your daily workload.

+ +

How we work

+

We start by taking the time to fully understand your workflows, challenges, and goals. Because only with real insight can effective and sustainable solutions be created. Together, we develop an implementation concept that is tailored to your specific needs – technically sound and grounded in real-world practice. Based on this, you'll receive a clearly structured proposal. If you decide to proceed, we'll implement the solution together – from planning to successful rollout.

diff --git a/lang/de_CH.json b/lang/de_CH.json index 51fa4b1..b9f64b8 100644 --- a/lang/de_CH.json +++ b/lang/de_CH.json @@ -19,6 +19,7 @@ "English": "English", "Google Maps": "Google Maps", "Headquarter": "Hauptsitz", + "Home": "Start", "Imprint": "Impressum", "Info(at)paperflakes.ch": "Info(at)paperflakes.ch", "Jobs": "Stellen", @@ -44,5 +45,6 @@ "Technologies": "Technologien", "Update to english language": "Auf Englisch wechseln", "Update to german language": "Auf Deutsch wechseln", + "Welcome": "Willkommen", "Zefix": "Zefix" } diff --git a/lang/de_CH/components.php b/lang/de_CH/components.php index 1d13551..d2f8665 100644 --- a/lang/de_CH/components.php +++ b/lang/de_CH/components.php @@ -1,7 +1,11 @@ [ + 'buttons' => [ + 'more' => 'Mehr über uns', + ], + ], 'docuware' => [ 'showme' => [ 'title' => 'Erleben Sie DocuWare in Aktion', diff --git a/lang/en_CH/components.php b/lang/en_CH/components.php index 768a885..c57056f 100644 --- a/lang/en_CH/components.php +++ b/lang/en_CH/components.php @@ -1,7 +1,11 @@ [ + 'buttons' => [ + 'more' => 'More about us', + ], + ], 'docuware' => [ 'showme' => [ 'title' => 'Experience DocuWare in Action', diff --git a/resources/css/app.css b/resources/css/app.css index 8bc6b27..ef59e2a 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,6 +5,8 @@ @source '../views'; @source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@safelist mb-2 mb-4 text-lg md:text-xl font-semibold; + [x-cloak] { display: none !important; } @@ -20,4 +22,4 @@ body { font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; @apply text-gray-800; -} \ No newline at end of file +} diff --git a/resources/views/app/start/index.blade.php b/resources/views/app/start/index.blade.php index d38f301..2113691 100644 --- a/resources/views/app/start/index.blade.php +++ b/resources/views/app/start/index.blade.php @@ -1,7 +1,9 @@ - + + + @foreach($news as $entry) - \ No newline at end of file + diff --git a/resources/views/components/docuware-showme.blade.php b/resources/views/components/docuware-showme.blade.php index fea5a67..ee1536b 100644 --- a/resources/views/components/docuware-showme.blade.php +++ b/resources/views/components/docuware-showme.blade.php @@ -3,47 +3,50 @@ @php $display = Config::get('seeder.seeder.paperflakes'); - $showme_url = match (app()->getLocale()) { - LocaleEnum::EN->value => 'https://showme.docuware.com/en-gb/interactive-tours', - default => 'https://showme.docuware.com/de/interactive-tours' - }; + $showme_url = match (app()->getLocale()) { + LocaleEnum::EN->value => 'https://showme.docuware.com/en-gb/interactive-tours', + default => 'https://showme.docuware.com/de/interactive-tours', + }; - $product_url = match (app()->getLocale()) { - LocaleEnum::EN->value => 'https://www.paperflakes.ch/services/en_CH/dms-ecm-docuware', - default => 'https://www.paperflakes.ch/dienstleistungen/de_CH/dms-ecm-docuware' - }; + $product_url = match (app()->getLocale()) { + LocaleEnum::EN->value => 'https://www.paperflakes.ch/services/en_CH/dms-ecm-docuware', + default => 'https://www.paperflakes.ch/dienstleistungen/de_CH/dms-ecm-docuware', + }; @endphp -@if($display) - -
-
-
-
-@endif \ No newline at end of file + + + +@endif diff --git a/resources/views/components/intro.blade.php b/resources/views/components/intro.blade.php new file mode 100644 index 0000000..7101194 --- /dev/null +++ b/resources/views/components/intro.blade.php @@ -0,0 +1,37 @@ +@use(App\Enums\LocaleEnum;use Illuminate\Support\Facades\Config;use Illuminate\Support\Str;use App\Helpers\HelperMarkdown;use Illuminate\Support\Arr) + +@php + $locale = app()->getLocale(); + $color = $configuration?->company_primary_color; + $team_url = match ($locale) { + LocaleEnum::EN->value => route(Str::slug(LocaleEnum::EN->value) . '.about-us.index'), + default => route(Str::slug(LocaleEnum::DE->value) . '.about-us.index'), + }; + $markdownContent = Arr::get($configuration?->component_intro, $locale); + $htmlContent = $markdownContent ? app(HelperMarkdown::class)->formatMarkdown($markdownContent) : ''; + $htmlContent = preg_replace('/

/', '

', $htmlContent); + $htmlContent = preg_replace('/

/', '

', $htmlContent); +@endphp + +

+ + +
+
+
+
+
+ {!! $htmlContent !!} +
+ +
+
+
+
diff --git a/resources/views/layouts/_partials/_navigation.blade.php b/resources/views/layouts/_partials/_navigation.blade.php index 8b47451..e1ab3c8 100644 --- a/resources/views/layouts/_partials/_navigation.blade.php +++ b/resources/views/layouts/_partials/_navigation.blade.php @@ -1,4 +1,4 @@ - diff --git a/resources/views/layouts/_partials/_navigation_desktop.blade.php b/resources/views/layouts/_partials/_navigation_desktop.blade.php index 44a3988..782aecb 100644 --- a/resources/views/layouts/_partials/_navigation_desktop.blade.php +++ b/resources/views/layouts/_partials/_navigation_desktop.blade.php @@ -3,48 +3,40 @@ diff --git a/resources/views/layouts/_partials/_navigation_mobile.blade.php b/resources/views/layouts/_partials/_navigation_mobile.blade.php index d6a1a8b..8dc17ed 100644 --- a/resources/views/layouts/_partials/_navigation_mobile.blade.php +++ b/resources/views/layouts/_partials/_navigation_mobile.blade.php @@ -1,39 +1,40 @@ @php use App\Enums\LocaleEnum; @endphp -
+
+ + + {{ __('News') }} + + + @if ($configuration?->section_news) - + {{ __('News') }} + @endif - + {{ __('About us') }} - @if($configuration?->section_services) + @if ($configuration?->section_services)
- + {{ __('Services') }}
- @if(!empty($services) && $services->count()) - @foreach($services as $service) + @if (!empty($services) && $services->count()) + @foreach ($services as $service) + href="{{ $service->url ?? localized_route('services.show', ['locale' => app()->getLocale(), 'service' => $service]) }}" + title="{{ $service->name }}" + class="block text-base hover:text-black hover:font-semibold transition"> {{ $service->name }} @endforeach @@ -42,22 +43,20 @@ class="block text-base hover:text-black hover:font-semibold transition">
@endif - @if($configuration?->section_products) + @if ($configuration?->section_products)
- + {{ __('Products') }}
- @if(!empty($products) && $products->count()) - @foreach($products as $product) + @if (!empty($products) && $products->count()) + @foreach ($products as $product) + href="{{ $product->url ?? localized_route('products.show', ['locale' => app()->getLocale(), 'product' => $product]) }}" + title="{{ $product->name }}" + class="block text-base hover:text-black hover:font-semibold transition"> {{ $product->name }} @endforeach @@ -68,38 +67,34 @@ class="block text-base hover:text-black hover:font-semibold transition"> - @if(!empty($locales)) + @if (!empty($locales))
{{ __('Language') }}
- @foreach($locales as $language) + @foreach ($locales as $language)
@csrf
@@ -108,4 +103,4 @@ class="text-base hover:text-black hover:font-semibold transition cursor-pointer"
@endif -
\ No newline at end of file +
diff --git a/tests/Feature/Controllers/RouteStatusTest.php b/tests/Feature/Controllers/RouteStatusTest.php index ff95b45..f5bc2b6 100644 --- a/tests/Feature/Controllers/RouteStatusTest.php +++ b/tests/Feature/Controllers/RouteStatusTest.php @@ -1,6 +1,7 @@ value, 'start.index'], + [LocaleEnum::EN->value, 'news.index'], // [LocaleEnum::EN->value, 'news.show', ['news' => 1]], [LocaleEnum::EN->value, 'about-us.index'], [LocaleEnum::EN->value, 'services.index'], @@ -19,6 +21,7 @@ // DE-CH [LocaleEnum::DE->value, 'start.index'], + [LocaleEnum::DE->value, 'news.index'], // [LocaleEnum::DE->value, 'news.show', ['news' => 1]], [LocaleEnum::DE->value, 'services.index'], // [LocaleEnum::DE->value, 'services.show', ['service' => 1]], From bf96ca98ee5b3b5f67bc65e01971f878db17a87a Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:30:43 +0200 Subject: [PATCH 4/9] wip --- .../Controllers/Sitemap/SitemapController.php | 34 +++++---- package-lock.json | 74 +++++++++++++++++++ package.json | 3 + resources/css/app.css | 24 ++++++ resources/js/app.js | 2 +- resources/views/layouts/app.blade.php | 20 ++--- vite.config.js | 34 ++++++++- 7 files changed, 163 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/Sitemap/SitemapController.php b/app/Http/Controllers/Sitemap/SitemapController.php index f086be4..e3111c1 100644 --- a/app/Http/Controllers/Sitemap/SitemapController.php +++ b/app/Http/Controllers/Sitemap/SitemapController.php @@ -44,35 +44,43 @@ public function __invoke(): Response }); return response(content: $content) - ->header('Content-Type', 'application/xml'); + ->header('Content-Type', 'application/xml') + ->header('Cache-Control', 'public, max-age=3600'); // Cache for 1 hour } private function builder(): void { $this->addDefaultRoutesToSitemap(); + // Use chunked queries to prevent memory issues News::whereNotNull('published_at') ->with('references') - ->each(function (News $news): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->news(news: $news, withReferences: true), - ); + ->chunk(100, function ($news) { + foreach ($news as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->news(news: $item, withReferences: true), + ); + } }); Service::where('published', true) ->with('references') - ->each(function (Service $service): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->service(service: $service, withReferences: true), - ); + ->chunk(100, function ($services) { + foreach ($services as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->service(service: $item, withReferences: true), + ); + } }); Product::where('published', true) ->with('references') - ->each(function (Product $product): void { - $this->addLocalizedPageSet( - page: (new PageAction(locale: null, routeName: null))->product(product: $product, withReferences: true), - ); + ->chunk(100, function ($products) { + foreach ($products as $item) { + $this->addLocalizedPageSet( + page: (new PageAction(locale: null, routeName: null))->product(product: $item, withReferences: true), + ); + } }); } diff --git a/package-lock.json b/package-lock.json index d616955..1fc7fc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "laravel-vite-plugin": "^1.2.0", "tailwindcss": "^4.1.2", "vite": "^6.3.4" + }, + "devDependencies": { + "terser": "^5.43.1" } }, "node_modules/@alloc/quick-lru": { @@ -467,6 +470,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "devOptional": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", @@ -1023,6 +1036,18 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==" }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1127,6 +1152,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1232,6 +1263,12 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true + }, "node_modules/concurrently": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", @@ -2097,6 +2134,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2105,6 +2151,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2172,6 +2228,24 @@ "node": ">=18" } }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "devOptional": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", diff --git a/package.json b/package.json index 82a6418..08fbd4d 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "laravel-vite-plugin": "^1.2.0", "tailwindcss": "^4.1.2", "vite": "^6.3.4" + }, + "devDependencies": { + "terser": "^5.43.1" } } diff --git a/resources/css/app.css b/resources/css/app.css index ef59e2a..30ea9e6 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -11,15 +11,39 @@ display: none !important; } +/* Optimize font loading */ @font-face { font-family: 'Poppins'; font-style: normal; font-weight: 400; font-display: swap; + font-preload: true; src: url('../fonts/poppins/poppins-regular.woff2') format('woff2'); } +/* Critical CSS for above-the-fold content */ body { font-family: 'Poppins', ui-sans-serif, system-ui, sans-serif; @apply text-gray-800; + /* Optimize text rendering */ + text-rendering: optimizeSpeed; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Optimize images */ +img { + max-width: 100%; + height: auto; +} + +/* Optimize animations */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } } diff --git a/resources/js/app.js b/resources/js/app.js index 2b1e019..5cbb46f 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -15,4 +15,4 @@ Alpine.data('navigation', () => ({ }, })) -Alpine.start() \ No newline at end of file +Alpine.start() diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 7a2d3d6..c5003da 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -4,24 +4,24 @@ class="scroll-smooth" > - + + + + + + + + - - + + @include('layouts._partials._seo') @include('layouts._partials._favicons') @vite(['resources/js/app.js']) - diff --git a/vite.config.js b/vite.config.js index dfd5de2..f02842e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -5,9 +5,35 @@ import laravel from 'laravel-vite-plugin'; import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ - plugins: [laravel({ - input: ['resources/js/app.js'], refresh: [`resources/views/**/*`], - }), tailwindcss(),], server: { + plugins: [ + laravel({ + input: ['resources/js/app.js'], + refresh: [`resources/views/**/*`], + }), + tailwindcss(), + ], + server: { cors: true, }, -}); \ No newline at end of file + build: { + // Optimize build performance + target: 'esnext', + // Use default minification instead of terser + minify: 'esbuild', + rollupOptions: { + output: { + manualChunks: { + alpine: ['@alpinejs/csp'], + }, + }, + }, + // Enable source maps for debugging + sourcemap: false, + // Optimize chunk size + chunkSizeWarningLimit: 1000, + }, + // Optimize development server + optimizeDeps: { + include: ['@alpinejs/csp'], + }, +}); From 36a1becaef049112fb392f3df2cf908eae3d592e Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:43:33 +0200 Subject: [PATCH 5/9] wip --- config/database.php | 84 ++++----------------------------------------- 1 file changed, 7 insertions(+), 77 deletions(-) diff --git a/config/database.php b/config/database.php index 66b1fbd..055e024 100644 --- a/config/database.php +++ b/config/database.php @@ -39,71 +39,16 @@ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], - 'mysql' => [ - 'driver' => 'mysql', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - - 'logs' => [ - 'driver' => 'mysql', - 'url' => env('LOGS_DATABASE_URL'), - 'host' => env('LOGS_DB_HOST', '127.0.0.1'), - 'port' => env('LOGS_DB_PORT', '3306'), - 'database' => env('LOGS_DB_DATABASE', 'forge'), - 'username' => env('LOGS_DB_USERNAME', 'forge'), - 'password' => env('LOGS_DB_PASSWORD', ''), - 'unix_socket' => env('LOGS_DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('LOGS_MYSQL_ATTR_SSL_CA'), - ]) : [], - 'ssl_mode' => env('LOGS_SSL_MODE', 'required'), - ], - - 'mariadb' => [ - 'driver' => 'mariadb', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => env('DB_CHARSET', 'utf8mb4'), - 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), - 'prefix' => '', - 'prefix_indexes' => true, - 'strict' => true, - 'engine' => null, - 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), - ]) : [], - ], - 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DB_URL'), - 'host' => env('DB_HOST', '127.0.0.1'), + 'read' => [ + 'host' => env('DB_READ_HOST', env('DB_HOST')), + ], + 'write' => [ + 'host' => env('DB_WRITE_HOST', env('DB_HOST')), + ], + // 'host' => env('DB_HOST'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), @@ -115,21 +60,6 @@ 'sslmode' => 'prefer', ], - 'sqlsrv' => [ - 'driver' => 'sqlsrv', - 'url' => env('DB_URL'), - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '1433'), - 'database' => env('DB_DATABASE', 'laravel'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => env('DB_CHARSET', 'utf8'), - 'prefix' => '', - 'prefix_indexes' => true, - // 'encrypt' => env('DB_ENCRYPT', 'yes'), - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), - ], - ], /* From 8fde13a504ff2c17d6e214a85e2b6faf9e0792ad Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:44:22 +0200 Subject: [PATCH 6/9] wip --- config/database.php | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/config/database.php b/config/database.php index 055e024..0b33740 100644 --- a/config/database.php +++ b/config/database.php @@ -39,6 +39,32 @@ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ], + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'read' => [ + 'host' => env('DB_READ_HOST', env('DB_HOST')), + ], + 'write' => [ + 'host' => env('DB_WRITE_HOST', env('DB_HOST')), + ], + // 'host' => env('DB_HOST'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DB_URL'), @@ -59,7 +85,6 @@ 'search_path' => 'public', 'sslmode' => 'prefer', ], - ], /* From 514acaa825ccc5d803af6fddc2d36ec686abd8a7 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:46:58 +0200 Subject: [PATCH 7/9] wip --- phpstan-baseline.neon | 7 +++++++ phpstan.neon.dist | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 phpstan-baseline.neon diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..ffbb649 --- /dev/null +++ b/phpstan-baseline.neon @@ -0,0 +1,7 @@ +parameters: + ignoreErrors: + - + message: '#^Out of 157 possible param types, only 154 \- 98\.0 %% actually have it\. Add more param types to get over 99 %%$#' + identifier: typeCoverage.paramTypeCoverage + count: 3 + path: app/Http/Controllers/Sitemap/SitemapController.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 0947e46..2b0dcb6 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -8,4 +8,7 @@ parameters: ignoreErrors: - excludePaths: \ No newline at end of file + excludePaths: + +includes: + - phpstan-baseline.neon From 826f9cf18ed2ddce73bfb46b605c2735d8dd2b26 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:48:05 +0200 Subject: [PATCH 8/9] wip --- app/Http/Controllers/Sitemap/SitemapController.php | 10 +++++++--- phpstan-baseline.neon | 7 ------- phpstan.neon.dist | 3 --- 3 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 phpstan-baseline.neon diff --git a/app/Http/Controllers/Sitemap/SitemapController.php b/app/Http/Controllers/Sitemap/SitemapController.php index e3111c1..43074e6 100644 --- a/app/Http/Controllers/Sitemap/SitemapController.php +++ b/app/Http/Controllers/Sitemap/SitemapController.php @@ -11,6 +11,7 @@ use App\Models\Service; use App\Sitemap\SitemapBuilder; use Illuminate\Http\Response; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; class SitemapController extends Controller @@ -55,7 +56,8 @@ private function builder(): void // Use chunked queries to prevent memory issues News::whereNotNull('published_at') ->with('references') - ->chunk(100, function ($news) { + ->chunk(100, function (Collection $news): void { + /** @var News $item */ foreach ($news as $item) { $this->addLocalizedPageSet( page: (new PageAction(locale: null, routeName: null))->news(news: $item, withReferences: true), @@ -65,7 +67,8 @@ private function builder(): void Service::where('published', true) ->with('references') - ->chunk(100, function ($services) { + ->chunk(100, function (Collection $services): void { + /** @var Service $item */ foreach ($services as $item) { $this->addLocalizedPageSet( page: (new PageAction(locale: null, routeName: null))->service(service: $item, withReferences: true), @@ -75,7 +78,8 @@ private function builder(): void Product::where('published', true) ->with('references') - ->chunk(100, function ($products) { + ->chunk(100, function (Collection $products): void { + /** @var Product $item */ foreach ($products as $item) { $this->addLocalizedPageSet( page: (new PageAction(locale: null, routeName: null))->product(product: $item, withReferences: true), diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon deleted file mode 100644 index ffbb649..0000000 --- a/phpstan-baseline.neon +++ /dev/null @@ -1,7 +0,0 @@ -parameters: - ignoreErrors: - - - message: '#^Out of 157 possible param types, only 154 \- 98\.0 %% actually have it\. Add more param types to get over 99 %%$#' - identifier: typeCoverage.paramTypeCoverage - count: 3 - path: app/Http/Controllers/Sitemap/SitemapController.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 2b0dcb6..cee3423 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -9,6 +9,3 @@ parameters: ignoreErrors: excludePaths: - -includes: - - phpstan-baseline.neon From 70e5797c00bfaa44722364ab0e2d91e20d66de93 Mon Sep 17 00:00:00 2001 From: Sebastian Fix Date: Wed, 30 Jul 2025 01:51:56 +0200 Subject: [PATCH 9/9] wip --- database/seeders/files/codebar_intro_de.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/seeders/files/codebar_intro_de.md b/database/seeders/files/codebar_intro_de.md index 649039c..ce4e505 100644 --- a/database/seeders/files/codebar_intro_de.md +++ b/database/seeders/files/codebar_intro_de.md @@ -1,5 +1,5 @@

Wer wir sind

-

Bei paperflakes unterstützen wir dich dabei, deine Informationsflüsse zu strukturieren und Geschäftsprozesse zu digitalisieren. Wir denken unternehmerisch, beraten mit Weitblick und setzen auf bewährte sowie offene Technologien. Unser Ziel: Lösungen, die auf deine echten Bedürfnisse zugeschnitten sind – und dir im Alltag spürbaren Mehrwert bringen.

+

Das Team von **codebar** versteht es, innovative Ideen mit digitalen Hilfsmitteln zum Leben zu erwecken. Wir denken wirtschaftlich, arbeiten gerne konzeptionell und setzen auf offene Technologien und Standards. Das alles ermöglicht es uns, Software zu entwickeln, die sich an den Bedürfnissen der Nutzer:innen orientiert – und dir echten Mehrwert bietet.

Wie wir arbeiten

-

Am Anfang hören wir dir zu. Denn nur wer Prozesse und Herausforderungen wirklich versteht, kann sinnvolle und nachhaltige Lösungen entwickeln. Gemeinsam mit dir erarbeiten wir ein durchdachtes Konzept, das fachlich und technisch überzeugt. Liegt die Umsetzung in unserem Kompetenzbereich, begleiten wir dich bis zur erfolgreichen Einführung – und darüber hinaus. Falls nicht, sorgen wir dafür, dass deine Anforderungen sauber dokumentiert sind und zuverlässig umgesetzt werden können – von uns oder deinem bevorzugten Partner.

+

Am Anfang hören wir dir zu. Denn um effiziente Software zu entwickeln, muss man zunächst im Detail verstehen, wofür sie gedacht ist. Anschliessend erarbeiten wir gemeinsam ein Konzept, das sich an den Anforderungen der künftigen Nutzer:innen orientiert. Fällt der definierte Lösungsansatz in unseren Kompetenzbereich, unterstützen wir dich gerne auch bei der Realisierung. Andernfalls freuen wir uns, wenn andere unsere Pläne in die Tat umsetzen.