AppTech — Plataforma de Gestão
Um ERP-satélite que unifica vendas, recebimentos, fiscal, jurídico e RH de uma construtora.
- processos no pipeline histórico
- ~2,7M
- módulos com permissão por usuário
- 13
- pipelines de ETL incrementais
- 20+
Da dor ao resultado
Antes
Dezenas de planilhas e consultas manuais ao ERP. Cada área tinha sua própria cópia dos números, muitas vezes desatualizada.
A operação dependia de dezenas de planilhas e consultas manuais ao ERP UAU (SQL Server) e ao TOTVS RM (folha de pagamento). Fechamentos de vendas, conciliação bancária, fiscal e jurídico consumiam horas e eram propensos a erro.
Não havia uma visão única e confiável: cada área tinha sua própria cópia dos números, muitas vezes desatualizada.
E cada demanda nova de um setor virava mais uma planilha ou mais um sisteminha isolado — o que multiplicava logins, bases divergentes e manutenção.
Como · 1/5
Construí uma aplicação Flask + React com um banco PostgreSQL próprio, alimentado por mais de vinte pipelines de ETL que extraem incrementalmente do UAU, do TOTVS RM e de planilhas — com watermarks, UPSERT por chave natural e resiliência a RESTORE das réplicas.
Como · 2/5
Sobre esses dados, entreguei 13 módulos com permissão por usuário — Vendas, Recebimentos, Área dos Administrativos, Conciliação Bancária, Fiscal/Contabilidade, Jurídico, RH/Departamento Pessoal, Protestos, Centro de Inovação, Usuários, entre outros. Os maiores se desdobram: o RH reúne onze sub-módulos e o Fiscal, oito.
Como · 3/5
A decisão de arquitetura que sustenta isso: toda ferramenta nova entra como módulo do AppTech, nunca como aplicação separada. Cada setor ganha seu próprio painel agrupando o que lhe interessa, mas a base de dados, a autenticação e o deploy continuam sendo um só.
Como · 4/5
O sistema jurídico, que nasceu como aplicação separada, foi o teste dessa regra: migrei-o para dentro do AppTech como módulo — processos judiciais, rateios entre obras, pagamentos a escritórios e empresas monitoradas —, trouxe o histórico conferido 1:1 (197 rateios, 3.340 itens) e desliguei o legado.
Como · 5/5
Tudo empacotado em Docker e servido em produção via Docker Swarm + Traefik, com deploys rolling e healthchecks.
Depois
Uma plataforma única ao redor do ERP: vendas, financeiro, fiscal, jurídico e RH em 13 módulos, com uma só base e um só login. Demanda nova vira módulo, não mais uma planilha.
- ~2,7M
- processos no pipeline histórico
- 13
- módulos com permissão por usuário
- 20+
- pipelines de ETL incrementais
Como ler o diagrama
Mais de vinte pipelines incrementais consolidam os sistemas de origem num Postgres; sobre ele, treze módulos e as saídas que a operação usa — inclusive os lançamentos jurídicos de volta no ERP. A folha entra por VPN, aberta só durante a extração. O Postgres desenhado como um só é uma simplificação: reúne o banco do AppTech e o banco jurídico que ele lê e enriquece.
Destaques técnicos
- 1 Pipeline histórico de ~2,7 milhões de processos de pagamento desde 2014. A primeira carga é fatiada por ano e resumível — em volume desse tamanho, um job que precisa recomeçar do zero a cada queda nunca termina. Depois disso, só incremental por janela deslizante.
- 2 ETL fiscal resiliente a RESTORE da réplica SQL Server: a réplica é restaurada periodicamente e isso invalidaria o controle de posição. Watermark mais UPSERT por chave natural fazem a carga se recuperar sozinha em vez de duplicar ou perder linha.
- 3 A folha de pagamento vive atrás de VPN. O ETL do TOTVS RM abre o túnel apenas durante a extração e o fecha em seguida, via context manager — a janela de exposição é o tempo da query, não o uptime da aplicação.
- 4 Lançamento jurídico no ERP em sequência de passos — gerar o processo, anexar o documento, comentar — como fila assíncrona: o progresso fica na própria linha, com heartbeat, e o item que para no meio é detectado e liberado para nova tentativa. Depois que o processo existe no ERP, o rateio trava: o sistema recusa a edição em vez de deixar o banco divergir do ERP.
- 5 Enriquecimento de processos judiciais cruzando bases públicas e uma fonte paga, com rate limiting em janela deslizante e controle de custo: antes de cada consulta tarifada o robô confere o saldo e para sozinho ao atingir a reserva mínima. A cidade sai do cruzamento do órgão julgador com a base oficial de municípios.
- 6 Notificação por WhatsApp com entrega verificada: a API respondia sucesso e a mensagem simplesmente não chegava, por uma divergência no identificador do destinatário. Passei a confirmar o identificador válido antes de enviar, com cache e degradação segura.
- 7 Geração de planilhas de terceiros preservando macros, imagens e vetores — que qualquer biblioteca de escrita destrói ao salvar o arquivo.
- 8 Deploy em Docker Swarm com Traefik, DNS interno resolvido por requisição no Nginx — sem isso o proxy quebra se o backend ainda não subiu — e healthcheck com carência de inicialização para não derrubar container que só está começando.