Centurio System & Module Documentation
🏛️ Platform Architecture 🔑 Login
All Modules / sales_billing / Angebote & Kalkulation
📘

Angebote & Kalkulation

quotes sales_billing 🛡️ RLS Protected

Angebote & Kalkulation — aus Code abgeleitete Prozess- und API-Dokumentation.

Fachliche Bestimmung: Angebote & Kalkulation steuert die kaufmännische Vorphase des Vertriebs: Erfassung von Kundenanfragen, fundierte Vorkalkulation von Material-, Fertigungs- und Fremdleistungskosten, Margen- und Deckungsbeitragsprüfung mit Genehmigungsschranken, revisionssichere Versionierung von Angeboten und die verbindliche Konvertierung in Kundenaufträge über den geprüften Annahme-Gateway.

⚡ Workflows & Lifecycles

Benutzerbefehl: core workflow agent plan:command_core_workflow_agent

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

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

Benutzerbefehl: quote agent plan:command_quote_agent

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

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

Benutzerbefehl: quote followup agent plan:command_quote_followup_agent

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

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

Angebot versendet plan:quote_followup

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

1. quote_followup_agent
quote_followup_agent
{"key": "step_0", "label": "Nachfass-Aufgabe erstellen", "adapter": "agent.execute", "agent": "quote_followup_agent", "condition_fact": "expiring_soon"}
Aktionen: quote_followup_agent

Angebot status:quote

Beobachtbare Zustandsmaschine (observable_only). Übergänge hier nicht erzwungen — siehe Service-Validierung.

1. draft
draft
Status «draft» der Zustandsmaschine Angebot.
2. sent
sent
Status «sent» der Zustandsmaschine Angebot.
3. accepted
accepted
Status «accepted» der Zustandsmaschine Angebot.
4. rejected
rejected
Status «rejected» der Zustandsmaschine Angebot.
5. expired
expired
Status «expired» der Zustandsmaschine Angebot.

⚙️ Fachprozesse & Capabilities (System-Fachlogik)

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

Gesamt: 23 manual_entry: 1 engine: 8 operator_surface: 2 engine_step: 7 durable_plan: 4 observable_only: 1
Capability & Schlüssel Fachliche Bezeichnung Ausführung / Coverage Risikostufe & Freigabe Effekte & Kaskaden
Agent-Einstieg quote_agent agent_entry:quote_agent
Agent-Einstieg quote_agent
Quelle: code:module_agent_map
manual_entry
✓ Auto
Keine Seiteneffekte deklariert
Angebot annehmen capability:accept_quote
Op: accept_quote
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
🔒 Freigabe nötig Risiko: business_record
  • quote.accepted
  • work_order.created
Angebot annehmen und Auftrag binden capability:accept_quote_and_create_order
Op: accept_quote_and_create_order
Intent: fulfil_accepted_quote
Quelle: code:capability_registry
⚙️ Engine
🔒 Freigabe nötig Risiko: business_record
  • engine:accept_quote_and_create_order
Angebotsentwurf anlegen capability:create_quote_draft
Op: create_quote_draft
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • quote.draft_created
Angebotsentwurf verwerfen capability:delete_quote_draft
Op: delete_quote_draft
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • quote.deleted
Reject Quote capability:reject_quote
Op: reject_quote
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • engine:reject_quote
Abgelaufene Angebote schließen capability:sales.quote.expire_batch
Op: sales.quote.expire_batch
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • sales.quote.expire_batch
Send Quote capability:send_quote
Op: send_quote
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
🔒 Freigabe nötig Risiko: external_effect
  • engine:send_quote
Angebotsentwurf bearbeiten capability:update_quote_draft
Op: update_quote_draft
Objekt: quote
Quelle: code:capability_registry
⚙️ Engine
✓ Auto Risiko: business_record
  • quote.draft_updated
quote: create form form_surface_anchor:quote.create
Objekt: quote
Quelle: code:erp_form_surface
operator_surface
✓ Auto
Keine Seiteneffekte deklariert
quote: edit form form_surface_anchor:quote.edit
Objekt: quote
Quelle: code:erp_form_surface
operator_surface
✓ Auto
Keine Seiteneffekte deklariert
create quote draft gateway:create_quote_draft
Op: create_quote_draft
create quote draft
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
delete quote draft gateway:delete_quote_draft
Op: delete_quote_draft
delete quote draft
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
portal decide quote gateway:portal_decide_quote
Op: portal_decide_quote
portal decide quote
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
Angebot annehmen und Auftrag binden gateway:quote_acceptance
Op: accept_quote_and_create_order
Angebot annehmen und Auftrag binden
Quelle: code:reviewed_gateway
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
quote reject gateway:quote_reject
Op: reject_quote
quote reject
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
quote send gateway:quote_send
Op: send_quote
quote send
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
update quote draft gateway:update_quote_draft
Op: update_quote_draft
update quote draft
Quelle: code:engine_facade
⚙️ Engine
✓ Auto
Keine Seiteneffekte deklariert
Benutzerbefehl: core workflow agent plan:command_core_workflow_agent
Benutzerbefehl: core workflow agent
Quelle: code:reviewed_execution_plan
durable_plan
✓ Auto
Keine Seiteneffekte deklariert
Benutzerbefehl: quote agent plan:command_quote_agent
Benutzerbefehl: quote agent
Quelle: code:reviewed_execution_plan
durable_plan
✓ Auto
Keine Seiteneffekte deklariert
Benutzerbefehl: quote followup agent plan:command_quote_followup_agent
Benutzerbefehl: quote followup agent
Quelle: code:reviewed_execution_plan
durable_plan
✓ Auto
Keine Seiteneffekte deklariert
Angebot versendet plan:quote_followup
Angebot versendet
Quelle: code:reviewed_execution_plan
durable_plan
✓ Auto
Keine Seiteneffekte deklariert
Angebot status:quote
Objekt: quote
Quelle: code:status_machine
observable_only
✓ 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 durchgängige Angebotsprozess in der betrieblichen Praxis

Die Angebotsphase entscheidet über den wirtschaftlichen Erfolg von Aufträgen. Centurio ERP verbindet präzise Kostenkalkulation mit schnellen Vertriebsworkflows, um wettbewerbsfähige Preise bei gesicherten Deckungsbeiträgen zu gewährleisten.

1. Anfrage-Eingang & Vorgangseröffnung (Inquiry Intake)

Ein Angebotsprozess startet über verschiedene Eingangskanäle:

  • Eingangskorb & OCR (inbox): Eingehende Kundenanfragen per E-Mail oder PDF werden über die OCR- und KI-Pipeline analysiert. Erkannte Artikel, Mengen und Kundenangaben werden automatisch in einen Angebotsentwurf (cap:quotes.quote.create_from_inbox) überführt.
  • CRM-Opportunity (crm): Im Rahmen eines Vertriebsprojekts wird aus einer qualifizierten Verkaufschance direkt ein neues Angebot erzeugt (cap:quotes.quote.create).
  • Portal-Anfrage (portal): Ein Bestandskunde konfiguriert im B2B-Kundenportal ein Produkt oder fragt Staffelpreise an.
  • Vorgangskontext: Das System verknüpft das Angebot sofort mit dem Kundenstamm (customers), zieht hinterlegte Zahlungs- und Lieferbedingungen (z.B. 30 Tage netto, Incoterms DAP) und weist eine fortlaufende, lückenlose Belegnummer aus dem Nummernkreis zu.

2. Vorkalkulation & Kostenermittlung (Pre-Calculation)

Für Standardartikel zieht das System hinterlegte Preislisten und Staffelrabatte heran. Bei auftragsbezogenen Erzeugnissen (Make-to-Order) oder individuellen Projekten wird die integrierte Vorkalkulations-Engine aktiviert:

  • Materialkosten (MEK): Das System greift auf die kalkulatorische Stückliste (BOM) zu, multipliziert Einzelmengen mit den aktuellen gleitenden Durchschnittspreisen (GLD) oder den Wiederbeschaffungspreisen aus dem Einkauf und schlägt den Materialgemeinkostenzuschlag (MGK, z.B. 8%) auf.
  • Fertigungskosten (FEK): Aus dem Arbeitsplan werden die geplanten Rüstzeiten und Bearbeitungszeiten an den jeweiligen Arbeitsplätzen (Workstations) ermittelt und mit den hinterlegten Maschinen- und Personalkostenstundensätzen bewertet. Hinzu kommt der Fertigungsgemeinkostenzuschlag (FGK, z.B. 15%).
  • Fremdleistungen: Geplante externe Schritte (Lohnveredelung, Sonderwerkzeuge, Speditionskosten) werden als Sondereinzelkosten der Fertigung (SEKF) addiert.
  • Herstellkosten (HK) & Selbstkosten (SK): $$\text{Herstellkosten} = \text{MEK} + \text{MGK} + \text{FEK} + \text{FGK} + \text{SEKF}$$ $$\text{Selbstkosten} = \text{Herstellkosten} + \text{Verwaltungsgemeinkosten (VwGK)} + \text{Vertriebsgemeinkosten (VtGK)}$$

3. Preisfindung, Deckungsbeitrag & Margenprüfung

Auf Basis der Selbstkosten kalkuliert der Vertriebsmitarbeiter den Angebotspreis:

  • Gewinnzuschlag & Zielpreis: Durch Aufschlag einer prozentualen Gewinnmarge oder Vorgabe eines Festpreises entsteht der Netto-Verkaufspreis.
  • Deckungsbeitragsrechnung: Das System berechnet in Echtzeit den Deckungsbeitrag I (DB I = Nettoerlös - variable Kosten) und die prozentuale Marge: $$\text{Marge} = \frac{\text{Nettoerlös} - \text{Selbstkosten}}{\text{Nettoerlös}} \times 100$$
  • Staffelpreise & Rabatte: Rabattstaffeln je nach Losgröße (z.B. ab 100 Stk. 5%, ab 500 Stk. 10%) werden simuliert und transparent dargestellt.

4. Freigabegates bei Margenunterschreitung (Discount Approval)

Zur Verhinderung unrentabler Aufträge greift die kaufmännische Überwachung:

  • Liegt die berechnete Marge über der im Mandanten definierten Zielmarge (z.B. > 20%), kann der Vertriebsmitarbeiter das Angebot sofort finalisieren.
  • Verzweigung bei Margenunterschreitung: Gewährt der Vertrieb einen hohen Rabatt, sodass die Marge unter die Schwelle fällt (z.B. 12%), blockiert das System die Versendung. Der Status wechselt auf Wartet auf Freigabe (waiting_approval).
  • Über die Capability cap:quotes.quote.request_approval wird dem Vertriebsleiter eine Genehmigungsaufgabe vorgelegt. Erst nach digitaler Freigabe wird das Angebot zur Versendung entsperrt.

5. Dokumentenerzeugung, Angebotsbindung & Versand

  • PDF-Rendering & E-Rechnungsstandard: Über die Vorlagen-Engine wird das offizielle Angebotsdokument generiert. Es enthält alle Einzelpositionen, Staffelpreise, Lieferzeiten, Zahlungsziele und die Angebotsbindungsfrist (Gültigkeitsdatum nach § 145 BGB).
  • Versand: Das Angebot wird direkt aus dem System per E-Mail an den Kunden versandt oder im Kundenportal bereitgestellt (cap:quotes.quote.send). Der Status wechselt auf Versandt (sent).

6. Nachverfolgung, Verhandlung & Versionierung

  • Fristenüberwachung: Das System überwacht das Gültigkeitsdatum. Droht das Angebot abzulaufen, generiert der Wiedervorlage-Dienst eine Aufgabe für den Vertrieb (Follow-up Call).
  • Verhandlungsrunden (Versionierung): Verhandelt der Kunde nach, wird das bestehende Angebot nicht überschrieben (Audit-Trail). Stattdessen wird eine neue Revision (v2, v3) erzeugt (cap:quotes.quote.create_revision), wodurch der gesamte Verhandlungsverlauf historisiert bleibt.

7. Angebotsannahme & Gateway zur Auftragskonvertierung

Entscheidet sich der Kunde für den Kauf:

  • Über den geprüften Gateway gw:quote_acceptance@v1 wird das Angebot angenommen (cap:quotes.quote.accept).
  • Transaktionale Kaskade: Der Gateway prüft die Gültigkeit des Angebots, die Kreditwürdigkeit des Kunden und erzeugt in einer einzigen atomaren Transaktion den rechtsverbindlichen Kundenauftrag (sales.sales_order) inklusive aller Positionsdetails und reserviert die Kapazitäten. Das Angebot wechselt in den Zustand Angenommen (accepted).
🏛️

Meta-Fachlogik: Ideologische Blaupause, Soll-Weltbild & Normen

Meta-Fachlogik: Die ideologische Blaupause & das normative Weltbild

Die Meta-Fachlogik der Angebotskalkulation beruht auf betriebswirtschaftlicher Kosten- und Leistungsrechnung (KLR), dem deutschen Vertragsrecht (BGB) und Grundsätzen kaufmännischer Vorsicht.

1. Betriebswirtschaftliche Grundlagen

  • Kosten- und Preistheorie: Ein Angebotspreis darf niemals ein reines Bauchgefühl sein. Er muss die Deckung der variablen Kosten garantieren und einen angemessenen Beitrag zu den Fixkosten leisten (Deckungsbeitrag).
  • Zuschlagskalkulation (Kalkulationsschema): Das Soll-Modell verlangt die saubere Trennung von Einzelkosten (direkt zurechenbar) und Gemeinkosten (über Betriebsabrechnungsbogen BAB ermittelte Zuschlagssätze für Material, Fertigung, Verwaltung und Vertrieb).
  • Zielkostenrechnung (Target Costing): Wenn der Marktpreis feststeht, kehrt sich die Logik um: Vom erzielbaren Marktpreis wird die geforderte Zielrendite abgezogen, um die maximal zulässigen Zielherstellkosten (Allowable Costs) zu definieren.

2. Rechtliche Grundlagen & Standards

  • BGB §§ 145–148 (Antrag & Bindungsfrist):
    • Ein an einen Kunden gerichtetes Angebot ist rechtlich ein bindender Antrag zur Schließung eines Kauf- oder Werkvertrags.
    • Das Soll-Modell erzwingt daher stets eine explizite Bindungsfrist (Gültig bis...). Erfolgt keine Annahme innerhalb dieser Frist, erlischt der Antrag kraft Gesetzes (§ 146 BGB).
    • Freizeichnungsklauseln (z.B. freibleibend, solange Vorrat reicht) müssen im Belegtext rechtssicher ausgewiesen werden.
  • GoBD-Revisionssicherheit:
    • Jede an den Kunden übermittelte Angebotsfassung stellt ein steuerlich relevantes Handelsdokument dar.
    • Das Überschreiben oder Löschen versandter Angebote ist unzulässig; es gilt striktes Versionierungsgebot (Audit-Trail).

3. Invarianten des Soll-Modells

  1. Kein Angebot ohne explizites Gültigkeitsdatum (Angebotsbindung).
  2. Kein Angebotspreis unterhalb der variablen Grenzkosten ohne schriftliche Sonderfreigabe der Geschäftsführung.
  3. Versandte Angebote sind schreibgeschützt; Änderungen erzwingen eine neue Revisionsnummer.
  4. Die Konvertierung in einen Kundenauftrag darf nur einmalig erfolgen (Idempotenz).

Normbezug für quotes

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:

  • apqc-pcf-8.0, APQC Process Classification Framework (PCF) – Cross-Industry, Ausgabe PCF Cross-Industry v8.0 (2026-02-27). Art: reference_process. Nur öffentliche Zusammenfassung. Keine Volltextprüfung. Keine modulspezifische Kataloganforderung. Die Zuordnung bleibt eine Prüfreferenz.
  • iso-9001-2026, ISO 9001:2026 Quality management systems — Requirements, Ausgabe ISO 9001:2026 (6. Ausgabe, 2026-09-16). Art: normative. Volltext liegt nicht vor. 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 in Centurio ERP

Die System-Fachlogik dokumentiert die konkrete Umsetzung im Kernmodul quotes.

1. Datenmodelle & Semantische Schicht (ORM)

  • Quote: Der Angebotskopf (Felder: id, tenant_id, quote_number, version, customer_id, status, valid_until, total_net_amount, total_tax_amount, margin_percent, payment_term_id, currency).
  • QuoteLine: Einzelpositionen (Felder: quote_id, product_id, position_type [standard, service, custom_bom], quantity, unit_price, discount_percent, cost_price, margin_amount).
  • QuoteRevision: Revisionshistorie mit verknüpften PDF-Snapshots.
  • QuoteApprovalRequest: Genehmigungsvorgang bei Margen- oder Rabattüberschreitung.

2. Das Capability-Register

  • cap:quotes.quote.create: Neuanlage eines Angebots.
  • cap:quotes.quote.create_revision: Erstellung einer Folgerevision (v1 ➔ v2).
  • cap:quotes.quote.calculate_costs: Auslösung der automatischen Vorkalkulation über Stücklisten und Arbeitsplätze.
  • cap:quotes.quote.request_approval: Einsteuern des Angebots in den Genehmigungsworkflow bei Margenunterdeckung.
  • cap:quotes.quote.approve: Autorisierung des Angebots durch den Vertriebsleiter.
  • cap:quotes.quote.send: Versand an den Kunden via E-Mail/Portal mit PDF-Erzeugung.
  • cap:quotes.quote.accept: Akzeptanz und Übergabe an die Auftragsabwicklung.
  • cap:quotes.quote.reject: Kennzeichnung als abgelehnt mit Angabe des Verlustgrunds (Lost Reason).

3. Der Gateway gw:quote_acceptance@v1

Der Annahme-Gateway bindet Angebote an Verkaufsaufträge:

Prüfung Frist ➔ Prüfung Kreditlimit ➔ Angebot sperren ➔ SalesOrder generieren ➔ Outbox-Signal
  1. Validierung: Prüft, ob valid_until >= current_date und ob der Kunde ein offenes Kreditlimit besitzt.
  2. Statuswechsel: Quote.status = 'accepted'.
  3. Auftragserzeugung: Erzeugt SalesOrder mit denselben Positionen, Preisen und Konditionen.
  4. Signal: Feuert QUOTE_ACCEPTED_EVENT zur Benachrichtigung des Lager- und Produktionsdisponenten.

4. Statusmodelle

draft (Entwurf) ➔ waiting_approval (Margenprüfung) ➔ approved (Freigegeben) ➔ sent (Versandt) ➔ accepted (Angenommen / Auftrag erzeugt), rejected (Abgelehnt) oder expired (Abgelaufen).

🤖

KI-Consultant Leitfaden: Customizing- & No-Code-Konzept (Soll-Ist-Synthese)

AI Solution Architect Blueprint

KI-Consultant Blueprint: Customizing & No-Code Architektur

Anleitung für Solution Architects zur Anpassung der Angebotsprozesse an spezifische Kundenbranchen.

1. Kundenanforderungsanalyse

  • Welche Margengrenzen gelten im Unternehmen (z.B. Mindestmarge Handelsware 15%, Sonderbau 28%)?
  • Sollen Rohstoff-Preisanpassungsklauseln (z.B. Metallteuerungszuschlag DEL-Notiz) dynamisch eingebunden werden?
  • Welche Freigabestufen existieren (Vertriebsleiter bis 10.000 €, CFO ab 50.000 €)?

2. No-Code Zusatzfelder (Custom Fields)

Im No-Code Studio (/semantic/customizing):

  • Auf Quote:
    • lost_reason_category (Auswahlliste: Preis zu hoch, Lieferzeit zu lang, Mitbewerber gewählt, Projekt storniert): Für die Vertriebs-Verlustanalyse.
    • competitor_name (Text): Name des Mitbewerbers bei verlorenem Angebot.
    • financing_option (Auswahlliste: Kauf, Mietkauf, Leasing): Steuert die Folgekaskade zu rental oder contracts.
  • Auf QuoteLine:
    • raw_material_surcharge (Währungsbetrag): Teuerungszuschlag für Kupfer/Aluminium.
    • guaranteed_delivery_weeks (Ganzzahl): Verbindlich zugesagte Lieferzeit in Wochen.

3. No-Code Workflow Canvas DAGs

Blueprint A: Mehrstufiges Margen-Freigabegate (Margin Approval DAG)
  • Trigger-Node: cap:quotes.quote.calculate_costs wird ausgeführt.
  • Condition-Node A: quote.margin_percent < 15.0 AND quote.total_net_amount <= 25000.
    • Action A: Zuweisung einer Freigabeaufgabe an die Rolle Vertriebsleiter.
  • Condition-Node B: quote.margin_percent < 10.0 OR quote.total_net_amount > 25000.
    • Action B: Vier-Augen-Freigabe erforderlich: Freigabeaufgabe an Geschäftsführung (CFO).
Blueprint B: Automatisches Follow-Up bei Angebotsfristen
  • Trigger-Node: Scheduled Cron (0 8 * * 1-5) – Täglicher Fristenscan.
  • Condition-Node: quote.status == 'sent' AND quote.valid_until - current_date == 3_days.
  • Action-Node: Erzeuge eine Vertriebsaufgabe: Kunde kontaktieren vor Fristablauf und sende Erinnerungs-E-Mail an Kunden.

📚 Operative Prozessbegriffe & Transaktionsschnittstellen

Zentrale Fachbegriffe im Prozesszusammenhang (Operatives Modell)
Vorkalkulation
Berechnung der voraussichtlichen Herstell- und Selbstkosten vor Erstellung des Angebots.
Angebotsbindung (§ 145 BGB)
Gesetzliche Frist, innerhalb derer der Anbieter an die Konditionen gebunden ist.
Deckungsbeitrag I & II
Betrag, der nach Abzug variabler Kosten zur Deckung der Fixkosten verbleibt.
Margenprüfung
Automatisierter Abgleich des Angebotspreises gegen interne Mindestrenditen.
Revisionshistorie
Lückenlose Versionierung (v1, v2, v3) aller an den Kunden übermittelten Fassungen.
Lost-Reason-Analyse
Strukturierte Erfassung von Gründen bei Nicht-Zustandekommen des Auftrags.
Auftragskonvertierung
Rechtssicherer Übergang vom Angebot in den rechtskräftigen Verkaufsauftrag.
📥 Eingänge & Trigger (Inputs)
  • Kundenanfrage per E-Mail oder Upload im Posteingang (OCR/Inbox)
  • Vertriebschance (Opportunity) aus dem CRM-Modul
  • Preisanfrage über das B2B-Kundenportal
  • Ausschreibungsunterlagen mit Spezifikationskatalog
📤 Ausgänge & Arbeitsergebnisse (Outputs)
  • Rechtssicheres Angebotsdokument im PDF-Format mit Bindungsfrist
  • Vorkalkulationsnachweis mit Deckungsbeitrags- und Margenberechnung
  • Revisionsprotokoll bei mehrstufigen Preisverhandlungen
  • Konvertierter Verkaufsauftrag bei Annahme durch den Kunden
⚡ Kaskaden & Folgeprozesse (Cascades)
  • quote_accepted -> sales_order_created: Sofortige Erzeugung des Kundenauftrags
  • quote_approved -> send_notification_to_sales: Benachrichtigung über erteilte Rabattfreigabe
  • quote_expired -> update_crm_opportunity: Statusanpassung der Opportunity auf geschlossen-verloren
  • quote_sent -> schedule_followup_task: Automatische Wiedervorlage für den Vertrieb
🛡️ Nebenprozesse & Resilienz
  • Sonderfreigabe bei Margenunterdeckung durch den Vertriebsleiter
  • Währungsumrechnung bei Angeboten in Fremdwährungen mit Kurssicherung
  • Kreditlimitprüfung des Kunden vor Abgabe großvolumiger Angebote
  • Klärung technischer Machbarkeiten mit Konstruktion und Arbeitsvorbereitung
💡 No-Code Checkliste & Praxistipps
  • Mindestmargen je Artikelkategorie in den Systemeinstellungen hinterlegen
  • Freigabestufen für Rabatte (Mitarbeiter, Teamleiter, Geschäftsführer) konfigurieren
  • Standard-Gültigkeitsdauer (z.B. 14 oder 30 Tage) für Angebote definieren
  • No-Code Zusatzfelder für Verlustgründe und Mitbewerber auf Quote anlegen

🗄️ Data Models & Fields

QuoteItems quote_items RLS Aktiv
23 Fields / Columns

Tabelle quote_items

Feldname Data Type Required Schlüssel Functional Meaning
quote_id UUID Ja * FK ➔ quotes.id Feld quote_id
position INTEGER Ja * - Feld position
product_id UUID Nein FK ➔ products.id Feld product_id
description TEXT Ja * - Feld description
quantity NUMERIC(14, 4) Ja * - Feld quantity
unit VARCHAR(16) Ja * - Feld unit
unit_price NUMERIC(14, 2) Ja * - Feld unit_price
discount_percent NUMERIC(5, 2) Ja * - Feld discount_percent
tax_rate NUMERIC(6, 4) Ja * - Feld tax_rate
net_total NUMERIC(14, 2) Ja * - Feld net_total
gross_total NUMERIC(14, 2) Ja * - Feld gross_total
fulfillment_route VARCHAR(16) Nein - Feld fulfillment_route
ship_to_address TEXT Nein - Feld ship_to_address
semantic_attributes JSONB Nein - Feld semantic_attributes
shop_url TEXT Nein - Feld shop_url
external_sku VARCHAR(128) Nein - Feld external_sku
variant_text VARCHAR(255) Nein - Feld variant_text
shop_supplier_id UUID Nein FK ➔ suppliers.id Feld shop_supplier_id
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
metadata JSONB Ja * - Feld metadata
Quotes quotes RLS Aktiv
37 Fields / Columns

Tabelle quotes

Feldname Data Type Required Schlüssel Functional Meaning
quote_number VARCHAR(32) Ja * - Feld quote_number
legal_entity_id UUID Nein FK ➔ legal_entities.id Feld legal_entity_id
customer_id UUID Nein FK ➔ customers.id Feld customer_id
bill_to_customer_id UUID Nein FK ➔ customers.id Feld bill_to_customer_id
project_id UUID Nein FK ➔ projects.id Feld project_id
status VARCHAR(48) Ja * - Feld status
issue_date DATE Nein - Feld issue_date
valid_until DATE Nein - Feld valid_until
delivery_date DATE Nein - Feld delivery_date
sent_at DATETIME Nein - Feld sent_at
accepted_at DATETIME Nein - Feld accepted_at
currency VARCHAR(3) Ja * - Feld currency
payment_terms VARCHAR(128) Nein - Feld payment_terms
payment_term_code VARCHAR(32) Nein - Feld payment_term_code
customer_reference VARCHAR(128) Nein - Feld customer_reference
delivery_address TEXT Nein - Feld delivery_address
terms TEXT Nein - Feld terms
salesperson_id UUID Nein FK ➔ users.id Feld salesperson_id
signature_required BOOLEAN Ja * - Feld signature_required
subtotal NUMERIC(14, 2) Ja * - Feld subtotal
tax_total NUMERIC(14, 2) Ja * - Feld tax_total
total NUMERIC(14, 2) Ja * - Feld total
notes TEXT Nein - Feld notes
opportunity_id UUID Nein - Feld opportunity_id
portal_kind VARCHAR(24) Nein - Feld portal_kind
portal_order_key UUID Nein - Feld portal_order_key
portal_order_fingerprint VARCHAR(64) Nein - Feld portal_order_fingerprint
contract_id UUID Nein - Feld contract_id
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/quotes/templates/{template_id}
delete_quote_template
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API DELETE /api/v1/quotes/{quote_id}
delete_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API DELETE /api/v1/quotes/{quote_id}/items/{item_id:uuid}
delete_quote_item
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API GET /api/v1/gaeb/documents
list_gaeb_documents
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/gaeb/documents/{document_id}
get_gaeb_document
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/gaeb/documents/{document_id}/export-x84
export_gaeb_x84
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes
list_quotes
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes/templates
list_quote_templates
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes/templates/{template_id}
get_quote_template
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes/{quote_id}
get_quote
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes/{quote_id}/conversion-options
quote_conversion_options
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /api/v1/quotes/{quote_id}/pdf
get_quote_pdf
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /gaeb
gaeb_list_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /gaeb/{document_id}
gaeb_detail_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /portal/{slug}/angebote
quotes_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /quotes
quotes_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /quotes/new
quote_create_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /quotes/templates
quote_templates_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API GET /quotes/{quote_id}
quote_detail_page
Semantic binding: inventory_only; mutation=False
quotes
⚡ REST API PATCH /api/v1/quotes/templates/{template_id}
update_quote_template
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API PATCH /api/v1/quotes/{quote_id}
update_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API PATCH /api/v1/quotes/{quote_id}/items/reorder
reorder_quote_items
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API PATCH /api/v1/quotes/{quote_id}/items/{item_id:uuid}
update_quote_item
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/gaeb/documents/{document_id}/convert-to-quote
convert_gaeb_to_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/gaeb/documents/{document_id}/prices
update_gaeb_prices
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/gaeb/upload
upload_gaeb_file
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes
create_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/templates
create_quote_template
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/accept
accept_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/convert-to-project
convert_quote_to_project
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/convert-to-workorder
convert_quote_to_workorder
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/create-invoice
create_invoice_from_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/escalate-ticket
escalate_quote_to_ticket
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/items
add_quote_item
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/reject
reject_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /api/v1/quotes/{quote_id}/send
send_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /gaeb/upload
web_upload_gaeb
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /gaeb/{document_id}/convert-quote
web_convert_to_quote
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /gaeb/{document_id}/prices
web_update_prices
Semantic binding: operator_surface; mutation=True
quotes
⚡ REST API POST /portal/{slug}/angebote/{quote_id}/entscheiden
quote_decide
Semantic binding: operator_surface; mutation=True
quotes

🛡️ Regulatory & Compliance

Dieses Modul unterliegt folgenden gesetzlichen, regulatorischen und Revisionsstandards:

  • GoBD Nachvollziehbarkeit
  • Mandanten-Isolation (PostgreSQL RLS)