Um escritório de imigração guardava passaportes, contratos e comprovantes numa pasta por cliente. Antes de cada atendimento, alguém abria tudo e montava a ficha na mão. Agora isso é um popup dentro do próprio CRM.
Percorre a pasta do cliente inteira, em qualquer profundidade, e mostra tudo agrupado por onde estava.
Tudo vem marcado; basta desmarcar o que não interessa. Documento antigo ou duplicado não entra na conta.
Passaporte fotografado, carteira de residência, comprovante amassado. A leitura é visual, sem OCR prévio.
Sai na mesma ficha que a equipe já preenchia à mão, com uma seção de pendências no fim.
Um botão no cliente ou no processo abre o popup. Os dois caminhos chegam à mesma pasta de documentos — a do cliente.
O popup varre as sub-pastas e lista tudo. A pessoa desmarca o que não quer e vê quantas chamadas aquilo vai custar antes de confirmar.
Os documentos vão em lotes, com progresso na tela. No fim a ficha aparece pronta — e, quando vem do processo, também fica gravada no registro.
A primeira versão era uma função só, que fazia tudo sozinha. Ela esbarrava no limite de chamadas por execução e parava em nove documentos. Mover a orquestração para o popup, com funções pequenas por trás, derrubou o teto — e deu progresso visível de graça.
O código real é específico demais do CRM para ser útil fora dele — e envelhece a cada mudança da plataforma. O que se aproveita é a forma, e ela cabe em quatro blocos curtos.
A recursão fica no popup, não na função. Cada pasta vira uma execução independente — é isso que elimina o teto de arquivos e dá o andamento na tela sem esforço extra.
O tipo do arquivo é decidido pelo cabeçalho dos bytes, nunca pela extensão. Foto de celular renomeada é a regra, não a exceção.
A consolidação não vê os documentos — só os textos parciais. É uma chamada barata que existe para uma coisa só: garantir que a saída tenha sempre a mesma forma.
O mesmo popup atende dois módulos e se comporta diferente em cada um. Escrever num campo do cadastro é o único ponto que pede confirmação humana.
Estas consumiram a maior parte do tempo. Nenhuma aparece numa busca óbvia, e quase todas falham em silêncio — que é o pior tipo de falha.
O domínio dedicado a download respondia escopo inválido mesmo com todas as permissões concedidas — é um serviço separado, herdado de um produto antigo da plataforma.
O que funciona é o mesmo host da API de listagem. Foram horas conferindo escopos que já estavam certos.
As funções rodavam perfeitamente pelo editor, mas o popup recebia api is inactive. Chamada por API é um interruptor separado, desligado por padrão, numa tela que não aparece no fluxo de criação.
Ligar só a autenticação por sessão — a por chave deixaria a função acessível de fora do CRM.
As instruções de log da linguagem não aparecem no log exportado quando a função roda por botão. Depurar às cegas custa horas.
Escrever o diagnóstico num campo do próprio registro e, depois, fazer o popup exibir a resposta crua em vez de uma mensagem genérica.
Um arquivo terminado em .jpeg era PNG. A API de inferência valida os bytes e recusa a requisição inteira por causa de um único anexo.
Decidir o tipo pelo cabeçalho dos bytes e usar a extensão apenas como pré-filtro.
Na tela que liga o botão à função, digitar o nome do campo e escolhê-lo na lista produzem telas idênticas. A primeira passa texto literal — a função recebe a string Deal Id em vez do identificador do registro.
Só o valor escolhido pela lista fica destacado. Esse detalhe visual é a única diferença entre funcionar e falhar.
A URL base já apontava para dentro da pasta da aplicação. Informar o caminho completo do arquivo gerava um segmento repetido e um 404 sem explicação.
Conferir onde a base termina antes de compor o resto — vale para qualquer plataforma que monte URL a partir de dois campos.
Rodar tudo dentro do CRM elimina infraestrutura, mas impõe tetos. Vale conhecê-los antes de escolher esse caminho.
| Limite | Motivo | Saída |
|---|---|---|
| PDF e imagem | são os formatos que o modelo lê direto | converter antes de enviar |
| A pessoa espera na tela | o popup precisa ficar aberto até o fim | fila com notificação |
| Custo por clique | nada é reaproveitado entre execuções | cache por documento |
| Leitura, não conferência | o modelo transcreve o que vê, não valida | revisão humana antes de usar |
Este caso saiu do zero ao ar sem infraestrutura nova, e a segunda versão nasceu de usar a primeira por um dia. Se o seu processo tem um passo de "alguém precisa ler tudo isso antes", provavelmente dá para fazer o mesmo.
Conversar sobre o seu caso