Páginas Ativas e Vazios no diretório org da plataforma
A aba Organizações do console agora se divide em sub-tabs Ativos e Void. A organização nula é orgs.is active = FALSE (definido pelo vazio do SecurityService end...
A taxa de inicialização de um plano, e a oferta ao vivo, no fio
PlanDto transportava apenas a taxa recorrente, de modo que cada superfície citando um plano citou um preço cliente não seria cobrado: a taxa de inicialização do...
Um ponto final atrás da página do próprio plano do cliente
GET /api/billing/self/plan responde tudo /myplan renders: o plano, o que o organização pode realmente usar, o catálogo para comparar, assentos e sua lista, arma...
Bill a taxa de inicialização em ambas as rotas para um plano, e registrar termos negociados
Duas rotas alcançam o mesmo plano e apenas uma delas iria cobrar o novo Taxa de arranque por assento. Uma encomenda escrita através do serviço de assinatura, qu...
Fechem todas as buscas e executem duas cápsulas
BillingService correu um pod e suas sete varreduras programadas estavam corretas apenas por causa dele. Ali. é nenhum ShedLock em qualquer lugar nesta plataform...
Servir a oferta de corrida, e dizer se um assento é realmente PAID para
Adiciona GET /markets/{id}/promoção. Não havia nenhuma maneira de uma superfície de compra no aplicativo para saber que uma oferta estava em andamento — o site ...
Contar o prazo de três anos, e citar a sua taxa para o console
BillingCycles ganha TRIENNIAL, expresso à Stripe como três ANOS em vez de trinta e seis meses para que a renovação acompanhe o aniversário de inscrição — a mesm...
Linhas por servidor no resumo das extensões
A aba extensões do servidor de telefone mostrou a figura de organização e nada mais, então um servidor KamoPBX vazio exibiu "21 extensões billable - $63.00 / mê...
Recusar a subscrição da Enterprise
A Enterprise está negociada. Esconder o preço é apresentação; esta é a limite. Um pedido que nomeie o plano Enterprise é recusado, a menos que o chamador porçõe...
Bill telefone serviço pela extensão
PreçosModelo.PER EXTENSÃO, sua própria chave de quantidade reservada, um alocador, um reconciliador noturno, um portão de remoção e a API sumária - o gêmeo do t...
Bill e-mail por caixa de correio, reconciliado durante a noite
Quantidade é computada pelo servidor sob uma chave reservada que um corpo de pedido não pode alcançar, e empurrado através do caminho emenda existente — assim S...
Fazer um evento Stripe repetido um no-op
Adiciona BillingWebhookEventClaimService em seu próprio feijão, com REQUIRES NOVO em todos os métodos, e fios-lo em processoEvento à frente do interruptor de de...
Publicar a conversão paga para organizações rastreadas
Ambos os caminhos que selo BillingSourceType.PAID agora publicar marketing.visitor.pay, porque gancho apenas um silenciosamente perde metade do tráfego — Accoun...
Decida o acesso à plataforma com o resolvedor compartilhado
@PlatformAdminSomente agora nomeia a plataforma certa que ela requer (por omissão para GESTÃO ORGANIZAÇÕES, que é sobre o que é a superfície da plataforma deste...
Transportar a data de renovação da cobertura e das cargas úteis do grupo
Ambas as superfícies agora reportam o PeriodEnd atual e o cancelamentoAtPeriodEnd. A data é o que uma confirmação de cancelamento realmente precisa dizer — "voc...
Um plano por organização, um teto de 25 lugares Enterprise, e uma maneira de parar de pagar
O plano é agora uma decisão de nível de organização e nada mais pode sobrepujá-lo. Deixar um auto-pagador ou um gerente de grupo escolher suas próprias leituras...
Deixe o plano de um grupo ser cancelado, e pare de pagar em dobro por uma pessoa
Três lacunas no último envio: Um grupo com um plano nunca poderia ser removido. delete () recusa enquanto um live assinatura existe — correto, uma vez que a li...
Fazer os grupos de faturamento trabalhar fim a fim, e parar de cobrar auto-pagamento por nada
Um grupo agora pode reunir pessoas, comprar um plano no cartão de seu próprio gerente, e mão Os seus lugares fora. Nada disso existia: as únicas operações foram...
Diga às pessoas que o seu pagamento falhou, e manter a assinatura para baixo
O dunning que não existia. failure.payment failed escreveu uma linha e retornou: nenhum email, nenhuma bandeira, nenhuma alteração de estado, e billing.email-se...
Deixe um membro comprar seu próprio assento, e fechar um buraco corpo-parâmetro
O auto-pagamento não tinha rota dentro da consola. Tudo na superfície de faturamento é em forma de conta — você já deve ter uma linha ContaMembro antes de Plano...
Política de org e APIs de grupos de faturamento
Quem dentro de uma organização pode pagar Kamo é agora responsável e settable. Ambos as rotas são org-scoped e, portanto, deliberadamente fora /api/billing/acco...
Por omissão, uma nova organização de destino da subscrição para o chamador
Uma primeira compra não tem assinatura existente para copiar alvoOrganizaçãoId de, e requerê-lo incondicionalmente é o que fez criar um a partir do console impo...
Compre um bloco quando uma org optado ficar sem espaço
Corre pouco depois da varredura noturna de fotos, porque é isso que produz o figura de uso que decide sobre — expandir-se contra o número de ontem iria comprar ...
Deixe uma mudança de preço do catálogo realmente chegar ao Stripe
Os preços são imutáveis e o mapeamento mantém uma linha por (org, tipo, código, ciclo) atrás de uma chave única, de modo que uma vez que um preço existiu nunca ...
Capacidade de comunicação juntamente com a utilização
O painel de armazenamento apresentou os bytes armazenados contra nada — sem subsídio, nenhum percentual, nenhum dinheiro — assim um proprietário olhando para 40...
Faça um primeiro plano de compra e retorne os preços reais do plano
Duas coisas impediram uma organização de comprar uma primeira assinatura. As listas de planos só foram acessíveis através do sub.marketId numa subscrição já re...
Contas por unidade de acréscimos por unidades compradas, não por cabeça
Rola a nova quantidade adicional através da criação e atualização: um complemento FLAT agora toma a sua quantidade Listra do que a subscrição realmente comprou,...
Ponto em YugabyteDB e usar PostgreSQLDialect
O BarataDB foi substituído pelo YugabyteDB. strings de conexão se movem de baratadb-public:26257 para yb-tserver-service:5433, e o dialeto Hibernate desde o Pos...
Ler o uso da imagem de uma passagem desduplicada
Segue a mudança bibliotecária compartilhada para uma carga por arquivo distinto por organização. Tanto o resumo como o escritor de instantâneos diários tiram um...
Deixe um administrador de plataforma executar a varredura de instantâneos sob demanda
A varredura é o que faz remoções de período e totais de vida para o domínios de exclusão difícil respondê-los em tudo, então dias perdidos para uma falha são pe...
Relatar o que uma organização está armazenando
A página de estatísticas da conta sempre disse "Nenhum dado de uso disponível para este período", para cada organização, porque getCurrentUsage() no kamo-intern...
Serve a pasta org como uma página filtrada, ordenada e paginada
GET /orgs pega página/tamanho/q/sort/dir mais sete filtros e retorna a casa envelope de página com agregados de toda a propriedade. GET /orgs/{orgId} serve deta...
Hidratação da página rebatida em uma constante contagem de consultas
Títulos dos pais, domínio primário, plano/mercado subjacente ao direito e a assinatura-marca de catálogo são cada um loteado IN (:ids) em toda a página, Assim, ...
DTOs de linha/página de diretório e o repositório de consultas nativo
PlatformOrgRow carrega as duas facetas separadamente: direito (subs de entrada) visando o org -- o que o governa) e faturamento realizado (conta o org possui --...
SQL do diretório Org com CTEs por faceta
Contas, assinaturas, membros, licenciados e crianças cada Agregar nas suas próprias CTE antes de serem unidas às orgs. Juntando-os em um passar multiplicaria li...
Pedido de directório de orgs validado e apertado
As pinças de tamanho para [1,100] e um tipo não reconhecido cai de volta ao título, por isso um URL editada à mão não pode solicitar toda a propriedade nem atin...
Modo de direito derivado através de um resolvedor determinístico partilhado
TrialAdminService escolheu sua assinatura de teste com findFirst() sobre uma lista não ordenada, então uma org segurando tanto um pendente quanto um teste ativo...
Expor trialExpiresAt on platform org summary for the admin trials UI
Aplica-se/extende-se/estatuto da plataforma de avaliação de resultados + teste DTOExpirações
A varredura agendada reverte as tentativas expiradas para Livre com cache-bust
Medição de uso do sinal eletrônico + verificação de auto-serve do consumidor
#4 medição: - EsignMeterSubmissionService (@Scheduled daily): agregado API-origin EsignUsageRecords per org+period; primeiro 40/period included, the rest submet...
Gerenciar Organization.isPlatformProduto da Plataforma → Orgs
PlatformAccountResumo expõe isPlatformProduct + hasSubscription Mercado; novo Põe-te a andar. (plataforma-admin fechado) fixa a bandeira e invalida os direitos ...
Reescrever BillingService em torno de BillingGroups
Apaga o nível de org. Controladores, serviços e DTOs. Apresenta: - BillingGroupController grupos de montagem, membros, assinaturas, licenças, métodos de pagame...
Adicionar PlatformAdmin controller + serviço para subsídios comp plano
- PlatformAdminController em /api/billing/platform (classe-nível @PlatformAdminOnly) - GET /orgs, GET /orgs/{orgld} - POST /orgs/{orgId}/grants, PATCH'DELETE /o...
Enforce team-member pay-fees setting at Stripe customer creation
Bumps kamo-shared-library dependency to 1.5.0 so BillingService can resolve the new AppliedModelEnforcementService, and wires team-member vs org pay-fees enforc...
Initial BillingService — Stripe-integrated billing for KamoCRM
Serviço completo de inicialização de primavera para gerenciar faturamento KamoCRM via Stripe: - Stripe Cliente, Assinatura, PagamentoMétodo, Gestão do ciclo de...
Como o que vês no transporte?
Cada uma dessas atualizações pousa automaticamente em seu espaço de trabalho. Comece grátis e veja crescer semana após semana.