Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-internal
Disponibilità di cavi Fornitore in PresenceWrapper
· kamo-internal
Aggiungi usoAvailabilityWebSocket gancio e disponibilitàContext
· SecurityService
Auto-imposta la disponibilità dei membri DISPONIBILE sul login, AWAY su logout
· MediaService
Aggiungi il relè NATS→STOMP per lo stato di disponibilità dei membri
· SecurityService
Aggiornare la disponibilità endpoints per utilizzare MemberAvailability Stato enum
· SecurityService
Aggiungi Disponibilità Editore per gli aggiornamenti dello stato membro
· InitializerService
Migrate member.is disponibilità status enum
· kamo-shared-library
Sostituire èAvailable boolean con MemberAvailability Stato enum
· kamo-asterisk-support
Enrich upload manifests with Asterisk CDR caller-ID data
Adds optional MySQL CDR enrichment so the softphone history tab can display who called (or was called). When ASTERISK_CDR_DSN is configured as a Forgejo repo secret, the helper: - Queries asteriskcdrdb.cdr for the call's uniqueId before uploading - Parses CLID into callerIdNum and callerIdName - Derives call direction (inbound/outbound) from src/dst vs extension - Includes a cdr{} block in the upload manifest CDR enrichment is opt-in and gracefully degraded: if the DSN is absent or the lookup fails, uploads proceed without caller-ID (existing behaviour). Adds go-sql-driver/mysql v1.7.1; Dockerfile runs go mod tidy to populate go.sum during the Docker build so no local Go installation is needed.
· ConversionService
Parse CDR caller-ID fields from upload manifest
When kamo-asterisk-support includes a cdr{} section in the upload manifest (populated when ASTERISK_CDR_DSN is configured), ConversionService extracts callerIdNum, callerIdName, callDirection, and disposition and passes them through RecordingMetadata so the Recording row is stored with full caller-ID context.
· InitializerService
Add CDR caller-ID columns to recordings table (order 40)
Adds caller_id_num, caller_id_name, call_direction, and call_result columns to the recordings table so the softphone history tab can display who called without relying on the FreePBX CDR pipeline being available.
· kamo-shared-library
Add CDR caller-ID fields to Recording entity
Adds callerIdNum, callerIdName, callDirection, and callResult columns to the Recording entity so kamo-asterisk-support can store Asterisk CDR metadata alongside the audio file. RecordingMetadata gains matching fields; a backwards-compatible constructor lets existing callers pass null for all four without change.
· kamo-internal
Add COMP payment method option to subscription order wizard
COMP is a valid backend PaymentMethod enum value for complimentary platform-admin grants, but was missing from the frontend type and wizard UI — only INVOICE and AUTO_BILL were offered. Added COMP to the SubscriptionPaymentMethod union and exposed it as a radio option.
· kamo-internal
Show platform kamocrm domain on custom domain entry
Surface the active *.kamocrm.com hostname on the add-domain flow and detect custom domains by excluding kamocrm URLs instead of default-flag alone.
· kamo-internal
Mostra Gestisci pulsante Domain per i proprietari di org di livello superiore e i membri del sistema
· kamo-internal
Mostra Impostare il pulsante di fatturazione per i proprietari di org senza account
Quando un proprietario org apre la scheda di fatturazione piani e nessun account di fatturazione esistere, visualizzare un prompt bootstrap invece del generico "contatta il tuo messaggio del proprietario org. Il pulsante chiama POST /api/security/account/ boottrap-billing (idempotent) poi ricarica i conti sul successo.
· SecurityService
Aggiungi il punto finale di boottrap-billing per le org preesistenti
# POST # attiva lo stesso configurazione idempotent come gancio di creazione sub-org (BillingSetupService .setupForSubOrgCreation) ma può essere chiamato on-demand da un proprietario org. Questo gestisce og che sono stati creati prima del refattore di fatturazione e quindi non ha mai ricevuto un Account + AccountSubscription.
· kamo-internal
Onda 3 conversioni, correzione fallback e auto-traslato CI
- Sostituire tutte le stringhe inglese con t() chiamate attraverso l'onda 3 componenti (chat, clubhouse, supporto, note, pipeline, lead, nav, ecc.) - Unisci onda 3 frammenti in messaggi/en.json (+19 chiavi) - Fissare i valori segnaposto della sezione iniziale in en.json (welcome, slogan, testo del piè di pagina, contiDesc/networkDesc ICU interpolazione) - Fissare il testo di benvenuto mobile in page.tsx per usare t() invece di stringhe hardcoded - Fix request.ts: deep-merge inglese come base per tutti i file locali così i file locali mancanti (pre-translate-CI) servono l'inglese invece di schiantarsi, e le località parzialmente traslate ricadono in inglese per le chiavi mancanti - Aggiornamento ************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************ tradurre-e-rebuild pattern: distribuzione iniziale → → commettere file locali → ricostruire l'immagine con le traduzioni → redeploy
· kamo-register
Luogo soprannome in linea dopo il suffisso nome sulla riga di nome legale
· kamo-internal
Filo successivo con Member.language come fonte locale
Aggiunge l'internazionalizzazione basata sull'intl su kamo-internal senza URL prefissi locali. Il locale attivo viene letto dal cookie kamo-locale, che rispecchia la preferenza "lingua" del membro autenticato (impostata tramite la Scheda Regionale Impostazioni in... Infrastrutture: - i18n/locales.ts, i18n/request.ts: 22 locali supportati corrispondenti a kamo-marketing - /api/i18n/set-locale: scrive il cookie kamo-locale - LocaleBootstrap: sincronizza cookie a Member.language sul primo carico autenticato - I18nProviders: applica il core MUI, x-data-grid, x-date-pickers locali e date-fns adattatore locale alla lingua attiva - useFormatters: locale-aware data / numero / per cento / relativo-time helpers - Impostazioni regionali MyAccountTab salvare: scrive il cookie + router.refresh() quando l'utente cambia la propria lingua - script/translate.ts: traduzione delta di build-time contro TranslateService (modello dei mirrori kamo-marketing) - scripts/merge-fragments.ts, **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** aggregare frammenti chiave per area in messaggi/en.json Copertura: - messaggi/en.json seminati con comune comune.*, nav.*, auth.* chiavi più estrazione iniziale attraverso ~67 pagine e componenti (dashboard, lead, commercio, impostazioni, account, contatti, impostazioni/caratteristiche, impostazioni/membro, componenti/setting, componenti/tools/ai-chat, ecc.). Molte funzioni superfici ancora bisogno di passaggi di estrazione di follow-up.
· VOIPService
Fall back to imaging recordings for call history + voicemails
FreePBX 17 doesn't expose voicemail messages over REST or GraphQL on this install (the GraphQL voiceMail type returns mailbox config, not messages, and /admin/api/api/rest/voicemail 404s), and Asterisk's CDR pipeline is also non-functional here (ODBC DSN misconfig handled separately in KlusterServices). Without these the softphone tabs render empty even when call/VM recordings exist on the imaging side. When provider.getCallHistory or provider.getVoicemails returns nothing, fall back to listing rows from the kamo.recordings table scoped by (providerInstanceId, extension, isVm). Caller-ID metadata isn't carried on Recording today so we leave from/fromNumber blank — the row still plays back through the media-player tool via recordingId. Archive filtering is preserved across both paths so a row archived via the cache stays hidden in the fallback too.
· kamo-shared-library
Paginated Recording lookup by (instance, extension, isVm)
Used by the softphone tabs as the canonical source of truth for call recordings and voicemails when the upstream provider can't list them — e.g. FreePBX 17 has no REST/GraphQL voicemail-message API, and on this install Asterisk's CDR pipeline is also broken (separate ODBC misconfig fix in KlusterServices).
· SecurityService
Auto-provisione sede KamoCRM sulla creazione sub-org; endpoint promo-billing-proprietario
EntitlementService walk SubscriptionMember (non AccountMember) per calcolare i diritti dei membri — l'unione di caratteristiche tra sottotitoli attivi, più la linea di base libera. L'ascoltatore Redis ottiene una SUBSCRIPTION: il maneggiatore di assunzione. Il nuovo servizio BillingSetup funziona in due flussi: - createOrganization (sub-org sotto KamoCRM): auto-crea un KamoCRM-org Membro del creatore se assente, trova o crea un account KamoCRM con tale Membro come primario, apre un Account Free-tierSubscription mirando al nuovo sub-org, e pone il creatore come licenziatario + sub-manager. - Cosa? fuori un fresco KamoCRM Account/sub per un membro di un sub-org esistente, facoltativamente Trasferire licenze di nome. Solo proprietario di Org. AccountController rotte cadere èLicensee / canManageSubscription da payload dei clienti a livello di account — queste bandiere ora vivono su SubscriptionMember.
· InitializerService
Aggiungi la lingua dei membri + colonne di default valuta
Aggiunge due colonne NON NULL alla tabella dei membri che supporta il nuovo Membro.language (VARCHAR DEFAULT 'ENGLISH') e Member.defaultCurrency (VARCHAR(10) DEFAULT 'USD') campi. Le righe esistenti sono riempite al di default in modo che il limite NULL NON sia soddisfatto senza un downtime finestra.
· kamo-register
Aggiungi passo lingua, paese timezone picker, scorrimento + *** correzioni
- Nuovo passo 'My Language' prepenso al mago, specchiando il paese Il layout del passo. Elenca i 22 locali supportati dal marketing come piastrelle di bandiera con nome nativo + inglese tooltip; pre-selects da navigator.languages. - Passo 'My Country' ora raccoglie un fuso orario accanto al paese, predefinito e modificabile prima. Il prossimo. Entrambi i campi sono tenuti ad avanzare. - L'organismo di registrazione invia ora la lingua/zona temporale (più il paese esistente) al punto finale /Registrati quindi sono perseverati sul nuovo Membro. - Fisso: il contenuto delle fasi delle domande di sicurezza può ora scorrere verticalmente — il passo è stato l'unico senza un contenitore troppo pieno, così lunghi cataloghi ha spinto la terza domanda fuori schermo. - Fisso: il pulsante Fine non rimane più disabilitato quando *** auto-verifica prima che il nostro ascoltatore si allega. Sostituito il set 100ms attacco poll-until-mounted che scarica anche lo stato attuale del widget su attacca per ascoltatori tardi.
· kamo-internal
Aggiungi lingua + valuta predefinita alla scheda Impostazioni regionali
La scheda Impostazioni regionali del profilo dei membri ora espone la lingua modificabile (22 locali supportati che rispecchiano il sito di marketing) e la valuta predefinita (Ricercabile Autocompleto) accanto a Timezone. Tutti e tre salvano insieme via PUT /api/security/members/{id}. La modalità di visualizzazione mostra il nome della lingua madre con l'inglese tra parentesi, più il simbolo di valuta e il nome completo.
· SecurityService
Persist lingua/timezone/valuta/iscrizione
L'endpoint /Registrati accetta ora lingua, fuso orario e defaultCurrency accanto al campo di campagna esistente. Servizio di registrazione imposta paese e fuso orario sul nuovo Utente e applica tutti e quattro i campi regionali Membro appena creato, derivando la valuta predefinita dal paese mappatura primariaCurrency quando uno non viene fornito (e rientrando in USD).
· kamo-shared-library
Map external customer address blocks into AccountAddress on pull
Add AdapterAddressMapper helper that converts a JSON address node from any provider into an EmbAddress and attaches it to an Account as a typed AccountAddress (SHIPPING/BILLING). Wire the helper into the four adapters whose customer endpoints expose address blocks: - ShopifyCustomerAdapter: default_address goes to both shipping+billing, remaining addresses[] become shipping records - WooCommerceCustomerAdapter: billing block -> BILLING, shipping block -> SHIPPING - BigCommerceCustomerAdapter: addresses[] split by address_type field - MagentoCustomerAdapter: addresses[] split by **************** ids Adapters with no address data in their customer payloads (Ecwid, Wix, Shift4Shop, PrestaShop, OpenCart, Squarespace) continue to compile unchanged.
· kamo-internal
/account/new copy-from-lead UX, campi di nome completo, telefoni dual, indirizzo; gestione dell'indirizzo a livello di account
Frontend: - /account/new: per sezione "Copy from Lead" pulsanti + intestazione "Copy all from Lead" pulsante (quando leadId param) - Nome sezione: prefisso, primo, medio, ultimo, suffisso - Doppi telefoni (personale + lavoro) con estensione e "Allow text" - Sezione Indirizzo utilizzando la forma di EmbAddress (linea1, dettagli, città, suddivisione, postale, paese) con "Usa come fatturazione troppo" toggle (default on) - Inserisci il nome nidiato/email/phoneNumeri payload corrispondenti backend - accountApi: digitato AccountName, AccountPhoneNumeri, AccountAddress; nuovi metodi: getAddresses, addAddress, updateAddress, deleteAddress, setPrimaryAddress - AccountViewClient: rendere l'indirizzo di spedizione primario da nuovi indirizzi
· SecurityService
Supporto nome/email/phoneNumeri + endpoint gestione indirizzi
- AccountController accetta il nome/email/phoneNumbers JSON su POST/PUT - L'indirizzo iniziale su POST crea SHIPPING (e BILLING quando si utilizza AsBillingToo set), imposta puntatori primari - Aggiungi 5 endpoint indirizzo: GET, POST, PUT, DELETE address; PUT /addresses/{id}/primary - Riepilogo dell'account/detta espongono l'oggetto del nome, telefonoNumbers oggetto, spedizione / elenco degli indirizzi di vendita, puntatori primari - Riferimenti sul campo delle note a livello di account (Account.notes è stato rimosso prima)

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