2026-02-06//LOG
Maquinas de Estado em Producao: 16 Estados da Contabilidade
O TOPO Contabil tem um workflow de conciliacao bancaria. Quando mapeei pela primeira vez, contei 16 estados distintos. DEZESSEIS. De "importacao_bruta" ate "conciliado," "parcialmente_conciliado," "contestado," "revisao_manual," "aprovado," "lancado," e mais uns nove que existem porque contabilidade eh um pesadelo vestido de planilha Excel.
A primeira versao usava flag booleana. Tu conhece o padrao. isRevisado, isAprovado, isLancado, isContestado, isConciliadoManualmente. Cinco booleanos = 32 combinacoes possiveis, das quais talvez 16 sao validas e o resto eh dado corrompido esperando pra estourar. A gente pegou um bug onde uma transacao tava simultaneamente "contestada" E "aprovada" porque duas pessoas clicaram botao ao mesmo tempo e os booleanos fizeram o que booleanos fazem. Alternaram independente. Caralho.
Maquina de estado resolve isso COMPLETAMENTE. Uma transacao no estado "contestado" SO pode transicionar pra "em_revisao" ou "rejeitado." Nao pode magicamente virar "aprovado" porque nao existe aresta no grafo que permita isso. A maquina de estado eh a lei, e a lei nao eh negociavel.
A arquitetura eh assim. Cada estado eh um objeto com tres coisas: transicoes permitidas, condicoes de guarda e efeitos colaterais. Guard checa regra de negocio antes de permitir transicao. Esse usuario pode aprovar transacao acima de R$10K? A documentacao de suporte ta anexada? Efeitos colaterais disparam DEPOIS de transicao bem-sucedida. Manda notificacao. Cria entrada no log de auditoria. Atualiza o livro razao.
O problema da explosao de estado eh real. 16 estados com media de 3 transicoes cada = 48 arestas no grafo. Cada aresta tem guard e efeito colateral. Eh MUITO codigo se tu nao tomar cuidado. Solucao: convencao sobre configuracao. A maioria dos guards eh composavel. "temPermissao AND temDocumentacao AND valorAbaixoDoLimite." Tu monta uma biblioteca de funcoes guard pequenas e compoe. Mesma coisa pros efeitos colaterais.
A gente armazena o estado atual e o historico completo de transicao. Cada mudanca de estado eh entrada append-only no log com timestamp, usuario, estado anterior, estado novo e resultados dos guards. Isso NAO eh opcional pra software contabil. Auditor VAI perguntar "quem moveu isso de contestado pra aprovado e quando." Se tua resposta for "eh, deixa eu checar as colunas booleanas," tu ta ferrado.
Dezesseis estados. Zero combinacoes impossiveis. Esse eh o pitch.