Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· InitializerService
Adicionar DEPTS.PARENT DEPT ID para departamentos aninhados
Nulable with no backfill -- null significa nível superior, que é o que cada existente O departamento foi e a maioria vai ficar. Declarado UUID simples com um DEFAULT DROP explícito. Desligar a chave dos departamentos UUID DEFAULT gen random uuid(), e uma coluna FK que herda esse padrão fica carimbado com um pai aleatório em cada linha existente, órfão de todos eles e falhando a restrição que se segue.
· SecurityService
Role o departamento pai através de criar e atualizar
DepartmentService agora recebe seu pedido DTO em vez de oito argumentos posicionais, assim o pai se junta à carga útil em vez de se tornar um nono em uma fileira do mesmo tipo Cordas. Org scoping nos parâmetros de mutação é inalterado; o próprio arrendamento do pai verificar vidas no serviço ao lado da guarda de ciclo.
· kamo-internal
Desenhar departamentos como um gráfico de orgs com um selecionador pai
A aba departamentos era uma lista plana, então uma org com Operações > Sucesso do Cliente > A bordo não tinha maneira de o dizer nem de o ver. A adição/edição obtém um departamento pai seleccionado, colocado com o nome porque a parentagem é estrutural e não operacional. Oferece a árvore em ordem de renderização e desactiva o próprio departamento mais tudo sob ele -- essas são exatamente as escolhas servidor rejeita, e oferecer uma escolha que sempre falha é pior do que não o oferecer. A lista torna-se uma espinha ortográfica. Uma coluna de trilho por nível, cada um exatamente um ícone o cotovelo de uma fileira pousa no centro do chip de seu pai em vez de perto ele; um último trilho de criança pára na esquina em vez de correr, que é o que torna visível o fim de um ramo sem contar os travessões. Células não carregam verticalmente estofamento -- os trilhos têm que alcançar ambas as bordas ou a linha quebra em cada linha. Profundidade lê através de tint e peso tipo, não tamanho de chip, uma vez que chips uniformes são o que Faça a geometria do trilho exata. Os cabeçalhos das colunas tornam-se rótulos de operador numa barra fosco, substituição de azul-50/indigo-50/cinza-900 ignorou o token da marca. Construção de árvores vive no departamentoTree.ts para que os casos estranhos têm de estar em algum lugar testado: um pai excluído de debaixo de uma criança renderiza no nível superior em vez de desaparecendo, e um ciclo que chegou à tabela renderiza em vez de pendurar a página. Falha ao gravar agora relata a própria explicação do servidor. O corpo 4xx estava a ser largado. a favor da linha de status, que teria virado "um departamento não pode ser seu próprio Pai" em "Mau Pedido".
· kamo-shared-library
Deixe um departamento sentar-se sob um departamento pai
Departamentos eram uma lista plana, então um gráfico org com Operações > Sucesso do Cliente > A bordo não tinha como dizer isso. Departamento ganha um auto-referenciamento opcional pai; null ainda significa nível superior, que é o que cada linha existente permanece. A coluna FK pinos colunaDefinição = "UUID". Parado, Hibernate copia o definição de chave primária referenciada -- UUID DEFAULT gen random uuid() -- para o FK, então um ddl-auto passa sobre um DEPTS povoado selos cada linha com um pai aleatório Não corresponde nenhum departamento e o ADD CONSTRINT que segue falhas. A atribuição dos pais é validada no serviço, não apenas o catador: auto-pai, ciclos (a partir do pai proposto não deve chegar ao departamento sendo um pai em outra organização, e um id desconhecido são todos recusados. Excluir um departamento promove seus filhos para seu próprio pai e não Enroscando-os atrás de um ponteiro pendurado. Agora aceita o pedido de DTO em vez de oito. argumentos posicionais, que foi o que fez a adição de um nono valor evitar.
· kamo-internal
Aumentar os campos To/Cc/Bcc para três linhas, em seguida, deslocar
Os campos destinatários na janela da ferramenta de composição eram uma única linha nowrap que tinha de ser arrastado de lado para ler, ea janela é 360px de largura e não redimensionável, então um terceiro O endereço já estava fora de vista. Eles agora enrolam: o campo cresce uma linha de cada vez como fichas preencher a largura, pára em três linhas, e rola verticalmente para além do que com um slim Barra de rolagem. Adicionar um chip segue a entrada para baixo para que o cuidador permaneça visível. A tampa da linha é um pixel de altura máxima, calculado a partir da altura do chip medido para que sempre cortes em uma linha limite — um compositor maximizado e uma fonte de navegador escalado ambos movem-no. A etiqueta e o pino do botão de contatos para a primeira linha em vez de flutuar no meio de um bloco de três filas. Deixa cair o agora-significado `mode' prop e o horizontal arrastar-para-rolar que existiu para.
· kamo-internal
Faça com que a criação de org sobreviva, e ofereça todas as opções de branding na frente
O assistente poderia falhar um cliente de maneiras que nada na tela explicou, e ele pediu um fração do que Configurações → Comportamento & Rotulagem expõe. Confiabilidade da criação: - Logotipo e uploads de fundo foram para /api/imaging/upload com assocType "ORG LOGO" — não um ImageAssocType constante, em um endpoint cujo assocType é um ordinal numérico. O analisador engoliu o fracasso e arquivou-os como MY DOCS, por isso a marca silenciosamente nunca existiu. Eles agora utilizar os endpoints reais de marcação de org, uma chamada por slot de logotipo. - O telefone/email do criador PUT só poderia sempre 403: esse endpoint requer sessão-org para igualar a org do membro, e a sessão ainda está no pai. Movido para a criação da carga útil. - Avisos pós-criação foram coletados, passados para /setup/dns como um param de consulta, e lidos por Nada. /setup/dns agora os renderiza. - Submeter nunca foi re-validado, então limpar o nome após chegar à revisão criou uma org com um título e apelido NULL. - derivarConfigType ler as faixas de idade ALOWED do tipo de ramo em vez do selecionado, carimbar o KIDS CLUB em empresas adultas — o que desactiva a recuperação de contas telefónicas e de e-mail. - As variantes de cor nunca foram derivadas, as entradas de telefone não foram ligadas contra VARCHAR(20), um velho faixa etária 403'd em submissão, e um domínio tomado superfície como um nu 500. Comportamento & Paridade de rotulagem — tudo, excepto os dois identificadores hipotecários: website, email de contato da empresa, identidade branca, todos os sete perfis sociais, os oito etiquetas personalizadas com suas bandeiras herdadas de pais, idioma padrão e moeda, private-org visibilidade, marca d'água de fundo, os três selectores da marca e todos os quatro slots de logotipo. Dois novos passos (Labels, Preferências); fuso horário se move para Preferências ao lado de seus irmãos. Tudo isso roda na criação da carga útil, não chamadas de acompanhamento: PATCH /org/{id}/brach-titles has a mesma verificação de sessão-org que quebrou a atualização do membro, e uma transação significa as respostas Ou todas as terras ou nenhuma. Orientação e passividade: Cada entrada tem texto de ajuda fundamentado no que o valor realmente faz. Somente Tipo e Basics carregam campos obrigatórios, e isso está agora indicado no cabeçalho do passo, no stepper, na barra de navegação, e na barra lateral — com "Skip for now" em cada passo opcional. Além disso: as configurações não mais destrói as extensões de telefone org ao salvar, /api/generate-background não é nenhum mais um proxy billable não autenticado, e o proxy org-by-id pára de corromper ids int64.
· kamo-internal
Enviar o botão de trás do editor de onde veio o membro
O editor de papel de parede era um beco sem saída — nada mais que o carril de navegação. Ambas as entradas pontos (o chip da barra superior da casa e o atalho do cabeçalho do perfil do membro) sua origem no href, e o editor resolve isso em uma pílula Back no linha da sobrancelha: home retorna ao painel, um perfil retorna ao membro cuja página foi, usando o ID carimbado em vez de assumir que é o O dono do papel de parede. Uma URL nua sem selo cai no perfil deste membro. fromId é verificado com a forma do id opaco para que uma URL trabalhada não possa girar o botão para um redirecionamento arbitrário. Leitura precisa usarSearchParams, então a página ganha o limite Suspense que o Roteador de App requer.
· kamo-internal
Mostrar uma caixa de correio primária sob o nome do perfil do seu membro
Uma caixa de correio como principal de alguém é a morada dessa pessoa, por isso sugeri-la como "Desk de Vendas" — o que quer que tenha acontecido ser rotulado quando foi fornecido — nomeia a caixa de correio em vez da pessoa. A linha autocompletar e o destinatário ambos leram o mesmo campo, por isso ambos estavam errados juntos. A pasta agora leva o Nome do Membro primário à frente da exibição da caixa de correioName, e nome de membro atribuído para uma caixa de correio pessoal, cujo único Dono. Nomes e caixas de correio partilhadas não pertencem a ninguém em particular e manter O seu próprio nome. A preferência é uma lista por código, então uma infra- estrutura que não ainda enviado o campo simplesmente cai de volta para displayName.
· EmailService
Nomeie uma caixa de correio primária em homenagem ao membro que a detém
Uma caixa de correio que alguém tem como principal é a morada dessa pessoa, então... Apresentando-a sob o que quer que a caixa de correio tenha sido rotulada no momento do fornecimento — "Sales Desk" para uma caixa que é simplesmente de Jane Doe - nome errado da pessoa na compor autocompletar e no cartão destinatário. listMailboxes agora carrega Para o membro com a atribuição primária, que o directório de endereços org prefere sobre exibição própria da caixa de correioName Apenas o titular principal conta: uma caixa de correio alguém simplesmente tem acesso não é deles e mantém seu próprio nome, e as configurações A tabela ainda mostra o nome de qualquer forma. A resolução de nome sai do AccessibleMailboxService para um ajudante compartilhado então as duas superfícies não podem discordar sobre o que um membro é chamado.
· kamo-internal
Registre as páginas da comissão nas configurações navegação e landing page
As abas existiam, mas nada ligado a elas. **************************** é o exemplo preventivo já neste repo: uma página real sem cartão, sem aba e nenhuma entrada de navegação, acessível apenas digitando o URL. Contabilidade & Finanças é sua própria seção e seu próprio tópico de navegação em vez de dois mais entradas em Minha Conta. As sub-opções não carregam nenhum portão próprio, assim dobrando estes em teria forçado a porta de conta aberta para os detentores só-financeiros e mostrou-lhes quatro ligações que não podem utilizar — o mesmo raciocínio que mantém a conformidade O tema da segurança. Com as abas de finanças em sua própria seção, a Minha Conta O portal volta para CONFIGURE SYSTEM sozinho. O cartão pessoal das comissões está condicionado ao espectador ser membro da equipa, espelhando o portão da tabulação. Uma carta que abre uma página que não irá renderizar é Pior do que nenhum cartão.
· kamo-internal
Página das comissões membros e as duas páginas da conta financeira
Página de membros (somente membros da equipa): saldo + livro de registos, encomendado oportunidades, configuração de pagamento e retiradas. A configuração da conta ganha Organização Listra e processador da Comissão. A guia do membro é fechada em isSelf e o membro TIPO, nunca à direita. checkRight retorna true para tudo no modo deus ativo, e da página canViewOtherMemberAccount ORs em direitos não relacionados, incluindo ********************** - Então um portão à direita aqui mostraria um Equilíbrio dos membros e dados bancários para qualquer um deles. Os meus pagamentos, não o meu banco. Os membros quase nunca têm uma conta Stripe e não podem anexar uma se o fizerem: OAuth read write recusa contas controladas por outra plataforma. A plataforma do seu empregador cria uma conta de beneficiário apenas de pagamento e Verificam a sua identidade. O painel declara o que Stripe coleta, que Stripe tem nenhum relacionamento de apoio com eles, e que o dinheiro leva aproximadamente 6-8 dias de calendário para chegar - nenhum dos quais deveriam ter que descobrir depois. Organização Stripe é uma lista de verificação guiada, não um formulário, porque Stripe não tem API para se tornar uma plataforma Connect. Passo 6 carrega um aviso completo em vez de uma dica: uma org cujo saldo Stripe paga automaticamente perde o flutuador da comissão antes do trabalho de liberação correr, e cada transferência então falha por fundos insuficientes sem nenhum evento Stripe para explicar. Dinheiro é um final de STRING decimal e nunca é Number()-ed exceto para escolher um cor. Os montantes negativos são reais - uma comissão anulada torna-se um empate - e o codebase não tinha nenhuma convenção para mostrar uma, então eles renderizam no tom de erro com um menos explícito e um chip Draw. Sub-tabs sincroniza com ? sub=; SettingsView possui ?tab= e reescreve-o em cada mudança de tabulação. A rota do BFF existe porque o serviço da Comissão é apenas um clusterIP - sem ele o todo o recurso 404s enquanto cada serviço é saudável e cada construção é verde.
· kamo-internal
Pastas que você pode atuar, e- mail que você pode selecionar
Clique com o botão direito em qualquer pasta para suas ações. O cabeçalho do menu não é cromado — ele nomeia a pasta e mostra seu live unread/total, então Mark todos ler e Pasta vazia pode ser julgado antes de eles são clicados em vez de depois. As ações que não podem ser aplicadas são mostradas desabilitadas com a razão (nada não lido, pasta vazia, pastas incorporadas manter seus nomes) em vez de ser Esvaziar e Apagar rota através de uma confirmação construída para o cromo de e- mail. Confirmação MUI ampla do aplicativoDialog exige uma palavra de desafio digitada cada tempo; um desafio em uma ação recuperável apenas treina as pessoas para digitar através de avisos. O portão está reservado para os dois que destroem o correio. outright — apagar uma pasta e esvaziar Lixo — e ambos nomeiam o consequência exatamente: tudo o resto se move para o Lixo e diz isso. Pastas reordenam por arrastar, por membro, armazenadas nas preferências de ui compartilhadas tabela para que o arranjo segue-los através de dispositivos. A ordem é uma. lista plana de nomes de pastas: os irmãos só são comparados uns com os outros, então uma lista ordena todos os níveis, e uma pasta que é renomeada ou movida cai de volta à sua posição natural em vez de corromper uma árvore. Gotas todos os níveis são ignorados — isso seria um reparer no servidor de e-mail, Nem um pouco. Selecionando o e-mail agora funciona como a seleção funciona em qualquer outro lugar: shift-click para um intervalo da âncora, cmd/ctrl-click para escolher um, e o avatar se transforma em uma caixa de seleção no hover ao invés de tributar cada linha com uma coluna permanente da caixa de verificação. As ações andam em um bar que flutua sobre a lista e sai com a seleção, em vez de uma tira encravada no cromo que empurrou a lista em cada tique. Além disso: o rodapé Gerenciar pastas desapareceu — o botão ao lado das pastas O cabeçalho já cria pastas — e o botão de atualização está finalmente quadrado. CSS não pôde fazer isso sozinho: em uma linha flex o tamanho principal resolve antes do alinhamento-self:stretch dá ao item sua altura, assim aspect-quadrado tinha nenhuma altura para derivar uma largura. Mede a linha em vez disso.
· EmailService
Agir numa pasta inteira, não apenas na página que rolou
Marcar todas as pastas lidas e vazias são operações de pasta no cliente não pode expressar por lotes uids: ele só detém a página que tem rolado, para que uma pasta com 4.000 não lidos faria 80 viagens redondas e Ainda sinto falta de tudo o que nunca carregou. FolderManager ganha setFolderSeen e em brancoFolder. O caminho IMAP inverte sinaliza em uma chamada do lado do servidor e apenas toca em mensagens que realmente discordar do estado-alvo — um conjunto de cobertoresFlags reescreve bandeiras servidor já tem e faz todos os clientes conectados resincronizar para nada. O gráfico não tem equivalente em massa, por isso caminha a pasta e PATCHes; o filtro encolhe como vai, então ele re-ler a primeira página em vez de paging com $skip, que iria passar sobre itens do lote anterior apenas saiu do conjunto de resultados. Seu teto de varredura é registrado, nunca silencioso. Esvaziamento mantém Lixo especial: Lixo é expurgado de verdade, todos os outros pasta move seu conteúdo para Lixo e permanece recuperável. DELETO do gráfico Já se comporta assim, então não há nenhuma pasta-nome especial-casing lá. Ambos endpoints retornam quantas mensagens foram movidas, para que a UI possa dizer "marcado 240 ler" de "nada a fazer", e só publicar um evento de mudança quando Algo realmente mudou.
· SecurityService
Relé voltado para o navegador para o recurso de comissão
Resolve a sessão, autoriza e retransmite para o Serviço da Comissão com as org e membro carimbado daquela sessão — nunca de nada que o chamador enviou. Isto é... os únicos direitos de lugar são verificados: SecurityService executa anyRequest().permitAll() com autenticação laminada à mão, por isso um endpoint que esquece o seu controlo falha ABERTO e é acessível através do relé público API. Três direitos em vez de um, por isso a separação de deveres é expressível: com um único conceder, quem emite uma comissão também poderia liberar o pagamento e cancelar o segurar que existe para pegá-los. Movimento de dinheiro e ações de destino de pagamento duramente recusadas sob personificação. Personagem menta uma sessão completa como um membro arbitrário, por isso, sem essa recusa um administrador deus poderia entrar como alguém, apontar pagamentos em seu próprio banco, retirar, e Cancele a espera. O proprietário da organização é um detentor implícito. É concedido um novo direito ninguém no dia em que se desloca — incluindo qualquer pessoa que possa ligar o recurso — assim, sem um ramo proprietário, as naves características dormentes e inalcançáveis. /me/oportunidades é servido aqui em vez de retransmitido, porque o Serviço de Segurança possui o modelo de oportunidades; registo desses repositórios no Serviço da Comissão dar um modelo bibliotecário compartilhado dois escritores. Unifica as filas divididas dos membros com as reservas onde eles são o principal agente, porque o próprio agente comissão produz nenhuma linha dividida e uma consulta verificando apenas um lado silenciosamente esconde meio salário de um membro.
· kamo-shared-library
Encontrar comissões de um membro divididas para sua própria visão comissões
Org-scoped em vez de chaveado apenas no membro: ORG ID é duplicado para isto tabela para que uma linha nunca possa ser lida cross-tenant por id, e um localizador que a ignorou desfazê-lo silenciosamente. Apenas metade das "oportunidades que ganho" — a comissão de nível de reserva pertence para o agente primário e produz nenhuma linha dividida em tudo, então os com as reservas daquele agente. Documentado no método para o próximo chamador não envia uma visão que esconda silenciosamente os ganhos de meio membro.
· kamo-internal
Faça da superfície do membro uma grade de dados kamo real
Os pacotes do membro eram uma lista de cartões sem movimento, o que não é como o resto de aparência kamo. Esta é agora a casa AG Grid: Pendente e concluída sub-tabs sincronizado com ?sub=, servidor-side paging end to end (page/size/status atend DocsService em vez de cortar uma tampa de 200 linhas), enchendo o painel em vez de dimensionamento para as suas linhas, e nenhum título — a aba de configurações já o nomeia. Status lê de relance em vez de como um chip cinza: uma data de vencimento carrega sua própria urgência, e espera-em-outros e conteúdo-alterado são estados legíveis em vez de Escondidos. Movimento é contido e fechado em usoReducedMotion.
· kamo-internal
Mostrar o nome do membro sem o prefixo "Oi"
· DocsService
Página do lado do servidor para a lista de atribuições de membros
A superfície do membro pediu MAX SIZE incondicionalmente e cortou o resultado em o navegador, então uma grade que mostrou uma página já tinha baixado um todo História do emprego para o construir. Ambos os leitores membros agora tomar página / tamanho e o listando páginas na base de dados. Spec.status (um enum) torna-se Spec.statuses (um conjunto) e o parâmetro fio permanece "Estatus", agora aceitando um CSV. Este é o ponto: a grelha de membros pede uma BUCKET — os três OPEN STATES que ainda devem trabalho, ou os quatro terminais — e um filtro de valor único não pode expressar-se sem três viagens de ida e volta por Page. Um token analisa para um conjunto de elementos, então a grade de RH existe status=EXECUTED é bytes idênticos no fio e não precisava de nenhuma mudança do cliente. An token desconhecido em uma lista é um 400 nomeando o token, nunca um silenciosamente deixado cair filtro: uma grade de conformidade que afirma ser filtrada enquanto mostra tudo o pior resultado disponível. clampPage/clampSize são expostos para que os leitores membros clamp através da regra SAME como a grade HR em vez de passar literalmente MAX SIZE, que é como um "pagado" Endpoint silenciosamente torna-se um sem limites. listaMine encaminha seu paging sem Re-derivando-o, então o grampo existe uma vez. A autorização não é tocada e os testes prendem-na: os endpoints dos membros permanecem em memberGuarded() + LegalAssignmentOwnership, HR endpoints stay on guarded() + LegalPackageAccess, e os três novos @RequestParams exatamente status/página/tamanho — toda a razão pela qual esta superfície é segura é que nada nele nomeia uma pessoa. Sem mudança de esquema. Nenhuma nova entidade. mvn-o test: 391 testes, 0 falhas, 0 erros (foi 379).
· kamo-internal
Cartão de Notificações de Email Pessoal substitui a aba Notificações
Ambos os interruptores movem-se para o meu perfil na mesma forma que o cartão de senha: uma carta, uma peça de ícone e ajudar o texto por linha, e um inset colorido que aparece apenas quando horas tranquilas estão ligadas. Sem cabeçalho Editar botão — os interruptores salvam-se, desbotados, exatamente como a aba fez. O cartão leva com onde o correio vai, porque essa é a parte que os membros se enganam: avisos são enviado para o endereço na sua conta USER, que os nomes de cartão, e nunca para a caixa de correio este a organização lhes designou — uma caixa de correio que teriam de assinar para ler, que é exatamente o que O aviso está a dizer-lhes para fazerem. SecurityService devolve esse endereço apenas ao membro pertence, então a nota cai de volta para um formulário não identificado se estiver ausente. Apenas os membros da equipa: o notificador serve os tickets de chat e suporte internos, o que um membro simples faz Não trabalhar em. Além do mais, já que a rota de preferência é me-scoped e em outra pessoa perfil estes switches editariam as próprias horas silenciosas do administrador.
· SecurityService
Expor o e-mail da conta de utilizador no seu próprio perfil de membro
O cartão de Notificações de E-mail Pessoal do perfil tem que nomear o endereço mensagens não enviadas realmente chegar, e esse endereço é a conta do usuário — não o campo `email` ao lado dele, que é a caixa postal que esta organização atribuiu ao membro. Retornado apenas quando a sessão está lendo sua própria linha de membros. Um endereço pessoal não é algo um administrador deve coletar o perfil de um colega, e nenhum outro ouvinte tem uma razão para querer isso.
· kamo-internal
Grupo de permissão de contabilidade e finanças e acesso direto às configurações de conta
Os grupos de Segurança e Administração de Acesso existiam apenas no SecurityRoleManager como listas de nomes em linha, então JobTitleManager, DepartmentManager e PermissionsPermissionsTab Colocou todos os serviços sem-tipo em General. Em vez de adicionar uma quarta cópia, as definições de grupo passam para permissionGroups.ts e todos os quatro editores as lêem. isGeneralPermission é a razão que importa: filtrar no !serviceType sozinho faria uma direita esculpida duas vezes, uma em geral e uma em sua própria secção, dando uma opção duas opções independentes. PermissionsPermissionsTab é deliberadamente intocado - sua lista de Permissões Gerais é uma simulação de leitura/escrita/delete/admin, não dados de direitos reais. /settings/conta e sua seção de desembarque agora também admitem os direitos financeiros. Um controlador com apenas MANAGEM ORG FINANCES seria redirecionado direto de volta para /settings; alargamento apenas um dos dois deixaria a página acessível por URL, mas invisível no navegador.
· InitializerService
Migração para o caderno de comissões e tabelas de pagamentos Stripe
Mirrors com.kamo.z. shared.commission. ddl-auto criaria estes a partir do anotações de qualquer maneira; o DDL explícito é a convenção da casa e é o que faz a forma revisionável em um lugar ao invés de em uma dúzia de classes de entidade. COMUNIDADE STRIPE WEBHOOK EVENT tem a seguinte redacção: a identificação do evento sozinho. Cada organização executa sua própria plataforma Stripe Connect, então IDs de eventos só precisam ser únicos dentro de uma conta - EMPRÉSTIMOS chaves no ID nu e é seguro apenas porque O recurso tem uma única conta Stripe. Aplicado contra prod; todas as nove tabelas e cada guarda única verificada presente.
· SecurityService
Semente dos direitos de financiamento para o modelo ADMINISTRATOR de cada ramo
Os três direitos da comissão portam uma característica que não existia anteriormente, então NEW RIGHT SEEDS deliberadamente não diz nada sobre eles - esse mecanismo carrega um Subsídios existentes para uma implantação nunca silenciosamente REMOVE o acesso e a sua utilização Aqui dava o poder de mover dinheiro a pessoas que nunca o tiveram. O que eles precisam em vez disso é um padrão tipo-papel, que não existia. Duas partes: - modeloSeedSetting Para ganhos uma sobrecarga DefaultRoleType concedendo o financiamento apenas direitos sobre os modelos ADMINISTRATOR. CONCESSÃO, NÃO CONCESSÃO: uma org deve manter-se capaz de revogar um direito monetário de um administrador sobre o seu membro perfil, e FORCE GRANTED substitui cada camada posterior da cachoeira. - assegureRoleTypeTemplates cria a linha ADMINISTRATOR para modelos que não possuem um. As linhas padrão são preguiçosas, criadas apenas quando alguém salva os padrões de um modelo, e syncSecurityModelRoleRights itera essa tabela - então sem isso o por omissão aplicar-se-ia a cada modelo de ramo, excepto aos nunca personalizados, silenciosamente, e estes são os mais susceptíveis de ser invocados em as-is.
· kamo-shared-library
Registro de comissão de membro da equipe e domínio de pagamento Stripe
Adiciona com.kamo.z.shared.commission: um livro de registos assinado apenas para apêndices, um por membro linha de saldo que existe puramente para serializar retiradas simultâneas, o Modelo de lote/item de linha do processador da Comissão e ligação por fio Entidades de pagamento. Três decisões que valem a pena manter: - O livro de registros é somente anexo e o obriga em Java (@PreUpdate/@PreRemove arremesso). @Column( updatable=false) só faz com que Hibernate omita uma coluna da ATUALIZAR, não faz com que a escrita falhe, por isso uma correção antiga iria olhar Como se tivesse conseguido. Correções estão invertendo linhas. - Disponível vs pendente é uma consulta sobre EFECTIVO AT, não uma máquina de estado. A comissão emitida hoje com a maturidade do próximo mês move-se para disponível em sua Por isso, não existe nenhuma varredura que possa falhar e juntar dinheiro como pendente. - COMUNIDADE MEMBER BALANCE é redundante com o livro de registos da construção. Ele existe porque um saldo é um agregado e SELECT PARA ATUALIZAÇÃO não pode bloquear um agregado; sem uma linha para tomar PESSIMISTIC WRITE ligado, dois concorrente As retiradas passam ambos pelo seu próprio controlo de suficiência. O dinheiro é NUMERIC(19,4) ao longo de, ids org são colunas simples INT8 em vez de associações para registros financeiros sobreviver churn membro, e ORG ID é duplicado nas filas de crianças para que nenhuma busca de linha única possa ler o cross-tenant. Também acrescenta três direitos (187-189) para a superfície financeira. Eles estão divididos assim separação de deveres é expressível: com um direito a pessoa que emite um comissão também poderia liberar o pagamento e cancelar o porão que existe para Apanha-os. serviceType é nulo deliberadamente - um novo ServiceType agruparia eles automaticamente, mas renderizá-los em nenhum editor em tudo, uma vez que apenas seções de app aparecer quando a org tiver esse aplicativo ativado. Esquema aplicado via KamoInitializer; todas as nove tabelas verificadas presentes na prod com TODOS os privilégios para o usuário do aplicativo kamo.
· kamo-internal
Dobre o MFA no cartão de senha e solte a guia de Segurança de Entrada
Dois lugares fizeram uma pergunta — como posso entrar neste relato — então o segundo fator agora vive ao lado da senha no meu perfil, em um cartão renomeado "Password & Multi Factor Authentication". O fluxo de matrículas move-se para fora da tabulação. livre de cromo assim que ele renderiza como uma linha em vez de uma página: pílula de status, QR numerado/secreto e passos de código em um inset, e a mesma janela de código de recuperação não admissível. O cabeçalho do cartão não carrega nenhum botão Editar agora que ele possui duas ações independentes — a linha de senha tem sua própria "Change password", a linha MFA sua própria "Vire-se". O MFA permanece auto-somente pela razão da guia ser: Os endpoints do MFA do SecurityService resolvem o usuário da sessão do chamador e não tomar nenhum parâmetro de usuário, para que um administrador no perfil de outra pessoa Estar a inscrever o seu próprio autenticador. A mudança de senha é mais ampla (MANAGE MEMBER SECURITY, deus), então essa linha sozinho faz render lá. O estado da senha passa para o PasswordSecurityCard, que corrige um ramo morto no caminho: o cartão antigo comparou uma senha *traduzido*Erro contra literais em inglês, então "A senha atual está incorreta" Nunca chegou ao campo a que pertencia. O erro agora carrega seu campo.
· kamo-internal
Sugerir caixas de correio próprias do org, apelidos e caixas de correio partilhadas
O destinatário autocompletar apenas sabia dos contactos e endereços retirados da Pasta enviada, então os endereços próprios da organização — tudo gerenciado em **************** - teve de ser dactilografado de memória. Novos fãs GET /api/email/diretório para as quatro fontes do EmailService por trás Essa página e devolve uma lista de endereços desatualizados. Agregado do lado do servidor porque cada uma dessas chamadas consome sua própria chave de uma vez; do navegador que seria quatro viagens de ida e volta da OTK sempre que um compositor abre. Cada fonte degrada-se na sua Por conseguinte, uma organização cujo prestador ainda não dispõe de provisionamento recebe os seus pseudónimos. A lista está em cache na memória e combinada localmente — orgs têm dezenas destes, não milhares, e um parâmetro de consulta por tecla, colocaria uma viagem de ida e volta em rede diante das sugestões o navegador já pode responder. Org combina, portanto, pintar imediatamente, enquanto o contacto e as pesquisas de pastas enviadas ainda estão em voo, e eles lideram o dropdown: é um pequeno conjunto exato, e um endereço interno que também se senta em um livro de contato deve ler como a caixa de correio, não o cartão de contato. A edição das caixas de correio nas Definições deixa cair a 'cache', pelo que um novo endereço é sugestionável sem recarregar. EmailService base-URL e ajudantes encaminhados sair da rota catch-all assim a nova rota menta o seu OTK da mesma forma em vez de manter uma segunda cópia.
· kamo-internal
Uma vista da caixa de correio, e uma coluna que é toda a lista
A opção Conversacional/Classic foi-se e cada membro recebe o lista clássica. Visão de conversação carregava sua própria lista, sua própria linha painel e sua própria superfície API para uma segunda maneira de ler o mesmo mail — tudo apagado, juntamente com o modo localStorage lembrado por navegador. O cabeçalho da coluna da lista foi com ele. O nome da pasta, o seu ícone, o descrição sob ele e o botão de atualização foram seis rems de cromo acima de uma lista que queria a altura, e a árvore de pastas já diz qual pasta está aberta. Procurar e o painel de filtragem mover para a pasta barra lateral, acima da legenda Pastas, então a coluna lista não é nada, mas lista. O botão de atualização retorna ao lado do interruptor de caixa de correio como um quadrado: itens-estique na linha e aspecto-quadrado na marca do botão A sua altura segue o interruptor e a sua largura acompanha a sua altura. Senta-se. ao lado do cartão de uma caixa de correio também, então um membro sem dropdown não perde a actualização. Os filtros caem para uma coluna — dois selects lado a lado não se encaixam 320px sidebar. Um provedor de SMTP-somente não tem nenhuma barra lateral de pasta, então lá o painel de pesquisa fica acima da lista em vez de desaparecer. Cordas para as superfícies removidas são esfregadas de todos os 22 locais em kamo-tradução-dicionário (61fdfcf, empurrado primeiro). threadDetail a partir de/para/cc/noContent stay — a aba de comunicações principais os torna.
· SecurityService
Expor e-mail de contato na lista by-department
O Centro de Interação precisa do endereço de um membro para pré-preencher um compositor, e o único ponto final que carregou um foi a busca de detalhe de um único membro — um pedido por linha visível. EmbEmail é incorporado na linha de membros a lista já carrega, então servi-lo aqui não custa nada e remove o N+1.
· kamo-internal
E-mail de um membro diretamente de sua linha
A doca de ação da linha poderia conversar, encontrar, discar e abrir um perfil — aquele algo que ele não poderia fazer era iniciar um e-mail, então chegar a um colega por e-mail significa deixar o painel, abrir o compositor e redigir o seu endereço. Adiciona um botão de e- mail ao lado dos outros que abrem a janela da ferramenta do compositor com o membro já no campo To. O endereço viaja ao longo do por-departamento carga útil (EmbEmail está na linha de membros, por isso não custa nenhum extra query) em vez de obter um detalhe por linha, e o módulo / portão direito é resolvido uma vez no NavTopPanel em vez de por linha.
· DaemonService
Carrapato diário de lembrete do pacote legal
O DaemonService possui o tick porque o DocsService não pode. DaemonService é estratégia:Recrear — o pod antigo se foi antes do novo começar, então um implante A janela não pode disparar duas vezes. DocsService é RollingUpdate maxSurge:1, assim um @Scheduled lá pode comprovadamente: para o comprimento de cada lançamento há dois pods E ambos acreditam que são 13:00. Para uma tarefa cuja saída é e- mail para cada atraso empregado na plataforma, "normalmente uma vez" não é uma propriedade. Também nos dá @DisallowConcurrentExecution, gatilho manual do JobTriggerController e um cron Tunble sem reinstalar DocsService. Modelado no LeadEmailSweepJob, incluindo a parte que é carregar em vez do que estilística: um RestTemplate padrão espera FOREVER, então um DocsService encravado iria fixar este tópico e — sob @DisallowConcurrentExecution — parar a varredura até que a cápsula reinicie, silenciosa e indefinidamente, parecendo exactamente "não". Eram necessárias advertências". Os intervalos são explícitos. Selos internal.auth.secret (public-chat), o valor DocsInternalAuthFilter valida — NÃO o segredo interno da MLOS, que é um valor diferente e 403s cada chamada, a correção StewardNotifier e VoipGlobalSyncJob ambos necessários. Diariamente, não por hora: o balde é uma função do dia, então um tique-taque é 24x A varredura de trans-orgs para no máximo um envio extra e 24x o raio de explosão. Não configmap change — o URL base docs e o cron ambos carregam padrões de trabalho.

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