Changelog
O que há de novo.
Cada melhoria para a plataforma, como ele envia.
· kamo-internal
Diga ao membro com o que o evento colide, como eles definiram
A coisa mais útil que uma janela de agendamento pode dizer é "você já tem algo então", e o endpoint para respondê-lo existiu junto com Nada disso. O diálogo agora pergunta à medida que os tempos mudam — denunciado, porque os inputs datetime disparam por curso de tecla – e reportam o embate dentro do cartão Quando, diretamente sob os controles que o causaram, em vez do que como um banner em outro lugar ou um erro após salvar. Os passes de edição excluemEventId para que um evento não se relate. Mais duas coisas que foram edições de dois campos e agora são um toque: - Hoje e amanhã mudar o evento para aquele dia, mantendo o seu tempo e duração. "À mesma hora amanhã" é uma intenção muito mais comum do que escolher um data de um widget. - O atalho de salvamento é mostrado no rodapé, renderizado por plataforma, por isso é detectável em vez de folclore. Cada texto é uma chave existente: conflitos Com já carregado um {nomes} placeholder para as vistas da semana e do dia, e comum. hora fornecida o dia rótulos. A dica de atalho são símbolos, então não precisa de nenhum. Verificado com uma construção de produção numa árvore de trabalho separada — outra sessão mantém a fechadura na árvore.
· EmailService
Deixar o endpoint de conflitos excluir o evento sendo editado
ConflictDetectionService sempre tomou uma exclusãoEventId; este endpoint Passou nulo. Sem ele, um evento se sobrepõe, então no momento em que o evento diálogo começou a perguntar, editar qualquer coisa iria relatar um conflito com a coisa sendo editado. Também responde com DTOs como o resto deste controlador. A entidade bruta publicou um membro, organização e calendário que Jackson torna nulo Seja como for, e muito mais.
· kamo-internal
Reconstruir a janela do evento em torno de quando, não em torno de campos
Dez campos esboçados de forma idêntica numa coluna, na ordem em que colunas acontecem de sentar na tabela: título, descrição, localização, calendário, dia inteiro, início, fim, cor, privado, recorrente. Nada sinalizou que o O título e os tempos são o trabalho todo e o resto é geralmente deixado em paz. Reordenado pelo que é realmente decidido, e dada hierarquia para corresponder: - O título é definido como um cabeçalho a ser digitado — grande, sem fronteiras, desactivado — porque é a única coisa preenchida todas as vezes. - Quando se torna o bloco herói: as duas vezes em mono, com a duração derivado e mostrado vivo entre eles, e 15m/30m/1h/2h predefini o fim desde o início. É assim que uma reunião é realmente decidida ("fazer uma hora), e o par de entradas datatime nunca respondeu. - Calendário e cor tornam-se chips e swatches em vez de dropdowns. Raramente há mais do que um punhado de ambos, a cor é tanto o algo sendo escolhido como o nome, e um dropdown de cor * nomes* fez você Leia uma palavra para escolher uma amostra. A duração é também a validação. Quando o fim precede o início do o chip fica vermelho e lê um valor negativo — "−30m" indica o problema mais precisamente do que uma frase, não precisa de nova chave de tradução, e está certo em todas as línguas. Salvar está desabilitado sobre isso e em um título vazio, ambos de que já estão visíveis no formulário. O Comd/Ctrl+Enter salva. Este diálogo é aberto, preenchido e demitido dezenas de vezes por dia. Corrige um erro real enquanto estiver aqui: os campos de tempo foram preenchidos com toISOString(), que é UTC, em entradas que esperam tempo de parede local. In Califórnia o diálogo abriu oferecendo um início sete horas de distância, e qualquer evento criado sem tocar o campo pousou na hora errada.
· kamo-internal
Estratégia de atribuição automática e abrir uma conversa atribuída automaticamente
As configurações dos tópicos ganham a quarta estratégia. As linhas da lista e a janela de edição compartilhar o mesmo rótulo, e a chave enviada para o dicionário kamo-tradução primeiro - messages/ is gitignored here e next-intl lança sobre uma chave faltando do en.json, Então, pousar isto à frente do dicionário enviaria uma construção cuja página falha. AtribuídoTicketOpener levanta a janela do ticket no momento em que o trabalho se torna isso membro, e novamente no sinal para qualquer coisa atribuída enquanto eles estavam fora. Ambos caminhos executar uma busca de /atribuído-não aberto, então "ele chegou enquanto eu estava aqui" e "Chegou enquanto estive fora" são um caso em vez de dois mecanismos que têm para concordar — o impulso ASSINADO é núcleo NATS e está simplesmente perdido se ninguém estiver ouvindo, é por isso que é tratado como uma dica e o servidor detém o registro. Não fechado na disponibilidade ou nas regras de aceitação-popup: esta não é uma oferta que pode ser decodificado, o trabalho já está atribuído. O popup existe para o situação oposta. Ao contrário da abertura automática NEW TICKET removida em addd9036, DESIGNADO só chega ao único agente que lhe diz respeito, por isso não pode abrir uma janela em cada ecrã da org.
· MediaService
AUTO ASSIGNMENT, e levantar uma conversa atribuída na tela do agente
Uma solicitação de chat e um ticket enviado são a mesma unidade de trabalho; A estratégia é a única coisa que decide como é entregue. A O caso especial PRE TICKET desapareceu. AUTO ASSIGNMENT escolhe o agente menos ocupado que está genuinamente online — um agente ao vivo WebSocket via PresenceService, nunca disponibilidade status, que só continua login, logout e uma alternância manual e assim lê AVAILABLE indefinidamente para qualquer pessoa que nunca assina. Com ninguém conectado ele decodificadores em vez de trabalho de fixação para um agente ausente: um ticket atribuído sai da fila de reclamações, então uma escolha ruim Enrola-o onde nenhum popup pode alcançá-lo. Pela mesma razão AUTO ASSIGNMENT junta-se às estratégias reclamáveis — os tickets que decodificam são exatamente os únicos que chegou enquanto ninguém estava online, e ainda têm de contactar alguém. ADMIN ASSIGNS continua a ser a única estratégia que nunca é reivindicada. Carga de trabalho conta todos os status ao vivo, incluindo PRE TICKET (uma pessoa esperando em um O chat é a coisa mais pesada que um agente detém) e nenhum terminal. Dois endpoints para trás a entrega: GET /tickets/atribuído-não aberto, que o cliente lê na entrada, e POST **************** que se aposenta Uma. A leitura existe porque o impulso ASSIGNED é o núcleo NATS sem repetição — sem ele, o trabalho atribuído enquanto um agente foi assinado simplesmente espera em uma lista para ser notado. A escrita é escopo para o cessionário e selos apenas uma vez, então dois A corrida de tabs é um no-op em vez de um conflito.
· kamo-shared-library
Estratégia AUTO ASSIGNMENT e um registro durável de uma entrega invisível
AUTO ASSIGNMENT(3) é anexado ao SupportAssignmentStrategyType — assign imediatamente para um agente que está genuinamente online, preferindo quem detém o menos trabalho, em vez de rotação estrita presença-cego de ROUND ROBIN. Em anexo, nunca reordenado: a coluna é @Enumerada(ORDINAL). A coluna também carrega uma faixa numérica CHECK Hibernate emitido em CREATE TABLE e nunca revisa. Porque essa cláusula contém E não é uma lista enum whitelist, assim SchemaCleanupDrop genérico do RunnerStaleEnumWhitelistChecks () varrer ignora por design; alargamento é uma mudança de correspondência no corredor, sem o qual cada inserir usando o novo valor falha. SuporteTicket ganha DESIGNAMENTO OPENED AT. A atribuição é anunciada sobre o núcleo NATS Sem replay, então um agente que foi assinado quando o trabalho chegou nunca ouve Sobre isso. Null da atribuição até que um cliente realmente coloca a conversa em tela, faz "atribuído a mim e nunca visto" um fato do lado do servidor que sobrevive a um encerramento, um acidente, uma transferência ou uma máquina diferente. Duas consultas de repositório para ir com ele: countOpenForAgent (a carga de trabalho tie-break) e encontrarAtribuições Não-AbertasParaAgente (a captura de entrada).
· kamo-internal
O chip de um aplicativo preso lança o aplicativo, não suas configurações
O chip líder de uma faixa presa estava ligando para as configurações de pouso do aplicativo - O mesmo lugar onde a primeira entrada já vai. Ele agora pega emprestado que o navegador do aplicativo opção por atacado, por isso carrega o próprio ícone do aplicativo e se comporta exatamente como o nav does: CRM abre /leads sob o parafuso Leads, AI Support abre o assistente janela, Suporte e Mail e Docs e Telefone soltar seus menus de sub-opção, O chat abre o centro de interação, as reuniões abrem o novo convite. Chat e Meetings são cromadas nav fixas sem opção de registro, então a banda abre-os — o centro de interação através de um evento de janela NavTop escuta, uma vez que o seu estado aberto vive lá. Um membro que pode configurar um aplicativo, mas não pode usá-lo, não possui opção de navegação para ele, e que a banda mantém o chip de pouso antigo configurações em vez de ser entregue um porta que os recusaria. Também corrige a sobrancelha da banda, que estava herdando a tinta do operador-label significava para superfícies leves e desaparecer na banda de org.
· EmailService
Sincronizar o calendário da organização com os telefones, sem abrir um buraco
O calendário compartilhado não tem proprietário, então a listagem de DAV com o escopo de conta poderia nunca devolvê-lo: os eventos da empresa estavam claramente lá na web e invisível em todos os telefones. A coleção doméstica agora unifica os calendários da própria conta com a sua organização partilhada. A razão pela qual isso precisava de cuidados em vez de uma consulta extra: CalDAV autentica uma conta, não uma associação, então simplesmente expondo o calendário teria feito com que fosse escrito por qualquer um cujo telefone pudesse alcançá-lo — uma maneira em torno da publicação direita o caminho web obriga. PUT e DELETE resolvem agora Os membros por trás das credenciais DAV e aplicar a mesma regra: CREATE ORG CALENDAR EVENTS para escrever para o calendário compartilhado, propriedade para escrever para um pessoal, 403 caso contrário. O acesso à leitura permanece deliberadamente maior do que escrever. O calendário partilhado é para ser visível para todos na organização; esse é o ponto de Ele. Apenas a publicação é restrita. Testes cobrem o bypass especificamente: nenhum direito, nenhum membro nesse organização e o calendário partilhado de outra organização são recusados, enquanto um titular da direita é permitido.
· InitializerService
Adicionar e preencher contas. data criada
Hibernate não pode adicionar este em si: ddl-auto emite NÃO NULL, que BarataDB recusa em uma tabela que já tem linhas. Então é adicionado nulo Aqui, recheado, depois constrangido. O backfill decodifica a chave primária unique rowid() de cada conta, que contém seu tempo de inserção nos bits altos — que recupera o real de cada conta tempo de criação em vez de achatar todas as 23 linhas existentes na migração timestamp, o que tornaria a ordem de data ascendente sem sentido para exatamente as contas que estiveram ao redor por mais tempo. Esse layout é um Detalhes da implementação do BarataDB, então o decodificador é verificado pela primeira vez contra membros, que têm uma chave única rowid() e uma data de criação gravada; só é aplicada se reproduzir a sua. Na execução da produção correspondeu 62 de 62 e recuperou todas as 23 contas, nenhuma caindo para o backback. Ordem 0, à frente de cada outro corredor: a entidade mapeia a coluna assim que esta compilação começa, então qualquer corredor que carrega uma Conta emite-a em seu SELECT. Ordenado tarde, este nunca correu em tudo — LeadContactPointSeedRunner morreu em "colunn a1 0.date created não existe" e levou a execução com ele.
· kamo-shared-library
Gravar quando uma conta foi criada
A conta não carregava nenhuma data de criação — não uma coluna nula, nenhuma coluna. A lista de contas tem uma coluna Data Criada e ordens por ela, de modo que coluna esteve em branco para cada conta desde que a tabela foi criada. Fonte da base de dados em vez da JVM, segundo a regra da casa para Horários. A coluna correspondente e o preenchimento das linhas existentes estão em A Conta do KamoInitializerDateCreatedMigration, que já foi executada.
· kamo-internal
Pin um aplicativo habilitado para o home launchpad
Cada tópico de aplicativos habilitados agora carrega uma opção de pino, na subopção Configurações menu e em seu cabeçalho de seção na landing page de configurações. Uma aplicação presa obtém sua própria banda de atalho horizontal no home launchpad — o membro escolhido contraparte da barra de administrador, carregando cada tela que o aplicativo abre. Um pino é uma preferência de exibição, nunca um direito: a lista fixa é intersegido com os portões vivos do membro em cada renderização, por isso um direito revogado ou um aplicativo que o org desliga remove a banda imediatamente, e o armazenado A preferência é podada para corresponder em vez de estar adormecida. A árvore de configurações atrás do menu e das bandas agora vem de uma resolvedor (useSettingsTopics), então eles não podem derivar.
· kamo-internal
Dê ao Mobile Copilot configurar sua própria página de largura total
A superfície de telefone foi a terceira guia do Centro de Interação slideout, que o capped em um trilho 500px — demasiado estreito para mostrar a instalação código e o código de entrada lado a lado, então os dois passos foram colapsados atrás de uma alternância e todo o fluxo lido como uma coluna de fragmentos empilhados. faixa cuja célula de entrada vai ao vivo e conta o código para baixo, em seguida, um deck de painéis que se alargam com o viewport — dois num tablet, três num portátil, Quatro em 1800px. Ambos os códigos compartilham um quadro de visor com uma varredura varrimento, que é o que faz os dois passos lidos como um instrumento. O fluxo OTK mudou-se para o usoMobileSignIn para que o herói e o painel de entrada Leia o mesmo estado. O trilho de navegação e entradas home launchpad agora rota para a página em vez de enviar centro de interação aberta, o que deixa isso Evento sem expedidor, por isso e o suporte inicial do painel desapareceram.
· kamo-internal
Reconstruir o calendário em torno do momento atual
A página era uma grade funcional com o cromo fazendo a fala: um 3px regra do arco-íris sob a barra de ferramentas, uma segunda sobre o conteúdo, gradiente botões, e quatro botões de ícones soltos para o interruptor de visualização. Alto onde fez não importa e quieto onde ele fez — nada na tela respondeu à pergunta um calendário é realmente aberto para responder. A ideia organizadora é agora: o que vem a seguir, e quanto tempo resta do dia. - NextUpBar fica acima da grade com o tempo, o próximo evento e um live contagem regressiva, por cima de uma linha de cabelo mostrando até onde vai o dia de trabalho. - NowSpine desenha o momento atual através da grade da semana com o seu tempo em a sarjeta, e PastVeil dessatura as horas já se foram para o que é À esquerda de hoje lê-se de relance. A cor está reservada para estes: eles são a única coisa ao vivo na página, então eles são a única coisa permitida A cor do inquilino em plena força. - ViewSwitcher substitui os quatro botões de ícone. Quatro ícones lidos como quatro ações não relacionadas; um controle segmentado lê como uma configuração com quatro posições, que é o que é. A pílula selecionada desliza entre eles via um layout compartilhadoId em vez de crossfading. O tempo é definido em Geist Mono com figuras tabulares ao longo de todo o tempo — carril hora, relógio, contagem regressiva, números de data — então colunas de tempo são uma borda reta e dígitos Não se preocupem com o tique-taque. CalendarThemeScope espelha a consola de contactos: O alfa() do MUI não consegue processar var(), assim as propriedades pintadas são sobrepostas e o Sombras. Cada token deriva de -- color-primary, por isso isto lê como projetado Sob a marca de qualquer inquilino em vez de assumir uma. Mês chips evento tornar-se um chão colorido com uma ponta sólida em vez de texto branco em preenchimento saturado, ilegível a 11px. As linhas da semana são uma altura fixa porque a coluna converte o tempo em pixels — uma linha que cresceu deixava-o apontando para a hora errada; uma hora lotada pergaminhos em vez disso. Movimento reduzido é respeitado: o pulso e a parada de slides, o relógio faz Não. Sua posição é informação, e um relógio parado seria errado em vez do que a calma. Corrige também dois erros reais encontrados ao trabalhar aqui: o selecionador do calendário foi executado UUID ids through Number (), então cada valor foi NaN, e ele ofereceu calendários o membro não pode escrever para. Ele agora lista apenas as escritas, que é como O calendário da organização permanece apenas para leitura sem o direito de publicação.
· InitializerService
Mover calendários para os membros e dar a cada org um compartilhado
Calendários e eventos eram de propriedade de uma conta e não levavam nenhuma organização. Isto atribui cada um aos primeiros membros do seu proprietário — a organização a conta pertenceu ao mais longo, que na prática é onde o calendário foi feito — assim um calendário pousa em exatamente uma organização em vez de ser duplicado em todos eles. As contas onde essa escolha foi material são contado no log, porque para eles o calendário deixa de ser visível de As suas outras organizações. Os eventos seguem o calendário em que vivem e não o seu próprio utilizador. evento nunca pode acabar em uma organização diferente do calendário A mostrar. O DROP DEFAULT no user id é a instrução de carga. Essa coluna antecede esta alteração e levou DEFAULT unique rowid() de User.id all junto, inofensivamente, porque não era NULL e sempre escrito explicitamente. Tornando-o nulável para que o calendário partilhado pudesse existir sem um proprietário tornou-o letal: um INSERT que omite o user id dispara o padrão, inventa um ID do usuário pertencente a ninguém, e falha a chave estrangeira para os usuários. Isto é... exatamente como a primeira execução providenciou calendários de organização zero. A entidades agora fixam o tipo de coluna para que o ddl-auto não possa restaurá-lo. Idempotente em todo: os backfills só tocam linhas sem membro ainda, e O calendário partilhado só é inserido se uma organização não tiver nenhum.
· kamo-shared-library
Calendários de escopo para o membro, e adicionar o direito de publicação em todo o org
UserCalendar e CalendarEvent penduraram o USER ID sozinho e não carregaram organização. Um usuário é global e um membro é aquele usuário dentro de um organização, então uma conta pertencente a várias organizações tinha uma pilha de calendários visíveis de todos eles. Ambas as entidades ganham ID MEMBRO e ORGANIZAÇÃO ID, e ganhos de calendário IS ORG CALENDAR — o calendário partilhado que uma organização tem, legível por cada membro e gravável apenas com o novo direito. Estadias de ID do utilizador, povoadas e nulável: CalDAV e as tarefas de sincronização externa autenticam uma conta em vez de uma associação, então eles leem legitimamente pelo usuário. Simplesmente deixa de ser o âmbito de autorização. Cada nova coluna de junção pins colunaDefinição = "INT8", incluindo o Os utilizadores preexistentes. Esquerda sem pino, Hibernate copia as chaves referenciadas INT8 DEFAULT unique rowid () no FK; uma inserção que omite a coluna em seguida, inventa um id pertencente a nada e falha a chave estrangeira. Isto é... não hipotético — foi o que impediu a primeira migração disponibilização de um calendário único de organização. CREATE ORG CALENDAR EVENTS (196). Ler o calendário fica VER CALENDÁRIO; isto governa somente quem pode colocar algo no calendário toda a organização vê. findByOrganizaçãoMemberId é renomeado findByUserId. Nunca foi membro — a consulta é e era c.user.id = :userId — e o nome é o que convidou esta classe de bugs. findVisibleToMember e seu equivalente de evento são o membro-escoberto lê.
· InitializerService
Contatos de livro de endereços compartilhados à mão para seus proprietários
EmailService agora examina todos os contatos lidos para contact books.owner id, que deixa os contatos já sentados em uma organização-padrão sem proprietário livro inatingível. CONTACT.OWNER ID NÃO é NULL e foi povoado em cada linha desde que o caminho de criação começou a defini-lo, então o membro que adicionou cada contato é conhecido exatamente — nada é inferido. Esta disposição livro pessoal por (organização, proprietário) e move cada contato para o seu Do próprio proprietário. Duas coisas estão deliberadamente encalhadas e contadas no diário de bordo em vez de forçado: - Colisões de UID. uk contact uid book é único em (UID, CONTACT BOOK ID), então um contato cujo UID já existe no destino falharia Toda a atualização e nada. Essas linhas ficam paradas; reescrever um UID seria Quebre o cliente do CardDAV que o emitiu. - Grupos de propriedade mista. Uma linha contact groups tem um livro mas nenhum proprietário, então um grupo cujos membros pertençam a várias pessoas não pode ser atribuído a Um deles. Apenas grupos cujos membros compartilham um único proprietário são movidos. O próprio livro sem dono é mantido: sua restrição de cheque é o que o torna legal, e derrubá-lo seria cascata em grupos e membros. O controle de conta encalhada testa contatos e grupos, não apenas contatos. A grupo é atribuído através dos proprietários de seus membros em vez de através de onde esses membros vivem, assim os grupos permanecem móveis depois de cada contato já moveu- se; contando os contatos sozinho os ignoraria em uma segunda execução.
· VOIPService
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 PostgreSQLDialect.
· SecurityService
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 PostgreSQLDialect.
· RAGService
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 PostgreSQLDialect.
· MediaService
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 PostgreSQLDialect.
· MCPGatewayService
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 PostgreSQLDialect.
· KBService
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 PostgreSQLDialect.
· kamolos
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 PostgreSQLDialect.
· ESigService
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 PostgreSQLDialect.
· EmailService
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 PostgreSQLDialect.
· DocsService
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 PostgreSQLDialect.
· DaemonService
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 PostgreSQLDialect.
· ConversionService
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 PostgreSQLDialect.
· APIService
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 PostgreSQLDialect.
· BillingService
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 PostgreSQLDialect.

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