Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· InitializerService
Multi-instance telefono/SMS provider migrazione
Esegue dopo Hibernate ddl-auto:aggiornamento crea nuovi tavoli (VOIP PROVIDER INSTANCE, BULK TEXT PROVIDER INSTANCE, PHONE EXTENSION, PHONE END USER, PHONE DEVICE, PHONE VOICEMAIL, SYSTEM CONFIGURATION) dalle entità rinominate/nuove in kamo-shared-library commit 232d731. Maniglie ciò che Hibernate non può: - Copia righe da legacy voip provider config / bulk text provider config in nuovi * instance tabelle, sintetizzando istanza name dal tipo di provider. - Getta le righe NON CONFIGURED (ordinal 0) — l'assenza è ora lo stato "no provider". - Getta le tabelle * config dell'eredita' ora vuota. - Backup ista id su member voip config, voip conversations, and kamotokens.org oauth token utilizzando l'istanza attiva più antica di ogni org. - Ricostruire org oauth token indice unico da (org id, provider) a (org id, provider, ista id) così più istanze RingCentral per lavoro org. - Gettare gli indici unici orfano da voip conversations + tabelle delle istanze del fornitore. - Seed the system configuration singleton Row (voip sync intervallo 10min predefinito, abilitato true) — l'operatore della piattaforma lo configura tramite la nuova configurazione della piattaforma Scheda VOIP & SMS. Tutte le dichiarazioni idempotent; re-running su DB già migrato è sicuro. Ordine 20 — dopo lo schemaCleanupRunner (1), OrganizationTypeRemovalRunner (2), KamoCRMAgeReqUpdateRunner (10).
· kamo-shared-library
Multi-instance telefono / fornitore SMS fondazione schema
- Rinomina VoipProviderConfig → VoipProviderInstance; drop UNIQUE(org id), aggiungere ista name, config json, last sync at, last sync error. - Rinomina BulkTextProviderConfig → BulkTextProviderInstance; stesso trattamento multi-instance. - Nuove entità: PhoneExtension, PhoneEndUser, PhoneDevice, PhoneVoicemail, SystemConfiguration. - Aggiungi ista id a MemberVoipConfig, VoipConversation, OrgOAuthToken (multiple RingCentral istanze per org). - Nuovi numeri: PhoneExtensionStatus, PhoneEndUserStatus, PhoneDeviceType, PhoneDeviceRegistrationStatus. - Deprecate NOT CONFIGURED in******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** (preso a ordinazione 0 per preservare le righe esistenti sotto EnumType.ORDINAL). - Aggiungi FLOWROUTE a BulkTextProviderType per il nuovo fornitore di SMS Flowroute. - DTO di abstrazione del fornitore (ExtensionDto, PhoneUserDto, DeviceDto, VoicemailEntryDto, instanceHealthDto, Crea/Aggiorna richieste). Prima fase del refactor del telefono multi-instance/SMS, vedi ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** KamoInitializer migrazione + refattori di servizio da seguire.
· KlusterServices
Deploy FreePBX 17 + ponte Jigasi SIP su k1m1 e k2m1
FreePBX (tiredofit/freepbx:17-latest) funziona con hostNetwork così SIP/RTP preserva i veri IP client, pinned one-per-node tramite nodeSelector. SIP su 5060 UDP/TCP (5061 TLS), gamma RTP 18000-18999 scelta per evitare Janus (20000-20999), Coturn (52000-65535), e WireGuard (51820-51821). Incontra Jigasi aggiunto come ponte interno ClusterIP SIP in modo che FreePBX può baule in Meet conferenze; Prosody ora fornisce un utente jigasi da JIGASI XMPP PASSWORD. Admin UI raggiungibile tramite Traefik pbx.k1.kluster.kamocrm.com / pbx.k2.kluster.kamocrm.com con certs seme attraverso autocert STATIC DOMAINS.
· kamo-internal
Piattaforma-admin view, paginazione, ricerca dal vivo, filtri, logo org
Gli amministratori della piattaforma (proprietario di org di livello superiore) ora vedono ogni org del sistema tramite il nuovo /api/security/org/all-networks endpoint invece che solo i propri membri. Il titolo dell'intestazione e l'aggiornamento dei sottotitoli per riflettere il contesto di amministratore. Altri miglioramenti: - Paginazione: lato client, predefinito 25/pagina, configurabile (10/25/50/100) - Ricerca dal vivo: filtri per titolo, breve titolo o dominio in tempo reale - Filtro chip: "All", "Orgs I Own", "DNS Non ancora configurato" - Conto di risultato mostrato accanto al selettore di dimensioni pagina - Tasti di numero di pagina con collasso di ellipsi per grandi conteggi di pagina - Il componente OrgLogo consolida il rendering del logo (il logo breve tramite getOrgLogoUrl) per sia la scheda corrente-org che tutte le carte org nell'elenco - Pulsante ENTER correttamente sorvegliato da org.memberId (condivisione utente + record membro) - ENTER AS SISTEMA MEMBRO disponibile per tutti gli org quando puòEnterAsSystemMember
· SecurityService
Aggiungi GET /api/security/org/all-networks per gli amministratori della piattaforma
I proprietari di org di livello superiore possono ora prendere tutte le organizzazioni nel sistema con informazioni relative al chiamante. Org dove il chiamante ha un membro record get isOwner/memberId popolato; altri ottenere membroId: null, isOwner: false. Endpoint afferma che il chiamante è sia nell'org di livello superiore che in un proprietario.
· kamo-internal
Sottotitoli nell'editor di modelli di sicurezza + pulizia
- L'editore di modelli di sicurezza su... in quattro sottotitoli: Generale (Informazione base, Visibilità, Chi può creare, Impostazioni della piattaforma, Config di dominio, Mercati di commercio), Censura (alcool/ tabacchi/arma da fuoco + membri + fasce di età dei membri della squadra), app consentite, e Ruoli di sicurezza predefiniti. - Novità. consente ad un amministratore di modificare un modello consentire aRootSubdomains bandiera e alias genitori accanto al resto di quello impostazioni del modello. Precedentemente questo viveva all'interno del Subdomain Branches popup. - Il popup dei rami sottodomini è semplificato solo ai bit di livello org — Le credenziali GoDaddy + master consentono di attivare il gioco. Per modello alias spostato fuori della finestra di dialogo e della sua superficie prop; SecurityRoleManager scende Anche gli oggetti non utilizzati. - Rimuove ogni riferimento al teamMemberPayFeesSetting / PayFeesSetting / TriStateFeeOption — il "Employee Self-Pay Kamo Fees" seleziona sul modello editor e il suo chip nella tabella dei modelli sono andati, insieme con il digitare alias in useAppliedModel. - /settings/platform/events and /settings/platform/plans pages are cancellati (sono stati segnaposto dalla superficie di fatturazione deprecata). La pagina di atterraggio, ImpostazioniStatusWindow elenco sub-topico, e route/icon mappe tutte cadere le voci corrispondenti. - Gestire il sub-tab del Gruppo... visualizza il titolo del Gruppo Default come campo di sola lettura disabilitato (was precedentemente nascosto completamente dietro un avviso di informazioni) in modo che gli amministratori possono vedere il Il nome del gruppo, pur sapendo che non può essere cambiato.
· kamo-internal
Alias visibilità UI + Subdomain Branches pulsante sulla pagina dei rami
SubdomainBranchesDialog: - L'editor Alias ha sostituito l'elenco dei chip con una lista delle righe in stile tabella Membri e membri del team caselle di controllo per alias — amministratori di controllo che i tipi di creatori vedono ogni genitore alias in /network/create - onUpdateModelSubdomainConfig firma aggiornata per passare oggetti alias completi (alias, visibileToMembers, visibileToTeamMembers) invece di stringhe semplici SicurezzaRoleManager: - fullSecurityModels stato + caricoFullSecurityModels mappa alias con E' il momento giusto. bandiere - persistModelSubdomainConfig passa oggetti alias completi al backend BranchSetupManager E' il momento giusto. - Aggiunto il pulsante Subdomain Branches (mirrors security-roles page) con il stesso SubdomainBranchesDialog, stato-fetch sul montaggio, e il modello di ricarica quando si apre la finestra di dialogo
· SecurityService
Filtro di visibilità Alias + auto-verificare la proprietà subdomini
OrganizzazioneController: - Web-alias org creazione ora auto-marks proprietàVerified=true e isDnsVerified=true on the create OrgDomain — no TXT record necessario da abbiamo fornito DNS su GoDaddy per loro conto - CUSTOM genitoreAliasType percorso ora applica per-alias creatore-tipo di visibilità (mirrors / filtro creabile in modo che il backend non possa essere bypassato) BranchTypeController /creatable: - la lista dei genitoriAliases è ora filtrata dal creatore del chiamanteTipo: I MEMBRI vedono solo visibileToMembers=vera alias, TEAM MEMBERS vede solo visibileToTeamMembers=true aliases, OWNERS vedere tutti - Ogni alias DTO ora include visibileToMembers + visibileToTeamMembers bandiere SicurezzaModelController: - processoSubdomainBranchConfig ora legge Non e' vero. da alias mappa oggetti e chiamate sostituireAllFull per persistere
· kamo-shared-library
Aggiungi bandiere di visibilità per-alias
Aggiungi visibileToMembers / visibileToTeamMembers colonne booleane a ChildOrgSecurityModelAlias così gli amministratori possono limitare quali alias genitori appaiono ai membri vs membri del team quando si crea bambini. - Entità: due @Builder. Colonne vere predefinite con BOOL DEFAULT TRUE - SubdomainAliasDTO: esporre entrambe le bandiere daEntity Il nuovo record di AliasEntry + sostituire AllFull sovraccarico che persiste la visibilità; sostituireAll(strings) delegati ad esso
· kamo-internal
Finestra di dialogo Impostazioni, percorso wizard web-alias e pannello di provisioning DNS
Aggiunge l'interfaccia utente del subdominio su tre superfici: - Il nuovo pulsante "Subdomain Branches" apre una finestra di dialogo per il livello org abilitare toggle + GoDaddy creds, con un per-security-model editor per consentireRootSubdomains + alias genitore (riutilizzo il mago èValidAlias/toSafeAlias helper) - /network/create: BasicsStep ora si ramifica tra un porta-tuo proprio-dominio percorso e percorso web-alias Kamo (consegnato sulla bandiera del genitore org, Stato di GoDaddy, e gli alias del tipo di ramo selezionato). Parent Alias elenco ROOT (quando consentito) più alias per modello; aiuto dal vivo visualizza gli aggiornamenti come l'utente cambia campo - /setup/dns: nuovo DnsProvisioning Il pannello sonda il registro di provisioning dell'org e superfici per-record GoDaddy stato con un'azione ridefinita Supportato da Next.js BFF percorsi proxy sotto ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
· SecurityService
Configurazione di livello Org, client GoDaddy e web-alias org creano il percorso
I fili dei nuovi rami del subdominio dispongono di end-to-end sul backend: - SubdomainBranchesController per org-level abilita + GoDaddy creds (verified dal vivo) - GoDaddyDnsClient esegue upserts CNAME idempotent e controlli delle credenziali - DnsProvisioning Servizio sincronizza il sottoinsieme standard KnownAliases e scrive per-record righe a OrgDnsProvisionLog - SecurityModelController trasporta consentireRootSubdomains + alias[] su creare/aggiornamento - Accetta il percorso web-alias (usoWebAlias + genitoreAliasTipo + genitoreAliasId + webAlias), calcola il risultante FQDN sotto la zona radice del genitore, e calci fuori il provisioning DNS dopo che l'org transazionale crea completi - Il punto finale /creatable di BranchTypeController espone gli alias per-model e lo stato dei subdomini-branches del genitore-org in modo che il wizard possa aprire l'interfaccia utente
· kamo-shared-library
Aggiungi entità, cifratura e alias/DNS log ponteggio
Aggiunge per-org GoDaddy creds (AES-GCM crittografato), un permessoRootSubdomains bandiera e la raccolta di alias su baby-org sul modello di sicurezza, un provisioning DNS log audit, e un aiutante SecretCipher condiviso utilizzato da SecurityService per fare un giro memorizzate le chiavi API senza mai restituirle al frontend.
· kamo-internal
Prefix/suffix dropdowns, mailbox domain gate, stato esplicito
- Il nome prefisso e il suffisso sono ora diminuzioni popolate dal NamePrefixType / NameSuffixType cataloghi consegnati dall'org-config endpoint. Visualizza abbreviazione + nome completo per opzione. - "Provisione organizzazione e-mail casella di posta" è ora disabilitato a meno che il il dominio dell'e-mail dell'organizzazione corrisponde a uno della casella di posta verificata di org domini (puliti da GET /api/email/domini). Cancella messaggi in linea spiega se è disabilitato a causa di email mancante, non verificato domini configurati, o un errore di dominio — e nomina il reale domini configurati in modo che l'amministratore sappia cosa usare. - Lo status di membro del team non è più predefinito per PROSPECT; gli amministratori devono scegliere uno stato del ciclo di vita esplicitamente o inviare è bloccato. Sintesi pannello mostra "non impostato" fino a quando non viene scelto uno stato.
· SecurityService
Stato della squadra esplicita + nome prefisso/suffix cataloghi
- Ora torna il nome Prefissi e... nameSuffixes, fonte da NamePrefixType e NameSuffixType così il Aggiungi membro / Aggiungi moduli membri del team non devono codificarli duramente. - POST /create-team-member respinge ora una richiesta che omette teamMembershipStatus (400). Il precedente fallback silenzioso PROSPECT è andato — il chiamante deve scegliere uno stato del ciclo di vita esplicitamente così il team I membri non sono mai errati per impostazione predefinita.
· kamo-internal
Larghezza intera, tre pezzi Aggiungi layout del modulo
Reworks il modulo di creazione per utilizzare l'intera area dei contenuti invece di un Colonna centrale di 1100px. - layout reattivo 3-colonna: appiccicosa sezione sinistra nav (md+), larghezza piena modulo (sempre), pannello di sintesi dal vivo a destra (xl+). - Le righe di campo ora scalano alla larghezza disponibile: la sezione del nome è 5 su a md+, contatto + righe di ruolo salire a 4-up a xl breakpoints. - Barra d'azione inferiore appiccicosa abbraccia la larghezza piena con un suggerimento di stato e un gradiente CTA primario. - Sezione nav utilizza scroll-spy per evidenziare la sezione che l'utente è in e supporta click-to-scroll. - Stile carta lucidata — bordi morbidi, ascensore sottile hover, gradiente icone di sezione-header. - Nuova carta di riepilogo a destra rispecchia i dati del modulo in diretta (avatar iniziali, nome, nome, email, ruolo, stato chip) e mostra un Indicatore pronto-creare una volta che la convalida passa.
· kamo-register
Unisci alias/email/name/phone in un unico passaggio "My Profile"
Combinare il precedentemente separato "My E-Mail & Alias", "My Name", e "Phone Number" entra in uno step "My Profile" per 13+ registrants, con alias + e-mail + nome legale richiesto e numero di telefono opzionale (verified via SMS quando inserito). Under 13 registrants ora vedi singolo rinominato "My User Alias" passo — nessuna e-mail, nome legale, o telefono. - RegisterFlow: elenco passo semplificato, maniglia unificataValutazione, nuovi casi renderStepContent. La fase del profilo è internamente scorrevoli in modo che le tre sezioni si adattano all'interno del viewport. - RegisterStatus acquisisce un valore "REGISTERED" per il completamento under-13 dove non c'è e-mail per verificare — sono indirizzati direttamente al pagina di login con ?registered=1 invece della pagina di e-mail-verification.
· SecurityService
E-mail + nome legale facoltativo per sotto-13 iscrizioni
Il /api/security/register endpoint precedentemente respinto qualsiasi richiesta email mancante, nome o cognome. Che ha fatto il sentiero sotto-13 (KIDS ONLY orgs, o ALL AGES con un registrant sub-13) impossibile — questi account legittimamente hanno solo un alias + password + frase seme. La convalida richiede ora alias + password su ogni percorso, e tratta email + nome + cognome come triplo all-or-nothing: fornitura uno di loro richiede tutti e tre. La mail di verifica invia e il campo email di risposta ora sorvegliare se un'e-mail era in realtà fornito, e lo stato di risposta è "REGISTERED" (vs l'esistente "EMAIL VERIFICATION REQUIRED") quando non c'è e-mail da verificare.
· kamo-shared-library
Aggiunta di **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
· kamo-internal
Pagina di configurazione utente del sistema + rete ENTER AS SISTEMA MEMBER
Aggiunge Platform Administration → Configurazione, un solo genitore-org-proprietario pagina che concede o revoca il permesso di impersonare la piattaforma Utente di sistema per dipartimento, titolo di lavoro o singolo membro del team. Registrato in tutte e tre le posizioni nav (settings page tile list, ImpostazioniStatusWindow percorsi + sub-topi, e la pagina stessa). Aggiornamenti /network per utilizzare il nuovo /api/security/enter-as endpoint per il pulsante ENTER esistente, quindi il dominio di destinazione riceve una sessione costruito dal membro del target org (fissando il bug dove la sorgente org's memberID/orgID trapelato nella nuova sessione). Aggiunge un ENTER AS SYSTEM MEMBER pulsante accanto a ENTER che rende solo dopo E' il momento giusto. conferma che il chiamante è idoneo.
· SecurityService
Backfill, flusso enter-as, guardie di mutazione, config API
Self-heal provisioning: SystemUserBackfillService funziona su ogni Stivale SecurityService (da DataLoader) per aggiungere la colonna is system user e system user access tavolo se mancante, assicurarsi il sistema singleton Esiste un record utente e crea un TeamMember amministratore-rolo in ogni non-top-level org a cui non appartiene già. Funziona anche creareTempo di organizzazione in modo che i nuovi org ottenere un membro dell'utente di sistema immediatamente piuttosto che aspettare il prossimo riavvio. Cross-org entra flusso: sostituisce il vecchio /api/generate-otk hand-off (che ha trapelato la sessione source-org del chiamante al dominio di destinazione) con /api/security/enter-as. Il nuovo endpoint costruisce un nuovo ** destinato a il membro effettivo dell'org, quindi i diritti associati/ID/orgID corrispondono sempre l'org è entrato. Aggiunge un campo SUDO MEMBER ID per sessione JSON che System User impersonation porta il membro dell'operatore umanoId per l'attribuzione di audit. Guards: SystemUserGuard rifiuta qualsiasi mutazione basata sulle API al sistema Registrazione dell'utente o di uno qualsiasi dei suoi membri (collegato a MemberController, Membro della Commissione. Nasconde il Utente di sistema da GetMembersAndSubscribers, ottenereTeamMembersAndContractors, e ottenereMembersByDepartment endpoints così inquilini mai vedere in liste. Superficie di configurazione: SystemUserConfigController espone CRUD sulla sovvenzione tavolo solo per i proprietari di top-level-org, e SystemUserCapabilityController restituisce un boolean la pagina /network utilizza per decidere se rendere Eseguire il tasto MEMBER.
· kamo-shared-library
Aggiungi System User flag + access-grant entità
Presenta il modello System User a livello di piattaforma: una bandiera User.isSystemUser (indice parziale unico applica un singoloton), più una tabella SystemUserAccess che registra quali reparti di alto livello, titoli di lavoro o membri del team può impersonare l'Utente del Sistema per entrare in bambini. Le righe di accesso sono piattaforma-internal (non RoleRightType) in modo da rimanere fuori superficie dei diritti inquilini.
· kamo-register
Aggiungi la verifica del telefono + le fasi delle domande di sicurezza
Inserisci due nuovi passaggi tra Password e Account Recovery per 13+ registrants: un passaggio numero di telefono (opzionale, skippable, con codice SMS verifica) e una fase di domande di sicurezza (richiesto, 3 distinta domande con risposte). Under 13 registrants continuano a saltare entrambi e contare sulla loro frase di seme per il recupero. - FormPhoneNumero: idle -> enter-code -> macchina di stato verificata, per-step Capcha widget gating SMS inviare, cambiare-numero e saltare i percorsi. - FormSecurityQuestions: 3 dropdowns + risposte, unicità applicata, catalogo preso dal nuovo pubblico backend endpoint. - RegisterFlow: nuovo moduloData campi, passi condizionali, manigliaNext convalida, telefono + sicurezzaQuestioni cablate nel corpo di presentazione. - /api / proxy di sicurezza ora inoltra X-Forwarded-Host così il backend può risolvere l'org per la selezione dei provider SMS.
· SecurityService
Raccogli telefono + domande di sicurezza durante la registrazione
Spostare il numero di telefono e la raccolta di domande di sicurezza nel self-service flusso di registrazione (dove erano originariamente destinati) piuttosto che richiedendo una pagina delle impostazioni post-iscrizione. - Nuova RegistrazionePhoneService: genera/verifica i codici SMS a 6 cifre tramite BulkTextSmsClient, 10 minuti TTL, 5-per-ora limite di velocità per numero. - RegistrazioneServizio accetta ora un record RegistrazioneParams con facoltativo verificato Telefono e un elenco di domande di sicurezza a 3 entrate; domande di sicurezza sono bcrypt-hashed con la regola di risposta-normalizzazione esistente. - /api/security/register accetta E' una cosa che non va. sostiene il telefono verificato contro il codice prima di insistere l'Utente. - Nuovi endpoint pubblici POST /register/phone/initiate (Capcha-gated), POST /Registrati/phone/verificare, e GET ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
· kamo-shared-library
Aggiungi RegistrazionePhoneCode entità + repository
Nuova tabella `registration phone codes` memorizza i codici di verifica SMS una tantum rilasciato durante la registrazione self-service, prima che un'entità utente esista. Tenuto separato da AccountVerificationCode per evitare di portare un NULL userId su quel tavolo.
· kamo-internal
Aggiungi membri / Aggiungi pagine del Team Member
- /account: sostituire singolo pulsante ambiguo con pulsanti a schede Aggiungi <Member> sulla scheda Membri, Aggiungi <Team Member> sulla scheda Membri del Team. Ogni pulsante si dirige verso una pagina dedicata creare invece del vecchio rotto fall-through alla vista dei dettagli del membro. - Nuovi /settings/member/new e/settings/team-member/new pages, entrambi sostenuto da un MemberCreateForm condiviso con un prop "variante". - Il modulo è un layout a singola pagina (nome, identità, contatto, org mailbox, ruolo/locazione solo di squadra, recensione). Live user-lookup on email e nome utente avverte quando un utente già esiste o è già collegato come membro in questo org. - Honors the org's AgeReqType: se il requisito consente agli utenti di meno di 13, campi email personali e organizzativi sono nascosti e il nome utente diventa l'identificatore primario. - La casella di controllo "Provisione organizzazione mailbox" crea la mailbox via EmailService e lo assegna come casella di posta primaria del membro. - Scheda profilo su /settings/member/[id] ora include Work Location, Team Stato membro e titolo ufficiale di lavoro per i record TeamMember, cablato al punto finale PUT /api/security/members/{id} esistente.
· SecurityService
Aggiungi il flusso di creazione del Team Member
- Il nuovo MemberCreateController espone: ****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** Traduzione: * POST /api/security/members/create — creare membro nell'org del chiamante ******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************* dipartimento / titolo di lavoro / luogo di lavoro / stato di appartenenza / livello di sicurezza - Riutilizza un utente esistente quando l'e-mail o il nome utente corrisponde già; altrimenti crea un nuovo utente e invia il modello EMAIL VERIFICATION. BENVENUTO modello viene sempre inviato sulla creazione. - Per org il cui AgeReqType consente agli utenti sotto i 13 anni, la raccolta di e-mail è saltato e il nome utente diventa l'identificatore primario. - Estende GET /members/{id} per restituire la posizione + teamMembershipStatus + isOrganizationOwner per TeamMembers, e PUT per persistere la posizione, teamMembershipStatus e jobTitleOfficial quando il record è un TeamMember. - Assegnazione del ruolo di default + materializzazione dei diritti delegato a MemberService così ogni nuovo membro atterra con i loro diritti efficaci già applicati. - Fix EntitlementService: boolean getter è stato scritto getIsOrganization Proprietario (Lombok genera isOrganizationOwner per i campi booleani primitivi).
· kamo-shared-library
Aggiungi AgeReqType.allowsUnder13() helper
Utilizzato da Add Member / Aggiungi flusso membro del team per saltare la raccolta e-mail per org il cui requisito di età consente agli utenti di età inferiore a 13 (ALL AGES, KIDS ONLY, ALL COPPA GRADS).
· kamo-internal
Ricostruire i membri Piani e Fatturazione attorno a Billing Groups
- La scheda Plans & Billing è ora allineata a destra con un bagliore pulsante e un'icona StarRate sulla barra delle schede. Visibile quando il membro visualizzato è O l'utente sottoscritto possiede l'org. Contenuto diviso in quattro sottotitoli: Abbonamenti, Fatture, Informazioni di pagamento, Gestisci Gruppo. Selezione gruppo di fatturazione a discesa + "Add Billing Group" icona pulsante live a destra della barra subtab; la selezione del gruppo guida ogni pannello. - Pannello abbonamenti mostra una carta per mercato attivo (FREE DEFAULT) KamoCRM sempre presente), con cambiare piano / annullare / riattivare e un griglia di assegnazione della licenza. Funzionalità di disattivazione automatica prioritaria lato server sulla riduzione del sedile. - Il pannello Info di pagamento avvolge Stripe Elements via StripeProvider + a Refactored PaymentMethodForm che si collega a un gruppo di fatturazione (non il vecchio cliente di livello org). - Gestire il gruppo modifica il titolo / contatto di fatturazione / autorizzazioni dei membri (Licensee, Group Plan Manager, canManageSubscription, canManageBilling) e aggiunge/rimuove i membri. Il gruppo di default è in sola lettura — il suo roster è implicito (tutti non in un gruppo esplicito), e nessun titolo o le modifiche del permesso sono consentite. - /settings/account?tab=billing cancellato outright. BillingManager + PlanCalculator rimosso. Collegamenti ovunque aggiornati al nuovo membro Piani & fatturazione scheda. - ImpostazioniStatusWindow + /settings atterraggio nav entrambi pruned (tre-way sincronizzazione per la regola nav-sync). - BranchSetupManager ottiene una nuova sezione "Commerce Markets" all'interno del editor di modelli di sicurezza, utilizzando il nuovo SecurityModelMarketController a aggancio/detach SUBSCRIPTION mercati con per-scope Public/Member/ Squadra-Membri. - No, no. riscritto per mostrare per-org Billing Gruppi + abbonamenti per gruppo + MRR. /settings/platform/events and /settings/platform/plans diventano pagine segnaposto (il loro vecchio contenuto sono andati con il taglio pulito-slate). - Nuovi proxy API: /api/security/entitlements e E' il momento giusto. Nuovo usoAccoppiamento consuma SecurityService EntitlementService per la registrazione delle funzionalità UI. File di consumo legacy (StatsManager, FeaturesManager, BranchSetupManager) trasportare @ts-nocheck fino a quando il loro abbonamento il codice gating viene rielaborato sull'usoEntitlements.
· SecurityService
Aggiungi EntitlementService + SicurezzaModel Mercati di commercio
- EntitlementService computes per-member caratteristiche sovvenzioni mediante unione attiva Caratteristiche del piano BillingGroupLicense + KamoCRM Baseline di livello libero. Caches Proiezioni di 15 minuti in Redis chiave su membroId. - ammissione InvalidationListener si iscrive al kamo.entitlements.invalidate Canale Redis (MEMBER:/GROUP:/ORG: payloads) così propagare immediatamente. - EntitlementController a /api/security/entitlements espone /me, E un'invalidazione della cache. - SecurityModelMarketController a... attacca/detaches CommerceMarkets a un ChildOrgSecurityModel e capovolge il Pubblico / Membro / Team-Member campo booleans.
· BillingService
Riscrivere BillingService attorno a BillingGroups
Elimina il livello di org. controllori, servizi e DTO. Introduce: - Gruppi di montaggio BillingGroupController, membri, abbonamenti, licenze, metodi di pagamento e fatture sotto /api/billing/groups. - BillingGroupService (lifecycle + Default Group + Free baseline), BillingGroupMemberService (applicazione di un gruppo per membro), BillingGroupSubscriptionService (Stripe sync with fallback to FREE DEFAULT E' una cosa da fare. Servizio fatturazione, LicenseService (priorità di disattivazione automatica + riattivazione inversa). - PlanCatalogService + PlanCatalogController a ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** - StripeWebhookServizio che consuma abbonamento / fattura / eventi di pagamento-metodo. - EntitlementInvalidator che pubblica segnali di invalidazione Redis. - PlatformAdminService + PlatformAdminController di ritorno per-org roll-up.

Il tuo universo ti sta aspettando.
Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.
Gratis per sempre — nessuna carta di credito richiesta