Use quando o usuário quiser registrar uma nota/cupom de supermercado (foto, PDF/print do app ou ditado), catalogar os produtos comprados por tipo/marca/quantidade, lançar a compra no orçamento agrupada por categoria, ou gerenciar o catálogo de produtos. Os dados ficam na pasta de mercado do hestia no Google Drive (configurável por workspace/defaults). Para análise de preços e quantidades, use a skill analisar-mercado.
Install
npx skillscat add sallzzbr/hefesto-publico/mercado Install via the SkillsCat registry.
Mercado — Registro de Notas e Catálogo
Esta skill ensina como transformar notas de supermercado em dados estruturados: itens com
quantidade e preço em CSVs mensais, e um catálogo vivo que dá identidade estável aos produtos
("ARROZ AGULH CAMIL T1 5KG" na nota é sempre "Arroz Camil 5kg" nos dados). Esta skill é só
INSTRUÇÃO: quem acessa o Drive é o conector do Google Drive.
Regras invioláveis
- Dados ficam no Google Drive, na pasta resolvida (ver "Onde ficam os dados"; caminho,
nunca ID). Conector indisponível → PARE e peça para conectar; nunca invente dados. - Confirme antes de QUALQUER escrita, mostrando exatamente o que será gravado.
- Exibir em BRL, gravar no formato cru (
R$ 18,90na tela;18,90no CSV — vírgula
decimal, sem milhar, semR$). - Extração nunca inventa. Campo ilegível na foto/PDF → pergunte; não estime.
- Sem conselho financeiro; esta skill registra e organiza.
Onde ficam os dados
Subpasta mercado/ da pasta-base do hestia, resolvida pela regra única de${CLAUDE_PLUGIN_ROOT}/skills/orcamento/references/defaults.md (workspace → defaults do
usuário → default Financas/hestia/); os paths citados nos exemplos são ilustrativos do
default, não hardcode. CSVs com separador ; e escape RFC 4180 adaptado (padrão do
plugin — ver skill orcamento).
Itens do mês — AAAA-MM-itens.csv
data;mercado;produto;quantidade;unidade;valor_unitario;valor_totaldata: AAAA-MM-DD (data da nota).mercado: nome do estabelecimento como o usuário o chama ("Pão de Açúcar").produto: sempre o nome canônico do catálogo — nunca o texto cru da nota.quantidade: número com vírgula decimal (2,0,650).unidade:kg|g|l|ml|un.valor_unitarioevalor_total: formato cru. Guardar os dois valida a extração
(quantidade × unitário ≈ total, tolerância de centavos).
Exemplo:
data;mercado;produto;quantidade;unidade;valor_unitario;valor_total
2026-07-12;Pão de Açúcar;Arroz Camil 5kg;1;un;18,90;18,90
2026-07-12;Pão de Açúcar;Leite Itambé Integral 1l;6;un;4,89;29,34
2026-07-12;Pão de Açúcar;Filé de frango;0,850;kg;24,90;21,17Catálogo vivo — produtos.csv
produto;tipo;marca;categoria;unidade_base;apelidosproduto: nome canônico legível ("Arroz Camil 5kg").tipo: agrupador de comparação entre marcas ("arroz", "café", "cerveja").marca: marca ("Camil"); vazio quando não se aplica (hortifruti).categoria: categoria do ORÇAMENTO (Alimentação, Limpeza, Higiene, Bebidas, Pet…) — usada no
lançamento agrupado no livro (Fluxo 2).unidade_base: unidade de comparação do preço unitário (kg,l,un).apelidos: nomes crus vistos nas notas, separados por|— cresce a cada nota casada, para
os próximos casamentos serem automáticos.
Exemplo:
produto;tipo;marca;categoria;unidade_base;apelidos
Arroz Camil 5kg;arroz;Camil;Alimentação;kg;ARROZ AGULH CAMIL T1 5KG|ARROZ CAMIL 5KG
Detergente Ypê 500ml;detergente;Ypê;Limpeza;un;DET YPE CLEAR 500MLFluxo 1 — Registrar nota
- Receba a nota: foto do cupom, PDF/print do app do mercado, ou ditado em linguagem
natural ("comprei no atacadão: 2kg de arroz Camil 18,90, 6 leites Itambé…"). - Extraia mercado, data e itens (nome cru, quantidade, unidade, valor unitário, valor total).
- Ilegível/ambíguo → pergunte os campos que faltam. Nunca estime.
- Se o total da nota estiver visível, confira contra a soma dos itens; divergência → mostre e
pergunte antes de seguir. - Item sem quantidade legível → registre com
quantidadeevalor_unitariovazios e só ovalor_total; avise que ele fica fora das comparações de preço unitário.
- Case cada item com o catálogo (
produtos.csv):- primeiro por
apelidos(comparação exata, ignorando maiúsculas); - depois por semelhança de nome/tipo/marca;
- sem match → proponha entrada nova (produto canônico, tipo, marca, categoria, unidade_base
sugeridos, todos editáveis pelo usuário). - Nome cru novo de produto já conhecido → proponha acrescentar ao
apelidos.
- primeiro por
- Mostre a tabela final completa (itens com nomes canônicos, quantidades, valores, soma
conferida + o que muda no catálogo) e grave TUDO com uma única confirmação: linhas novas
emAAAA-MM-itens.csv+ entradas/apelidos novos emprodutos.csv. Arquivo ausente → crie com
o cabeçalho, avisando. - Nota repetida? Antes de gravar, se já houver itens do mesmo mercado na mesma data com o
mesmo total, aponte e peça uma confirmação extra ("parece a mesma nota de 12/07 — registrar
mesmo assim?"). - Depois de gravar, siga para o Fluxo 2 (oferta de lançamento no livro).
Fluxo 2 — Lançar no livro do orçamento (agrupado por categoria)
Nota de mercado quase nunca é só Alimentação.
O agrupamento sai de SCRIPT
Não some os grupos de cabeça. Esta é a única conta do hestia cujo resultado é gravado: as
linhas vão para o livro do orçamento e de lá viram base das médias, desvios e tendências da skillanalisar-gastos. Erro aqui não produz uma frase errada — produz um histórico errado, e ele
contamina toda análise futura.
python3 ${CLAUDE_PLUGIN_ROOT}/scripts/nota.py \
--itens <AAAA-MM-itens.csv> --catalogo <produtos.csv> \
--data <AAAA-MM-DD> --mercado "<nome>" [--total-da-nota <total impresso na nota>]Ele agrupa por categoria, devolve as linhas prontas em lancamento_proposto.linhas, conferequantidade × valor_unitario ≈ valor_total por item (tolerância de 1 centavo — é o que custa
o mercado truncar onde a conta exata arredondaria) e, com --total-da-nota, confere a soma dos
itens contra o total impresso.
O que você narra em vez de contornar:
- Divergência é relatada, não recusada.
divergencias_de_extracaoeconferencia_do_total_da_notafazem o script sair 0 de propósito: vale aqui a regra do Fluxo 1
("mostre e pergunte antes de seguir"), e a decisão de gravar assim mesmo é do usuário. nao_cobertomaior que zero significa item fora do catálogo — o lançamento cobre menos
do que a nota. Diga o valor. Lançar menos do que se gastou é o modo de falha deste fluxo, e ele
acontece por omissão na narrativa, não por erro de conta.metodovem nulo de propósito: o script lê o CSV, não vê a nota. Use o método da nota se
visível; senão pergunte.lancamento_propostonulo quer dizer que a seleção pegou mais de uma nota — a descrição
nomeia mercado e data, então filtre com--datae--mercado.- Recusa por
valor_totalcom mais de 2 casas: não é valor pagável nem gravável, e
arredondar por conta própria faria a soma das linhas gravadas divergir da nota.
Passos
- Rode o
nota.pyacima; os grupos e as linhas vêm dele. - Ofereça lançar no livro do orçamento (
Financas/hestia/orcamento/AAAA-MM.csv, contrato da
skillorcamento) uma linha de despesa por categoria:Lançar no orçamento?
12/07 — Alimentação R$ 312,40 · Limpeza R$ 48,90 · Higiene R$ 27,30
(descrição: "Mercado Pão de Açúcar — nota de 12/07"). Confirma? - Uma confirmação para o lote inteiro. Método de pagamento: use o da nota se visível; senão
pergunte. - Não duplicar: se o livro do mês já tiver lançamento com a mesma descrição, aponte e não
proponha de novo. - O usuário pode recusar (os itens ficam registrados mesmo assim) ou ajustar a categoria de um
item antes de confirmar (ajuste vale para o catálogo também, com o antes/depois mostrado).
Fluxo 3 — Gerenciar catálogo
- Listar (agrupado por categoria ou tipo), renomear o canônico, ajustar tipo/marca/categoria/
unidade_base, acrescentar/limpar apelidos, remover entrada, ou fundir duplicatas (dois
canônicos que são o mesmo produto: um vira apelido do outro, apelidos migram juntos). - Toda escrita mostra o antes/depois e confirma antes.
- Fusão ou renomeação NUNCA reescreve os
AAAA-MM-itens.csvantigos automaticamente — o
histórico fica como está, a menos que o usuário aceite a oferta explícita e separada de
atualizar também os meses anteriores.
Formatação BRL ↔ cru (referência)
| Exibir (usuário) | Gravar (CSV) |
|---|---|
R$ 1.234,56 |
1234,56 |
R$ 18,90 |
18,90 |
R$ 0,90 |
0,90 |