B2B-Kundenportal (Customer Portal)
portal
portal_ecosystem
🛡️ RLS Protected
Multi-Mandanten-Self-Service für Kunden: Katalogbestellungen, Rechnungsabruf, Serviceberichte und Support.
⚡ Workflows & Lifecycles
Kundenportal-Bestellung & ERP-Kaskadierung
portal_order_cascade
Vom Warenkorb im Kundenportal bis zur automatischen Anlage von Angebot und Lieferauftrag.
Benutzerbefehl: customer crud subagent
plan:command_customer_crud_subagent
Geprüfter Durable-Plan (durable_plan), Start: manual_command.
Benutzerbefehl: portal admin agent
plan:command_portal_admin_agent
Geprüfter Durable-Plan (durable_plan), Start: manual_command.
Kundenportal-Anfrage eingegangen
plan:portal_request_dispatch
Geprüfter Durable-Plan (durable_plan), Start: domain_event.
⚙️ Fachprozesse & Capabilities (System-Fachlogik)
Registrierte Fachoperationen und System-Capabilities dieses Moduls zur Steuerung von Workflows, Kaskaden und KI-Agenten.
| Capability & Schlüssel | Fachliche Bezeichnung | Ausführung / Coverage | Risikostufe & Freigabe | Effekte & Kaskaden |
|---|---|---|---|---|
Agent-Einstieg customer_crud_subagent
agent_entry:customer_crud_subagent
|
Agent-Einstieg customer_crud_subagent
Quelle:
code:module_agent_map
|
manual_entry |
✓ Auto
|
Keine Seiteneffekte deklariert |
Kunden anlegen
capability:customer.create
Op:
customer.create
|
Intent:
create_customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Kreditlimit
capability:customer.credit.limit_set
Op:
customer.credit.limit_set
|
Objekt:
customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Mahnsperre
capability:customer.dunning.block
Op:
customer.dunning.block
|
Objekt:
customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Kunden aktualisieren
capability:customer.update
Op:
customer.update
|
Intent:
update_customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Customer: create
capability:customers.customer.create
Op:
customers.customer.create
|
Objekt:
customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Customer: delete
capability:customers.customer.delete
Op:
customers.customer.delete
|
Objekt:
customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Customer: update
capability:customers.customer.update
Op:
customers.customer.update
|
Objekt:
customer
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal-Dokumentfreigabe widerrufen
capability:portal.document.revoke
Op:
portal.document.revoke
|
Objekt:
portal_document
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal Dokument
capability:portal.document.share
Op:
portal.document.share
|
Objekt:
portal_document
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
external_effect
|
|
Passwort erzwingen
capability:portal.password.force_reset
Op:
portal.password.force_reset
|
Objekt:
portal_account
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: create account
capability:portal.portal.create_account
Op:
portal.portal.create_account
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: create invite
capability:portal.portal.create_invite
Op:
portal.portal.create_invite
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: create ticket
capability:portal.portal.create_ticket
Op:
portal.portal.create_ticket
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: decide task
capability:portal.portal.decide_task
Op:
portal.portal.decide_task
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: reply ticket
capability:portal.portal.reply_ticket
Op:
portal.portal.reply_ticket
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: reset account password
capability:portal.portal.reset_account_password
Op:
portal.portal.reset_account_password
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: revoke invite
capability:portal.portal.revoke_invite
Op:
portal.portal.revoke_invite
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: set account status
capability:portal.portal.set_account_status
Op:
portal.portal.set_account_status
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal: update profile
capability:portal.portal.update_profile
Op:
portal.portal.update_profile
|
Objekt:
portal
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal auto-freigabe
capability:portal.request.auto_approve
Op:
portal.request.auto_approve
|
Objekt:
portal_request
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
external_effect
|
|
Portal-Konto anlegen
capability:portal_account.create
Op:
portal_account.create
|
Intent:
create_portal_account
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
external_effect
|
|
Portal-Passwort zurücksetzen
capability:portal_account.reset_password
Op:
portal_account.reset_password
|
Intent:
reset_portal_password
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
external_effect
|
|
Portal-Konto-Status setzen
capability:portal_account.set_status
Op:
portal_account.set_status
|
Intent:
set_portal_account_status
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
business_record
|
|
Portal-Einladung erstellen
capability:portal_invite.create
Op:
portal_invite.create
|
Intent:
invite_portal_user
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
external_effect
|
|
Portal-Einladung widerrufen
capability:portal_invite.revoke
Op:
portal_invite.revoke
|
Intent:
revoke_portal_invite
Quelle:
code:capability_registry
|
⚙️ Engine |
✓ Auto
Risiko:
business_record
|
|
Portal-Anfrage entscheiden
capability:portal_request.decide
Op:
portal_request.decide
|
Intent:
decide_portal_request
Quelle:
code:capability_registry
|
⚙️ Engine |
🔒 Freigabe nötig
Risiko:
business_record
|
|
customer: create form
form_surface_anchor:customer.create
|
Objekt:
customer
Quelle:
code:erp_form_surface
|
operator_surface |
✓ Auto
|
Keine Seiteneffekte deklariert |
customer: edit form
form_surface_anchor:customer.edit
|
Objekt:
customer
Quelle:
code:erp_form_surface
|
operator_surface |
✓ Auto
|
Keine Seiteneffekte deklariert |
Portal-Anfrage entscheiden
gateway:portal_request_decision
Op:
portal_request.decide
|
Portal-Anfrage entscheiden
Quelle:
code:reviewed_gateway
|
⚙️ Engine |
✓ Auto
|
Keine Seiteneffekte deklariert |
Benutzerbefehl: customer crud subagent
plan:command_customer_crud_subagent
|
Benutzerbefehl: customer crud subagent
Quelle:
code:reviewed_execution_plan
|
durable_plan |
✓ Auto
|
Keine Seiteneffekte deklariert |
Benutzerbefehl: portal admin agent
plan:command_portal_admin_agent
|
Benutzerbefehl: portal admin agent
Quelle:
code:reviewed_execution_plan
|
durable_plan |
✓ Auto
|
Keine Seiteneffekte deklariert |
Kundenportal-Anfrage eingegangen
plan:portal_request_dispatch
|
Kundenportal-Anfrage eingegangen
Quelle:
code:reviewed_execution_plan
|
durable_plan |
✓ Auto
|
Keine Seiteneffekte deklariert |
🧠 Fachprozess-Erzählung & Dual Knowledge Architektur
Synthese aus der ideologischen Blaupause (Meta-Fachlogik / Soll), der faktischen System-Implementierung (System-Fachlogik / Ist) und No-Code Customizing für KI-Consultants.
Der durchgängige Businessprozess im Detail (End-to-End Fließtext-Erzählung)
Der funktionale Ablauf von B2B-Kundenportal (Customer Portal) im Kundenportal-Ökosystem
Das Modul portal öffnet das ERP-System sicher für externe Geschäftspartner und Kunden. Über ein modernes Webportal können Kunden selbstständig Auftragsstände abrufen, Rechnungen herunterladen, Mietgeräte reservieren oder Service-Tickets eröffnen. Alle Portal-Aktionen werden über geschützte APIs direkt in die internen Fachmodule kaskadiert.
Meta-Fachlogik: Ideologische Blaupause, Soll-Weltbild & Normen
Meta-Fachlogik: B2B-Kundenportale & Schnittstellensicherheit
Basiert auf den OWASP Top 10 API Security Standards, B2B-E-Commerce Best Practices und DSGVO-konformen Zugriffsrechten für externe Mandantenbenutzer.
Normbezug für portal
Prüfkatalog Standards-Registry v2026.10.1. Dieser Abschnitt ordnet Prüfreferenzen zu und stellt nicht fest, dass das Modul eine Norm einhält; keine Kataloganforderung ist als PASS bewertet.
Geführte Prüfreferenzen:
wcag-2.2, Web Content Accessibility Guidelines (WCAG) 2.2, Ausgabe W3C Recommendation 2023-10-05. Art: normative. Öffentlicher Text. Die Nennung ist keine Klauselprüfung. Keine modulspezifische Kataloganforderung. Die Zuordnung bleibt eine Prüfreferenz.eu-gdpr-2016-679, Regulation (EU) 2016/679 (General Data Protection Regulation, GDPR/DSGVO), Ausgabe Regulation (EU) 2016/679, anwendbar ab 2018-05-25. Art: regulatory. Öffentlicher Text. Die Nennung ist keine Klauselprüfung. Keine modulspezifische Kataloganforderung. Die Zuordnung bleibt eine Prüfreferenz.
Plattformweite Katalogwerke mit Geltungsbereich all (unter anderem WCAG 2.2, EN 301 549 V4.1.1, ISO 9241-110:2020, ISO 9241-210:2019, ISO/IEC 25010:2023, ISO 9001:2026, ISO/IEC 27001:2022, APQC PCF 8.0, DSGVO, EU AI Act) umfassen dieses Modul mit. Wo der Volltext fehlt, bleibt der Zugang ohne Quelle, lizenzpflichtig oder nur als öffentliche Zusammenfassung gekennzeichnet. Auch diese Nennung weist keine eingehaltene Vorgabe nach.
Systemische Fachlogik: Faktische Umsetzung in Centurio ERP & Capabilities
Systemische Fachlogik: Die faktische Umsetzung von B2B-Kundenportal (Customer Portal)
Realisierung über app.modules.portal mit dedizierten Portal-Rollen, Token-basierter Authentifizierung und strenger RLS-Trennung.
KI-Consultant Leitfaden: Customizing- & No-Code-Konzept (Soll-Ist-Synthese)
KI-Consultant Blueprint: Customizing & No-Code Leitfaden für B2B-Kundenportal (Customer Portal)
-
Zusatzfelder: Kundenspezifische Portal-Konfigurationsschalter und Freigabestufen anlegen.
-
DAG-Workflows: Automatische Benachrichtigungen bei neuen Rechnungen oder Statusänderungen aktivieren.
📚 Operative Prozessbegriffe & Transaktionsschnittstellen
- Kundeninteraktionen im Webportal
- Dokumenten-Downloads
- Serviceanfragen und Ticketmeldungen
- Portal-Aktivitätslogs
- Erzeugte Support-Tickets
- Kundenbestätigungen
- portal_request_created -> internal_ticket_opened: Sofortige Ticketanlage
- invoice_published -> notify_portal_user: Download-Bereitstellung
- Manuelle Ausnahmebehandlung durch berechtigte Sachbearbeiter
- Revisionssichere Protokollierung im Audit-Trail
- Portal-Branding (Logo, Farben) anpassen
- Self-Service-Funktionen je Kundengruppe freischalten
🗄️ Data Models & Fields
🔌 Entry Points (UI & APIs)
| Art | Method | Endpoint / Path | Titel & Zweck | Required Role |
|---|---|---|---|---|
| ⚡ REST API | DELETE | /api/v1/customers/{customer_id} |
delete_customer
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | DELETE | /api/v1/customers/{customer_id}/contacts/{contact_id} |
delete_contact
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | GET | /api/v1/customers |
list_customers
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/stats |
customer_stats
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id} |
get_customer
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id}/contacts |
list_contacts
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id}/invoice-recipient |
get_invoice_recipient
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id}/portal |
customer_portal_state
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id}/shop-rates |
list_partner_shop_rates
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /api/v1/customers/{customer_id}/tree |
get_customer_tree
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /customers |
customers_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /customers/new |
customer_create_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /customers/{customer_id} |
customer_detail_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /customers/{customer_id}/edit |
customer_detail_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /customers/{customer_id}/portal |
customer_portal_admin_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | GET | /portal/{slug}/profil |
profile_page
Semantic binding: inventory_only; mutation=False
|
customers
|
| ⚡ REST API | PATCH | /api/v1/customers/{customer_id} |
update_customer
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | PATCH | /api/v1/customers/{customer_id}/contacts/{contact_id} |
update_contact
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers |
create_customer
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/contacts |
create_contact
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/accounts |
customer_portal_account_add
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/accounts/{account_id}/password |
customer_portal_account_password
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/accounts/{account_id}/status |
customer_portal_account_status
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/invites |
customer_portal_invite
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/invites/{invite_id}/revoke |
customer_portal_invite_revoke
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /api/v1/customers/{customer_id}/portal/toggle |
customer_portal_toggle
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal |
customer_portal_admin_save
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal/accounts |
customer_portal_account_create
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal/accounts/{account_id}/password |
customer_portal_account_password
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal/accounts/{account_id}/status |
customer_portal_account_status
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal/invites |
customer_portal_invite_create
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /customers/{customer_id}/portal/invites/{invite_id}/revoke |
customer_portal_invite_revoke
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /portal/{slug}/profil |
profile_submit
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /portal/{slug}/profil/kontakte |
profile_contact_save
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /portal/{slug}/profil/kontakte/{contact_id}/loeschen |
profile_contact_delete
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /portal/{slug}/profil/standorte |
profile_location_save
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | POST | /portal/{slug}/profil/standorte/{location_id}/deaktivieren |
profile_location_deactivate
Semantic binding: operator_surface; mutation=True
|
customers
|
| ⚡ REST API | PUT | /api/v1/customers/{customer_id}/shop-rates |
upsert_partner_shop_rate
Semantic binding: operator_surface; mutation=True
|
customers
|
| 🖥️ WEB-UI | GET | /portal/{slug}/ |
Portal Startseite
Kunden-Dashboard mit Schnellzugriffen und Statuskacheln
|
Standard |
| 🖥️ WEB-UI | GET | /portal/{slug}/bestellung |
Portal Bestellseite
Katalogbestellung mit dynamischen Fieldsets
|
Standard |
| 🖥️ WEB-UI | GET | /portal/{slug}/rechnungen |
Portal Rechnungen
Rechnungsarchiv und PDF-Download
|
Standard |
| ⚡ REST API | POST | /portal/{slug}/bestellung |
Bestellung einreichen
Validiert Fieldsets und erzeugt Quote/WorkOrder
|
Standard |
🛡️ Regulatory & Compliance
Dieses Modul unterliegt folgenden gesetzlichen, regulatorischen und Revisionsstandards:
- DSGVO Art. 15 (Recht auf Auskunft & Datenzugriff)
- B2B Datensicherheit & RLS-Isolation