From financeiro
Processa fatura de cartão de crédito em lote e lança no FIN App via fin_fatura_transacoes (NÃO via despesa avulsa, regra de negócio do FIN). Aceita 5 formatos (preferência: OFX > CSV > CNAB 240 > texto colado > PDF). Identifica o cartão automaticamente, detecta período REAL da fatura (importante: pode variar do ciclo cadastrado), trata estorno (reversal_of_id) e parcelamento sem duplicar. Garante idempotência. No fim, oferece pagar a fatura via fin_pagar_fatura.
How this skill is triggered — by the user, by Claude, or both
Slash command
/financeiro:fatura [caminho-do-arquivo OU 'colado'][caminho-do-arquivo OU 'colado']This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
- Pessoa quer processar **uma fatura de cartão de crédito inteira**
/financeiro:extrato/financeiro:lancarfin_pagar_fatura direto/financeiro:instalar-fin-mcp/financeiro:onboarding primeiro~/.fin-plugin/config.json existe → leia financeiro_pathFinanceiro/ existemfin://docs/guia nessa sessão (CRÍTICO pra essa skill — fatura tem várias regras de negócio do FIN)extrato| Aspecto | Extrato (conta) | Fatura (cartão) |
|---|---|---|
| Tool de lançamento | fin_criar_despesa, fin_criar_receita, fin_criar_transferencia | fin_fatura_transacoes (uma chamada com lista) |
| Período | Datas do extrato (mês civil normalmente) | Período REAL da fatura (pode variar do ciclo cadastrado) |
| Estorno | Raro | Comum — tratamento especial via reversal_of_id |
| Parcelamento | Não se aplica | Comum — FIN gera parcelas automaticamente, não duplicar |
| Pagamento | Não se aplica | Depois de lançar, oferece fin_pagar_fatura |
| Conta destino | Conta corrente/poupança | Cartão de crédito (também é conta no FIN) |
3 formas (mesmo do extrato):
Forma A: Caminho de arquivo em $ARGUMENTS
Forma B: Pessoa colou o conteúdo na conversa
Forma C: Pessoa anexou um PDF
Tenta identificar de qual cartão é a fatura:
Cruza com Contas e Cartões.md pra achar o cartão correspondente.
Se não conseguir identificar:
Não consegui identificar de qual cartão é essa fatura. Qual dos teus cartões? [lista cartões de crédito de Contas e Cartões.md]
Se identificar mais de um possível:
Pode ser [cartão A] ou [cartão B]. Qual?
REGRA CRÍTICA: o período da fatura pode ser diferente do dia de fechamento cadastrado por causa de fim de semana, feriado, ciclo do banco.
Procura no conteúdo da fatura:
O período real = (data da primeira transação, data da última transação) ou as datas explícitas do cabeçalho da fatura, o que for mais confiável.
⚠️ Detectar arquivo histórico vs arquivo-da-fatura. Vários bancos exportam o CSV/OFX com o histórico inteiro do cartão (várias faturas misturadas), não só a fatura corrente. Se o range de datas do arquivo for maior que ~45 dias, NÃO assuma que é tudo a mesma fatura. Mostra pra pessoa o range encontrado e os blocos prováveis (linhas pré-data X, linhas pós-data X) e pergunta:
Esse arquivo cobre N faturas (de DD/MM a DD/MM). Vou processar só a fatura [período real detectado], e ignorar as outras linhas. Confirma?
Linhas fora do período da fatura corrente devem ser descartadas com motivo explícito ("já em fatura paga", "fatura futura", "linha de pagamento — ver Casos especiais").
Compara com o cartão em Contas e Cartões.md:
Cartão: [nome]
Fechamento cadastrado: dia X
Período REAL detectado: DD/MM/YYYY a DD/MM/YYYY
→ Variação: fechamento real foi dia X+N (esperado dia X). Diferença +N dias.
Se variou ≤2 dias, anota em Contas e Cartões.md e segue:
Avisa a pessoa:
Detectei: fatura do [cartão], período real DD/MM/YYYY a DD/MM/YYYY (fechamento observado dia X, cadastrado é dia Y, diferença de N dias). Atualizei tua memória.
Se variou >2 dias OU se nome do cartão na fatura é diferente do cadastrado: PAUSA, não segue. Pergunta:
O cartão [nome no cadastro] tá com fechamento dia [X], vencimento dia [Y] na minha memória. Mas essa fatura tá com fechamento dia [X+N] / vencimento dia [Y+N] / nome comercial "[nome real]". Isso pode ser:
- O cartão mudou de plano/regra recentemente → atualizo cadastro com
fin_editar_conta?- Essa fatura é de outro cartão que tu tem → me diz qual?
- O cadastro tava errado desde o início → corrijo?
Sem isso, posso lançar no cartão errado.
Não prossegue sem resposta. Esse cuidado existe porque banco brasileiro às vezes muda dia de vencimento na troca de plano sem o cliente perceber, e a memória do plugin pode ter sido cadastrada errada no onboarding.
Procura na fatura:
Anota pra usar depois no fin_pagar_fatura.
Se o vencimento detectado diverge >2 dias do due_day cadastrado → ver Passo 3, mesmo fluxo de pausar e perguntar.
Mesma lógica do extrato pros 5 formatos (OFX, CSV, CNAB 240, texto, PDF). Extrai pra cada transação:
REGRA CRÍTICA do FIN: estorno em cartão NÃO é receita. No banco vira despesa vinculada à original (coluna reversal_of_id), mas a única forma de criar é via fin_criar_estorno — fin_criar_despesa não aceita mais reversal_of_id no body (retorna 400).
Pra cada transação que parece estorno (descrição contém "ESTORNO" / "DEVOLUÇÃO" / "REEMBOLSO" OU valor negativo numa fatura):
fin_buscar_transacoes filtrando por mesmo cartão, valor próximo (positivo do mesmo módulo), descrição parecida, dentro de uma janela de tempo (tipicamente até 3 meses antes)fin_criar_estorno (tool atômica): passa original_transaction_id + amount_cents. Valida ownership + 7 invariants, herda account/category/subcategory da original automaticamente, deriva reversal_kind ('full' ou 'partial') baseado no amount. Sem precisar passar descrição (vira "Estorno: ") nem conta.fin_criar_estorno se achar a original."Nunca lança estorno como receita.
TL;DR:
fin_criar_despesa com installments: N, amount_cents = valor_parcela * N. FIN cria as outras N-1 sozinho.fin_criar_despesa com installments: N + current_installment: X + original_purchase_date: <data real da compra>. FIN coloca cada parcela na fatura certa.REGRA CRÍTICA do FIN: parcelamento gera múltiplas transações automaticamente no FIN. Você não duplica.
Pra cada transação que parece parcelada:
fin_criar_despesa com installments: N e amount_cents = valor_da_parcela * N (valor TOTAL da compra). O FIN cria as N parcelas automaticamente nas faturas seguintes. NÃO passar current_installment — deixar o default (1).installments: N, current_installment: X e original_purchase_date com a data REAL da compra original. O backend caminha pelos ciclos do cartão (usando closing_day/due_day) e coloca cada parcela (X, X+1, ..., N) na fatura correta automaticamente. Não precisa pensar em tx_date nem invoice_cycle_end — só informar a data da compra histórica.original_purchase_date é melhor que os workarounds anteriores: antes o caller tinha que escolher entre (a) passar tx_date alinhado com o mês atual (anti-intuitivo) ou (b) lançar N-X+1 despesas avulsas numeradas manualmente. Ambos davam erro fácil. Agora é uma chamada só com os 3 campos + original_purchase_date e o backend coloca as parcelas nas faturas certas.current_installment)original_purchase_date + current_installment como no item 2 acima.invoice_cycle_end = data de fechamento da fatura atual se a tx_date original cai num ciclo antigo.Mostra na tabela de revisão:
=== PARCELAMENTOS DETECTADOS ===
| Descrição | Parcela | Ação |
|-------------------------|---------|---------------------------------------|
| NOTEBOOK PARC 01/12 | 1/12 | Lançar como nova compra parcelada |
| NOTEBOOK PARC 02/12 | 2/12 | Pular (FIN gerou automaticamente) |
| TV PARC 05/10 | 5/10 | Pular (parcela 1 foi em fatura ant.) |
Antes de lançar, busca no FIN as transações já existentes da fatura desse cartão pro período via fin_fatura_transacoes(card_name, reference_month).
Algoritmo de matching (CSV/extrato vs FIN), em 3 passadas:
(tx_date, abs(amount_cents), tipo) — onde tipo = 'refund' se valor < 0 senão 'charge'. Pra cada match, marca ambos lados como conciliados.Depois das 3 passadas:
Se restar sobra do FIN não-óbvia, mostra pra pessoa antes de seguir, não ignora.
Pra OFX use FITID quando disponível (mais confiável que data+valor).
Sanity check obrigatório no fim do passo 12: depois de lançar, chama fin_fatura_cartao de novo e confere se total_cents bate com o valor que a pessoa informou no início (ou que tava no cabeçalho da fatura). Se NÃO bater, mostra a diferença e pergunta antes de declarar sucesso.
Lê Estabelecimentos.md. Aplica regras conhecidas. Marca como "a categorizar" o que não tiver regra.
Mostra UMA tabela com TUDO:
=== FATURA: [cartão] — Período real DD/MM a DD/MM/YYYY — Vencimento DD/MM ===
=== JÁ EXISTEM NO FIN (vão ser ignoradas) ===
| Data | Valor | Descrição | Categoria |
... [N linhas]
=== PARCELAS JÁ GERADAS PELO FIN (vão ser ignoradas) ===
| Data | Valor | Descrição | Parcela | Compra original |
... [P linhas]
=== ESTORNOS (com original encontrada) ===
| Data | Valor | Descrição | Despesa original revertida |
... [E linhas]
=== CATEGORIZADAS AUTOMATICAMENTE ===
| Data | Valor | Descrição | Categoria sugerida | Regra |
... [M linhas]
=== A CATEGORIZAR (preciso de tu) ===
| # | Data | Valor | Descrição | Categoria? |
... [K linhas]
=== SUSPEITOS DE DUPLICATA ===
... [J linhas]
=== RESUMO ===
- Cartão: [nome real]
- Período: DD/MM a DD/MM/YYYY
- Vencimento: DD/MM/YYYY
- Total de linhas na fatura: N
- Já existiam: M
- Parcelas FIN-gerenciadas: P (puladas)
- Estornos: E
- Categorizadas: K
- A categorizar: Q
- Suspeitos: S
- Total a lançar: T
Mesmo do extrato:
fin_fatura_transacoesREGRA CRÍTICA do FIN: fatura inteira é lançada via fin_fatura_transacoes em uma chamada só com a lista de transações, NÃO linha por linha via fin_criar_despesa.
Confira a description da tool fin_fatura_transacoes no MCP antes de chamar pra ver o formato exato esperado.
Estrutura provável (confira na description):
fin_fatura_transacoes(
cartao_id: <id>,
periodo_inicio: "YYYY-MM-DD",
periodo_fim: "YYYY-MM-DD",
vencimento: "YYYY-MM-DD",
transacoes: [
{
data: "...",
valor: ...,
descricao: "...",
categoria_id: ...,
subcategoria_id: ...,
parcelas: N (se aplicável),
reversal_of_id: ... (se for estorno)
},
...
]
)
Se a chamada falhar, anota e mostra erro claro.
Estabelecimentos.mdEstabelecimentos novos categorizados pela pessoa → linhas novas.
Contas e Cartões.mdAtualização de "fechamento observado" se variou (já feito no Passo 3).
Status Conciliação.md| [cartão] | Fatura DD/MM-DD/MM/YYYY | Conciliado | YYYY-MM-DD | [FITIDs ou hashes] |
Preferências.mdDecisões não-óbvias se houver.
Depois de lançar com sucesso, pergunta:
Fatura lançada. Vencimento: DD/MM/YYYY. Total: R$ X. Quer que eu marque como paga agora? (vou usar
fin_pagar_fatura— você precisa me dizer de qual conta saiu o pagamento)
Se sim:
fin_pagar_fatura com cartão + conta + dataStatus Conciliação.md se aplicávelSe não:
✓ Fatura processada.
- Cartão: [nome real]
- Período real: DD/MM a DD/MM/YYYY (variou ±N dias do ciclo cadastrado, atualizei)
- Vencimento: DD/MM/YYYY
- Total: R$ X
- Lançadas: T transações
- Estornos tratados: E (com reversal_of_id)
- Parcelas auto-geradas pelo FIN puladas: P
- Aprendi K estabelecimentos novos.
- Pago: ✓ via [conta] / SIM (ou: NÃO, lembro depois)
Aparece toda fatura, mesmo valor, mesma descrição. Aprende como regra muito rápido (1-2 ocorrências já é suficiente porque o padrão é óbvio).
"ANUIDADE" / "ANUID DIFERENC" → categoriza em "Taxas, Juros & Impostos > Anuidade/Taxas cartão". Aprende como regra global pro cartão.
"IOF" / "REPASSE IOF" → "Taxas, Juros & Impostos > IOF". Compras em USD/EUR aparecem com símbolo da moeda — registra valor em BRL conforme a fatura mostra.
"SAQUE CARTAO" / "SAQUE FATURA". Isso é um adiantamento, gera juros. Categoriza em "Taxas, Juros & Impostos > Juros saque cartão". Avisa a pessoa: "Detectei saque no cartão, isso gera juros. Tu sabia?"
Aliases conhecidos (cada banco usa um label diferente — match case-insensitive na descrição):
Isso é o pagamento da fatura passada, NÃO é um estorno nem uma transação nova. Pula, não lança nada. Esse pagamento já foi registrado quando a fatura anterior foi paga via fin_pagar_fatura. Marca como descartado com motivo "linha de pagamento".
Algumas plataformas funcionam como guarda-chuva: a mesma string aparece pra dezenas de assinaturas/cobranças diferentes do mesmo usuário. Exemplos:
APPLE.COM/BILL / APPLECOMBILL → pode ser Splitwise, YouTube Premium, iCloud, HBO Max, App Store, qualquer assinatura via Apple ID.GOOGLE *<merchant> / GOOGLE PLAY → assinaturas Android, jogos, YouTube.PAYPAL *<merchant> → varia por sub-string depois do asterisco.MP *<merchant> / MERCADOPAGO → cobrança via MercadoPago, varia pelo sub-merchant.NÃO categorizar automático nesses merchants, mesmo com 3+ ocorrências. Sempre perguntar pra pessoa, ou inferir pelo valor (ex: "Apple R$ 99,90 — Splitwise? YouTube Premium? Outra?").
Em Estabelecimentos.md esses devem ficar marcados como "ambíguo permanente" (não "aguardando 3ª ocorrência"). Se o template de Estabelecimentos.md ainda não tem esse marcador, criar uma seção "Ambíguos permanentes (sempre perguntar)" separada da seção de "candidatos aguardando regra".
Cenário: a pessoa fez uma compra, pediu reembolso pro merchant, mas o crédito ainda não veio. A despesa precisa ser lançada normalmente na fatura corrente (porque vai cobrar normal), mas vale marcar pra acompanhamento.
Convenção:
tag: "refund-pendente" (ou refund-esperado-<valor> se quiser registrar o valor esperado).Status Conciliação.md, mantém uma seção "Refunds pendentes" com (data, descrição, valor, transaction_id, fatura onde foi cobrada).fin_criar_estorno(original_transaction_id, amount_cents) apontando pra essa tx. Remove a entrada do "Refunds pendentes" e atualiza pra "Reembolsado em [data]".A skill deve proativamente perguntar "Tem algum refund pendente esperado?" só se a pessoa mencionar reembolso, devolução, "pedi pra eles devolverem", etc. Não fica perguntando em toda fatura.
Algumas faturas mostram "RESGATE PONTOS R$0,00" — pula, não tem valor.
Compras internacionais aparecem com USD/EUR + BRL convertido. Lança o valor em BRL (que é o que vai ser cobrado). Anota a moeda original na descrição se for útil.
"ESTORNO PARCIAL R$50 de R$200" — busca a original de R$200 (fin_buscar_transacoes) e chama fin_criar_estorno com original_transaction_id + amount_cents: 5000. A original NÃO é apagada.
Processa em batches de 50 linhas pra revisão (mesma lógica do extrato).
fin_criar_despesa → SEMPRE usa fin_fatura_transacoesfin_criar_estorno (que grava como despesa vinculada via reversal_of_id no banco)fin://docs/guia → fatura é onde mais tem regra de negócio do FIN, lê a docPT-BR informal, direto. Sem travessão (—). Mostra trabalho ("identificando cartão...", "detectando período real...", "buscando despesas originais dos estornos..."), tabelas claras, confirmações curtas.
npx claudepluginhub pe-menezes/fin-claude-plugin --plugin financeiroProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.