Skip to content

Office Assistant

Office Assistant — Briefe, Angebote, Rechnungen, Protokolle aus dem Chat

Section titled “Office Assistant — Briefe, Angebote, Rechnungen, Protokolle aus dem Chat”

Office Assistant ist dein universeller Büro-Helfer im Tenant. Sag im Chat was du brauchst — “Schreib einen Brief an Frau Berger”, “Angebot für 3 Tage Beratung à 800 €”, “Hier das Foto, mach mir ein Angebot für die Dachsanierung”, “Protokoll von der heutigen Besprechung” — und du bekommst ein fertiges PDF im Firmendesign zurück. Quotes wandeln sich mit einem Tool-Call in Rechnungen, Statuswechsel vergeben automatisch Angebots- und Rechnungsnummern, und die Dokumente landen direkt in deinem verbundenen ERP.

Vier Dokumenten-Typen aus einem Chat-Surface:

  • Angebote (quote) — strukturiert, mit Line-Items, Preisen, Gültigkeit, Status-Lifecycle (draft → sent → accepted/rejected). Angebotsnummern werden bei sent automatisch vergeben.
  • Rechnungen (invoice) — gleiche Struktur wie Quotes plus Fälligkeit, Zahlungsstatus (draft → sent → paid). Quote → Invoice ist ein Single-Tool-Call (business_convert_quote_to_invoice).
  • Briefe (letter) — formloser Text-Output mit Anschreiben- Layout, Empfänger-Block, Unterschrift. Template-basiert, keine Positionen.
  • Meeting-Protokolle (minutes) — Teilnehmer + Tagesordnung + Beschlüsse als strukturiertes PDF.

Vier weitere Dinge die der Agent kann:

  • Foto/Skizze → Angebot — schick dem Office Assistant ein Foto oder eine handschriftliche Skizze einer Bauarbeit; er erkennt Positionen + Maße (damage_analyze_photos), schlägt Preise aus deiner Preisliste vor (business_lookup_price) und baut daraus ein Angebot.
  • PDF-Render + Versand channel-agnostisch — das fertige PDF wird im aktuellen Kanal ausgeliefert (WhatsApp-Dokument, FileCard im Web-Chat, oder direkt als Anhang an send_message_to <email>).
  • ERP-Direktabfragen — wenn dein ERP (Odoo / Business Central / Lexoffice) verbunden ist, kannst du auch direkt nach Daten im ERP fragen (“Welche Rechnungen sind in BC noch offen?”). Sichtbar sind nur die Tools des tatsächlich verbundenen ERPs.
  • Document Templates editierbar — die vier Default-Templates liegen in docs.linkworld.ai-deinem /user/document-templates-Editor. Section-Reihenfolge, Konditions- Text, Footer, Briefkopf — alles editierbar ohne Code.
  1. Office Assistant aktivieren vom Marketplace. Keine M365-/ Telefon-/Cloud-Connections nötig zum reinen Start — du kannst sofort Briefe + Angebote im Chat erzeugen und als PDF herunterladen. Die vier Default-Templates (letter, invoice, minutes, quote) werden bei der Aktivierung in dein Tenant-Workspace kopiert.

  2. Brand-Config setzen unter /user/brand: Firmenname, Adresse, Logo, Default-Farben. Das ist was im PDF-Briefkopf + Footer erscheint. Brand-Config gilt tenant-weit — Office Assistant, alle anderen Apps und der PDF-Renderer teilen sich dieselbe Konfig. Ohne Brand-Config rendern die PDFs mit den Platform-Defaults.

  3. (Optional) ERP verbinden unter /user/integrations für Direktabfragen + automatisches Persistieren:

    • Odoo — URL, DB-Name, Login (per User) oder Shared-Mode (ein Service-User für alle Tenant-User).
    • Business Central — OAuth-Connection via Microsoft.
    • Lexoffice — API-Key.

    Ohne ERP-Connection bleiben Quotes/Invoices in linkworld_business_documents (Tenant-DB) und sind via App-UI + PDF abrufbar; mit Connection werden sie zusätzlich im ERP angelegt.

  4. (Optional) Preisliste hinterlegen — im rechten Chrome-Panel der App auf den Settings-Tab klicken, dann auf Preisliste. Pro Position: Beschreibung, Einheit (m², lfm, Stk, Std), typischer Preis. Der Agent ruft business_lookup_price für jede Position OHNE expliziten User-Preis auf und nutzt deinen price_typical — keine halluzinierten Preise aus LLM-Trainingsdaten. Wenn du in einem Handwerks-Gewerk arbeitest, bietet die Preisliste-Tab beim ersten Öffnen einen Starter-Katalog je Gewerk an.

  5. (Optional) Templates anpassen/user/document-templates öffnet den Template-Editor: Section-Reihenfolge ändern, Konditions-Texte umschreiben, eigene Markdown-Blöcke einfügen. Die Defaults sind deutsche B2B-Standards (Sehr geehrte Damen und Herren, 14 Tage Zahlungsziel, 20% USt), aber alles ist editierbar.

Der häufigste Flow. Diktier dem Office Assistant die Positionen im Chat:

“Angebot für Müller GmbH: 3 Tage Beratung à 800 €, 1 Workshop 1.500 €. Fällig in 14 Tagen.”

Der Agent ruft:

  1. business_create_document(doc_type='quote', client_data={name: 'Müller GmbH', ...}, lines=[...], subject, due_date) → document_id
  2. business_render_pdf(document_id) → file_id
  3. deliver_file(file_id, caption='Angebot ANG-...') — du bekommst das PDF im Chat

Wenn du explizite Preise nennst, nimmt er die wörtlich. Nennst du keine, ruft er business_lookup_price(query=<description>) und nimmt deinen price_typical aus der Preisliste. Findet er nichts, sagt er ehrlich “kein Referenzpreis vorliegt — soll ich die Leistung zur Preisliste hinzufügen?” — er rät nicht.

Wenn du “schick’s ab” sagst, läuft business_transition_document(id, 'sent') und vergibt die Angebotsnummer (ANG-2026-0042). Bei “Kunde hat akzeptiert” → accepted. Quote → Invoice: business_convert_quote_to_invoice(quote_id) macht eine neue Draft-Rechnung mit denselben Positionen.

Schick ein Foto einer Baustelle oder eine handschriftliche Skizze mit Maßen plus einer kurzen Nachricht:

“Angebot für die Familie Hofer: Dachsanierung Süd-Seite, Material

  • Arbeit. Foto anbei.”

Der Agent läuft die Pflicht-Reihenfolge:

  1. damage_analyze_photos(file_ids=[...]) — erkennt Positionen (Dachfläche m², Dämmung, Ziegel, Gerüst…) + extrahiert Maße aus der Skizze.
  2. Für JEDE identifizierte Position: business_lookup_price aus deiner Preisliste.
  3. business_create_document(doc_type='quote', client_data, lines) → document_id
  4. business_render_pdf + deliver_file — PDF im Chat.

Bei Skizzen mit Maßen (3.5 m × 2 m) leitet er die Mengen ab (7 m²). Wenn Kunden-Adressdaten fehlen, lässt er die Felder leer — der Draft bleibt editierbar.

Wann NICHT dieser Flow: Versicherungs-/Schadens-Kontexte (Foto eines konkreten Wasser-/Brand-/Sturm-Schadens, Gutachten) laufen über den Sachverständigen-Agent, nicht über Office Assistant.

Formloser Text-Output ohne Positionen:

“Schreib einen Brief an Frau Berger, Kündigung zum Quartalsende mit Bezug auf §2 des Mietvertrags.”

“Protokoll von der heutigen Besprechung: Teilnehmer A, B, C. Beschluss: X. Nächster Termin: …”

Der Agent ruft:

  1. render_document(slug='letter'|'minutes', data={...}) — Template mit deinen Werten gefüllt, PDF erzeugt
  2. deliver_file(file_id, caption='Brief an Frau Berger')

Die Templates kennen die Placeholders ({{recipient_name}}, {{subject}}, {{body}} etc.). Wenn ein Pflicht-Placeholder fehlt, fragt er gezielt nach — kein Raten.

“Zeig mir das Angebot für Müller”

business_list_documents(search='Müller') → wenn eindeutig: business_render_pdf + deliver_file. Wenn mehrdeutig: kurze Rückfrage (“Drei Treffer: ANG-2026-0042, ANG-2026-0058, ANG-2025- 0117 — welches?”).

“Schick die Rechnung an [email protected]

business_render_pdf + send_message_to(recipient='buchhaltung@...', subject='Ihre Rechnung RE-...', body='...', attachments=[file_id]). Security-Gate triggert einen Approval-Request auf WhatsApp bevor die Mail wirklich rausgeht — du bestätigst, dann erst sendet er.

Das App-UI (/apps/office-assistant) zeigt:

  • List-View — Tabs für Angebote / Rechnungen / Briefe / Protokolle, KPI-Karten oben (offene Quotes, fällige Rechnungen), Tabelle der letzten Dokumente mit Filter + Suche.
  • Detail-View — pro Dokument: Header-Card (Empfänger, Datum, Zahlungsziel, Notizen) editierbar, Line-Items add/edit/remove mit live-Summen, Status-Transitions (sent / accepted / paid / rejected / cancelled), Quote → Invoice Button, PDF-Render mit inline-Preview + Download, Delete-Confirm.

Deep-Link überlebt Reload (M3.13 Welle 1 B) — Detail-Page-URL funktioniert auch nach Browser-Neustart.

Inbox Manager (OFFER_REQUEST-Pfad): wenn der Inbox Manager eine eingehende Mail als OFFER_REQUEST klassifiziert, ruft er bilateral Office Assistant:

  • POST /documents — Quote-Draft mit Line-Items aus dem Mail- Content (plus drawings.analyze falls ein technisches PDF/DXF als Anhang dranhängt)
  • POST /documents/{id}/render-pdf — PDF rendern
  • POST /documents/{id}/transition (new_status='sent') wenn der User das Reply-Draft freigibt — dann vergibt Office Assistant die Angebotsnummer

Die bilateral Cross-App-Wire wird beim Activate von Inbox Manager auto-approved — keine manuelle Workspace-Control-Freigabe nötig.

ERP-Routing: wenn ein ERP verbunden ist, schreibt business_create_document zusätzlich ins ERP (Odoo: account.move, Business Central: salesInvoices, Lexoffice: /invoices). Die external_id wird im LinkWorld-Document gespeichert, damit Quotes/Invoices nicht doppelt entstehen.

  • PDFs im Firmendesign — Brand-Config unter /user/brand bestimmt Logo, Briefkopf, Footer, Default-Farben. Templates sind unter /user/document-templates editierbar (Section-Reihenfolge, Konditions-Texte, eigene Markdown-Blöcke).
  • Keine halluzinierten Preisebusiness_lookup_price ist Pflicht-Tool für jede Position OHNE expliziten User-Preis. Findet sich nichts in der Preisliste, sagt der Agent es ehrlich statt Trainingsdaten-Preise zu raten.
  • Angebots-/Rechnungsnummern beim Transition — bei draft hat das Dokument noch keine Nummer. business_transition_document(..., 'sent') ist der Punkt an dem die Nummer vergeben wird (sequenziell pro Tenant, gap-free). Das verhindert Lücken in der Nummern- Sequenz wenn ein Draft verworfen wird.
  • Channel-Native Auslieferungdeliver_file wählt das richtige Transport: WhatsApp-Document im WhatsApp-Chat, FileCard im Web- Chat, Email-Attachment wenn der Channel Email ist. Du musst den Channel nicht selbst angeben.
  • ERP ist optional — ohne verbundenes ERP liegen Quotes/Invoices in der LinkWorld-Tenant-DB (linkworld_business_documents) und sind voll funktional (UI, PDF, Status-Lifecycle). ERP-Connection fügt nur die zusätzliche Persistierung dort dazu.
  • Tenant-Isolation — Dokumente, Clients, Preisliste, Templates sind alle Tenant-scoped. Kein anderer Tenant auf derselben Instanz sieht deine Daten.
  • Memory pro Thread — wenn du im selben Chat-Thread gerade ein Dokument angelegt hast, merkt sich der Agent die document_id und Folge-Befehle (“zeig’s nochmal”, “schick’s ab”, “mach daraus eine Rechnung”) nutzen IMMER diese ID. Keine Duplikate.

“Das PDF hat das falsche Logo / falsche Adresse” — Brand-Config prüfen unter /user/brand. Ohne Brand-Config rendern PDFs mit den Platform-Defaults. Logo-Upload braucht PNG mit transparentem Hintergrund (max. 2 MB).

“Der Agent hat einen Preis halluziniert” — die betroffene Position fehlt in deiner Preisliste. Rechtes Chrome-Panel → Settings- Tab → Preisliste → Position hinzufügen (Beschreibung, Einheit, typischer Preis). Bei der nächsten Anfrage findet business_lookup_price den Eintrag und nutzt ihn statt zu raten.

“Die Angebotsnummer fehlt im PDF” — Status ist noch draft. Bei draft hat das Dokument bewusst keine Nummer (damit die Sequenz gap-free bleibt). Sag “schick’s ab” oder klick im Detail-View auf Status → Sent — dann vergibt der Tool-Call die Nummer und re-rendert das PDF.

“Das Dokument ist nicht im ERP gelandet” — entweder ERP nicht verbunden (→ /user/integrations), oder die ERP-Connection-Test- Route gibt einen Fehler (→ ERP-Logs check). Office Assistant schreibt das Dokument trotzdem in die LinkWorld-DB; sobald die ERP- Connection wieder läuft, kannst du via “synchronisiere offene Dokumente ins ERP” einen Backfill-Run anstoßen.

“Foto-Analyse erkennt die Positionen nicht”damage_analyze_photos braucht ein ausreichend scharfes Foto + (idealerweise) Maße- Annotationen direkt im Bild oder in der Nachricht. Bei reinen Innen- Foto ohne Maße fragt der Agent gezielt nach (“Welche Fläche hat der Raum?”). Skizzen klappen am besten mit klaren Linien + Maß-Zahlen in Metern.

“Bei mehreren ERPs zeigt er die falschen Tools” — pro Tenant ist nur EIN ERP aktiv. Wenn du Odoo + Lexoffice gleichzeitig connected hast, gewinnt das in Settings als “primary” markierte. Die anderen Tools sind dem Agent dann gar nicht sichtbar — kein Risiko von Cross-ERP-Schreibvorgängen.

“Quote → Invoice zeigt ‘transition not allowed’” — die Quote muss vorher auf sent oder accepted sein. Aus draft direkt zu einer Rechnung konvertieren ist gesperrt (würde eine Angebotsnummern-Lücke erzeugen). Erst business_transition_document auf sent, dann konvertieren.

“Der Agent fragt jedes Mal nach der Empfänger-Adresse” — wenn du denselben Client häufig nutzt, leg ihn einmal via business_create_client an (oder Detail-View → Client picker). Beim nächsten Angebot reicht “für Müller GmbH” — Office Assistant findet den Client und übernimmt alle Adressfelder.

“Das Daily-Heartbeat-Logo blinkt nicht” — Office Assistant hat keinen Heartbeat. Die App ist reaktiv: sie wird aktiv wenn du im Chat etwas anforderst oder Inbox Manager via Cross-App-Call ein OFFER_REQUEST übergibt. Wenn nichts läuft, ist das die korrekte Idle-State.

This section is auto-generated from the app’s manifest. It updates whenever the app publishes a new version.

  • document.draft
  • document.render
  • files.read
  • files.write
  • files.share
  • mail.read
  • mail.send
  • whatsapp.send
  • vision.analyze
  • erp.read
  • erp.write