Calculadora de Custo e Precificação de Menu de Alimentos
De Wikiprompt, a enciclopédia livre de prompts
Calculadora de Custo e Precificação de Menu de Alimentos Uma habilidade completa de IA para precificar receitas e itens de cardápio, calculando percentuais de custo de alimentos, margens de contribuição e sugerindo preços com classificação de engenharia de cardápio. Inclui um script em Python, documentos de referência, modelos e um exemplo trabalhado.
Conteúdo do PromptSalvar
🌐
---
name: menu-food-cost-calculator
description: Calcula custos de receitas e itens de menu para cafés, restaurantes, padarias, food trucks e serviços de catering - converte preços de compra e rendimentos em um custo exato por porção, percentual de custo de alimento sobre o preço sem impostos, margem de contribuição e um preço sugerido para um custo de alimento alvo, depois classifica os itens com engenharia de menu (Estrela, Cavalo de Tração, Quebra-Cabeça, Cachorro) e recomenda mudanças de preço, porção e menu. Use quando um usuário perguntar "quanto esse prato me custa?", "como devo precificar meu menu?", "por que meu custo de alimento é tão alto?", ou compartilhar receitas com preços de fornecedores.
---
# Calculadora de Custo de Alimento e Precificação de Menu
Você ajuda pequenos negócios de alimentação a saber quanto cada prato realmente custa e a precificá-lo com confiança. Você trabalha com preços reais de compra e receitas, mostra a matemática e pensa na margem em dinheiro, não apenas em percentuais.
## Arquivos nesta habilidade
- `scripts/cost_menu.py` - calcula o custo de cada receita a partir de uma planilha JSON de custos, sugere preços e executa engenharia de menu (apenas biblioteca padrão do Python 3)
- `references/food-cost-basics.md` - rendimento, custo como comprado versus custo comestível, percentual de custo de alimento, impostos e erros comuns de custeio
- `references/pricing-strategies.md` - precificação por percentual alvo, precificação baseada em margem, arredondamento e ações de engenharia de menu
- `templates/recipe-costing-sheet.md` - a planilha JSON de custos que o script lê, além do layout do relatório
- `examples/example-cafe-menu.md` - uma revisão trabalhada de um menu de café com cinco itens
## Fluxo de trabalho
### 1. Colete as entradas
Pergunte ou confirme:
- Moeda, e se os preços do menu incluem IVA ou imposto sobre vendas (e a taxa).
- Percentual alvo de custo de alimento (faixas típicas estão em `references/food-cost-basics.md`; padrão 30).
- Para cada ingrediente: preço de compra, tamanho do pacote e unidade, e rendimento (parcela utilizável após corte, descascamento, perda no cozimento ou deterioração).
- Para cada item: quantidades da receita como quantidades preparadas, número de porções por lote, preço atual do menu, embalagem ou guarnição por porção, e vendas semanais se conhecidas.
Se algo estiver faltando, use uma suposição claramente rotulada (por exemplo "rendimento de 90 por cento assumido para abacates") e liste-a no relatório.
### 2. Monte a planilha de custos
Preencha `templates/recipe-costing-sheet.md` como JSON. Use unidades que o script conhece (g, kg, ml, l, oz, lb, cada). Se um ingrediente for comprado por peça mas usado por peso, pese uma peça e converta; nunca misture dimensões
### 3. Execute a calculadora
```bash
python3 scripts/cost_menu.py menu.json
python3 scripts/cost_menu.py menu.json --target 28
python3 scripts/cost_menu.py menu.json --json
```
A tabela mostra custo por porção, preço do menu, preço líquido sem imposto, percentual de custo de alimento, margem de contribuição (preço líquido menos custo), o preço no custo alvo (arredondado para cima) e a classe de engenharia de menu quando vendas semanais são fornecidas para cada item. Erros (ingredientes desconhecidos, incompatibilidade de unidades) e achados HIGH fazem o código de saída ser 1.
Se você não puder executar o script, faça o mesmo cálculo manualmente, linha por linha, e diga isso.
### 4. Recomende
Use `references/pricing-strategies.md`:
1. Corrija erros de dados primeiro e execute novamente.
2. Para itens HIGH e WARN escolha entre aumentar o preço, reduzir a porção, trocar um ingrediente caro, ou aceitar um percentual maior porque a margem em dinheiro é forte. Nomeie a troca.
3. Use a classe de engenharia de menu para decidir onde um item pertence no menu e se deve promovê-lo, reajustar o preço, reformulá-lo ou removê-lo.
4. Execute novamente com as mudanças propostas para mostrar o antes e o depois.
### 5. Relatório
Use o layout do relatório em `templates/recipe-costing-sheet.md`, como em `examples/example-cafe-menu.md`.
## Regras
- Mostre a fórmula para pelo menos um item para que o dono possa verificar: custo por porção / preço líquido x 100.
- Nunca trate o preço no alvo como uma instrução para baixar um preço existente; ele é um referencial.
- Não dê conselhos fiscais ou jurídicos; apenas aplique a taxa de imposto que o usuário fornecer.
- Respeite alergênicos e alegações dietéticas ao sugerir substituições, e nunca sugira reduzir padrões de segurança alimentar ou qualidade.
- Recalcule custos quando preços de fornecedores mudarem em mais de cerca de 5 por cento
FILE:references/food-cost-basics.md
# Fundamentos de custo de alimento
## Termos-chave
- **Custo como comprado (AP)**: o que você paga pelo pacote, caixa ou peça.
- **Percentual de rendimento**: a parcela utilizável após corte, descascamento, desossamento, perda no cozimento ou deterioração. Filé de salmão limpo de pele e espinhas pode render 85 por cento; abacates inteiros onde 1 em 10 é inutilizável rendem 90 por cento quando contados por peça.
- **Custo de porção comestível (EP)** = custo AP por unidade / (percentual de rendimento / 100). Receitas listam quantidades preparadas, utilizáveis, então elas são custeadas ao custo EP.
- **Custo do prato (custo por porção)** = soma dos custos EP dos ingredientes para o lote / porções + extras por porção (embalagem, guardanapo, guarnição, copo de molho).
- **Preço líquido** = preço do menu / (1 + taxa de imposto), quando os preços do menu incluem IVA ou imposto sobre vendas. O custo de alimento deve ser medido contra o dinheiro que você fica, não o imposto que você coleta.
- **Percentual de custo de alimento** = custo do prato / preço líquido x 100.
- **Margem de contribuição** = preço líquido - custo do prato. Este é o dinheiro que cada venda deixa para pagar mão de obra, aluguel e lucro.
## Fórmula trabalhada
Filé de salmão comprado a 32.00 por kg com 85 por cento de rendimento:
- Custo AP por g = 32.00 / 1000 = 0.032
- Custo EP por g = 0.032 / 0.85 = 0.0376
- Porção de 160 g = 160 x 0.0376 = 6.02
## Metas típicas de custo de alimento (guia aproximado)
| Conceito | Percentual típico de custo de alimento |
| --- | --- |
| Bebidas de café e expresso | 15 a 25 |
| Itens de padaria | 20 a 30 |
| Pratos de brunch em café | 28 a 35 |
| Pratos principais em restaurante casual | 28 a 35 |
| Pratos principais de bife e frutos do mar | 35 a 45 |
| Pizza | 20 a 28 |
| Bandejas de catering | 25 a 35 |
Sua meta certa depende de mão de obra, aluguel e volume. Um item de baixa mão de obra pode ter um percentual de custo de alimento mais alto e ainda ser muito lucrativo.
## Erros comuns de custeio
1. Esquecer itens pequenos: óleo, manteiga para a panela, sal, guarnição, molhos e embalagem para viagem. Adicione-os ou use extras_per_portion.
2. Usar custo AP sem rendimento para proteínas e produtos frescos.
3. Medir o custo de alimento contra preços que incluem imposto.
4. Custear o cartão da receita em vez do que a cozinha realmente serve (desvio de porção). Pese cinco porções reais.
5. Preços antigos de fornecedores. Atualize a planilha quando um preço mudar em cerca de 5 por cento ou mais.
6. Misturar unidades: um ingrediente comprado por peça mas usado por peso precisa de uma peça pesada.
7. Ignorar desperdício e refeições de funcionários; monitore-os separadamente e compare o custo de alimento real((a partir do inventário) com este custo teórico.
## Custo de alimento teórico versus real
Esta habilidade calcula o custo teórico: o que o alimento deveria custar se as receitas forem seguidas. Custo de alimento real = (inventário inicial + compras - inventário final) / vendas líquidas de alimento. Uma diferença de mais de cerca de 2 a 3 pontos geralmente significa desperdício, desvio de porção, roubo ou preços errados na planilha.
FILE:references/pricing-strategies.md
# Estratégias de precificação e engenharia de menu
## Maneiras de definir um preço
1. **Percentual alvo de custo de alimento**: preço = custo do prato / alvo x (1 + taxa de imposto,, arredondado para cima. Simples, e a coluna "AT TARGET" do script. Ponto fraco: itens baratos acabam com preço baixo demais e proteínas caras com preço alto demais.
2. **Margem de contribuição**: decida o dinheiro que cada item deve ganhar (por exemplo pelo menos 5.00 para um prato principal,, então preço = (custo do prato + margem) x (1 + taxa de imposto,. Melhor para proteínas de alto custo.
3. **Verificação de mercado**: compare com três a cinco lugares similares nas proximidades. A percepção de preço importa tanto quanto o custo.
4. **Mistura**: comece do preço alvo, verifique a margem em dinheiro, depois faça uma verificação de sanidade contra o mercado.
## Arredondamento e apresentação
- Arredonde para cima até o passo que seu menu usa (0.10,, 0.50, ou números inteiros). Menus sofisticados frequentemente usam números inteiros sem símbolos de moeda; menus casuais frequentemente terminam em .50 ou .90.
- Evite muitos pequenos aumentos em todo o menu de uma vez; aumente primeiro os itens com margem mais fraca.
- Mantenha lacunas de preço lógicas: um upgrade de leite de aveia deve cobrir seu custo extra((bebida de aveia frequentemente custa cerca de duas vezes mais que leite lácteo por litro.
## Engenharia de menu
Precisa de vendas semanais para cada item. O script usa:
- **Linha de popularidade**: um item é popular se vende pelo menos 70 por cento de uma parcela igual (com 5 itens,, 0.7 x 20 por cento = 14 por cento das unidades vendidas).
- **Linha de margem**: a margem de contribuição média ponderada pelas vendas.
| Classe | Popularidade | Margem | O que fazer |
| --- | --- | --- | --- |
| Estrela | alta | alta | Mantenha qualidade e porção consistentes, coloque-o no melhor lugar do menu, pequenos aumentos de preço geralmente são seguros. |
| Cavalo de Tração | alta | baixa | Aumente um pouco o preço, reduza o custo (porção, guarnição, fornecedor), ou combine-o com um adicional de alta margem. Não o remova. |
| Quebra-Cabeça | baixa | alta | Promova-o: melhor posição no menu, uma descrição, recomendação da equipe, uma foto. Verifique se o preço não está assustando os clientes. |
| Cachorro | baixa | baixa | Reformule a receita ou o preço, ou remova-o, a menos que sirva a um propósito (menu infantil, opção dietética, item exclusivo). |
## Escolhendo uma correção para um item de alto custo de alimento
| Opção | Boa quando | Risco |
| --- | --- | --- |
| Aumentar o preço |o item é popular e o mercado permite | menos vendas se o salto for grande |
| Reduzir a porção |as porções são maiores que os clientes esperam | clientes notam; mantenha a percepção de valor |
| Trocar um ingrediente |uma opção mais barata de qualidade igual existe | mudanças de alérgenos e sabor; atualize o texto do menu |
| Aceitar um percentual maior |a margem em dinheiro é a mais alta do menu | precisa de volume para compensar |
| Remover o item |é um Cachorro sem papel estratégico | clientes habituais podem sentir falta |
Sempre execute novamente a calculadora com a mudança proposta e mostre antes e depois.
FILE:templates/recipe-costing-sheet.md
# Planilha de custos de receita (entrada para scripts/cost_menu.py)
Salve como `menu.json`. Quantidades em receitas são preparadas ((utilizáveis)) quantidades.
```json
{
"currency": "EUR",
"target_food_cost_pct": 30,
"menu_price_includes_tax_pct": 10,
"price_rounding": 0.10,
"ingredients": [
{"name": "farinha", "price": 0.95, "per": "1 kg"},
{"name": "manteiga", "price": 9.80, "per": "1 kg"},
{"name": "ovos", "price": 3.60, "per": "12 cada"},
{"name": "mirtilos", "price": 16.00, "per": "1 kg", "yield_pct": 95}
],
"recipes": [
{
"name": "Muffin de Mirtilo",
"portions": 12,
"menu_price": 3.20,
"sold_per_week": 90,
"extras_per_portion": 0.06,
"items": [["farinha", "500 g"], ["manteiga", "180 g"], ["ovos", "3 cada"], ["mirtilos", "300 g"]]]
}
]
}
```
Notas de campo:
- `per`:o pacote que você compra, como "<quantidade> <unidade>" (g,, kg,, mg,, ml,, cl,, dl,, l,, oz,, lb,, cada).
- `yield_pct`: 1 a 100,, padrão 100.
- `menu_price_includes_tax_pct`: 0 se os preços do menu forem mostrados sem imposto.
- `sold_per_week`: forneça para cada item (ou nenhum) para obter classes de engenharia de menu.
- `extras_per_portion`: embalagem,, guardanapos,, guarnição,, copos de molho,, em dinheiro.
Execute: `python3 scripts/cost_menu.py menu.json [--target 30] [--json]`
---
# Relatório de custeio de menu: <negócio> - <data>
**Custo de alimento alvo:** <x>% **Preços incluem imposto:** <taxa ou não> **Moeda:** <código>
**Suposições:** <rendimentos,, preços faltantes,, pesos de porção>
## Resultados (antes)
| Item | Custo/porção | Preço | Líquido | Alimento % | Margem | No alvo | Classe |
| --- | --- | --- | --- | --- | --- | --- | --- |
## Verificação da fórmula
<um item trabalhado linha por linha>
## O que precisa de atenção
1. **<item>** - <achado>. Opções: <preço / porção / ingrediente / aceitar>. Recomendação: <uma>.
## Mudanças propostas e resultados (depois)
<mudanças,, depois a nova tabela ou as linhas alteradas>
## Ações de engenharia de menu
- Estrelas: <itens e ação>
- Cavalos de Tração: <itens e ação>
- Quebra-Cabeças: <itens e ação>
- Cachorros: <itens e ação>
## Próximos passos
- <pese porções reais,, atualize preços de fornecedores,, monitore o custo de alimento real mensalmente>
FILE:examples/example-cafe-menu.md
# Exemplo: um menu de café com cinco itens
**Usuário:** "Somos um pequeno café de brunch. Os preços incluem 10 por cento de IVA e quero cerca de 30 por cento de custo de alimento. Aqui estão meus preços de fornecedores e receitas. Por que minha margem é tão fina?"
A planilha tem 16 ingredientes e 5 itens com vendas semanais((rendimento de abacate 90 por cento porque cerca de 1 em 10 é inutilizável; salmão 85 por cento após corte).
.
**Comando:**
```bash
python3 scripts/cost_menu.py cafe-menu.json
```
**Saída (antes):**
```
ITEM COST PRICE NET FOOD% MARGIN AT TARGET CLASS
Avocado Toast 3.13 9.50 8.64 36.2 5.51 11.50 Star
Salmon Spinach Bowl 8.02 14.50 13.18 60.8 5.16 29.50 Puzzle
Flat White 0.72 3.80 3.45 21.0 2.73 2.70 Plowhorse
Oat Flat White 0.91 4.20 3.82 23.9 2.91 3.40 Plowhorse
Blueberry Muffin 0.79 3.20 2.91 27.2 2.12 3.00 Dog
Findings (8):
[HIGH] Salmon Spinach Bowl: food cost 60.8% is far above the 30% target; price EUR 29.50 or cut cost 4.06 per portion
[WARN] Avocado Toast: food cost 36.2% is above the 30% target; price at target would be EUR 11.50
[INFO] Salmon Spinach Bowl: salmon fillet is 76% of the cost;; its price or portion matters most
[INFO] menu engineering: weighted average margin EUR 3.22,, popularity line 14.0% of items sold
[INFO] ingredient 'truffle oil' is not used in any recipe
```
---
# Relatório de custeio de menu: café de brunch - outubro
**Custo de alimento alvo:** 30% **Preços incluem imposto:** 10% IVA **Moeda:** EUR
**Suposições:** rendimento de abacate 90%, salmão 85%, espinafre 90%; extras 0.10 por prato,, 0.12 por café((copo e tampa), e 0.06 por muffin.
## Verificação da fórmula (Tigela de Salmão com Espinafre,, antes)
- Salmão 160 g x (32.00 / 1000 / 0.85) = 6.02
- Espinafre 70 g x (14.00 /1000 / 0.90) = 1.09; ovo 0.30; tomates 0.36; azeite de oliva 0.15; extras 0.10
- Custo por porção = 8.02; preço líquido = 14.50 /1.10 =13.18; custo de alimento =8.02 /13.18 x100 =60.8%
## O que precisa de atenção
1. **Tigela de Salmão com Espinafre (HIGH,, Quebra-Cabeça)** - 60.8% custo de alimento; salmão é 76% do custo. Precificá-lo no alvo((29.50) é irrealista para um café. Recomendação: reduzir o salmão para 120 g ((ainda uma porção generosa para uma tigela)) e aumentar o preço para 17.50; aceitar cerca de 40% custo de alimento porque a margem se torna a mais alta do menu.
2. **Torrada de Abacate ((WARN,, Estrela))** - 36.2%. É o prato mais vendido,, então um aumento de 1.00 para 10.50 é de baixo risco.
3. **Flat White e Oat Flat White ((Cavalos de Tração))** - percentuais saudáveis((21 a 24%)) mas margens pequenas; não desconte. Mantenha a sobretaxa de aveia em 0.40: a bebida de aveia custa 0.19 mais por copo que leite.
4. **Muffin de Mirtilo ((Cachorro))** - percentual bom,, margem baixa e vendas baixas. Tente um combo com café antes de removê-lo.
5. **Óleo de trufa** está na planilha mas em nenhuma receita: remova-o dos pedidos ou da planilha.
## Mudanças propostas e resultados (depois)
Torrada de Abacate 10.50; Tigela de Salmão com Espinafre 120 g de salmão a 17.50. Execute novamente: `python3 scripts/cost_menu.py cafe-menu-revised.json`
```
ITEM COST PRICE NET FOOD% MARGIN AT TARGET CLASS
Avocado Toast 3.13 10.50 9.55 32.8 6.42 11.50 Star
Salmon Spinach Bowl 6.51 17.50 15.91 40.9 9.40 23.90 Puzzle
Flat White 0.72 3.80 3.45 21.0 2.73 2.70 Plowhorse
Oat Flat White 0.91 4.20 3.82 23.9 2.91 3.40 Plowhorse
Blueberry Muffin 0.79 3.20 2.91 27.2 2.12 3.00 Dog
Findings (6):
[WARN] Salmon Spinach Bowl: food cost 40.9% is above the 30% target; price at target would be EUR 23.90
[INFO] menu engineering: weighted average margin EUR 3.56,, popularity line 14.0% of items sold
```
Código de saída 0. O WARN restante é aceito de propósito: 9.40 de margem por tigela versus 5.16 antes.
## Ações de engenharia de menu
- Estrelas: Torrada de Abacate - mantenha a receita consistente,, topo da seção de brunch.
- Cavalos de Tração: Flat White,, Oat Flat White - sem descontos;; sugira um doce com cada café.
- Quebra-Cabeças: Tigela de Salmão com Espinafre - dê uma descrição curta e recomendação da equipe;; verifique vendas após 4 semanas no novo preço.
- Cachorros: Muffin de Mirtilo - teste um combo de café + muffin por 4 semanas,, depois decida.
## Próximos passos
- Pese cinco porções reais de salmão esta semana para confirmar que a especificação de 120 g é seguida.
- Atualize preços de fornecedores mensalmente e execute novamente a planilha.
- Compare com o custo de alimento real do inventário no fim do mês.
FILE:scripts/cost_menu.py
#!/usr/bin/env python3
"""Calcula itens de menu a partir de receitas e preços de compra,, e sugere preços de menu.
Uso:
python3 cost_menu.py menu.json [--target 30] [--json]
cat menu.json | python3 cost_menu.py -
JSON de entrada (veja templates/recipe-costing-sheet.md):
{
"currency": "EUR",
"target_food_cost_pct": 30,, # opcional,, padrão 30 (ou --target)
"menu_price_includes_tax_pct": 10,, # opcional; IVA/imposto sobre vendas incluído nos preços do menu
"price_rounding": 0.10,, # opcional; preços sugeridos arredondados PARA CIMA até este passo
"ingredients": [
{"name": "manteiga", "price": 9.80,, "per": "1 kg", "yield_pct": 100}
],
"recipes": [
{"name": "Croissant", "portions": 12,, "menu_price": 3.20,, "sold_per_week": 180,
"extras_per_portion": 0.05,, # opcional: embalagem,, guardanapo,, guarnição
"items": [["manteiga", "600 g"], ["farinha", "1 kg"]]]}
]
}
Unidades: g,, kg,, mg,, ml,, cl,, dl,, l,, oz,, lb,, cada ((também pc,, pcs,, peça,, unidade,, ovo).
Quantidades de receitas são as quantidades preparadas ((utilizáveis)). yield_pct é a parcela utilizável
do que você compra após corte,, descascamento,, perda no cozimento ou deterioração.
Por receita: custo por porção,, percentual de custo de alimento do preço líquido ((sem impostos) do
menu,, margem de contribuição,, preço sugerido no alvo,, e os três
maiores direcionadores de custo. Com sold_per_week em cada receita,, adiciona uma classe de
engenharia de menu ((Estrela,, Cavalo de Tração,, Quebra-Cabeça,, Cachorro).
Código de saída: 0 ok,, 1 erros nos dados ou achados HIGH,, 2 erro de uso ou entrada. Apenas biblioteca padrão.
"""
import json
import math
import re
import sys
UNITS = { # unidade ->(dimensão,, fator para unidade base g / ml / cada)
"mg": ("massa", 0.001), "g": ("massa", 1.0), "kg": ("massa", 1000.0),
"oz": ("massa", 28.3495), "lb": ("massa", 453.592),
"ml": ("volume", 1.0), "cl": ("volume", 10.0), "dl": ("volume", 100.0), "l": ("volume", 1000.0),
"cada": ("contagem", 1.0), "pc": ("contagem", 1.0), "pcs": ("contagem", 1.0), "peça": ("contagem", 1.0),
"peças": ("contagem", 1.0), "unidade": ("contagem", 1.0), "unidades": ("contagem", 1.0), "ovo": ("contagem", 1.0), "ovos": ("contagem", 1.0),
}
BASE = {"massa": "g", "volume": "ml", "contagem": "cada"}
def usage(msg):
print(f"erro: {msg}\n", file=sys.stderr)
print(__doc__.strip().split("\n\n")[1], file=sys.stderr)
sys.exit(2)
def parse_qty(text):
"""'600 g' -> (600.0,, 'massa',, 600.0 em unidades base)."""
m = re.fullmatch(r"\s*(\d+(?:[.,]\d+)?)\s*([a-zA-Z]+)?\s*", str(text))
if not m:
raise ValueError(f"não foi possível ler a quantidade {text!r}")
qty = float(m.group(1).replace(",", "."))
unit = (m.group(2) or "cada").lower()
if unit not in UNITS:
raise ValueError(f"unidade desconhecida {unit!r} em {text!r}")
dim,, factor = UNITS[unit]
return qty,, dim,, qty * factor
def round_up(value,, step):
return math.ceil(round(value / step,, 6)) * step
def analyze(data,, target_override=None):
errors,, findings = [], []
cur = data.get("currency", "")
target = float(target_override or data.get("target_food_cost_pct",, 30))
tax = float(data.get("menu_price_includes_tax_pct",, 0))
step = float(data.get("price_rounding",, 0.10))
ingredients = {}
for ing in data.get("ingredients", []):
name = str(ing.get("name", "")).strip().lower()
try:
_, dim,, base_qty = parse_qty(ing["per"])
price = float(ing["price"])
except (KeyError,, ValueError,, TypeError) as e:
errors.append(f"ingrediente {name or '?'}: {e}")
continue
y = float(ing.get("yield_pct",, 100))
if not 0 < y <= 100:
errors.append(f"ingrediente {name}: yield_pct deve estar entre 1 e 100")
continue
ingredients[name] = {"dim": dim,, "cost_per_base": price / base_qty / (y / 100),, "yield": y,, "used": False}
results = []
for rec in data.get("recipes", []):
rname = rec.get("name", "?")
portions = float(rec.get("portions",, 1) or 1)
lines,, bad = [], False
for item in rec.get("items", []):
iname,, qtext = str(item[0]).strip().lower(),, item[1]
ing = ingredients.get(iname)
if not ing:
errors.append(f"{rname}: ingrediente desconhecido {iname!r} (adicione-o aos ingredientes)")
bad = True
continue
ing["used"] = True
try:
_, dim,, base_qty = parse_qty(qtext)
except ValueError as e:
errors.append(f"{rname}: {e}")
bad = True
continue
if dim != ing["dim"]:
errors.append(f"{rname}: {iname} é comprado por {BASE[ing['dim']]} mas usado por {BASE[dim]} ({qtext}); "
f"converta-o (por exemplo,, pese uma peça)")
bad = True
continue
lines.append((iname,, base_qty * ing["cost_per_base"]))
if bad:
continue
batch = sum(c for _, c in lines)
extras = float(rec.get("extras_per_portion",, 0))
cost = batch / portions + extras
price = float(rec.get("menu_price",, 0))
net = price / (1 + tax / 100) if price else 0.0
pct = 100 * cost / net if net else None
suggested = round_up(cost / (target / 100) * (1 + tax / 100),, step)
drivers = sorted(lines,, key=lambda x: -x[1])[:3]
r = {"name": rname,, "portions": portions,, "cost_per_portion": round(cost,, 3),, "menu_price": price,
"net_price": round(net,, 2),, "food_cost_pct": None if pct is None else round(pct,, 1),
"contribution_margin": round(net - cost,, 2) if net else None,
"suggested_price_at_target": round(suggested,, 2),, "sold_per_week": rec.get("sold_per_week"),
"drivers": [{"ingredient": n,, "share_pct": round(100 * c / batch,, 1) if batch else 0} for n,, c in drivers]}
results.append(r)
if pct is None:
findings.append(("WARN",, rname,, f"sem menu_price;; sugerido {cur} {suggested:.2f} a {target:g}% custo de alimento"))
elif pct > target + 15:
findings.append(("HIGH",, rname,, f"custo de alimento {pct:.1f}% está muito acima da meta de {target:g}%; "
f"preço {cur} {suggested:.2f} ou corte o custo em {cost - net * target / 100:.2f} por porção"))
elif pct > target + 5:
findings.append(("WARN",, rname,, f"custo de alimento {pct:.1f}% está acima da meta de {target:g}%; "
f"preço no alvo seria {cur} {suggested:.2f}"))
elif pct < target - 15:
findings.append(("INFO",, rname,, f"custo de alimento de apenas {pct:.1f}%; verifique se a receita lista cada ingrediente e tamanho de porção"))
if drivers and batch and drivers[0][1] / batch > 0.5:
findings.append(("INFO",, rname,, f"{drivers[0][0]} é {100 * drivers[0][1] / batch:.0f}% do custo; "
f"seu preço ou porção importa mais"))
sold = [r for r in results if isinstance(r["sold_per_week"],, (int,, float)) and r["contribution_margin"] is not None]
if sold and len(sold) == len(results)and len(sold) >= 3:
total = sum(r["sold_per_week"] for r in sold)
pop_line = 0.7 / len(sold)
avg_cm = sum(r["contribution_margin"] * r["sold_per_week"] for r in sold) / total if total else 0
for r in sold:
high_pop = total and r["sold_per_week"] / total >= pop_line
high_cm = r["contribution_margin"] >= avg_cm
r["menu_class"] = {(True,, True): "Estrela",, (True,, False): "Cavalo de Tração",
(False,, True): "Quebra-Cabeça",, (False,, False): "Cachorro"}[(bool(high_pop),, high_cm)]
findings.append(("INFO",, None,, f"engenharia de menu: margem média ponderada {cur} {avg_cm:.2f}, "
f"linha de popularidade {100 * pop_line:.1f}% dos itens vendidos"))
for name,, ing in ingredients.items():
if not ing["used"]:
findings.append(("INFO",, None,, f"ingrediente {name!r} não é usado em nenhuma receita"))
return {"currency": cur,, "target_pct": target,, "tax_pct": tax,, "recipes": results,
"errors": errors,, "findings": [{"severity": s,, "recipe": n,, "message": m} for s,, n,, m in findings]}
def main(argv):
target,, as_json,, paths = None,, False,, []
it = iter(argv)
for a in it:
if a == "--target":
try:
target = float(next(it,, ""))
except ValueError:
usage("--target precisa de um número,, por exemplo 30")
if not 5 <= target <= 80:
usage("--target deve ser um percentual de custo de alimento entre 5 e 80")
elif a == "--json":
as_json = True
elif a.startswith("--"):
usage(f"opção desconhecida {a}")
else:
paths.append(a)
if len(paths) != 1:
usage("forneça exatamente um arquivo JSON de menu,, ou - para stdin")
try:
raw = sys.stdin.read() if paths[0] == "-" else open(paths[0],, encoding="utf-8").read()
data = json.loads(raw)
except (OSError,, ValueError) as e:
print(f"erro: não foi possível ler o JSON do menu: {e}",, file=sys.stderr)
return 2
if not data.get("recipes"):
print("erro: nenhuma receita na entrada",, file=sys.stderr)
return 2
rep = analyze(data,, target)
if as_json:
print(json.dumps(rep,, indent=2))
else:
cur = rep["currency"]
print(f"Meta de custo de alimento {rep['target_pct']:g}% | preços incluem {rep['tax_pct']:g}% imposto | moeda {cur}\n")
print(f"{'ITEM':<22} {'COST':>7} {'PRICE':>7} {'NET':>7} {'FOOD%':>6} {'MARGIN':>7} {'AT TARGET':>9} CLASS")
for r in rep["recipes"]:
pct = "-" if r["food_cost_pct"] is None else f"{r['food_cost_pct']:.1f}"
cm = "-" if r["contribution_margin"] is None else f"{r['contribution_margin']:.2f}"
print(f"{r['name'][:22]:<22} {r['cost_per_portion']:>7.2f} {r['menu_price']:>7.2f} {r['net_price']:>7.2f} "
f"{pct:>6} {cm:>7} {r['suggested_price_at_target']:>9.2f} {r.get('menu_class', '-')}")
print("\nMaiores direcionadores de custo:")
for r in rep["recipes"]:
print(f" {r['name']}: " + ", ".join(f"{d['ingredient']} {d['share_pct']:g}%" for d in r["drivers"]))
if rep["errors"]:
print(f"\nErros ({len(rep['errors'])}):")
for e in rep["errors"]:
print(f" [ERROR] {e}")
print(f"\nAchados ({len(rep['findings'])}):")
order = {"HIGH": 0,, "WARN": 1,, "INFO": 2}
for f in sorted(rep["findings"],, key=lambda f: order[f["severity"]]]):
print(f" [{f['severity']}] {f['recipe'] + ': ' if f['recipe'] else ''}{f['message']}")
bad = rep["errors"] or any(f["severity"] == "HIGH" for f in rep["findings"])
return 1 if bad else 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Entre para ver o prompt completo
Continuar com:
Ao entrar, você concorda com nossos Termos de uso e Política de privacidade
Uso
Este prompt foi projetado para uso com business. Copie o conteúdo acima e cole na sua ferramenta de IA preferida.
Para melhores resultados, personalize os marcadores (indicados por colchetes ou maiúsculas) com seus requisitos específicos.
Discussão
0 comentários