Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
Disponibilidade de Fios Provedor em PresidenceWrapper
· kamo-internal
Adicionar usoDisponibilidadeWebSocket gancho e DisponibilidadeContexto
· SecurityService
Auto-set member disponibilidade DISPONÍVEL no login, AWAY no logout
· MediaService
Adicionar relé NATS→STOMP para status de disponibilidade de membros
· SecurityService
Atualizar os parâmetros de disponibilidade para usar a disponibilidade de membros Enumidade do estado
· SecurityService
Adicionar AvailabilityPublisher para atualizações de status de membro
· InitializerService
Migrar membros.is disponível para disponibilidade status enum
· kamo-shared-library
Substituir é disponível booleano com funcionalidade de membro Enumidade do estado
· 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
Mostrar o botão Gerenciar o Domínio para proprietários de orgs de topo e membros do sistema
· kamo-internal
Mostrar o botão Configurar a Conta para os proprietários de orgs sem conta
Quando um proprietário de org abre a aba de faturamento de planos e nenhuma conta de faturamento existe, exibir um prompt bootstrap em vez do genérico "contate seu Mensagem do proprietário de org. O botão chama POST /api/segurança/conta/ bootstrap-billing (idempotente) então recarrega contas sobre o sucesso.
· SecurityService
Adicionar ponto final inicial para orgs pré-existentes
* ******************************* dispara o mesmo configuração idempotent como o gancho de criação sub-org (BillingSetupService .setupForSubOrgCreation) mas pode ser chamado sob demanda por um proprietário de org. Isto manipula orgs que foram criados antes do refator de faturamento e Portanto, nunca recebeu uma Conta + Assinatura de Conta.
· kamo-internal
Onda 3 conversões, correção de retrocesso e auto-traduzir CI
- Substituir todas as strings em inglês codificadas com t() chamadas através da onda 3 componentes (chat, clubhouse, suporte, notas, pipeline, leads, nav, etc.) - Mesclar 3 fragmentos de onda em mensagens/pt.json (+19 teclas) - Corrigir os valores de placeholder da seção home em en.json (bem-vindo, tagline, texto do rodapé, contasDesc/redeInterpolação da UTI - Corrigir texto de boas-vindas móvel em page.tsx para usar t() em vez de strings codificadas - Corrigir request.ts: profunda fusão Inglês como base para todos os arquivos locais assim arquivos locais ausentes (pré-traduzir-CI) servem Inglês em vez de bater, e locais parcialmente traduzidos voltar para o inglês para chaves faltando - Actualização... Translate-and-rebuild padrão: implantação inicial → TranslateService port-forward → commit locale files → reconstruir a imagem com traduções → redeploy
· kamo-register
Colocar o apelido em linha após o sufixo do nome na linha do nome legal
· kamo-internal
Fio next-intl com member.language como locale source
Adiciona internacionalização baseada no próximo intl através do kamo-internal sem URL prefixos locais. Ativo locale é lido do cookie kamo-locale, que espelha a preferência “língua” do membro autenticado Cartão de configuração regional em... Infra-estruturas: - i18n/locales.ts, i18n/request.ts: 22 locais suportados que correspondem ao kamo-marketing - /api/i18n/set-locale: escreve o cookie kamo-locale - LocaleBootstrap: sincroniza cookie para Member.language na primeira carga autenticada - I18nProviders: aplica MUI core, x-data-grid, x-date-pickers locais e local do adaptador date-fns para a língua ativa - useFormatters: data / número / percentagem / assistentes de tempo relativo - Configurações Regionais do MyAccountTab salvar: escreve o cookie + roteador.refresh() quando o usuário muda seu próprio idioma - scripts/translate.ts: build-time tradução delta contra TranslateService (espelhos padrão kamo-marketing) - guiões/fragmentos de fusão. agregando fragmentos de chave por área em mensagens/en.json Cobertura: - mensagens/pt.json semeadas com chaves comuns partilhadas.*, nav.*, auth.* plus extração inicial em ~67 páginas e componentes (painel, leads, comércio, configurações, conta, contatos, configurações/caracteres, configurações/membro, componentes/conjuntos, componentes/ferramentas/ai-chat, etc.). Muitos recursos As superfícies ainda precisam de passes de extracção.
· 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-fornecimento assento KamoCRM na criação sub-org; promover-billing-proprietário endpoint
DireitoService walks SubscriptionMember (not AccountMember) to comput Direitos dos membros — a união de características entre os subs activos do licenciado, mais a linha de base gratuita. O ouvinte Redis ganha uma SUBSCRIÇÃO:<uid> manipulador. Novo BillingSetupService é executado em dois fluxos: - createOrganização (sub-org sob KamoCRM): cria automaticamente um KamoCRM-org Membro do criador se estiver ausente, encontra ou cria uma Conta KamoCRM com esse Membro como primário, abre uma Conta de Nível LivreAssinatura visando o novo sub-org, e assentos do criador como licenciado + sub-manager. - Post ************************* esculpe um fresco KamoCRM Conta/sub para um membro de um sub-org existente, opcionalmente transferência de licenciados nomeados. Só para proprietários de org. AccountController routes drop isLicense / canManageAsscriction from the carga útil do cliente ao nível da conta — essas bandeiras agora vivem na assinaturaMembro.
· InitializerService
Adicionar idioma de membro + colunas padrão moeda
Adiciona duas colunas NÃO NULL à tabela de membros que suporta o novo Membro da Comissão Europeia (VARCAR DEFAULT «ENGLISH») e membro da Comissão (VARCHAR(10) DEFAULT 'USD') campos. As linhas existentes são recheadas padrão assim que a restrição NOT NULL é satisfeita sem um tempo de inatividade Janela.
· kamo-register
Adicionar passo de idioma, país selecionador de fuso horário, rolagem + *** correções
- Novo passo 'My Language' para o feiticeiro, espelhando o país layout do passo. Lista os 22 locais suportados pelo marketing como azulejos de bandeira com nome nativo + dica de Inglês; pré-seleciona de navigator.languages. - 'Meu País' passo agora coleta um fuso horário ao lado do país, padrão e editável antes Próximo. Ambos os campos são obrigados a avançar. - O organismo de registo envia agora a língua/ fuso horário (mais o país existente) para o endpoint /register para que eles persistam no novo Membro. - Corrigir: Perguntas de segurança O conteúdo do passo agora pode rolar verticalmente — o passo foi o único sem um recipiente transbordar, tão longos catálogos Expulsou a terceira pergunta para fora da tela. - Corrigir: O botão Terminar já não fica desativado quando *** verifica automaticamente Antes que o nosso ouvinte se prenda. Substituido o set 100msTimeout corrida por um anexar enquete- até- montado que também drena o estado atual do widget em Anexar para ouvintes atrasados.
· kamo-internal
Adicionar idioma + moeda padrão ao cartão Regional Settings
O cartão de configuração regional do perfil de membros agora expõe linguagem editável (22 locais apoiados espelhando o site de marketing) e Moeda Padrão (Procurada Autocompleta) ao lado do fuso horário. Todos os três salvar juntos via Coloque /api/segurança/membros/{id}. O modo de visualização mostra o nome do idioma nativo com o inglês entre parênteses, além do símbolo da moeda e nome completo.
· SecurityService
Persista idioma membro / fuso horário / moeda na inscrição
O endpoint /register agora aceita idioma, fuso horário e moeda padrão Ao lado do campo do país existente. RegistoServiço define país e fuso horário no novo usuário e aplica todos os quatro campos regionais ao Recém-criado Membro, derivando da moeda por defeito do país mapeamento primário da moeda quando um não é fornecido (e caindo para o 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
/conta/nova cópia-de-lead UX, campos de nome completo, telefones duplos, endereço; gerenciamento de endereço de nível de conta
Interface: - /account/new: por seção "Copiar de Lead" botões + cabeçalho "Copiar tudo de Lead" botão (quando leadId param) - Secção de nome: prefixo, primeiro, meio, último, sufixo - Telefones duplos (pessoal + trabalho) com extensão e comutar "Permitir texto" - Seção de endereço usando forma EmbAddress (linha1, detalhes, cidade, subdivisão, postal, país) com "Usar como faturamento também" alternar (por omissão) - Enviar nome aninhado/e-mail/números de telefone - accountsApi: typed AccountName, AccountPhoneNumbers, AccountAddress; novos métodos: getAddress, addAddress, updateAddress, deleteAddress, setPrimaryAddress - AccountViewClient: renderize o endereço de envio primário do novo array de endereços
· SecurityService
Suporte aninhado nome/email/foneNúmeros + endpoints de gerenciamento de endereços
- AccountController aceita nome aninhado/email/números de telefone JSON no POST/PUT - O endereço inicial no POST cria Shipping (e BILLING quando usadoAsBillingToo set), define ponteiros primários - Adicionar 5 endpoints de endereço: GET, POST, PUT, DELETE address; PUT /Addresses/{id}/primary - Resumo da conta/detalhes expor objeto de nome, telefoneProjecto de números, listas de endereços de envio/billing, ponteiros primários - Soltar referências de campos de notas de nível de conta (Account.notes foi removida anteriormente)

Seu universo está esperando.
Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.
Gratuito para sempre — não é necessário cartão de crédito