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 mitPOST /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ürPOST …/checkinmit Datei. - Breaking Change
GET /api/v1/dms/documents/:id/versionsgibt keine Storage-Keys mehr ausdas Felds3Keyentfällt. Eine Version lädt man überGET …/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" },s3Keyaus dem vorherigenPOST …/versions. Recht:dms_document_edit.422, wenn der Key nicht für dieses Dokument ausgegeben wurde oder die Datei fehlt;409bei gleichzeitiger Änderung. - NeuNeue Versionen sind bei gesperrten Dokumenten mit
409und eigenemerrorCodeabgelehntLegal Hold, laufende Aufbewahrung, GoBD-Sperre, Status gebucht/archiviert, verschlüsselt, an SharePoint gespiegelt, von jemand anderem ausgecheckt oder signiert. Die Codes beginnen mitDMS_VERSION_, das Feldreasonnennt den Grund. - Neu
GET /api/v1/dms/documents/:id/versionsliefert mehr Angaben je Versionneu sinduploadedByName,changeNote,sizeBytes,mimeType,isCurrentsowieuploadBlockedReason(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 ergibt404mitDMS_VERSION_NOT_FOUND. - Neu
GET /api/v1/notificationsfiltert nachgroup,qundunreadgroupist eines der Thementickets,work,customers,compliance,systemoderother;qsucht jedes Wort ohne Groß-/Kleinschreibung in Titel oder Text der letzten 90 Tage (höchstens 100 Zeichen);unread=trueliefert nur Ungelesenes. Ungültige Werte ergeben400. - Neu
POST /api/v1/notifications/mark-all-readundDELETE /api/v1/notificationsnehmen 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ächeticket_close). Rechte:ticket_editund Zugriff auf das Ticket. Ohne verwertbare Buchung:422. - Neu
PATCH /api/v1/tenantnimmtsettings.watchers.keepPreviousAssigneeOnHandoveranBoolean, Vorgabetrue(bisheriges Verhalten). Beifalsebeendet ein Bearbeiterwechsel am Ticket die automatischen Beobachtungen des bisherigen Bearbeiters an diesem Ticket; von Hand gesetzte Beobachtungen bleiben. Unbekannte Schlüssel untersettings.watchersund Werte, die kein Boolean sind, ergeben400.
- GeändertDer
cursorvonGET /api/v1/notificationsist ein undurchsichtiger Werter wird unverändert auspagination.cursorder vorherigen Seite übernommen. Ein Wert, den der Endpunkt nicht ausgegeben hat, ergibt400.
- BehobenDie 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 ChangeEine 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-timemitparty_edit, atomar und mit Verlaufseintrag. Der Endpunkt beachtet zusätzlich die Feldsperren der Rolle. - Breaking Change
GETauf 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-distanceverlangt eine Berechtigung und ist begrenztder Endpunkt war offen und rechnete bei jedem Aufruf. - Breaking ChangeDie 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 ChangeDer Verlaufsexport wendet den Datenbereich des Betrachters auf Zeitbuchungen anund der Ticket- beziehungsweise Projektbezug einer Buchung folgt den Feldsperren von Ticket und Projekt.
- Breaking ChangeEin Pool-Gerät abzumelden prüft den Datenbereich der Ressourcebisher nicht.
- Breaking ChangeDoppelte
userIdsin einer Anfrage an die Einsatzplanung vervielfachen die Antwort nicht mehr.
- NeuOffene Aufgaben werden erledigt, wenn ihr Vorgang schliesstbeim Schliessen eines Tickets und beim Gewinnen oder Verlieren einer Vertriebschance.
- NeuEin Ticket lässt sich mit einer bestehenden Vertriebschance verknüpfenund umgekehrt sind von der Chance aus verknüpfte Tickets sichtbar.
- NeuEin Statuswechsel eines Projekts nimmt einen Grund auf, der in der Historie steht.
- NeuNeue, verschobene und abgesagte Termine werden den Teilnehmern gemeldetVerschiebungen mit Angabe des alten und des neuen Zeitraums.
- NeuZeitbuchungen im Verlaufsexport verlinken ihr Ticket.
- NeuDer Kundenfilter steht in der Aufgabenliste und am Aufgaben-Boardder Kunde ist dort eine eigene Zeile auf der Karte.
- GeändertDie bekannte Signaturlücke in
node-forgeist 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ändertBenachrichtigungs-Mails gehen nicht mehr an gesperrte Kontenund die Überschrift generischer Benachrichtigungen wird maskiert.
- BehobenDas 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 ChangeEin auf
nullgesetztes 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 ChangePortalnutzer erreichen keine internen Verwaltungsseiten mehrdas Gate prüfte die Berechtigung, aber nicht, ob der Aufrufer intern ist.
- Breaking ChangeDer 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 ChangeDie 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 ChangeDer Sammel-
PATCHläuft nicht mehr an der Transaktionsprüfung der Entity-Hooks vorbei. - Breaking ChangeAufgabenlisten haben einen Eigentümer, und Massenpfad,
PUTund Assistent halten ihn einalle drei umgingen das Gate bisher. - Breaking ChangeDie GoBD-Festschreibung eines Dokuments lässt sich nicht mehr per
PATCHaufheben. - Breaking ChangeDer 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 ChangeDer Aufgabentyp einer Aufgabenvorlage wird geprüfter lief ungeprüft durch den Änderungs-Override bis in die erzeugte Aufgabe.
- Breaking ChangeDie volle Tabelle der Beziehungsqualität verlangt
party_viewund wendet den Datenbereich ander Hinweis am Vorgang kommt aus einer eigenen, schlanken Route. Den Sperrvermerk setzt nur noch, werparty_edithat. - Breaking Change
PATCH /api/v1/tenantnimmt 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_RUNundEMAIL_REDIRECT_TOgreifen jetzt auch für die Workflow-Aktion zum Mailversandbisher ging dieser eine Pfad an beiden Schaltern vorbei und versandte echt.
- NeuDer 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. - NeuAbfrage-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. - NeuEigene Aufgabenlisten je Person, privat oder für das Teammit einem Schalter, ob Zugewiesene Fälligkeit und Priorität ändern dürfen.
- NeuVersionierung im Dokumentenmanagementneue Version hochladen, Versionsliste lesen, jede alte Fassung herunterladen.
- Neu
GET /api/v1/company-sitesliefert auch Räume ohne eigene Partyund je Eintrag die Adress-Id. - NeuDer 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.
- NeuAbschluss-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.
- NeuBenachrichtigungen lassen sich nach Thema filtern, durchsuchen und auf „ungelesen" einschränken.
- NeuErwähnungen mit
@im Mail-Composer, und ein Hinweis, wenn eine Nachricht einen Einmal-Link enthält.
- GeändertEine Vertriebschance wird erst „Gewonnen", wenn kein verknüpftes Angebot mehr beim Kunden offen ist.
- GeändertDer 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ändertDie Kampagnenliste blendet abgeschlossene und archivierte Kampagnen standardmässig aus.
- GeändertDas 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.
- BehobenEin 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.
- BehobenBei mehr als 500 Nachrichten fielen im Verlaufsexport die neuesten wegund das PDF sah trotzdem vollständig aus.
- BehobenEine weitergeleitete Kundennachricht kam mit dem Absender der weitergeleiteten Nachricht andie Antwort ging damit an die falsche Adresse.
- BehobenDer interne Kontextblock konnte bei einem Präsenztermin mit Kalendereinladung an Externe gehen.
- BehobenEin 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.
- BehobenDie Raumvorprüfung meldete nach einem Abruffehler „Raum frei"ein Fehlschlag sah aus wie ein freies Ergebnis.
- BehobenEine Raumbelegung verschob den Raumtermin einer anderen Person ohne Zeilenprüfung.
- BehobenDie 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.
- BehobenEingefügter Text kann in einer Abschluss-Mail keine Pflicht-Lücke mehr öffnenweder aus einem übernommenen Buchungstext noch über eine geschweifte Klammer im Hinweistext.
- BehobenDer MIME-Typ beim Hochladen einer Dokumentversion wird geklemmtund der Download des aktuellen Inhalts folgt derselben Klemme wie die übrigen Downloadpfade.
- BehobenDie Historie eines aktiven Vorgangs verlor beim Weiterscrollen ältere Zeitbuchungen, Aufgaben und Termine.
- BehobenDas Budget eines Vorgangs liess sich nach einer Kanal-Freigabe nicht mehr speichernObergrenze, Abrechnungsart und Pauschalbetrag blieben gesperrt.
- BehobenEin Personalprofil heisst in der Suche nicht mehr „Unknown", und die Befehlspalette ist vollständig übersetzt.
- BehobenBilder 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.emailist 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/:idnimmt 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". - NeuEinladungen erinnern automatisch nach drei und sechs Tagendazu eine Übersicht der nicht angenommenen Einladungen und ein Endpunkt zum manuellen Erinnern.
- Geändert
hireDateist kein Pflichtfeld des Personalprofils mehres steht nicht länger imrequireddes 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 ChangeMitglieder 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 ChangeEreignisgesteuerte 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 ChangeDie Workflow-Aktionen setzen die Rechte der Zielentität durch
lookup_entityundreconcile_deletionsverlangen sie jetzt,lookup_entitylässt seine Pflichtklauseln nicht mehr überschreiben,create_entitynicht mehr den Mandanten des neuen Datensatzes aus der Nutzlast bestimmen, undreconcile_deletionslöscht nie in einer reservierten Collection. - Breaking ChangeEin 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 ChangeAnrufliste 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=-1hebt die Seitenbegrenzung der Support-Anfragelisten nicht mehr auf. - Breaking ChangeDie 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 ChangeEin Kunde kann über die Nachrichten-Route keine „gesendete ausgehende E-Mail" mehr an sein Ticket hängen.
- Breaking ChangeEskalationsregeln nehmen nur noch Feldpfade und einfache Werte anOperatoren und
$wheregingen 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 ChangeMail- und Kalender-Push akzeptieren nur echte Ids des Kopplungsdienstes im Abrufpfad.
- NeuPflichtschulungen nach EU-KI-Verordnung Artikel 4Schulungspflichten für geteilte Kurse, Fristen und Erinnerungen, nachvollziehbar je Person.
- NeuTeilnehmer und Fortschritt im Schulungskatalogfür die schulungsverantwortliche Person eines Kundenmandanten.
- NeuEigene Asset-Typen für TK-Endgeräte
asset.telephonyzerfä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. - NeuGelöschte Mandanten sind in der Verwaltung filterbar.
- GeändertDreizehn 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ändertSpanisch 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.
- BehobenDer Lernfortschritt wird aus einer Quelle gerechnetzwei Pfade kamen auf unterschiedliche Werte für dieselbe Person.
- BehobenDie Vorschau von Mailtexten läuft nicht mehr in quadratische Ausdrückelange Nachrichten konnten die Darstellung ausbremsen.
- BehobenDer Unterhaltungsimport lädt interne und Lieferanten-Nachrichten nicht mehr mitsie wären im Kundenportal sichtbar geworden. Mitgeladene Nachrichten haben zusätzlich eine Größengrenze.
- BehobenDie 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.
- BehobenAktivitä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 ChangeKrankmeldungen und Dokumente der Personalakte sind nicht mehr mandantenweit lesbarBeide Datentöpfe standen bisher für praktisch jede interne Rolle im ganzen Mandanten auf
readmit Datenbereichall. 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 ChangeAnmelden 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
429mitretry-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 ChangeDie 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
429sehen. - Breaking ChangeDie 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 ChangeAlle 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 ChangeEinen Mandanten anzulegen setzt eine dokumentierte AVV-Zustimmung voraus
avvAcceptedAtist 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 ChangeDie 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 ChangeDie 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
GETundPOST /api/v1/searchentfernen 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/searchprü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/:providernimmt 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/applyprü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 ChangeSelbst 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.dispatcherIdist 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). DazuPOST /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. - NeuBelegnummern 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
qin der Chancen-Liste die Verkaufschance ueber die Angebotsnummer des an ihr haengenden Angebots. - NeuEine Firma laesst sich auf einen STANDORT einer anderen zusammenfuehren
GET /api/v1/parties/:id/merge-planundPOST /api/v1/parties/:id/merge-intonehmen zusaetzlichtargetAddressId(ein bestehender Standort des Ziels) odertargetAddressMode: "new-from-source"(Standort aus der Quelle anlegen) entgegen. Ohne beides bleibt es die bisherige Zusammenfuehrung auf die Firma als Ganzes. - NeuTicket-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.
- NeuAbschluss-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ätzlichtranslations.<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. - NeuAufgabenvorlagen haben einen Einsatzbereich
usableInbegrenzt, wo eine Vorlage zur Auswahl angeboten wird — eine Liste austicket,project,contractundtask. Leer oder fehlend heißt „überall", bestehende Vorlagen verhalten sich also unverändert und ohne Datenumstellung.componentOnlymarkiert 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. - NeuTermine haben eine Terminnummer
appointmentNumberin der FormTRM-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. - NeuVersionierte Konfiguration für On- und Offboarding
GET /api/v1/onboarding/config/versionsund…/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. - NeuAufgaben im On- und Offboarding lassen sich mehreren Personen zuweisen.
- NeuDie Vertragsliste filtert nach enthaltenen PositionenDamit lässt sich beantworten, welche Verträge ein bestimmtes Produkt enthalten.
- NeuEine Alarmregel für hängende Kalender-PostfächerSie schlägt an, wenn ein Postfach innerhalb eines Zwei-Stunden-Fensters keinen einzigen erfolgreichen Abgleich hatte.
- NeuLeistungsnummern 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 mit400abgewiesen statt die Liste ungefiltert zu liefern. - NeuModul 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.
- NeuAbschluss-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.
- NeuDie Skill-Matrix hat ein eigenes BearbeitungsrechtLesen und Bearbeiten sind damit getrennt vergebbar.
- NeuFragebogen-Fragen haben Standardwert und Hinweistext.
- GeändertErgebnisse 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ändertDie 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ändertEin 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ändertDer 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ändertDer 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.
- BehobenDer Zeitstrahl nennt Verschiebungen verknuepfter Termine
includeLinkedEventChanges=truean 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. - BehobenDie 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.
- BehobenDie 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/skillsschrieb den ändernden Nutzer mit der falschen Idstatt der mandantenbezogenen Nutzer-Id stand die Anmelde-Id im Datensatz. Auswertungen überupdatedByfanden die Person dadurch nicht. - BehobenEin in dieser Plattform gelöschter Termin kam über die Kalender-Kopplung zurückder Abgleich legte ihn wenige Minuten später neu an.
- BehobenGescheiterte Kalender-Abgleiche sind sichtbar45 Postfächer hatten acht Tage lang keinen erfolgreichen Abgleich, ohne dass es irgendwo gemeldet wurde.
- BehobenBeim 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.
- BehobenDie Suche findet Vorgänge über die Vorgangsnummer des gekoppelten Zielsystems.
- BehobenAnhänge aus importierten Nachrichten liegen im Objektspeicherbisher landeten sie auf der lokalen Platte und waren nach einem Neustart nicht mehr abrufbar.
- BehobenKundengebundene Geheimnisse lassen sich wieder mit dem Unternehmen oder einer Person teilen.
- BehobenDie 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.
- BehobenEine Zeitbuchung über die Schnellerfassung nahm die Eingabe
.als Dauer anund speicherte einen ungültigen Wert. - BehobenDer 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.
- SicherheitUrlaubsü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.
- SicherheitEin 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.
- SicherheitDer Belegungsplan gab die Titel privater Fremdtermine herauser zeigt jetzt nur noch, dass der Zeitraum belegt ist.
- SicherheitDer 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.
- SicherheitBetreff 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.
- SicherheitDie 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 ChangeEine 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.
coveredMinutesist damit entweder die volle abrechenbare Dauer oder null;coveragePartialwird nicht mehr gesetzt. Wer auf Teilwerte ausgewertet hat, bekommt andere Summen. - Breaking ChangeProjekt-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_recordsnimmt keinen beliebigenstatusmehr 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-recordsverlangt 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 jetzt403, eingeschränkte Rollen eine kleinere Menge. - Breaking ChangeDie 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 ChangePlattform-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 ChangeEinsatzplanungs-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
GETundPOST /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 generischesPATCH. Eigene422-Fälle für eingefrorene Datensätze und für Kontingente, deren Überschreitungsregel die Umstellung verbietet. - Neu
GET /api/v1/parties/:id/merge-planundPOST /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. - NeuPflichtfeld-Ablehnungen nennen alle fehlenden Felder auf einmaljede Ablehnung trägt die Erweiterungen
missingFields(Liste) undresourceim 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. - NeuKommunikationssprache je VorgangVorlagen und Textbausteine lassen sich je Sprache pflegen, ausgehende Nachrichten folgen der am Vorgang gesetzten Sprache.
- NeuLive-Support als eigene Entität
support_live_sessionsmit Lebenszyklus, Warteschlange und eingefrorener Zustimmung, dazuGET /api/v1/support-live-quotefür den gültigen Satz undGET /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. - NeuAuth-Typ
custom_headerfür generische IntegrationenAPI-Key-Header und Cookie-Token werden darüber einheitlich konfiguriert. - NeuTeam-Filter kennen „kein Team zugewiesen"der generische Parameter
teamIdnimmt dafür einen eigenen Wert entgegen; er wirkt auf Vorgänge, Aufgaben, Rückrufe, Projekte, Verträge, Firmen und die Zeiterfassung. - NeuAnsprechpartner 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
coverageAmbiguouswird erstmals tatsächlich gesetztdas Feld existierte, blieb aber immerfalse. Wer darauf verzweigt hat, bekommt jetzt echte Treffer. - GeändertKontingent-Perioden setzt ausschliesslich der nächtliche Lauf umbisher konnte auch ein Lesezugriff eine Periode weiterschalten, was Auswertungen je nach Aufrufzeitpunkt unterschiedlich ausfallen liess.
- GeändertBuchungen vor der ersten Aufladung eines Kontingents zählen nicht mehr dagegenbei automatisch aufladenden Kontingenten wurden sie bisher rückwirkend verrechnet.
- GeändertNeue Kontingente starten mit der Überschreitungsregel „Erlauben"die Regel samt Zuschlag ist am Kontingent einstellbar; bestehende behalten ihre Einstellung.
- SicherheitZeitbuchungen 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.
- SicherheitDie 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.
- SicherheitDie 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.
- SicherheitZeilen 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.
- SicherheitDie Referenzliste einer Firmenadresse gab interne Felder an Portal-Nutzer heraus
GET /api/v1/parties/:partyId/addresses/:addressId/references?include=itemslieferte 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. - SicherheitDie 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.
- SicherheitEin 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
emergencyServiceBillingin den AbrechnungseinstellungenSteuert, ob Notfalldienst-Buchungen in den normalen Leistungsnachweis wandern (COMBINED) oder einen eigenen bekommen (SEPARATE). Am Mandanten als Voreinstellung, je Kunde überperformanceRecordSettings.emergencyServiceBillingübersteuerbar;nulloder 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. - NeuPositionen eines Leistungsnachweises lassen sich nach Vorgang gruppierendie Gruppierung wirkt auf die Darstellung und auf das erzeugte PDF, nicht auf die zugrunde liegenden Buchungen.
- GeändertDer 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ändertDas 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ändertDer 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ändertLeistungsnachweis- und Rechnungs-PDF drucken lange Positionstexte mehrzeiligsie wurden vorher abgeschnitten.
- BehobenKI-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. - BehobenEin 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. - BehobenEin 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.
- BehobenDer Abrechnungsgrund einer Zeitbuchung wird gegen den eigenen Mandanten geprüfteine fremde Id wird abgewiesen, statt ungeprüft übernommen zu werden.
- BehobenEine aus einem Leistungsnachweis erzeugte ERP-Rechnung druckte den Leistungszeitraum an jeder Position statt einmal.
- BehobenDas 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. - BehobenDas 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 mit422 invalid-transition; ein bereits gekündigter Vertrag wird stattdessen überrenewreaktiviert. - NeuKündigungsmarker am Vertrag sind lesbar
cancellation.cancellationEffectiveDate(letzter gültiger Tag, gleiche Semantik wieendDate),cancellation.cancellationReasonundcancellation.cancellationRequestedAtstehen in jeder Vertragsantwort und erlauben, eine angeforderte von einer bereits wirksamen Kündigung zu unterscheiden. - NeuMandanten haben einen Lösch-Lebenszyklus
lifecycleStatemit den Zuständenactive,deletion_requested,pending_deletion,awaiting_purge_approval,purgingunddeleted. Ein fehlendes Feld bedeutetactive. 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. Defaultfalse, bestehende Typen verhalten sich unverändert. - NeuEine 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. - NeuDie 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 StichtagMiteffectiveDatein der Zukunft bleibt der VertragACTIVEbzw.EXPIRINGund wird erst am Tag nach dem Stichtag aufCANCELLEDgeschaltet; ohne Datum oder mit einem Datum bis heute wird sofort gekündigt. Wer aus der Antwort bisher aufCANCELLEDgeschlossen hat, muss stattdessen die Kündigungsmarker lesen. - Geändert
POST /api/v1/contracts/:id/cancelvalidiert den BodyeffectiveDatemuss ein Datum sein,reasonhö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-draftund422 cancellation-pendingbei einer zweiten Kündigung. Bisher wanderte jeder String ungeprüft in das Kündigungsobjekt. - Geändert
POST /api/v1/contracts/:id/renewverweigert bei anstehender KündigungAntwort422 cancellation-pending. Eine dokumentierte Kündigung soll nicht als Nebeneffekt einer Verlängerung verschwinden; erst zurücknehmen, dann verlängern. - GeändertAbrechnung 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ändertSchreibende Anfragen eines Mandanten in der Löschfrist werden mit
423 TENANT_PENDING_DELETIONabgewiesenGETbleibt offen, damit ein Datenexport während der Frist möglich ist. Der Widerruf bleibt ebenfalls erreichbar.
- Behoben
GETundPUT /api/v1/tickets/close-email-configantworten ohne Mandantenkontext mit400bisher lasen oder erzeugten sie ein Dokument ohne Mandantenbezug. - BehobenDer
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. - BehobenEin 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.
- BehobenDie Team-Route am Kunden war an das Personalmodul gekoppeltohne dieses Modul lieferte sie nichts, obwohl das Team keine Personaldaten sind.
- BehobenDer 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.
- BehobenTermine, die ein Jahr oder weiter in der Zukunft angelegt wurden, kamen nicht andas Abholfenster des Kalenderabgleichs reichte nicht so weit.
- BehobenEin 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.
- NeuEntitä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 innonBillableReasonstehen: Sechs Lesepfade bis hin zur Rechnungsvorlage rendern ihn direkt, und Altdatensätze tragen dort weiterhin Freitext ohne Id. - NeuEin 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 unteralarms.manualTicketund ist bewusst keine Regel: Sie wird nie ausgewertet und ändert die Reihenfolge des Regel-Stacks nicht. - NeuOb die Fahrt einer nicht berechenbaren Leistung ebenfalls mit 0,00 € erscheint, ist eine Mandanteneinstellungohne gesetzten Wert bleibt das bisherige Verhalten.
- NeuDas Sprungziel nach „Als Ticket übernehmen" ist je E-Mail-Konto einstellbarentweder in den neuen Vorgang wechseln oder in der Mailliste bleiben.
- NeuTeams-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
assignedToUserIdundteamIdam 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
autoCloseOnClearundaddRecoveryCommentsind an der manuellen Ticket-Vorlage nicht mehr speicherbarbeide wirken ausschliesslich im Regelpfad. Bisher nahm die API sie entgegen und sie blieben wirkungslos.
- BehobenDoppelklick auf „Direkt Ticket erstellen" antwortet mit
409statt500zwei Anfragen innerhalb derselben Sekunde passieren beide die Vorprüfung; die zweite läuft jetzt in einen sauberen Konflikt. - BehobenDie genullte Fahrt einer nicht berechenbaren Buchung fehlte auf dem Leistungsnachweisim Fahrtmodus
COMBINEDverschwand sie ganz, sobald sie eine Zonenpauschale oder reine Reisezeit war, und fiel auf beiden weclapp-Auftragspfaden aus dem Auftrag. - BehobenOhne 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.
- SicherheitDer 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/updateundPOST /:resource/bulk/deletenehmen höchstens 100 Zeilendarüber400 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-EndpunktPOST /:resource/bulk, der seit jeher bei 100 deckelt. - Breaking Change
POST /:resource/:id/transitions/:keywertet das Statusfeld infieldsnicht mehr ausder Status kommt ausschliesslich aus dem Übergang im Pfad. Bisher liess sich mit{"fields":{"status":"CLOSED"}}die Prüfung der Kante nachIN_PROGRESSbestehen und trotzdemCLOSEDschreiben. - Breaking ChangeTop-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/bulkschreibt 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/visitundPOST /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-overviewlieferttimeRecordsdie Buchungen des Tages mit aufgelöstem Kundennamen und Ticketnummer. Das Feld ist optional; ein älterer Server liefert es nicht, statt zu brechen. - NeuTicket-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 dazuGET /api/v1/ticket-exchange/connections/:id/external-organizations(ticket_exchange_connection_manage).
- Geändert
PUT /:resource/:idund beide Massenbearbeitungs-Pfade prüfen dieselben Guards wiePATCHEditiersperre 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ändertBudget-Obergrenzen sind nicht mehr für jeden Bearbeiter schreibbar
maxMinutes,maxAmount,limitModeundhardBlockOnExceedan Aufgaben verlangentask_override_budget;budgetCapPercent,hoursCapPercentundlimits.hardBlockOnExceedan Projekten verlangenproject_edit. Sonst403. - Geändert
task.loggedMinutesist ein geschütztes Feldes speist Fortschrittsanzeigen und den Projekt-Lock und wird nur noch serverseitig fortgeschrieben. - Geändert
activity.performedById,performedByNameundperformedByImagewerden 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-ordernimmtbillingModelund Budget-Obergrenzen nicht mehr ungeprüft aus dem Rumpfbeide liefen an der Akteursprüfung vorbei.
- SicherheitFuhrpark-Lesepfade wenden den Datenbereich auf Terminen an
GET /api/v1/fleet/calendar,/fleet/resource-planning/timelineund/fleet/resource-planning/vehicle-demandswaren nur mitvehicle_viewgegated und lieferten Titel, Ort, Kunde und Organisator aller Fahrzeugtermine, auch an Rollen, die Termine sonst nur im eigenen Zuständigkeitsbereich sehen. - SicherheitDie Aktivitäten-Feeds prüfen den Zieldatensatz
GET /api/v1/activities/entity/:entityType/:entityIdund/activities/party/:partyId/timelineleiteten 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-timelineverlangtparty_viewund Zugriff auf die Parteisonst404. Vorher genügtedms_document_view, und mit einer beliebigen Partei-Id kamen deren Dokumente plus die aller zugehörigen Tickets, Verträge und Projekte zurück. - SicherheitKundenportal: 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/searchbegrenzt 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-eventprü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/seendeckelt 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ändertDas 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/availabilityzählte abgesagte Buchungen als KonfliktCANCELLED,NO_SHOWundCOMPLETEDbleiben 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.
- NeuAktion
assignToTeamfür Statusübergänge und Checklisten-SchrittesetztorgUnitIdund damit das Team, das der GuardrequireOrgUnitprüft. Bisher gab es nurassignToUserundassignToRole; ein Team liess sich nur über „Feldwert setzen" mit einer von Hand eingetragenen Id belegen. - NeuEigene Berechtigungen fürs Drucken und für den Standarddrucker
POST /api/v1/print-jobsist ein einsegmentiger Pfad und wurde deshalb vom generischen Gate auf die Entitätprint_jobsabgebildet, das Zuweisen eines Standarddruckers hing am Recht, Standorte zu bearbeiten. Beides hat jetzt ein eigenes Recht. - NeuEin Ansprechpartner lässt sich mit einem schmalen Recht als ausgetreten markieren
party_relationships.isActiveund das Kennzeichenparties.inactivewaren nur mit dem vollen Bearbeitungs- bzw. Sperrrecht erreichbar; sichtbar blieb Rollen ohne diese Rechte nur „Löschen", das in403endete.
- GeändertPortal-Zugänge hängen an der Firmenbeziehung, nicht am Shop
PATCH /api/v1/parties/:id/portal-users/:relationshipIdverlangt weder einen aktivierten Shop noch ein gesetztes Kunden-Kennzeichen. Die Kundenrolle liegt wie bisher aufparty_relationships.roleSlug. - GeändertEine Leistung auf einen gesperrten Kunden wird als Entwurf geparkt statt abgelehntbisher antwortete
POST /api/v1/time_recordsmit423, sofern der Aufrufer nicht den Bestätigungs-Header mitschickte. Die Sperre lässt sich pro Ticket aufheben.
- BehobenEine Verbindung zum Ticket-Austausch liess sich mit halb ausgefüllten Zugangsdaten speichernauffällig wurde das erst als
500beim Verbindungstest. Der Rumpf wird jetzt beim Speichern validiert. - Behoben
GET /api/v1/messagesantwortete mit500, sobald nach Versandstatus gefiltert undwithTotal=truegesetzt wardie Abfrage lief an ihrem eigenen Index vorbei und in die Zeitgrenze. - BehobenDie Ticketliste nach Kundenname sortiert brach mit
500abdieselbe 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.
- NeuEin Termin im Projekt lässt sich mit einer Aufgabe desselben Projekts verknüpfender Termin bleibt dabei am Projekt und an seiner Position.
- GeändertAuto-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.
- BehobenDokumente 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.
- BehobenDer 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.
- BehobenEin Projekt-Budget liess sich nicht entfernender geleerte Wert stand nach dem Neuladen wieder da.
- Behoben
GET /api/v1/messagesantwortete mit500, sobald nach Betreff gefiltert wurdezwei Sortier-Indizes waren um genau ein Feld zu kurz, die Abfrage lief in die Zeitgrenze der generischen Liste.
- SicherheitFahrzeugbelegung 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/usersblendet 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.
- BehobenDer 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.
- BehobenSortieren 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ändertDie Abteilung einer Zeitbuchung kommt aus dem Personalstammsatzals zusätzliche Stufe in der Vorbelegungs-Kaskade. Ein mitgesendeter Wert gewinnt weiterhin.
- GeändertDer 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/integrationsohnecredentialsantwortete mit einem blanken500es kommt jetzt ein Validierungsfehler zurück. - Behoben
PATCH /api/v1/attendance-shifts/:idkorrigiert 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. - BehobenDie 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 MandantDELIVERY_NOTE_PRINTEDundSHIPPED. Ohne gesetzten Wert bleibt es beim Versandzeitpunkt, es ändert sich für bestehende Mandanten also nichts.
- BehobenDie Zusammenarbeits-Basisrechte erreichten angepasste Rollen niewer eine eigene Rolle nutzte, bekam zum Beispiel
callback_comment_createnicht, 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. - BehobenEine zweite Anmeldung zum selben geteilten Kurs erzeugte eine zweite Einschreibung und eine zweite Belastungbei einer Abrechnung je Platz zahlte der Endkunde denselben Platz doppelt.
- BehobenNicht 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.
- NeuEigener 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.
- BehobenIm geteilten Kurs wurde jeder Fortschritts-Heartbeat mit
403abgelehntder 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ändertDie 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.
- BehobenDie 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 FlagcanResendEmailam 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/:idscheiterte 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/convertakzeptiertlinkedAssetIds[]und'ASSET'alsreferenceTypeder Timer selbst trägt bewusst kein Asset-Feld; die Zuordnung entsteht erst beim Buchen. - Neu
POST /api/v1/files/:id/unwrap-smimean jeder Nachrichten-Anhangsflächedas Entpacken eines S/MIME-Containers war bisher nur an der Vertriebschance erreichbar.
- BehobenZeitbuchungen, die einem Asset über
linkedAssetIdszugewiesen 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[].responseStatusam Terminnone,accepted,tentativeoderdeclined. Zu- und Absagen aus dem angebundenen Postfach kamen bisher am Termin nicht an. - NeuDie Anfahrt lässt sich ab einem wählbaren eigenen Standort rechnenbisher war der Startpunkt immer die Zentrale, was bei mehreren Niederlassungen falsche Fahrzeiten ergab.
- NeuDer Arbeitsort „Büro" im Dienstplan trägt einen konkreten Standort der eigenen Firmavorher war „Büro" ein Wert ohne Ort.
- GeändertOb eine Leitung die eigenen Überstunden freigeben darf, ist je Mandant, Team und Mitarbeiter einstellbarbisher war die Selbstfreigabe fest ausgeschlossen.
- GeändertDer 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.
- BehobenDie Ticketliste nach Ticketnummer sortiert antwortete erst nach rund zwölf Sekundenzwei fehlende Indizes; auch die Gesamtzahl daneben liest jetzt kein einziges Dokument mehr.
- BehobenDie Freigabe einer Automation verlor beim erneuten Freigeben ihr gesamtes Publikumdanach war die Automation für niemanden mehr sichtbar.
- SicherheitEin 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.
- BehobenTiefes Blättern in einer gefilterten Liste las jedes übersprungene Dokument mitab einem hohen
offseterzwang die Liste einen reinen Index-Plan, der den Filter nicht mehr abdeckte. - BehobenDie 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.