Centurio System & Module Documentation
🏛️ Platform Architecture 🔑 Login
All Modules / portal_ecosystem / B2B-Kundenportal (Customer Portal)
🌐

B2B-Kundenportal (Customer Portal)

portal portal_ecosystem 🛡️ RLS Protected

Multi-Mandanten-Self-Service für Kunden: Katalogbestellungen, Rechnungsabruf, Serviceberichte und Support.

Fachliche Bestimmung: Exklusives B2B-Kundenportal für Mandantenkunden. Bietet 14 integrierte Fachmodule (Produkte, Bestellungen mit Attribut-Fieldsets, Angebote, Aufträge, Serviceberichte, Rechnungen, Termine, Retouren, Anlagen und Support-Tickets). Gewährleistet strikte Zweistufen-Isolation (tenant_id + customer_id) und zweistufige Feature-Governance (globale PortalSettings vs. kundenindividuelle Feature-Toggles).

⚡ Workflows & Lifecycles

Kundenportal-Bestellung & ERP-Kaskadierung portal_order_cascade

Vom Warenkorb im Kundenportal bis zur automatischen Anlage von Angebot und Lieferauftrag.

sequenceDiagram Kunde im Portal->>PortalAPI: POST /portal/{slug}/bestellung (Positionen & Fieldsets) PortalAPI->>PortalAPI: validate_attribute_values() PortalAPI->>DB: INSERT INTO quotes (source_type = 'SYSTEM') PortalAPI->>DB: INSERT INTO work_orders (order_type = 'delivery', status = 'SCHEDULED') PortalAPI-->>Kunde im Portal: Bestätigungsseite & Auftragsnummer
1. CATALOG
Produktauswahl
Kunde wählt Produkte und füllt dynamische Attribut-Fieldsets aus.
Aktionen: Pflichtfeldprüfung im Browser
2. SUBMIT
Bestellübermittlung
POST an /portal/{slug}/bestellung mit typvalidierten semantic_attributes.
Aktionen: order_submit ausführen
3. QUOTE_GEN
Angebotsanlage
System erzeugt Quote mit source_type='SYSTEM' und 'portal_order'.
Aktionen: semantic_attributes übernehmen
4. WORKORDER_GEN
Auftragsanlage
Automatisches Erzeugen des Ausführungsauftrags (WorkOrder) im LVS/ERP.
Aktionen: Lager oder Strecke anstoßen

Benutzerbefehl: customer crud subagent plan:command_customer_crud_subagent

Geprüfter Durable-Plan (durable_plan), Start: manual_command.

1. customer_crud_subagent
customer_crud_subagent
{"key": "execute_command", "label": "Befehl prüfen, ausführen oder zur Freigabe vorlegen", "adapter": "agent.execute", "agent": "customer_crud_subagent", "condition_fact": null}
Aktionen: customer_crud_subagent

Benutzerbefehl: portal admin agent plan:command_portal_admin_agent

Geprüfter Durable-Plan (durable_plan), Start: manual_command.

1. portal_admin_agent
portal_admin_agent
{"key": "execute_command", "label": "Befehl prüfen, ausführen oder zur Freigabe vorlegen", "adapter": "agent.execute", "agent": "portal_admin_agent", "condition_fact": null}
Aktionen: portal_admin_agent

Kundenportal-Anfrage eingegangen plan:portal_request_dispatch

Geprüfter Durable-Plan (durable_plan), Start: domain_event.

1. portal_request_dispatch_agent
portal_request_dispatch_agent
{"key": "step_0", "label": "Portal-Anfrage als Aufgabe disponieren", "adapter": "agent.execute", "agent": "portal_request_dispatch_agent", "condition_fact": null}
Aktionen: portal_request_dispatch_agent

⚙️ Fachprozesse & Capabilities (System-Fachlogik)

Registrierte Fachoperationen und System-Capabilities dieses Moduls zur Steuerung von Workflows, Kaskaden und KI-Agenten.

Gesamt: 33 manual_entry: 1 engine: 26 operator_surface: 2 engine_step: 1 durable_plan: 3
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
  • customer.created
Kreditlimit capability:customer.credit.limit_set
Op: customer.credit.limit_set
Objekt: customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.credit.limit_set
Mahnsperre capability:customer.dunning.block
Op: customer.dunning.block
Objekt: customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.dunning.block
Kunden aktualisieren capability:customer.update
Op: customer.update
Intent: update_customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.updated
Customer: create capability:customers.customer.create
Op: customers.customer.create
Objekt: customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.create
Customer: delete capability:customers.customer.delete
Op: customers.customer.delete
Objekt: customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.delete
Customer: update capability:customers.customer.update
Op: customers.customer.update
Objekt: customer
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • customer.update
Portal-Dokumentfreigabe widerrufen capability:portal.document.revoke
Op: portal.document.revoke
Objekt: portal_document
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • portal.document.revoke
Portal Dokument capability:portal.document.share
Op: portal.document.share
Objekt: portal_document
Quelle: code:capability_registry
⚙️ Engine
🔒 Freigabe nötig Risiko: external_effect
  • portal.document.share
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.password.force_reset
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_account
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_invite
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.create_ticket
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.decide_task
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.reply_ticket
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.reset_account_password
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.revoke_invite
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.set_account_status
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.update_profile
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.request.auto_approve
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.account_created
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.password_reset
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.account_status_changed
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.invite_created
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.invite_revoked
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
  • portal_request.decided
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.

Dual Knowledge Layer
📖

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)

AI Solution Architect Blueprint

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

Zentrale Fachbegriffe im Prozesszusammenhang (Operatives Modell)
Self-Service Portal
Sicherer B2B-Zugang für Kunden zur Einsicht von Aufträgen, Rechnungen und Dokumenten.
Portal-Berechtigungen
Granulare Zugriffskontrolle auf Firmenebene.
Echtzeit-Tracking
Live-Status von Lieferungen und Serviceaufträgen.
Support-Anfragen
Direkte Ticketerstellung und Dokumenten-Upload aus dem Kundenportal.
📥 Eingänge & Trigger (Inputs)
  • Kundeninteraktionen im Webportal
  • Dokumenten-Downloads
  • Serviceanfragen und Ticketmeldungen
📤 Ausgänge & Arbeitsergebnisse (Outputs)
  • Portal-Aktivitätslogs
  • Erzeugte Support-Tickets
  • Kundenbestätigungen
⚡ Kaskaden & Folgeprozesse (Cascades)
  • portal_request_created -> internal_ticket_opened: Sofortige Ticketanlage
  • invoice_published -> notify_portal_user: Download-Bereitstellung
🛡️ Nebenprozesse & Resilienz
  • Manuelle Ausnahmebehandlung durch berechtigte Sachbearbeiter
  • Revisionssichere Protokollierung im Audit-Trail
💡 No-Code Checkliste & Praxistipps
  • Portal-Branding (Logo, Farben) anpassen
  • Self-Service-Funktionen je Kundengruppe freischalten

🗄️ Data Models & Fields

Customers customers RLS Aktiv
59 Fields / Columns

Tabelle customers

Feldname Data Type Required Schlüssel Functional Meaning
type VARCHAR(48) Ja * - Feld type
name VARCHAR(255) Ja * - Feld name
customer_number VARCHAR(64) Nein - Feld customer_number
company_name VARCHAR(255) Nein - Feld company_name
parent_customer_id UUID Nein FK ➔ customers.id Feld parent_customer_id
billing_recipient_customer_id UUID Nein FK ➔ customers.id Feld billing_recipient_customer_id
main_contact_id UUID Nein FK ➔ contacts.id Feld main_contact_id
email VARCHAR(320) Nein - Feld email
phone VARCHAR(64) Nein - Feld phone
mobile VARCHAR(64) Nein - Feld mobile
street VARCHAR(255) Nein - Feld street
postal_code VARCHAR(16) Nein - Feld postal_code
city VARCHAR(128) Nein - Feld city
country_code VARCHAR(2) Nein - Feld country_code
latitude NUMERIC(9, 6) Nein - Feld latitude
longitude NUMERIC(9, 6) Nein - Feld longitude
tax_id VARCHAR(32) Nein - Feld tax_id
vat_id VARCHAR(32) Nein - Feld vat_id
peppol_endpoint_id VARCHAR(64) Nein - Feld peppol_endpoint_id
peppol_endpoint_scheme VARCHAR(16) Nein - Feld peppol_endpoint_scheme
category VARCHAR(48) Ja * - Feld category
website VARCHAR(255) Nein - Feld website
fax VARCHAR(64) Nein - Feld fax
iban VARCHAR(34) Nein - Feld iban
bic VARCHAR(11) Nein - Feld bic
bank_name VARCHAR(128) Nein - Feld bank_name
account_holder VARCHAR(255) Nein - Feld account_holder
payment_terms VARCHAR(128) Nein - Feld payment_terms
payment_term_code VARCHAR(32) Nein - Feld payment_term_code
discount_days INTEGER Nein - Feld discount_days
discount_percent NUMERIC(5, 2) Nein - Feld discount_percent
default_pricelist_id UUID Nein FK ➔ pricelists.id Feld default_pricelist_id
credit_limit NUMERIC(12, 2) Nein - Feld credit_limit
default_currency VARCHAR(3) Nein - Feld default_currency
language VARCHAR(10) Nein - Feld language
birthday DATE Nein - Feld birthday
department VARCHAR(128) Nein - Feld department
job_title VARCHAR(128) Nein - Feld job_title
external_reference VARCHAR(128) Nein - Feld external_reference
receivable_account_code VARCHAR(32) Nein - Feld receivable_account_code
payable_account_code VARCHAR(32) Nein - Feld payable_account_code
default_location_id UUID Nein FK ➔ locations.id Feld default_location_id
preferred_shipping_method VARCHAR(128) Nein - Feld preferred_shipping_method
purchasing_discount_group VARCHAR(128) Nein - Feld purchasing_discount_group
notes TEXT Nein - Feld notes
portal_enabled BOOLEAN Ja * - Feld portal_enabled
portal_features JSONB Nein - Feld portal_features
status VARCHAR(48) Ja * - Feld status
detection_confidence NUMERIC(4, 3) Nein - Feld detection_confidence
id UUID Nein PK Feld id
tenant_id UUID Ja * FK ➔ organizations.id Feld tenant_id
created_at DATETIME Ja * - Feld created_at
updated_at DATETIME Ja * - Feld updated_at
created_by UUID Nein - Feld created_by
updated_by UUID Nein - Feld updated_by
source_type VARCHAR(32) Nein - Feld source_type
source_id UUID Nein - Feld source_id
metadata JSONB Ja * - Feld metadata
deleted_at DATETIME Nein - Feld deleted_at
PortalInvites portal_invites RLS Aktiv
14 Fields / Columns

Tabelle portal_invites

Feldname Data Type Required Schlüssel Functional Meaning
customer_id UUID Ja * FK ➔ customers.id Feld customer_id
email VARCHAR(320) Ja * - Feld email
token_hash VARCHAR(64) Ja * - Feld token_hash
expires_at DATETIME Ja * - Feld expires_at
used_at DATETIME Nein - Feld used_at
id UUID Nein PK Feld id
tenant_id UUID Ja * FK ➔ organizations.id Feld tenant_id
created_at DATETIME Ja * - Feld created_at
updated_at DATETIME Ja * - Feld updated_at
created_by UUID Nein - Feld created_by
updated_by UUID Nein - Feld updated_by
source_type VARCHAR(32) Nein - Feld source_type
source_id UUID Nein - Feld source_id
metadata JSONB Ja * - Feld metadata
PortalRequests portal_requests RLS Aktiv
19 Fields / Columns

Tabelle portal_requests

Feldname Data Type Required Schlüssel Functional Meaning
customer_id UUID Ja * FK ➔ customers.id Feld customer_id
portal_user_id UUID Nein FK ➔ portal_users.id Feld portal_user_id
request_type VARCHAR(24) Ja * - Feld request_type
asset_id UUID Nein FK ➔ assets.id Feld asset_id
payload JSON Nein - Feld payload
note TEXT Nein - Feld note
status VARCHAR(16) Ja * - Feld status
handled_by UUID Nein - Feld handled_by
handled_at DATETIME Nein - Feld handled_at
rejection_note TEXT Nein - Feld rejection_note
id UUID Nein PK Feld id
tenant_id UUID Ja * FK ➔ organizations.id Feld tenant_id
created_at DATETIME Ja * - Feld created_at
updated_at DATETIME Ja * - Feld updated_at
created_by UUID Nein - Feld created_by
updated_by UUID Nein - Feld updated_by
source_type VARCHAR(32) Nein - Feld source_type
source_id UUID Nein - Feld source_id
metadata JSONB Ja * - Feld metadata
PortalSettings portal_settings RLS Aktiv
37 Fields / Columns

Tabelle portal_settings

Feldname Data Type Required Schlüssel Functional Meaning
enabled BOOLEAN Ja * - Feld enabled
allow_registration BOOLEAN Ja * - Feld allow_registration
registration_requires_review BOOLEAN Ja * - Feld registration_requires_review
show_products BOOLEAN Ja * - Feld show_products
show_quotes BOOLEAN Ja * - Feld show_quotes
show_contracts BOOLEAN Ja * - Feld show_contracts
show_assets BOOLEAN Ja * - Feld show_assets
show_stock BOOLEAN Ja * - Feld show_stock
show_invoices BOOLEAN Ja * - Feld show_invoices
show_tickets BOOLEAN Ja * - Feld show_tickets
show_prices BOOLEAN Ja * - Feld show_prices
show_workorders BOOLEAN Ja * - Feld show_workorders
show_projects BOOLEAN Ja * - Feld show_projects
show_service_reports BOOLEAN Ja * - Feld show_service_reports
show_appointments BOOLEAN Ja * - Feld show_appointments
show_returns BOOLEAN Ja * - Feld show_returns
show_shipments BOOLEAN Ja * - Feld show_shipments
show_rental BOOLEAN Ja * - Feld show_rental
show_tasks BOOLEAN Ja * - Feld show_tasks
allow_rental_booking BOOLEAN Ja * - Feld allow_rental_booking
return_allow_customer_return BOOLEAN Ja * - Feld return_allow_customer_return
return_allow_consignment_return BOOLEAN Ja * - Feld return_allow_consignment_return
return_allow_stored_goods_return BOOLEAN Ja * - Feld return_allow_stored_goods_return
return_allow_rental_return BOOLEAN Ja * - Feld return_allow_rental_return
return_window_days INTEGER Nein - Feld return_window_days
return_auto_approve BOOLEAN Ja * - Feld return_auto_approve
allow_document_downloads BOOLEAN Ja * - Feld allow_document_downloads
welcome_text TEXT Nein - Feld welcome_text
id UUID Nein PK Feld id
tenant_id UUID Ja * FK ➔ organizations.id Feld tenant_id
created_at DATETIME Ja * - Feld created_at
updated_at DATETIME Ja * - Feld updated_at
created_by UUID Nein - Feld created_by
updated_by UUID Nein - Feld updated_by
source_type VARCHAR(32) Nein - Feld source_type
source_id UUID Nein - Feld source_id
metadata JSONB Ja * - Feld metadata
PortalUsers portal_users RLS Aktiv
16 Fields / Columns

Tabelle portal_users

Feldname Data Type Required Schlüssel Functional Meaning
customer_id UUID Ja * FK ➔ customers.id Feld customer_id
email VARCHAR(320) Ja * - Feld email
name VARCHAR(255) Ja * - Feld name
password_hash VARCHAR(255) Ja * - Feld password_hash
status VARCHAR(16) Ja * - Feld status
language VARCHAR(10) Ja * - Feld language
last_login_at DATETIME Nein - Feld last_login_at
id UUID Nein PK Feld id
tenant_id UUID Ja * FK ➔ organizations.id Feld tenant_id
created_at DATETIME Ja * - Feld created_at
updated_at DATETIME Ja * - Feld updated_at
created_by UUID Nein - Feld created_by
updated_by UUID Nein - Feld updated_by
source_type VARCHAR(32) Nein - Feld source_type
source_id UUID Nein - Feld source_id
metadata JSONB Ja * - Feld metadata

🔌 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
Related Modules:
➔ customers ➔ finance ➔ workorders ➔ catalog ➔ returns