Centurio System- & Moduldokumentation
🏛️ Plattform-Architektur 🔑 Login
🏠 Alle Module / crm_office / Kundenstamm
📘

Kundenstamm

customers crm_office 🛡️ RLS Protected

Kundenstamm — aus Code abgeleitete Prozess- und API-Dokumentation.

Fachliche Bestimmung: Kundenstamm — aus Code abgeleitete Prozess- und API-Dokumentation. Erfasst alle registrierten Prozesse, Capabilities, Zustandsmaschinen, APIs und Tabellen für Simulationen und Reviews.

⚡ Workflows & Lebenszyklen

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

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

🗄️ Datenmodelle & Felder

Customers customers RLS Aktiv
59 Felder / Spalten

Tabelle customers

Feldname Datentyp Pflicht Schlüssel Fachliche Bedeutung
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

🔌 Einstiegspunkte (UI & APIs)

Art Methode Endpunkt / Pfad Titel & Zweck Berechtigung
⚡ REST API DELETE /api/v1/customers/{customer_id}
delete_customer
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API DELETE /api/v1/customers/{customer_id}/contacts/{contact_id}
delete_contact
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API GET /api/v1/customers
list_customers
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/stats
customer_stats
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}
get_customer
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}/contacts
list_contacts
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}/invoice-recipient
get_invoice_recipient
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}/portal
customer_portal_state
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}/shop-rates
list_partner_shop_rates
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /api/v1/customers/{customer_id}/tree
get_customer_tree
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /customers
customers_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /customers/new
customer_create_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /customers/{customer_id}
customer_detail_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /customers/{customer_id}/edit
customer_detail_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /customers/{customer_id}/portal
customer_portal_admin_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API GET /portal/{slug}/profil
profile_page
Semantic binding: not_evaluated; mutation=False
customers
⚡ REST API PATCH /api/v1/customers/{customer_id}
update_customer
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API PATCH /api/v1/customers/{customer_id}/contacts/{contact_id}
update_contact
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers
create_customer
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/contacts
create_contact
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/accounts
customer_portal_account_add
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/accounts/{account_id}/password
customer_portal_account_password
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/accounts/{account_id}/status
customer_portal_account_status
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/invites
customer_portal_invite
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/invites/{invite_id}/revoke
customer_portal_invite_revoke
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /api/v1/customers/{customer_id}/portal/toggle
customer_portal_toggle
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal
customer_portal_admin_save
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal/accounts
customer_portal_account_create
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal/accounts/{account_id}/password
customer_portal_account_password
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal/accounts/{account_id}/status
customer_portal_account_status
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal/invites
customer_portal_invite_create
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /customers/{customer_id}/portal/invites/{invite_id}/revoke
customer_portal_invite_revoke
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /portal/{slug}/profil
profile_submit
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /portal/{slug}/profil/kontakte
profile_contact_save
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /portal/{slug}/profil/kontakte/{contact_id}/loeschen
profile_contact_delete
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /portal/{slug}/profil/standorte
profile_location_save
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API POST /portal/{slug}/profil/standorte/{location_id}/deaktivieren
profile_location_deactivate
Semantic binding: not_evaluated; mutation=True
customers
⚡ REST API PUT /api/v1/customers/{customer_id}/shop-rates
upsert_partner_shop_rate
Semantic binding: not_evaluated; 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

🛡️ Regulatorik & Compliance

Dieses Modul unterliegt folgenden gesetzlichen, regulatorischen und Revisionsstandards:

  • GoBD Nachvollziehbarkeit
  • Mandanten-Isolation (PostgreSQL RLS)