API · v1 · stabil
CODEMETA OSDeveloper Center
Konsole öffnen
Plattform

Changelog

In Vorbereitung

Benachrichtigungen lassen sich nach Thema, Text und Lesestatus filtern und vollständig durchblättern

Die Benachrichtigungsliste nimmt Filter für Thema, Volltext und „nur ungelesen" an, und die Sammelaktionen wirken auf dieselbe Auswahl. Die Seitennavigation der Liste ist korrigiert; ihr Cursor ist jetzt ein undurchsichtiger Wert.

  • Breaking Change
    POST /api/v1/dms/documents/:id/versions ändert das Dokument nicht mehrder Aufruf liefert nur noch die Upload-URL. Die neue Version wird erst mit POST /api/v1/dms/documents/:id/versions/complete übernommen, nachdem die Datei hochgeladen ist. Ein Ablauf aus nur diesem Aufruf und dem Upload legt keine Version mehr an; bisher wurde dabei auch nichts archiviert. Dasselbe gilt für POST …/checkin mit Datei.
  • Breaking Change
    GET /api/v1/dms/documents/:id/versions gibt keine Storage-Keys mehr ausdas Feld s3Key entfällt. Eine Version lädt man über GET …/download-url?version=<n> herunter.
  • Neu
    POST /api/v1/dms/documents/:id/versions/completeübernimmt eine hochgeladene neue Version: archiviert den bisherigen Inhalt und macht den neuen aktuell. Rumpf { "s3Key", "mimeType", "changeNote" }, s3Key aus dem vorherigen POST …/versions. Recht: dms_document_edit. 422, wenn der Key nicht für dieses Dokument ausgegeben wurde oder die Datei fehlt; 409 bei gleichzeitiger Änderung.
  • Neu
    Neue Versionen sind bei gesperrten Dokumenten mit 409 und eigenem errorCode abgelehntLegal Hold, laufende Aufbewahrung, GoBD-Sperre, Status gebucht/archiviert, verschlüsselt, an SharePoint gespiegelt, von jemand anderem ausgecheckt oder signiert. Die Codes beginnen mit DMS_VERSION_, das Feld reason nennt den Grund.
  • Neu
    GET /api/v1/dms/documents/:id/versions liefert mehr Angaben je Versionneu sind uploadedByName, changeNote, sizeBytes, mimeType, isCurrent sowie uploadBlockedReason (null, wenn eine neue Version hochgeladen werden darf). Die Liste ist älteste zuerst, die aktuelle Fassung steht zuletzt.
  • Neu
    GET /api/v1/dms/documents/:id/download-url?version=<n>liefert die Originaldatei einer bestimmten Version; unbekannte Nummer ergibt 404 mit DMS_VERSION_NOT_FOUND.
  • Neu
    GET /api/v1/notifications filtert nach group, q und unreadgroup ist eines der Themen tickets, work, customers, compliance, system oder other; q sucht jedes Wort ohne Groß-/Kleinschreibung in Titel oder Text der letzten 90 Tage (höchstens 100 Zeichen); unread=true liefert nur Ungelesenes. Ungültige Werte ergeben 400.
  • Neu
    POST /api/v1/notifications/mark-all-read und DELETE /api/v1/notifications nehmen denselben Filter im Query-Stringmit Filter wirken sie nur auf die gefilterten Benachrichtigungen; ohne Filter bleibt das Verhalten unverändert.
  • Neu
    POST /api/v1/tickets/:id/close-summaryformuliert per KI einen sehr kurzen Abschlusstext aus den eigenen, für den Kunden sichtbaren Zeitbuchungen des Aufrufers am Ticket; interne Buchungen und Vermerke fließen nicht ein, gespeichert wird nichts. Optionaler Rumpf { "actionId", "language" } (de/en); der Prompt kommt aus den KI-Textaktionen (Oberfläche ticket_close). Rechte: ticket_edit und Zugriff auf das Ticket. Ohne verwertbare Buchung: 422.
  • Neu
    PATCH /api/v1/tenant nimmt settings.watchers.keepPreviousAssigneeOnHandover anBoolean, Vorgabe true (bisheriges Verhalten). Bei false beendet ein Bearbeiterwechsel am Ticket die automatischen Beobachtungen des bisherigen Bearbeiters an diesem Ticket; von Hand gesetzte Beobachtungen bleiben. Unbekannte Schlüssel unter settings.watchers und Werte, die kein Boolean sind, ergeben 400.
  • Geändert
    Der cursor von GET /api/v1/notifications ist ein undurchsichtiger Werter wird unverändert aus pagination.cursor der vorherigen Seite übernommen. Ein Wert, den der Endpunkt nicht ausgegeben hat, ergibt 400.
  • Behoben
    Die Seitennavigation der Benachrichtigungsliste liefert jede Benachrichtigung genau einmaldie zweite Seite enthielt bisher neuere statt ältere Einträge, und Kalender-Erinnerungen fehlten beim Weiterblättern.

v0.5.11

Fahrtzeit und Einsatzplanung halten Rechte und Feldsperren ein, Aufgaben schliessen sich mit

Die Fahrtzeit-Endpunkte speicherten mit Leserecht und übergingen die Feldsperren der Rolle; Speichern verlangt jetzt eine eigene Schreibberechtigung, und Abfragen sind begrenzt. In der Einsatzplanung wirken die Feldsperren auf Telefonate wieder. Offene Aufgaben werden erledigt, wenn ihr Vorgang schliesst.

  • Breaking Change
    Eine Fahrtzeit lässt sich nicht mehr über den Lesepfad speichernbisher schrieb die Abfrage ihr Ergebnis mit Leserecht. Gespeichert wird nur noch über POST /api/v1/parties/:id/travel-time mit party_edit, atomar und mit Verlaufseintrag. Der Endpunkt beachtet zusätzlich die Feldsperren der Rolle.
  • Breaking Change
    GET auf die Fahrtzeit ist begrenzt, und das Kundenportal rechnet nicht mehr livejede Abfrage löste bisher eine Berechnung beim Kartendienst aus.
  • Breaking Change
    POST /api/v1/calculate-distance verlangt eine Berechtigung und ist begrenztder Endpunkt war offen und rechnete bei jedem Aufruf.
  • Breaking Change
    Die Einsatzplanung beachtet die Feldsperren bei Telefonaten wiederauch für weiterverbundene Anrufe, deren ausgeblendete Felder bisher mitgingen.
  • Breaking Change
    ?answeredByUserId= verrät nicht mehr, wem eine Buchung gehört.
  • Breaking Change
    Der Verlaufsexport wendet den Datenbereich des Betrachters auf Zeitbuchungen anund der Ticket- beziehungsweise Projektbezug einer Buchung folgt den Feldsperren von Ticket und Projekt.
  • Breaking Change
    Ein Pool-Gerät abzumelden prüft den Datenbereich der Ressourcebisher nicht.
  • Breaking Change
    Doppelte userIds in einer Anfrage an die Einsatzplanung vervielfachen die Antwort nicht mehr.
  • Neu
    Offene Aufgaben werden erledigt, wenn ihr Vorgang schliesstbeim Schliessen eines Tickets und beim Gewinnen oder Verlieren einer Vertriebschance.
  • Neu
    Ein Ticket lässt sich mit einer bestehenden Vertriebschance verknüpfenund umgekehrt sind von der Chance aus verknüpfte Tickets sichtbar.
  • Neu
    Ein Statuswechsel eines Projekts nimmt einen Grund auf, der in der Historie steht.
  • Neu
    Neue, verschobene und abgesagte Termine werden den Teilnehmern gemeldetVerschiebungen mit Angabe des alten und des neuen Zeitraums.
  • Neu
    Zeitbuchungen im Verlaufsexport verlinken ihr Ticket.
  • Neu
    Der Kundenfilter steht in der Aufgabenliste und am Aufgaben-Boardder Kunde ist dort eine eigene Zeile auf der Karte.
  • Geändert
    Die bekannte Signaturlücke in node-forge ist als offener Befund eingetragen, nicht unterdrücktdie Bibliothek akzeptiert gefälschte RSA-PKCS#1-v1.5-Signaturen, und es gibt dafür noch keine Fassung ohne die Lücke. Statt den Scanner stummzuschalten, steht der Befund im Register, und ein Wächter verhindert, dass er künftig doch unterdrückt wird.
  • Geändert
    Benachrichtigungs-Mails gehen nicht mehr an gesperrte Kontenund die Überschrift generischer Benachrichtigungen wird maskiert.
  • Behoben
    Das Abwählen einer bearbeiteten Buchung konnte in einer Abschluss-Mail eine Vorlagen-Lücke zerstörender Text blieb danach ohne die Stelle zurück, die er verlangt.

v0.5.10

Gepunktete Feldpfade schützen wieder, und das Portal sieht keine internen Nachrichten mehr

Ein auf null gesetztes Elternobjekt umging den Schutz aller darunterliegenden Felder — damit liess sich unter anderem die Budget-Sperre eines Vorgangs aufheben. Portalnutzer erreichten interne Verwaltungsseiten und lasen interne Nachrichten über mehrere Wege. Neu sind der Verlaufsexport eines Vorgangs als PDF und eine Abfrage-Route für die Auslastungsauswertung.

  • Breaking Change
    Ein auf null gesetztes Elternobjekt umgeht den Feldschutz nicht mehrPATCH {"budget": null} hob die Budget-Sperre eines Vorgangs auf, weil der Schutz auf den gepunkteten Pfad darunter zeigte und ein genulltes Elternobjekt daran vorbeilief. Betroffen waren alle 25 geschützten Felder mit gepunktetem Pfad, beim Anlegen wie beim Ändern. Solche Anfragen werden jetzt abgewiesen.
  • Breaking Change
    Portalnutzer erreichen keine internen Verwaltungsseiten mehrdas Gate prüfte die Berechtigung, aber nicht, ob der Aufrufer intern ist.
  • Breaking Change
    Der Nachrichten-Zeitstrahl gibt Portalnutzern keine internen Mails und Notizen mehrdasselbe galt für die Vorgangshistorie, die ihnen Betreff, Absender und Id intern gespeicherter Nachrichten zeigte, und für den Partei-Zeitstrahl samt Mail-Abzeichen, die Kundenmails ohne das Leserecht auf Nachrichten auswiesen.
  • Breaking Change
    Die Antwort auf Anlegen und Ändern über den generischen Pfad enthält für Portalnutzer keine internen Felder mehrder Lesepfad bereinigte sie, der Schreibpfad gab das gespeicherte Dokument zurück.
  • Breaking Change
    Der Sammel-PATCH läuft nicht mehr an der Transaktionsprüfung der Entity-Hooks vorbei.
  • Breaking Change
    Aufgabenlisten haben einen Eigentümer, und Massenpfad, PUT und Assistent halten ihn einalle drei umgingen das Gate bisher.
  • Breaking Change
    Die GoBD-Festschreibung eines Dokuments lässt sich nicht mehr per PATCH aufheben.
  • Breaking Change
    Der Ablageschlüssel eines Dokuments ist nicht mehr frei setzbarund der Download prüft den Mandanten, bevor er signiert. Teilfix: die Versionshistorie ist geschützt, der Befund bleibt offen.
  • Breaking Change
    Der Aufgabentyp einer Aufgabenvorlage wird geprüfter lief ungeprüft durch den Änderungs-Override bis in die erzeugte Aufgabe.
  • Breaking Change
    Die volle Tabelle der Beziehungsqualität verlangt party_view und wendet den Datenbereich ander Hinweis am Vorgang kommt aus einer eigenen, schlanken Route. Den Sperrvermerk setzt nur noch, wer party_edit hat.
  • Breaking Change
    PATCH /api/v1/tenant nimmt keine Einstellungsschlüssel mit Punkt anein Punkt im Schlüssel lief an der Sperre für den Mail-Composer und an der Geheimnis-Erkennung vorbei.
  • Breaking Change
    EMAIL_DRY_RUN und EMAIL_REDIRECT_TO greifen jetzt auch für die Workflow-Aktion zum Mailversandbisher ging dieser eine Pfad an beiden Schaltern vorbei und versandte echt.
  • Neu
    Der Verlauf eines Vorgangs als PDF, mit KI-Kurzfassung und neuem Recht ticket_exportgedacht für Kundenleitungen, die die Korrespondenz zu einem Vorgang sehen wollen. Umfasst den Export eines Vorgangs; mehrere folgen. Der Export ist gedrosselt, Vorschau und Kurzfassung haben ein eigenes, engeres Limit, und die Kurzfassung zählt gegen das Nutzer-Kontingent für KI.
  • Neu
    Abfrage-Route für die Auslastungsauswertung samt XLSX- und CSV-Exportdazu ein nächtlicher Rollup-Job, der die Faktentabelle füllt, und der Widget-Typ pivot_table, der jetzt tatsächlich pivotiert. Die Nur-Eigensicht blendet Team- und Gesamtzahlen aus; ohne das wäre die Auswertung für jeden mit Lesezugriff eine Personalstatistik.
  • Neu
    Eigene Aufgabenlisten je Person, privat oder für das Teammit einem Schalter, ob Zugewiesene Fälligkeit und Priorität ändern dürfen.
  • Neu
    Versionierung im Dokumentenmanagementneue Version hochladen, Versionsliste lesen, jede alte Fassung herunterladen.
  • Neu
    GET /api/v1/company-sites liefert auch Räume ohne eigene Partyund je Eintrag die Adress-Id.
  • Neu
    Der Termin-Dialog trennt den Ortbeim Kunden, bei uns oder online — und kann einen eigenen Besprechungsraum zum Kundentermin mitbuchen oder Teilnehmer ohne Teams per Kalendereinladung einladen.
  • Neu
    Abschluss-Mail: Zusammenfassung der Leistungen per KIder Prompt liegt in der Prompt-Bibliothek und ist damit sichtbar und änderbar. Eine Lücke auf eigener Zeile wird zum Eingabefeld, wahlweise Pflicht.
  • Neu
    Benachrichtigungen lassen sich nach Thema filtern, durchsuchen und auf „ungelesen" einschränken.
  • Neu
    Erwähnungen mit @ im Mail-Composer, und ein Hinweis, wenn eine Nachricht einen Einmal-Link enthält.
  • Geändert
    Eine Vertriebschance wird erst „Gewonnen", wenn kein verknüpftes Angebot mehr beim Kunden offen ist.
  • Geändert
    Der Kalenderabgleich warnt, dass nicht als privat markierte Termine für alle sichtbar werdendie Sichtbarkeit folgt der Markierung im gekoppelten Kalender. Für den Altbestand gibt es eine Einmal-Operation; sie darf nicht alle Postfächer auf einmal anfassen, weil jedes zurückgesetzte Abgleichs-Token einen Vollabgleich über achtzehn Monate auslöst.
  • Geändert
    Die Kampagnenliste blendet abgeschlossene und archivierte Kampagnen standardmässig aus.
  • Geändert
    Das Mail-Symbol zeigt auf allen Flächen nur noch Kundenmails, die der angemeldete Nutzer noch nicht gesehen hatbisher zählte es teamweit unbeantwortete Mails, blieb nach dem Lesen stehen, und ein Klick quittierte es für alle. Es verschwindet jetzt, sobald die Mails der Akte auf dem Schirm waren; beantwortete oder von Kollegen quittierte Mails zählen nicht mit. Anlass waren zwei Rückmeldungen zum selben Zeichen: „es werden neue Mails angezeigt, obwohl keine neuen Mails enthalten sind" und „obwohl die bereits gelesen sind". Der persönliche Punkt „Neu" und der Hinweis „wartet seit …" entfallen damit.
  • Behoben
    Ein Verlaufsexport zeigte mehr, als er durfteabgelegte Exporte waren für Portalnutzer abrufbar, samt interner Notizen; gefälschte Nachrichtenanhänge konnten beliebige Dateien des Mandanten einbetten; der Aufwandsteil zeigte Zeitbuchungen ohne das zugehörige Leserecht und ohne Datenbereich; und der Bildrückfall über die Originalnachricht holte verworfene interne Dateien wieder herein. Alle Wege sind geschlossen.
  • Behoben
    Bei mehr als 500 Nachrichten fielen im Verlaufsexport die neuesten wegund das PDF sah trotzdem vollständig aus.
  • Behoben
    Eine weitergeleitete Kundennachricht kam mit dem Absender der weitergeleiteten Nachricht andie Antwort ging damit an die falsche Adresse.
  • Behoben
    Der interne Kontextblock konnte bei einem Präsenztermin mit Kalendereinladung an Externe gehen.
  • Behoben
    Ein Verlaufsexport zeigte mehr, als er durfteAbgelegte Exporte waren für Portalnutzer abrufbar, samt interner Notizen; gefälschte Nachrichtenanhänge konnten beliebige Dateien des Mandanten einbetten; der Aufwandsteil zeigte Zeitbuchungen ohne das zugehörige Leserecht und ohne Datenbereich; und der Bildrückfall holte verworfene interne Dateien wieder herein.
  • Behoben
    Die Raumvorprüfung meldete nach einem Abruffehler „Raum frei"ein Fehlschlag sah aus wie ein freies Ergebnis.
  • Behoben
    Eine Raumbelegung verschob den Raumtermin einer anderen Person ohne Zeilenprüfung.
  • Behoben
    Die Erkennung von Einmal-Links im Mail-Composer lässt sich nicht mehr zum Einfrieren bringenein quadratischer Ausdruck über Satzzeichen konnte an fremdem Nachrichten-HTML hängen bleiben.
  • Behoben
    Eingefügter Text kann in einer Abschluss-Mail keine Pflicht-Lücke mehr öffnenweder aus einem übernommenen Buchungstext noch über eine geschweifte Klammer im Hinweistext.
  • Behoben
    Der MIME-Typ beim Hochladen einer Dokumentversion wird geklemmtund der Download des aktuellen Inhalts folgt derselben Klemme wie die übrigen Downloadpfade.
  • Behoben
    Die Historie eines aktiven Vorgangs verlor beim Weiterscrollen ältere Zeitbuchungen, Aufgaben und Termine.
  • Behoben
    Das Budget eines Vorgangs liess sich nach einer Kanal-Freigabe nicht mehr speichernObergrenze, Abrechnungsart und Pauschalbetrag blieben gesperrt.
  • Behoben
    Ein Personalprofil heisst in der Suche nicht mehr „Unknown", und die Befehlspalette ist vollständig übersetzt.
  • Behoben
    Bilder und Formatierung in Folien-Einheiten überleben das Speichern.

v0.5.9

Das Eintrittsdatum ist optional, und die E-Mail-Adresse steht am Personalprofil

Ein Personalprofil lässt sich ohne Eintrittsdatum anlegen und trägt seine E-Mail-Adresse selbst, wenn kein Benutzerkonto daran hängt. Die Abfrage der Schulungszuweisungen nimmt zusätzlich die Profil-Id an, damit auch eingeladene Personen ohne Konto ihre Pflichtschulungen sehen. Einladungen erinnern automatisch nach drei und sechs Tagen.

  • Neu
    employee_profile.email ist beim Anlegen und in den Stammdaten schreibbarbisher kam die Adresse ausschliesslich aus einem verknüpften Benutzerkonto. Profile ohne Konto hatten damit keine, obwohl der Einladungsversand genau dieses Feld liest. Das Feld wird beim Anlegen auf das Format geprüft; bei Profilen mit Konto bleibt das Konto die führende Quelle.
  • Neu
    GET /api/v1/player/assignments-for-user/:id nimmt auch die Id eines Personalprofils anbisher nur die Nutzer-Id. Eine eingeladene Person ohne angenommenes Konto hatte dadurch keine abfragbaren Zuweisungen. Ein geteilter Kurs erscheint jetzt mit Titel und Quelle statt als „Kurs gelöscht".
  • Neu
    Einladungen erinnern automatisch nach drei und sechs Tagendazu eine Übersicht der nicht angenommenen Einladungen und ein Endpunkt zum manuellen Erinnern.
  • Geändert
    hireDate ist kein Pflichtfeld des Personalprofils mehres steht nicht länger im required des Schemas, und alle Leser prüfen es vorher ab. Wer die Plattform nur für Pflichtschulungen nutzt, kennt das Eintrittsdatum oft nicht. Fristen, die auf „N Tage ab Eintritt" rechnen, überspringen Profile ohne Datum statt zu raten. Bestehende Profile bleiben unverändert.

v0.5.8

Vierzig Sicherheitskorrekturen — Workflows, Support-Endpunkte und Änderungshistorie halten ihre Grenzen ein

Ereignisgesteuerte Workflows liefen für Ereignisse fremder Mandanten; das ist behoben. Die Workflow-Aktionen setzen jetzt die Rechte der Zielentität durch, die Support-Endpunkte geben keine internen Felder mehr heraus, und Änderungshistorie wie Zeitstrahl wenden dieselben Leseregeln an wie der Einzelabruf. Mitglieder eines gelöschten Mandanten erhalten 403.

  • Breaking Change
    Mitglieder eines gelöschten Mandanten erhalten 403 TENANT_DELETEDbisher blieb ein soft-gelöschter Mandant für seine Mitglieder voll benutzbar. Der Mandant verschwindet zusätzlich aus der Mandantenliste. Mitgliedschaften und Berechtigungsbeziehungen bleiben unangetastet, die Löschung bleibt vollständig umkehrbar.
  • Breaking Change
    Ereignisgesteuerte Workflows starten nur noch für Ereignisse des eigenen Mandantender Trigger-Index war nach Entitätstyp und Operation geschlüsselt, der Mandant kam darin nicht vor. Ein Datensatz in einem Mandanten konnte damit Workflows anderer Mandanten auslösen und ihnen sein Dokument übergeben.
  • Breaking Change
    Die Workflow-Aktionen setzen die Rechte der Zielentität durchlookup_entity und reconcile_deletions verlangen sie jetzt, lookup_entity lässt seine Pflichtklauseln nicht mehr überschreiben, create_entity nicht mehr den Mandanten des neuen Datensatzes aus der Nutzlast bestimmen, und reconcile_deletions löscht nie in einer reservierten Collection.
  • Breaking Change
    Ein Custom-Schema oder eine Ressourcen-Definition kann nicht mehr auf geschützte Collections zeigender Collection-Name kam ungeprüft aus dem Editor. Wer Schemas veröffentlichen darf, erreichte damit Lesestände, Historie, API-Schlüssel oder E-Mail-Konten des eigenen Mandanten, oder lenkte eine eingebaute Ressource dorthin um.
  • Breaking Change
    Anrufliste und Anrufauswertung wenden den Datenbereich anTeam- und Standardansicht ersetzten ihn bisher, und ein Filter auf das Gesprächsergebnis umging die Feldbeschränkung. Eingeschränkte Rollen sehen dadurch weniger Zeilen.
  • Breaking Change
    Änderungshistorie und Zeitstrahl wenden dieselben Leseregeln an wie der EinzelabrufInhalte gelöschter verknüpfter Datensätze nur noch für Administratoren, private Termine und Aufgaben auch vor ihnen verborgen, verknüpfte Vorgänge mit dem Datenbereich des Betrachters, rollenbezogen ausgeblendete Felder auch in verknüpften Zeilen, und Betreff und Absender einer verschobenen E-Mail nur für Berechtigte.
  • Breaking Change
    ?limit=-1 hebt die Seitenbegrenzung der Support-Anfragelisten nicht mehr auf.
  • Breaking Change
    Die Support-Entitäten geben über den generischen Pfad keine internen Felder mehr herausder meldende Mandant erhielt Codemetas interne Notizen und rohe Sitzungsdokumente. Fünf weitere Zugriffswege auf dieselben Daten sind mitgeschlossen.
  • Breaking Change
    Ein Kunde kann über die Nachrichten-Route keine „gesendete ausgehende E-Mail" mehr an sein Ticket hängen.
  • Breaking Change
    Eskalationsregeln nehmen nur noch Feldpfade und einfache Werte anOperatoren und $where gingen unverändert in die Worker-Abfrage. Das führte serverseitiges JavaScript auf dem gemeinsamen Cluster aus und konnte die Fristen-Alarme aller Mandanten anhalten.
  • Breaking Change
    Mail- und Kalender-Push akzeptieren nur echte Ids des Kopplungsdienstes im Abrufpfad.
  • Neu
    Pflichtschulungen nach EU-KI-Verordnung Artikel 4Schulungspflichten für geteilte Kurse, Fristen und Erinnerungen, nachvollziehbar je Person.
  • Neu
    Teilnehmer und Fortschritt im Schulungskatalogfür die schulungsverantwortliche Person eines Kundenmandanten.
  • Neu
    Eigene Asset-Typen für TK-Endgeräteasset.telephony zerfällt in Tischtelefon, DECT und Gateway. Bestandsgeräte behalten ihren alten Typ, bis die zugehörige Einmal-Operation läuft; bis dahin tragen sie weiterhin die Anlagen-Felder und lassen sich nicht gegen den Kompatibilitätskatalog prüfen.
  • Neu
    Gelöschte Mandanten sind in der Verwaltung filterbar.
  • Geändert
    Dreizehn Major-Aktualisierungen von Abhängigkeiten sind nachgezogendazu sechs zusammengefasste Bot-Vorschläge und eine Reparatur der Sperrdatei. Kein Eingriff an der Schnittstelle, aber die breiteste Änderung unter der Haube in diesem Release.
  • Geändert
    Spanisch und Französisch sind vollständigdazu rund 5.000 im Code aufgerufene Übersetzungsschlüssel, die bisher fehlten, und ein Wächter, der jeden aufgerufenen Schlüssel gegen die deutsche Datei prüft.
  • Behoben
    Der Lernfortschritt wird aus einer Quelle gerechnetzwei Pfade kamen auf unterschiedliche Werte für dieselbe Person.
  • Behoben
    Die Vorschau von Mailtexten läuft nicht mehr in quadratische Ausdrückelange Nachrichten konnten die Darstellung ausbremsen.
  • Behoben
    Der Unterhaltungsimport lädt interne und Lieferanten-Nachrichten nicht mehr mitsie wären im Kundenportal sichtbar geworden. Mitgeladene Nachrichten haben zusätzlich eine Größengrenze.
  • Behoben
    Die automatische Quittung „Kunde wartet auf Antwort" reagiert nicht mehr auf Kommentare aus dem Portaldamit hätte ein Kunde die offenen Nachrichten seiner Kolleginnen und Kollegen quittiert.
  • Behoben
    Aktivitäten-Feeds zeigen Kundenrollen keine internen Aktivitäten und Anrufnotizen mehr.

v0.5.6

Krankmeldungen und Personalakten verlassen den mandantenweiten Lesezugriff, Anmeldegrenzen gelten je Konto

Krankmeldungen und Dokumente der Personalakte liefern für die meisten internen Rollen nur noch die eigenen Datensätze. Anmelden und 2FA-Prüfung haben zusätzlich ein Budget je Konto, und die Büro-IP-Allowlist hebt routeneigene Grenzen nicht mehr auf. Neu sind ein Modul für den Veranstaltungsbetrieb, eine Terminnummer und das Weiterleiten empfangener Mails.

  • Breaking Change
    Krankmeldungen und Dokumente der Personalakte sind nicht mehr mandantenweit lesbarBeide Datentöpfe standen bisher für praktisch jede interne Rolle im ganzen Mandanten auf read mit Datenbereich all. Jetzt gilt „nur die eigenen"; Ausnahme ist die Personalabteilung, und eine technische Teamleitung sieht bei Abwesenheiten die Art, nicht die Details. Der Abwesenheitskalender liefert fremde Krankmeldungen nicht mehr mit. Aufrufer bekommen keinen Fehler, sondern WENIGER Zeilen — Auswertungen, die auf der alten Menge beruhen, ändern ihr Ergebnis.
  • Breaking Change
    Anmelden und 2FA-Prüfung haben zusätzlich ein Budget je KontoDie Grenzen galten bisher nur je IP und griffen damit über viele IPs verteilt gar nicht. Das neue Budget hängt an der normalisierten E-Mail bzw. an dem Konto, zu dem die laufende 2FA-Anfrage gehört: 20 Versuche je Minute, Antwort 429 mit retry-after. Beim Anmelden zählen nur FEHLGESCHLAGENE Versuche, und ein erfolgreicher Anmeldevorgang leert das Budget — wer das richtige Passwort schickt, läuft nicht hinein.
  • Breaking Change
    Die Büro-IP-Allowlist hebt die Grenzen einzelner Routen nicht mehr aufEine Anfrage aus einem freigegebenen Netz übersprang bisher sowohl die harten Eimer als auch die routeneigenen Kappen — also genau die Grenzen, die einzelne Endpunkte für sich gesetzt hatten. Integrationen aus einem freigegebenen Netz können jetzt 429 sehen.
  • Breaking Change
    Die Unterrouten der Wissensdatenbank prüfen, womit verknüpft wirdEin Artikel ließ sich mit einem Datensatz verknüpfen, den der Aufrufer nicht lesen darf — bei einer Firma als Ziel wurde der Artikel damit im Kundenportal dieser Firma sichtbar. Ein Ziel ohne Lesezugriff antwortet jetzt 404.
  • Breaking Change
    Alle Exporte im CSV-Format nutzen dasselbe Trennzeichen, dieselbe Maskierung und denselben FormelschutzSechs Exporte hatten ihre Maskierung von Hand gebaut, drei davon ohne Formelschutz: ein Anführungszeichen im Wert verschwand still, ein Trennzeichen im Wert verschob die Spalten. Jetzt werden Werte mit Trennzeichen, Anführungszeichen oder Zeilenumbruch gequotet, und ein Wert, der mit =, +, - oder @ beginnt, bekommt ein vorangestelltes Apostroph.
  • Breaking Change
    Einen Mandanten anzulegen setzt eine dokumentierte AVV-Zustimmung vorausavvAcceptedAt ist auf beiden Anlage-Wegen Pflicht und wird fail-closed geprüft: ohne den Wert entsteht kein Mandant. Integrationen, die Mandanten automatisiert anlegen, müssen den Zeitpunkt der Zustimmung mitschicken.
  • Breaking Change
    Die generische Liste des Kundenportals gibt interne Felder nicht mehr über Umwege herausFilter, ?q= und ?sort= sind auf die Felder beschränkt, die die Antwort ohnehin enthält. Wer über ein internes Feld gefiltert oder sortiert hat, bekommt dafür jetzt eine Ablehnung statt eines Ergebnisses.
  • Breaking Change
    Die Personal-Endpunkte halten Mandantengrenze und Datenbereich eindie sieben Unterrouten unter /api/v1/hr/employees/:id/* prüften bisher nur die Berechtigung, nicht den Datenbereich des Personalprofils. Eine Rolle, die ein Mandant bewusst auf das eigene Team oder die eigene Person begrenzt hat, erreicht damit nicht mehr jedes Profil. Antworten fallen kleiner aus, Schreibzugriffe auf fremde Profile werden abgewiesen.
  • Breaking Change
    GET und POST /api/v1/search entfernen interne Felder aus den Trefferndie Ergebnisfelder liefen bisher nicht durch dieselbe Bereinigung wie Liste, Detail und Timeline. Felder wie die KI-Zusammenfassung eines Vorgangs oder die interne Quell-URL eines gekoppelten Fremdsystems sind in Suchtreffern nicht mehr enthalten.
  • Breaking Change
    POST /api/v1/search prüft Filter- und Sortierfelder gegen eine Allowlist je Entitätbisher wurde jeder mitgeschickte Feldname übernommen und nur gegen Sperrlisten geprüft. Für Entitätstypen, die ihre Filterfelder deklarieren, wird ein nicht deklariertes Feld jetzt abgewiesen.
  • Breaking Change
    POST /api/v1/webhooks/:tenantSlug/:provider nimmt für einen gelöschten Mandanten nichts mehr ander Lookup über den Slug übersprang die Löschkennzeichnung, das hinterlegte Secret bestand weiter die Signaturprüfung, und es entstanden Anrufe, Sync-Anstösse und Datensätze in einem Mandanten, den niemand mehr ansieht.
  • Breaking Change
    POST /api/v1/vacation-handovers/:id/apply prüft den Zeilenzugriff für alle übergebenen Teilebisher nur für die Vorgänge, nicht für die Kundennotizen. Eine Übergabe kann damit Vorgänge und Notizen ausserhalb des eigenen Datenbereichs nicht mehr umhängen.
  • Breaking Change
    Selbst importierte eigene E-Mails zählen nicht mehr als echte Sendungsie beeinflussen die Erstreaktionszeit und die Antwortkette nicht länger. Wer SLA-Kennzahlen ausliest, sieht für importierte Verläufe andere Werte als vorher.
  • Neu
    ticket.dispatcherId ist pflegbar — begrenzt auf ein konfiguriertes Dispo-TeamDas Feld war serverseitig gestempelt und fuer Aufrufer nicht setzbar. Jetzt darf ein Mitglied des konfigurierten Teams es explizit setzen, alle anderen werden abgewiesen — auf allen Schreibwegen (Anlegen, Einzel- und Sammelaenderung, Vollersetzung). Dazu POST /api/v1/dispatch/tickets/:ticketId/dispatcher-takeover: setzt den Aufrufer als Disponenten, wenn noch keiner gesetzt ist. Alles standardmaessig aus; ohne Konfiguration bleibt das bisherige Verhalten.
  • Neu
    Belegnummern finden ihren DatensatzDie globale Suche findet Angebote, Rechnungen, Konzepte und Reklamationen jetzt ueber ihre eigene Nummer — die vier Nummernfelder standen in keinem durchsuchten Textfeld, der indizierte Wort-Seek fand sie also nie, und die Stufe, die den Untertitel liest, wird bei einer Eingabe in Nummernform uebersprungen. Zusaetzlich findet q in der Chancen-Liste die Verkaufschance ueber die Angebotsnummer des an ihr haengenden Angebots.
  • Neu
    Eine Firma laesst sich auf einen STANDORT einer anderen zusammenfuehrenGET /api/v1/parties/:id/merge-plan und POST /api/v1/parties/:id/merge-into nehmen zusaetzlich targetAddressId (ein bestehender Standort des Ziels) oder targetAddressMode: "new-from-source" (Standort aus der Quelle anlegen) entgegen. Ohne beides bleibt es die bisherige Zusammenfuehrung auf die Firma als Ganzes.
  • Neu
    Ticket-Typen koennen von der Kundenfreigabe ausgenommen werdenEin so markierter Typ laeuft nicht in die Freigabe vor Bearbeitung, sondern wird direkt angelegt. Die Entscheidung faellt vor dem Einfuegen, nicht durch nachtraegliches Umhaengen.
  • Neu
    Abschluss-Mail in mehreren SprachenDie Abschlussmail-Konfiguration des Mandanten trägt je weiterer Ticketsprache eine optionale Fassung unter translations.<lang> (Betreff, Standardtext, Anreden), jede Vorlage zusätzlich translations.<lang>.body. Welche Fassung greift, entscheidet die Kommunikationssprache des Vorgangs; Betreff und Signatur folgen ihr. Ein Mandant ohne gepflegte Übersetzung verhält sich unverändert.
  • Neu
    Aufgabenvorlagen haben einen EinsatzbereichusableIn begrenzt, wo eine Vorlage zur Auswahl angeboten wird — eine Liste aus ticket, project, contract und task. Leer oder fehlend heißt „überall", bestehende Vorlagen verhalten sich also unverändert und ohne Datenumstellung. componentOnly markiert eine Vorlage als Baustein: sie wird nur innerhalb anderer Vorlagen angeboten, nie allein. Beides gilt für die oberste Vorlage, nicht für eine Untervorlagen-Referenz.
  • Neu
    Termine haben eine TerminnummerappointmentNumber in der Form TRM-2026-00042, vergeben beim Anlegen. Sie ist in der globalen Suche und in der Belegnummern-Suche der Listen findbar. Termine aus der Zeit davor tragen keine; die Oberfläche blendet die Kennung dann aus, statt einen Platzhalter zu zeigen.
  • Neu
    POST /api/v1/email-inbox/:id/forwardLeitet eine empfangene Nachricht weiter, samt Anhängen. Verlangt das Bearbeitungsrecht auf E-Mails und die Zugehörigkeit zum Postfach.
  • Neu
    Versionierte Konfiguration für On- und OffboardingGET /api/v1/onboarding/config/versions und …/versions/:version, dazu die beiden Gegenstücke unter /api/v1/offboarding/. Jede Änderung wird zu einer nummerierten, unveränderlichen Fassung; ein laufender Vorgang behält die Fassung, mit der er gestartet ist.
  • Neu
    Aufgaben im On- und Offboarding lassen sich mehreren Personen zuweisen.
  • Neu
    Die Vertragsliste filtert nach enthaltenen PositionenDamit lässt sich beantworten, welche Verträge ein bestimmtes Produkt enthalten.
  • Neu
    Eine Alarmregel für hängende Kalender-PostfächerSie schlägt an, wenn ein Postfach innerhalb eines Zwei-Stunden-Fensters keinen einzigen erfolgreichen Abgleich hatte.
  • Neu
    Leistungsnummern stehen am Vorgang, im Projekt und im Zeitstrahl.
  • Neu
    ?involvedPartyId= auf den Listenendpunktenliefert die Datensätze, in denen eine Person beteiligt ist, also sowohl als Kunde als auch als Ansprechpartner. Der Server schlägt den Party-Typ selbst nach; eine unbekannte Ressource oder ein doppelter Parameter wird mit 400 abgewiesen statt die Liste ungefiltert zu liefern.
  • Neu
    Modul VeranstaltungsbetriebGastveranstaltungen mit Belegungsplan samt Optionsstufen, Anfragen mit Antwortfristen, ein Fragebogen-Modell für die Bestandsaufnahme, Positionsspiegel mit Angebotserzeugung, Nachweisregister (Haftpflicht, Technik- und Dekorationsanzeige, Umbauunterlagen), Materialbestand mit Reservierung und Freigabelinks für Veranstalter und Dienstleister.
  • Neu
    Abschluss-Mail-Vorlagen können Pflicht-Lücken enthaltenStellen, die der Bearbeiter vor dem Versand ausfüllen muss. Eine Vorlage ohne gefüllte Lücke wird nicht versandt.
  • Neu
    Die Skill-Matrix hat ein eigenes BearbeitungsrechtLesen und Bearbeiten sind damit getrennt vergebbar.
  • Neu
    Fragebogen-Fragen haben Standardwert und Hinweistext.
  • Geändert
    Ergebnisse der Assistenz-Werkzeuge sind als Daten gekennzeichnetInhalte aus Datensätzen gingen bisher ohne jede Markierung an das Modell. Sie tragen jetzt eine ausdrückliche Kennzeichnung, dass es sich um Daten und nicht um Anweisungen handelt.
  • Geändert
    Die Größe eines vorsignierten Uploads wird gegen den Objektspeicher geprüftDie beim Anfordern behauptete Größe wurde bisher übernommen. Jetzt wird sie gegen das tatsächlich abgelegte Objekt abgeglichen und bei Abweichung korrigiert.
  • Geändert
    Ein Wechsel des Anwendungsgeheimnisses entwertet verschickte Links nicht mehr sofortÖffentliche Links ohne Anmeldung — Abmeldung aus Newsletter und Kampagne, Zufriedenheitsbefragung nach einem Termin — bleiben während eines konfigurierbaren Übergangsfensters gültig. Angemeldete Sitzungen enden bei einem Wechsel weiterhin sofort.
  • Geändert
    Der Index auf calendar_events über die verwaltete Termin-Id ist partieller trägt nur noch die Dokumente, die den Wert führen. Kein Verhaltensunterschied an der Schnittstelle, aber ein deutlich kleinerer Index.
  • Geändert
    Der Filter für Vorgänge mit unbeantworteter Kundenmail meldet einen gescheiterten Suchlauf mit 503bisher antwortete er mit einer leeren Liste, die wie „nichts gefunden" aussah.
  • Behoben
    Der Zeitstrahl nennt Verschiebungen verknuepfter TermineincludeLinkedEventChanges=true an den Zeitstrahl-Endpunkten liefert Zeilen fuer verschobene und umbesetzte Termine, mit altem und neuem Zeitraum. Bisher stand dort nur „Termin angelegt" — dass Kollegen ihn danach verlegt hatten, verschwieg die Antwort.
  • Behoben
    Die Geraeteauswahl am Termin war nicht auf den Kunden des Termins begrenztEin Termin mit zugeordnetem Kunden bot in „Betroffene Geraete" die Geraete aller Kunden an. Die Auswahl filtert jetzt auf den Kunden des Termins.
  • Behoben
    Die Suche findet Geräte über ihre Geräte-NummerBisher war ein Gerät über seine Nummer nur findbar, wenn sie zufällig auch im Namen stand — bei importierten Beständen gilt das nur für einen Teil. Das Feld steht jetzt im durchsuchten Feldsatz und im Rohfeld-Rückfall, also auch ohne neu aufgebauten Suchtext. In der indizierten Wortliste trägt es nur seine Ziffern-Teile bei, damit das Systempräfix importierter Nummern nicht zum häufigsten Wort des Mandanten wird; die Volleingabe bleibt exakt.
  • Behoben
    PATCH /api/v1/hr/employees/:id/skills schrieb den ändernden Nutzer mit der falschen Idstatt der mandantenbezogenen Nutzer-Id stand die Anmelde-Id im Datensatz. Auswertungen über updatedBy fanden die Person dadurch nicht.
  • Behoben
    Ein in dieser Plattform gelöschter Termin kam über die Kalender-Kopplung zurückder Abgleich legte ihn wenige Minuten später neu an.
  • Behoben
    Gescheiterte Kalender-Abgleiche sind sichtbar45 Postfächer hatten acht Tage lang keinen erfolgreichen Abgleich, ohne dass es irgendwo gemeldet wurde.
  • Behoben
    Beim Ticket-Austausch stand als Beschreibung die Originalnachricht des Anwenderserwartet war die aufbereitete Zusammenfassung. Direkt in den Nachrichtentext eingefügte Bilder kommen jetzt ebenfalls im Zielsystem an.
  • Behoben
    Die Suche findet Vorgänge über die Vorgangsnummer des gekoppelten Zielsystems.
  • Behoben
    Anhänge aus importierten Nachrichten liegen im Objektspeicherbisher landeten sie auf der lokalen Platte und waren nach einem Neustart nicht mehr abrufbar.
  • Behoben
    Kundengebundene Geheimnisse lassen sich wieder mit dem Unternehmen oder einer Person teilen.
  • Behoben
    Die Sortierung nach Priorität stellte die kritischen Vorgänge ganz nach untenzusätzlich lud eine Spalte mit eigener Sortierung ab 500 Karten die falschen Datensätze nach.
  • Behoben
    Eine Zeitbuchung über die Schnellerfassung nahm die Eingabe . als Dauer anund speicherte einen ungültigen Wert.
  • Behoben
    Der ausgelieferte Auftragsverarbeitungsvertrag enthielt nur jeden zweiten Abschnittund liess eine Klausel vermissen, die für die Wiederverkäufer-Freigabe vorausgesetzt wird. Der Prüfmechanismus kontrolliert jetzt den gerenderten Text statt nur die Quelldatei.
  • Sicherheit
    Urlaubsübergaben liessen sich von jeder Person ändern, die ihre Id kannteund für Kolleginnen und Kollegen ohne Berechtigung anlegen, direkt im Zustand „durchgeführt". Erstellen, Ändern und Durchführen sind jetzt einzeln geprüft.
  • Sicherheit
    Ein Listenendpunkt übernahm den Namen des Gruppierungsfeldes ungeprüft in den Filterbeim Nachladen einer Spalte war damit ein beliebiger Feldname einsetzbar. Das Nachladen ist zusätzlich gedeckelt.
  • Sicherheit
    Der Belegungsplan gab die Titel privater Fremdtermine herauser zeigt jetzt nur noch, dass der Zeitraum belegt ist.
  • Sicherheit
    Der Rufnummern-Abgleich des Softphones schrieb die Nummer des Anrufers ins Protokollsamt der dazu aufgelösten Partei. Ein Anrufer wird ausserdem nur noch über seine exakte Nummer erkannt und nie als gelöschtes Unternehmen.
  • Sicherheit
    Betreff oder Kontaktname eines Kunden konnten eine Pflicht-Lücke in eine Abschluss-Mail-Vorlage einschleusenWerte aus den Kundendaten werden dort nicht mehr als Vorlagensyntax ausgewertet.
  • Sicherheit
    Die gespeicherten Ansichten der Einsatzplanung waren über den generischen Listenpfad einsehbardie Sichtbarkeitsregel lag nur in der dafür gebauten Route, während dieselbe Entität zusätzlich über den generischen Pfad erreichbar war und dort nichts filterte. Name, Personenliste und Freigaben fremder Ansichten sind damit nicht mehr abrufbar.

v0.5.5

Vertragsdeckung wird zur Ganz-oder-gar-nicht-Entscheidung, vier Rechteprüfungen nachgezogen

Eine Zeitbuchung geht jetzt ganz auf den Vertrag oder gar nicht — anteilige Deckung entfällt, abgeleitete Beträge ändern sich entsprechend. Mehrere Endpunkte prüfen Rechte, die sie bisher übersprangen; die Offline-Synchronisation läuft über dieselbe Pipeline wie jeder andere Schreibzugriff. Neu sind Endpunkte für die Vertragszuordnung einer Buchung und das Zusammenführen von Firmen.

  • Breaking Change
    Eine Zeitbuchung ist ganz durch den Vertrag gedeckt oder gar nichtdie anteilige Deckung entfällt. Buchungen, die mehrere Geräte berühren, von denen nur ein Teil unter Vertrag steht, gelten nicht mehr als teilweise gedeckt. coveredMinutes ist damit entweder die volle abrechenbare Dauer oder null; coveragePartial wird nicht mehr gesetzt. Wer auf Teilwerte ausgewertet hat, bekommt andere Summen.
  • Breaking Change
    Projekt-Controlling, Aufgabensummen, Positions-Rollup, Budgetdeckel und Sperren rechnen mit der gerundeten Zeitbisher mischten sich gerundete und exakte Dauern je nach Auswertung. Der eingefrorene Betrag einer Buchung folgt den budgetwirksamen Minuten. Beträge und Summen können sich dadurch gegenüber der Vorversion verschieben, ohne dass sich eine Buchung geändert hat.
  • Breaking Change
    POST /api/v1/time_records nimmt keinen beliebigen status mehr entgegenerlaubt sind nur Entwurf, Eingereicht oder gar keine Angabe. Bisher liess sich eine Buchung direkt als genehmigt oder als bereits fakturiert anlegen, am Freigabeschritt vorbei und ohne Vertragsdeckung. Integrationen, die einen Zielstatus mitschicken, müssen den Statuswechsel jetzt als eigenen Schritt fahren.
  • Breaking Change
    GET /api/v1/contracts/:id/covered-records verlangt zusätzlich das Leserecht auf Zeitbuchungenund wendet deren Datenbereich an. Bisher reichte der Zugriff auf den Vertrag, und die Antwort enthielt Buchungstexte und Stunden aller Beteiligten. Aufrufer ohne dieses Recht bekommen jetzt 403, eingeschränkte Rollen eine kleinere Menge.
  • Breaking Change
    Die Synchronisations-Endpunkte spielen jede Operation über die reguläre CRUD-Pipeline abmit Funktionsrecht, Datenbereich, Entity-Hooks, Statuswächtern und Antwortformung. Die Antworten enthalten damit dieselben Felder wie die entsprechende CRUD-Antwort statt des rohen gespeicherten Dokuments; Operationen, die ein Recht oder eine Regel verletzen, schlagen jetzt fehl statt durchzulaufen.
  • Breaking Change
    Plattform-globale Entitäten lassen sich nicht mehr über generische Schreibwege anlegenweder über die generische CRUD-Route noch über Workflow-Aktionen oder Assistenz-Werkzeuge. Betroffen sind Datensätze, die nicht einem einzelnen Mandanten gehören; sie entstehen nur noch auf ihrem eigenen, dafür vorgesehenen Weg.
  • Breaking Change
    Einsatzplanungs-Ansichten sind über die generische CRUD-Route nicht mehr schreibbarAnlegen, Ändern und Löschen laufen ausschliesslich über die eigenen Endpunkte der Einsatzplanung, die die Zugehörigkeit der Ansicht prüfen. Aufrufe über die generische Route werden abgewiesen; Lesen bleibt unverändert.
  • Neu
    GET und POST /api/v1/time-records/:id/coverageLiest und setzt die Vertragszuordnung einer Buchung. Die Umstellung löst die Deckung neu auf und zieht das Kontingent in derselben Bewegung nach; sie ist deshalb ein eigener Endpunkt und kein generisches PATCH. Eigene 422-Fälle für eingefrorene Datensätze und für Kontingente, deren Überschreitungsregel die Umstellung verbietet.
  • Neu
    GET /api/v1/parties/:id/merge-plan und POST /api/v1/parties/:id/merge-intoHängen die Datensätze einer Firma auf eine andere um. Der Plan nennt vorab, was bewegt würde.
  • Neu
    time_record.coverageMixedAssetsKennzeichnet Buchungen, die Geräte mit und ohne Vertragsdeckung berühren. Damit bleibt die Information erhalten, die mit dem Wegfall der anteiligen Deckung sonst verloren ginge.
  • Neu
    Pflichtfeld-Ablehnungen nennen alle fehlenden Felder auf einmaljede Ablehnung trägt die Erweiterungen missingFields (Liste) und resource im Problem-Details-Objekt, an allen Übergangs-Endpunkten, in der Übergangsliste je Prüfung und in der Schema-Validierung. Bei genau einem fehlenden Feld bleibt der bisherige Text unverändert.
  • Neu
    Kommunikationssprache je VorgangVorlagen und Textbausteine lassen sich je Sprache pflegen, ausgehende Nachrichten folgen der am Vorgang gesetzten Sprache.
  • Neu
    Live-Support als eigene Entitätsupport_live_sessions mit Lebenszyklus, Warteschlange und eingefrorener Zustimmung, dazu GET /api/v1/support-live-quote für den gültigen Satz und GET /api/v1/support-live-sessions/:id. Live-Support ist standardmässig kostenpflichtig; der angewandte Satz je angefangene 15 Minuten steht im Zustimmungsdialog und wird beim Start der Sitzung festgeschrieben.
  • Neu
    Auth-Typ custom_header für generische IntegrationenAPI-Key-Header und Cookie-Token werden darüber einheitlich konfiguriert.
  • Neu
    Team-Filter kennen „kein Team zugewiesen"der generische Parameter teamId nimmt dafür einen eigenen Wert entgegen; er wirkt auf Vorgänge, Aufgaben, Rückrufe, Projekte, Verträge, Firmen und die Zeiterfassung.
  • Neu
    Ansprechpartner nach Standort filtern, zentrale Rufnummer je Standortdie Rufnummer hängt am Standort statt nur an der Firma.
  • Neu
    GET /api/v1/performance-records/:id/xlsxGibt einen Leistungsnachweis als Excel-Arbeitsmappe zurück, mit denselben Positionen und Summen wie das PDF.
  • Geändert
    coverageAmbiguous wird erstmals tatsächlich gesetztdas Feld existierte, blieb aber immer false. Wer darauf verzweigt hat, bekommt jetzt echte Treffer.
  • Geändert
    Kontingent-Perioden setzt ausschliesslich der nächtliche Lauf umbisher konnte auch ein Lesezugriff eine Periode weiterschalten, was Auswertungen je nach Aufrufzeitpunkt unterschiedlich ausfallen liess.
  • Geändert
    Buchungen vor der ersten Aufladung eines Kontingents zählen nicht mehr dagegenbei automatisch aufladenden Kontingenten wurden sie bisher rückwirkend verrechnet.
  • Geändert
    Neue Kontingente starten mit der Überschreitungsregel „Erlauben"die Regel samt Zuschlag ist am Kontingent einstellbar; bestehende behalten ihre Einstellung.
  • Sicherheit
    Zeitbuchungen liessen sich per Schnittstelle direkt als genehmigt anlegen, ohne Freigaberechtsiehe oben unter „Breaking". Die Freigabeprüfung war als Übergangsregel nur auf den Änderungspfaden verdrahtet; beim Anlegen gab es keinen Vorzustand, gegen den sie hätte greifen können.
  • Sicherheit
    Die Liste der Vertragsleistungen umging Leserecht und Datenbereich der Zeitbuchungeneine Unterroute eines Vertrags gab Datensätze eines zweiten Typs aus und erbte dabei nur die Prüfung des Vertrags.
  • Sicherheit
    Die Offline-Synchronisation umging Rechte, Datenbereich und Regelneiner der drei Wege prüfte gar nichts und gab das vollständige gespeicherte Dokument zurück. Alle drei laufen jetzt über die reguläre Pipeline.
  • Sicherheit
    Zeilen im Unterlagen-Archiv des Partnerbereichs waren über einen generischen Schreibweg erzeugbarsie erschienen danach bei allen Partnern, und der Download signierte jeden hinterlegten Ablageschlüssel. Das Archiv vertraut jetzt nur noch Zeilen aus dem dafür vorgesehenen Upload.
  • Sicherheit
    Die Referenzliste einer Firmenadresse gab interne Felder an Portal-Nutzer herausGET /api/v1/parties/:partyId/addresses/:addressId/references?include=items lieferte die vollständigen Dokumente ohne Feldbeschränkung. Interne Notizen, der interne Sperrvermerk einer Firma, die maschinelle Verlaufszusammenfassung und die Verweise auf das führende Fremdsystem waren damit für Portal-Nutzer lesbar. Die Antwort entfernt diese Felder jetzt wie die generischen Lese-Endpunkte; für interne Aufrufer ändert sich nichts.
  • Sicherheit
    Die Standardmarkierung einer fremden geteilten Listenansicht war umschaltbardie Markierung hängt am Dokument und wirkte damit für alle Betrachter, liess sich aber nur von der Eigentümerin zurücknehmen. Sie ist jetzt auf eigene Ansichten beschränkt.
  • Sicherheit
    Ein Folge-Vorgang trug die Nummer seines Vorgängers auch bei einer anderen Firma im Titelund der Titel geht als Betreff der Eingangsbestätigung nach aussen. Nummer und Titel des Vorgängers wandern nur noch mit, wenn beide Vorgänge derselben Firma gehören.

v0.5.4

Notdienst getrennt abrechnen, importierte Buchungen wieder öffnen und ein korrigiertes Plan-Gate für KI

Notfalldienst-Buchungen lassen sich als eigener Leistungsnachweis abrechnen, gesteuert über eine neue Einstellung je Mandant und je Kunde. Aus einem Fremdsystem als fakturiert übernommene Zeitbuchungen können mit Pflicht-Begründung zurück in die Abrechnung geholt werden. Das Plan-Gate für KI-Funktionen entscheidet nicht mehr anhand eines veraltenden Feldes.

  • Neu
    emergencyServiceBilling in den AbrechnungseinstellungenSteuert, ob Notfalldienst-Buchungen in den normalen Leistungsnachweis wandern (COMBINED) oder einen eigenen bekommen (SEPARATE). Am Mandanten als Voreinstellung, je Kunde über performanceRecordSettings.emergencyServiceBilling übersteuerbar; null oder fehlend bedeutet „Voreinstellung des Mandanten". Ohne gesetzten Wert bleibt das bisherige Verhalten.
  • Neu
    time_record.tanssReopenReasonPflicht-Begründung beim Wiederöffnen einer Zeitbuchung, die aus einem Fremdsystem bereits als fakturiert übernommen wurde. Die Begründung steht zusätzlich in den Metadaten des Historieneintrags, der Vorgang ist damit nachvollziehbar.
  • Neu
    Positionen eines Leistungsnachweises lassen sich nach Vorgang gruppierendie Gruppierung wirkt auf die Darstellung und auf das erzeugte PDF, nicht auf die zugrunde liegenden Buchungen.
  • Geändert
    Der Team-Filter der Leistungsnachweis-Liste meint jetzt „Kunden des Teams"bisher filterte er auf Buchungen von Team-Mitgliedern. Wer die Liste über den Team-Parameter einschränkt, bekommt damit eine andere, fachlich gemeinte Menge als vorher.
  • Geändert
    Das Ticket-Budget verbraucht nur noch abrechenbare Minutennicht berechenbare Anteile zählen nicht mehr gegen die Obergrenze. Der ausgewiesene Verbrauch eines Vorgangs kann dadurch niedriger liegen als bisher.
  • Geändert
    Der Account Manager wird von hier aus geführt und in das gekoppelte ERP übertragenbisher konnten beide Seiten auseinanderlaufen, ohne dass eine von beiden führend war.
  • Geändert
    Leistungsnachweis- und Rechnungs-PDF drucken lange Positionstexte mehrzeiligsie wurden vorher abgeschnitten.
  • Behoben
    KI-Funktionen waren für jeden Mandanten gesperrt, dessen Abo-Dokument noch tier: 'free' trugauch bei gebuchtem, bezahltem Paket. Das Gate entscheidet jetzt anhand des Pakets statt anhand dieses veraltenden Feldes; betroffene Mandanten bekommen ihre KI-Endpunkte ohne Zutun zurück.
  • Behoben
    Ein geteilter Kurs nahm nur einen einzigen Lernenden des Endkunden aufjede weitere Einschreibung scheiterte mit 409. Ursache war ein Unique-Index, dessen Filter auch die Einschreibungen ohne eigene Nutzer-Id erfasste. Ein automatischer Migrationsschritt stellt den Index beim Start um.
  • Behoben
    Ein gelöschtes, aus einem Alarm erzeugtes Ticket blockierte das erneute Erzeugen dauerhaftdie Prüfung sah den gelöschten Datensatz weiterhin als bestehende Verknüpfung an.
  • Behoben
    Der Abrechnungsgrund einer Zeitbuchung wird gegen den eigenen Mandanten geprüfteine fremde Id wird abgewiesen, statt ungeprüft übernommen zu werden.
  • Behoben
    Eine aus einem Leistungsnachweis erzeugte ERP-Rechnung druckte den Leistungszeitraum an jeder Position statt einmal.
  • Behoben
    Das Zahlungsportal antwortete mit 404, solange kein Kunde beim Zahlungsdienstleister bestandbis dahin ließ sich keine Zahlungsmethode hinterlegen. Der Kunde wird jetzt beim Öffnen des Portals angelegt.
  • Behoben
    Das Verknüpfen eines Alarms mit einem Vorgang hinterlässt einen Historieneintragauch auf dem Alarm selbst, der bisher unverändert blieb.

v0.5.3

Vertragskündigung zum Stichtag, Lösch-Lebenszyklus für Mandanten und ein Budget-Stopp am Ticket

Eine Vertragskündigung trägt jetzt einen Stichtag, und der Status folgt ihm — ein Zukunftsdatum lässt den Vertrag zunächst aktiv. Mandanten durchlaufen vor der Löschung eine Frist, in der schreibende Anfragen mit 423 abgewiesen werden. Neu sind ein Endpunkt zur Rücknahme einer Kündigung und eine Budget-Sperre am Ticket.

  • Neu
    POST /api/v1/contracts/:id/withdraw-cancellationNimmt eine angeforderte, noch nicht wirksame Kündigung zurück und nullt die Kündigungsmarker. Der Status war dabei nie verändert worden. Steht nichts an, antwortet der Endpunkt mit 422 invalid-transition; ein bereits gekündigter Vertrag wird stattdessen über renew reaktiviert.
  • Neu
    Kündigungsmarker am Vertrag sind lesbarcancellation.cancellationEffectiveDate (letzter gültiger Tag, gleiche Semantik wie endDate), cancellation.cancellationReason und cancellation.cancellationRequestedAt stehen in jeder Vertragsantwort und erlauben, eine angeforderte von einer bereits wirksamen Kündigung zu unterscheiden.
  • Neu
    Mandanten haben einen Lösch-LebenszykluslifecycleState mit den Zuständen active, deletion_requested, pending_deletion, awaiting_purge_approval, purging und deleted. Ein fehlendes Feld bedeutet active. Zwischen Antrag und Löschung liegt eine Frist von 30 Tagen, in der ein Widerruf jederzeit möglich bleibt.
  • Neu
    ticket_type.keepTeamOnReassignmentHält das Team eines Vorgangs gegen die Automatik, die es sonst beim Setzen des Kunden oder beim Zuweisen eines Technikers überschreibt. Nur ein bereits gesetztes Team wird gehalten, ein leeres weiter gefüllt. Default false, bestehende Typen verhalten sich unverändert.
  • Neu
    Eine Zeitbuchung über der Budgetgrenze löst selbst eine Freigabe-Anfrage ausDie zurückgehaltene Buchung bleibt im Entwurfszustand, die Teamleitung wird benachrichtigt, und der Vorgang nimmt bis zur Entscheidung keine weiteren Buchungen an. Bisher entstand der Entwurf still und ohne Signal an irgendjemanden.
  • Neu
    project.previousManagerIdHält fest, wer die Projektleitung vor einer automatischen Übergabe an die Teamleitung hatte. Das Feld ist schreibgeschützt und macht die Rücknahme eindeutig.
  • Neu
    Die Zustimmung zu den Nutzungsbedingungen wird mit Fassung, Zeitpunkt und zustimmender Person protokolliertvorher blieb nur ein Ja-Flag ohne Bezug zu einer Fassung.
  • Geändert
    POST /api/v1/contracts/:id/cancel: der Status folgt dem StichtagMit effectiveDate in der Zukunft bleibt der Vertrag ACTIVE bzw. EXPIRING und wird erst am Tag nach dem Stichtag auf CANCELLED geschaltet; ohne Datum oder mit einem Datum bis heute wird sofort gekündigt. Wer aus der Antwort bisher auf CANCELLED geschlossen hat, muss stattdessen die Kündigungsmarker lesen.
  • Geändert
    POST /api/v1/contracts/:id/cancel validiert den BodyeffectiveDate muss ein Datum sein, reason höchstens 500 Zeichen lang, zusätzliche Felder werden abgewiesen. Neue Fehler: 422 cancellation-date-in-past, 422 cancellation-date-after-end, 422 cancellation-date-not-allowed-for-draft und 422 cancellation-pending bei einer zweiten Kündigung. Bisher wanderte jeder String ungeprüft in das Kündigungsobjekt.
  • Geändert
    POST /api/v1/contracts/:id/renew verweigert bei anstehender KündigungAntwort 422 cancellation-pending. Eine dokumentierte Kündigung soll nicht als Nebeneffekt einer Verlängerung verschwinden; erst zurücknehmen, dann verlängern.
  • Geändert
    Abrechnung und automatische Ticketerzeugung eines Vertrags enden am StichtagPerioden und Fälligkeiten, die vollständig danach liegen, werden übersprungen. Es gibt keine anteilige Abrechnung: eine Periode, die am oder vor dem Stichtag beginnt, wird voll berechnet.
  • Geändert
    Schreibende Anfragen eines Mandanten in der Löschfrist werden mit 423 TENANT_PENDING_DELETION abgewiesenGET bleibt offen, damit ein Datenexport während der Frist möglich ist. Der Widerruf bleibt ebenfalls erreichbar.
  • Behoben
    GET und PUT /api/v1/tickets/close-email-config antworten ohne Mandantenkontext mit 400bisher lasen oder erzeugten sie ein Dokument ohne Mandantenbezug.
  • Behoben
    Der text/plain-Teil einer Antwortmail enthielt nur die zitierte Ursprungsnachricht, nicht die Antwortbetraf seit dem 17.09.2026 jede über die Plattform versandte Antwort. Empfänger, die den Nur-Text-Teil auswerten, bekamen die eigentliche Antwort nie zu sehen.
  • Behoben
    Ein Vorgang aus einer Alarmregel trug im Typfeld eine rohe Id statt des Typschlüsselssolche Vorgänge fielen aus jedem Filter nach Vorgangstyp heraus und nahmen das typabhängige Standardbudget nicht an. Neu erzeugte Vorgänge tragen den Schlüssel; der Bestand wird gesondert repariert.
  • Behoben
    Die Team-Route am Kunden war an das Personalmodul gekoppeltohne dieses Modul lieferte sie nichts, obwohl das Team keine Personaldaten sind.
  • Behoben
    Der ausgehende weclapp-Vorabgleich verknüpfte eine Person mit der weclapp-Party ihrer Firmadie Suche nach der E-Mail-Adresse filterte nicht nach Party-Typ, und bei einer Sammeladresse war der einzige Treffer die Firma. Jede Abfrage trägt jetzt den Typ, und ein Treffer mit abweichendem Typ wird nicht verknüpft.
  • Behoben
    Termine, die ein Jahr oder weiter in der Zukunft angelegt wurden, kamen nicht andas Abholfenster des Kalenderabgleichs reichte nicht so weit.
  • Behoben
    Ein Abonnement ohne hinterlegte Zahlungsabwicklung lief nach der Kündigung nie abder Mandant blieb unbegrenzt aktiv.

v0.5.2

Abrechnungsgründe werden eine eigene Entität, Alarme lassen sich von Hand zu Tickets machen

Neu ist die Entität non_billable_reasons mit den üblichen CRUD-Endpunkten, dazu ein Endpunkt, der aus einem Alarm direkt ein Ticket erzeugt. Zwei Felder der manuellen Alarm-Ticket-Vorlage werden nicht mehr entgegengenommen, und mandantenfremde Ids in assignedToUserId/teamId werden abgewiesen.

  • Neu
    Entität non_billable_reasonsGepflegte Abrechnungsgründe für teilweise oder nicht berechenbare Leistungen, über die generischen CRUD-Endpunkte erreichbar. Felder: name (erscheint wörtlich auf dem Leistungsnachweis), color, description.
  • Neu
    time_record.nonBillableReasonIdVerweis auf den gewählten Grund. Der Anzeigetext bleibt zusätzlich in nonBillableReason stehen: Sechs Lesepfade bis hin zur Rechnungsvorlage rendern ihn direkt, und Altdatensätze tragen dort weiterhin Freitext ohne Id.
  • Neu
    Ein Alarm lässt sich von Hand zu einem Ticket machenbisher entstand ein Ticket nur, wenn eine Alarmregel mit create_ticket-Aktion griff. Die Vorlage dafür liegt in den Mandanteneinstellungen unter alarms.manualTicket und ist bewusst keine Regel: Sie wird nie ausgewertet und ändert die Reihenfolge des Regel-Stacks nicht.
  • Neu
    Ob die Fahrt einer nicht berechenbaren Leistung ebenfalls mit 0,00 € erscheint, ist eine Mandanteneinstellungohne gesetzten Wert bleibt das bisherige Verhalten.
  • Neu
    Das Sprungziel nach „Als Ticket übernehmen" ist je E-Mail-Konto einstellbarentweder in den neuen Vorgang wechseln oder in der Mailliste bleiben.
  • Neu
    Teams-Einladungen erscheinen als interner Nachweis am Vorgangeine aus einem Termin erzeugte Einladung wird als Systemnachricht an Ticket, Vertriebschance und Projekt abgelegt und ist über die Nachrichtenliste des Vorgangs lesbar.
  • Geändert
    assignedToUserId und teamId am manuell erzeugten Alarm-Ticket werden gegen den Mandanten geprüfteine fremde oder gelöschte Id wird abgewiesen, statt ungeprüft ins Ticket zu wandern.
  • Geändert
    autoCloseOnClear und addRecoveryComment sind an der manuellen Ticket-Vorlage nicht mehr speicherbarbeide wirken ausschliesslich im Regelpfad. Bisher nahm die API sie entgegen und sie blieben wirkungslos.
  • Behoben
    Doppelklick auf „Direkt Ticket erstellen" antwortet mit 409 statt 500zwei Anfragen innerhalb derselben Sekunde passieren beide die Vorprüfung; die zweite läuft jetzt in einen sauberen Konflikt.
  • Behoben
    Die genullte Fahrt einer nicht berechenbaren Buchung fehlte auf dem Leistungsnachweisim Fahrtmodus COMBINED verschwand sie ganz, sobald sie eine Zonenpauschale oder reine Reisezeit war, und fiel auf beiden weclapp-Auftragspfaden aus dem Auftrag.
  • Behoben
    Ohne gepflegte Abrechnungsgründe war das Grund-Feld gesperrtder Statusübergang nimmt in diesem Fall wieder Freitext an, damit ein Mandant ohne gepflegte Liste weiterarbeiten kann.
  • Sicherheit
    Der Einladungs-Nachweis wird nie nach aussen versandt und verlinkt nur http(s)andere Schemata im Besprechungslink werden nicht als Link gerendert.

v0.5.0

PUT und Massenbearbeitung ziehen mit PATCH gleich — Berechtigungen, Datenbereiche und Limits

Ein Zugriffs-Audit hat mehrere Endpunkte gefunden, die weniger streng prüften als der gleichbedeutende PATCH-Pfad. Wer bisher über PUT, die Massenbearbeitung oder den Statuswechsel an einer Prüfung vorbeigeschrieben hat, bekommt jetzt 400 oder 403. Dazu eine Zeilengrenze auf den Bulk-Endpunkten und mehrere Lesepfade, die den Datenbereich des Aufrufers erstmals wirklich anwenden.

  • Breaking Change
    POST /:resource/bulk/update und POST /:resource/bulk/delete nehmen höchstens 100 Zeilendarüber 400 VALIDATION_FAILED. Vorher war die Zeilenzahl unbegrenzt; jede Zeile ist eine eigene Transaktion mit Historien-Eintrag. Grössere Mengen in Blöcken senden, wie beim Geschwister-Endpunkt POST /:resource/bulk, der seit jeher bei 100 deckelt.
  • Breaking Change
    POST /:resource/:id/transitions/:key wertet das Statusfeld in fields nicht mehr ausder Status kommt ausschliesslich aus dem Übergang im Pfad. Bisher liess sich mit {"fields":{"status":"CLOSED"}} die Prüfung der Kante nach IN_PROGRESS bestehen und trotzdem CLOSED schreiben.
  • Breaking Change
    Top-Level-Schlüssel mit __-Präfix werden auf allen Schreibpfaden verworfender Präfix ist für Laufzeitwerte der Regelauswertung reserviert. Ein gespeicherter Wert war von einem injizierten nicht zu unterscheiden und konnte Regel-Guards erfüllen.
  • Breaking Change
    POST /:resource/bulk schreibt keine Schema-Defaults mehr in nicht gesendete Felderdie Validierung füllte Vorgabewerte in den Patch, die dann bei jeder Massenänderung Felder zurücksetzten. Übernommen werden nur noch die vom Aufrufer gesendeten Schlüssel.
  • Neu
    POST /api/v1/tickets/:id/convert-to-projectüberführt Mails, Notizen, Aufgaben, Leistungen, Termine, Checklisten, Aktivitäten und Dokumente eines Tickets in ein bestehendes Projekt. Rechte: ticket_view + ticket_convert + project_edit, dazu Zugriff auf das Zielprojekt. Abgerechnete Leistungen und Leistungen mit Kontingent-Verbrauch bleiben am Ticket.
  • Neu
    POST /api/v1/list-visits/visit und POST /api/v1/list-visits/seenBesuchsstand je Nutzer und Liste für „neu seit Ihrem letzten Besuch". Ein Aufruf innerhalb von 30 Minuten gilt als derselbe Besuch. Die Liste steht im Rumpf, nicht im Pfad.
  • Neu
    GET /api/v1/daily-overview liefert timeRecordsdie Buchungen des Tages mit aufgelöstem Kundennamen und Ticketnummer. Das Feld ist optional; ein älterer Server liefert es nicht, statt zu brechen.
  • Neu
    Ticket-Austausch: Vorgänge aus dem Kunden-Jira werden bei Zuweisung oder Statuswechsel als Ticket angelegtje Verbindung einschaltbar über exchange.inboundCreate, standardmässig aus. Beim Einschalten wird der Bestand nicht importiert; die Untergrenze ist der Einschaltzeitpunkt. Neu dazu GET /api/v1/ticket-exchange/connections/:id/external-organizations (ticket_exchange_connection_manage).
  • Geändert
    PUT /:resource/:id und beide Massenbearbeitungs-Pfade prüfen dieselben Guards wie PATCHEditiersperre abgerechneter Buchungen, Freigabe-Gate, Park-Merker und das Eigentümer-Gate von Aufgaben, mit identischen Statuscodes und Problem-Bodies. Vorher liefen genau diese Prüfungen nur auf dem PATCH-Pfad.
  • Geändert
    Budget-Obergrenzen sind nicht mehr für jeden Bearbeiter schreibbarmaxMinutes, maxAmount, limitMode und hardBlockOnExceed an Aufgaben verlangen task_override_budget; budgetCapPercent, hoursCapPercent und limits.hardBlockOnExceed an Projekten verlangen project_edit. Sonst 403.
  • Geändert
    task.loggedMinutes ist ein geschütztes Feldes speist Fortschrittsanzeigen und den Projekt-Lock und wird nur noch serverseitig fortgeschrieben.
  • Geändert
    activity.performedById, performedByName und performedByImage werden aus Client-Rümpfen verworfenbeim Anlegen setzt die API den handelnden Nutzer. Administratoren dürfen weiterhin im Namen anderer erfassen.
  • Geändert
    POST /api/v1/projects/import-from-order nimmt billingModel und Budget-Obergrenzen nicht mehr ungeprüft aus dem Rumpfbeide liefen an der Akteursprüfung vorbei.
  • Sicherheit
    Fuhrpark-Lesepfade wenden den Datenbereich auf Terminen anGET /api/v1/fleet/calendar, /fleet/resource-planning/timeline und /fleet/resource-planning/vehicle-demands waren nur mit vehicle_view gegated und lieferten Titel, Ort, Kunde und Organisator aller Fahrzeugtermine, auch an Rollen, die Termine sonst nur im eigenen Zuständigkeitsbereich sehen.
  • Sicherheit
    Die Aktivitäten-Feeds prüfen den ZieldatensatzGET /api/v1/activities/entity/:entityType/:entityId und /activities/party/:partyId/timeline leiteten die zu prüfende Ressource aus dem ersten Pfadsegment ab und gaben deshalb den Verlauf beliebiger Tickets, Projekte und Parteien per Id heraus.
  • Sicherheit
    GET /api/v1/dms/documents/party-timeline verlangt party_view und Zugriff auf die Parteisonst 404. Vorher genügte dms_document_view, und mit einer beliebigen Partei-Id kamen deren Dokumente plus die aller zugehörigen Tickets, Verträge und Projekte zurück.
  • Sicherheit
    Kundenportal: unversandte Nachrichten sind nicht mehr lesbarEntwürfe, geplante und fehlgeschlagene Sendungen von Mitarbeitenden tragen die Ticket-Id und erschienen über die Nachrichtenliste, den Einzelabruf und den EML-Export beim Kunden.
  • Sicherheit
    GET /api/v1/search begrenzt Portal-Nutzer auf eigene Tickets und Kursedie Suche wendete nur den Datenbereich an und lieferte damit Nachrichten aller Tickets und Lerninhalte aller Kurse des Mandanten.
  • Sicherheit
    POST /api/v1/tasks/:id/schedule-into-event prüft auch den Termindie Route schreibt bei Aufgaben mit Fahrzeugbedarf auf den Termin und prüfte bisher nur die Aufgabe.
  • Sicherheit
    POST /api/v1/list-visits/seen deckelt die gespeicherten Idsdie Obergrenze griff bisher nur beim Besuchswechsel, nie beim Schreiben; ein Präferenzdokument konnte so über das Dokumentlimit wachsen.

v0.4.31

Zeitbudgets zählen nur noch berechenbare Zeit, Fahrzeug-Verfügbarkeit ignoriert stornierte Buchungen

Zwei Korrekturen an Werten, die Integrationen weiterverarbeiten: Das Projekt-Zeitbudget zählt nicht berechenbare Leistungen nicht mehr mit, und die Fahrzeug-Verfügbarkeit wertet abgesagte Buchungen nicht mehr als Konflikt.

  • Geändert
    Das Projekt-Zeitbudget zählt nur noch berechenbare Leistungennicht berechenbare Buchungen zehren das Budget nicht mehr auf und lösen keine Obergrenze mehr aus. Wer den Budgetstand aus der API liest, bekommt damit andere Werte als vorher.
  • Behoben
    GET /api/v1/vehicles/:id/availability zählte abgesagte Buchungen als KonfliktCANCELLED, NO_SHOW und COMPLETED bleiben jetzt aussen vor, wie bei den Poolressourcen seit jeher. Eine stornierte Fahrzeugbuchung blockierte den Wagen sonst weiter.

v0.4.29

Eigene Rechte fürs Drucken, „ausgetreten" ohne volles Bearbeitungsrecht, Leistungen auf gesperrte Kunden werden geparkt

Mehrere Endpunkte hingen an Berechtigungen, die fachlich nicht zu ihnen passten — Drucken verlangte das Recht, Standorte zu bearbeiten, und das Kennzeichen „ausgetreten" das volle Bearbeitungsrecht an der Firmenbeziehung. Dazu ein geänderter Statuscode beim Buchen auf gesperrte Kunden.

  • Neu
    Aktion assignToTeam für Statusübergänge und Checklisten-Schrittesetzt orgUnitId und damit das Team, das der Guard requireOrgUnit prüft. Bisher gab es nur assignToUser und assignToRole; ein Team liess sich nur über „Feldwert setzen" mit einer von Hand eingetragenen Id belegen.
  • Neu
    Eigene Berechtigungen fürs Drucken und für den StandarddruckerPOST /api/v1/print-jobs ist ein einsegmentiger Pfad und wurde deshalb vom generischen Gate auf die Entität print_jobs abgebildet, das Zuweisen eines Standarddruckers hing am Recht, Standorte zu bearbeiten. Beides hat jetzt ein eigenes Recht.
  • Neu
    Ein Ansprechpartner lässt sich mit einem schmalen Recht als ausgetreten markierenparty_relationships.isActive und das Kennzeichen parties.inactive waren nur mit dem vollen Bearbeitungs- bzw. Sperrrecht erreichbar; sichtbar blieb Rollen ohne diese Rechte nur „Löschen", das in 403 endete.
  • Geändert
    Portal-Zugänge hängen an der Firmenbeziehung, nicht am ShopPATCH /api/v1/parties/:id/portal-users/:relationshipId verlangt weder einen aktivierten Shop noch ein gesetztes Kunden-Kennzeichen. Die Kundenrolle liegt wie bisher auf party_relationships.roleSlug.
  • Geändert
    Eine Leistung auf einen gesperrten Kunden wird als Entwurf geparkt statt abgelehntbisher antwortete POST /api/v1/time_records mit 423, sofern der Aufrufer nicht den Bestätigungs-Header mitschickte. Die Sperre lässt sich pro Ticket aufheben.
  • Behoben
    Eine Verbindung zum Ticket-Austausch liess sich mit halb ausgefüllten Zugangsdaten speichernauffällig wurde das erst als 500 beim Verbindungstest. Der Rumpf wird jetzt beim Speichern validiert.
  • Behoben
    GET /api/v1/messages antwortete mit 500, sobald nach Versandstatus gefiltert und withTotal=true gesetzt wardie Abfrage lief an ihrem eigenen Index vorbei und in die Zeitgrenze.
  • Behoben
    Die Ticketliste nach Kundenname sortiert brach mit 500 abdieselbe Ursache: eine Sortierung ohne passenden Index lief in die Zeitgrenze der generischen Liste.

v0.4.28

Fahrzeugbelegung nur noch mit `vehicle_view`, Auto-Beitritt ordnet über die E-Mail-Domain zu

Die Fuhrpark-Lesepfade waren für jeden Nutzer des Mandanten offen und verlangen jetzt eine Berechtigung. Beim Umwandeln eines Tickets gilt wieder die Mandanten-Vorgabe für den Bearbeiter, und der Outbound-Sync legt eine Partei nicht mehr doppelt im führenden System an.

  • Neu
    Ein Termin im Projekt lässt sich mit einer Aufgabe desselben Projekts verknüpfender Termin bleibt dabei am Projekt und an seiner Position.
  • Geändert
    Auto-Beitritt ins Kundenportal ordnet die Firma über die E-Mail-Domain zubisher hing an jeder Konfiguration eine feste Kundenfirma, in die jeder neue Kontakt lief.
  • Geändert
    „In Vertriebschance umwandeln" übernimmt nicht mehr den Bearbeiter des Ticketses gilt dieselbe Mandanten-Vorgabe wie beim direkten Anlegen. Vorher gehörte die Chance danach der Person, die das Ticket bearbeitet hat.
  • Behoben
    Dokumente wanderten beim Umwandeln eines Tickets nicht mitund wurden beim Zusammenführen unter dem aufgelösten Vorgang begraben. Sie hängen jetzt an beiden Vorgängen.
  • Behoben
    Der Outbound-Sync legte dieselbe Partei zweimal im führenden System anzwei erfolgreiche Anlagen 55 ms auseinander, mit zwei fremden Ids. Es läuft jetzt ein Job je Entität, die Operation ergibt sich aus dem Zustand.
  • Behoben
    Ein Projekt-Budget liess sich nicht entfernender geleerte Wert stand nach dem Neuladen wieder da.
  • Behoben
    GET /api/v1/messages antwortete mit 500, sobald nach Betreff gefiltert wurdezwei Sortier-Indizes waren um genau ein Feld zu kurz, die Abfrage lief in die Zeitgrenze der generischen Liste.
  • Sicherheit
    Fahrzeugbelegung verlangt vehicle_viewFuhrpark-Kalender, Fuhrpark-Einsatzplanung und der Fahrzeuganteil der Ressourcenplanung waren für jeden authentifizierten Nutzer des Mandanten lesbar. Der Zuweisungs-Guard des Fuhrparks prüft ausserdem zum ersten Mal tatsächlich.

v0.4.27

Gesperrte Konten verschwinden aus der Nutzersuche, Logo-Platzhalter für den Dark Mode

Die Nutzersuche blendet gesperrte Konten aus, während die Auflösung einer bekannten Id ungefiltert bleibt — wer Namen zu Ids nachschlägt, merkt nichts, wer Vorschläge anzeigt, bekommt keine stillgelegten Konten mehr. Dazu zwei neue Platzhalter im E-Mail-Grundtemplate.

  • Neu
    {{logoLightUrl}} und {{logoDarkUrl}} im E-Mail-Grundtemplatebeide stehen als eigene Platzhalter im Slot-Katalog, damit ein freihändiges Layout das Logo im Dark Mode per CSS tauschen kann.
  • Geändert
    GET /api/v1/users blendet gesperrte Konten im Suchpfad ausdie Auflösung einer konkreten Id bleibt bewusst ungefiltert, damit ein bereits zugewiesener, inzwischen gesperrter Nutzer weiterhin mit Namen angezeigt wird statt als rohe Id.
  • Behoben
    Der Historien-Eintrag zum Zurücknehmen einer Rechnungslöschung trug weder Auslöser noch Feld-Unterschiedebeides steht wieder im Eintrag und damit im Audit-Trail.

v0.4.26

Sortieren nach einer Spalte ohne Index antwortet nicht mehr mit 500

Die generische Liste erkennt jetzt, wenn eine Sortierung keinen Index treffen kann, und weicht aus, statt in die Zeitgrenze zu laufen. Betroffen war jede Liste, nicht nur die Ticketliste.

  • Behoben
    Sortieren nach einer Spalte ohne Index endete in 500die Abfrage lief in die Zeitgrenze und der Aufrufer bekam einen Datenbankfehler statt einer Antwort. Die Liste erkennt den Fall jetzt vorab und wählt einen tragfähigen Plan.

v0.4.25

Alarme lassen sich erneut bewerten, Outlook-Mails serverseitig nachladen

Zwei neue Endpunkte, eine Vorbelegung, die aus dem Personalstammsatz kommt, und mehrere Listen, die ohne passenden Index in die Zeitgrenze liefen. Ausserdem antwortet eine unvollständige Integration wieder mit einem Validierungsfehler statt mit 500.

  • Neu
    POST /api/v1/alarms/:id/reevaluatewendet die Alarmregeln auf einen bereits eingegangenen Alarm erneut an. Bisher war der einzige Weg zu einer Neubewertung ein frisches Ereignis aus dem überwachenden System.
  • Neu
    POST /api/v1/<resource>/:id/emails/import-outlooklädt eine per Drag & Drop übergebene Nachricht serverseitig aus Microsoft 365 nach und hängt sie an den Vorgang. Das neue Outlook gibt beim Ziehen keine Datei mehr heraus, sondern nur noch eine Kennung.
  • Geändert
    Die Abteilung einer Zeitbuchung kommt aus dem Personalstammsatzals zusätzliche Stufe in der Vorbelegungs-Kaskade. Ein mitgesendeter Wert gewinnt weiterhin.
  • Geändert
    Der Austritt eines Teilnehmers ändert den Termin im Postfach des Organisators nicht mehrvorher löste das Aufräumen eines alten Termins Änderungsmails an alle Eingeladenen aus.
  • Behoben
    POST /api/v1/integrations ohne credentials antwortete mit einem blanken 500es kommt jetzt ein Validierungsfehler zurück.
  • Behoben
    PATCH /api/v1/attendance-shifts/:id korrigiert die Startzeit einer laufenden Schichtbisher liess sie sich nur ändern, indem man die Schicht dabei beendete. Wer sich verspätet eingestempelt hat, zieht die Zeit jetzt nach.
  • Behoben
    Die Portal-Ticketliste lief in die 15-Sekunden-Grenze und danach in 500zwei fehlende Indizes auf dem Lesepfad „nur eigene Tickets".

v0.4.24

Zeitpunkt der Asset-Anlage aus Lieferungen wählbar, Basisrechte erreichen auch angepasste Rollen

Ein neuer Schalter entscheidet, ob Assets aus einer Lieferung schon beim Erstellen des Lieferscheins entstehen oder erst beim Versand. Ausserdem tragen angepasste Rollen jetzt dieselben Zusammenarbeits-Basisrechte wie die Systemrollen.

  • Neu
    automationConfig.shipmentToAsset.importTriggerunterscheidet je Mandant DELIVERY_NOTE_PRINTED und SHIPPED. Ohne gesetzten Wert bleibt es beim Versandzeitpunkt, es ändert sich für bestehende Mandanten also nichts.
  • Behoben
    Die Zusammenarbeits-Basisrechte erreichten angepasste Rollen niewer eine eigene Rolle nutzte, bekam zum Beispiel callback_comment_create nicht, obwohl das Recht als Basis für alle internen Rollen gedacht ist. Die Auflösung der Nutzerrechte berücksichtigt die Basis jetzt unabhängig davon, ob die Rolle eine Systemrolle ist.
  • Behoben
    Eine zweite Anmeldung zum selben geteilten Kurs erzeugte eine zweite Einschreibung und eine zweite Belastungbei einer Abrechnung je Platz zahlte der Endkunde denselben Platz doppelt.
  • Behoben
    Nicht deutsche Kundenadressen landeten stillschweigend als „Deutschland"drei unabhängige Ursachen auf dem Anlage-, Bearbeitungs- und Importpfad.

v0.4.23

„Portal-sichtbar" veröffentlicht einen Wissensartikel nicht mehr an alle Kunden

Das Kennzeichen „portal-sichtbar" galt bisher als Freigabe an jeden Portal-Kunden des Mandanten. Sichtbar ist ein Artikel jetzt nur noch dort, wo er ausdrücklich geteilt wurde. Dazu ein neuer Auslieferungsweg für selbst hochgeladene Kursvideos.

  • Neu
    Eigener Auslieferungsweg für selbst hochgeladene Kursvideosein Video des Anbieters „Datei hochladen" war in keinem Mandanten abspielbar und im geteilten Kurs zusätzlich unerreichbar. Der Player holt es jetzt über einen eigenen Endpunkt, der die Einschreibung prüft.
  • Behoben
    Im geteilten Kurs wurde jeder Fortschritts-Heartbeat mit 403 abgelehntder Balken blieb stehen und die Lerneinheit war nicht erfüllbar.
  • Sicherheit
    „Portal-sichtbar" ist keine Freigabe an alle Kunden mehrein so markierter Wissensartikel war für jeden Portal-Nutzer des Mandanten lesbar. Gelesen werden darf er jetzt nur, wo er ausdrücklich geteilt ist.

v0.4.22

KI-Modellwahl je Anwendungsfall, Sperrmeldungen der Zeiterfassung mit Fehlercode

Die Modellwahl für KI-Funktionen ist pro Anwendungsfall und Mandant einstellbar. Die Sperren der Zeiterfassung antworten jetzt mit einem maschinenlesbaren Fehlercode statt mit englischem Rohtext samt Berechtigungs-Slug.

  • Neu
    PUT /api/v1/llm/model-routinglegt je Anwendungsfall und Mandant fest, welches Modell KI-Funktionen benutzen. Ohne Eintrag gilt weiter die Vorgabe.
  • Geändert
    Die Sperren der Zeiterfassung antworten mit einem Fehlercode statt mit Rohtextbisher stand die englische Meldung samt Berechtigungs-Slug im Antwortkörper und landete unverändert beim Nutzer. Der Code ist stabil und lässt sich im Client übersetzen.
  • Behoben
    Die eigene Zeitbuchung war für mehrere Rollen nicht bearbeitbarDisposition, Vertrieb und Einkauf konnten ihre eigenen Leistungen nicht korrigieren. Die eigene Buchung ist jetzt unabhängig von der Rolle korrigierbar.

v0.4.21

Freigabelink erneut senden, Beobachtungen abschalten

Zwei Endpunkte für Dinge, die bisher nur direkt in der Datenbank möglich waren: einen Freigabelink erneut verschicken und die automatische Beobachtung von Vorgängen abstellen.

  • Neu
    POST /api/v1/approvals/:id/resend-emailverschickt den Freigabelink erneut. Ob das möglich ist, sagt das neue Flag canResendEmail am Freigabe-Objekt.
  • Neu
    PUT /api/v1/watchers/preferencesschaltet die automatische Beobachtung ab und beendet auf Wunsch alle bestehenden Beobachtungen. Die Einstellung war vorgesehen, hatte aber weder Oberfläche noch Schreibpfad.
  • Behoben
    DELETE /api/v1/checklists/:id scheiterte ohne jede Rückmeldungder bestätigte Klick auf „Löschen" tat scheinbar nichts, weil die fehlende Berechtigung nirgends ankam.

v0.4.20

Der Buchungspfad kann Assets mitgeben, S/MIME-Container lassen sich überall entpacken

POST /timers/:id/convert nimmt erstmals Assets entgegen — bis dahin war die Zuordnung einer Zeitbuchung zu einem Asset über die API nicht möglich. Der Nutzungs-Reiter am Asset zeigt diese Buchungen jetzt auch an.

  • Neu
    POST /api/v1/timers/:id/convert akzeptiert linkedAssetIds[] und 'ASSET' als referenceTypeder Timer selbst trägt bewusst kein Asset-Feld; die Zuordnung entsteht erst beim Buchen.
  • Neu
    POST /api/v1/files/:id/unwrap-smime an jeder Nachrichten-Anhangsflächedas Entpacken eines S/MIME-Containers war bisher nur an der Vertriebschance erreichbar.
  • Behoben
    Zeitbuchungen, die einem Asset über linkedAssetIds zugewiesen waren, fehlten am Assetder Nutzungs-Reiter kannte nur die Einzelverknüpfung, genau diese Zuweisungsart blieb unsichtbar.

v0.4.19

Zu- und Absagen aus Outlook stehen am Termin, Anfahrt ab wählbarem eigenem Standort

Termine tragen den Antwortstatus jeder teilnehmenden Person. Die Anfahrtsberechnung startet auf Wunsch an einem bestimmten eigenen Standort statt an der Zentrale, und ein Kurs im Entwurf lässt sich nicht mehr an Endkunden teilen.

  • Neu
    participants[].responseStatus am Terminnone, accepted, tentative oder declined. Zu- und Absagen aus dem angebundenen Postfach kamen bisher am Termin nicht an.
  • Neu
    Die Anfahrt lässt sich ab einem wählbaren eigenen Standort rechnenbisher war der Startpunkt immer die Zentrale, was bei mehreren Niederlassungen falsche Fahrzeiten ergab.
  • Neu
    Der Arbeitsort „Büro" im Dienstplan trägt einen konkreten Standort der eigenen Firmavorher war „Büro" ein Wert ohne Ort.
  • Geändert
    Ob eine Leitung die eigenen Überstunden freigeben darf, ist je Mandant, Team und Mitarbeiter einstellbarbisher war die Selbstfreigabe fest ausgeschlossen.
  • Geändert
    Der Organisator einer bestehenden Besprechung lässt sich nicht mehr wechselnüber den Organisator entscheidet, wer absagen darf; ein Wechsel im Nachhinein machte die Absage unmöglich.
  • Behoben
    Die Ticketliste nach Ticketnummer sortiert antwortete erst nach rund zwölf Sekundenzwei fehlende Indizes; auch die Gesamtzahl daneben liest jetzt kein einziges Dokument mehr.
  • Behoben
    Die Freigabe einer Automation verlor beim erneuten Freigeben ihr gesamtes Publikumdanach war die Automation für niemanden mehr sichtbar.
  • Sicherheit
    Ein Kurs im Entwurf liess sich an einen Endkunden teilenund „veröffentlichen" war ein Umschalter ohne jede Prüfung. Beides prüft jetzt, ob der Kurs überhaupt auslieferbar ist.
  • Sicherheit
    Über die Einladung aus dem CRM angelegte Portal-Zugänge landeten in einem leeren Portalder Zugang sah vollständig aus, zeigte aber nirgends Daten, weil die Kundenrolle nicht auf den Firmenbeziehungen ankam.

v0.4.18

Tiefes Blättern in gefilterten Listen holt nicht mehr jedes übersprungene Dokument

Zwei Korrekturen am generischen Lesepfad: Das Blättern weit hinten in einer gefilterten Liste wurde deutlich teurer als nötig, und die Tagesübersicht filterte auf ein Feld, das es nicht gibt.

  • Behoben
    Tiefes Blättern in einer gefilterten Liste las jedes übersprungene Dokument mitab einem hohen offset erzwang die Liste einen reinen Index-Plan, der den Filter nicht mehr abdeckte.
  • Behoben
    Die Tagesübersicht zeigte „heute angefasste Tickets" nicht andie Abfrage filterte auf ein Feld, das an Tickets nicht existiert, und lieferte deshalb immer eine leere Liste.

Suche