diff --git a/poweron/appdoc/.$doc_architecture_gateway.drawio.bkp b/appdoc/.$doc_architecture_gateway.drawio.bkp similarity index 100% rename from poweron/appdoc/.$doc_architecture_gateway.drawio.bkp rename to appdoc/.$doc_architecture_gateway.drawio.bkp diff --git a/poweron/appdoc/README_LangDoc.md b/appdoc/README_LangDoc.md similarity index 100% rename from poweron/appdoc/README_LangDoc.md rename to appdoc/README_LangDoc.md diff --git a/poweron/appdoc/doc_admin_encrypt_env_secret.md b/appdoc/doc_admin_encrypt_env_secret.md similarity index 100% rename from poweron/appdoc/doc_admin_encrypt_env_secret.md rename to appdoc/doc_admin_encrypt_env_secret.md diff --git a/poweron/appdoc/doc_architecture_ai_service.html b/appdoc/doc_architecture_ai_service.html similarity index 100% rename from poweron/appdoc/doc_architecture_ai_service.html rename to appdoc/doc_architecture_ai_service.html diff --git a/poweron/appdoc/doc_architecture_gateway.drawio b/appdoc/doc_architecture_gateway.drawio similarity index 100% rename from poweron/appdoc/doc_architecture_gateway.drawio rename to appdoc/doc_architecture_gateway.drawio diff --git a/poweron/appdoc/doc_architecture_gateway.pdf b/appdoc/doc_architecture_gateway.pdf similarity index 100% rename from poweron/appdoc/doc_architecture_gateway.pdf rename to appdoc/doc_architecture_gateway.pdf diff --git a/poweron/appdoc/doc_architecture_workflow.html b/appdoc/doc_architecture_workflow.html similarity index 100% rename from poweron/appdoc/doc_architecture_workflow.html rename to appdoc/doc_architecture_workflow.html diff --git a/poweron/appdoc/doc_dev_workflow.md b/appdoc/doc_dev_workflow.md similarity index 100% rename from poweron/appdoc/doc_dev_workflow.md rename to appdoc/doc_dev_workflow.md diff --git a/poweron/appdoc/doc_diagram_components.md b/appdoc/doc_diagram_components.md similarity index 100% rename from poweron/appdoc/doc_diagram_components.md rename to appdoc/doc_diagram_components.md diff --git a/poweron/appdoc/doc_gateway_architecture_overview.md b/appdoc/doc_gateway_architecture_overview.md similarity index 100% rename from poweron/appdoc/doc_gateway_architecture_overview.md rename to appdoc/doc_gateway_architecture_overview.md diff --git a/poweron/appdoc/doc_gateway_development_framework.md b/appdoc/doc_gateway_development_framework.md similarity index 100% rename from poweron/appdoc/doc_gateway_development_framework.md rename to appdoc/doc_gateway_development_framework.md diff --git a/poweron/appdoc/doc_gateway_schematics.html b/appdoc/doc_gateway_schematics.html similarity index 100% rename from poweron/appdoc/doc_gateway_schematics.html rename to appdoc/doc_gateway_schematics.html diff --git a/poweron/appdoc/doc_investor_20251014.md b/appdoc/doc_investor_20251014.md similarity index 100% rename from poweron/appdoc/doc_investor_20251014.md rename to appdoc/doc_investor_20251014.md diff --git a/poweron/appdoc/doc_security_key_management.md b/appdoc/doc_security_key_management.md similarity index 100% rename from poweron/appdoc/doc_security_key_management.md rename to appdoc/doc_security_key_management.md diff --git a/poweron/appdoc/doc_security_role_based_access.md b/appdoc/doc_security_role_based_access.md similarity index 100% rename from poweron/appdoc/doc_security_role_based_access.md rename to appdoc/doc_security_role_based_access.md diff --git a/poweron/appdoc/doc_spec_progress_logging.md b/appdoc/doc_spec_progress_logging.md similarity index 100% rename from poweron/appdoc/doc_spec_progress_logging.md rename to appdoc/doc_spec_progress_logging.md diff --git a/poweron/appdoc/doc_spec_ui.md b/appdoc/doc_spec_ui.md similarity index 100% rename from poweron/appdoc/doc_spec_ui.md rename to appdoc/doc_spec_ui.md diff --git a/poweron/appdoc/doc_statemachine_frontend.md b/appdoc/doc_statemachine_frontend.md similarity index 100% rename from poweron/appdoc/doc_statemachine_frontend.md rename to appdoc/doc_statemachine_frontend.md diff --git a/poweron/appdoc/doc_system_call_sites_callAiDocuments.md b/appdoc/doc_system_call_sites_callAiDocuments.md similarity index 100% rename from poweron/appdoc/doc_system_call_sites_callAiDocuments.md rename to appdoc/doc_system_call_sites_callAiDocuments.md diff --git a/poweron/appdoc/doc_system_function_relationship_ai.mermaid b/appdoc/doc_system_function_relationship_ai.mermaid similarity index 100% rename from poweron/appdoc/doc_system_function_relationship_ai.mermaid rename to appdoc/doc_system_function_relationship_ai.mermaid diff --git a/poweron/appdoc/doc_system_google_oauth_setup.md b/appdoc/doc_system_google_oauth_setup.md similarity index 100% rename from poweron/appdoc/doc_system_google_oauth_setup.md rename to appdoc/doc_system_google_oauth_setup.md diff --git a/poweron/appdoc/doc_system_polling_logic.md b/appdoc/doc_system_polling_logic.md similarity index 100% rename from poweron/appdoc/doc_system_polling_logic.md rename to appdoc/doc_system_polling_logic.md diff --git a/poweron/appdoc/doc_system_prompt_flow.md b/appdoc/doc_system_prompt_flow.md similarity index 100% rename from poweron/appdoc/doc_system_prompt_flow.md rename to appdoc/doc_system_prompt_flow.md diff --git a/poweron/appdoc/doc_system_statemachine_backend.md b/appdoc/doc_system_statemachine_backend.md similarity index 100% rename from poweron/appdoc/doc_system_statemachine_backend.md rename to appdoc/doc_system_statemachine_backend.md diff --git a/poweron/appdoc/doc_user_applikation.md b/appdoc/doc_user_applikation.md similarity index 100% rename from poweron/appdoc/doc_user_applikation.md rename to appdoc/doc_user_applikation.md diff --git a/poweron/appdoc/doc_user_investoren.md b/appdoc/doc_user_investoren.md similarity index 100% rename from poweron/appdoc/doc_user_investoren.md rename to appdoc/doc_user_investoren.md diff --git a/poweron/appdoc/doc_user_kunden.md b/appdoc/doc_user_kunden.md similarity index 100% rename from poweron/appdoc/doc_user_kunden.md rename to appdoc/doc_user_kunden.md diff --git a/poweron/appdoc/doc_user_partner.html b/appdoc/doc_user_partner.html similarity index 100% rename from poweron/appdoc/doc_user_partner.html rename to appdoc/doc_user_partner.html diff --git a/poweron/appdoc/doc_user_partner.pdf b/appdoc/doc_user_partner.pdf similarity index 100% rename from poweron/appdoc/doc_user_partner.pdf rename to appdoc/doc_user_partner.pdf diff --git a/poweron/appdoc/doc_user_product.md b/appdoc/doc_user_product.md similarity index 100% rename from poweron/appdoc/doc_user_product.md rename to appdoc/doc_user_product.md diff --git a/poweron/appdoc/doc_user_summary.md b/appdoc/doc_user_summary.md similarity index 100% rename from poweron/appdoc/doc_user_summary.md rename to appdoc/doc_user_summary.md diff --git a/poweron/appdoc/prompt_produce_diagrams.md b/appdoc/prompt_produce_diagrams.md similarity index 100% rename from poweron/appdoc/prompt_produce_diagrams.md rename to appdoc/prompt_produce_diagrams.md diff --git a/poweron/archiv/2025-07_WorkflowDesigner.html b/archiv/2025-07_WorkflowDesigner.html similarity index 100% rename from poweron/archiv/2025-07_WorkflowDesigner.html rename to archiv/2025-07_WorkflowDesigner.html diff --git a/poweron/archiv/2025-07_chat_process_visualization.md b/archiv/2025-07_chat_process_visualization.md similarity index 100% rename from poweron/archiv/2025-07_chat_process_visualization.md rename to archiv/2025-07_chat_process_visualization.md diff --git a/poweron/archiv/ComponentDiagram.drawio b/archiv/ComponentDiagram.drawio similarity index 100% rename from poweron/archiv/ComponentDiagram.drawio rename to archiv/ComponentDiagram.drawio diff --git a/poweron/archiv/ComponentDiagram.pdf b/archiv/ComponentDiagram.pdf similarity index 100% rename from poweron/archiv/ComponentDiagram.pdf rename to archiv/ComponentDiagram.pdf diff --git a/poweron/archiv/ERD.drawio b/archiv/ERD.drawio similarity index 100% rename from poweron/archiv/ERD.drawio rename to archiv/ERD.drawio diff --git a/poweron/archiv/ERD.pdf b/archiv/ERD.pdf similarity index 100% rename from poweron/archiv/ERD.pdf rename to archiv/ERD.pdf diff --git a/poweron/archiv/Konzept AI Calls with document content extraction.txt b/archiv/Konzept AI Calls with document content extraction.txt similarity index 100% rename from poweron/archiv/Konzept AI Calls with document content extraction.txt rename to archiv/Konzept AI Calls with document content extraction.txt diff --git a/poweron/archiv/PRISM_Präsentation.html b/archiv/PRISM_Präsentation.html similarity index 100% rename from poweron/archiv/PRISM_Präsentation.html rename to archiv/PRISM_Präsentation.html diff --git a/poweron/archiv/PowerOn_Functional_Overview.html b/archiv/PowerOn_Functional_Overview.html similarity index 100% rename from poweron/archiv/PowerOn_Functional_Overview.html rename to archiv/PowerOn_Functional_Overview.html diff --git a/poweron/archiv/PowerOn_Technical_Overview_202507.html b/archiv/PowerOn_Technical_Overview_202507.html similarity index 100% rename from poweron/archiv/PowerOn_Technical_Overview_202507.html rename to archiv/PowerOn_Technical_Overview_202507.html diff --git a/poweron/archiv/README_AzureSpeechPermissions.md b/archiv/README_AzureSpeechPermissions.md similarity index 100% rename from poweron/archiv/README_AzureSpeechPermissions.md rename to archiv/README_AzureSpeechPermissions.md diff --git a/poweron/archiv/README_AzureVoiceSetup.md b/archiv/README_AzureVoiceSetup.md similarity index 100% rename from poweron/archiv/README_AzureVoiceSetup.md rename to archiv/README_AzureVoiceSetup.md diff --git a/poweron/archiv/Strategie_Themen_Präsentation.html b/archiv/Strategie_Themen_Präsentation.html similarity index 100% rename from poweron/archiv/Strategie_Themen_Präsentation.html rename to archiv/Strategie_Themen_Präsentation.html diff --git a/poweron/archiv/User_Editable_Fields_Overview.md b/archiv/User_Editable_Fields_Overview.md similarity index 100% rename from poweron/archiv/User_Editable_Fields_Overview.md rename to archiv/User_Editable_Fields_Overview.md diff --git a/poweron/archiv/app_keymanagement.html b/archiv/app_keymanagement.html similarity index 100% rename from poweron/archiv/app_keymanagement.html rename to archiv/app_keymanagement.html diff --git a/poweron/archiv/diagramm_datenfluss.mermaid b/archiv/diagramm_datenfluss.mermaid similarity index 100% rename from poweron/archiv/diagramm_datenfluss.mermaid rename to archiv/diagramm_datenfluss.mermaid diff --git a/poweron/archiv/diagramm_datenfluss.png b/archiv/diagramm_datenfluss.png similarity index 100% rename from poweron/archiv/diagramm_datenfluss.png rename to archiv/diagramm_datenfluss.png diff --git a/poweron/archiv/diagramm_hld.mermaid b/archiv/diagramm_hld.mermaid similarity index 100% rename from poweron/archiv/diagramm_hld.mermaid rename to archiv/diagramm_hld.mermaid diff --git a/poweron/archiv/diagramm_hld.png b/archiv/diagramm_hld.png similarity index 100% rename from poweron/archiv/diagramm_hld.png rename to archiv/diagramm_hld.png diff --git a/poweron/archiv/diagramm_komponenten.mermaid b/archiv/diagramm_komponenten.mermaid similarity index 100% rename from poweron/archiv/diagramm_komponenten.mermaid rename to archiv/diagramm_komponenten.mermaid diff --git a/poweron/archiv/diagramm_komponenten.png b/archiv/diagramm_komponenten.png similarity index 100% rename from poweron/archiv/diagramm_komponenten.png rename to archiv/diagramm_komponenten.png diff --git a/poweron/archiv/doc_system.html b/archiv/doc_system.html similarity index 100% rename from poweron/archiv/doc_system.html rename to archiv/doc_system.html diff --git a/poweron/archiv/implementation_content_handling_with_dynamic_ai.md b/archiv/implementation_content_handling_with_dynamic_ai.md similarity index 100% rename from poweron/archiv/implementation_content_handling_with_dynamic_ai.md rename to archiv/implementation_content_handling_with_dynamic_ai.md diff --git a/poweron/archiv/komponenten_fortschritt_chart.html b/archiv/komponenten_fortschritt_chart.html similarity index 100% rename from poweron/archiv/komponenten_fortschritt_chart.html rename to archiv/komponenten_fortschritt_chart.html diff --git a/poweron/archiv/poweron_summary_202404.md b/archiv/poweron_summary_202404.md similarity index 100% rename from poweron/archiv/poweron_summary_202404.md rename to archiv/poweron_summary_202404.md diff --git a/poweron/archiv/poweron_user_capabilities.html b/archiv/poweron_user_capabilities.html similarity index 100% rename from poweron/archiv/poweron_user_capabilities.html rename to archiv/poweron_user_capabilities.html diff --git a/poweron/archiv/pricing.html b/archiv/pricing.html similarity index 100% rename from poweron/archiv/pricing.html rename to archiv/pricing.html diff --git a/poweron/archiv/release_status_chart.html b/archiv/release_status_chart.html similarity index 100% rename from poweron/archiv/release_status_chart.html rename to archiv/release_status_chart.html diff --git a/poweron/archiv/release_status_report.md b/archiv/release_status_report.md similarity index 100% rename from poweron/archiv/release_status_report.md rename to archiv/release_status_report.md diff --git a/poweron/archiv/spec.md b/archiv/spec.md similarity index 100% rename from poweron/archiv/spec.md rename to archiv/spec.md diff --git a/poweron/archiv/status.html b/archiv/status.html similarity index 100% rename from poweron/archiv/status.html rename to archiv/status.html diff --git a/poweron/deployment/Instanzenübersicht.drawio b/deployment/Instanzenübersicht.drawio similarity index 100% rename from poweron/deployment/Instanzenübersicht.drawio rename to deployment/Instanzenübersicht.drawio diff --git a/poweron/deployment/Instanzenübersicht.svg b/deployment/Instanzenübersicht.svg similarity index 100% rename from poweron/deployment/Instanzenübersicht.svg rename to deployment/Instanzenübersicht.svg diff --git a/poweron/deployment/README.md b/deployment/README.txt similarity index 84% rename from poweron/deployment/README.md rename to deployment/README.txt index 763c651..3180905 100644 --- a/poweron/deployment/README.md +++ b/deployment/README.txt @@ -1,2 +1,3 @@ Dieses Verzeichnis ist für die verschiedenen Instanzenübersichten. Zum Bearbeiten .drawio-Datei herunterladen und auch https://draw.io bearbeiten. Dann als .svg-Datei exportieren mit dem Namen "Instanzenübersicht_YYYYMMTT.svg", wobei das aktuelle Datum im Titel benutzt werden soll. So hat man eine Sammlung der verschiedenen Versionen. -Wo sehe ich, welche Instanz welche Version hat? \ No newline at end of file +Wo sehe ich, welche Instanz welche Version hat? +Noch zu klären. \ No newline at end of file diff --git a/deployment/poweron_sec.kdbx b/deployment/poweron_sec.kdbx new file mode 100644 index 0000000..bfc44dc Binary files /dev/null and b/deployment/poweron_sec.kdbx differ diff --git a/poweron/README-react-mode.md b/implementation/README-react-mode.md similarity index 100% rename from poweron/README-react-mode.md rename to implementation/README-react-mode.md diff --git a/poweron/implementation/implementation_action_validation_generic.md b/implementation/implementation_action_validation_generic.md similarity index 100% rename from poweron/implementation/implementation_action_validation_generic.md rename to implementation/implementation_action_validation_generic.md diff --git a/poweron/implementation/implementation_adaptive_react_mode.md b/implementation/implementation_adaptive_react_mode.md similarity index 100% rename from poweron/implementation/implementation_adaptive_react_mode.md rename to implementation/implementation_adaptive_react_mode.md diff --git a/poweron/implementation/implementation_adaptive_react_mode_technical.md b/implementation/implementation_adaptive_react_mode_technical.md similarity index 100% rename from poweron/implementation/implementation_adaptive_react_mode_technical.md rename to implementation/implementation_adaptive_react_mode_technical.md diff --git a/poweron/implementation/implementation_ai_processing_flows.md b/implementation/implementation_ai_processing_flows.md similarity index 100% rename from poweron/implementation/implementation_ai_processing_flows.md rename to implementation/implementation_ai_processing_flows.md diff --git a/poweron/implementation/implementation_centralized_ai_calls.md b/implementation/implementation_centralized_ai_calls.md similarity index 100% rename from poweron/implementation/implementation_centralized_ai_calls.md rename to implementation/implementation_centralized_ai_calls.md diff --git a/poweron/implementation/implementation_chat_validation_workflow_task_action.md b/implementation/implementation_chat_validation_workflow_task_action.md similarity index 100% rename from poweron/implementation/implementation_chat_validation_workflow_task_action.md rename to implementation/implementation_chat_validation_workflow_task_action.md diff --git a/poweron/implementation/implementation_content_handling_with_dynamic_ai_v2.md b/implementation/implementation_content_handling_with_dynamic_ai_v2.md similarity index 100% rename from poweron/implementation/implementation_content_handling_with_dynamic_ai_v2.md rename to implementation/implementation_content_handling_with_dynamic_ai_v2.md diff --git a/poweron/implementation/implementation_core_ai_engine.md b/implementation/implementation_core_ai_engine.md similarity index 100% rename from poweron/implementation/implementation_core_ai_engine.md rename to implementation/implementation_core_ai_engine.md diff --git a/poweron/implementation/implementation_document_generation_one-path.md b/implementation/implementation_document_generation_one-path.md similarity index 100% rename from poweron/implementation/implementation_document_generation_one-path.md rename to implementation/implementation_document_generation_one-path.md diff --git a/poweron/implementation/implementation_dynamic_generic_ai_calls.md b/implementation/implementation_dynamic_generic_ai_calls.md similarity index 100% rename from poweron/implementation/implementation_dynamic_generic_ai_calls.md rename to implementation/implementation_dynamic_generic_ai_calls.md diff --git a/poweron/implementation/implementation_extraction.md b/implementation/implementation_extraction.md similarity index 100% rename from poweron/implementation/implementation_extraction.md rename to implementation/implementation_extraction.md diff --git a/poweron/implementation/implementation_key_management.md b/implementation/implementation_key_management.md similarity index 100% rename from poweron/implementation/implementation_key_management.md rename to implementation/implementation_key_management.md diff --git a/poweron/implementation/implementation_multifile_output_refactoring.md b/implementation/implementation_multifile_output_refactoring.md similarity index 100% rename from poweron/implementation/implementation_multifile_output_refactoring.md rename to implementation/implementation_multifile_output_refactoring.md diff --git a/poweron/implementation/implementation_normalization_service.md b/implementation/implementation_normalization_service.md similarity index 100% rename from poweron/implementation/implementation_normalization_service.md rename to implementation/implementation_normalization_service.md diff --git a/poweron/implementation/implementation_react_two_stage_prompting_spec.md b/implementation/implementation_react_two_stage_prompting_spec.md similarity index 100% rename from poweron/implementation/implementation_react_two_stage_prompting_spec.md rename to implementation/implementation_react_two_stage_prompting_spec.md diff --git a/poweron/implementation/implementation_refactor_db-consistency.md b/implementation/implementation_refactor_db-consistency.md similarity index 100% rename from poweron/implementation/implementation_refactor_db-consistency.md rename to implementation/implementation_refactor_db-consistency.md diff --git a/poweron/implementation/implementation_refactor_stats-unified.md b/implementation/implementation_refactor_stats-unified.md similarity index 100% rename from poweron/implementation/implementation_refactor_stats-unified.md rename to implementation/implementation_refactor_stats-unified.md diff --git a/poweron/implementation/implementation_ui_table_pagination.md b/implementation/implementation_ui_table_pagination.md similarity index 100% rename from poweron/implementation/implementation_ui_table_pagination.md rename to implementation/implementation_ui_table_pagination.md diff --git a/poweron/implementation/implementation_user_prompt_analysis.md b/implementation/implementation_user_prompt_analysis.md similarity index 100% rename from poweron/implementation/implementation_user_prompt_analysis.md rename to implementation/implementation_user_prompt_analysis.md diff --git a/poweron/implementation/implementation_workflow_automation_architecture.md b/implementation/implementation_workflow_automation_architecture.md similarity index 100% rename from poweron/implementation/implementation_workflow_automation_architecture.md rename to implementation/implementation_workflow_automation_architecture.md diff --git a/poweron/implementation/implementation_workflow_processing_refactoring.md b/implementation/implementation_workflow_processing_refactoring.md similarity index 100% rename from poweron/implementation/implementation_workflow_processing_refactoring.md rename to implementation/implementation_workflow_processing_refactoring.md diff --git a/poweron/implementation/security-migration-guide.md b/implementation/security-migration-guide.md similarity index 100% rename from poweron/implementation/security-migration-guide.md rename to implementation/security-migration-guide.md diff --git a/poweron/implementation/security_check.html b/implementation/security_check.html similarity index 100% rename from poweron/implementation/security_check.html rename to implementation/security_check.html diff --git a/poweron/spec-workflow-architecture.md b/implementation/spec-workflow-architecture.md similarity index 100% rename from poweron/spec-workflow-architecture.md rename to implementation/spec-workflow-architecture.md diff --git a/poweron/spec-workflow-implementation.md b/implementation/spec-workflow-implementation.md similarity index 100% rename from poweron/spec-workflow-implementation.md rename to implementation/spec-workflow-implementation.md diff --git a/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.docx b/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.docx deleted file mode 100644 index 0937cb6..0000000 Binary files a/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.docx and /dev/null differ diff --git a/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.pdf b/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.pdf deleted file mode 100644 index 18f51c2..0000000 Binary files a/mandates/althaus/W Althaus AG - Chatbot MVP Schritt 2 - 20251010.pdf and /dev/null differ diff --git a/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.docx b/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.docx deleted file mode 100644 index cf6164a..0000000 Binary files a/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.docx and /dev/null differ diff --git a/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.pdf b/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.pdf deleted file mode 100644 index 4e5bcca..0000000 Binary files a/mandates/althaus/W Althaus AG - Spezifikation Use Cases - 20251010.pdf and /dev/null differ diff --git a/mandates/bwt/BWT AI Support System - MVP Demo Dokumentation _ PowerON.pdf b/mandates/bwt/BWT AI Support System - MVP Demo Dokumentation _ PowerON.pdf deleted file mode 100644 index 8520474..0000000 Binary files a/mandates/bwt/BWT AI Support System - MVP Demo Dokumentation _ PowerON.pdf and /dev/null differ diff --git a/mandates/bwt/script-poweron.html b/mandates/bwt/script-poweron.html deleted file mode 100644 index 7ce9cda..0000000 --- a/mandates/bwt/script-poweron.html +++ /dev/null @@ -1,1230 +0,0 @@ - - - - - - - BWT AI Support System - MVP Demo Dokumentation | PowerON - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - -
-
-

BWT AI Support System - MVP Demo Dokumentation

-

Inhaltsverzeichnis

-
    -
  1. Unternehmensinformationen BWT
  2. -
  3. MVP Spezifikation
  4. -
  5. Drehbuch für Live-Demo
  6. -
  7. Technische Requirements
  8. -
  9. Implementierungsplan
  10. -
-
-

1. Unternehmensinformationen BWT

-

1.1 Was macht BWT?

-BWT (Best Water Technology) ist Europas führendes Wastertechnologie-Unternehmen, das sich auf die Aufbereitung und Optimierung von Wasser für alle Lebensbereiche spezialisiert hat. Das Unternehmen entwickelt moderne, ökonomische und ökologische Aufbereitungssysteme und Services für Trinkwasser, Prozesswasser, Poolwasser und WFI (Water for Injection). -

1.2 Kerngeschäft

- -

1.3 Hauptkunden

- -

1.4 Eigentümerschaft

- -

1.5 Tätigkeitsgebiete

- -

1.6 BWT Schweiz Kontaktdaten

-BWT AQUA AG - -
-

2. MVP Spezifikation für AI Support Demo

-

2.1 System-Architektur Übersicht

-
┌─────────────────────────────────────────────────────────────────┐
-│                        AI SUPPORT SYSTEM                         │
-├─────────────────────────────────────────────────────────────────┤
-│                                                                  │
-│  ┌──────────────┐     ┌──────────────┐     ┌──────────────┐   │
-│  │   Telefon    │────▶│  AI Voice    │────▶│   Backend    │   │
-│  │   Interface  │     │   Assistant  │     │   Services   │   │
-│  └──────────────┘     └──────────────┘     └──────────────┘   │
-│                               │                     │           │
-│                               ▼                     ▼           │
-│                       ┌──────────────┐     ┌──────────────┐   │
-│                       │   Triage &   │     │   Database   │   │
-│                       │   Routing    │     │   (CRM)      │   │
-│                       └──────────────┘     └──────────────┘   │
-│                                                     │           │
-│                       ┌──────────────┐             ▼           │
-│                       │  Agent UI    │◀────────────┤           │
-│                       │  Dashboard   │                         │
-│                       └──────────────┘                         │
-│                               │                                 │
-│                               ▼                                 │
-│                       ┌──────────────┐                         │
-│                       │    Email     │                         │
-│                       │   Service    │                         │
-│                       └──────────────┘                         │
-└─────────────────────────────────────────────────────────────────┘
-

2.2 Komponenten-Spezifikation

-

#### A. Voice AI Assistant -Technologie-Stack: -

-Sprachunterstützung: - -Kernfunktionen: - -

#### B. Triage-System

-Hauptkategorien: -1. Technische Störung (40% der Anfragen) - -2. Frage zum Vertrag (30% der Anfragen) - -3. Frage zur Rechnung (20% der Anfragen) - -4. Neukundenanfragen (10% der Anfragen) - -

#### C. Backend Services

-CRM Integration: - -Email Service: - -Knowledge Base API: - -Routing Engine: - -

#### D. Agent Dashboard (UI)

-Hauptfunktionen: - -Dashboard-Komponenten: -
┌─────────────────────────────────────────────────────┐
-│  BWT Service Dashboard - Agent: M. Schneider        │
-├──────────────┬──────────────────────────────────────┤
-│              │  Ticket #2024-3847                   │
-│  Neue        │  ⚠️ Priorität: Hoch                  │
-│  Tickets     │                                      │
-│  ────────    │  Kunde: Maria Müller                 │
-│  🔴 3        │  Vertrag: CH-2024-1234              │
-│  🟡 5        │  Produkt: AQA perla 4.0             │
-│  🟢 12       │                                      │
-│              │  Problem: Salzstand-Warnung          │
-│  Statistik   │                                      │
-│  ────────    │  AI-Vorschlag:                      │
-│  Heute: 45   │  • Schwimmerschalter prüfen (78%)   │
-│  Gelöst: 38  │  • Reset durchführen                │
-│  Quote: 84%  │  • Vor-Ort-Termin wenn nötig       │
-│              │                                      │
-└──────────────┴──────────────────────────────────────┘
-

#### E. Datenbank-Schema

-
-- Kundendatenbank
-CREATE TABLE customers (
-    id INTEGER PRIMARY KEY,
-    customer_number VARCHAR(20) UNIQUE,
-    name VARCHAR(100),
-    email VARCHAR(100),
-    phone VARCHAR(20),
-    language VARCHAR(2),
-    address TEXT,
-    created_at TIMESTAMP,
-    updated_at TIMESTAMP
-);
-

-- Verträge und Produkte -CREATE TABLE contracts ( - id INTEGER PRIMARY KEY, - customer_id INTEGER, - contract_number VARCHAR(20) UNIQUE, - product_id INTEGER, - service_level VARCHAR(50), - start_date DATE, - end_date DATE, - status VARCHAR(20), - FOREIGN KEY (customer_id) REFERENCES customers(id) -);

-

-- Tickets -CREATE TABLE tickets ( - id INTEGER PRIMARY KEY, - ticket_number VARCHAR(20) UNIQUE, - customer_id INTEGER, - contract_id INTEGER, - category VARCHAR(50), - subcategory VARCHAR(50), - priority VARCHAR(20), - status VARCHAR(20), - description TEXT, - ai_summary TEXT, - assigned_to INTEGER, - created_at TIMESTAMP, - resolved_at TIMESTAMP, - FOREIGN KEY (customer_id) REFERENCES customers(id) -);

-

-- AI Interaktionen -CREATE TABLE ai_interactions ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - call_recording_url VARCHAR(255), - transcript TEXT, - summary TEXT, - detected_intent VARCHAR(100), - confidence_score DECIMAL(3,2), - suggested_solutions TEXT, - duration_seconds INTEGER, - created_at TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -);

-

-- Knowledge Base -CREATE TABLE knowledge_base ( - id INTEGER PRIMARY KEY, - category VARCHAR(50), - problem_description TEXT, - solution TEXT, - product_models TEXT, - success_rate DECIMAL(3,2), - keywords TEXT, - last_updated TIMESTAMP -);

-

-- Email Kommunikation -CREATE TABLE email_threads ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - subject VARCHAR(255), - from_address VARCHAR(100), - to_address VARCHAR(100), - body TEXT, - direction VARCHAR(10), - timestamp TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -);

-

2.3 Demo-Daten Setup

-

#### Testkundendaten

-1. Privatkunde Enthärtung -
{
-  "name": "Maria Müller",
-  "vertragsnummer": "CH-2024-1234",
-  "email": "m.mueller@beispiel.ch",
-  "telefon": "+41 61 555 12 34",
-  "produkt": "AQA perla 4.0",
-  "installationsdatum": "2021-03-15",
-  "service_level": "AQA confiance Plus",
-  "letzte_wartung": "2024-05-20",
-  "typisches_problem": "Salzstand-Warnung trotz Befüllung"
-}
-2. Geschäftskunde Restaurant -
{
-  "name": "Restaurant Seeblick AG",
-  "vertragsnummer": "CH-2023-5678",
-  "email": "info@seeblick-restaurant.ch",
-  "telefon": "+41 61 555 56 78",
-  "produkt": "AQA total Energy 2500",
-  "installationsdatum": "2023-01-10",
-  "service_level": "Business Premium",
-  "monatliche_kosten": "CHF 450",
-  "typisches_problem": "Frage zu Service-Rechnung"
-}
-3. Neukunde Installation -
{
-  "name": "Thomas Weber",
-  "email": "t.weber@mail.ch",
-  "telefon": "+41 79 555 90 12",
-  "interesse": "Neue Enthärtungsanlage",
-  "gebäudetyp": "Einfamilienhaus",
-  "personen": "4",
-  "wasserhärte": "32 °fH",
-  "budget": "CHF 3000-5000"
-}
-

#### Knowledge Base Einträge (Top 10)

-
    -
  1. Salzstand-Warnung
  2. -
- -
    -
  1. Kein weiches Wasser
  2. -
- -
    -
  1. Erhöhter Salzverbrauch
  2. -
- -
    -
  1. Display-Fehler E02
  2. -
- -
    -
  1. Wasserdruck niedrig
  2. -
- -
    -
  1. Regeneration startet nicht
  2. -
- -
    -
  1. Geräusche beim Betrieb
  2. -
- -
    -
  1. Salztabletten lösen sich nicht
  2. -
- -
    -
  1. Überlauf Salzbehälter
  2. -
- -
    -
  1. App-Verbindung verloren
  2. -
- -
-

3. Drehbuch für Live-Demo

-

DEMO-ABLAUF (Gesamtdauer: 20 Minuten)

-

#### SZENE 1: Einführung und Business Case (3 Min)

-SETTING: Konferenzraum BWT Hauptsitz Aesch, Grossbildschirm mit Präsentation -SPRECHER: Projektleiter Digital Innovation -SCRIPT: -

"Guten Tag, geschätzte Mitglieder der Geschäftsleitung.

-

Heute präsentieren wir Ihnen die Zukunft des BWT Kundenservice - ein AI-gestütztes Support-System, das unsere Service-Qualität revolutioniert und gleichzeitig die Effizienz massiv steigert.

-Unsere aktuelle Herausforderung: - -Unsere Lösung bietet: - -

Lassen Sie mich Ihnen dies live demonstrieren..."

-

[ÜBERGANG: Screen-Switch zu Live-System]

-

#### SZENE 2: Kundenanruf - Technische Störung (6 Min)

-[LIVE-DEMO STARTET] -TELEFON KLINGELT - Nummer wird angezeigt: +41 61 555 12 34 -AI-ASSISTENT (Stimme: Anna, freundlich, Schweizer Akzent): -"Grüezi und herzlich willkommen bei BWT AQUA, Ihrem Partner für beste Wasserqualität. Mein Name ist Anna, Ihre digitale Assistentin. Wie kann ich Ihnen heute helfen?" -KUNDE (Testanrufer aus anderem Raum): -"Grüezi, ich bin die Frau Müller. Ich habe ein Problem mit meiner Enthärtungsanlage. Die zeigt dauernd einen Fehler an mit dem Salzstand." -AI-ASSISTENT: -"Guten Tag Frau Müller, das tut mir leid zu hören. Ich helfe Ihnen sehr gerne weiter. Ich sehe hier bereits Ihre Kundendaten - Sie haben eine AQA perla 4.0 mit der Vertragsnummer CH-2024-1234, ist das korrekt?" -KUNDE: -"Ja genau, die ist es." -AI-ASSISTENT: -"Perfekt. Sie erwähnen eine Salzstand-Warnung. Können Sie mir sagen, wann Sie zuletzt Salz nachgefüllt haben?" -KUNDE: -"Letzte Woche erst! Ich habe zwei Säcke reingeleert, wie immer." -AI-ASSISTENT: -"Verstehe. Das ist tatsächlich ungewöhnlich. Basierend auf ähnlichen Fällen könnte es sich um ein Problem mit dem Schwimmerschalter handeln. Ich habe folgende Sofortmassnahme für Sie: -
    -
  1. Trennen Sie das Gerät für 30 Sekunden vom Strom - der Stecker ist seitlich am Gerät
  2. -
  3. Öffnen Sie einmal den Salzdeckel und prüfen Sie visuell den Füllstand
  4. -
  5. Schliessen Sie den Deckel wieder fest
  6. -
  7. Stecken Sie das Gerät wieder ein
  8. -
-

Das löst in 85% der Fälle das Problem. Parallel dazu erstelle ich aber sicherheitshalber ein Service-Ticket für Sie. Unser Techniker Herr Schneider aus Ihrer Region wird sich innerhalb der nächsten 30 Minuten bei Ihnen melden.

-

Sie erhalten ausserdem sofort eine E-Mail mit: -

-

Soll ich das so für Sie einrichten?"

-KUNDE: -"Ja, das wäre super. Die E-Mail-Adresse ist noch die gleiche?" -AI-ASSISTENT: -"Ich habe hier m.mueller@beispiel.ch - stimmt das?" -KUNDE: -"Genau." -AI-ASSISTENT: -"Wunderbar, die E-Mail ist bereits unterwegs. Gibt es sonst noch etwas, wobei ich Ihnen helfen kann?" -KUNDE: -"Nein, das war sehr hilfreich. Merci vielmal!" -AI-ASSISTENT: -"Sehr gerne, Frau Müller. Ich wünsche Ihnen einen schönen Tag und viel Erfolg mit der Lösung. Falls es nicht funktioniert, ist Herr Schneider ja gleich für Sie da. Auf Wiederhören!" -[ANRUF ENDET] -MODERATOR: -"Sie haben gesehen: 2 Minuten 45 Sekunden Gesprächszeit, Problem erfasst, Lösung angeboten, Ticket erstellt, Follow-up eingeleitet." -

#### SZENE 3: Agent Dashboard in Echtzeit (4 Min)

-[BILDSCHIRM WECHSELT ZUM AGENT DASHBOARD] -MODERATOR: -"Schauen wir nun, was parallel bei unserem Service-Mitarbeiter Herr Schneider passiert ist." -[DASHBOARD ZEIGT] -
╔════════════════════════════════════════════════════════════╗
-║  🔔 NEUES TICKET - HOHE PRIORITÄT                         ║
-╠════════════════════════════════════════════════════════════╣
-║  Ticket #CH-2024-3847                                     ║
-║  Kunde: Maria Müller (Loyal Customer - 3 Jahre)           ║
-║  Problem: Salzstand-Warnung bei AQA perla 4.0            ║
-║                                                            ║
-║  📊 AI-ANALYSE:                                           ║
-║  • Wahrscheinlichkeit Schwimmerschalter: 78%             ║
-║  • Wahrscheinlichkeit Elektronik-Reset: 15%              ║
-║  • Wahrscheinlichkeit Salzqualität: 7%                   ║
-║                                                            ║
-║  🛠️ EMPFOHLENE MASSNAHMEN:                               ║
-║  1. ✅ Reset-Anleitung bereits per Mail gesendet         ║
-║  2. 📞 Telefonischer Follow-up in 30 Min                 ║
-║  3. 🚗 Vor-Ort-Termin wenn Reset nicht hilft            ║
-║                                                            ║
-║  📦 VERFÜGBARE ERSATZTEILE:                              ║
-║  • Schwimmerschalter: 3x Lager Aesch                     ║
-║  • Lieferzeit zum Kunden: Same-Day möglich               ║
-║                                                            ║
-║  📝 KUNDENHISTORIE:                                      ║
-║  • Letzter Service: 20.05.2024 (Regulär)                 ║
-║  • Keine Reklamationen in 3 Jahren                       ║
-║  • Service-Level: AQA confiance Plus                     ║
-║                                                            ║
-║  [KUNDE ANRUFEN] [TERMIN PLANEN] [TICKET SCHLIESSEN]     ║
-╚════════════════════════════════════════════════════════════╝
-MODERATOR erklärt: -"Das System hat automatisch: - -

Herr Schneider kann nun mit einem Klick den Kunden anrufen und hat alle Informationen zur Hand."

-

#### SZENE 4: E-Mail-Interaktion und Lösung (3 Min)

-[E-MAIL WIRD AUF SCREEN GEZEIGT] -
Von: BWT AQUA Service <service@bwt-aqua.ch>
-An: m.mueller@beispiel.ch
-Betreff: ✓ Ihre Serviceanfrage #CH-2024-3847 - Salzstand-Warnung
-

Guten Tag Frau Müller,

-

vielen Dank für Ihren Anruf. Hier Ihre Serviceanfrage im Überblick:

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -📋 IHRE ANFRAGE -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Gerät: AQA perla 4.0 (SN: AP-2021-7823) -Problem: Salzstand-Warnung trotz Befüllung -Erfasst: 24.09.2025, 14:30 Uhr -Status: In Bearbeitung

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -🔧 SOFORT-LÖSUNG (85% Erfolgsquote) -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -

    -
  1. Gerät vom Strom trennen (30 Sekunden)
  2. -
  3. Salzdeckel öffnen und Füllstand prüfen
  4. -
  5. Deckel fest verschliessen
  6. -
  7. Gerät wieder anschliessen
  8. -
  9. 2 Minuten warten bis Display aktiv
  10. -

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -👨‍🔧 IHR TECHNIKER -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Marc Schneider -Region: Basel-Land -Direkt: 061 755 88 45 -Mobil: 079 555 88 45 -Rückruf: Heute, 15:00 Uhr

-

Mit freundlichen Grüssen -Ihr BWT AQUA Service-Team

-

P.S. Antworten Sie einfach auf diese E-Mail, -falls Sie weitere Fragen haben.

-[PING - NEUE E-MAIL ERSCHEINT] -KUNDE ANTWORTET (15:45 Uhr): -"Hallo, ich habe den Reset gemacht und es funktioniert wieder! Die Meldung ist weg. Vielen Dank für die schnelle Hilfe! LG Maria Müller" -[SYSTEM REAGIERT AUTOMATISCH] - -

#### SZENE 5: Business Impact Dashboard (2 Min)

-[WECHSEL ZU MANAGEMENT DASHBOARD] -LIVE METRIKEN WÄHREND DER DEMO: -
╔═══════════════════════════════════════════════════════════════╗
-║                    DEMO PERFORMANCE METRICS                    ║
-╠═══════════════════════════════════════════════════════════════╣
-║                                                                ║
-║  EFFIZIENZ-GEWINNE HEUTE                                      ║
-║  ├─ Anrufe bearbeitet: 127 (AI) vs 76 (Traditional)          ║
-║  ├─ ⌀ Bearbeitungszeit: 2:45 Min vs 8:30 Min (-68%)         ║
-║  ├─ Erstlösungsquote: 82% vs 45% (+37%)                      ║
-║  └─ Kundenzufriedenheit: 4.8/5.0 vs 4.2/5.0                 ║
-║                                                                ║
-║  KOSTEN-EINSPARUNG (Hochrechnung Monat)                       ║
-║  ├─ Reduktion Anrufminuten: 2'850 Min = CHF 8'550            ║
-║  ├─ Vermiedene Vor-Ort-Einsätze: 45 = CHF 8'100             ║
-║  ├─ Reduktion Wiederanrufe: 130 = CHF 3'900                  ║
-║  └─ TOTAL: CHF 20'550 / Monat                                ║
-║                                                                ║
-║  ROI-BERECHNUNG                                               ║
-║  ├─ Investition: CHF 180'000                                 ║
-║  ├─ Monatliche Einsparung: CHF 20'550                        ║
-║  ├─ Break-Even: 8.8 Monate                                   ║
-║  └─ 3-Jahres-ROI: 343%                                       ║
-║                                                                ║
-╚═══════════════════════════════════════════════════════════════╝
-

#### SZENE 6: Weitere Use Cases (2 Min)

-MODERATOR: -"Das war ein technisches Problem. Lassen Sie mich kurz zwei weitere Szenarien zeigen:" -[QUICK DEMO 1: RECHNUNGSFRAGE] - -[QUICK DEMO 2: NEUKUNDENANFRAGE] - -

#### SZENE 7: Q&A und Next Steps (3 Min)

-MODERATOR: -

"Zusammengefasst bietet unser AI Support System:

-SOFORTIGE VORTEILE: -✓ 24/7 Verfügbarkeit in 4 Sprachen -✓ Keine Wartezeiten mehr -✓ Konsistente Service-Qualität -✓ Automatische Dokumentation -✓ Proaktive Problemlösung -STRATEGISCHE VORTEILE: -✓ Skalierbarkeit für Wachstum -✓ Wertvolle Dateneinblicke -✓ Mitarbeiter-Entlastung für komplexe Fälle -✓ Wettbewerbsvorteil im Markt -✓ Kundenbindung durch Excellence -NÄCHSTE SCHRITTE: -Phase 1: Pilot (Woche 1-2) - -Phase 2: Beta (Woche 3-6) - -Phase 3: Rollout (ab Woche 7) - -INVESTITION: - -

Haben Sie Fragen?"

-[RAUM FÜR FRAGEN DER GL] -
-

4. Technische Requirements für Demo

-

4.1 Minimal Viable Product (MVP) - Technologie Stack

-

#### Frontend Komponenten -

// React-basiertes Agent Dashboard
-
    -
  • React 18.x mit TypeScript
  • -
  • Material-UI für Komponenten
  • -
  • WebSocket für Real-time Updates
  • -
  • Chart.js für Analytics
  • -
  • React Router für Navigation
  • -

-

// Beispiel-Komponente -interface TicketProps { - id: string; - customer: Customer; - priority: 'high' | 'medium' | 'low'; - aiSuggestions: AISuggestion[]; -}

-

const TicketView: React.FC<TicketProps> = ({ - id, - customer, - priority, - aiSuggestions -}) => { - // Implementation -};

-

#### Backend Services -

# Python FastAPI Backend
-from fastapi import FastAPI, WebSocket
-from typing import Optional
-import asyncio

-

app = FastAPI()

-

Beispiel-Endpunkte

-@app.post("/api/calls/incoming") -async def handle_incoming_call(call_data: CallData): - # Twilio Webhook Handler - ai_response = await process_with_ai(call_data) - return create_ticket(ai_response) -

@app.websocket("/ws/dashboard/{agent_id}") -async def dashboard_websocket( - websocket: WebSocket, - agent_id: str -): - # Real-time Dashboard Updates - await websocket.accept() - while True: - ticket = await get_new_ticket() - await websocket.send_json(ticket)

-

#### AI & Voice Integration -

# Konfiguration
-voice_services:
-  twilio:
-    account_sid: ${TWILIO_ACCOUNT_SID}
-    auth_token: ${TWILIO_AUTH_TOKEN}
-    phone_numbers:
-
    -
  • "+41 61 755 88 99"
  • -

-

speech_to_text: - provider: google_cloud - language_codes: -

    -
  • de-CH
  • -
  • fr-CH
  • -
  • it-CH
  • -
  • en-US
  • -

-

text_to_speech: - provider: amazon_polly - voice_id: Marlene # Deutsch - neural_voice: true

-

nlp: - provider: openai - model: gpt-4 - temperature: 0.3 - max_tokens: 500

-

4.2 Infrastruktur-Requirements

-

#### Cloud Services -

-

#### Sicherheit & Compliance -

-

4.3 Demo-Umgebung Setup

-

#### Quick Setup Script -

#!/bin/bash
-

BWT AI Demo Setup

-

1. Environment Setup

-echo "Setting up BWT AI Demo Environment..." -

2. Docker Containers

-docker-compose up -d postgres redis -

3. Database Migration

-python manage.py migrate -

4. Load Demo Data

-python manage.py loaddata demo_customers.json -python manage.py loaddata knowledge_base.json -

5. Start Services

-npm run build-dashboard -python -m uvicorn main:app --reload & -npm start & -

6. Twilio Configuration

-python configure_twilio.py -

echo "Demo Ready at: http://localhost:3000" -echo "Phone Number: +41 61 755 88 00"

-

#### Demo-Zugänge -

Admin Dashboard:
-
    -
  • URL: https://demo.bwt-ai.ch/admin
  • -
  • User: admin@bwt.ch
  • -
  • Pass: Demo2025!
  • -

-

Agent Dashboard: -

    -
  • URL: https://demo.bwt-ai.ch/agent
  • -
  • User: m.schneider@bwt.ch
  • -
  • Pass: Agent2025!
  • -

-

Test-Telefonnummer: -

    -
  • +41 61 755 88 00 (Demo-Line)
  • -

-

API Endpoints: -

    -
  • https://api.demo.bwt-ai.ch/docs
-

-
-

5. Implementierungsplan

-

Phase 1: Analyse & Design (Woche 1-2)

- - -

Phase 2: Development Sprint (Woche 3-6)

- - -

Phase 3: Pilot-Betrieb (Woche 7-10)

- - -

Phase 4: Rollout (Woche 11-12)

- - -

Projekt-Team

-
Projektleitung:
-
    -
  • 1x Projektmanager (100%)
  • -
  • 1x Product Owner (50%)
  • -
-

Entwicklung: -

    -
  • 2x Backend Developer (100%)
  • -
  • 2x Frontend Developer (100%)
  • -
  • 1x AI/ML Engineer (100%)
  • -
  • 1x DevOps Engineer (50%)
  • -

-

Business: -

    -
  • 1x Business Analyst (100%)
  • -
  • 1x UX Designer (50%)
  • -
  • 2x Support Agents für Testing (50%)
  • -

-

Gesamt: 8-10 Personen für 12 Wochen

-

Budget-Übersicht

-
Personalkosten (12 Wochen):     CHF 120'000
-Lizenzen & Services:             CHF  30'000
-Infrastruktur:                   CHF  15'000
-Unvorhergesehenes (10%):         CHF  15'000
-----------------------------------------
-Total Projekt:                   CHF 180'000
-

Laufende Kosten/Monat: CHF 5'000 -

    -
  • Twilio: CHF 1'500
  • -
  • Cloud Services: CHF 2'000
  • -
  • Lizenzen: CHF 1'000
  • -
  • Wartung: CHF 500
-

-

Erfolgs-Metriken

-Technische KPIs: - -Business KPIs: - -Nach 3 Monaten Review: - -
-

Anhang A: Glossar

-AQA: Markenname BWT für Wasseraufbereitungsprodukte -AQA confiance: Service-Abonnement-Modell -°fH: Französische Härtegrade (Wasserhärte) -WFI: Water for Injection (Pharma-Standard) -Regeneration: Reinigungsprozess Enthärtungsanlage -Bypass-Ventil: Umgehungsventil für Wartung -Harzbett: Ionenaustauscher in Enthärtungsanlage -

Anhang B: Kontakte

-BWT Projektteam: - -Externe Partner: - -

Anhang C: Referenzen

- -
-Dieses Dokument wurde erstellt für die Geschäftsleitungspräsentation vom 24.09.2025 -Version 1.0 - Vertraulich -
-
- - - - - \ No newline at end of file diff --git a/mandates/bwt/script.html b/mandates/bwt/script.html deleted file mode 100644 index 8de8f9d..0000000 --- a/mandates/bwt/script.html +++ /dev/null @@ -1,1230 +0,0 @@ - - - - - - - BWT AI Support System - MVP Demo Dokumentation | PowerON - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - -
-
-

BWT AI Support System - MVP Demo Dokumentation

-

Inhaltsverzeichnis

-
    -
  1. Unternehmensinformationen BWT
  2. -
  3. MVP Spezifikation
  4. -
  5. Drehbuch für Live-Demo
  6. -
  7. Technische Requirements
  8. -
  9. Implementierungsplan
  10. -
-
-

1. Unternehmensinformationen BWT

-

1.1 Was macht BWT?

-BWT (Best Water Technology) ist Europas führendes Wastertechnologie-Unternehmen, das sich auf die Aufbereitung und Optimierung von Wasser für alle Lebensbereiche spezialisiert hat. Das Unternehmen entwickelt moderne, ökonomische und ökologische Aufbereitungssysteme und Services für Trinkwasser, Prozesswasser, Poolwasser und WFI (Water for Injection). -

1.2 Kerngeschäft

- -

1.3 Hauptkunden

- -

1.4 Eigentümerschaft

- -

1.5 Tätigkeitsgebiete

- -

1.6 BWT Schweiz Kontaktdaten

-BWT AQUA AG - -
-

2. MVP Spezifikation für AI Support Demo

-

2.1 System-Architektur Übersicht

-
┌─────────────────────────────────────────────────────────────────┐
-│                        AI SUPPORT SYSTEM                        │
-├─────────────────────────────────────────────────────────────────┤
-│                                                                 │
-│  ┌──────────────┐     ┌──────────────┐     ┌──────────────┐     │
-│  │   Telefon    │───> │  AI Voice    │────>│   Backend    │     │
-│  │   Interface  │     │   Assistant  │     │   Services   │     │
-│  └──────────────┘     └──────────────┘     └──────────────┘     │
-│                               │                     │           │
-│                               ▼                     ▼           │
-│                       ┌──────────────┐     ┌──────────────┐     │
-│                       │   Triage &   │     │   Database   │     │
-│                       │   Routing    │     │   (CRM)      │     │
-│                       └──────────────┘     └──────────────┘     │
-│                                |                    |           │
-│                       ┌──────────────┐              |           │
-│                       │  Agent UI    │<────────────             │
-│                       │  Dashboard   │                          │
-│                       └──────────────┘                          │
-│                               │                                 │
-│                               ▼                                 │
-│                       ┌──────────────┐                          │
-│                       │    Email     │                          │
-│                       │   Service    │                          │
-│                       └──────────────┘                          │
-└─────────────────────────────────────────────────────────────────┘
-

2.2 Komponenten-Spezifikation

-

#### A. Voice AI Assistant -Technologie-Stack: -

-Sprachunterstützung: - -Kernfunktionen: - -

#### B. Triage-System

-Hauptkategorien: -1. Technische Störung (40% der Anfragen) - -2. Frage zum Vertrag (30% der Anfragen) - -3. Frage zur Rechnung (20% der Anfragen) - -4. Neukundenanfragen (10% der Anfragen) - -

#### C. Backend Services

-CRM Integration: - -Email Service: - -Knowledge Base API: - -Routing Engine: - -

#### D. Agent Dashboard (UI)

-Hauptfunktionen: - -Dashboard-Komponenten: -
┌─────────────────────────────────────────────────────┐
-│  BWT Service Dashboard - Agent: M. Schneider        │
-├──────────────┬──────────────────────────────────────┤
-│              │  Ticket #2024-3847                   │
-│  Neue        │  ⚠️ Priorität: Hoch                  │
-│  Tickets     │                                      │
-│  ────────    │  Kunde: Maria Müller                 │
-│  🔴 3        │  Vertrag: CH-2024-1234              │
-│  🟡 5        │  Produkt: AQA perla 4.0             │
-│  🟢 12       │                                      │
-│              │  Problem: Salzstand-Warnung          │
-│  Statistik   │                                      │
-│  ────────    │  AI-Vorschlag:                      │
-│  Heute: 45   │  • Schwimmerschalter prüfen (78%)   │
-│  Gelöst: 38  │  • Reset durchführen                │
-│  Quote: 84%  │  • Vor-Ort-Termin wenn nötig       │
-│              │                                      │
-└──────────────┴──────────────────────────────────────┘
-

#### E. Datenbank-Schema

-
-- Kundendatenbank
-CREATE TABLE customers (
-    id INTEGER PRIMARY KEY,
-    customer_number VARCHAR(20) UNIQUE,
-    name VARCHAR(100),
-    email VARCHAR(100),
-    phone VARCHAR(20),
-    language VARCHAR(2),
-    address TEXT,
-    created_at TIMESTAMP,
-    updated_at TIMESTAMP
-);
-

-- Verträge und Produkte -CREATE TABLE contracts ( - id INTEGER PRIMARY KEY, - customer_id INTEGER, - contract_number VARCHAR(20) UNIQUE, - product_id INTEGER, - service_level VARCHAR(50), - start_date DATE, - end_date DATE, - status VARCHAR(20), - FOREIGN KEY (customer_id) REFERENCES customers(id) -);

-

-- Tickets -CREATE TABLE tickets ( - id INTEGER PRIMARY KEY, - ticket_number VARCHAR(20) UNIQUE, - customer_id INTEGER, - contract_id INTEGER, - category VARCHAR(50), - subcategory VARCHAR(50), - priority VARCHAR(20), - status VARCHAR(20), - description TEXT, - ai_summary TEXT, - assigned_to INTEGER, - created_at TIMESTAMP, - resolved_at TIMESTAMP, - FOREIGN KEY (customer_id) REFERENCES customers(id) -);

-

-- AI Interaktionen -CREATE TABLE ai_interactions ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - call_recording_url VARCHAR(255), - transcript TEXT, - summary TEXT, - detected_intent VARCHAR(100), - confidence_score DECIMAL(3,2), - suggested_solutions TEXT, - duration_seconds INTEGER, - created_at TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -);

-

-- Knowledge Base -CREATE TABLE knowledge_base ( - id INTEGER PRIMARY KEY, - category VARCHAR(50), - problem_description TEXT, - solution TEXT, - product_models TEXT, - success_rate DECIMAL(3,2), - keywords TEXT, - last_updated TIMESTAMP -);

-

-- Email Kommunikation -CREATE TABLE email_threads ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - subject VARCHAR(255), - from_address VARCHAR(100), - to_address VARCHAR(100), - body TEXT, - direction VARCHAR(10), - timestamp TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -);

-

2.3 Demo-Daten Setup

-

#### Testkundendaten

-1. Privatkunde Enthärtung -
{
-  "name": "Maria Müller",
-  "vertragsnummer": "CH-2024-1234",
-  "email": "m.mueller@beispiel.ch",
-  "telefon": "+41 61 555 12 34",
-  "produkt": "AQA perla 4.0",
-  "installationsdatum": "2021-03-15",
-  "service_level": "AQA confiance Plus",
-  "letzte_wartung": "2024-05-20",
-  "typisches_problem": "Salzstand-Warnung trotz Befüllung"
-}
-2. Geschäftskunde Restaurant -
{
-  "name": "Restaurant Seeblick AG",
-  "vertragsnummer": "CH-2023-5678",
-  "email": "info@seeblick-restaurant.ch",
-  "telefon": "+41 61 555 56 78",
-  "produkt": "AQA total Energy 2500",
-  "installationsdatum": "2023-01-10",
-  "service_level": "Business Premium",
-  "monatliche_kosten": "CHF 450",
-  "typisches_problem": "Frage zu Service-Rechnung"
-}
-3. Neukunde Installation -
{
-  "name": "Thomas Weber",
-  "email": "t.weber@mail.ch",
-  "telefon": "+41 79 555 90 12",
-  "interesse": "Neue Enthärtungsanlage",
-  "gebäudetyp": "Einfamilienhaus",
-  "personen": "4",
-  "wasserhärte": "32 °fH",
-  "budget": "CHF 3000-5000"
-}
-

#### Knowledge Base Einträge (Top 10)

-
    -
  1. Salzstand-Warnung
  2. -
- -
    -
  1. Kein weiches Wasser
  2. -
- -
    -
  1. Erhöhter Salzverbrauch
  2. -
- -
    -
  1. Display-Fehler E02
  2. -
- -
    -
  1. Wasserdruck niedrig
  2. -
- -
    -
  1. Regeneration startet nicht
  2. -
- -
    -
  1. Geräusche beim Betrieb
  2. -
- -
    -
  1. Salztabletten lösen sich nicht
  2. -
- -
    -
  1. Überlauf Salzbehälter
  2. -
- -
    -
  1. App-Verbindung verloren
  2. -
- -
-

3. Drehbuch für Live-Demo

-

DEMO-ABLAUF (Gesamtdauer: 20 Minuten)

-

#### SZENE 1: Einführung und Business Case (3 Min)

-SETTING: Konferenzraum BWT Hauptsitz Aesch, Grossbildschirm mit Präsentation -SPRECHER: Projektleiter Digital Innovation -SCRIPT: -

"Guten Tag, geschätzte Mitglieder der Geschäftsleitung.

-

Heute präsentieren wir Ihnen die Zukunft des BWT Kundenservice - ein AI-gestütztes Support-System, das unsere Service-Qualität revolutioniert und gleichzeitig die Effizienz massiv steigert.

-Unsere aktuelle Herausforderung: - -Unsere Lösung bietet: - -

Lassen Sie mich Ihnen dies live demonstrieren..."

-

[ÜBERGANG: Screen-Switch zu Live-System]

-

#### SZENE 2: Kundenanruf - Technische Störung (6 Min)

-[LIVE-DEMO STARTET] -TELEFON KLINGELT - Nummer wird angezeigt: +41 61 555 12 34 -AI-ASSISTENT (Stimme: Anna, freundlich, Schweizer Akzent): -"Grüezi und herzlich willkommen bei BWT AQUA, Ihrem Partner für beste Wasserqualität. Mein Name ist Anna, Ihre digitale Assistentin. Wie kann ich Ihnen heute helfen?" -KUNDE (Testanrufer aus anderem Raum): -"Grüezi, ich bin die Frau Müller. Ich habe ein Problem mit meiner Enthärtungsanlage. Die zeigt dauernd einen Fehler an mit dem Salzstand." -AI-ASSISTENT: -"Guten Tag Frau Müller, das tut mir leid zu hören. Ich helfe Ihnen sehr gerne weiter. Ich sehe hier bereits Ihre Kundendaten - Sie haben eine AQA perla 4.0 mit der Vertragsnummer CH-2024-1234, ist das korrekt?" -KUNDE: -"Ja genau, die ist es." -AI-ASSISTENT: -"Perfekt. Sie erwähnen eine Salzstand-Warnung. Können Sie mir sagen, wann Sie zuletzt Salz nachgefüllt haben?" -KUNDE: -"Letzte Woche erst! Ich habe zwei Säcke reingeleert, wie immer." -AI-ASSISTENT: -"Verstehe. Das ist tatsächlich ungewöhnlich. Basierend auf ähnlichen Fällen könnte es sich um ein Problem mit dem Schwimmerschalter handeln. Ich habe folgende Sofortmassnahme für Sie: -
    -
  1. Trennen Sie das Gerät für 30 Sekunden vom Strom - der Stecker ist seitlich am Gerät
  2. -
  3. Öffnen Sie einmal den Salzdeckel und prüfen Sie visuell den Füllstand
  4. -
  5. Schliessen Sie den Deckel wieder fest
  6. -
  7. Stecken Sie das Gerät wieder ein
  8. -
-

Das löst in 85% der Fälle das Problem. Parallel dazu erstelle ich aber sicherheitshalber ein Service-Ticket für Sie. Unser Techniker Herr Schneider aus Ihrer Region wird sich innerhalb der nächsten 30 Minuten bei Ihnen melden.

-

Sie erhalten ausserdem sofort eine E-Mail mit: -

-

Soll ich das so für Sie einrichten?"

-KUNDE: -"Ja, das wäre super. Die E-Mail-Adresse ist noch die gleiche?" -AI-ASSISTENT: -"Ich habe hier m.mueller@beispiel.ch - stimmt das?" -KUNDE: -"Genau." -AI-ASSISTENT: -"Wunderbar, die E-Mail ist bereits unterwegs. Gibt es sonst noch etwas, wobei ich Ihnen helfen kann?" -KUNDE: -"Nein, das war sehr hilfreich. Merci vielmal!" -AI-ASSISTENT: -"Sehr gerne, Frau Müller. Ich wünsche Ihnen einen schönen Tag und viel Erfolg mit der Lösung. Falls es nicht funktioniert, ist Herr Schneider ja gleich für Sie da. Auf Wiederhören!" -[ANRUF ENDET] -MODERATOR: -"Sie haben gesehen: 2 Minuten 45 Sekunden Gesprächszeit, Problem erfasst, Lösung angeboten, Ticket erstellt, Follow-up eingeleitet." -

#### SZENE 3: Agent Dashboard in Echtzeit (4 Min)

-[BILDSCHIRM WECHSELT ZUM AGENT DASHBOARD] -MODERATOR: -"Schauen wir nun, was parallel bei unserem Service-Mitarbeiter Herr Schneider passiert ist." -[DASHBOARD ZEIGT] -
╔════════════════════════════════════════════════════════════╗
-║  🔔 NEUES TICKET - HOHE PRIORITÄT                         ║
-╠════════════════════════════════════════════════════════════╣
-║  Ticket #CH-2024-3847                                     ║
-║  Kunde: Maria Müller (Loyal Customer - 3 Jahre)           ║
-║  Problem: Salzstand-Warnung bei AQA perla 4.0            ║
-║                                                            ║
-║  📊 AI-ANALYSE:                                           ║
-║  • Wahrscheinlichkeit Schwimmerschalter: 78%             ║
-║  • Wahrscheinlichkeit Elektronik-Reset: 15%              ║
-║  • Wahrscheinlichkeit Salzqualität: 7%                   ║
-║                                                            ║
-║  🛠️ EMPFOHLENE MASSNAHMEN:                               ║
-║  1. ✅ Reset-Anleitung bereits per Mail gesendet         ║
-║  2. 📞 Telefonischer Follow-up in 30 Min                 ║
-║  3. 🚗 Vor-Ort-Termin wenn Reset nicht hilft            ║
-║                                                            ║
-║  📦 VERFÜGBARE ERSATZTEILE:                              ║
-║  • Schwimmerschalter: 3x Lager Aesch                     ║
-║  • Lieferzeit zum Kunden: Same-Day möglich               ║
-║                                                            ║
-║  📝 KUNDENHISTORIE:                                      ║
-║  • Letzter Service: 20.05.2024 (Regulär)                 ║
-║  • Keine Reklamationen in 3 Jahren                       ║
-║  • Service-Level: AQA confiance Plus                     ║
-║                                                            ║
-║  [KUNDE ANRUFEN] [TERMIN PLANEN] [TICKET SCHLIESSEN]     ║
-╚════════════════════════════════════════════════════════════╝
-MODERATOR erklärt: -"Das System hat automatisch: - -

Herr Schneider kann nun mit einem Klick den Kunden anrufen und hat alle Informationen zur Hand."

-

#### SZENE 4: E-Mail-Interaktion und Lösung (3 Min)

-[E-MAIL WIRD AUF SCREEN GEZEIGT] -
Von: BWT AQUA Service <service@bwt-aqua.ch>
-An: m.mueller@beispiel.ch
-Betreff: ✓ Ihre Serviceanfrage #CH-2024-3847 - Salzstand-Warnung
-

Guten Tag Frau Müller,

-

vielen Dank für Ihren Anruf. Hier Ihre Serviceanfrage im Überblick:

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -📋 IHRE ANFRAGE -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Gerät: AQA perla 4.0 (SN: AP-2021-7823) -Problem: Salzstand-Warnung trotz Befüllung -Erfasst: 24.09.2025, 14:30 Uhr -Status: In Bearbeitung

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -🔧 SOFORT-LÖSUNG (85% Erfolgsquote) -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -

    -
  1. Gerät vom Strom trennen (30 Sekunden)
  2. -
  3. Salzdeckel öffnen und Füllstand prüfen
  4. -
  5. Deckel fest verschliessen
  6. -
  7. Gerät wieder anschliessen
  8. -
  9. 2 Minuten warten bis Display aktiv
  10. -

-

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -👨‍🔧 IHR TECHNIKER -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Marc Schneider -Region: Basel-Land -Direkt: 061 755 88 45 -Mobil: 079 555 88 45 -Rückruf: Heute, 15:00 Uhr

-

Mit freundlichen Grüssen -Ihr BWT AQUA Service-Team

-

P.S. Antworten Sie einfach auf diese E-Mail, -falls Sie weitere Fragen haben.

-[PING - NEUE E-MAIL ERSCHEINT] -KUNDE ANTWORTET (15:45 Uhr): -"Hallo, ich habe den Reset gemacht und es funktioniert wieder! Die Meldung ist weg. Vielen Dank für die schnelle Hilfe! LG Maria Müller" -[SYSTEM REAGIERT AUTOMATISCH] - -

#### SZENE 5: Business Impact Dashboard (2 Min)

-[WECHSEL ZU MANAGEMENT DASHBOARD] -LIVE METRIKEN WÄHREND DER DEMO: -
╔═══════════════════════════════════════════════════════════════╗
-║                    DEMO PERFORMANCE METRICS                    ║
-╠═══════════════════════════════════════════════════════════════╣
-║                                                                ║
-║  EFFIZIENZ-GEWINNE HEUTE                                      ║
-║  ├─ Anrufe bearbeitet: 127 (AI) vs 76 (Traditional)          ║
-║  ├─ ⌀ Bearbeitungszeit: 2:45 Min vs 8:30 Min (-68%)         ║
-║  ├─ Erstlösungsquote: 82% vs 45% (+37%)                      ║
-║  └─ Kundenzufriedenheit: 4.8/5.0 vs 4.2/5.0                 ║
-║                                                                ║
-║  KOSTEN-EINSPARUNG (Hochrechnung Monat)                       ║
-║  ├─ Reduktion Anrufminuten: 2'850 Min = CHF 8'550            ║
-║  ├─ Vermiedene Vor-Ort-Einsätze: 45 = CHF 8'100             ║
-║  ├─ Reduktion Wiederanrufe: 130 = CHF 3'900                  ║
-║  └─ TOTAL: CHF 20'550 / Monat                                ║
-║                                                                ║
-║  ROI-BERECHNUNG                                               ║
-║  ├─ Investition: CHF 180'000                                 ║
-║  ├─ Monatliche Einsparung: CHF 20'550                        ║
-║  ├─ Break-Even: 8.8 Monate                                   ║
-║  └─ 3-Jahres-ROI: 343%                                       ║
-║                                                                ║
-╚═══════════════════════════════════════════════════════════════╝
-

#### SZENE 6: Weitere Use Cases (2 Min)

-MODERATOR: -"Das war ein technisches Problem. Lassen Sie mich kurz zwei weitere Szenarien zeigen:" -[QUICK DEMO 1: RECHNUNGSFRAGE] - -[QUICK DEMO 2: NEUKUNDENANFRAGE] - -

#### SZENE 7: Q&A und Next Steps (3 Min)

-MODERATOR: -

"Zusammengefasst bietet unser AI Support System:

-SOFORTIGE VORTEILE: -✓ 24/7 Verfügbarkeit in 4 Sprachen -✓ Keine Wartezeiten mehr -✓ Konsistente Service-Qualität -✓ Automatische Dokumentation -✓ Proaktive Problemlösung -STRATEGISCHE VORTEILE: -✓ Skalierbarkeit für Wachstum -✓ Wertvolle Dateneinblicke -✓ Mitarbeiter-Entlastung für komplexe Fälle -✓ Wettbewerbsvorteil im Markt -✓ Kundenbindung durch Excellence -NÄCHSTE SCHRITTE: -Phase 1: Pilot (Woche 1-2) - -Phase 2: Beta (Woche 3-6) - -Phase 3: Rollout (ab Woche 7) - -INVESTITION: - -

Haben Sie Fragen?"

-[RAUM FÜR FRAGEN DER GL] -
-

4. Technische Requirements für Demo

-

4.1 Minimal Viable Product (MVP) - Technologie Stack

-

#### Frontend Komponenten -

// React-basiertes Agent Dashboard
-
    -
  • React 18.x mit TypeScript
  • -
  • Material-UI für Komponenten
  • -
  • WebSocket für Real-time Updates
  • -
  • Chart.js für Analytics
  • -
  • React Router für Navigation
  • -

-

// Beispiel-Komponente -interface TicketProps { - id: string; - customer: Customer; - priority: 'high' | 'medium' | 'low'; - aiSuggestions: AISuggestion[]; -}

-

const TicketView: React.FC<TicketProps> = ({ - id, - customer, - priority, - aiSuggestions -}) => { - // Implementation -};

-

#### Backend Services -

# Python FastAPI Backend
-from fastapi import FastAPI, WebSocket
-from typing import Optional
-import asyncio

-

app = FastAPI()

-

Beispiel-Endpunkte

-@app.post("/api/calls/incoming") -async def handle_incoming_call(call_data: CallData): - # Twilio Webhook Handler - ai_response = await process_with_ai(call_data) - return create_ticket(ai_response) -

@app.websocket("/ws/dashboard/{agent_id}") -async def dashboard_websocket( - websocket: WebSocket, - agent_id: str -): - # Real-time Dashboard Updates - await websocket.accept() - while True: - ticket = await get_new_ticket() - await websocket.send_json(ticket)

-

#### AI & Voice Integration -

# Konfiguration
-voice_services:
-  twilio:
-    account_sid: ${TWILIO_ACCOUNT_SID}
-    auth_token: ${TWILIO_AUTH_TOKEN}
-    phone_numbers:
-
    -
  • "+41 61 755 88 99"
  • -

-

speech_to_text: - provider: google_cloud - language_codes: -

    -
  • de-CH
  • -
  • fr-CH
  • -
  • it-CH
  • -
  • en-US
  • -

-

text_to_speech: - provider: amazon_polly - voice_id: Marlene # Deutsch - neural_voice: true

-

nlp: - provider: openai - model: gpt-4 - temperature: 0.3 - max_tokens: 500

-

4.2 Infrastruktur-Requirements

-

#### Cloud Services -

-

#### Sicherheit & Compliance -

-

4.3 Demo-Umgebung Setup

-

#### Quick Setup Script -

#!/bin/bash
-

BWT AI Demo Setup

-

1. Environment Setup

-echo "Setting up BWT AI Demo Environment..." -

2. Docker Containers

-docker-compose up -d postgres redis -

3. Database Migration

-python manage.py migrate -

4. Load Demo Data

-python manage.py loaddata demo_customers.json -python manage.py loaddata knowledge_base.json -

5. Start Services

-npm run build-dashboard -python -m uvicorn main:app --reload & -npm start & -

6. Twilio Configuration

-python configure_twilio.py -

echo "Demo Ready at: http://localhost:3000" -echo "Phone Number: +41 61 755 88 00"

-

#### Demo-Zugänge -

Admin Dashboard:
-
    -
  • URL: https://demo.bwt-ai.ch/admin
  • -
  • User: admin@bwt.ch
  • -
  • Pass: Demo2025!
  • -

-

Agent Dashboard: -

    -
  • URL: https://demo.bwt-ai.ch/agent
  • -
  • User: m.schneider@bwt.ch
  • -
  • Pass: Agent2025!
  • -

-

Test-Telefonnummer: -

    -
  • +41 61 755 88 00 (Demo-Line)
  • -

-

API Endpoints: -

    -
  • https://api.demo.bwt-ai.ch/docs
-

-
-

5. Implementierungsplan

-

Phase 1: Analyse & Design (Woche 1-2)

- - -

Phase 2: Development Sprint (Woche 3-6)

- - -

Phase 3: Pilot-Betrieb (Woche 7-10)

- - -

Phase 4: Rollout (Woche 11-12)

- - -

Projekt-Team

-
Projektleitung:
-
    -
  • 1x Projektmanager (100%)
  • -
  • 1x Product Owner (50%)
  • -
-

Entwicklung: -

    -
  • 2x Backend Developer (100%)
  • -
  • 2x Frontend Developer (100%)
  • -
  • 1x AI/ML Engineer (100%)
  • -
  • 1x DevOps Engineer (50%)
  • -

-

Business: -

    -
  • 1x Business Analyst (100%)
  • -
  • 1x UX Designer (50%)
  • -
  • 2x Support Agents für Testing (50%)
  • -

-

Gesamt: 8-10 Personen für 12 Wochen

-

Budget-Übersicht

-
Personalkosten (12 Wochen):     CHF 120'000
-Lizenzen & Services:             CHF  30'000
-Infrastruktur:                   CHF  15'000
-Unvorhergesehenes (10%):         CHF  15'000
-----------------------------------------
-Total Projekt:                   CHF 180'000
-

Laufende Kosten/Monat: CHF 5'000 -

    -
  • Twilio: CHF 1'500
  • -
  • Cloud Services: CHF 2'000
  • -
  • Lizenzen: CHF 1'000
  • -
  • Wartung: CHF 500
-

-

Erfolgs-Metriken

-Technische KPIs: - -Business KPIs: - -Nach 3 Monaten Review: - -
-

Anhang A: Glossar

-AQA: Markenname BWT für Wasseraufbereitungsprodukte -AQA confiance: Service-Abonnement-Modell -°fH: Französische Härtegrade (Wasserhärte) -WFI: Water for Injection (Pharma-Standard) -Regeneration: Reinigungsprozess Enthärtungsanlage -Bypass-Ventil: Umgehungsventil für Wartung -Harzbett: Ionenaustauscher in Enthärtungsanlage -

Anhang B: Kontakte

-BWT Projektteam: - -Externe Partner: - -

Anhang C: Referenzen

- -
-Dieses Dokument wurde erstellt für die Geschäftsleitungspräsentation vom 24.09.2025 -Version 1.0 - Vertraulich -
-
- - - - - \ No newline at end of file diff --git a/mandates/bwt/script.md b/mandates/bwt/script.md deleted file mode 100644 index 1e01898..0000000 --- a/mandates/bwt/script.md +++ /dev/null @@ -1,1009 +0,0 @@ -# BWT AI Support System - MVP Demo Dokumentation - -## Inhaltsverzeichnis -1. [Unternehmensinformationen BWT](#1-unternehmensinformationen-bwt) -2. [MVP Spezifikation](#2-mvp-spezifikation-für-ai-support-demo) -3. [Drehbuch für Live-Demo](#3-drehbuch-für-live-demo) -4. [Technische Requirements](#4-technische-requirements-für-demo) -5. [Implementierungsplan](#5-implementierungsplan) - ---- - -## 1. Unternehmensinformationen BWT - -### 1.1 Was macht BWT? -BWT (Best Water Technology) ist Europas führendes Wastertechnologie-Unternehmen, das sich auf die Aufbereitung und Optimierung von Wasser für alle Lebensbereiche spezialisiert hat. Das Unternehmen entwickelt moderne, ökonomische und ökologische Aufbereitungssysteme und Services für Trinkwasser, Prozesswasser, Poolwasser und WFI (Water for Injection). - -### 1.2 Kerngeschäft -- **Wasseraufbereitungssysteme** für Privathaushalte, Gewerbe und Industrie -- **Trinkwasserfilter** und Enthärtungsanlagen (AQA perla, AQA total Energy) -- **Pharma & Biotech**: Weltmarktführer für Systeme zur Herstellung, Lagerung und Verteilung von PW/HPW, WFI und gereinigtem Dampf -- **Membrantechnologie** für Brennstoffzellen - Energiekonverter des 21. Jahrhunderts -- **Schwimmbad- und Spa-Wasseraufbereitung** -- **Heizungswasseraufbereitung** und Systemtrenner - -### 1.3 Hauptkunden -- **Privathaushalte**: Enthärtungsanlagen, Trinkwasserfilter -- **Gewerbe**: Restaurants, Hotels, Büros -- **Industrie**: Oberflächenbehandlung, Druckereien, Lebensmittelproduktion -- **Medizin/Pharma**: Spitäler, Labore, pharmazeutische Hersteller -- **Facility Management**: Hausverwaltungen, Dampferzeugung, Raumlufttechnik - -### 1.4 Eigentümerschaft -- **Hauptaktionär**: WAB-Gruppe (Holding von Andreas Weißenbacher) -- **Streubesitz**: ca. 20% der Aktien -- **Eigenbesitz**: ca. 6% der Aktien -- **Geschichte**: 1990 Management-Buy-out durch Andreas Weißenbacher, 1992 Börsengang Wien - -### 1.5 Tätigkeitsgebiete -- **Hauptsitz**: Mondsee, Österreich -- **Hauptproduktionsstandorte**: - - Mondsee (Österreich) - - Schriesheim (Deutschland) - - Paris (Frankreich) - - Aesch (Schweiz) -- **Schweiz**: BWT AQUA AG mit über 300 Mitarbeitenden -- **Weltweit**: 6.500 Mitarbeitende, über 80 Tochtergesellschaften - -### 1.6 BWT Schweiz Kontaktdaten -**BWT AQUA AG** -- Adresse: Hauptstrasse 192, 4147 Aesch -- Telefon: 061 755 88 99 -- E-Mail: info@bwt-aqua.ch -- Öffnungszeiten: Montag - Freitag, 7:30 - 17:30 Uhr -- Service-Organisation: 210 Servicetechniker schweizweit -- Partner-Netzwerk: Fast 500 BWT-Partner in der Schweiz - ---- - -## 2. MVP Spezifikation für AI Support Demo - -### 2.1 System-Architektur Übersicht - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ AI SUPPORT SYSTEM │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ -│ │ Telefon │───> │ AI Voice │────>│ Backend │ │ -│ │ Interface │ │ Assistant │ │ Services │ │ -│ └──────────────┘ └──────────────┘ └──────────────┘ │ -│ │ │ │ -│ ▼ ▼ │ -│ ┌──────────────┐ ┌──────────────┐ │ -│ │ Triage & │ │ Database │ │ -│ │ Routing │ │ (CRM) │ │ -│ └──────────────┘ └──────────────┘ │ -│ | | │ -│ ┌──────────────┐ | │ -│ │ Agent UI │<──────────── │ -│ │ Dashboard │ │ -│ └──────────────┘ │ -│ │ │ -│ ▼ │ -│ ┌──────────────┐ │ -│ │ Email │ │ -│ │ Service │ │ -│ └──────────────┘ │ -└─────────────────────────────────────────────────────────────────┘ -``` - -### 2.2 Komponenten-Spezifikation - -#### A. Voice AI Assistant -**Technologie-Stack:** -- Speech-to-Text: Google Cloud Speech-to-Text API -- NLP Engine: OpenAI GPT-4 oder Claude API -- Text-to-Speech: Amazon Polly oder Google Cloud TTS -- Telefonie: Twilio Voice API - -**Sprachunterstützung:** -- Deutsch (Hochdeutsch + Schweizerdeutsch-Verständnis) -- Französisch -- Italienisch -- Englisch (für internationale Kunden) - -**Kernfunktionen:** -- Personalisierte Begrüssung mit BWT-Branding -- Natürliche Konversationsführung -- Intent-Erkennung und Klassifizierung -- Datenextraktion (Name, Vertragsnummer, Problem) -- Automatische Fallzusammenfassung -- Mehrsprachige Unterstützung mit automatischer Spracherkennung - -#### B. Triage-System - -**Hauptkategorien:** - -**1. Technische Störung (40% der Anfragen)** -- Enthärtungsanlage funktioniert nicht -- Kein weiches Wasser trotz laufender Anlage -- Fehlermeldungen am Display -- Erhöhter Salzverbrauch -- Wasserdruck-Probleme -- Geräusche oder Leckagen -- Regeneration funktioniert nicht - -**2. Frage zum Vertrag (30% der Anfragen)** -- Service-Abonnement Details (AQA confiance) -- Garantiebedingungen und -verlängerung -- Vertragsverlängerung oder -kündigung -- Miet- vs. Kaufoptionen -- Upgrade-Möglichkeiten -- Zusatzleistungen - -**3. Frage zur Rechnung (20% der Anfragen)** -- Rechnungserklärung -- Zahlungsmodalitäten -- Service-Kosten Aufschlüsselung -- Verbrauchsmaterial-Preise -- Mahnungen -- Rückerstattungen - -**4. Neukundenanfragen (10% der Anfragen)** -- Produktberatung -- Installationsanfragen -- Kostenvoranschläge -- Terminvereinbarungen - -#### C. Backend Services - -**CRM Integration:** -- Automatische Ticket-Erstellung -- Kundenhistorie-Abfrage -- Vertrags- und Produktdaten-Zugriff -- Service-Historie Integration - -**Email Service:** -- Sofortige Gesprächszusammenfassung -- Ticket-Bestätigung -- Follow-up Kommunikation -- Eskalationsbenachrichtigungen - -**Knowledge Base API:** -- 500+ dokumentierte Lösungen -- Produkthandbücher und Anleitungen -- FAQ-Datenbank -- Troubleshooting-Guides - -**Routing Engine:** -- Skill-basierte Mitarbeiterzuweisung -- Geografische Zuordnung -- Prioritäts-Management -- Verfügbarkeits-Check - -#### D. Agent Dashboard (UI) - -**Hauptfunktionen:** -- Real-time Ticket Feed mit Priorisierung -- 360° Kundenansicht -- AI-generierte Lösungsvorschläge -- Quick Actions für Standardprozesse -- Email Thread Integration -- Performance Analytics -- Team-Kollaborations-Tools - -**Dashboard-Komponenten:** -``` -┌─────────────────────────────────────────────────────┐ -│ BWT Service Dashboard - Agent: M. Schneider │ -├──────────────┬──────────────────────────────────────┤ -│ │ Ticket #2024-3847 │ -│ Neue │ ⚠️ Priorität: Hoch │ -│ Tickets │ │ -│ ──────── │ Kunde: Maria Müller │ -│ 🔴 3 │ Vertrag: CH-2024-1234 │ -│ 🟡 5 │ Produkt: AQA perla 4.0 │ -│ 🟢 12 │ │ -│ │ Problem: Salzstand-Warnung │ -│ Statistik │ │ -│ ──────── │ AI-Vorschlag: │ -│ Heute: 45 │ • Schwimmerschalter prüfen (78%) │ -│ Gelöst: 38 │ • Reset durchführen │ -│ Quote: 84% │ • Vor-Ort-Termin wenn nötig │ -│ │ │ -└──────────────┴──────────────────────────────────────┘ -``` - -#### E. Datenbank-Schema - -```sql --- Kundendatenbank -CREATE TABLE customers ( - id INTEGER PRIMARY KEY, - customer_number VARCHAR(20) UNIQUE, - name VARCHAR(100), - email VARCHAR(100), - phone VARCHAR(20), - language VARCHAR(2), - address TEXT, - created_at TIMESTAMP, - updated_at TIMESTAMP -); - --- Verträge und Produkte -CREATE TABLE contracts ( - id INTEGER PRIMARY KEY, - customer_id INTEGER, - contract_number VARCHAR(20) UNIQUE, - product_id INTEGER, - service_level VARCHAR(50), - start_date DATE, - end_date DATE, - status VARCHAR(20), - FOREIGN KEY (customer_id) REFERENCES customers(id) -); - --- Tickets -CREATE TABLE tickets ( - id INTEGER PRIMARY KEY, - ticket_number VARCHAR(20) UNIQUE, - customer_id INTEGER, - contract_id INTEGER, - category VARCHAR(50), - subcategory VARCHAR(50), - priority VARCHAR(20), - status VARCHAR(20), - description TEXT, - ai_summary TEXT, - assigned_to INTEGER, - created_at TIMESTAMP, - resolved_at TIMESTAMP, - FOREIGN KEY (customer_id) REFERENCES customers(id) -); - --- AI Interaktionen -CREATE TABLE ai_interactions ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - call_recording_url VARCHAR(255), - transcript TEXT, - summary TEXT, - detected_intent VARCHAR(100), - confidence_score DECIMAL(3,2), - suggested_solutions TEXT, - duration_seconds INTEGER, - created_at TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -); - --- Knowledge Base -CREATE TABLE knowledge_base ( - id INTEGER PRIMARY KEY, - category VARCHAR(50), - problem_description TEXT, - solution TEXT, - product_models TEXT, - success_rate DECIMAL(3,2), - keywords TEXT, - last_updated TIMESTAMP -); - --- Email Kommunikation -CREATE TABLE email_threads ( - id INTEGER PRIMARY KEY, - ticket_id INTEGER, - subject VARCHAR(255), - from_address VARCHAR(100), - to_address VARCHAR(100), - body TEXT, - direction VARCHAR(10), - timestamp TIMESTAMP, - FOREIGN KEY (ticket_id) REFERENCES tickets(id) -); -``` - -### 2.3 Demo-Daten Setup - -#### Testkundendaten - -**1. Privatkunde Enthärtung** -```json -{ - "name": "Maria Müller", - "vertragsnummer": "CH-2024-1234", - "email": "m.mueller@beispiel.ch", - "telefon": "+41 61 555 12 34", - "produkt": "AQA perla 4.0", - "installationsdatum": "2021-03-15", - "service_level": "AQA confiance Plus", - "letzte_wartung": "2024-05-20", - "typisches_problem": "Salzstand-Warnung trotz Befüllung" -} -``` - -**2. Geschäftskunde Restaurant** -```json -{ - "name": "Restaurant Seeblick AG", - "vertragsnummer": "CH-2023-5678", - "email": "info@seeblick-restaurant.ch", - "telefon": "+41 61 555 56 78", - "produkt": "AQA total Energy 2500", - "installationsdatum": "2023-01-10", - "service_level": "Business Premium", - "monatliche_kosten": "CHF 450", - "typisches_problem": "Frage zu Service-Rechnung" -} -``` - -**3. Neukunde Installation** -```json -{ - "name": "Thomas Weber", - "email": "t.weber@mail.ch", - "telefon": "+41 79 555 90 12", - "interesse": "Neue Enthärtungsanlage", - "gebäudetyp": "Einfamilienhaus", - "personen": "4", - "wasserhärte": "32 °fH", - "budget": "CHF 3000-5000" -} -``` - -#### Knowledge Base Einträge (Top 10) - -1. **Salzstand-Warnung** - - Problem: Anzeige trotz Befüllung - - Lösung: Reset, Schwimmerschalter prüfen - - Erfolgsrate: 85% - -2. **Kein weiches Wasser** - - Problem: Härte trotz laufender Anlage - - Lösung: Bypass-Ventil prüfen, Harzbett regenerieren - - Erfolgsrate: 90% - -3. **Erhöhter Salzverbrauch** - - Problem: Doppelter Verbrauch als normal - - Lösung: Einstellungen prüfen, Leckage ausschließen - - Erfolgsrate: 75% - -4. **Display-Fehler E02** - - Problem: Motorblockade - - Lösung: Service-Techniker erforderlich - - Erfolgsrate: 100% - -5. **Wasserdruck niedrig** - - Problem: Reduzierter Durchfluss - - Lösung: Filter reinigen, Ventile prüfen - - Erfolgsrate: 80% - -6. **Regeneration startet nicht** - - Problem: Keine automatische Regeneration - - Lösung: Timer neu programmieren - - Erfolgsrate: 70% - -7. **Geräusche beim Betrieb** - - Problem: Ungewöhnliche Geräusche - - Lösung: Lufteinschluss beheben, Montage prüfen - - Erfolgsrate: 65% - -8. **Salztabletten lösen sich nicht** - - Problem: Salzbrücke im Behälter - - Lösung: Manuell auflockern, Qualität prüfen - - Erfolgsrate: 95% - -9. **Überlauf Salzbehälter** - - Problem: Wasser läuft über - - Lösung: Schwimmerventil ersetzen - - Erfolgsrate: 100% - -10. **App-Verbindung verloren** - - Problem: BWT Best Water Home App - - Lösung: WLAN reset, App neu koppeln - - Erfolgsrate: 88% - ---- - -## 3. Drehbuch für Live-Demo - -### DEMO-ABLAUF (Gesamtdauer: 20 Minuten) - -#### SZENE 1: Einführung und Business Case (3 Min) - -**SETTING:** Konferenzraum BWT Hauptsitz Aesch, Grossbildschirm mit Präsentation - -**SPRECHER:** Projektleiter Digital Innovation - -**SCRIPT:** - -"Guten Tag, geschätzte Mitglieder der Geschäftsleitung. - -Heute präsentieren wir Ihnen die Zukunft des BWT Kundenservice - ein AI-gestütztes Support-System, das unsere Service-Qualität revolutioniert und gleichzeitig die Effizienz massiv steigert. - -**Unsere aktuelle Herausforderung:** -- 500+ Anrufe täglich in der Schweiz -- Durchschnittliche Wartezeit: 3-5 Minuten -- 30% der Anrufe ausserhalb der Geschäftszeiten -- Wiederholungsanrufe bei 40% der Fälle - -**Unsere Lösung bietet:** -- 24/7 Verfügbarkeit in 4 Sprachen -- Sofortige Bearbeitung ohne Wartezeit -- 60% Reduktion der Bearbeitungszeit -- 80% Erstlösungsquote -- ROI innerhalb von 8 Monaten - -Lassen Sie mich Ihnen dies live demonstrieren..." - -[ÜBERGANG: Screen-Switch zu Live-System] - -#### SZENE 2: Kundenanruf - Technische Störung (6 Min) - -**[LIVE-DEMO STARTET]** - -**TELEFON KLINGELT - Nummer wird angezeigt: +41 61 555 12 34** - -**AI-ASSISTENT** (Stimme: Anna, freundlich, Schweizer Akzent): -"Grüezi und herzlich willkommen bei BWT AQUA, Ihrem Partner für beste Wasserqualität. Mein Name ist Anna, Ihre digitale Assistentin. Wie kann ich Ihnen heute helfen?" - -**KUNDE** (Testanrufer aus anderem Raum): -"Grüezi, ich bin die Frau Müller. Ich habe ein Problem mit meiner Enthärtungsanlage. Die zeigt dauernd einen Fehler an mit dem Salzstand." - -**AI-ASSISTENT:** -"Guten Tag Frau Müller, das tut mir leid zu hören. Ich helfe Ihnen sehr gerne weiter. Ich sehe hier bereits Ihre Kundendaten - Sie haben eine AQA perla 4.0 mit der Vertragsnummer CH-2024-1234, ist das korrekt?" - -**KUNDE:** -"Ja genau, die ist es." - -**AI-ASSISTENT:** -"Perfekt. Sie erwähnen eine Salzstand-Warnung. Können Sie mir sagen, wann Sie zuletzt Salz nachgefüllt haben?" - -**KUNDE:** -"Letzte Woche erst! Ich habe zwei Säcke reingeleert, wie immer." - -**AI-ASSISTENT:** -"Verstehe. Das ist tatsächlich ungewöhnlich. Basierend auf ähnlichen Fällen könnte es sich um ein Problem mit dem Schwimmerschalter handeln. Ich habe folgende Sofortmassnahme für Sie: - -1. Trennen Sie das Gerät für 30 Sekunden vom Strom - der Stecker ist seitlich am Gerät -2. Öffnen Sie einmal den Salzdeckel und prüfen Sie visuell den Füllstand -3. Schliessen Sie den Deckel wieder fest -4. Stecken Sie das Gerät wieder ein - -Das löst in 85% der Fälle das Problem. Parallel dazu erstelle ich aber sicherheitshalber ein Service-Ticket für Sie. Unser Techniker Herr Schneider aus Ihrer Region wird sich innerhalb der nächsten 30 Minuten bei Ihnen melden. - -Sie erhalten ausserdem sofort eine E-Mail mit: -- Dieser Anleitung zum Nachlesen -- Der direkten Nummer von Herrn Schneider -- Ihrem Service-Ticket CH-2024-3847 - -Soll ich das so für Sie einrichten?" - -**KUNDE:** -"Ja, das wäre super. Die E-Mail-Adresse ist noch die gleiche?" - -**AI-ASSISTENT:** -"Ich habe hier m.mueller@beispiel.ch - stimmt das?" - -**KUNDE:** -"Genau." - -**AI-ASSISTENT:** -"Wunderbar, die E-Mail ist bereits unterwegs. Gibt es sonst noch etwas, wobei ich Ihnen helfen kann?" - -**KUNDE:** -"Nein, das war sehr hilfreich. Merci vielmal!" - -**AI-ASSISTENT:** -"Sehr gerne, Frau Müller. Ich wünsche Ihnen einen schönen Tag und viel Erfolg mit der Lösung. Falls es nicht funktioniert, ist Herr Schneider ja gleich für Sie da. Auf Wiederhören!" - -**[ANRUF ENDET]** - -**MODERATOR:** -"Sie haben gesehen: 2 Minuten 45 Sekunden Gesprächszeit, Problem erfasst, Lösung angeboten, Ticket erstellt, Follow-up eingeleitet." - -#### SZENE 3: Agent Dashboard in Echtzeit (4 Min) - -**[BILDSCHIRM WECHSELT ZUM AGENT DASHBOARD]** - -**MODERATOR:** -"Schauen wir nun, was parallel bei unserem Service-Mitarbeiter Herr Schneider passiert ist." - -**[DASHBOARD ZEIGT]** - -``` -╔════════════════════════════════════════════════════════════╗ -║ 🔔 NEUES TICKET - HOHE PRIORITÄT ║ -╠════════════════════════════════════════════════════════════╣ -║ Ticket #CH-2024-3847 ║ -║ Kunde: Maria Müller (Loyal Customer - 3 Jahre) ║ -║ Problem: Salzstand-Warnung bei AQA perla 4.0 ║ -║ ║ -║ 📊 AI-ANALYSE: ║ -║ • Wahrscheinlichkeit Schwimmerschalter: 78% ║ -║ • Wahrscheinlichkeit Elektronik-Reset: 15% ║ -║ • Wahrscheinlichkeit Salzqualität: 7% ║ -║ ║ -║ 🛠️ EMPFOHLENE MASSNAHMEN: ║ -║ 1. ✅ Reset-Anleitung bereits per Mail gesendet ║ -║ 2. 📞 Telefonischer Follow-up in 30 Min ║ -║ 3. 🚗 Vor-Ort-Termin wenn Reset nicht hilft ║ -║ ║ -║ 📦 VERFÜGBARE ERSATZTEILE: ║ -║ • Schwimmerschalter: 3x Lager Aesch ║ -║ • Lieferzeit zum Kunden: Same-Day möglich ║ -║ ║ -║ 📝 KUNDENHISTORIE: ║ -║ • Letzter Service: 20.05.2024 (Regulär) ║ -║ • Keine Reklamationen in 3 Jahren ║ -║ • Service-Level: AQA confiance Plus ║ -║ ║ -║ [KUNDE ANRUFEN] [TERMIN PLANEN] [TICKET SCHLIESSEN] ║ -╚════════════════════════════════════════════════════════════╝ -``` - -**MODERATOR erklärt:** -"Das System hat automatisch: -- Die Kundenhistorie analysiert -- Eine Diagnose mit Wahrscheinlichkeiten erstellt -- Ersatzteil-Verfügbarkeit geprüft -- Den optimalen Techniker zugewiesen -- Alle relevanten Informationen bereitgestellt - -Herr Schneider kann nun mit einem Klick den Kunden anrufen und hat alle Informationen zur Hand." - -#### SZENE 4: E-Mail-Interaktion und Lösung (3 Min) - -**[E-MAIL WIRD AUF SCREEN GEZEIGT]** - -``` -Von: BWT AQUA Service -An: m.mueller@beispiel.ch -Betreff: ✓ Ihre Serviceanfrage #CH-2024-3847 - Salzstand-Warnung - -Guten Tag Frau Müller, - -vielen Dank für Ihren Anruf. Hier Ihre Serviceanfrage im Überblick: - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -📋 IHRE ANFRAGE -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Gerät: AQA perla 4.0 (SN: AP-2021-7823) -Problem: Salzstand-Warnung trotz Befüllung -Erfasst: 24.09.2025, 14:30 Uhr -Status: In Bearbeitung - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -🔧 SOFORT-LÖSUNG (85% Erfolgsquote) -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -1. Gerät vom Strom trennen (30 Sekunden) -2. Salzdeckel öffnen und Füllstand prüfen -3. Deckel fest verschliessen -4. Gerät wieder anschliessen -5. 2 Minuten warten bis Display aktiv - -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -👨‍🔧 IHR TECHNIKER -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Marc Schneider -Region: Basel-Land -Direkt: 061 755 88 45 -Mobil: 079 555 88 45 -Rückruf: Heute, 15:00 Uhr - -Mit freundlichen Grüssen -Ihr BWT AQUA Service-Team - -P.S. Antworten Sie einfach auf diese E-Mail, -falls Sie weitere Fragen haben. -``` - -**[PING - NEUE E-MAIL ERSCHEINT]** - -**KUNDE ANTWORTET (15:45 Uhr):** -"Hallo, ich habe den Reset gemacht und es funktioniert wieder! Die Meldung ist weg. Vielen Dank für die schnelle Hilfe! LG Maria Müller" - -**[SYSTEM REAGIERT AUTOMATISCH]** -- ✅ Ticket-Status: GELÖST -- 📊 Knowledge Base Update: +1 erfolgreiche Lösung -- 📈 Erfolgsrate Schwimmerschalter-Reset: 85% → 86% -- 💰 Eingesparte Kosten: CHF 180 (Technikereinsatz) - -#### SZENE 5: Business Impact Dashboard (2 Min) - -**[WECHSEL ZU MANAGEMENT DASHBOARD]** - -**LIVE METRIKEN WÄHREND DER DEMO:** - -``` -╔═══════════════════════════════════════════════════════════════╗ -║ DEMO PERFORMANCE METRICS ║ -╠═══════════════════════════════════════════════════════════════╣ -║ ║ -║ EFFIZIENZ-GEWINNE HEUTE ║ -║ ├─ Anrufe bearbeitet: 127 (AI) vs 76 (Traditional) ║ -║ ├─ ⌀ Bearbeitungszeit: 2:45 Min vs 8:30 Min (-68%) ║ -║ ├─ Erstlösungsquote: 82% vs 45% (+37%) ║ -║ └─ Kundenzufriedenheit: 4.8/5.0 vs 4.2/5.0 ║ -║ ║ -║ KOSTEN-EINSPARUNG (Hochrechnung Monat) ║ -║ ├─ Reduktion Anrufminuten: 2'850 Min = CHF 8'550 ║ -║ ├─ Vermiedene Vor-Ort-Einsätze: 45 = CHF 8'100 ║ -║ ├─ Reduktion Wiederanrufe: 130 = CHF 3'900 ║ -║ └─ TOTAL: CHF 20'550 / Monat ║ -║ ║ -║ ROI-BERECHNUNG ║ -║ ├─ Investition: CHF 180'000 ║ -║ ├─ Monatliche Einsparung: CHF 20'550 ║ -║ ├─ Break-Even: 8.8 Monate ║ -║ └─ 3-Jahres-ROI: 343% ║ -║ ║ -╚═══════════════════════════════════════════════════════════════╝ -``` - -#### SZENE 6: Weitere Use Cases (2 Min) - -**MODERATOR:** -"Das war ein technisches Problem. Lassen Sie mich kurz zwei weitere Szenarien zeigen:" - -**[QUICK DEMO 1: RECHNUNGSFRAGE]** -- AI erkennt Rechnungsfrage -- Ruft automatisch Rechnungsdaten ab -- Erklärt Positionen -- Bietet Zahlungsoptionen -- Zeit: 90 Sekunden - -**[QUICK DEMO 2: NEUKUNDENANFRAGE]** -- AI führt Bedarfsanalyse durch -- Empfiehlt passendes Produkt -- Vereinbart Beratungstermin -- Sendet Informationsmaterial -- Zeit: 3 Minuten - -#### SZENE 7: Q&A und Next Steps (3 Min) - -**MODERATOR:** - -"Zusammengefasst bietet unser AI Support System: - -**SOFORTIGE VORTEILE:** -✓ 24/7 Verfügbarkeit in 4 Sprachen -✓ Keine Wartezeiten mehr -✓ Konsistente Service-Qualität -✓ Automatische Dokumentation -✓ Proaktive Problemlösung - -**STRATEGISCHE VORTEILE:** -✓ Skalierbarkeit für Wachstum -✓ Wertvolle Dateneinblicke -✓ Mitarbeiter-Entlastung für komplexe Fälle -✓ Wettbewerbsvorteil im Markt -✓ Kundenbindung durch Excellence - -**NÄCHSTE SCHRITTE:** - -**Phase 1: Pilot (Woche 1-2)** -- Setup Test-Umgebung -- Integration mit 1 CRM-System -- Training mit 500 historischen Fällen -- Test mit 10 internen Mitarbeitern - -**Phase 2: Beta (Woche 3-6)** -- Erweiterung auf 50 Pilotkunden -- Parallelbetrieb mit traditionellem System -- Kontinuierliche Optimierung -- Mitarbeiterschulung - -**Phase 3: Rollout (ab Woche 7)** -- Schrittweise Aktivierung nach Regionen -- Vollintegration aller Systeme -- Marketing-Kommunikation -- Vollbetrieb ab Q2 2025 - -**INVESTITION:** -- Initialkosten: CHF 180'000 -- Laufende Kosten: CHF 5'000/Monat -- ROI: 8-9 Monate -- Erwartete Einsparung Jahr 1: CHF 246'000 - -Haben Sie Fragen?" - -**[RAUM FÜR FRAGEN DER GL]** - ---- - -## 4. Technische Requirements für Demo - -### 4.1 Minimal Viable Product (MVP) - Technologie Stack - -#### Frontend Komponenten -```javascript -// React-basiertes Agent Dashboard -- React 18.x mit TypeScript -- Material-UI für Komponenten -- WebSocket für Real-time Updates -- Chart.js für Analytics -- React Router für Navigation - -// Beispiel-Komponente -interface TicketProps { - id: string; - customer: Customer; - priority: 'high' | 'medium' | 'low'; - aiSuggestions: AISuggestion[]; -} - -const TicketView: React.FC = ({ - id, - customer, - priority, - aiSuggestions -}) => { - // Implementation -}; -``` - -#### Backend Services -```python -# Python FastAPI Backend -from fastapi import FastAPI, WebSocket -from typing import Optional -import asyncio - -app = FastAPI() - -# Beispiel-Endpunkte -@app.post("/api/calls/incoming") -async def handle_incoming_call(call_data: CallData): - # Twilio Webhook Handler - ai_response = await process_with_ai(call_data) - return create_ticket(ai_response) - -@app.websocket("/ws/dashboard/{agent_id}") -async def dashboard_websocket( - websocket: WebSocket, - agent_id: str -): - # Real-time Dashboard Updates - await websocket.accept() - while True: - ticket = await get_new_ticket() - await websocket.send_json(ticket) -``` - -#### AI & Voice Integration -```yaml -# Konfiguration -voice_services: - twilio: - account_sid: ${TWILIO_ACCOUNT_SID} - auth_token: ${TWILIO_AUTH_TOKEN} - phone_numbers: - - "+41 61 755 88 99" - - speech_to_text: - provider: google_cloud - language_codes: - - de-CH - - fr-CH - - it-CH - - en-US - - text_to_speech: - provider: amazon_polly - voice_id: Marlene # Deutsch - neural_voice: true - - nlp: - provider: openai - model: gpt-4 - temperature: 0.3 - max_tokens: 500 -``` - -### 4.2 Infrastruktur-Requirements - -#### Cloud Services -- **Hosting**: AWS oder Azure (Schweizer Rechenzentrum) -- **Telefonie**: Twilio mit Schweizer Nummern -- **Database**: PostgreSQL 14+ (managed) -- **Cache**: Redis für Session-Management -- **Storage**: S3 für Recordings -- **CDN**: CloudFlare für Assets - -#### Sicherheit & Compliance -- **Datenschutz**: DSGVO/DSG-konform -- **Verschlüsselung**: TLS 1.3 für alle Verbindungen -- **Backup**: Tägliche Backups, 30 Tage Retention -- **Monitoring**: 24/7 mit Datadog oder New Relic -- **PCI DSS**: Für Zahlungsinformationen - -### 4.3 Demo-Umgebung Setup - -#### Quick Setup Script -```bash -#!/bin/bash -# BWT AI Demo Setup - -# 1. Environment Setup -echo "Setting up BWT AI Demo Environment..." - -# 2. Docker Containers -docker-compose up -d postgres redis - -# 3. Database Migration -python manage.py migrate - -# 4. Load Demo Data -python manage.py loaddata demo_customers.json -python manage.py loaddata knowledge_base.json - -# 5. Start Services -npm run build-dashboard -python -m uvicorn main:app --reload & -npm start & - -# 6. Twilio Configuration -python configure_twilio.py - -echo "Demo Ready at: http://localhost:3000" -echo "Phone Number: +41 61 755 88 00" -``` - -#### Demo-Zugänge -``` -Admin Dashboard: -- URL: https://demo.bwt-ai.ch/admin -- User: admin@bwt.ch -- Pass: Demo2025! - -Agent Dashboard: -- URL: https://demo.bwt-ai.ch/agent -- User: m.schneider@bwt.ch -- Pass: Agent2025! - -Test-Telefonnummer: -- +41 61 755 88 00 (Demo-Line) - -API Endpoints: -- https://api.demo.bwt-ai.ch/docs -``` - ---- - -## 5. Implementierungsplan - -### Phase 1: Analyse & Design (Woche 1-2) -- **Woche 1** - - Requirements-Workshop mit Stakeholdern - - Prozessanalyse aktueller Support - - Systemarchitektur-Design - - Technologie-Evaluation - -- **Woche 2** - - UI/UX Design Mockups - - API-Spezifikationen - - Datenschutz-Konzept - - Test-Szenarien Definition - -### Phase 2: Development Sprint (Woche 3-6) -- **Woche 3-4: Core Development** - - Voice AI Integration - - Backend Services - - Database Setup - - Basic Dashboard - -- **Woche 5-6: Integration** - - CRM-Anbindung - - E-Mail Service - - Knowledge Base Import - - Testing & Bugfixing - -### Phase 3: Pilot-Betrieb (Woche 7-10) -- **Woche 7-8: Internal Testing** - - Mitarbeiter-Training - - System-Optimierung - - Performance-Testing - - Security Audit - -- **Woche 9-10: Customer Beta** - - 50 Pilotkunden - - Feedback-Sammlung - - Iterative Verbesserung - - Dokumentation - -### Phase 4: Rollout (Woche 11-12) -- **Woche 11: Soft Launch** - - Regional begrenzt - - Support-Team bereit - - Monitoring aktiv - -- **Woche 12: Full Launch** - - Schweizweiter Betrieb - - Marketing-Kampagne - - Erfolgs-Messung - -### Projekt-Team -``` -Projektleitung: -- 1x Projektmanager (100%) -- 1x Product Owner (50%) - -Entwicklung: -- 2x Backend Developer (100%) -- 2x Frontend Developer (100%) -- 1x AI/ML Engineer (100%) -- 1x DevOps Engineer (50%) - -Business: -- 1x Business Analyst (100%) -- 1x UX Designer (50%) -- 2x Support Agents für Testing (50%) - -Gesamt: 8-10 Personen für 12 Wochen -``` - -### Budget-Übersicht -``` -Personalkosten (12 Wochen): CHF 120'000 -Lizenzen & Services: CHF 30'000 -Infrastruktur: CHF 15'000 -Unvorhergesehenes (10%): CHF 15'000 ----------------------------------------- -Total Projekt: CHF 180'000 - -Laufende Kosten/Monat: CHF 5'000 -- Twilio: CHF 1'500 -- Cloud Services: CHF 2'000 -- Lizenzen: CHF 1'000 -- Wartung: CHF 500 -``` - -### Erfolgs-Metriken - -**Technische KPIs:** -- System-Verfügbarkeit: >99.5% -- Response-Zeit: <2 Sekunden -- Anruf-Erfolgsrate: >95% -- AI-Accuracy: >85% - -**Business KPIs:** -- Erstlösungsquote: >80% -- Kundenzufriedenheit: >4.5/5 -- Cost per Contact: -50% -- Agent-Produktivität: +60% - -**Nach 3 Monaten Review:** -- ROI-Analyse -- Skalierungs-Plan -- Feature-Roadmap -- Expansion (Deutschland/Österreich) - ---- - -## Anhang A: Glossar - -**AQA**: Markenname BWT für Wasseraufbereitungsprodukte -**AQA confiance**: Service-Abonnement-Modell -**°fH**: Französische Härtegrade (Wasserhärte) -**WFI**: Water for Injection (Pharma-Standard) -**Regeneration**: Reinigungsprozess Enthärtungsanlage -**Bypass-Ventil**: Umgehungsventil für Wartung -**Harzbett**: Ionenaustauscher in Enthärtungsanlage - -## Anhang B: Kontakte - -**BWT Projektteam:** -- Projektleitung: [Name] -- IT-Leitung: [Name] -- Service-Leitung: [Name] -- Marketing: [Name] - -**Externe Partner:** -- AI-Beratung: [Firma] -- Implementierung: [Firma] -- Telefonie: Twilio -- Cloud: AWS/Azure - -## Anhang C: Referenzen - -- BWT Website: www.bwt.com/de-ch -- Support-Hotline: 061 755 88 99 -- E-Mail: info@bwt-aqua.ch -- Dokumentation: [Internes Wiki] - ---- - -*Dieses Dokument wurde erstellt für die Geschäftsleitungspräsentation vom 24.09.2025* -*Version 1.0 - Vertraulich* \ No newline at end of file diff --git a/mandates/hemagnova/fragebogen und antworten KI-Analyse_Hemag_Nova_AG 20251027.docx b/mandates/hemagnova/fragebogen und antworten KI-Analyse_Hemag_Nova_AG 20251027.docx deleted file mode 100644 index 4fe6514..0000000 Binary files a/mandates/hemagnova/fragebogen und antworten KI-Analyse_Hemag_Nova_AG 20251027.docx and /dev/null differ diff --git a/mandates/hemagnova/mailinfo 20251030.txt b/mandates/hemagnova/mailinfo 20251030.txt deleted file mode 100644 index 6744f26..0000000 --- a/mandates/hemagnova/mailinfo 20251030.txt +++ /dev/null @@ -1,11 +0,0 @@ -Lieber Jaska - -Vorab danke für das offene, unkomplizierte Kennenlernen. -Wir wollte euch bewusst losgelöst zuhören und Fragen stellen. - -Wir senden euch asap das Protokoll und anschliessend unser Vorschlag -fürs Vorgehen. Ich als eCommerce und Digitalisierungs-Unternehmer -würde mich sehr freuen, gemeinsam den Weg anzupacken. - -Gruss aus Stettbach -Dominic diff --git a/mandates/hemagnova/meeting transscript 20251029.txt b/mandates/hemagnova/meeting transscript 20251029.txt deleted file mode 100644 index 68d91ae..0000000 --- a/mandates/hemagnova/meeting transscript 20251029.txt +++ /dev/null @@ -1,257 +0,0 @@ -KI-Strategie HNO mit Dominic Largo ValueON AG -Mi., 29. Okt. 2025 - -0:02 - Unidentifizierter Sprecher -Tag miteinander! - -0:04 - Dominic Largo -Grüezi miteinander! - -0:06 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Guten Tag miteinander! - -0:10 - Unidentifizierter Sprecher -Ich höre dich, tipptopp, ja! - -0:15 - Unidentifizierter Sprecher -So! - -0:16 - Unidentifizierter Sprecher -Sehr gut! - -0:18 - Dominic Largo -Der Kollege kommt gleich, Patrick. Immer Kopf höher! - -0:28 - Unidentifizierter Sprecher -Dominic, so sieht man sich schon wieder. - -0:43 - Dominic Largo -Es war lustig am Freitag. - -0:54 - Dominic Largo -Guten Tag. - -0:56 - Unidentifizierter Sprecher -Guten Tag zusammen. - -0:58 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Sehr gut. - -0:59 - Dominic Largo -Ihr denkt vielleicht beide seid eine kleine Vorstellungsrunde, vielleicht noch kurz. Willst du schon schnell in deiner Sitze anfangen? Ja, also mein Name ist Jaska Gref. - -1:16 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Ich bin CEO von HEMA Genova und Innsbruck. Jetzt seit ein bisschen mehr als anderthalb Jahren und wir sind in der Firma in einer Transformationsphase vom Eigentümer geführten zum Management geführten Unternehmen. Stark wachsendes Unternehmen und ich darf das Unternehmen führen in dieser Phase und wir haben letztes Jahr 34 neue Mitarbeiter engagiert. - -1:47 - Dominic Largo -Super. Ich sehe gleich Jetzt hören wir aber keinen mehr. Mein Name ist Stefan Meiler. - -2:22 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Ich bin Teil der Inhaberfamilie. Ich durfte das Unternehmen in den letzten 15 Jahren aufbauen und weiterentwickeln. Ich habe einen technischen Background, bin gelernter Applikationsentwickler und bin momentan am loslassen und das Unternehmen in die operative Führung zu übergeben. Das kann seine Geschäftsleitungen, die heute in diesem Change-Prozess sind. - -3:07 - Unidentifizierter Sprecher -Wunderbar. - -3:08 - Unidentifizierter Sprecher -Danke. - -3:08 - Schaefer, Dirk Alexander -Dann mache ich weiter. - -3:12 - Schaefer, Dirk Alexander -Ich bin der Dirk. Meine Rolle im Unternehmen ist CITO. Das heißt, ich kümmere mich um sämtliche Belange von Technik, IT und dergleichen. Darf das im Unternehmen mittlerweile seit über sechs Jahren tun und habe durchaus eine mega spannende Zeit erleben dürfen. - -3:33 - Unidentifizierter Sprecher -Besonders zu hören, wer hier seid und was hier macht. - -3:38 - Picardi, Mario -Ja, hallo, mein Name ist Mario. Ich bin Gardi, bin seit Januar dabei im E-Commerce Bereich. Ich freue mich auf den Call, auf allgemein auf die Adventure, die wir haben bei Magnova. - -3:56 - Patrick Motsch -Mein Name ist Patrick Motsch, ich bin seit 25 Jahren bei Valion als Gründer dabei gewesen. Wir haben angefangen mit Projektgeschäften, digitalen Transformationen. Dann einige Dekade später ist KI als Hype neu dazugekommen. Jetzt aktuell Integrationen von Automatisierungen und KI-Lösungen. Mein Hintergrund, ich bin ursprünglich Bauingenieur, komme gar nicht von der IT. Ich habe dann aber neben der Bautätigkeit mir auch das ganze IT-Know-how definitiv mit Kundenprojekten aneignen. Ich konnte ein Datacenter konzipieren, planen, Zürich Nord mit internationalen Providern. Ich habe das Glück, mit verschiedenen Kulturen, verschiedenen Ländern zusammenarbeiten mit den Integrationen bei verschiedenen Kunden. Meine Leidenschaft ist Produktarchitekturdesign und Umsetzung. Mein Name ist Bas Bonodist. - -4:46 - Dominic Largo -Ich bin seit 30 Jahren im Unternehmertum tätig, mit ein paar Ausweichern. Vorher war ich langjährig im E-Commerce-Bereich. Ich kann euch nachfühlen, was ihr so erlebt und macht mit der ganzen Logistik und der Thematik der Koordinatisierungen. Losenbericht tätig sind und habe den größten Teil meiner Unternehmen verkauft. Ich war übrigens auch bei Magento und Jobware Software unterwegs und habe die ganze Automatisierung selber begleitet, um nachher zu unternehmen. So weiter geht das Startup. VariOn seit eineinhalb Jahren als Nachfolgerlösung. Ich bin es jetzt auch am drücken, zusammen mit Patrick und anderen Kollegen. Wir sind ein Team von acht, neun Leuten fix und eine Menge Freelancern, die Expertise brauchen. Und agiere so ausschliesslich auf Kabelbasis schweizweit. Wir haben eine Digitalisierung, Integrationen, die ich als Eisbergsempfehlung sehe, wirklich gerade oben im Spitzen, aber die Fahrt geht unten ab, dass es wirklich gross wird. Und dann nehmen wir es eigentlich auch für alle Interbranchen tätig, also für die Textilindustrie bis zum Sport. Wir erleben wirklich viele Sachen und schlussendlich kann ich schon mal vorwegnehmen, es geht allen Jeder fährt mal an, macht Batterien und irgendwie probiert man das zusammen auf eine Journey zu bringen, die verdaubar ist, Spass macht und das Hunger nehmen markantlich weiterbringt und etwas abwirft. So, kurz gesagt. Danke für das Papier, das ich mir durchlesen durfte und das wurde ergänzt, Jasko. Das ist sehr cool, da wusstest du, was Sache ist. Das spricht bei sich aus dem Herzen, das war die Anforderung, weil das entspricht so mehr oder weniger dem, was wir leben. Ich zeige euch ein Beispiel, wie man eine einzige Folie einblendet, als Basis, als Anlehnung, damit ihr seht, wie das Ding angeht. Wir nehmen zwei Seiten. Das ist Patrick Gänzberger, hinten ist auf der linken Hand Valion mit dem ganzen Consulting-Bereich, aber auch mit dem Kai-Bereich, wo man Sachen aufbaut, wo man von Inspiration Integration, kurz gesagt, begleitet. Wir haben eine Schweizseite, die auch in dieser Region kam, mit grosser Freude. Uns ist wichtig, dass es von oben nach unten, hinten nach vorne stimmt. Das ist in den meisten Fällen, aufgrund von dem, was man liest, nicht wirklich der Fall. Wir versuchen das wirklich konsequent zu überziehen auf Augenhöhe. Und das ist auch das, was wir ein bisschen geschätzt haben, den Meritus. Wir sind unabhängig, neutral. Wir sind nicht an einen Azure, Microsoft oder irgendjemanden angehängt. Das ist ganz wichtig. Damit wir auch Lösungen dort packen, wo sie Sinn machen und wo sie keinen Sinn machen wollen. Auf der anderen Seite, hier im roten Bereich, wir haben keine Anwendungen, wir haben selber eine Akademie aufgebaut, ganz in Schlank, wo man das kennt, das Wissen, das natürlich vorhanden ist, aber sehr fragmentiert. Dann sagen wir LLM-Spieleabfragen, die sehr gut sind und wertvoll sind, aber wir weiten natürlich nicht die ganzen Dinge abgedeckt, was es kann. Und das andere ist die Expertise selber am Team abzudecken, was es wirkt, um die Themen genauer zu guide, was ist, wo hat es überhaupt Potenzial, wo macht es Sinn, wo macht es nicht Sinn, wie guide man, was löst man ab, bei welchem Zeitrahmen und so weiter. Und dort würden wir gerne mal noch ein bisschen von eurer Seite den Ball rüberspielen und sagen, wo seht ihr die Themen aufgrund von Papieren vielleicht ein bisschen konkret, aus den einzelnen Bereichen heraus, was Faktor Mensch Es geht nicht darum, was heute wirklich die Herausforderungen sind. - -8:36 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Der grösste Vorteil ist, dass es strategisch verankert wird. Dass man nicht irgendwo einfach anfängt im Niemandsland und sich irgendwo wiederfindet nach einem Jahr, zwei, drei, nach ganz vielen KI-Projekten und merkt, oh, da hat man etwas gebaut, das nicht ineinander verflüsst, nicht einen roten Faden hat. Das ist eine Herausforderung, die wir haben. Dann, glaube ich, ist es auch eine Herausforderung, mit IT-Lehrern KI zu machen, weil wir sind schon in einem sehr hohen Automatisierungsgrad. Aber was kann die KI mehr als das, was wir bis jetzt schon gemacht haben? Und das, glaube ich, ist etwas Neues, was wir bei uns jetzt aufnehmen und auch vielleicht einen anderen Input haben oder einen anderen Input brauchen von aussen, um zu sagen, hey, das, was wir gemacht haben, ist gut, aber was kann eine KI mehr bieten in dem täglichen Alltag, den wir haben? Nebst der JGPT, die unsere Mitarbeiter sollen es nutzen, wie sollen sie es nutzen usw. Da sind wir auch schon die ersten Schritte am Machen. Aber strategische Verankerung, was tun wir, was haben wir für einen Plan, das ist sehr herausfordernd im Alltagsgeschäft, dass man das noch nebenbei hat, dass man sich die Zeit nimmt und die Chancen wahrnehmen kann, die Chancen sieht und auch einen Investmentplan Das ist eine der krasssten Herausforderungen. - -10:37 - Dominic Largo -Wo müssen wir aufpassen? Willst du etwas zu den Geheimdaten sagen, Patrick? - -10:44 - Patrick Motsch -Jaska, du triggerst mir den Punkt, wenn du sagst, dass wir irgendwo anfangen und dann nach drei Jahren nicht mehr nach dem Land laufen können. Wir haben bereits negative Erfahrungen gemacht und auch IT hast du angesprochen. Habt ihr schon Übungen gemacht, bei denen ihr irgendetwas gemerkt habt oder entsprechende Feedback erhalten habt? Das würde mich vor allem wundern, auch von der HR-Seite oder von der GL generell. Habt ihr Übungen gemacht, bei denen ihr Feedback erhalten habt? Das würde mich wundern. Oder starten wir auf den grünen Wiesen? - -11:22 - Schaefer, Dirk Alexander -Du meinst jetzt speziell im Sinne von KI? - -11:25 - Schaefer, Dirk Alexander -Ja, genau, mit KI-Themen. - -11:26 - Schaefer, Dirk Alexander -Also ich denke, wenn ich an dieser Stelle mal kurz darf, ich möchte auch kurz einen Gummi nach vorne machen. Zu den Ausführungen von Jaskar. Jetzt ist es besser. Es ist zum einen natürlich die Situation als solche KI, das muss ich euch wahrscheinlich hier nicht erzählen, dass viele überrannt, aber die Unternehmen auf einmal sind sich mit etwas konfrontiert, wo du dich erst einmal in die Knie musst und dann trotzdem wahrscheinlich noch ein riesiges Risiko das genau in die Richtung geht, wie die JASCA skizziert. Auf der anderen Seite ist es aber auch so, dass wir als Unternehmen extrem IT-driven sind. Wir sind sehr stark auf Automation aus und da kommt KI natürlich jetzt wirklich wie der Deckel, der auf den Topf drauf passt, noch on top dazu. Wir bauen momentan für unsere Verhältnisse wirklich sehr, sehr große Business-Plattformen, die mittelfristig allumfänglich und allumfassend sein wird, was unsere Aktivitäten anbelangt, mit Headless-Design und Shop-Anbindung und App und Schlag mich tot und überhaupt beginnen beim PIM bis hin zur ERP-Integration. Das ist natürlich ein Riesenthema, wo kann man da drin von KI profitieren und das vielleicht identifizieren, bevor man es anders gebaut hat. Und was für mich aus der IT ganz, ganz wichtig ist, bei derart großem Thema, was auch immer wir tun, wir brauchen einen strategischen Partner, der mit uns die Reise beginnt und auch fortführt. Und der in der Lage ist, mit uns zu wachsen und mit uns zusammen das Schiff in die Richtung zu führen, wo wir einfach bestmöglich von der ganzen Thematik schlussendlich profitieren können. Ob das jetzt ein Chatbot ist im Kundendienst für den User auf dem Webshop oder ob das irgendein Einkaufsvorschlag oder was weiß ich was ist. Da gibt es ja hunderttausend Möglichkeiten, oder? Aber die ganze Reise, die wo wir zusammen anfangen, die wir gemeinsam weiterführen. Ich denke, das ist wirklich key bei dieser Geschichte. - -13:32 - Unidentifizierter Sprecher -Danke Dirk. - -13:33 - Patrick Motsch -Danke für genau diese Ausführung, weil ich vom Herzen gelegen habe, das zu spüren. Dominic, zeige mal die anderen Folien. Was ich euch gerne zeigen möchte, ist auch gerne, ihr habt etwas offenbart, ich möchte euch offenbaren, was wir erleben, wenn wir bei den Kunden draussen sind. Wir werden vielfach geholt. - -13:54 - Unidentifizierter Sprecher -Ein Bereich ICT oder auch Compliance Sicherheit. - -13:57 - Patrick Motsch -Das steht, wo wir meistens angefragt werden, ob die Leute einen Datenschutz bedenken. Auf der einen Seite. Auf der anderen Seite spürt man, dass KAI einem viel Arbeitsautomatismus wegnimmt. Es sind Ängste. Vielfach auch bei den Leuten. Was passiert denn da? Habe ich dann meinen Job nicht mehr oder übernimmt KAI am Schluss die ganze Prozesskette? Und wie läuft das, wenn man Daten zurückspielt? Kontrolliert das auch noch jemand? Das ist meistens der Aufhänger, in den wir reinkommen. Und mir sind zwei, drei strategische Statements an diesem Punkt wichtiger, die ich erlebt habe. Das Erste ist, die KI hat als Letztes mit der IT zu tun. Da spüre ich direkt gut. Die IT ist eines der zentralen Teile in dieser Prozesskette, die mitwirkt. Aber der Journey von ganz, ganz, ganz Es ist ein Journey, den man gemeinsam macht und KI kommt meistens erst nach der Automatisierung. Und wo viele viel Geld verloren haben und viel Zeit ist, dass man schnell zu viel will. Und so wie der Hype das gesehen ist, ich hoffe auch, der Hype ist unterdessen ein bisschen abgeschlachtet, man hat das Gefühl, KI macht einem alles. Macht viel, aber wie das bei vielen Automatisierungsthemen ist, wenn man es richtig anwendet. Und was wir vielfach sehen ist, es sind zwei Teile, die nicht sind oder fehlen. Das erste Teil ist, das Asset von KI ist Daten. Es sind keine Applikationen, es sind keine ERP-Systeme, es ist kein SAP, es ist kein Excel oder etwas. Ist Daten und zwar Verfügbarkeit von Daten und Nutzung von Daten. Die haben natürlich in letzter Konsequenz auch wieder mit IT zu tun, dass man die bereitgestellt hat, aber es ist ein Business-Thema. Was wollen wir erreichen mit denen? Und ich glaube, was man da mitnehmen kann, ist, dass man das Hinterste davon oder nicht 10. Davon heisst, wir fangen am Ziel an Was wollen wir denn am Schluss haben? Also ist es zum Beispiel, wir wollen ein Tasteport haben von unserer Produktivität. Das triggert, welche Daten brauche ich für Produktivität und das wiederum triggert, woher kommen denn die Daten? Und immer dann, wenn wir über Daten reden, ist es natürlich DSV, GSGO, dann ist die ganze Datenschutzthematik. Wenn die Daten zu K eingehen, was passiert mit denen? Werden die gebraucht zum Trainieren? Haben wir sensitive Informationen? Wie gehen wir mit denen um? Ich glaube, das ist mal Themenbereich, der ist mir wichtig. Wenn man den von Anfang an richtig einspurt, dann läuft man auch nicht zu weit. Das kennen wir auch, das haben wir auch selber gespürt mit den Kunden, das 2-3 Jahre Thema. Man schaut es an wie eine Applikation, dass man die entwickelt und baut und die ist dann einmal fertig. Vielleicht macht sie dann das, was man will, aber vielleicht ist die Firma dann schon viel weiter, weil die Zyklen werden kürzer und die KI entwickelt sich alle drei Monate weiter. Also die schlechte KI, die wir haben, ist die von heute. Also das ist, dann ist es wichtig und darum die Folien, die haben wir gemacht, die habe ich gerne, dass man sagt, man hat möglicherweise ganz viele Use Cases, ganz viele Themen, wo man das Gefühl hat, hey, da könnt ihr uns keine helfen. Und wenn man die hat, dann fängt man mit einem an Und einer heisst, von Anfang bis Schluss. Konkretes Beispiel, vielleicht wändert das das mal da, um Produktivität zu sehen. Dann geht es darum, woher kommen die Daten? Die Daten werden bereitgestellt, die werden in einem Automatismus publisht und man kann mit denen etwas machen. Was ich auch gesehen habe, ist, KI wird vielfach überbewertet. Viele Themen lassen sich alleine schon mit Automatisierung machen, wenn man es automatisiert. Und KI kommt nachher oben drauf. Das wären die zwei, drei wichtigsten Headlines, die ich sehe. Rein strategisch auch, dass man es richtig einspürt, dass man nicht zu viel Energie braucht, um in eine Bereitung zu gehen. Dann zum Thema JGPT. Ist mit zwei Bereichen disruptiv. Einerseits direkt bei Mitarbeitern, Jeder kann privat zuhause spielen, in allen Belangen. Man kann Bilder machen, Video. Man kann Psychologen haben, die einem helfen, Beziehungen usw. Das betrifft jeden. Und keine ist disruptiv in den Prozessen. Und das ist eigentlich das erste Mal seit vielen Dekaden, seit der letzten Revolution, als das Internet aufkam, das ist das erste Mal, dass eine neue Technologie kommt, die uns an zwei ganz, ganz verschiedenen Bereichen berührt. Mich als Mensch, und auch unsere Unternehmung. Ich glaube, die Aufgabe einer Geschäftsleitung und auch eines Verwaltungsrats ist, dass es ein Journey beim Business ist und nicht bei der IT. Die IT ist nicht zum Zweck, verstehe mich nicht falsch. Ich hoffe, dass du das nicht sagst. Aber die IT ist schlussendlich eine Unit zusammen mit der Compliance, die sehr zentrale Rollen übernimmt bei der Automatisierungsreise. Aber die Spielregeln und die Logik müssen von oben kommen. - -18:29 - Dominic Largo -Du hast gesagt, du hättest schon gewisse Sachen betrachtet, wie die Events-Analysen, Lagerprognosen usw. Was habt ihr dort schon gemacht und wenn ja, wo steht das? - -18:43 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Vielleicht kurz zum Hintergrund, dass ich operative Geschäftsleitung habe. Gemutlich bin ich nicht mehr so fest involviert und kann mich so ein bisschen an andere Themen und ein bisschen rumspielen und so weiter. Das haben wir auch in der letzten Zeit gemacht. Ein bisschen rausprobieren, rumprobieren. Egal ob das mit KI Browser ist oder NIDN oder verschiedene Sprachmodelle austesten und so weiter. Was ich einfach sehe ist, wir müssen unsere Daten besser nutzen. Aktuell, völlig ohne KI, haben wir BI-Lösungen, also ein paar BI-Lösungen im Einsatz. Man hat schon sehr viel gesehen, sehr viel analysieren können. Aber um Gaps zu finden oder Potenziale in diesen Daten zu entdecken, wenn es nicht Charts sind und so weiter, da könnten wahrscheinlich drei Leute den ganzen Tag diese Charts anschauen und herausfinden, welchen Kunden niemand bestellt hat. Meine Grundsatzidee ist ja eigentlich, Ich sehe es so, dass wir bleiben müssen. Ich komme mit einem technischen Background daher, habe aber auch viel Business gemacht. Ich glaube, ich kann beide Teile relativ gut miteinander kombinieren. Aber ich sehe es als Herausforderung. Es geht nicht darum, dass unsere Mitarbeiter anfangen, ein Jet-JPG zu nutzen. Das ist sicher auch ein Teil der Journey. Wir brauchen eine Basis-Infrastruktur, wo wir dann darauf aufsetzen können. Also wo gehen die Daten hin aus unserem ERP-System und unserem Shop-System oder PIM-System oder Versand-System oder weiss nicht was. Dass wir dann auch eine zentrale Datenbasis haben, wo wir dann die KI oben draufsetzen können und dann anfangen, das nutzbar zu machen. Das ist für mich so eine technische Grundlage, wo wir eigentlich arbeiten müssen und ich sehe das Wenn wir jetzt entscheiden, wir können ein ERP-System einführen oder eine neue PIM-Software oder weiss ich was. Also wir müssen evaluieren, was gibt es denn da für mögliche Lösungen. Weil ich glaube, wenn wir uns entscheiden, wir schaffen jetzt eine Lösung XY, wo die Daten alle drin sind, dann können wir über den Monat einfach schnell wechseln auf eine andere Plattform. Und ich glaube, wir müssen Aus meiner Sicht, in den ersten Schritten, wirkt überhaupt mal eine Lösung an, dass wir die Daten überhaupt verfügbar machen können. Und wenn wir die Daten verfügbar haben, also die Rohrdaten, hast du davor auch angesprochen, die Qualität unserer Daten, die ist okay, die wird aktuell stark verbessert über BI, Stammdaten, Kontrollberichte, die alle Abteilungen bekommen, um die Daten zu verbessern, zu verfeinern, zu säubern. Und ja, das ist meine aktuelle Sichtweise, dass manche auf der Datenseite eigentlich relativ gut dastehen, aber sicher das eine oder das andere werden wir optimieren müssen. Also wenn es darum geht, keine Anerkeiserszenarien gibt es wahrscheinlich ganz viel, aber ich sage jetzt mal, was mich momentan am meisten so ein bisschen, wo ich die grösste Herausforderung sehe, sind so Preise. Also wir haben 6'000 Artikel in unserem System und da haben wir B2B. B2C-Preise und jetzt sollten wir vergleichen mit unseren Mitbewerbern. Wie können wir das machen? Aus technischer Sicht weiss ich dann, wir brauchen eine Datenbank und eine Vektor-Bilder-Datenbank, die man über einen Agenten automatisieren kann, ohne dass wir ein Mapping haben, den man vergleichen kann. Aber wir haben diese Datenbasis, die ist zwar hier noch nicht in einem System, das wir dann integrieren können. Da bin ich dann auch so ein wenig, wenn nicht eng komme, schaue ich, Sie kann man dann verschiedene Datenbanken anbinden und so weiter. Aber wie das richtig läsig ist, weiss ich auch nicht. Für mich sind wir ganz am Anfang auf einer Journey, wo wir eine Basis schaffen müssen, auf die wir aufsetzen können. Das ist meine Sichtweise. Jetzt könnt ihr mir vielleicht kommentieren. Du bist noch gemutet. - -23:07 - Patrick Motsch -Jetzt kann ich sagen, ich kann es einfach kommentieren. Exakt. Das ist die zwingend unerlässliche Grundlage, die es braucht. Wie auch immer man das technisch ausführt, da bin ich genau bei der Ein-Nach-Denn übrigens, hat man einen Nachteil, den darf man in dem Sinne nicht kommerziell nutzen, ist dann, denke ich, veroperativ, aber ist völlig egal. Es gibt ganz viele andere Plattformen, die das auch können. Technisch problemlos lösbar, aber es ist so, diese Grundlage braucht es. Das ist der technische Layer, den man einfach machen muss, unbestritten. Jetzt obendrauf hilft es. Wenn man weiss, was man mit den Daten macht. Ich spüre das und ich hoffe es. Ich habe hoffentlich ganz, ganz viele Use Cases. Ganz viele Themen, die man damit machen könnte. Und da wäre es jetzt wichtig, zu priorisieren. Priorisieren würde ich in dem Sinn, was bringt wie viel Mehrwert und wie schnell. Also etwas, das nach drei Jahren Mehrwert bringt, das wäre mir mal ganz weit hinten. Es muss etwas sein, das sehr schnell, innerhalb von Monaten, realisierbar ist. MVP-Thema, also Minimal Viable Product, und wo euch echt ein Business-Mehrwert bringt. Darum habe ich das vorhin schon angesprochen mit Chachipiti, das ist eine Hassliebe von mir. Chachipiti ist lustig, da kann ich ein wenig spielen und bekomme ein paar Texte über. Erstens ist es nicht integriert und ich weiss nicht genau, welchen Mehrwert das bringt. Also mir als Mensch vielleicht tonte ich, bin ich schneller, aber integriert in einer Unternehmung bringt das nur Pein im Moment, es bringt auch nicht einmal Mehrwert. Mehrwert bringt es dann, wenn es irgendwie eingebunden wäre. So ein Mechanismus. Und das meine ich damit, wenn ihr z.B. Sagt, jetzt nehme ich das Beispiel, ihr habt ganz viele Berichte von den Preisen und vielleicht auch Daten von anderen Firmen, die Preise haben. Da ist KI natürlich mächtig, dass sie mit einem Schlag grosse Datenmengen vergleichen kann und vor allem KI ist stark darin, Musterfehler zu erkennen. Also z.B. Grosse Abweichungen oder Spezialitäten. Die brauchen Menschen ganz viel Zeit und viel Nerven, da kann man effizienter sein. Dass man diese Use Cases herausfindet, die mit wenig Aufwand viel bringen. Da werdet ihr wahrscheinlich ein Paar haben. - -25:10 - Dominic Largo -Wir nehmen wahrscheinlich die Sicht vom E-Commerce, Mario. Du bist ja am jüngsten dabei. Ja, richtig. - -25:17 - Picardi, Mario -Was brennt denn dort so? Also brennt, ich denke mir, der Tragische an, was die Herausforderung ist im Allgemeinen. Für mich ist immer so, ich fange eigentlich auf dem ersten Die grösste Herausforderung ist die Verunsicherheit des ganzen Menschen, Akzeptanz im ganzen Unternehmen, Vertrauen in das Arbeiten. Das ist ein ganz wichtiges Thema für mich. Vor allem auch die Verunsicherung bei den Mitarbeitern, wenn man sagt, wir wollen jetzt alles automatisieren, wir wollen alles KI, wir wollen vieles KI, sondern es ist eine Unterstützung Und ich denke, es ist nicht ein Mensch ersetzen. Immer noch. Es gibt einfach wirklich zum Helfen. Es ist alles da, um den Leuten, den Mitarbeitern im ganzen Workflow einen Mehrwert zu schaffen, der ihnen auch hilft im ganzen Prozess. Und ich denke, Kommunikation ist sehr, sehr wichtig. Eine offene Kommunikation im Unternehmen, transparent sein und überhaupt Selbstvertrauen in die Technologie. Strategie im Fokus, nicht alles was glänzt ist Gold. Ich denke, es ist wichtig, sinnvoll einzusetzen. Man muss schon wissen, wo man es genau einsetzt. Nicht alles ist wichtig, zumindest im Moment. Man muss schon wissen, was man priorisiert. Das hast du auch ganz kurz erwähnt, Patrick. Ich denke, die technische Basis, die Datenintegration, Das ist ein wichtiger Punkt, die Daten. Technische Grundlage. Darf ich noch etwas ergänzen? Noch ganz schnell, aus meiner Sicht. - -27:29 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Ich glaube, die Situation ist jetzt nicht, dass ich sage, okay, mega cool, dass wir morgen live stellen oder weiss nicht was, weil es alle davon reden, sondern ich glaube, Ich sehe das mehr als eine langfristige Nachhaltigkeit. Also etwas, das in Zukunft immer besser und mächtiger werden wird. Also lasst uns jetzt in diesen Bereich investieren, damit wir in zwei oder drei Jahren, wenn die Kais noch viel mehr können, dann schon absolut ready sind, um die Dinge zu adaptieren, die wir effektiver nutzen werden. Es geht jetzt nicht darum, dass wir mit KI Personal sparen, sondern wir wollen mit KI besser und effizienter arbeiten als unsere Mitbewerber. Wir wollen schneller sein, wir wollen vielleicht günstiger sein, man weiss nicht was. Ich glaube, die Use Cases müssen sich im Detail herauskristallisieren. Klar gibt es auch gerne einen Jetbot. Ein KI-Telefonagent oder ein Preisroboter oder whatever. Das ist mein Manko, dass ich aus dem Technischen komme. Für mich ist es wie ein Step by, wir brauchen eine KI-Basis-Infrastruktur, auf die wir aufsetzen können. Wir suchen nach Partner oder Consultants, die uns sagen können, es gibt Lösungen A, B, C, D, E. Da sind Vorteile, da sind Nachteile, die entwickeln sich so und die entwickeln sich so und mit dem jetzigen heutigen Stand ist eigentlich das der Way-to-go, dass man ein bisschen eine Guideline bekommt. Man will nicht einfach zu irgendeiner kleinen Agentur gehen, die eigene Agentenlösungen programmiert und codet und sagt, ja, wir machen das mit dem. Und wenn wir dann den Use Case 2 haben, wo etwas ganz anderes ist, Können wir das nicht mehr umsetzen, weil die nur auf einen Bereich spezialisiert sind? Das ist meine Sichtweise auf dem langfristigen Horizont. Für mich ist der USGS wie dem Organ 100% klar, solange wir nicht die Basis haben, können wir eh nichts umsetzen. - -30:00 - Dominic Largo -Sehr cool, ich stelle mir das voll in den Triangel. Ich kann strategische Leitplanken schaffen auf Thema KI, Strategisch versucht man auch mehr. Das ist in diesem Bereich die ganze Wissens-Transformation, die langfristig mitschwingt. Du siehst dann alles, deine Use-Case-Hauserkäste, was man macht, sodass man immer strategisch eingebettet ist. Aber man weiss, in welchen Richtsätzen man geht. Man kann die Dinge vergleichen, wenn man sowieso nicht in das LLM betritt. Da gibt es so viele Möglichkeiten. Manchmal sage ich, etwas sei genial, oder etwas brauche ich überhaupt nicht. Ich kann es nicht mehr auf Sichtweite spielen, Ja, aber wie gesagt, der Mecca kommt B2B, B2C, weil man die Bücher braucht. Einerseits braucht man den Handelsaspekt, also den Detailhandel, den man dort bedienen kann. Wahrscheinlich einen grösseren Teil oder einen kleinen Teil an Online-Shops. Das ist alles operativ Dinge, die man erwartet. Aber in Summe finde ich, hat man einen wirklich coolen Zeitpunkt, wo man den Gedanken hat, den man sich verdanken muss, um dort aufzubauen. Und das ist genau das Geheisse. Das machen wir normalerweise in Form von Workshops und Zusammensitzungen, um wirklich auszukristallisieren Was ist, wo haben wir es wirklich, und zwar physisch, face to face, dass man so spürt, wo die Sache ist im Umgang. Und dann fangen wir an, herauszudürfeln. Wir sagen, wenn wir jetzt das machen können, sagen Sie irgendetwas. Im Hohlen Buchhaus in zwei, drei Monaten kriegen wir da einen kleinen Case hin, wo man nach dem Aufsetzen einbauen kann, den Lerneffekt auf einer Know-how-Basis für die Mitarbeiter usw. Und dann geht man so und so die Journey ein nach dem anderen an Aber strategisch muss man verankert sein, und dafür arbeitet man eigentlich gerne, klare Grundlagen, dass wir alle wissen, wo es hingeht. Der Weg dazu hat meistens ein Parcours, je nach technischen Entwicklungen, aber dann haben wir Klarheit. Das ist das, was ich gerne hier wieder vertreten würde, als Basis für das Ganze. - -31:57 - Schaefer, Dirk Alexander -Für mich sind das momentan eigentlich zwei Pfeiler. Thema A gehen muss und ich konsolidiere ein wenig das Gesagte. Ich gehe übrigens nicht ganz d'accord, dass KI so weit weg ist von der IT, das wäre ein bisschen anders, aber das ist ein Randthema. Wir müssen auf der einen Seite Daten bereitstellen, ein Data Lake schaffen, whatever, und das auf eine dergestalt generische Art und Weise, dass es für eine Basisinfrastruktur gereicht, damit wir herkommen mit unserer Daten und auf der anderen Seite müssen wir cases definieren und definieren heißt in aller erster linie mal identifizieren und davor kommt normalerweise innovieren wir müssen es nämlich erst mal einfallen bevor wir bis identifiziert und dann skizziert und dass man auch ein mvp machen und so ich denke das ist klar oder aber ich glaube was wir wirklich brauchen ist brauchen wir brauchen ein partner der von beider seiten zu unterstützen kann der technologie stack basis infrastruktur nennt es wieder wie und auf der anderen Seite das Potenzial zu erkennen und in Use Cases zu gießen und auszuarbeiten und mit uns zusammen auch die Reise zu gehen. So wie wirklich für mich jetzt Use Case A, B, C basierend auf dem Datapool, den wir gebaut haben. - -33:13 - Unidentifizierter Sprecher -Wie auch immer das heisst noch, oder? - -33:16 - Schaefer, Dirk Alexander -Und ich in weiterer Rolle wünsche mir natürlich, dass wir nicht irgendein x-beliebiges Tool aus dem Internet benutzen, wo wir nachher genau das geht daran, wenn wir es austauschen wollen, sondern dass wir das so angehen, dass wir da möglichst flexibel bleiben oder auch wenn wir Teile austauschen wollen. Aber ja, für euch als Agentur die Reise miteinander gehen, Use-Case identifizieren, Technologie-Stack aufbauen und dann erste Projekte fahren, das ist eigentlich alles meiner Meinung nach. - -33:49 - Patrick Motsch -Genau so. - -33:50 - Patrick Motsch -Und zwar auch mit dem Thema schnell Konnektoren wenn wir auf das Niveau gehen. Ich glaube, ohne ein grosses Rocket-Science-Betrieb, da bin ich voll bei dir von der IT, da kann man natürlich schon mal das Thema richtig angehen mit einer Plattform, egal mit welcher Technologie man sich die anlacht, dass man zum Beispiel nur schon alle Lieferanten, wo man einbindet, über Konnektoren einbindet, generisch, sodass, wenn einer ändert, wenn er nicht siebenmal nur noch anpassen muss im ganzen Modell. Das sind Architekturüberlegungen, natürlich IT voll basic, wenn man die Richtung macht, dann ist man schon mal richtig eingespurt, dass man nachher Flexibilität hat. Was mir vielleicht noch wichtig ist vom Beratungsansatz, das ist eine neue Richtung gespürt bei euch, das würdet ihr gerne verstehen. Es gibt zwei Level von Beratung. Das einzige ist, da kommt ein LLM-Anbieter und sagt, ich bin der mit dem besten LLM. Der andere Ansatz ist, es kommt ein Berater und kennt LLMs und weiss, wie man welche kann integrieren, welche welche Stärken und Schwächen haben, welche für was man kann brauchen und so weiter. Auf dem Niveau sind wir die Wir sind nicht Anbieter von Fynbi. Genau, weil die ändern alle drei Monate. Da haben wir auch unterdessen eine Karte, wie die Pfeiler, zum Boden ausschiesst und wieder gehen. Unser Niveau ist genau dort. Wir sitzen auf dem Prozess, schauen, wer unterstützt den, wer lebt schon wie lange, wer lebt vielleicht später nicht mehr. Wie muss man so eine Plattform generisch bauen, damit man flexibel ist, um die einbinden und wieder rausschiessen zu können. Und auf der anderen Seite, dass man Flexibilität hat in der Datennutzung. Von den Konnektoren. Auf der Seite 90 gibt es eine ganz grundsätzliche Überlegung, wie man Daten einbinden möchte. Neben dem, dass man ERP und andere Systeme hat, hat man auch Daten der User. Also ich meine damit SharePoint, Outlook auf der Microsoft-Umgebung oder wenn wir Google haben, zum Beispiel Google Drive. Diese Konnektoren kann man auf zwei Arten einbinden. Entweder macht man durch Backdoor diese Connections, dann stellen sich so Fragen wie, wenn jetzt keine Daten abgreift, mit welcher Berechtigung? Oder man löst es durch Frontdoor, dass man nämlich jeweil User mit seinem User-Account auf datenlos schickt, dann hat man mit einem Schlag Berechtigungslogik gerade erledigt und auch Verantwortlichkeitslogik. Das ist die Flaughöhe, wo wir uns bewegen und ich spüre jetzt heraus, Datenschutz, Datensicherheit, Compliance ist bei mir einfach so Thema Number One jetzt seit Monaten, weil wenn man das einmal richtig löst, und das ist 100% IT, wenn man das einmal richtig löst, ist man aufgestellt für die nächsten 10 Jahre. - -36:11 - Patrick Motsch -Genau, genau. - -36:12 - Schaefer, Dirk Alexander -Genau um solche Sachen geht es schlussendlich. Also es ist wunderbar, wenn man irgendwie einen tollen Technologie-Stack hinstellt und dann hat man die ersten Erfolge und so weiter, oder? Und dann haben wir alle Freude. Aber wenn uns das nachher eben genau wegen sowas um die Ohren fliegt, dann haben wir einfach vorab schnell gemacht. - -36:35 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Aus meiner Sicht ist auch noch so ein bisschen, wenn man einen Stack hat und sich nicht was kann man jetzt automatisieren? Also ich sage jetzt mal, gewisse E-Mail, die können schon anfangen hier rumzuklicken, Programme und so weiter, wo man eigentlich manuelle Tasker automatisieren kann, also manuelle Bestellfreigabe oder whatever. Aber was ich so ein bisschen als Challenge gesehen habe ist, wenn es darum geht, diese Use Cases, also wenn man die mal hat, also man muss nur ein Prozesswissen haben, also wie funktioniert der Prozess aktuell, wie ist der automatisiert, wer was macht, zu welchem Zeitpunkt. Dort sehe ich einen Gap. Wer macht das bei uns? Fakt ist, dass das übergeordnete Prozesswissen über die ganze Unternehmung immer noch bei mir verankert ist. In dieser kurzen Zeit wurde es nicht im Betrieb breit gestreut. Dass wir dort mit Expertisen herausfinden, jemanden, der für die Identität die Verzertifizierung von den möglichen KI-Einsatzbereichen auch zuständig ist und auch Kapazitäten hat. Jemand, der analysieren kann, welchen Prozess wir haben, welche sind aufwendig, wieviel Zeit brauchen die, ist das überhaupt mit KI möglich, um die Entscheidungen zu treffen und das entsprechend umzusetzen und zu automatisieren. Für mich ist die Frage, was braucht man dann auch für die Zukunft für ein neues Personal. Brauchen wir noch einen Data Analyst, der zuschafft, dass die Daten bereitgestellt sind, dass die Daten hohe Qualität haben und genutzt werden können. Brauchen wir einen Mitarbeiter, der sich auf KI-Lösungen spezialisiert. Brauchen wir noch einen Prozessmanager, der sich tief in die Prozesse einarbeiten kann und zusammenbringen und herausfinden kann, nutzen. Die Frage bei mir ist, wie wir uns ressourcetechnisch darauf stellen, dass wenn wir die Strategie fahren, in die richtige Richtung gehen und investieren, dass wir dann auch das maximale Resultat herausholen können. Ich glaube nicht, dass das etwas ist, was man by the way zusätzlich betreiben kann. - -38:58 - Unidentifizierter Sprecher -Definitiv nicht. - -38:59 - Dominic Largo -Es ist etwas, was auf einem strategischen Ansatz basiert, also keine Strategie, Fahrt- und Prozesslandschaft wenn man Leistungsverständnis auseinandernimmt. Du sagst, wo will was, wie, wo braucht es was. Aufgrund von dem merkt man, ob etwas fehlt oder nicht. Aber das merkt man, wenn man Zeit hat. Wir treffen häufig solche Sachen. Wir haben mal ausgeschrieben, dass wir eine Datenidee brauchen. Aber die wissen gar nicht, ob es stimmt. Und Daten, was ist, wir auch nicht. Das ist ein Teil des Journeys, wo relativ am Anfang kommt, dass man weiss, was ist Prio, was nicht. Und das ist das von euch, was wir jetzt auch herausstellen. - -39:38 - Patrick Motsch -Ich glaube, vielleicht auch hier ein Element, das uns extrem hilft unter der SSC Balder Major ist, dass wir diese Art von Entscheidungsvorbereitung auch mit KI machen. Also gerade eine Digitalstrategie, eine IT-Strategie, eine KI-Strategie im Verbund, die haben ja Zusammenhänge miteinander, die referenzieren aufeinander. Was wir dort machen, wir nutzen dort auch KI, konkret Cursor, nutzen wir dort, um die Dokumente zu produzieren. Das heisst, alle Besprechungen, die wir haben, mit Transkript. Alle Fragen, die wir haben, speisen wir hinein und lassen Kai uns die Dokumente schreiben als Vorschläge. Das heisst, wenn wir einen nächsten Workshop haben zu diesen Themen mit einem Kunden. Früher wären wir reingegangen und haben mit Leuten Vorgespräche gemacht, dann musste man das abstimmen usw. Heute kehren wir es um. Heute holen wir alle Leute mit allen engsten Fragen Inputs ab, produzieren die drei Strategien, lassen Kai uns Summary machen, gehen mit ihm ins Meeting mit offenen Punkten, die uns auch Kai bringt, z.B. Inkonsistenzen oder Grundsätze, oder Prozessfragen. Und am Workshop selber klären wir nur die offenen Themen. Lassen sie wieder von KI neu dokumentiert werden. Und so, nach ein, zwei Runden, haben wir abgestimmte Dokumente. Natürlich geschrieben durch KI, aber effektiv durch Menschen. Intelligenz ist der Mensch darin. Und so sparen wir viel Arbeit. Und die Qualität von denen, kann ich heute sagen, ist massiv höher. Also ich glaube, das wäre auch ein Instrument, wenn du sagst, Stefan, neue Ressourcen oder einen Prozessmanager, der müsste sich auch wieder einschalten. Er braucht auch wieder Zeit, er muss alles kennenlernen. Ich würde mich jetzt schon noch die Frage stellen, bevor ich jetzt neue Kapazitäten hole, oder sind es eher, dass ihr mit der Unterstützung von solchen Werkzeugen vielleicht einfacher zusammenarbeiten könnt, dass ihr die ganze Doku machen lasst? - -41:18 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Nur ein kleiner Nippel fällt mir jetzt gleich auf, wegen dem Staffing. Also ich meine, wir haben hier noch einen stillen Zuhörer im Meeting oder den Read-Eye-Meeting-Assistenten. Ihr könnt das alles in die AI reinhauen und dann das mal beurteilen. - -41:35 - Patrick Motsch -Und ihr kommt es auf jeden Fall rüber, ganz wichtig. - -41:41 - Patrick Motsch -Und wir geben euch alles mit, weil ihr müsst es auch haben. - -41:47 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Was ich herausgespürt habe ist, wo ist eure Expertise ganz konkret im Bereich von Aufbau und Basisinfrastruktur. Wie viele verschiedene Produkte kennt ihr, wie viele verschiedene Lösungen, best practice, Vorgehen und so weiter. Habt ihr Erfahrungen in einem Unternehmensumfeld ähnlich gross wie wir, also 50 bis 60 Leute? Ja, also es ist wie so ein bisschen, was wir auch brauchen ist so ein bisschen, dass ihr uns sagen könnt, wir haben die und die und die Erfahrungen gemacht in eurem Betriebsumfeld und das wäre eigentlich Das ist das Payback, das man am besten durchspielt. Und dass man den Partnern, die uns auf der Reise begleiten. - -42:32 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Vielleicht darf ich hier einhaken. - -42:34 - Dominic Largo -Danke für die Frage. Ja, definitiv. Erstmal machen wir seit 25 Jahren mehr oder weniger nichts anderes als die Firma. Letztes Jahr kamen wir zusammen. Jetzt sind wir wirklich auf das fokussiert, auf die Gebiete. Häufig geht es auf Leitungsnische, so wie ihr es auch seid. Es geht wirklich um die Branche. Auf einer ganz gesunden Grösse, weil es sich warm macht, wenn wir durcharbeiten. Wir gehen nicht über den Big Five und Konkurrenzieren. Das war nie das Ziel. Das wird auch nie das Ziel sein, weil es uns auch keinen Spass macht. Aber kompetent ausserwärts haben wir sehr, sehr viel Beweis und Expertise, wie man online anfangen kann, wo man Referenzen abgeben kann. Wir spielen tagtäglich in dieser Grösse der Liga mit Leuten, die vorwärts laufen. Wir haben auch in Ostschweiz ein paar gefunden, ähnliche Grösse zwischen 40, 100, 150 Gase maximum und dann die Journey. Wichtig ist, wir sind die Typen, die sagen, wir machen eine Journey zusammen. Wichtig ist, dass das Wissen aufgebaut wird und nicht verschwindet. Dort, wo es uns braucht, ja. Dort, wo es Wissen generiert, auch. Dort, wo es Plattformen macht zum Testen, haben wir auch zur Verfügung. Aber der Primo ist der Paar, der sagt, jetzt müssen wir das und das verwenden. Das müssen wir situativ, pro Case durchschreiben. Und es gibt so eine breite Palette, die man dann eindämmt und sagt, guck, ich glaube, diese drei, vier Tools und Themen sind geeignet. Das vor und nach dann abwägen. Dann sagen wir, guck, das ist die Chance, die wir haben. Das ist auch schon häufig mit Kosten verbunden, was man einsetzt. Aber wie gesagt, je nachdem, ob umgeblich oder eingebettet, was man dann sieht, macht man es dann relativ schlank umsetzen. Das ist eigentlich ganz einfach die Übung. Und dort sind wir, dort sind wir mit. Was wir vielleicht noch zum Follow-up Ich sehe die Leute relativ schnell physisch. Das ist mir persönlich sehr wichtig. Ich würde gerne an Patrick kommen, um das erste Mal abzutasten und die Inhalte zu unterscheiden. Das machen wir meistens in Form von Halbtagesworkshops, die wir zusammen vorbereiten. Ich gehe rein bei der Fragestellung und rausgebe einen klaren Plan. Wie es Patrick vorher erklärt hat, wir arbeiten sehr geeingestützt im Alltag. Mit diversen Top-Produkten, die man zugreifen kann. Wichtig ist, dass man die Maxima profitieren kann und relativ rasch im Unternehmen in die DNA anknüpft. - -45:04 - Unidentifizierter Sprecher -Sonst bringt sich nichts. - -45:07 - Dominic Largo -Das ist das Wichtigste am Ganzen, die Brauchbarkeit. - -45:13 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Ich bin im sehr weit vorgeschritten, was das anbelangt. Also ich habe jetzt erst gerade ein CAS abgeschlossen im KI-Management und dort einen Use Case auch in der Diplomarbeit drin. Also wieso kommen wir heute hier zusammen? Das ist eigentlich ein bisschen das Wetter von Stefan, der sagt, es geht nicht irgendeinen Weg, wo wir nicht alles zum ersten Mal noch auf den Tisch gelegt haben. Ich glaube, es ist wichtig, dass wir es schaffen, Vertrauen zu schaffen, einerseits beim VRP in das, was wir tun, in das, was wir vorhaben und gleichzeitig, wir haben x Projekte am Laufen, also wir sind wirklich in einem grossen Wandel im Unternehmen. Der Chatbot am Kundendienst ist entstanden durch meine Weiterbildung, durch das, dass ich gesagt habe, was ist einfach und schnell umsetzbar, mit wenig Geld, uns den ersten möglichen Case, wo wir auch Erfahrungen sammeln können. Und ja, jetzt sind wir in der Innovationsphase von Partnern, die uns auf diesem Weg nochmal begleiten, nochmal anders begleiten, in dem Sinn, zu sagen, hey, ja, wir gehen nochmal zwei Schritte zurück, bevor wir jetzt mit dem Partner, den wir eigentlich für den Use-Case ausgesucht haben, den Schritt machen. - -46:33 - Dominic Largo -Also, wenn ich gerade reingehe, darf ich Sie begrüssen durch den Schritt zurück. Stefan, wenn ihr schon weit seid, dann machen wir es wirklich richtig, richtig. Also best fit, die du haben magst. Und dann gibt es genug Use Cases. Das hat fast Harry und Dirk schon schön gesagt. Das ist alles mit der Zeit und den Ressourcen verbunden. Das ist nicht einfach so, wir gehen mal rein und jetzt musst du zur Hälfte vom Tag da sein und du musst für drei Monate 10 Patienten von dir Das müssen wir wirklich sehr, sehr schön planen, damit wir den Alltagsprozess nicht stören. - -47:11 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Ich glaube, das ist wichtig und wir sind ja auch bereit, den Schritt so zu machen. Ich denke, es ist wichtig für alle miteinander, dass wir da das gleiche Verständnis im Unternehmen entwickeln. Wir sind bereit und offen für Veränderungen. Wir sind in einer Veränderung, aber wir möchten auch in all den Cases, die wir sonst haben, dass wir ganz viel im E-Commerce-Bereich, wo wir aufgebaut sind, wo wir uns diese Frage immer wieder stellen müssen und fragen, wo wir noch KI reinnehmen können. Wo macht es Sinn, dass KI ein Teil des Ganzen ist, was wir hier aufbauen, gerade im Moment. Und gleichzeitig aber auch, dass wir in unseren Bereichen, wo wir im Moment am Arbeiten sind, einfach mit KI unseren Mitarbeitern Hilfsmittel an den Tag legen können, damit sie besser arbeiten können. - -47:58 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Noch einmal eine Frage. - -47:59 - Dominic Largo -In was arbeitet ihr aktuell mit Magenta im E-Commerce? Was habt ihr alle, also Adobe? - -48:05 - Picardi, Mario -Nein, wir haben Magento, genau. Wir sind jetzt mit einer Agentur dran, Magento 1 und Magento 2, auf die neue Technologie. Und nebenbei sind wir auch noch einmal mit einer Agentur, Bambit, die in Bern ist, für den PIM. Und ja, für einen zukünftigen Webstream auch noch. Das hat Dirk ganz am Anfang auch erwähnt. - -48:35 - Dominic Largo -Spannend, dass wir so viel erfahren. Es ist wirklich spannend. Wir funken schon ein bisschen, es ist sehr dynamisch. Wir sind ja im VSV überall drinnen und kennen uns im Verband, es geht wirklich einiges. Aber auch das Thema Web-Scrolling, um Trends abzupacken, Preisvergleich zu machen, Konkurrenz abzuscrollen, Plattformen abzuscrollen, das ist alles sehr neu. Auch bei euch, was hilft, das Pricing, also Dynamic Pricing schon fast gut zu steuern und in den Griff zu haben, all diese Themen. Mir macht es schon ein wenig Freude vom Setup des Businesses. - -49:16 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Ja, es wird auch alles ein wenig Zeit brauchen, oder? Aber ich sage mal, bis das Team fertig ist und wir im Magento den Upgrade haben usw. Da wird auch noch ein bisschen Zeit vergehen, oder? Aber bis wir eine KI-Basisplattform bereitgestellt haben, dauert es wahrscheinlich auch eine Weile, oder? Und was ich einfach sehe, ist, dass man eigentlich alle Daten von allen Systemen zentralisieren muss, dass es nicht so darauf ankommt, ja, schau mal, ist die Artikelinfos im PimNord oder im ERP oder in einem anderen System, sondern dass all diese Daten verschickbar sind, oder? Und das ist jetzt ein bisschen das, wieso ich das eingeleitet haben bei diesem JetBot-Projekt, weil man gewisse Systeme angebunden hat und die anderen waren etwas ausservor. Ich bin mir auch nicht sicher, ob es die Lösung ist, die der Partner angeboten hat. Sind wir dann an diesen gebunden? Müssten wir die alles individuell programmieren und konfigurieren, wenn wir neue Use Cases haben? Das ist der Grund, weshalb ich gesagt habe, lass uns lieber zuerst mit ein paar Consulting-Firmen sprechen, die aus der Erfahrung sagen können, So und so gehen am besten vor, wenn wir das strategisch verankern und auch nachhaltig und langfristig nutzen. Es ist nicht erwartungshaltig, dass es morgen Mehrwert- oder Kostensenkung mit sich bringt, sondern auf der langfristigen Seite, dass wir KI-ready werden. - -50:43 - Dominic Largo -Aber wo versteht man das Bestandteil des ganzen Journeys? Jetzt gehört es zum Hotel, der Vorfahrt, oder mit E-Commerce-Wagen? Das sind die Daten. Das ist der erste Schritt, damit man weiss, was man damit machen kann und wo man es noch besser nutzen kann. Was wir euch bieten können, ist ein Vorgehensvorschlag, basierend auf dem, was Patrick kurz und lein gesagt hat. Und das andere ist mit dem Wernstuhl und der Empfehlung, dass wir zusammen in der Wölscher Party ein Tisch holen und das einladen. Und wirklich das KI-Verständnis zu entwickeln und zu sagen, hey, wenn wir das, das haben wir gefordert, und jetzt gehen wir, jetzt brechen wir den Eisberg mal ein bisschen, jetzt sind wir zwar schon in Bohnen, das ist der nächste Ding, jetzt geht es mal da ein bisschen tiefer hin und her. Ja. Mehr Zeit übrigens schon beschritten, sorry. - -51:43 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Macht, ich weiss nicht, wenn jemand was zusagt, ein Nachmeeting hat. Aber ich glaube, es ist wichtig, dass wir uns die Zeit nehmen. Ich persönlich habe mich gefreut, dass wir überhaupt über dieses Thema reden, dass wir uns überhaupt in diesem Thema bewegen, dass wir bereit sind mit dem VRP, dass wir nicht einen 80-jährigen VRP haben, der irgendwie das Gefühl hat, ja, was machen die jetzt eigentlich, sondern dass er mitschwänzt, dass wir ihn abholen können, dass er bereit ist, Geld zu sprechen. Das ist auch wichtig für solche Themen. Ich bin der Letzte, der Ich möchte etwas selbst umsetzen. Ich habe eine andere Rolle im Unternehmen. Wir werden das im Unternehmen anschauen müssen, wer was macht. Meine Aufgabe ist am Schluss die, dass wir gewinnbringend die Unternehmen weiterentwickeln können. Wenn wir das Teil zum jetzigen Zeitpunkt mitnehmen können, dann ist das das Richtige gemacht. Vor einem halben Jahr wären wir noch nicht bereit gewesen, so tief in dieser Materie Ich würde vorschlagen, dass ihr im Anschluss an das Meeting eure AI-Antwortwissen zuhören lasst. - -52:51 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Wir werden das intern auch noch besprechen und dann können wir auf euch zuhören, wie wir das weitere Vorgehen sehen und ob wir in einen Workshop gehen wollen. - -53:09 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Ja, also ich glaube, wie gesagt, wir haben einen Partner für einen Case direkt, wo wir im Moment den Kontakt finden. Da haben wir mal gestoppt. Und ja, ich glaube, es muss allen jetzt die Chance geben, um zu zeigen, was wir mit uns vorgehen werden. Und dann müssen wir irgendwo im Gremium einen Entscheid treffen. Und vielleicht geht man auch mit zwei ein nächster Step, das kann ja auch sein und man kann ja auch Expertisen miteinander verbinden, je nachdem. Aber das müssen wir miteinander entscheiden dann am Schluss, hier und da die richtigen Schritte gehen können mit diesen Partnern. - -53:51 - Unidentifizierter Sprecher -Perfekt. - -53:51 - Dominic Largo -Als wichtiger Punkt und bis zum Nachrücken, schnell, wir sind ja nicht jemand, der ein Produkt umsetzt, wohl verstanden, wenn schon begleitet wird, bei der Umsetzung des Partners, sonst ist der Partner völlig frei, wichtig ist, dass er stimmt, ganz klar. Wichtig ist, das Unternehmen zusammen mit der Herzfluss-Verantreibung. Ob es Partner X oder Y ist, das ist meistens eine chemische Frage, wie eine inhaltliche Frage. Wie funktioniert das? Von dem her ist das eine, von dem her die andere Überhandung. - -54:22 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Aber da könnt ihr uns auch unterstützen und uns sagen, mit den Firmen, mit denen wir schon viel geschafft haben, funktioniert es gut und die und die können ganz innige Einhörner, die hier unterwegs sind. Keine Ahnung, einfach, dass wir nicht in die falsche Richtung von Anfang an gehen. Genau. - -54:43 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Ja, also ich glaube, wir brauchen Sicherheit, dass wir strategisch im Unternehmen vorankommen können und auch einen Plan haben für das nächste Jahr, wo sehen wir uns? Wo sehen wir die Entwicklung, die Reise, die wir machen möchten? - -55:00 - Conference Room (Graef, Jaska Jaakko) - Speaker 2 -Einen Reiseplan brauchen wir. - -55:03 - Dominic Largo -Ich glaube bei so einer Zusammenarbeit ist immer die Offenheit und im Sinne der Offenheit einfach zum Sommer ganz klar machen. - -55:22 - Schaefer, Dirk Alexander -Wir sind jetzt in einer potenziellen Partner Evaluation. Das heisst, wir führen jetzt solche Gespräche, wo wir basierend auf unseren Eindrücken schlussendlich schauen, wie viele davon wir für die nächste Runde nehmen. - -55:42 - Schaefer, Dirk Alexander -Einfach, um ganz ehrlich und offen zu sein. - -55:46 - Dominic Largo -Herr Räcker, passt? Wir schmeissen die Notizen, die wir haben, über die Uhr. Wir sind ja nicht so weit schiessisch auseinander, also stellt einfach die Bedarfe und antwortet. Er wohnt im Triangel und würde bis Mitte Jährigstwoche etwas schicken, ganz kurz und gemeint, vorgehend zur Diskussion. Dann könnt ihr mit uns sagen, ob ihr was und wie möchtet. Ist das eine gute Frage? - -56:20 - Unidentifizierter Sprecher -Ja, Dominic, danke. - -56:22 - Dominic Largo -Die Fragen würden wir klopfen können. - -56:26 - Conference Room (Graef, Jaska Jaakko) - Speaker 1 -Super, danke vielmals. - -56:28 - Dominic Largo -Dankeschön für die Zeit und einen schönen Abend. \ No newline at end of file diff --git a/mandates/pek/datenmodell/PEK Datenmodell.md b/mandates/pek/datenmodell/PEK Datenmodell.md deleted file mode 100644 index 61c2e67..0000000 --- a/mandates/pek/datenmodell/PEK Datenmodell.md +++ /dev/null @@ -1,558 +0,0 @@ -# Datenmodell Architektur-Planungs-App - -## Übersicht - -Dieses Datenmodell bildet die Grundlage für eine Schweizer Architektur-Planungs-App zur Verwaltung von Bauprojekten, Parzellen, Dokumenten und regulatorischen Kontextinformationen. - -## Datenfluss-Diagramm - -```mermaid ---- -title: Hauptflüsse - Architektur-Planungs-App ---- -flowchart TD - Start([Datenmodell Start]) - - subgraph Admin[Administrative Ebene] - Land[LAND
Schweiz] - Kanton[KANTON
z.B. Zürich] - Gemeinde[GEMEINDE
z.B. Zürich Stadt] - Land --> Kanton - Kanton --> Gemeinde - end - - subgraph Geo[Geografische Daten] - Parzelle[PARZELLE
Grundstück mit
Bauparametern] - GeoPunkt[GEO_PUNKT
Koordinaten] - Gemeinde --> Parzelle - Parzelle --> GeoPunkt - end - - subgraph Core[Kern-Business-Logik] - Projekt[PROJEKT
Bauprojekt] - Dokument[DOKUMENT
Dateien & URLs] - Projekt -.Perimeter.-> Parzelle - Projekt -.Dokumente.-> Dokument - Parzelle -.Dokumente.-> Dokument - end - - subgraph Support[Unterstützende Daten] - Kontext[KONTEXT
Zusatzinfos] - Projekt --> Kontext - Parzelle --> Kontext - end - - Start --> Admin - - style Land fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Kanton fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Gemeinde fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Parzelle fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style Projekt fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style Dokument fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style GeoPunkt fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff - style Kontext fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff -``` - ---- - -## Alle Datenobjekte als Tabellen - -### Übersichtstabelle - -| Objekt | Typ | Beschreibung | Hauptfelder | -|--------|-----|--------------|-------------| -| **Projekt** | Hauptentität | Bauprojekt mit Status und Perimeter | id, label, statusProzess | -| **Parzelle** | Hauptentität | Grundstück mit Bauparametern | id, label, bauzone, AZ, BZ | -| **Dokument** | Hauptentität | Dateien und URLs mit Versionierung | id, label, typ, format | -| **Land** | Admin | Nationale Ebene | id, label | -| **Kanton** | Admin | Kantonale Ebene mit Baurecht | id, label, Baureglement | -| **Gemeinde** | Admin | Gemeinde-Ebene mit BZO | id, label, plz, BZO | -| **GeoPunkt** | Hilfsobjekt | 3D-Koordinate im LV95 | x, y, z, referenzen | -| **Kontext** | Hilfsobjekt | Flexible Zusatzinformationen | id, thema, inhalt | -| **Tag** | Enum | Dokumentkategorien | - | -| **GeoTag** | Enum | Geopunkt-Kategorien | - | -| **JaNein** | Enum | Drei-wertiger Status | "", "Ja", "Nein" | -| **StatusProzess** | Enum | Projektstatus | 7 Werte | - ---- - -## Zentrale Entitäten - -### 1. Projekt -**Das Kernobjekt, das ein Bauprojekt repräsentiert.** - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Projektbezeichnung | -| `statusProzess` | Array[Enum] | - | Projektstatus: Eingang, Analyse, Studie, Planung, Baurechtsverfahren, Umsetzung, Archiv | -| `perimeter` | Array[Parzelle] | - | Betroffene Parzellen (n:m Beziehung) | -| `dokumenteBauherrschaft` | Array[Dokument] | - | Dokumente vom Bauherrn (n:m Beziehung) | -| `dokumentePlanung` | Array[Dokument] | - | Planungsdokumente (n:m Beziehung) | -| `geoBaulinie` | Array[GeoPunkt] | - | Baulinie als Polygonzug (1:n Beziehung) | -| `kontextInformationen` | Array[Kontext] | - | Projektspezifische Kontextinfos (1:n Beziehung) | - -**Beziehungen:** -- **n:m** zu Parzelle (Perimeter über `projekt_parzelle`) -- **n:m** zu Dokument (Bauherrschaft über `projekt_dokument_bauherrschaft`) -- **n:m** zu Dokument (Planung über `projekt_dokument_planung`) -- **1:n** zu GeoPunkt (Baulinie) -- **1:n** zu Kontext - ---- - -### 2. Parzelle -**Repräsentiert ein Grundstück mit allen baurechtlichen Eigenschaften.** - -#### Grunddaten - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Parzellenbezeichnung | -| `parzellenNummern` | Array[String] | - | Offizielle Parzellennummern | -| `eigentuemerschaaft` | String | - | Eigentümer der Parzelle | -| `strasseNr` | String | - | Straße und Hausnummer | - -#### Geografischer Kontext - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `kontextLand` | Land | - | Land der Parzelle (n:1 Beziehung) | -| `kontextKanton` | Kanton | - | Kanton der Parzelle (n:1 Beziehung) | -| `kontextGemeinde` | Gemeinde | - | Gemeinde der Parzelle (n:1 Beziehung) | -| `geoUmfang` | Array[GeoPunkt] | - | Parzellengrenze als Polygon | - -#### Nachbarschaft - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `nachbarEigentuemer` | Array[Parzelle] | - | Selbstreferenz zu angrenzenden Parzellen (n:m Beziehung) | - -#### Schutzzonen - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `hochwasserschutzzone` | String | - | Hochwasserschutzzone (falls zutreffend) | -| `laermschutzzone` | String | - | Lärmschutzzone | -| `grundwasserschutzzone` | String | - | Grundwasserschutzzone (falls zutreffend) | - -#### Bebauungsparameter - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `bauzone` | String | - | Bauzonenbezeichnung (z.B. W3, WG2, etc.) | -| `az` | Float | - | Ausnützungsziffer | -| `bz` | Float | - | Bebauungsziffer | -| `vollgeschossZahl` | Integer | - | Anzahl zulässiger Vollgeschosse | -| `anrechenbarDachgeschoss` | Float | - | Anrechenbarer Anteil Dachgeschoss (0.0 - 1.0) | -| `anrechenbarUntergeschoss` | Float | - | Anrechenbarer Anteil Untergeschoss (0.0 - 1.0) | -| `gebaeudehoehe_max` | Float | - | Maximale Gebäudehöhe in Metern | - -#### Abstandsregelungen - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `regelnGrenzabstand` | String | - | Regelungen zum Grenzabstand | -| `regelnMehrlaengenzuschlag` | String | - | Regelungen zum Mehrlängenzuschlag | -| `regelnMehrhoehenzuschlag` | String | - | Regelungen zum Mehrhöhenzuschlag | - -#### Eigenschaften (Ja/Nein) - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `parzelleBebaut` | JaNein | - | Ist die Parzelle bebaut? ("", "Ja", "Nein") | -| `parzelleErschlossen` | JaNein | - | Ist die Parzelle erschlossen? ("", "Ja", "Nein") | -| `hanglage` | JaNein | - | Liegt die Parzelle in Hanglage? ("", "Ja", "Nein") | - -#### Weitere Informationen - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `spezifischeDokumente` | Array[Dokument] | - | Parzellenspezifische Dokumente (n:m Beziehung) | -| `kontextInformationen` | Array[Kontext] | - | Parzellenspezifische Kontextinfos (1:n Beziehung) | - -**Beziehungen:** -- **n:1** zu Land, Kanton, Gemeinde (geografischer Kontext) -- **n:m** zu Parzelle (Nachbarn über `parzelle_nachbar`) -- **n:m** zu Dokument (über `parzelle_dokument`) -- **1:n** zu GeoPunkt (Umfang als Polygon) -- **1:n** zu Kontext - ---- - -### 3. Dokument -**Verwaltet Dateien und URLs mit Versionierung.** - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Dokumentbezeichnung | -| `versionsbezeichnung` | String | - | Versionsnummer oder -bezeichnung (z.B. "v1.0", "Rev. A") | -| `typ` | Enum | ✓ | Art des Dokuments: `Datei` oder `Url` | -| `format` | String | - | Dateiformat (z.B. "PDF", "DWG", "IFC", "URL") | -| `dokumentReferenz` | String | ✓ | Dateipfad oder URL | -| `tags` | Array[Tag] | - | Kategorisierung (siehe Tag-Enum) | - -#### Tag-Enum (Dokumentkategorien) - -| Tag | Beschreibung | -|-----|--------------| -| `Kataster Objekte` | Amtliche Vermessung | -| `Kataster Werkeleitungen` | Leitungskataster | -| `Kataster Belastete Standorte` | Altlasten | -| `Kataster Bäume` | Baumkataster | -| `Zonenplan` | Zonenpläne | -| `Planungs- und Baugesetz (PGB)` | Kantonale Baugesetze | -| `Bau- und Zonenordnung (BZO)` | Gemeinde BZO | -| `Parkplatzverordnung` | Parkplatzregelungen | -| `Eigentümerauskunft` | Grundbuch-Auszüge Eigentümer | -| `Grundbuchauszug` | Vollständige Grundbuch-Auszüge | - -**Beziehungen:** -- **n:m** zu allen Entitäten, die Dokumente referenzieren (Projekt, Parzelle, Land, Kanton, Gemeinde) - ---- - -### 4. Geografische Entitäten - -#### GeoPunkt -**Repräsentiert einen 3D-Punkt im Schweizer Koordinatensystem LV95 (EPSG:2056).** - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `x` | Float | ✓ | LV95 Ostwert (E), typisch 2'480'000 - 2'840'000 | -| `y` | Float | ✓ | LV95 Nordwert (N), typisch 1'070'000 - 1'300'000 | -| `z` | Float | - | Höhe über Meer in Metern | -| `referenzen` | Array[GeoTag] | - | Kategorisierung des Punktes | - -**Verwendung:** -- Parzellenumfang (Polygon) -- Baulinie (Linienzug) -- Einzelne Referenzpunkte - -#### GeoTag (Enum) - -| Kategorie | Beschreibung | -|-----------|--------------| -| `Referenzpunkt Kat. 1` | Fixpunkt höchster Genauigkeit | -| `Referenzpunkt Kat. 2` | Fixpunkt mittlerer Genauigkeit | -| `Referenzpunkt Kat. 3` | Fixpunkt niedriger Genauigkeit | -| `Geometeraufnahme` | Vom Geometer vermessener Punkt | - -**Koordinatensystem-Beispiel (Zürich Hauptbahnhof):** -- X (Ost): 2'683'140 -- Y (Nord): 1'247'850 -- Z (Höhe): 408 m ü. M. - ---- - -### 5. Administrative Hierarchie - -#### Land - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Landesname (z.B. "Schweiz") | -| `dokumente` | Array[Dokument] | - | Nationale Gesetze (1:n Beziehung) | -| `kontextInformationen` | Array[Kontext] | - | Nationale Kontextinformationen (1:n Beziehung) | - -**Beziehungen:** -- **1:n** zu Kanton - ---- - -#### Kanton - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Kantonsname (z.B. "Zürich") | -| `dokumente` | Array[Dokument] | - | Kantonale Dokumente (1:n Beziehung) | -| `kontextInformationen` | Array[Kontext] | - | Kantonsspezifische Kontextinfos (1:n Beziehung) | -| `baureglementAktuell` | Dokument | - | Aktuelles Baureglement | -| `baureglementRevision` | Dokument | - | Baureglement in Revision | -| `bauverordnungAktuell` | Dokument | - | Aktuelle Bauverordnung | -| `bauverordnungRevision` | Dokument | - | Bauverordnung in Revision | - -**Beziehungen:** -- **n:1** zu Land -- **1:n** zu Gemeinde - ---- - -#### Gemeinde - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `label` | String | ✓ | Gemeindename (z.B. "Zürich") | -| `plz` | String | - | Postleitzahl | -| `dokumente` | Array[Dokument] | - | Gemeindedokumente (1:n Beziehung) | -| `kontextInformationen` | Array[Kontext] | - | Gemeindespezifische Kontextinfos (1:n Beziehung) | -| `bzoAktuell` | Dokument | - | Aktuelle Bau- und Zonenordnung (BZO) | -| `bzoRevision` | Dokument | - | BZO in Revision | - -**Beziehungen:** -- **n:1** zu Kanton -- **1:n** zu Parzelle - ---- - -### 6. Kontext -**Flexibles System für spezifische Informationen und Hinweise.** - -| Feld | Datentyp | Pflicht | Beschreibung | -|------|----------|---------|--------------| -| `id` | UUID | ✓ | Eindeutiger Identifier | -| `thema` | String | ✓ | Bezeichnung des Themas | -| `inhalt` | String | ✓ | Detaillierte Information (Text) | - -**Polymorphe Beziehung** - Kontext kann gehören zu: -- Projekt (n:1) -- Parzelle (n:1) -- Land (n:1) -- Kanton (n:1) -- Gemeinde (n:1) - -#### Beispielthemen (nicht abschliessend) - -| Themenbereich | Beispiele | -|---------------|-----------| -| **Nutzung** | Vorgaben zur Erdgeschossnutzung (Wohnen erlaubt oder Pflicht für Gewerbe) | -| **Rechte** | Dienstbarkeiten (Wegrechte, Nähebaurechte, etc.) | -| **Parkierung** | Anforderung Parkplätze (Berechnung / Reduktionsfaktoren) | -| **Ausnützung** | Ausnützungsübertragungen | -| **Umwelt** | Schadstoffbelastungen auf Parzellen | -| **Planung** | Aktive Gestaltungspläne | -| **Lärm** | Lärmempfindlichkeitsstufen | -| **Energie** | Mögliche Wärmenutzung (Wärmeverbundnetze; Fernwärme, Anergie) | -| **Natur** | Baumbestand auf privaten Grundstücken | -| **Schutz** | Isos (Ortsbild, Schutzstatus, Denkmalschutz, Weilergebiet, etc.) | -| **Gefahren** | Naturgefahren (z.B. Objektschutzmassnahmen (Hochwasser)) | -| **Revision** | Verweis auf aktuell in oder zukünftig in Revision befindlichen Normen/Gesetze (z.B. Revision PBG mit aktuell negativer Vorwirkung) | - -**Design-Rationale:** -Das Kontext-Objekt ermöglicht flexibles Hinzufügen von projektspezifischen, parzellen-spezifischen oder regionalen Informationen ohne Schemaänderungen. - ---- - -### 7. Hilfsentitäten & Enumerationen - -#### JaNein (Enum) -**Drei-wertiger Zustand für optionale Ja/Nein-Fragen.** - -| Wert | Bedeutung | -|------|-----------| -| `""` (leer) | Unbekannt / Nicht erfasst | -| `"Ja"` | Ja / Zutreffend | -| `"Nein"` | Nein / Nicht zutreffend | - -**Verwendung:** -- `parzelleBebaut`: Ist die Parzelle bebaut? -- `parzelleErschlossen`: Ist die Parzelle erschlossen? -- `hanglage`: Liegt die Parzelle in Hanglage? - ---- - -#### StatusProzess (Enum) -**Projektstatus zur Nachverfolgung des Projektfortschritts.** - -| Wert | Beschreibung | -|------|--------------| -| `Eingang` | Projekt wurde eingereicht | -| `Analyse` | Projekt wird analysiert | -| `Studie` | Machbarkeitsstudie läuft | -| `Planung` | Planungsphase | -| `Baurechtsverfahren` | Baubewilligung läuft | -| `Umsetzung` | Bauprojekt in Umsetzung | -| `Archiv` | Projekt abgeschlossen | - -**Besonderheit:** -Ein Projekt kann mehrere Status gleichzeitig haben (z.B. "Analyse" und "Studie"). - ---- - -#### DokumentTyp (Enum) - -| Wert | Beschreibung | -|------|--------------| -| `Datei` | Physische Datei (PDF, DWG, etc.) | -| `Url` | Externer Link / URL | - ---- - -## Beziehungsdiagramm - -``` -PROJEKT -├── perimeter [1:n] ──────────> PARZELLE -│ ├── dokumenteBauherrschaft [1:n] ──> DOKUMENT -│ ├── dokumentePlanung [1:n] ────────> DOKUMENT -│ ├── geoBaulinie [1:n] ─────────────> GEO_PUNKT -│ └── kontextInformationen [1:n] ───> KONTEXT - -PARZELLE -├── nachbarEigentuemer [n:n] ──> PARZELLE (selbst) -├── kontextLand [n:1] ──────────> LAND -├── kontextKanton [n:1] ────────> KANTON -├── kontextGemeinde [n:1] ──────> GEMEINDE -├── geoUmfang [1:n] ────────────> GEO_PUNKT -├── spezifischeDokumente [1:n] ─> DOKUMENT -└── kontextInformationen [1:n] ─> KONTEXT - -DOKUMENT -└── tags [n:n] ─────────────────> TAG - -GEO_PUNKT -└── referenzen [1:n] ───────────> GEO_TAG - -LAND / KANTON / GEMEINDE -├── dokumente [1:n] ────────────> DOKUMENT -└── kontextInformationen [1:n] ─> KONTEXT -``` - ---- - -## Junction Tables (Many-to-Many Beziehungen) - -**Zwischentabellen zur Auflösung von n:m Beziehungen:** - -| Tabelle | Verbindet | Felder | Beschreibung | -|---------|-----------|--------|--------------| -| `projekt_parzelle` | Projekt ↔ Parzelle | `projekt_id`, `parzelle_id` | Projektperimeter | -| `projekt_dokument_bauherrschaft` | Projekt ↔ Dokument | `projekt_id`, `dokument_id` | Dokumente der Bauherrschaft | -| `projekt_dokument_planung` | Projekt ↔ Dokument | `projekt_id`, `dokument_id` | Planungsdokumente | -| `parzelle_nachbar` | Parzelle ↔ Parzelle | `parzelle_id`, `nachbar_id` | Nachbarschaftsbeziehungen | -| `parzelle_dokument` | Parzelle ↔ Dokument | `parzelle_id`, `dokument_id` | Parzellenspezifische Dokumente | - -**Besonderheiten:** -- `parzelle_nachbar`: Selbstreferenzierende Tabelle mit Constraint `parzelle_id != nachbar_id` -- Alle Junction Tables haben zusammengesetzte Primärschlüssel aus beiden Foreign Keys -- CASCADE DELETE empfohlen für automatische Bereinigung - ---- - -## Implementierungshinweise - -### Datenbank-Design - -#### Empfehlung: Hybrid-Ansatz - -**Relationale Datenbank (PostgreSQL mit PostGIS):** -- Stammdaten: Projekt, Parzelle, Land, Kanton, Gemeinde -- Geografische Daten: GeoPunkt mit PostGIS-Geometrie-Typen -- Strukturierte Queries und Joins - -**Dokumenten-Datenbank oder Blob Storage:** -- Dokumente: S3, Azure Blob Storage oder MinIO -- Metadaten in relationaler DB, Binärdaten extern - -#### Schema-Überlegungen - -**Normalisierung:** -1. Land, Kanton, Gemeinde als separate Tabellen mit Referenzen -2. Dokument als zentrale Tabelle, referenziert von mehreren Entitäten (Polymorphic Associations oder Junction Tables) -3. GeoPunkt entweder embedded (JSON) oder separate Tabelle mit Foreign Keys - -**Denormalisierung für Performance:** -- Häufig abgefragte Parzellendaten können gecached werden -- Gemeinde.plz könnte redundant in Parzelle gespeichert werden - -### Geografische Daten - -**Koordinatensystem:** -Schweizer Landessystem LV95 (EPSG:2056): -- X (Ost): 2'480'000 - 2'840'000 -- Y (Nord): 1'070'000 - 1'300'000 -- Z (Höhe): Meter über Meer - -### Validierung - -**Pflichtfelder:** -- Alle IDs (UUID) -- Alle Labels -- Dokument: typ, dokumentReferenz -- GeoPunkt: x, y (z optional) -- Kontext: thema, inhalt - -**Geschäftslogik-Validierungen:** -- AZ und BZ müssen > 0 sein -- VollgeschossZahl muss ≥ 0 sein -- Geo-Koordinaten müssen in gültigem CH-Bereich liegen -- Parzelle muss mindestens 3 GeoPunkte für gültiges Polygon haben - -### Sicherheit & Zugriffskontrolle - -**Überlegungen:** -- Dokumente: Zugriffskontrolle nach Projekt-/Benutzerrolle -- Eigentümerdaten: DSGVO-konforme Behandlung -- Audit-Log für Änderungen an Bebauungsparametern -- Versionierung von Dokumenten (via versionsbezeichnung) - -### Erweiterbarkeit - -**Flexible Bereiche:** -1. **Kontext-Objekt**: Neue Themen können ohne Schema-Änderung hinzugefügt werden -2. **Tag-System**: Erweiterbar um neue Dokumentkategorien -3. **StatusProzess**: Kann projektspezifisch angepasst werden -4. **GeoTag**: Neue Kategorien für Vermessungspunkte möglich - -**Migration-Strategy:** -- Verwende Datenbank-Migrationen (z.B. Alembic für Python, Flyway für Java) -- Behalte alte Enums bei, füge neue hinzu -- Nutze nullable Felder für neue Eigenschaften - ---- - -## Anwendungsfälle - -### Use Case 1: Neues Projekt anlegen -1. Erstelle Projekt mit Label und Status -2. Füge Parzellen zum Perimeter hinzu -3. Lade Dokumente der Bauherrschaft hoch -4. Verknüpfe Kontext-Informationen - -### Use Case 2: Bebaubarkeit prüfen -1. Lade Parzelle mit allen Eigenschaften -2. Prüfe AZ, BZ, Vollgeschosszahl -3. Berücksichtige Hanglage, Schutzzonen -4. Lade BZO der Gemeinde -5. Prüfe Kontext-Informationen (Dienstbarkeiten, etc.) - -### Use Case 3: Nachbaranalyse -1. Lade Parzelle -2. Folge nachbarEigentuemer-Referenzen -3. Zeige Eigentümer und Bebauung der Nachbarparzellen - -### Use Case 4: Dokumentensuche -1. Suche über Tags (z.B. "Zonenplan") -2. Filtere nach Format (z.B. PDF) -3. Gruppiere nach Projekt/Parzelle/Gemeinde - -### Use Case 5: Revisionen verfolgen -1. Prüfe Gemeinde.bzoRevision -2. Prüfe Kanton.baureglementRevision -3. Erstelle Kontext-Eintrag mit Hinweis auf negative Vorwirkung - ---- - -## Offene Fragen / Zu klären - -1. **Versionierung**: Sollen Änderungen an Parzellen historisiert werden? -2. **Mehrsprachigkeit**: Labels in DE/FR/IT? -3. **Benutzer & Rollen**: Wer darf was bearbeiten? -4. **Workflow-Engine**: Für Statusübergänge und Genehmigungen? -5. **Integration**: Anbindung an amtliche Geodaten (z.B. Swisstopo API)? -6. **Berechnungen**: Sollen Ausnützungsberechnungen automatisiert werden? - ---- - -## Nächste Schritte - -1. **Validierung**: Review mit PEK -2. **Prototyp**: Implementierung der Datenmodell-Klassen -3. **GIS-Integration**: PostGIS aufsetzen, Test-Geodaten importieren -4. **API-Design**: RESTful API (FastAPI) mit OpenAPI-Dokumentation diff --git a/mandates/pek/datenmodell/README.md b/mandates/pek/datenmodell/README.md deleted file mode 100644 index 9d59427..0000000 --- a/mandates/pek/datenmodell/README.md +++ /dev/null @@ -1,409 +0,0 @@ -# Architektur-Planungs-App - Datenmodell - -## Übersicht - -Dieses Repository enthält das vollständige Datenmodell für eine Schweizer Architektur-Planungs-Applikation zur Verwaltung von Bauprojekten, Parzellen, Dokumenten und regulatorischen Informationen. - -## 📁 Dateien - -### 1. **DATENMODELL_DOKUMENTATION.md** -Umfassende Dokumentation mit: -- Detaillierte Beschreibung aller Entitäten -- Beziehungsdiagramme -- Implementierungshinweise -- Use Cases -- Best Practices -- Offene Fragen - -**Empfohlene Lesereihenfolge: Zuerst diese Datei lesen!** - -### 2. **datenmodell.mermaid** -Visuelles ER-Diagramm zur Darstellung der Entitäten und Beziehungen. - -**Verwendung:** -```bash -# In Visual Studio Code mit Mermaid Extension -# Oder online: https://mermaid.live/ - -# Datei öffnen und als Diagramm anzeigen -``` - -### 3. **datenmodell-schema.json** -JSON Schema Definition im JSON Schema Draft-07 Format. - -**Verwendung:** -- API-Dokumentation mit Swagger/OpenAPI -- Validierung von JSON-Payloads -- Code-Generierung für verschiedene Sprachen - -```bash -# JSON Schema validieren -npm install -g ajv-cli -ajv validate -s datenmodell-schema.json -d beispiel-daten.json -``` - -### 4. **models.py** -Python SQLAlchemy Implementation mit PostGIS-Unterstützung. - -**Verwendung:** -```bash -# Installation -pip install sqlalchemy geoalchemy2 psycopg2-binary --break-system-packages - -# Datenbank erstellen -python models.py - -# In eigener Anwendung verwenden -from models import Projekt, Parzelle, Dokument -``` - -**Tech Stack:** -- Python 3.10+ -- SQLAlchemy 2.0+ -- PostgreSQL 15+ mit PostGIS 3.4+ -- GeoAlchemy2 - -### 5. **schema.prisma** -Prisma Schema für TypeScript/JavaScript Backend. - -**Verwendung:** -```bash -# Installation -npm install prisma @prisma/client - -# Datenbank migrieren -npx prisma migrate dev --name init - -# Prisma Client generieren -npx prisma generate - -# Prisma Studio öffnen -npx prisma studio -``` - -**Tech Stack:** -- Node.js 18+ -- Prisma 5+ -- PostgreSQL 15+ mit PostGIS - -### 6. **migration_001_initial_schema.sql** -SQL-Migrationsskript für direkte PostgreSQL-Verwendung. - -**Verwendung:** -```bash -# PostgreSQL Datenbank erstellen -createdb architektur_app - -# Migration ausführen -psql -d architektur_app -f migration_001_initial_schema.sql - -# Verbinden und testen -psql architektur_app -\dt # Tabellen anzeigen -``` - -## 🚀 Quick Start - -### Option 1: Python mit SQLAlchemy - -```bash -# 1. PostgreSQL mit PostGIS aufsetzen -docker run --name postgis -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d postgis/postgis:15-3.4 - -# 2. Dependencies installieren -pip install sqlalchemy geoalchemy2 psycopg2-binary --break-system-packages - -# 3. Models verwenden -python models.py -``` - -### Option 2: TypeScript mit Prisma - -```bash -# 1. Projekt initialisieren -npm init -y -npm install prisma @prisma/client - -# 2. Prisma konfigurieren -cp schema.prisma prisma/schema.prisma - -# 3. Database URL setzen -echo "DATABASE_URL=\"postgresql://user:password@localhost:5432/architektur_app\"" > .env - -# 4. Migration ausführen -npx prisma migrate dev --name init -``` - -### Option 3: Direkt mit SQL - -```bash -# 1. Datenbank erstellen -createdb architektur_app - -# 2. Migration ausführen -psql -d architektur_app -f migration_001_initial_schema.sql - -# 3. Daten einfügen und abfragen -psql architektur_app -``` - -## 📊 Datenmodell-Struktur - -### Kern-Entitäten - -``` -PROJEKT (Bauprojekt) -├── Perimeter (Parzellen) -├── Dokumente (Bauherrschaft & Planung) -├── Baulinie (geografisch) -└── Kontext-Informationen - -PARZELLE (Grundstück) -├── Geografischer Kontext (Land, Kanton, Gemeinde) -├── Bauliche Parameter (AZ, BZ, Vollgeschosse, etc.) -├── Schutzzonen -├── Nachbarparzellen -└── Dokumente & Kontext - -DOKUMENT (Datei oder URL) -├── Versionierung -├── Tags -└── Format - -Administrative Hierarchie: -LAND → KANTON → GEMEINDE -``` - -### Geografische Daten - -Das Modell verwendet das **Schweizer Landessystem LV95 (EPSG:2056)**: -- Ostwert (X): 2'480'000 - 2'840'000 -- Nordwert (Y): 1'070'000 - 1'300'000 -- Höhe (Z): Meter über Meer - -## 🗺️ Koordinatensystem - -Alle geografischen Daten verwenden **LV95 (Swiss LV95 / EPSG:2056)**. - -**Beispiel-Koordinaten (Zürich Hauptbahnhof):** -``` -X (Ost): 2'683'140 -Y (Nord): 1'247'850 -Z (Höhe): 408 m ü. M. -``` - -## 🔍 Wichtige Entscheidungen - -### 1. Polymorphe Beziehungen -Das `Kontext`-Objekt kann zu verschiedenen Entitäten gehören (Projekt, Parzelle, Land, Kanton, Gemeinde). Dies ermöglicht flexible Erweiterungen ohne Schema-Änderungen. - -### 2. Array-Felder -- `statusProzess`: Ein Projekt kann mehrere Status gleichzeitig haben -- `tags`: Dokumente können mehrere Tags haben -- `parzellenNummern`: Parzellen können mehrere offizielle Nummern haben - -### 3. Selbstreferenzierende Beziehungen -Parzellen referenzieren sich gegenseitig als Nachbarn (n:m Beziehung). - -### 4. Versionierung -Dokumente haben eine `versionsbezeichnung` für manuelle Versionskontrolle. - -### 5. Drei-wertiger Zustand -`JaNein` Enum erlaubt "", "Ja", "Nein" für unbekannte Zustände. - -## 📋 Anwendungsfälle - -### UC1: Neues Projekt erstellen -```python -# Python Beispiel -projekt = Projekt( - label="Neubau Mehrfamilienhaus", - status_prozess=[StatusProzess.EINGANG] -) -projekt.perimeter.append(parzelle_1) -session.add(projekt) -session.commit() -``` - -### UC2: Bebaubarkeit prüfen -```sql --- SQL Beispiel -SELECT - p.label, - p.bauzone, - p.az, - p.bz, - p.vollgeschoss_zahl, - p.gebaeudehoehe_max, - ST_Area(p.geo_umfang) as flaeche_m2 -FROM v_parzelle_vollstaendig p -WHERE p.id = 'UUID'; -``` - -### UC3: Nachbaranalyse -```typescript -// TypeScript/Prisma Beispiel -const parzelle = await prisma.parzelle.findUnique({ - where: { id: parzelleId }, - include: { - nachbarEigentuemer_von: { - include: { nachbar: true } - } - } -}); -``` - -## 🎯 Best Practices - -### Geometrie-Handling -```python -# PostGIS: Parzelle mit Polygon erstellen -from geoalchemy2.shape import from_shape -from shapely.geometry import Polygon - -polygon = Polygon([ - (2683140, 1247850), - (2683200, 1247850), - (2683200, 1247900), - (2683140, 1247900), - (2683140, 1247850) -]) - -parzelle.geo_umfang = from_shape(polygon, srid=2056) -``` - -### Kontext-Informationen -```python -# Flexibles Hinzufügen von Kontextinformationen -kontext = Kontext( - thema="Dienstbarkeiten", - inhalt="Wegrecht zugunsten Parzelle 1235 entlang Ostgrenze, eingetragen am 15.03.2020", - parzelle_id=parzelle.id -) -``` - -### Dokumenten-Management -```python -# Dokument mit Tags -dokument = Dokument( - label="Zonenplan Gemeinde Zürich", - versionsbezeichnung="2024-v1", - typ=DokumentTyp.DATEI, - format="PDF", - dokument_referenz="/storage/docs/zonenplan-zh-2024.pdf", - tags=[TagTyp.ZONENPLAN, TagTyp.BZO] -) -``` - -## 🔐 Sicherheit - -### Zu beachten: -- Eigentümerdaten sind personenbezogene Daten (DSGVO/DSG) -- Dokumente benötigen Zugriffskontrolle -- Audit-Logging für Änderungen empfohlen -- Geometriedaten sollten validiert werden - -### Empfohlene Maßnahmen: -```sql --- Audit-Log Tabelle hinzufügen -CREATE TABLE audit_log ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - table_name VARCHAR(100) NOT NULL, - record_id UUID NOT NULL, - action VARCHAR(20) NOT NULL, - changed_by UUID NOT NULL, - changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - old_values JSONB, - new_values JSONB -); -``` - -## 📈 Performance-Optimierung - -### Indices sind bereits erstellt für: -- Geografische Suchen (GIST Index auf Geometrien) -- Array-Suchen (GIN Index auf Arrays) -- Foreign Key Joins - -### Zusätzliche Optimierungen: -```sql --- Materialized View für häufige Reports -CREATE MATERIALIZED VIEW mv_projekt_statistik AS -SELECT - k.label as kanton, - COUNT(DISTINCT pr.id) as anzahl_projekte, - COUNT(DISTINCT pa.id) as anzahl_parzellen, - SUM(ST_Area(pa.geo_umfang)) as gesamtflaeche_m2 -FROM projekt pr -JOIN projekt_parzelle pp ON pr.id = pp.projekt_id -JOIN parzelle pa ON pp.parzelle_id = pa.id -JOIN kanton k ON pa.kanton_id = k.id -GROUP BY k.label; - --- Refresh periodisch -REFRESH MATERIALIZED VIEW mv_projekt_statistik; -``` - -## 🧪 Testing - -### Unit Tests -```python -# pytest Beispiel -def test_parzelle_creation(): - parzelle = Parzelle( - label="Test Parzelle", - parzellen_nummern=["1234"], - az=1.5, - bz=0.4 - ) - assert parzelle.label == "Test Parzelle" - assert parzelle.az == 1.5 -``` - -### Integration Tests -```typescript -// Jest Beispiel -describe('Projekt API', () => { - it('should create projekt with parzellen', async () => { - const projekt = await createProjekt({ - label: 'Test Projekt', - perimeter: [parzelle1.id, parzelle2.id] - }); - expect(projekt.perimeter).toHaveLength(2); - }); -}); -``` - -## 📚 Weitere Ressourcen - -- [PostGIS Dokumentation](https://postgis.net/docs/) -- [SQLAlchemy ORM](https://docs.sqlalchemy.org/) -- [Prisma Dokumentation](https://www.prisma.io/docs/) -- [Swisstopo - Schweizer Koordinatensysteme](https://www.swisstopo.admin.ch/de/wissen-fakten/geodaesie-vermessung/bezugsrahmen/lokal/lv95.html) - -## 🤝 Nächste Schritte - -1. **Validierung**: Review mit Architekten und Fachexperten -2. **API-Design**: RESTful oder GraphQL API implementieren -3. **Frontend-Prototyp**: Kartenansicht mit Leaflet/MapLibre -4. **GIS-Integration**: Anbindung an Swisstopo-APIs -5. **Workflow-Engine**: Statusübergänge und Genehmigungen -6. **Benutzer-Management**: Rollen und Berechtigungen - -## 📞 Support - -Bei Fragen zum Datenmodell: -- Öffne ein Issue im Repository -- Konsultiere die `DATENMODELL_DOKUMENTATION.md` -- Prüfe die Beispiel-Implementierungen in `models.py` oder `schema.prisma` - -## 📝 License - -[Lizenz hier einfügen] - ---- - -**Version:** 1.0 -**Letzte Aktualisierung:** 2025-10-24 -**Koordinatensystem:** LV95 (EPSG:2056) -**Datenbank:** PostgreSQL 15+ mit PostGIS 3.4+ diff --git a/mandates/pek/datenmodell/datenmodell-schema.json b/mandates/pek/datenmodell/datenmodell-schema.json deleted file mode 100644 index ab27295..0000000 --- a/mandates/pek/datenmodell/datenmodell-schema.json +++ /dev/null @@ -1,462 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Architektur-Planungs-App Datenmodell", - "version": "1.0", - - "definitions": { - "Projekt": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Projekt-ID" - }, - "label": { - "type": "string", - "description": "Projektbezeichnung" - }, - "statusProzess": { - "type": "array", - "items": { - "type": "string", - "enum": [ - "Eingang", - "Analyse", - "Studie", - "Planung", - "Baurechtsverfahren", - "Umsetzung", - "Archiv" - ] - }, - "description": "Aktuelle(r) Projektstatus/-stati" - }, - "perimeter": { - "type": "array", - "items": { - "$ref": "#/definitions/Parzelle" - }, - "description": "Parzellen im Projektperimeter" - }, - "dokumenteBauherrschaft": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Dokumente der Bauherrschaft" - }, - "dokumentePlanung": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Planungsdokumente" - }, - "geoBaulinie": { - "type": "array", - "items": { - "$ref": "#/definitions/GeoPunkt" - }, - "description": "Geografische Punkte der Baulinie" - }, - "kontextInformationen": { - "type": "array", - "items": { - "$ref": "#/definitions/Kontext" - }, - "description": "Kontextuelle Projektinformationen" - } - }, - "required": ["id", "label"] - }, - - "Dokument": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Dokument-ID" - }, - "label": { - "type": "string", - "description": "Dokumentbezeichnung" - }, - "versionsbezeichnung": { - "type": "string", - "description": "Versionsnummer oder -bezeichnung" - }, - "typ": { - "type": "string", - "enum": ["Datei", "Url"], - "description": "Art des Dokuments" - }, - "format": { - "type": "string", - "description": "Dateiformat (z.B. PDF, DWG, URL)", - "examples": ["PDF", "DWG", "IFC", "DXF", "URL"] - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/Tag" - }, - "description": "Kategorisierungs-Tags" - }, - "dokumentReferenz": { - "type": "string", - "description": "Pfad oder URL zum Dokument" - } - }, - "required": ["id", "label", "typ", "dokumentReferenz"] - }, - - "Tag": { - "type": "string", - "enum": [ - "Kataster Objekte", - "Kataster Werkeleitungen", - "Kataster Belastete Standorte", - "Kataster Bäume", - "Zonenplan", - "Planungs- und Baugesetz (PGB)", - "Bau- und Zonenordnung (BZO)", - "Parkplatzverordnung", - "Eigentümerauskunft", - "Grundbuchauszug" - ], - "description": "Vordefinierte Dokumentkategorien" - }, - - "Parzelle": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Parzellen-ID" - }, - "label": { - "type": "string", - "description": "Parzellenbezeichnung" - }, - "parzellenNummern": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Offizielle Parzellennummern" - }, - "eigentuemerschaaft": { - "type": "string", - "description": "Eigentümer der Parzelle" - }, - "nachbarEigentuemer": { - "type": "array", - "items": { - "$ref": "#/definitions/Parzelle" - }, - "description": "Angrenzende Parzellen" - }, - "kontextLand": { - "$ref": "#/definitions/Land", - "description": "Land der Parzelle" - }, - "kontextKanton": { - "$ref": "#/definitions/Kanton", - "description": "Kanton der Parzelle" - }, - "kontextGemeinde": { - "$ref": "#/definitions/Gemeinde", - "description": "Gemeinde der Parzelle" - }, - "kontextInformationen": { - "type": "array", - "items": { - "$ref": "#/definitions/Kontext" - }, - "description": "Parzellenspezifische Kontextinformationen" - }, - "strasseNr": { - "type": "string", - "description": "Straße und Hausnummer" - }, - "geoUmfang": { - "type": "array", - "items": { - "$ref": "#/definitions/GeoPunkt" - }, - "description": "Geografische Umfangspunkte der Parzelle" - }, - "bauzone": { - "type": "string", - "description": "Bauzonenbezeichnung" - }, - "spezifischeDokumente": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Parzellenspezifische Dokumente" - }, - "hochwasserschutzzone": { - "type": "string", - "description": "Hochwasserschutzzone (falls zutreffend)" - }, - "laermschutzzone": { - "type": "string", - "description": "Lärmschutzzone" - }, - "grundwasserschutzzone": { - "type": "string", - "description": "Grundwasserschutzzone (falls zutreffend)" - }, - "parzelleBebaut": { - "$ref": "#/definitions/JaNein", - "description": "Ist die Parzelle bebaut?" - }, - "parzelleErschlossen": { - "$ref": "#/definitions/JaNein", - "description": "Ist die Parzelle erschlossen?" - }, - "hanglage": { - "$ref": "#/definitions/JaNein", - "description": "Liegt die Parzelle in Hanglage?" - }, - "az": { - "type": "number", - "description": "Ausnützungsziffer" - }, - "bz": { - "type": "number", - "description": "Bebauungsziffer" - }, - "vollgeschossZahl": { - "type": "integer", - "description": "Anzahl zulässiger Vollgeschosse" - }, - "anrechenbarDachgeschoss": { - "type": "number", - "description": "Anrechenbarer Anteil Dachgeschoss" - }, - "anrechenbarUntergeschoss": { - "type": "number", - "description": "Anrechenbarer Anteil Untergeschoss" - }, - "gebaeudehoehe_max": { - "type": "number", - "description": "Maximale Gebäudehöhe in Metern" - }, - "regelnGrenzabstand": { - "type": "string", - "description": "Regelungen zum Grenzabstand" - }, - "regelnMehrlaengenzuschlag": { - "type": "string", - "description": "Regelungen zum Mehrlängenzuschlag" - }, - "regelnMehrhoehenzuschlag": { - "type": "string", - "description": "Regelungen zum Mehrhöhenzuschlag" - } - }, - "required": ["id", "label"] - }, - - "Gemeinde": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Gemeinde-ID" - }, - "label": { - "type": "string", - "description": "Gemeindename" - }, - "plz": { - "type": "string", - "description": "Postleitzahl" - }, - "dokumente": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Gemeindedokumente" - }, - "kontextInformationen": { - "type": "array", - "items": { - "$ref": "#/definitions/Kontext" - }, - "description": "Gemeindespezifische Kontextinformationen" - }, - "bzoAktuell": { - "$ref": "#/definitions/Dokument", - "description": "Aktuelle Bau- und Zonenordnung" - }, - "bzoRevision": { - "$ref": "#/definitions/Dokument", - "description": "BZO in Revision" - } - }, - "required": ["id", "label"] - }, - - "Kanton": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Kanton-ID" - }, - "label": { - "type": "string", - "description": "Kantonsname" - }, - "dokumente": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Kantonale Dokumente" - }, - "kontextInformationen": { - "type": "array", - "items": { - "$ref": "#/definitions/Kontext" - }, - "description": "Kantonsspezifische Kontextinformationen" - }, - "baureglementAktuell": { - "$ref": "#/definitions/Dokument", - "description": "Aktuelles Baureglement" - }, - "baureglementRevision": { - "$ref": "#/definitions/Dokument", - "description": "Baureglement in Revision" - }, - "bauverordnungAktuell": { - "$ref": "#/definitions/Dokument", - "description": "Aktuelle Bauverordnung" - }, - "bauverordnungRevision": { - "$ref": "#/definitions/Dokument", - "description": "Bauverordnung in Revision" - } - }, - "required": ["id", "label"] - }, - - "Land": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Land-ID" - }, - "label": { - "type": "string", - "description": "Landesname" - }, - "dokumente": { - "type": "array", - "items": { - "$ref": "#/definitions/Dokument" - }, - "description": "Nationale Dokumente" - }, - "kontextInformationen": { - "type": "array", - "items": { - "$ref": "#/definitions/Kontext" - }, - "description": "Nationale Kontextinformationen" - } - }, - "required": ["id", "label"] - }, - - "GeoPunkt": { - "type": "object", - "properties": { - "x": { - "type": "number", - "description": "X-Koordinate (Ost)" - }, - "y": { - "type": "number", - "description": "Y-Koordinate (Nord)" - }, - "z": { - "type": "number", - "description": "Z-Koordinate (Höhe)" - }, - "referenzen": { - "type": "array", - "items": { - "$ref": "#/definitions/GeoTag" - }, - "description": "Kategorisierung des Geopunkts" - } - }, - "required": ["x", "y"] - }, - - "GeoTag": { - "type": "string", - "enum": [ - "Referenzpunkt Kat. 1", - "Referenzpunkt Kat. 2", - "Referenzpunkt Kat. 3", - "Geometeraufnahme" - ], - "description": "Kategorien für Geopunkte" - }, - - "JaNein": { - "type": "string", - "enum": ["", "Ja", "Nein"], - "description": "Ja/Nein/Leer Wert" - }, - - "Kontext": { - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uuid", - "description": "Eindeutige Kontext-ID" - }, - "thema": { - "type": "string", - "description": "Thema der Kontextinformation", - "examples": [ - "Vorgaben zur Erdgeschossnutzung", - "Dienstbarkeiten", - "Anforderung Parkplätze", - "Ausnützungsübertragungen", - "Schadstoffbelastungen auf Parzellen", - "Aktive Gestaltungspläne", - "Lärmempfindlichkeitsstufen", - "Mögliche Wärmenutzung", - "Baumbestand auf privaten Grundstücken", - "Isos (Ortsbild, Schutzstatus, Denkmalschutz, Weilergebiet, etc.)", - "Naturgefahren", - "Verweis auf Revisionen" - ] - }, - "inhalt": { - "type": "string", - "description": "Detaillierter Inhalt der Kontextinformation" - } - }, - "required": ["id", "thema", "inhalt"] - } - } -} diff --git a/mandates/pek/datenmodell/datenmodell.mermaid b/mandates/pek/datenmodell/datenmodell.mermaid deleted file mode 100644 index c3aaf2d..0000000 --- a/mandates/pek/datenmodell/datenmodell.mermaid +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Hauptflüsse - Architektur-Planungs-App ---- -flowchart TD - Start([Datenmodell Start]) - - subgraph Admin[Administrative Ebene] - Land[LAND
Schweiz] - Kanton[KANTON
z.B. Zürich] - Gemeinde[GEMEINDE
z.B. Zürich Stadt] - Land --> Kanton - Kanton --> Gemeinde - end - - subgraph Geo[Geografische Daten] - Parzelle[PARZELLE
Grundstück mit
Bauparametern] - GeoPunkt[GEO_PUNKT
Koordinaten] - Gemeinde --> Parzelle - Parzelle --> GeoPunkt - end - - subgraph Core[Kern-Business-Logik] - Projekt[PROJEKT
Bauprojekt] - Dokument[DOKUMENT
Dateien & URLs] - Projekt -.Perimeter.-> Parzelle - Projekt -.Dokumente.-> Dokument - Parzelle -.Dokumente.-> Dokument - end - - subgraph Support[Unterstützende Daten] - Kontext[KONTEXT
Zusatzinfos] - Projekt --> Kontext - Parzelle --> Kontext - end - - Start --> Admin - - style Land fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Kanton fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Gemeinde fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff - style Parzelle fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style Projekt fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style Dokument fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff - style GeoPunkt fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff - style Kontext fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff \ No newline at end of file diff --git a/mandates/pek/datenmodell/migration_001_initial_schema.sql b/mandates/pek/datenmodell/migration_001_initial_schema.sql deleted file mode 100644 index 68090ec..0000000 --- a/mandates/pek/datenmodell/migration_001_initial_schema.sql +++ /dev/null @@ -1,393 +0,0 @@ --- ============================================================================ --- Architektur-Planungs-App Datenbank Schema --- PostgreSQL 15+ mit PostGIS 3.4+ --- Schweizer Koordinatensystem: LV95 (EPSG:2056) --- ============================================================================ - --- PostGIS Extension aktivieren -CREATE EXTENSION IF NOT EXISTS postgis; - --- UUID Extension für uuid_generate_v4() -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - --- ============================================================================ --- ENUMS --- ============================================================================ - -CREATE TYPE status_prozess AS ENUM ( - 'Eingang', - 'Analyse', - 'Studie', - 'Planung', - 'Baurechtsverfahren', - 'Umsetzung', - 'Archiv' -); - -CREATE TYPE dokument_typ AS ENUM ( - 'Datei', - 'Url' -); - -CREATE TYPE tag_typ AS ENUM ( - 'Kataster Objekte', - 'Kataster Werkeleitungen', - 'Kataster Belastete Standorte', - 'Kataster Bäume', - 'Zonenplan', - 'Planungs- und Baugesetz (PGB)', - 'Bau- und Zonenordnung (BZO)', - 'Parkplatzverordnung', - 'Eigentümerauskunft', - 'Grundbuchauszug' -); - -CREATE TYPE geo_tag_typ AS ENUM ( - 'Referenzpunkt Kat. 1', - 'Referenzpunkt Kat. 2', - 'Referenzpunkt Kat. 3', - 'Geometeraufnahme' -); - -CREATE TYPE ja_nein AS ENUM ( - '', - 'Ja', - 'Nein' -); - --- ============================================================================ --- HAUPTTABELLEN --- ============================================================================ - --- Land -CREATE TABLE land ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Kanton -CREATE TABLE kanton ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - baureglement_aktuell_id UUID, - baureglement_revision_id UUID, - bauverordnung_aktuell_id UUID, - bauverordnung_revision_id UUID, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Gemeinde -CREATE TABLE gemeinde ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - plz VARCHAR(10), - bzo_aktuell_id UUID, - bzo_revision_id UUID, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Dokument -CREATE TABLE dokument ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - versionsbezeichnung VARCHAR(100), - typ dokument_typ NOT NULL, - format VARCHAR(50), - dokument_referenz TEXT NOT NULL, - tags tag_typ[], - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Projekt -CREATE TABLE projekt ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - status_prozess status_prozess[], - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Parzelle -CREATE TABLE parzelle ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - label VARCHAR(255) NOT NULL, - parzellen_nummern VARCHAR(50)[], - eigentuemerschaaft VARCHAR(255), - strasse_nr VARCHAR(255), - - -- Geografischer Kontext - land_id UUID REFERENCES land(id), - kanton_id UUID REFERENCES kanton(id), - gemeinde_id UUID REFERENCES gemeinde(id), - - -- Geometrie (PostGIS) - geo_umfang GEOMETRY(POLYGON, 2056), - - -- Bauliche Parameter - bauzone VARCHAR(50), - az DECIMAL(5,2), - bz DECIMAL(5,2), - vollgeschoss_zahl INTEGER, - anrechenbar_dachgeschoss DECIMAL(3,2), - anrechenbar_untergeschoss DECIMAL(3,2), - gebaeudehoehe_max DECIMAL(6,2), - - -- Regelungen - regeln_grenzabstand TEXT, - regeln_mehrlaengenzuschlag TEXT, - regeln_mehrhoehenzuschlag TEXT, - - -- Schutzzonen - hochwasserschutzzone VARCHAR(100), - laermschutzzone VARCHAR(100), - grundwasserschutzzone VARCHAR(100), - - -- Eigenschaften - parzelle_bebaut ja_nein, - parzelle_erschlossen ja_nein, - hanglage ja_nein, - - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- GeoPunkt -CREATE TABLE geo_punkt ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - x DECIMAL(12,3) NOT NULL, -- LV95 Ostwert - y DECIMAL(12,3) NOT NULL, -- LV95 Nordwert - z DECIMAL(8,3), -- Höhe über Meer - referenzen geo_tag_typ[], - projekt_id UUID REFERENCES projekt(id) ON DELETE CASCADE, - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP -); - --- Kontext (Polymorphe Beziehung) -CREATE TABLE kontext ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - thema VARCHAR(255) NOT NULL, - inhalt TEXT NOT NULL, - - -- Polymorphe Foreign Keys - projekt_id UUID REFERENCES projekt(id) ON DELETE CASCADE, - parzelle_id UUID REFERENCES parzelle(id) ON DELETE CASCADE, - land_id UUID REFERENCES land(id) ON DELETE CASCADE, - kanton_id UUID REFERENCES kanton(id) ON DELETE CASCADE, - gemeinde_id UUID REFERENCES gemeinde(id) ON DELETE CASCADE, - - created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, - - -- Constraint: Kontext muss zu genau einer Entität gehören - CONSTRAINT kontext_single_parent CHECK ( - (projekt_id IS NOT NULL)::INTEGER + - (parzelle_id IS NOT NULL)::INTEGER + - (land_id IS NOT NULL)::INTEGER + - (kanton_id IS NOT NULL)::INTEGER + - (gemeinde_id IS NOT NULL)::INTEGER = 1 - ) -); - --- ============================================================================ --- JUNCTION TABLES (Many-to-Many Beziehungen) --- ============================================================================ - --- Projekt <-> Parzelle -CREATE TABLE projekt_parzelle ( - projekt_id UUID NOT NULL REFERENCES projekt(id) ON DELETE CASCADE, - parzelle_id UUID NOT NULL REFERENCES parzelle(id) ON DELETE CASCADE, - PRIMARY KEY (projekt_id, parzelle_id) -); - --- Projekt <-> Dokument (Bauherrschaft) -CREATE TABLE projekt_dokument_bauherrschaft ( - projekt_id UUID NOT NULL REFERENCES projekt(id) ON DELETE CASCADE, - dokument_id UUID NOT NULL REFERENCES dokument(id) ON DELETE CASCADE, - PRIMARY KEY (projekt_id, dokument_id) -); - --- Projekt <-> Dokument (Planung) -CREATE TABLE projekt_dokument_planung ( - projekt_id UUID NOT NULL REFERENCES projekt(id) ON DELETE CASCADE, - dokument_id UUID NOT NULL REFERENCES dokument(id) ON DELETE CASCADE, - PRIMARY KEY (projekt_id, dokument_id) -); - --- Parzelle <-> Parzelle (Nachbarn) -CREATE TABLE parzelle_nachbar ( - parzelle_id UUID NOT NULL REFERENCES parzelle(id) ON DELETE CASCADE, - nachbar_id UUID NOT NULL REFERENCES parzelle(id) ON DELETE CASCADE, - PRIMARY KEY (parzelle_id, nachbar_id), - CHECK (parzelle_id != nachbar_id) -- Parzelle kann nicht ihr eigener Nachbar sein -); - --- Parzelle <-> Dokument -CREATE TABLE parzelle_dokument ( - parzelle_id UUID NOT NULL REFERENCES parzelle(id) ON DELETE CASCADE, - dokument_id UUID NOT NULL REFERENCES dokument(id) ON DELETE CASCADE, - PRIMARY KEY (parzelle_id, dokument_id) -); - --- ============================================================================ --- FOREIGN KEY CONSTRAINTS (nachträglich für Kanton/Gemeinde Dokumente) --- ============================================================================ - -ALTER TABLE kanton - ADD CONSTRAINT fk_kanton_baureglement_aktuell - FOREIGN KEY (baureglement_aktuell_id) REFERENCES dokument(id), - ADD CONSTRAINT fk_kanton_baureglement_revision - FOREIGN KEY (baureglement_revision_id) REFERENCES dokument(id), - ADD CONSTRAINT fk_kanton_bauverordnung_aktuell - FOREIGN KEY (bauverordnung_aktuell_id) REFERENCES dokument(id), - ADD CONSTRAINT fk_kanton_bauverordnung_revision - FOREIGN KEY (bauverordnung_revision_id) REFERENCES dokument(id); - -ALTER TABLE gemeinde - ADD CONSTRAINT fk_gemeinde_bzo_aktuell - FOREIGN KEY (bzo_aktuell_id) REFERENCES dokument(id), - ADD CONSTRAINT fk_gemeinde_bzo_revision - FOREIGN KEY (bzo_revision_id) REFERENCES dokument(id); - --- ============================================================================ --- INDICES für Performance --- ============================================================================ - --- Projekt Indices -CREATE INDEX idx_projekt_status ON projekt USING GIN (status_prozess); - --- Parzelle Indices -CREATE INDEX idx_parzelle_land ON parzelle(land_id); -CREATE INDEX idx_parzelle_kanton ON parzelle(kanton_id); -CREATE INDEX idx_parzelle_gemeinde ON parzelle(gemeinde_id); -CREATE INDEX idx_parzelle_bauzone ON parzelle(bauzone); -CREATE INDEX idx_parzelle_geo_umfang ON parzelle USING GIST(geo_umfang); - --- Dokument Indices -CREATE INDEX idx_dokument_typ ON dokument(typ); -CREATE INDEX idx_dokument_tags ON dokument USING GIN (tags); - --- GeoPunkt Indices -CREATE INDEX idx_geopunkt_projekt ON geo_punkt(projekt_id); -CREATE INDEX idx_geopunkt_referenzen ON geo_punkt USING GIN (referenzen); - --- Kontext Indices -CREATE INDEX idx_kontext_projekt ON kontext(projekt_id); -CREATE INDEX idx_kontext_parzelle ON kontext(parzelle_id); -CREATE INDEX idx_kontext_land ON kontext(land_id); -CREATE INDEX idx_kontext_kanton ON kontext(kanton_id); -CREATE INDEX idx_kontext_gemeinde ON kontext(gemeinde_id); -CREATE INDEX idx_kontext_thema ON kontext(thema); - --- ============================================================================ --- TRIGGER für updated_at --- ============================================================================ - -CREATE OR REPLACE FUNCTION update_updated_at_column() -RETURNS TRIGGER AS $$ -BEGIN - NEW.updated_at = CURRENT_TIMESTAMP; - RETURN NEW; -END; -$$ language 'plpgsql'; - -CREATE TRIGGER update_land_updated_at BEFORE UPDATE ON land - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_kanton_updated_at BEFORE UPDATE ON kanton - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_gemeinde_updated_at BEFORE UPDATE ON gemeinde - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_dokument_updated_at BEFORE UPDATE ON dokument - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_projekt_updated_at BEFORE UPDATE ON projekt - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_parzelle_updated_at BEFORE UPDATE ON parzelle - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_geo_punkt_updated_at BEFORE UPDATE ON geo_punkt - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - -CREATE TRIGGER update_kontext_updated_at BEFORE UPDATE ON kontext - FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); - --- ============================================================================ --- VIEWS für häufige Abfragen --- ============================================================================ - --- View: Parzellen mit vollständigem geografischem Kontext -CREATE VIEW v_parzelle_vollstaendig AS -SELECT - p.*, - l.label as land_name, - k.label as kanton_name, - g.label as gemeinde_name, - g.plz as gemeinde_plz, - ST_AsGeoJSON(p.geo_umfang) as geo_umfang_geojson, - ST_Area(p.geo_umfang) as flaeche_m2 -FROM parzelle p -LEFT JOIN land l ON p.land_id = l.id -LEFT JOIN kanton k ON p.kanton_id = k.id -LEFT JOIN gemeinde g ON p.gemeinde_id = g.id; - --- View: Projekte mit Perimeter-Information -CREATE VIEW v_projekt_mit_perimeter AS -SELECT - pr.id, - pr.label, - pr.status_prozess, - COUNT(DISTINCT pp.parzelle_id) as anzahl_parzellen, - STRING_AGG(DISTINCT pa.label, ', ') as parzellen_labels -FROM projekt pr -LEFT JOIN projekt_parzelle pp ON pr.id = pp.projekt_id -LEFT JOIN parzelle pa ON pp.parzelle_id = pa.id -GROUP BY pr.id, pr.label, pr.status_prozess; - --- ============================================================================ --- BEISPIELDATEN --- ============================================================================ - --- Land Schweiz -INSERT INTO land (label) VALUES ('Schweiz'); - --- Kantone (Beispiele) -INSERT INTO kanton (label) VALUES - ('Zürich'), - ('Bern'), - ('Luzern'); - --- Gemeinden (Beispiele für Zürich) -INSERT INTO gemeinde (label, plz) VALUES - ('Zürich', '8000'), - ('Winterthur', '8400'), - ('Uster', '8610'); - --- ============================================================================ --- KOMMENTARE --- ============================================================================ - -COMMENT ON TABLE projekt IS 'Bauprojekte mit Status und Perimeter'; -COMMENT ON TABLE parzelle IS 'Grundstücke mit baulichen und rechtlichen Eigenschaften'; -COMMENT ON TABLE dokument IS 'Dokumente und URLs mit Versionierung'; -COMMENT ON TABLE geo_punkt IS '3D-Punkte im LV95-Koordinatensystem'; -COMMENT ON TABLE kontext IS 'Flexible Kontextinformationen für verschiedene Entitäten'; - -COMMENT ON COLUMN parzelle.geo_umfang IS 'Parzellengrenze als PostGIS Polygon im LV95 (EPSG:2056)'; -COMMENT ON COLUMN parzelle.az IS 'Ausnützungsziffer'; -COMMENT ON COLUMN parzelle.bz IS 'Bebauungsziffer'; -COMMENT ON COLUMN geo_punkt.x IS 'LV95 Ostwert (E), typisch 2480000-2840000'; -COMMENT ON COLUMN geo_punkt.y IS 'LV95 Nordwert (N), typisch 1070000-1300000'; -COMMENT ON COLUMN geo_punkt.z IS 'Höhe über Meer in Metern'; - --- ============================================================================ --- Ende der Migration --- ============================================================================ diff --git a/mandates/pek/datenmodell/models.py b/mandates/pek/datenmodell/models.py deleted file mode 100644 index 3d5598e..0000000 --- a/mandates/pek/datenmodell/models.py +++ /dev/null @@ -1,457 +0,0 @@ -""" -SQLAlchemy Datenmodell für Architektur-Planungs-App -Verwendet PostgreSQL mit PostGIS Extension -""" - -from sqlalchemy import ( - Column, String, Integer, Float, Enum as SQLEnum, - ForeignKey, Table, Text, ARRAY -) -from sqlalchemy.dialects.postgresql import UUID, ENUM -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship -from geoalchemy2 import Geometry -import uuid -import enum - -Base = declarative_base() - - -# ============================================================================ -# ENUMS -# ============================================================================ - -class StatusProzess(enum.Enum): - EINGANG = "Eingang" - ANALYSE = "Analyse" - STUDIE = "Studie" - PLANUNG = "Planung" - BAURECHTSVERFAHREN = "Baurechtsverfahren" - UMSETZUNG = "Umsetzung" - ARCHIV = "Archiv" - - -class DokumentTyp(enum.Enum): - DATEI = "Datei" - URL = "Url" - - -class TagTyp(enum.Enum): - KATASTER_OBJEKTE = "Kataster Objekte" - KATASTER_WERKELEITUNGEN = "Kataster Werkeleitungen" - KATASTER_BELASTETE_STANDORTE = "Kataster Belastete Standorte" - KATASTER_BAEUME = "Kataster Bäume" - ZONENPLAN = "Zonenplan" - PGB = "Planungs- und Baugesetz (PGB)" - BZO = "Bau- und Zonenordnung (BZO)" - PARKPLATZVERORDNUNG = "Parkplatzverordnung" - EIGENTUEMER_AUSKUNFT = "Eigentümerauskunft" - GRUNDBUCHAUSZUG = "Grundbuchauszug" - - -class GeoTagTyp(enum.Enum): - REFERENZPUNKT_KAT1 = "Referenzpunkt Kat. 1" - REFERENZPUNKT_KAT2 = "Referenzpunkt Kat. 2" - REFERENZPUNKT_KAT3 = "Referenzpunkt Kat. 3" - GEOMETER_AUFNAHME = "Geometeraufnahme" - - -class JaNein(enum.Enum): - LEER = "" - JA = "Ja" - NEIN = "Nein" - - -# ============================================================================ -# JUNCTION TABLES (Many-to-Many Beziehungen) -# ============================================================================ - -# Projekt <-> Dokument (Bauherrschaft) -projekt_dokumente_bauherrschaft = Table( - 'projekt_dokumente_bauherrschaft', - Base.metadata, - Column('projekt_id', UUID(as_uuid=True), ForeignKey('projekt.id')), - Column('dokument_id', UUID(as_uuid=True), ForeignKey('dokument.id')) -) - -# Projekt <-> Dokument (Planung) -projekt_dokumente_planung = Table( - 'projekt_dokumente_planung', - Base.metadata, - Column('projekt_id', UUID(as_uuid=True), ForeignKey('projekt.id')), - Column('dokument_id', UUID(as_uuid=True), ForeignKey('dokument.id')) -) - -# Projekt <-> Parzelle -projekt_parzelle = Table( - 'projekt_parzelle', - Base.metadata, - Column('projekt_id', UUID(as_uuid=True), ForeignKey('projekt.id')), - Column('parzelle_id', UUID(as_uuid=True), ForeignKey('parzelle.id')) -) - -# Parzelle <-> Parzelle (Nachbarn) -parzelle_nachbar = Table( - 'parzelle_nachbar', - Base.metadata, - Column('parzelle_id', UUID(as_uuid=True), ForeignKey('parzelle.id')), - Column('nachbar_id', UUID(as_uuid=True), ForeignKey('parzelle.id')) -) - -# Parzelle <-> Dokument -parzelle_dokument = Table( - 'parzelle_dokument', - Base.metadata, - Column('parzelle_id', UUID(as_uuid=True), ForeignKey('parzelle.id')), - Column('dokument_id', UUID(as_uuid=True), ForeignKey('dokument.id')) -) - -# Dokument <-> Tag (Many-to-Many, da Tags wiederverwendbar) -dokument_tag = Table( - 'dokument_tag', - Base.metadata, - Column('dokument_id', UUID(as_uuid=True), ForeignKey('dokument.id')), - Column('tag', ENUM(TagTyp, name='tag_typ')) -) - - -# ============================================================================ -# MODELS -# ============================================================================ - -class Projekt(Base): - __tablename__ = 'projekt' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - status_prozess = Column(ARRAY(ENUM(StatusProzess, name='status_prozess'))) - - # Relationships - perimeter = relationship( - 'Parzelle', - secondary=projekt_parzelle, - back_populates='projekte' - ) - - dokumente_bauherrschaft = relationship( - 'Dokument', - secondary=projekt_dokumente_bauherrschaft - ) - - dokumente_planung = relationship( - 'Dokument', - secondary=projekt_dokumente_planung - ) - - geo_baulinie = relationship('GeoPunkt', back_populates='projekt_baulinie') - - kontext_informationen = relationship( - 'Kontext', - foreign_keys='Kontext.projekt_id', - back_populates='projekt' - ) - - -class Parzelle(Base): - __tablename__ = 'parzelle' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - parzellen_nummern = Column(ARRAY(String)) - eigentuemerschaaft = Column(String) - strasse_nr = Column(String) - - # Geografischer Kontext - land_id = Column(UUID(as_uuid=True), ForeignKey('land.id')) - kanton_id = Column(UUID(as_uuid=True), ForeignKey('kanton.id')) - gemeinde_id = Column(UUID(as_uuid=True), ForeignKey('gemeinde.id')) - - # Geometrie (PostGIS) - geo_umfang = Column(Geometry('POLYGON', srid=2056)) # LV95 Koordinatensystem - - # Bauliche Parameter - bauzone = Column(String) - az = Column(Float) # Ausnützungsziffer - bz = Column(Float) # Bebauungsziffer - vollgeschoss_zahl = Column(Integer) - anrechenbar_dachgeschoss = Column(Float) - anrechenbar_untergeschoss = Column(Float) - gebaeudehoehe_max = Column(Float) - - # Regelungen - regeln_grenzabstand = Column(Text) - regeln_mehrlaengenzuschlag = Column(Text) - regeln_mehrhoehenzuschlag = Column(Text) - - # Schutzzonen - hochwasserschutzzone = Column(String) - laermschutzzone = Column(String) - grundwasserschutzzone = Column(String) - - # Eigenschaften - parzelle_bebaut = Column(ENUM(JaNein, name='ja_nein')) - parzelle_erschlossen = Column(ENUM(JaNein, name='ja_nein')) - hanglage = Column(ENUM(JaNein, name='ja_nein')) - - # Relationships - projekte = relationship( - 'Projekt', - secondary=projekt_parzelle, - back_populates='perimeter' - ) - - nachbar_eigentuemer = relationship( - 'Parzelle', - secondary=parzelle_nachbar, - primaryjoin=id == parzelle_nachbar.c.parzelle_id, - secondaryjoin=id == parzelle_nachbar.c.nachbar_id - ) - - kontext_land = relationship('Land', back_populates='parzellen') - kontext_kanton = relationship('Kanton', back_populates='parzellen') - kontext_gemeinde = relationship('Gemeinde', back_populates='parzellen') - - spezifische_dokumente = relationship( - 'Dokument', - secondary=parzelle_dokument - ) - - kontext_informationen = relationship( - 'Kontext', - foreign_keys='Kontext.parzelle_id', - back_populates='parzelle' - ) - - -class Dokument(Base): - __tablename__ = 'dokument' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - versionsbezeichnung = Column(String) - typ = Column(ENUM(DokumentTyp, name='dokument_typ'), nullable=False) - format = Column(String) - dokument_referenz = Column(String, nullable=False) # Pfad oder URL - - # Tags als Array (einfache Variante) - # Alternative: Many-to-Many über Junction Table - tags = Column(ARRAY(ENUM(TagTyp, name='tag_typ'))) - - -class GeoPunkt(Base): - __tablename__ = 'geo_punkt' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - - # Koordinaten (einzeln gespeichert für Flexibilität) - x = Column(Float, nullable=False) - y = Column(Float, nullable=False) - z = Column(Float) # Optional - - # Alternative: PostGIS Point - # koordinaten = Column(Geometry('POINTZ', srid=2056)) - - # Kategorisierung - referenzen = Column(ARRAY(ENUM(GeoTagTyp, name='geo_tag_typ'))) - - # Foreign Keys (je nach Verwendung) - projekt_id = Column(UUID(as_uuid=True), ForeignKey('projekt.id')) - - # Relationships - projekt_baulinie = relationship('Projekt', back_populates='geo_baulinie') - - -class Kontext(Base): - __tablename__ = 'kontext' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - thema = Column(String, nullable=False) - inhalt = Column(Text, nullable=False) - - # Polymorphe Beziehung (kann zu verschiedenen Entitäten gehören) - projekt_id = Column(UUID(as_uuid=True), ForeignKey('projekt.id')) - parzelle_id = Column(UUID(as_uuid=True), ForeignKey('parzelle.id')) - land_id = Column(UUID(as_uuid=True), ForeignKey('land.id')) - kanton_id = Column(UUID(as_uuid=True), ForeignKey('kanton.id')) - gemeinde_id = Column(UUID(as_uuid=True), ForeignKey('gemeinde.id')) - - # Relationships - projekt = relationship('Projekt', back_populates='kontext_informationen') - parzelle = relationship('Parzelle', back_populates='kontext_informationen') - land = relationship('Land', back_populates='kontext_informationen') - kanton = relationship('Kanton', back_populates='kontext_informationen') - gemeinde = relationship('Gemeinde', back_populates='kontext_informationen') - - -class Gemeinde(Base): - __tablename__ = 'gemeinde' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - plz = Column(String) - - # BZO Dokumente - bzo_aktuell_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - bzo_revision_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - - # Relationships - parzellen = relationship('Parzelle', back_populates='kontext_gemeinde') - kontext_informationen = relationship( - 'Kontext', - foreign_keys='Kontext.gemeinde_id', - back_populates='gemeinde' - ) - - bzo_aktuell = relationship('Dokument', foreign_keys=[bzo_aktuell_id]) - bzo_revision = relationship('Dokument', foreign_keys=[bzo_revision_id]) - - -class Kanton(Base): - __tablename__ = 'kanton' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - - # Regelwerke - baureglement_aktuell_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - baureglement_revision_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - bauverordnung_aktuell_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - bauverordnung_revision_id = Column(UUID(as_uuid=True), ForeignKey('dokument.id')) - - # Relationships - parzellen = relationship('Parzelle', back_populates='kontext_kanton') - kontext_informationen = relationship( - 'Kontext', - foreign_keys='Kontext.kanton_id', - back_populates='kanton' - ) - - baureglement_aktuell = relationship('Dokument', foreign_keys=[baureglement_aktuell_id]) - baureglement_revision = relationship('Dokument', foreign_keys=[baureglement_revision_id]) - bauverordnung_aktuell = relationship('Dokument', foreign_keys=[bauverordnung_aktuell_id]) - bauverordnung_revision = relationship('Dokument', foreign_keys=[bauverordnung_revision_id]) - - -class Land(Base): - __tablename__ = 'land' - - id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) - label = Column(String, nullable=False) - - # Relationships - parzellen = relationship('Parzelle', back_populates='kontext_land') - kontext_informationen = relationship( - 'Kontext', - foreign_keys='Kontext.land_id', - back_populates='land' - ) - - -# ============================================================================ -# DATENBANK-SETUP -# ============================================================================ - -def create_database_engine(): - """ - Erstellt die Database Engine mit PostGIS Support - """ - from sqlalchemy import create_engine - - # Beispiel Connection String - DATABASE_URL = "postgresql://user:password@localhost:5432/architektur_app" - - engine = create_engine( - DATABASE_URL, - echo=True # SQL Logging für Development - ) - - return engine - - -def init_database(engine): - """ - Initialisiert die Datenbank und erstellt alle Tabellen - """ - # PostGIS Extension aktivieren (manuell oder via SQL) - with engine.connect() as conn: - conn.execute("CREATE EXTENSION IF NOT EXISTS postgis;") - conn.commit() - - # Tabellen erstellen - Base.metadata.create_all(engine) - - -# ============================================================================ -# BEISPIEL USAGE -# ============================================================================ - -if __name__ == "__main__": - from sqlalchemy.orm import sessionmaker - - # Engine erstellen - engine = create_database_engine() - - # Datenbank initialisieren - init_database(engine) - - # Session erstellen - Session = sessionmaker(bind=engine) - session = Session() - - # Beispiel: Schweiz erstellen - schweiz = Land( - label="Schweiz" - ) - session.add(schweiz) - - # Beispiel: Kanton Zürich erstellen - kanton_zh = Kanton( - label="Zürich" - ) - session.add(kanton_zh) - - # Beispiel: Gemeinde Zürich erstellen - gemeinde_zh = Gemeinde( - label="Zürich", - plz="8000" - ) - session.add(gemeinde_zh) - - # Beispiel: Parzelle erstellen - parzelle = Parzelle( - label="Bahnhofstrasse 1", - parzellen_nummern=["1234"], - eigentuemerschaaft="Mustermann AG", - strasse_nr="Bahnhofstrasse 1", - land_id=schweiz.id, - kanton_id=kanton_zh.id, - gemeinde_id=gemeinde_zh.id, - bauzone="W3", - az=1.5, - bz=0.4, - vollgeschoss_zahl=4, - parzelle_bebaut=JaNein.NEIN, - parzelle_erschlossen=JaNein.JA - ) - session.add(parzelle) - - # Beispiel: Projekt erstellen - projekt = Projekt( - label="Neubau Wohnhaus", - status_prozess=[StatusProzess.EINGANG, StatusProzess.ANALYSE] - ) - projekt.perimeter.append(parzelle) - session.add(projekt) - - # Beispiel: Kontext hinzufügen - kontext = Kontext( - thema="Dienstbarkeiten", - inhalt="Wegrecht zugunsten Parzelle 1235 entlang Ostgrenze", - parzelle_id=parzelle.id - ) - session.add(kontext) - - # Speichern - session.commit() - - print("Datenbank erfolgreich initialisiert und Beispieldaten eingefügt!") diff --git a/mandates/pek/datenmodell/schema.prisma b/mandates/pek/datenmodell/schema.prisma deleted file mode 100644 index 783257b..0000000 --- a/mandates/pek/datenmodell/schema.prisma +++ /dev/null @@ -1,323 +0,0 @@ -// Prisma Schema für Architektur-Planungs-App -// Unterstützt PostgreSQL mit PostGIS - -generator client { - provider = "prisma-client-js" - previewFeatures = ["postgresqlExtensions"] -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") - extensions = [postgis] -} - -// ============================================================================ -// ENUMS -// ============================================================================ - -enum StatusProzess { - EINGANG - ANALYSE - STUDIE - PLANUNG - BAURECHTSVERFAHREN - UMSETZUNG - ARCHIV -} - -enum DokumentTyp { - DATEI - URL -} - -enum TagTyp { - KATASTER_OBJEKTE - KATASTER_WERKELEITUNGEN - KATASTER_BELASTETE_STANDORTE - KATASTER_BAEUME - ZONENPLAN - PGB - BZO - PARKPLATZVERORDNUNG - EIGENTUEMER_AUSKUNFT - GRUNDBUCHAUSZUG -} - -enum GeoTagTyp { - REFERENZPUNKT_KAT1 - REFERENZPUNKT_KAT2 - REFERENZPUNKT_KAT3 - GEOMETER_AUFNAHME -} - -enum JaNein { - LEER - JA - NEIN -} - -// ============================================================================ -// MODELS -// ============================================================================ - -model Projekt { - id String @id @default(uuid()) @db.Uuid - label String - statusProzess StatusProzess[] - - // Relationships - perimeter ParzelleInProjekt[] - dokumenteBauherrschaft ProjektDokumentBauherrschaft[] - dokumentePlanung ProjektDokumentPlanung[] - geoBaulinie GeoPunkt[] - kontextInformationen Kontext[] - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("projekt") -} - -model Parzelle { - id String @id @default(uuid()) @db.Uuid - label String - parzellenNummern String[] - eigentuemerschaaft String? - strasseNr String? - - // Geografischer Kontext - landId String? @db.Uuid - kantonId String? @db.Uuid - gemeindeId String? @db.Uuid - - // Geometrie (als GeoJSON oder WKT gespeichert) - // Für echte PostGIS Integration: Unsupported.("geometry(POLYGON, 2056)") - geoUmfangJson Json? // Alternative: GeoJSON Format - - // Bauliche Parameter - bauzone String? - az Float? - bz Float? - vollgeschossZahl Int? - anrechenbarDachgeschoss Float? - anrechenbarUntergeschoss Float? - gebaeudehoehe_max Float? - - // Regelungen - regelnGrenzabstand String? - regelnMehrlaengenzuschlag String? - regelnMehrhoehenzuschlag String? - - // Schutzzonen - hochwasserschutzzone String? - laermschutzzone String? - grundwasserschutzzone String? - - // Eigenschaften - parzelleBebaut JaNein? - parzelleErschlossen JaNein? - hanglage JaNein? - - // Relationships - projekte ParzelleInProjekt[] - nachbarEigentuemer_von ParzelleNachbar[] @relation("ParzelleNachbarVon") - nachbarEigentuemer_zu ParzelleNachbar[] @relation("ParzelleNachbarZu") - - kontextLand Land? @relation(fields: [landId], references: [id]) - kontextKanton Kanton? @relation(fields: [kantonId], references: [id]) - kontextGemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id]) - - spezifischeDokumente ParzelleDokument[] - kontextInformationen Kontext[] - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("parzelle") -} - -model Dokument { - id String @id @default(uuid()) @db.Uuid - label String - versionsbezeichnung String? - typ DokumentTyp - format String? - dokumentReferenz String - tags TagTyp[] - - // Relationships - projekteBauherrschaft ProjektDokumentBauherrschaft[] - projektePlanung ProjektDokumentPlanung[] - parzellen ParzelleDokument[] - - // Spezifische Dokumente für Gemeinde/Kanton - gemeindeBzoAktuell Gemeinde[] @relation("GemeindeBZOAktuell") - gemeindeBzoRevision Gemeinde[] @relation("GemeindeBZORevision") - kantonBaureglementAktuell Kanton[] @relation("KantonBaureglementAktuell") - kantonBaureglementRevision Kanton[] @relation("KantonBaureglementRevision") - kantonBauverordnungAktuell Kanton[] @relation("KantonBauverordnungAktuell") - kantonBauverordnungRevision Kanton[] @relation("KantonBauverordnungRevision") - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("dokument") -} - -model GeoPunkt { - id String @id @default(uuid()) @db.Uuid - x Float - y Float - z Float? - referenzen GeoTagTyp[] - - // Foreign Keys - projektId String? @db.Uuid - projekt Projekt? @relation(fields: [projektId], references: [id]) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("geo_punkt") -} - -model Kontext { - id String @id @default(uuid()) @db.Uuid - thema String - inhalt String @db.Text - - // Polymorphe Beziehung (kann zu verschiedenen Entitäten gehören) - projektId String? @db.Uuid - parzelleId String? @db.Uuid - landId String? @db.Uuid - kantonId String? @db.Uuid - gemeindeId String? @db.Uuid - - // Relationships - projekt Projekt? @relation(fields: [projektId], references: [id], onDelete: Cascade) - parzelle Parzelle? @relation(fields: [parzelleId], references: [id], onDelete: Cascade) - land Land? @relation(fields: [landId], references: [id], onDelete: Cascade) - kanton Kanton? @relation(fields: [kantonId], references: [id], onDelete: Cascade) - gemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id], onDelete: Cascade) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("kontext") -} - -model Gemeinde { - id String @id @default(uuid()) @db.Uuid - label String - plz String? - - // BZO Dokumente - bzoAktuellId String? @db.Uuid - bzoRevisionId String? @db.Uuid - - // Relationships - parzellen Parzelle[] - kontextInformationen Kontext[] - - bzoAktuell Dokument? @relation("GemeindeBZOAktuell", fields: [bzoAktuellId], references: [id]) - bzoRevision Dokument? @relation("GemeindeBZORevision", fields: [bzoRevisionId], references: [id]) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("gemeinde") -} - -model Kanton { - id String @id @default(uuid()) @db.Uuid - label String - - // Regelwerke - baureglementAktuellId String? @db.Uuid - baureglementRevisionId String? @db.Uuid - bauverordnungAktuellId String? @db.Uuid - bauverordnungRevisionId String? @db.Uuid - - // Relationships - parzellen Parzelle[] - kontextInformationen Kontext[] - - baureglementAktuell Dokument? @relation("KantonBaureglementAktuell", fields: [baureglementAktuellId], references: [id]) - baureglementRevision Dokument? @relation("KantonBaureglementRevision", fields: [baureglementRevisionId], references: [id]) - bauverordnungAktuell Dokument? @relation("KantonBauverordnungAktuell", fields: [bauverordnungAktuellId], references: [id]) - bauverordnungRevision Dokument? @relation("KantonBauverordnungRevision", fields: [bauverordnungRevisionId], references: [id]) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("kanton") -} - -model Land { - id String @id @default(uuid()) @db.Uuid - label String - - // Relationships - parzellen Parzelle[] - kontextInformationen Kontext[] - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@map("land") -} - -// ============================================================================ -// JUNCTION TABLES (Many-to-Many) -// ============================================================================ - -model ParzelleInProjekt { - projektId String @db.Uuid - parzelleId String @db.Uuid - projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) - parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade) - - @@id([projektId, parzelleId]) - @@map("projekt_parzelle") -} - -model ParzelleNachbar { - parzelleId String @db.Uuid - nachbarId String @db.Uuid - parzelle Parzelle @relation("ParzelleNachbarVon", fields: [parzelleId], references: [id], onDelete: Cascade) - nachbar Parzelle @relation("ParzelleNachbarZu", fields: [nachbarId], references: [id], onDelete: Cascade) - - @@id([parzelleId, nachbarId]) - @@map("parzelle_nachbar") -} - -model ProjektDokumentBauherrschaft { - projektId String @db.Uuid - dokumentId String @db.Uuid - projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) - dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) - - @@id([projektId, dokumentId]) - @@map("projekt_dokument_bauherrschaft") -} - -model ProjektDokumentPlanung { - projektId String @db.Uuid - dokumentId String @db.Uuid - projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade) - dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) - - @@id([projektId, dokumentId]) - @@map("projekt_dokument_planung") -} - -model ParzelleDokument { - parzelleId String @db.Uuid - dokumentId String @db.Uuid - parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade) - dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade) - - @@id([parzelleId, dokumentId]) - @@map("parzelle_dokument") -} diff --git a/mandates/pek/testing/bostich_hole_punch.3ds b/mandates/pek/testing/bostich_hole_punch.3ds deleted file mode 100644 index 6c3fb3a..0000000 Binary files a/mandates/pek/testing/bostich_hole_punch.3ds and /dev/null differ diff --git a/mandates/pek/testing/create_bostich_3ds.py b/mandates/pek/testing/create_bostich_3ds.py deleted file mode 100644 index 32f23d8..0000000 --- a/mandates/pek/testing/create_bostich_3ds.py +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/env python3 -""" -Create 3DS file for LEITZ Bostitch 2-hole punch -Based on photos showing 20cm x 10cm x 10cm dimensions -""" - -import struct -import math - -def _write3dsHeader(f): - """Write 3DS file header""" - # Main chunk header - f.write(b'\x4D\x4D') # Magic number - f.write(struct.pack('---