Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· VOIPService
Multi-Instance Provider Refaktor + full FreePBX + Flowroute SMS
Kernmodellwechsel: eine oder eine oder andere VoipProvidInstances (war: eins pro Org). Jeder Provider-API-Aufruf ist jetzt instanziell. PhoneProvider-Schnittstelle: - Neue Methoden für Erweiterung/Benutzer/Gerät CRUD + Voicemail Audio/Transkription. - Neue Fähigkeitsflaggen (ExtensionManagement, userManagement, device Management, VoicemailTranscription). Standard werfen **************** (HTTP 501) so stub Anbieter nicht brechen. Frontend Checks getCapabilities() um Aktionen pro Provider zu verstecken/deaktivieren. - ProviderException (HTTP 502) für externe Abhängigkeiten Ausfälle. PhoneProviderFactory: - getInstance(UUID) / ************ ersetzen getProvider(Long orgId); getPrimaryForOrg(Long) für Legacy Call Sites gehalten (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth Tokens jetzt von (orgId, Anbieter, InstanzId) so eins org kann mehrere unabhängige RingCentral-Einsätze authentifizieren. - FreePBX Konstruktion liest config_json . {baseUrl, clientId, clientSecret, ignorierenSslErrors" und instantiates einen dedizierten FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor nimmt InstanzId für Logkontext. - Neue Methoden: listExtensions / createExtension / updateExtension / updateExtension / deleteExtension; listUser / erstellen Benutzer / updateUser / deleteUser (RC-Modelle beide als type=User-Erweiterungen); listDevices / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (Streams Anhang Inhalt) und fetchVoicemailTranscription. FreePBX (FreePBXProvider) - Die vollständige Implementierung ersetzt Platzhalter: - Client-credentials OAuth2 Token Caching via FreePBXTokenCache (ca. 1h TTL, auto-refresh on 401, pro Instanz). - FreePBXGraphQLClient: GraphQL + REST Transporte mit optional überspringen-SSL-Verifikation für selbstsignierte on-prem PBXes. - Erweiterungen, User Manager Benutzer, Endpoint Manager Geräte, Voicemail list/mark-read/dete + audio stream, CDR Call History, SIP Anmeldeinformationen abgeleitet aus der Erweiterung pjsip Geheimnis, Gesundheit über fetchAsteriskInfo. - SMS explizit nicht unterstützt (Fähigkeit sms=false) - FreePBX nicht handhaben Träger SMS. Flowroute SMS (FlowrouteTextProvider): - Nachrichten v2.1 API mit HTTP Basic (accessKey, secretKey). - Gesundheitssonde trifft GET /numbers?limit=1. - Registriert mit BulkTextProviderFactory über neue FLOWROUTE enum value. Controller: - VoipInstanceController (umbenannt von ProviderConfigController) - voll CRUD bei /api/voip/instanzen mit pro-instanz Test/Sync. Geheimnisse in GET redigiert Antworten ('***'); merge-update lässt UI Round-Trip redacted Felder ohne Clobbering gespeicherte Anmeldeinformationen. - BulkTextInstanceController (umbenannt von BulkTextConfigController) - Spiegel CRUD bei /api/bulktext/instanzen mit Test-Send / senden. - OAuthController umgeschrieben für z.B. OAuth: Start, Rückruf, Status, trennen alle InstanzId. - SmsController löst Instanz von member.instanceId - org primär, beitiert zu upserted Gespräche. - CallController / CapabilitiesController / SipController greifen auf die org's zurück primäre aktive Instanz für Legacy-Endpunkte. Dienstleistungen: - InstanceSyncService: Pull-Through-Cache-Sync . Erweiterungen/Benutzer/Geräte/ Voicemails von Anbieter zu lokalen Tabellen kopiert, fehlende Zeilen weich markiert UNKNOWN. Jeder Unterschritt verpackt, so dass eine nicht unterstützte Fähigkeit nicht verfehlt die gesamte Synchronisation (z. FreePBX no-SMS + hat-Erweiterungen). - VoipMessageService: Alle Konversations-/Nachrichtpfade propagieren InstanzId. Tests: Vorhandene VoipProviderConfig-spezifische Tests entfernt (bedeckt die Umbenannte Typen; Umschreiben ist abgefasst pro Design-Spezifikation 10 - kein TDD In diesem Refaktor wird die Infrastruktur hinzugefügt). Baut grün mit aktualisierten Kamo-Shared-Bibliothek.
· InitializerService
Multi-Instance-Telefon/SMS-Anbieter Migration
Ausführt nach Hibernate ddl-auto:update erstellt neue Tabellen (VOIP_PROVIDER_INSTANCE, BULK_TEXT_PROVIDER_INSTANCE, PHONE_EXTENSION, PHONE_END_USER, PHONE_DEVICE, PHONE_VOICEMAIL, SYSTEM_CONFIGURATION) von den umbenannten/neuen Einheiten in kamo-shared-library Commit 232d731. Behandelt, was Hibernate nicht kann: - Zeilen aus legacy voip_provider_config / bulk_text_provider_config kopieren neue *_instance-Tabellen, die instance_name vom Provider-Typ synthetisieren. - Drop NOT_CONFIGURED (Ortal 0) Zeilen - Fehlen ist nun der "no provider"-Zustand. - Die jetzt leeren Legacy-Tabellen *_config räumen. - Backfill instance_id on member_voip_config, voip_conversations und kamotokens.org_oauth_token mit der ältesten aktiven Instanz der Org. - Org_oauth_token-Einzelindex von (org_id, Provider) bis (org_id, provider, instance_id) also mehrere RingCentral-Instanzen pro org Arbeit. - Verorginen einzigartige Indizes aus voip_conversations + Provider Instanz Tables fallen. - Sehen Sie die system_konfiguration Singleton-Reihe (voip Sync-Intervall 10min default, aktiviert true) - Plattform-Operator konfiguriert dies über die neue Plattform config VOIP & SMS-Registerkarte. Alle Aussagen idempotent; Re-Running auf bereits-migrated DB ist sicher. Bestellung 20 . nach SchemaCleanupRunner (1), OrganisationTypeRemovalRunner (2), KamoCRMAgeReqUpdateRunner (10).
· kamo-shared-library
Multi-Instance Telefon/SMS-Anbieter schema foundation
- VoipProviderConfig umbenennen - VoipProviderInstance; Drop UNIQUE(org_id), addieren Sie instance_name, config_json, last_sync_at, last_sync_error. - Umbenennen Sie BulkTextProviderConfig . BulkTextProviderInstance; gleiche Multi-Instanz-Behandlung. - Neue Einheiten: PhoneExtension, PhoneEndbenutzer, PhoneDevice, PhoneVoicemail, SystemConfiguration. - Fügen Sie MemberVoipConfig, VoipConversation, OrgOAuthToken hinzu (mehrere RingCentral Instanzen pro Org). - Neue Enums: PhoneExtensionStatus, PhoneEndUserStatus, PhoneDeviceType, PhoneDeviceRegistrationStatus. - Deprecate NOT_CONFIGURED in **************** (auf ordinal 0 gehalten, um bestehende Reihen unter EnumType.ORDINAL zu erhalten). - FLOWROUTE zu BulkTextProvidType für den neuen Flowroute SMS Provider hinzufügen. - Provider-abstraction DTOs (ExtensionDto, PhoneUserDto, DeviceDto, VoicemailEntryDto, InstanceHealthDto, Erstellen/Update-Anforderungen). Erste Phase des Multi-Instanz-Telefons/SMS-Refaktors siehe ************ (in kamo-login repo). KamoInitializer Migration + Service Refactors zu folgen.
· KlusterServices
FreePBX 17 + Jigasi SIP Brücke auf k1m1 und k2m1
FreePBX (tiredofit/freepbx:17-latest) läuft mit hostNetwork so SIP/RTP behält echte Client IPs, die per node per node angeheftet werden. SIP on 5060 UDP/TCP (5061 TLS), RTP-Reihe 18000-18999 ausgewählt, um Janus zu vermeiden (20000-20999), Coturn (52000-65535) und WireGuard (51820-51821). Meet Jigasi als interne ClusterIP SIP Brücke hinzugefügt, so dass FreePBX kann trunk ruft in Meet-Konferenzen; Prosody stellt jetzt einen jigasi-Benutzer vor von JIGASI_XMPP_PASSWORD. Admin UI erreichbar über Traefik pbx.k1.kluster.kamocrm.com / pbx.k2.kluster.kamocrm.com mit Zertifikaten gesät durch Auto-Zt STATIC_DOMAINS.
· kamo-internal
Platform-Admin-Ansicht, Paginierung, Live-Suche, Filter, org-Logos
Platform Admins (Top-Level org-Besitzer) sehen jetzt jede Org im System über die neu /api/security/org/all-networks endpoint anstelle nur ihrer eigenen Mitgliedschaften. Der Header-Titel und das Untertitel-Update, um den Admin-Kontext zu reflektieren. Weitere Verbesserungen: - Paginierung: Client-Seite, Standard 25/Seite, konfigurierbar (10/25/50/100) - Live-Suche: Filter nach Titel, Kurztitel oder Domain in Echtzeit - Filterchips: "Alle", "Orgs I Own", "DNS Noch nicht konfiguriert" - Ergebniszahl neben Seitengröße Selector angezeigt - Seitennummer-Buttons mit Ellips-Kollaps für große Seitenzahlen - OrgLogo-Komponente konsolidiert Logo-Rendering (kurzes Logo über getOrgLogoUrl) sowohl für die aktuelle Karte und alle Org-Karten in der Liste - ENTER-Taste korrekt bewacht von org.memberId (gemeinsame Benutzer+Mitglieder-Rekorde) - ENTER AS SYSTEM MEMBER für alle orgs, wenn can EnterAsSystemMitglied
· SecurityService
GET /api/security/org/all-networks für Plattform-Administratoren hinzufügen
Top-Level org Besitzer können jetzt holen alle Organisationen im System mit Mitgliedschaft info relativ zum Anrufer. Orgs, wo der Anrufer ein Mitglied hat record get isOwner/memberId bevölkert; andere erhalten MemberId: null, isOwner: false. Endpoint erzwingt, dass der Anrufer sowohl in der Top-Level-Org ist und ein Eigentümer ist.
· kamo-internal
Sub-Tabs im Sicherheits-Modell-Editor + Aufräumarbeiten
- Security-Modell-Redakteur auf ************ ist jetzt gespalten in vier Sub-Tabs: Allgemein (Basic Info, Sichtbarkeit, Wer kann erstellen, Plattform-Einstellungen, Domain Config, Commerce Markets), Zensur (Alkohol/ Tabak/Feuerwaffen + Mitglied + Teammitglied Altersklassen), zulässige Apps und Default Security Roles. - Neu ************ lässt einen Admin ein Modell bearbeiten allowRootSubdomains Flagge und Eltern Aliasnamen neben dem Rest, dass Die Einstellungen des Modells. Früher lebte dies in der org-weiten Subdomain Äste Popup. - Subdomain Branches Popup wird nur auf die Org-Level-Bits vereinfacht GoDaddy Anmeldeinformationen + Master ermöglichen zu schalten. Pro-Model-Alias ausgezogen sowohl des Dialogs als auch seiner Requisitenoberfläche; SecurityRoleManager lässt die jetzt-unbenutzte Requisiten auch. - Enthält jeden Verweis auf teamMemberPayFeesSetting / PayFeesSetting / TriStateFeeOption - die "Mitarbeiter Self-Pay Kamo Gebühren" auswählen auf der Modell-Editor und seine Chip in der Modell-Tabelle sind verschwunden, zusammen mit der Typ Aliasen in der VerwendungAppliedModel. - /settings/platform/events und /settings/plattform/plans pages are gelöscht (sie waren Platzhalter von der veralteten Abrechnungsfläche). Die Landing Page, EinstellungenStatusWindow Unter-Topic-Liste und Route/Ikone Karten alle Drop-Einträge. - Verwalten Gruppe sub-tab auf ************ jetzt zeigt den Titel der Default Group als schreibgeschütztes Feld an (was bisher ganz hinter einem Info-Alarm versteckt), so dass Admins sehen können die Der Name der Gruppe kann zwar nicht geändert werden.
· kamo-internal
Alias Sichtbarkeit UI + Subdomain Branches-Button auf Zweigseiten
SubdomainBranchesDialog: - Alias-Editor ersetzte Chip-Liste mit einer Tabellen-Stil-Reihenliste Mitglieder und Teammitglieder Checkboxen per alias - admins steuern welche Schöpfertypen sehen jeden Eltern-Alias in /network/create - aufUpdateModelSubdomainConfig Signatur aktualisiert, um vollständige Alias-Objekte zu übergeben (alias, visibleToMembers, visibleToTeamMitglieder) anstelle von schlichten Strings SecurityRoleManager: - fullSecurityModels state + loadFullSecurityModels Karte Aliases mit ************ Fahnen - persistModelSubdomainConfig reicht volle Alias-Objekte an das Backend weiter BranchSetupManager **************** - Subdomain Branches-Button (Spiegel-Sicherheits-Rollen-Seite) mit der gleiche SubdomainBranchesDialog, Status-Fetch auf Mount und Modell-Reload wenn der Dialog öffnet
· SecurityService
Alias Sichtbarkeit Filterung + Auto-verify subdomain Eigentum
OrganisationController: - Web-alias org Schöpfung jetzt Auto-Marken EigentumVerified=true und isDnsVerified=true auf der erstellten OrgDomain - kein TXT-Rekord benötigt, da wir stellten DNS auf GoDaddy in ihrem Namen - CUSTOM parentAliasType Pfad erzwingt jetzt pro-alias Schöpfer-Typ Sichtbarkeit (Spiegel /Schreatbarer Filter, so dass das Backend nicht umgangen werden kann) BranchTypeController /creatable: - parentAliases list wird nun vom Schöpfer des Anrufers gefiltert: MEMBERS siehe nur visibleToMembers=true alias, TEAM_MEMBERS nur siehe visibleToTeamMitglieder=true aliases, OWNERS siehe alles - Jeder Alias DTO enthält jetzt visibleToMembers + visibleToTeamMitglieds-Flags SecurityModelController: - processSubdomainBranchConfig liest jetzt ************ von Alias Kartenobjekte und Aufrufe ersetzenAllFull, um sie zu beharren
· kamo-shared-library
Per-alias Schöpfer-Typ Sichtbarkeitsflaggen hinzufügen
sichtbar hinzufügenToMembers / visibleToTeamMitglieder boolean Säulen zu ChildOrgSecurityModelAlias, damit Admins einschränken können, welche Eltern Aliasnamen erscheinen Mitgliedern gegenüber Teammitgliedern bei der Erstellung von Kind-Orgs. - Entity: zwei @Builder.Default True columns mit BOOL DEFAULT TRUE - SubdomainAliasDTO: beide Flaggen in von Entity aussetzen - ************ neues AliasEntry Album + ersetzenAllFull Überlastung, die Sichtbarkeit fortbesteht; ersetzen Alle(Strings) Delegierte zu ihm
· kamo-internal
Einstellungen Dialog, Web-alias Assistent Pfad und DNS Bereitstellung Panel
Fügt die Subdomain Branches UI über drei Flächen hinzu: - ************ neue "Subdomain Branches" Button öffnet einen Dialog für das org-Level aktivieren per Knopfdruck + GoDaddy Creds, mit einem pro-Security-Modell Editor für erlaubenRootSubdomains + Eltern Aliase (Reuses die Assistenten isValidAlias/toSafeAlias Helfer) - /network/create: BasicsStep verzweigt sich jetzt zwischen einer bring-your-own-domain Pfad und ein Kamo Web-alias Pfad (auf der Eltern-Enable-Flagge der org, GoDaddy-Status und die Aliasnamen des Zweigtyps). Parent Alias Dropdown-Listen ROOT (wenn erlaubt) plus pro Modell Aliasnamen; Live-Hilfe Vorschau-Updates, wie der Benutzer ändert entweder Feld - /setup/dns: Neues DnsProvisioningPanel befragt das org's Provisoring Log und Oberflächen pro Rekord GoDaddy Status mit einer erneuten scerzten Aktion Unterstützt von Next.js BFF Proxy-Routen unter ****************
· SecurityService
Org-Level config, GoDaddy Client und web-alias org erstellen Pfad
Wire die neuen Subdomain Zweige verfügen über Ende-zu-Ende auf dem Backend: - SubdomainBranchesController für org-level enable + GoDaddy Creds (live-verifiziert) - GoDaddyDnsClient führt idempotent CNAME upserts und Anmeldeprüfungen durch - DnsProvisioningService stellt die Standard-Subset KnownAliases und schreibt pro Datensatz an OrgDnsProvisionLog - SecurityModelController trägt allowRootSubdomains + aliases[] on erstellen/aktualisieren - **************** nimmt den Web-alias Weg an (useWebAlias + parentAliasType + parentAliasId + webAlias), berechnet die resultierende FQDN unter der Root-Zone der Eltern und startet die DNS-Versorgung nach der transaktionalen org erstellen komplette - BranchTypeControllers /creatable Endpunkt stellt die Pro-Modell-Aliase offen und parent-org subdomain-branches Status, so dass der Assistent kann Gate der UI
· kamo-shared-library
Fügen Sie Entitäten, Chiffre und Alias/DNS-Loggerüste hinzu
Fügt pro-Org GoDaddy Creds (AES-GCM verschlüsselt), ein allowRootSubdomains Flagge und Kind-org-Alias-Sammlung über das Sicherheitsmodell, eine DNS-Bestimmung Audit-Log und ein gemeinsamer SecretCipher-Helder, der von SecurityService für Rundreisen verwendet wird API-Schlüssel, ohne sie jemals an die Front zurückzugeben.
· kamo-internal
Prefix/Suffix Dropdowns, mailbox Domain Gate, expliziter Status
- Name-Präfix und Suffix sind jetzt Dropdowns aus der NamePrefixType / NameSuffixType Kataloge geliefert von der org-config Endpunkt. Zeigt Abkürzung + Vollname pro Option an. - "Provision Organisation E-Mail-Postfach" ist jetzt deaktiviert, es sei denn, Organisations-E-Domain passt zu einem der verifizierten Mailbox der Org Domains (aus GET /api/email/Domains). Klare Inline-Messaging erklärt, ob es wegen fehlender E-Mail deaktiviert ist, keine verifiziert Domains konfiguriert, oder eine Domain-Mistverhältnis - und benennt die tatsächliche konfigurierte Domains, damit der Admin weiß, was er zu verwenden hat. - Team-Mitgliedsstatus ist nicht mehr standardmäßig bei PROSPECT; Admins müssen wählen Sie einen Lebenszyklus Zustand explizit oder einreichen ist blockiert. Zusammenfassung Panel zeigt "nicht gesetzt", bis ein Status gewählt wird.
· SecurityService
Explizit Teamstatus + Name Präfix/Suffix Kataloge
- GET ************ gibt jetzt NamenPrefixes zurück nameSuffixes, bezogen von NamePrefixType und NameSuffixType, also Mitglied hinzufügen / Team-Mitglied hinzufügen müssen nicht, um sie zu hard-code. - POST /create-Team-Mitglied lehnt jetzt einen Antrag ab, der ausgelassen wird teamMitgliedschaftStatus (400). Der bisherige stille PROSPECT Fallback ist gegangen - der Anrufer muss einen Lebenszyklus-Zustand explizit so Team wählen Mitglieder werden nie durch Standard-Manier falsch getimt.
· kamo-internal
Vollbreite, drei Pane Mitgliedsform hinzufügen
Überarbeitung des Formulars erstellen, um den gesamten Inhaltsbereich anstelle eines 1100px-weite zentrierte Säule. - 3-Säuln ansprechendes Layout: klebriges linkes Stellwerk (md+), volle Breite form (immer), Live-Zusammenfassungsfeld rechts (xl+). - Feldreihen jetzt skalieren auf verfügbare Breite: Name Abschnitt ist 5-up bei md+, Kontakt + Rollenreihen gehen bis zu 4-up an xl breakpoints. - Sticky Boden Aktionsleiste überspannt volle Breite mit einem Status-Hinweis und einem Gradient primäre CTA. - Section nav verwendet Scroll-Spy, um den Abschnitt zu markieren, in dem sich der Benutzer befindet und unterstützt Click-to-scroll. - Polierte Karten-Stil - weiche Ränder, subtiler Hoverlift, Gradienten Abschnitt-Header-Symbole. - Neue Rechts-Schnipulation Karte spiegelt die Formulardaten live (avatar initialen, Name, Benutzername, E-Mail, Rolle, Status-Chip) und zeigt eine bereit-to-create Indikator, sobald die Validierung vergeht.
· kamo-register
Alias/E-Mail/Name/Telefon in einen einzigen "Mein Profil"-Schritt
Kombinieren Sie die zuvor getrennte "Meine E-Mail & Alias", "Mein Name", und "Telefonnummer" tritt in einen "Mein Profil"-Schritt für 13+ Registranten, mit Alias + E-Mail + gesetzlicher Name erforderlich und Telefonnummer optional (bei der Eingabe per SMS verifiziert). Unter-13-Registranten sehen jetzt eine einzeln umbenannt "My User Alias" Schritt - keine E-Mail, Rechtsname oder Telefon. - RegisterFlow: vereinfachte Schrittliste, einheitlicher GriffWeitere Validierung, neue renderStepContent-Fälle. Der Profilschritt ist intern scrollbar, so dass die drei Abschnitte innerhalb des Ansichts-Port passen. - RegisterStatus gewinnt einen "REGISTERED"-Wert für Unter-13-Abschlüsse wo es keine E-Mail zu überprüfen, sie sind direkt auf die Login-Seite mit ?registred=1 anstelle der E-Mail-Verifikationsseite.
· SecurityService
E-Mail + legaler Name optional für Unter-13- Anmeldungen
Der /api/security/register-Endpunkt hat zuvor jeden Antrag abgelehnt fehlende E-Mail, Vorname oder Nachname. Das machte den Unter-13-Pfad (KIDS_ONLY orgs, oder ALL_AGES mit einem Sub-13 Registranten) unmöglich diese Konten haben legitimerweise nur einen Alias + Passwort + Samen Phrase. Validierung erfordert jetzt Alias + Passwort auf jedem Pfad, und behandelt E-Mail + Vorname + Nachname als Alles-oder-Nichts-Triple: Lieferung Jeder von ihnen erfordert alle drei. Die Verifikation-E-Mail senden und die Antwort-E-Mail-Feld jetzt schützen, ob eine E-Mail war tatsächlich bereitgestellt, und der Antwort-Status ist "REGISTERED" (vs die bestehenden "EMAIL_VERIFICATION_REQUIRED") wenn es keine E-Mail zu überprüfen.
· kamo-shared-library
************ für Enter-als Checks hinzufügen
· kamo-internal
System Benutzerkonfiguration Seite + Netzwerk ENTER AS SYSTEM MEMBER
Fügt Plattform-Verwaltung hinzu - Konfiguration, ein Eltern-Org-Eigentümer-only Seite, die die Erlaubnis zur Imitation der Plattform gewährt oder widerruft Systembenutzer nach Abteilung, Berufsbezeichnung oder individuelles Teammitglied. Registriert in allen drei nav Standorten (Einstellungen Seitenseite Liste, EinstellungenStatusWindow Routen + Sub-Topics, und die Seite selbst). Updates /Netzwerk, um den neuen /api/security/enter-als Endpunkt für die vorhandene ENTER-Taste, so dass die Zieldomäne eine Sitzung erhält gebaut vom Mitglied des Ziels org (Beheben des Fehlers, wo die Quelle org's memberID/orgID ist in die neue Session durchgesickert). Fügt einen ENTER AS hinzu SYSTEM MEMBER-Button neben ENTER, der nur nach ************ bestätigt, dass der Anrufer berechtigt ist.
· SecurityService
Backfill, enter-as flow, mutation guards, config API
Selbstheal-Vorläufigkeit: SystemUserBackfillService läuft auf jedem SecurityService boot (von DataLoader) um die is_system_user Spalte hinzuzufügen und system_user_access-Tabelle, wenn es fehlt, stellen Sie das Singleton-System sicher Benutzerdaten sind vorhanden, und erstellen Sie eine Administrator-Rolle Teammitglied in jedem zu dem nicht-top-level org es gehört noch nicht. Auch läuft bei Erstellen Sie die Zeit derOrganisation, damit neue orgs eine Systembenutzer-Mitgliedschaft erhalten sofort statt auf den nächsten Neustart zu warten. Cross-Org-In-Flow: ersetzt das alte /api/generate-otk Hand-off (welches durchgesickert der Anrufer Source-Or-Ordnung an die Ziel-Domain) mit /api/security/enter-as. Der neue Endpunkt baut eine frische ***-geklappt auf das eigentliche Mitglied des Ziels org, also passen MemberID/orgID/rights immer zusammen die eingegebene Org. Fügt ein SUDO_MEMBER_ID-Feld zur Session JSON hinzu dass Systembenutzer-Imitation das Mitglied des menschlichen Operators trägt für die Prüfung Zuordnung. Guards: SystemUserGuard verweigert jede API-gesteuerte Mutation zum System Benutzeraufzeichnung oder eine seiner Mitgliedschaften (verdrahtet in MemberController, MemberSecurityController, ************ Systembenutzer von den GetMembersAnd Subscribers, getTeamMembersAndContractors, und getMembersByDepartment Endpoints, so dass Mieter es nie in Listen sehen. Config Oberfläche: SystemUserConfigController stellt CRUD über den Zuschuss Tisch nur für Top-Level-Or-Besitzer und SystemUserCapabilityController gibt einen boolean zurück, mit dem die /network-Seite entscheidet, ob die ENTER AS SYSTEM MEMBER Button.
· kamo-shared-library
Systembenutzer-Flag + Access-Grant-Einheit hinzufügen
Einführung des plattformweiten System-Benutzermodells: ein User.isSystemUser Flag (einzigartiger Teilindex erzwingt einen Singleton), plus eine SystemUserAccess-Tabelle die Aufzeichnungen, welche Top-Level-Or-Abteilungen, Berufsbezeichnungen oder Teammitglieder kann sich als Systembenutzer ausstellen, um Kind oder Ags zu betreten. Zugangszeilen sind Plattform-intern (nicht RoleRightType Einträge), so dass sie aus der bleiben Pächter-Rechte tauchen auf.
· kamo-register
Telefonüberprüfung + Sicherheitsfragen Schritte hinzufügen
Zwei neue Schritte zwischen Passwort und Kontoerholung für 13+ Registranten: ein Schritt mit Telefonnummern (optional, überspringbar, mit SMS-Code Verifizierung) und ein Schritt zur Sicherheitsbefragen (erforderlich, 3 verschiedene Fragen mit Antworten). Unter-13-Registranten überspringen weiterhin beide und verlassen sich auf ihre Saat Phrase für die Genesung. - FormPhoneNumber: Leerlauf -- Eingabe-Code --" geprüft Zustand Maschine, pro Schritt Capcha Widget-Gating-Gating-SMS senden, ändern und Pfade überspringen. - FormularSecurityQuestions: 3 Dropdowns + Antworten, Einzigartigkeit erzwungen, Katalog aus dem neuen öffentlichen Backend Endpunkt geholt. - RegisterFlow: neue formDatenfelder, bedingte Schritte, handleWeiter Validierung, Telefon + Sicherheit Fragen in den eingereichten Körper verdrahtet. - /api/security Proxy bringt jetzt X-Forwarded-Host vorwärts, so dass das Backend kann die Org für SMS-Provider-Auswahl auflösen.
· SecurityService
Sammeln Sie Telefon + Sicherheitsfragen während der Anmeldung
Verschieben Sie Telefon-Nummer und Sicherheits-Fragen-Sammlung in den Self-Service Registrierungsfluss (wo sie ursprünglich vorgesehen waren) anstatt erfordern eine Post-signup-Einstellungen Seite. - Neuer RegistrierungPhoneService: generiert/verwertet 6-stellige SMS-Codes über BulkTextSmsClient, 10-Minuten-TTL, 5-pro-Stunde-Grenze pro Nummer. - RegistrationService akzeptiert jetzt einen RegistrierungParams-Rekord mit optional verifiziertTelefon und eine 3-Eintritts-Sicherheits-Fragen-Liste; Sicherheitsfragen werden mit der bestehenden Antwort-Normalisierungsregel bcrypt-hashed. - /api/security/registr akzeptiert **************** und behauptet, das verifizierte Telefon gegen den Code, bevor Sie den Benutzer beharren. - Neue öffentliche Endpunkte POST /register/phone/initiate (Capcha-gated), POST /register/Telefon/verifizieren, und GET ****************
· kamo-shared-library
RegistrierungPhoneCode Entity + Repitor hinzufügen
Neue Tabelle "registration_phone_codes" speichert One-Shot-SMS-Verifikationscodes ausgestellt während der Self-Service-Registrierung, bevor eine Benutzer-Einheit existiert. Getrennt von AccountVerificationCode, um das Tragen eines NULL-Benutzers zu vermeiden auf dieser Tabelle.
· kamo-internal
Mitglied hinzufügen / Team Member-Seiten hinzufügen
- /account: einzelne mehrdeutige Taste durch tab-scoped Button ersetzen Fügen Sie <Member" auf der Reiternummer der Mitglieder hinzu, <Team Member" auf der Registerkarte Teammitglieder hinzufügen. Jeder Button führt zu einer dedizierten Seite anstelle der alten kaputten Seite Fall-through auf die Mitglieder-Detail-Ansicht. - Neue /Einstellen/Mitglied/neue und /settings/team-member/neue Seiten, beide unterstützt von einer gemeinsamen MemberCreateForm mit einer "varianten" Requisite. - Form ist ein einseitiges, abschnittsorientiertes Layout (Name, Identität, Kontakt, org mailbox, team-member-only role/location, review). Live User-lookup auf E-Mail und Benutzername warnt, wenn ein Benutzer bereits existiert oder bereits verlinkt ist als Mitglied in dieser Org. - Honet den Org's AgeReqType: wenn die Anforderung Benutzer unter 13 erlaubt, persönliche und organisatorische E-Mail-Felder sind ausgeblendet und Benutzername wird die primäre Kennung. - Optionale Checkbox "Provision Organisation E-Mailbox" erstellt die mailbox via EmailService und weist es als primäre Mailbox des Mitglieds zu. - Profil-Register auf /settings/member/[id] enthält jetzt Work Location, Team Mitgliedsstatus und Offizieller Jobtitel für TeamMember-Aufzeichnungen, verdrahtet zum bestehenden PUT /api/security/members/{id' endpoint.
· SecurityService
Mitglied hinzufügen / Teammitglied-Erstellungsfluss hinzufügen
- New MemberCreateController stellt auf: * GET ************ - alters-req, Zeitzone, Abteilungen, Berufsbezeichnungen * GET ************ - debounced Existenzcheck per E-Mail oder Benutzername * POST /api/security/members/create - Member in caller's org erstellen * POST ************ - Teammitglied mit Abteilung / Berufsbezeichnung / Arbeitsplatzstandort / Mitgliedschaft Status / Sicherheitsstufe - Wiederverwendet einen vorhandenen Benutzer, wenn E-Mail oder Benutzername bereits passt; anderweitig erstellt einen neuen Benutzer und sendet die Vorlage EMAIL_VERIFICATION. WELCOME Vorlage wird immer auf die Erstellung gesendet. - Für Orgs, deren AgeReqType erlaubt unter 13 Benutzern, E-Mail-Sammlung ist übersprungen und der Benutzername wird zum primären Kenner. - Ermöglicht GET /members/{id] auf Rückkehrstandort + teamMitgliedschaftStatus + istOrganisationOwner für Teammitglieder und PUT auf dem Aufenthalt Standort, teamMembershipStatus und jobTitleOfficial, wenn der Rekord ein Teammitglied ist. - Standard-Rollenzuweisung + Rechte Materialisierung an MemberService delegiert so dass jedes neue Mitglied mit seinen effektiven Rechten bereits angewendet wird. - Fix Entitlement Service: boolean getter wurde getirrt getIsOrganizationOwner (Lombok erzeugt ist OrganizationOwner für primitive boolesche Felder).
· kamo-shared-library
AgeReqType.allowsUnder13() Helfer hinzufügen
Wird vom Mitglied hinzufügen / Teammitglied hinzufügen, um die E-Mail-Sammlung zu überspringen für Orgs, deren Alterserfordernis Benutzer unter 13 Jahren zulässt (ALL_AGES, KIDS_ONLY, ALL_COPPA_GRADS).
· kamo-internal
Rebuild-Mitglied Pläne & Billing rund um Billing-Gruppen
- Mitgliedsseite Pläne & Abrechnung Tab ist jetzt rechts ausgerichtet mit einem pulsierenden Schein und ein StarRate-Symbol auf der Registerkarte. Sichtbar, wenn das angesehene Mitglied ist Der angemeldete Benutzer ODER der angemeldete Benutzer besitzt die Org. Inhalte gespalten in vier Sub-Tabs: Abonnements, Rechnungen, Zahlungsinfo, Verwalten Gruppe. Billing-Gruppe Selektor Dropdown + "Abrechnungsgruppe hinzufügen"-Symbol-Button live rechts von der Sub-Tab-Leiste; die Gruppenauswahl treibt jedes Panel an. - Abonnements Panel zeigt eine Karte pro aktivem Markt (FREE_DEFAULT KamoCRM immer vorhanden), mit Änderungsplan / stornieren / reaktivieren und a Per-Sitz Lizenz-Auftrag-Netz. Priority Auto-Deaktivierung läuft Server-Seite auf Sitzreduzierung. - Zahlungsinfo-Panel wickelt Streifenelemente über StripeProvider + a refactored PaymentMethodForm, die an eine Abrechnungsgruppe angehängt wird (nicht die alter Org-Level-Kunde). - Verwalten Group Panel bearbeitet Titel / Billing Kontakt / Mitgliedsrechte (Licensee, Group Plan Manager, canManageAbonnement, canManageBilling) und fügt Mitglieder hinzu/entfernt. Die Default-Gruppe ist nur lesbar - ihr Dienstplan ist implizit (jeder nicht in einer expliziten Gruppe), und kein Titel oder Berechtigungsänderungen sind erlaubt. - /settings/account?tab=billing gelöscht. BillingManager + PlanCalculator entfernt. Links überall auf dem neuesten Stand des neuen Mitglieds Pläne & Billing Registerkarte. - EinstellungenStatusWindow + /settings Lande nav beide beschnitten (drei-Wege Synchronisation per nav-sync-Regel). - BranchSetupManager bekommt eine neue "Commerce Markets"-Sektion im Inneren Sicherheitsmodell-Editor, mit dem neuen SecurityModelMarketController zu SUBSCRIPTION-Märkte mit proscope Public/Member/Detach Team-Mitglied schaltet. - ************ umgeschrieben, um per-org Billing zu zeigen Gruppen + pro Gruppe Abonnements + MRR. /settings/platform/events und /settings/platform/plans werden zu Platzhalterseiten (ihre alten Inhalte sind mit dem Clean-Slate-Schnürfen gegangen). - Neue API-Proxys: /api/security/Ansprüche und ************ Neue NutzungEnteriglements Haken verbraucht SecurityService EntitlementService für Feature-Gating im UI. Legacy Consumer Files (StatsManager, FeaturesManager, BranchSetupManager) tragen @ts-nocheck, bis ihre Abonnement-basierte gating code wird auf useEntitlements umgearbeitet.
· SecurityService
EntitlementService + SecurityModel Commerce-Märkte hinzufügen
- EntitlementService berechnet Feature-Zuschüsse pro Mitglied durch gewerkschaftliche aktive BillingGroupLicense-Plan verfügt über + KamoCRM Free-Tier-Basislinie. Caches 15-Minuten-Prognosen in Redis auf memberId. - EntitlementInvalidationListener abonniert die kamo.entitles.invalidate Redis Channel (MEMBER:/GROUP:/ORG: Nutzlasten) also BillingService Mutationen sofort ausbreiten. - EntitlementController bei /api/security/titlements explars /me, ************ und eine Cache-Invalidation POST. - SecurityModelMarketController bei ************ befestigt/detaches CommerceMarkets an ein ChildOrgSecurityModel und dreht die Public / Member / Team-Member scope booleans.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich