Este manual explica como o sistema de orçamentos da Makers funciona, do ponto de vista de quem opera a fábrica e não de quem programa. Ele serve para consulta: cada página trata de um assunto, e você lê só o que precisa.
O sistema Makers é formado por três programas que conversam entre si, mais alguns serviços externos.
makers-front.makers-adm-front.Makers-backend.O menu à esquerda agrupa as páginas por assunto. Os botões Anterior e Próxima no fim de cada página permitem ler em sequência. A busca no topo (tecla /) encontra qualquer palavra em todo o manual. Campos em amarelo pontilhado são dados que a Makers precisa preencher.
Os termos que aparecem no painel e neste manual, sem jargão.
| Termo | O que significa |
|---|---|
| DXF | O arquivo de desenho vetorial que o cliente envia (feito no AutoCAD, CorelDRAW, Illustrator etc.). Contém as linhas que o laser vai seguir. |
| Camada / cor | Cada cor do desenho pode significar uma ação: cortar, gravar riscado, gravar preenchido ou ignorar. Sem instrução, o sistema sugere uma ação pela cor (ver Leitura do arquivo). |
| Pierce (furo) | O momento em que o laser fura o material para começar um contorno. Cada contorno tem um furo e leva alguns décimos de segundo. |
| Inlet (entrada) | Pequeno trecho de entrada antes do contorno propriamente dito. É cortado na velocidade de corte e somado ao tempo. |
| G0 / deslocamento | Movimento do cabeçote sem cortar, de um contorno ao próximo. É mais rápido que o corte, mas também consome tempo. |
| Nesting (encaixe) | Distribuir as peças na chapa de modo a aproveitar o máximo de área. O sistema simula o encaixe para saber quantas chapas serão usadas. |
| Nesting gap | Espaço mínimo, em mm, deixado entre duas peças na chapa. |
| Veio | Direção da fibra ou do acabamento do material (inox escovado, MDF etc.). Material com veio não pode girar a peça na chapa. |
| Retalho | Sobra de chapa de um corte anterior, guardada em estoque com etiqueta e reaproveitada em pedidos futuros. |
| Catar peças | Tempo, por peça, para retirar as peças da máquina depois do corte. |
| Setup | Preparação da máquina para o pedido: posicionar, calibrar, carregar o arquivo. Cobrado uma vez por pedido. |
| Troca de chapa | Tempo para tirar uma chapa e colocar a seguinte quando o pedido usa mais de uma. |
| Fator K (sobra) | Percentual da parte não usada da chapa que também é cobrado do cliente, para cobrir o risco de a sobra não ser reaproveitada. Detalhe em Material e fator K. |
| Markup | Margem percentual da Makers sobre o material usado. |
| Taxa de manuseio | Percentual cobrado sobre o material usado pelo trabalho de separar, movimentar e armazenar a chapa. Somado ao corte. |
| Preço da hora (Vh) | Quanto custa uma hora de máquina. Não é um valor fixo: começa mais alto e cai conforme o trabalho fica mais longo (ver Custo de máquina). |
| Valor mínimo | Menor valor que a Makers aceita cobrar de um pedido de corte. Existe um por máquina e um geral. |
| Material próprio | Quando o cliente traz o próprio material. A Makers não cobra a chapa, só o corte e a taxa de manuseio. |
| Grupo de desconto | Faixa de desconto para certos clientes, com percentuais separados para corte, material e frete. |
| Taxa regional | Percentual extra por estado do cliente, somado ao total. |
| Bench (bancada) | Área do simulador onde você muda parâmetros (velocidade, K, coeficientes) e vê o preço recalcular, sem alterar o cadastro oficial. |
| Resumão | O painel que mostra, para um pedido inteiro, como o total se divide por máquina, material e arquivo. |
| Termo | O que significa |
|---|---|
| Servidor / API / backend | O programa que fica ligado na internet, faz os cálculos e guarda os dados. O site e o painel são apenas telas que pedem coisas a ele. |
| Frontend | A parte que você vê e clica: o site do cliente e o painel administrativo. |
| Repositório | A pasta onde o código de um programa fica guardado, com todo o histórico de mudanças (no GitHub). |
| Banco de dados | Onde as informações ficam guardadas de forma organizada, em tabelas (como planilhas ligadas entre si). O da Makers é um PostgreSQL hospedado no Supabase. |
| Migration | Uma mudança na estrutura do banco (criar uma tabela, adicionar um campo) registrada em arquivo, para que todos os ambientes fiquem iguais. |
| Deploy (publicar) | Colocar uma nova versão do programa no ar. |
| S3 | Serviço de armazenamento de arquivos da Amazon (AWS). Guarda os DXFs e as imagens de prévia. |
| Variável de ambiente | Configuração secreta do servidor (senhas, chaves de acesso), guardada fora do código. |
| Token | Uma "chave" temporária que prova que alguém está autorizado, usada por exemplo no login e na conversa com o Bling. |
| Cron | Tarefa que o servidor executa sozinho em horários fixos (por exemplo, cancelar pedidos não pagos). |
| MER | Modelo Entidade-Relacionamento: o desenho das tabelas do banco e de como elas se ligam. Está em Banco de dados. |
Este é o caminho completo de um pedido: o que o cliente clica, o que o servidor faz em seguida, com quais serviços ele conversa e o que fica gravado. Clique em qualquer número do diagrama, ou use Percorrer para acompanhar do início ao fim.
| Momento | Passos | O que está em jogo |
|---|---|---|
| Antes de pagar | 1 a 6 | O cliente cria conta, envia o desenho e vê o preço. Nada é cobrado nem reservado até ele clicar em pagar. O pedido só nasce quando ele finaliza o orçamento. |
| Pagamento | 7 a 10 | O material fica reservado por alguns minutos, o PagBank cobra, e só a confirmação do PagBank (com assinatura de segurança) transforma o pedido em "Em aberto". |
| Depois de pagar | 11 a 16 | O servidor avisa todo mundo: Trello (produção), Bling (financeiro e nota), planilha e cliente. A produção assume e move os cartões; ao fim, o servidor emite a nota e conclui. |
| Quem | Papel |
|---|---|
| Cliente | Usa o site no navegador. |
| Servidor | Faz todas as contas e decisões. Calcula o preço, grava o pedido, confere o PagBank, reserva o estoque e conversa com os outros serviços. O site apenas mostra o resultado. |
| AWS S3 | Guarda os desenhos enviados e as imagens de prévia. |
| Frenet | Cota o frete. |
| PagBank | Cobra o cliente e avisa o servidor do resultado. |
| Trello | É o quadro da produção: um cartão por máquina em cada pedido. Os movimentos dos cartões voltam ao servidor e mudam o status. |
| Bling | Recebe a ordem de serviço e a conta a receber, e emite a nota fiscal. |
| Google Sheets | Recebe uma linha por pedido pago (como conectar). |
| Equipe Makers | Produz, move os cartões, usa o painel para acompanhar e corrigir. |
| Quando | |
|---|---|
| Conta criada | Logo após o cadastro. |
| Pagamento pendente (com link) | Quando a própria equipe cria o pedido para o cliente pelo painel, para ele pagar depois. |
| Pedido confirmado | Logo depois do pagamento aprovado. |
| Expedição | Quando o pedido é concluído, depois da nota fiscal. |
1. O valor cobrado é sempre o que o servidor calculou, mesmo se o navegador mandar outro número. 2. Falha em um serviço externo (Trello, Bling, planilha, e-mail) nunca desfaz o pagamento: o pedido segue, e o problema aparece como "erro" na integração do pedido. Veja O que acontece quando algo falha.
O status do pedido muda por três motivos: o aviso do PagBank, o movimento dos cartões no Trello e tarefas automáticas do servidor. Este mapa mostra o caminho normal e os desvios.
| # | Transição | Quem dispara |
|---|---|---|
| 1 | Aguardando pagamento → Em aberto | O PagBank confirma o pagamento (aviso automático). Em pagamento posterior, a equipe usa "marcar como pago" no painel, que roda o mesmo processo. |
| 2 | Aguardando pagamento → Em análise → Em aberto | O PagBank avisa que o pagamento está em análise, e depois aprova. |
| 3 | Em aberto → Em produção | Um cartão do pedido é movido, no Trello, para qualquer coluna de máquina (inclusive a fila de espera). |
| 4 | Em produção → Embalagem | Um cartão é movido para a coluna Embalagem. |
| 5 | → Pronto para envio | Um cartão chega à coluna final (Concluído / expedição). Começa a tolerância de 3 minutos; mover um cartão para outra coluna cancela a espera e devolve o pedido para "Em produção". |
| 6 | Pronto para envio → Concluído | Automático, 3 minutos depois (verificado a cada minuto): emite a nota fiscal no Bling (se ligada), marca concluído e envia o e-mail de expedição. |
| 7 | Qualquer → Cancelado | O PagBank recusa ou cancela; o pedido passa 48 horas sem pagamento; um cartão é movido para a coluna Cancelado; ou alguém cancela no painel. Em todos os casos o material volta ao estoque. |
O painel lista os status Aguardando pagamento, Em aberto, Aguardando produção, Em produção, Concluído e Cancelado. "Aguardando produção" existe para uso manual: o fluxo automático hoje não o usa, e um cartão movido para a fila de espera também deixa o pedido "Em produção". Embalagem, Pronto para envio e Em análise são estados internos, de passagem.
Cada máquina tem o seu cartão. Pelo código, o status do pedido segue o último cartão movido: se o cartão de uma máquina chega a Concluído enquanto o de outra ainda está em produção, o pedido pode ser marcado como "Concluído" e o e-mail de expedição enviado depois dos 3 minutos. A nota fiscal "imediata" já espera todos os cartões, mas o fechamento por tolerância não. Vale a equipe saber desse comportamento, ou decidir se ele deve mudar.
O sistema foi feito para que um problema em um serviço externo não desfaça um pagamento. Esta página lista cada falha possível, o efeito e como a recuperação acontece, sozinha ou com a equipe.
| Situação | O que acontece | Recuperação |
|---|---|---|
| Cliente desiste no PagBank | O pedido fica "Aguardando pagamento" com o material reservado. | Automática: a reserva vence (conferida a cada minuto) e o material volta ao estoque; em 48 horas sem pagar, o pedido é cancelado. |
| PagBank recusa ou cancela | Pedido "Cancelado". | Automática: o material volta ao estoque. O cliente pode refazer o pedido. |
| Aviso do PagBank repetido, ou com assinatura inválida | O repetido é ignorado; o inválido é recusado. | Nada a fazer: protege contra cobrança em duplicidade e avisos falsos. |
| O material acabou enquanto o cliente finalizava | O cliente é avisado do novo prazo (inclui a compra da chapa) antes de pagar. | Ele decide aceitar ou desistir. O preço não muda. |
| Cliente pagou depois de a reserva vencer, e o material acabou | O pedido segue normalmente e o prazo aumenta. | Aviso no log do servidor; a equipe conversa com o cliente se for o caso. |
| Falha na baixa de estoque | O pagamento não trava. | Manual: trocar ou reservar a chapa pela tela do pedido no painel. |
| Trello fora do ar | Pedido pago, mas sem cartões; integração marcada "erro". | Automática: nova tentativa a cada 30 minutos, até 5 vezes. Depois, manual. |
| Bling fora do ar | Pedido pago; ordem de serviço e/ou conta a receber ficam "erro" ou "em processamento". | Automática: nova tentativa a cada 5 minutos, até 5 vezes. Depois, manual. |
| Planilha Google falha | Integração marcada "erro". | Manual: não há nova tentativa. Lançar a linha à mão (ver Sheets). |
| E-mail não enviado | Só é registrado no log do servidor. | Conferir a conta de e-mail do sistema; reenviar à mão se necessário. |
| Nota fiscal: NF automática desligada, ou Bling desligado | O pedido conclui normalmente, sem NF. | Manual: botão "gerar nota fiscal" no painel, no pedido. |
| Sistema em manutenção (chave em Configurações) | O cliente vê a mensagem em vez da tela de orçamento. | Desligar a chave quando terminar. |
Quando o pagamento é combinado por fora, a equipe cria ou abre o pedido e usa "marcar como pago" no painel. O sistema roda o mesmo processo do pagamento aprovado: baixa de estoque, cartões no Trello, Bling, planilha e e-mail de confirmação.
O sistema depende de vários serviços externos. Esta página lista cada um, para que serve, o que deixa de funcionar se ele sair do ar e como acessar.
Este arquivo pode ser aberto por qualquer pessoa que tenha o link. Por isso nenhuma senha, chave ou token está escrito aqui. Para cada serviço, anote apenas onde a senha está guardada (por exemplo, o cofre de senhas da Makers). Os logins dos serviços ficam na página Credenciais, cifrada: só abre com a senha do manual (que não está escrita aqui). Os segredos do servidor ficam no AWS Secrets Manager.
Guarda o código dos três programas e todo o histórico de mudanças. Organização cce-fluxo.
Onde ficam todos os dados: materiais, máquinas, clientes, pedidos, estoque. É o serviço mais crítico do sistema.
makersmanufatura.dev@gmail.com's ProjectDATABASE_URL (conexão pelo pooler, porta 6543)Armazena os arquivos DXF enviados (originais e corrigidos), as imagens de prévia e as fotos de materiais. Bucket makers-uploads, região us-east-2. Uma regra de custo move arquivos pouco acessados para camadas mais baratas sem perder acesso (arquivo aws/s3-lifecycle.json no backend).
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_S3_BUCKET_NAMEO servidor roda numa máquina EC2 da AWS, na conta da Makers. Ele é empacotado com Docker (arquivo Dockerfile), escuta na porta 3001 e é atualizado pelo GitHub Actions (veja Variáveis do servidor).
https://newapi.makers.com.br (EC2 na AWS)https://admin.makers.com.brhttps://orcamento.makers.com.br (o antigo novo.makers.com.br foi desativado)makers.com.br está registrado na Wix. Os endereços acima são configurados lá.BACKEND_URL, FRONTEND_URL (deve ser o endereço do site do cliente, https://orcamento.makers.com.br: vira o link dos e-mails de pagamento e de criar senha e o domínio citado nas observações da nota fiscal), PORT, JWT_SECRETCobra o cliente no checkout. O valor cobrado é sempre montado pelo servidor a partir do banco, não pelo navegador.
PAGSEGURO_TOKEN, PAGBANK_ENV (produção ou teste)Recebe o pedido de venda, emite a nota fiscal e sincroniza o valor de retalhos. A conexão usa chaves temporárias que o sistema renova sozinho (tabela BlingToken).
BLING_CLIENT_ID, BLING_CLIENT_SECRET, BLING_REDIRECT_URI, COMPANY_ID_TESTE, ID_TIPO_NEGOCIOCada pedido pago vira um cartão por máquina, na coluna da máquina correspondente. A produção acompanha por lá, e o sistema confere o andamento a cada 30 minutos.
TRELLO_API_KEY, TRELLO_ACCOUNT_TOKEN, TRELLO_BOARD_ID e um TRELLO_*_LIST_ID para cada coluna (aguardando produção, cada máquina, embalagem, concluído, cancelado)Calcula o frete das transportadoras a partir do CEP do cliente e do tamanho das peças.
TOKEN_FRENET, CEP_ORIGEM (CEP da fábrica)Cada pedido novo é registrado numa planilha Google por meio de um endereço de webhook cadastrado em Configurações.
Envia e-mails de recuperação de senha e avisos à equipe de suporte.
TRANSPORTER_EMAIL, TRANSPORTER_SENHA, EMAIL_EQUIPE_SUPORTEEstas são as configurações secretas que o servidor lê ao ligar. Os valores ficam no AWS Secrets Manager, na conta AWS da Makers, nunca no código.
envMakers.Ele guarda todas as variáveis da tabela abaixo.Makers-backend › aba Actions › Redeploy (env vars only) › Run workflow. Leva alguns segundos e não precisa publicar código novo.Um valor errado pode derrubar o servidor ao reiniciar. Altere uma variável por vez e, se o servidor não subir, volte ao valor anterior no Secrets Manager e rode o Redeploy de novo. O segredo é lido também a cada publicação de código nova (push na main).
| Variável | Para que serve |
|---|---|
DATABASE_URL | Endereço e senha do banco de dados. |
JWT_SECRET | Chave que protege os logins. Trocar derruba todas as sessões abertas. |
PORT, NODE_ENV | Porta em que o servidor escuta e se está em produção ou desenvolvimento. |
BACKEND_URL, FRONTEND_URL | Endereços públicos do servidor e do site do cliente (usados em links de e-mail e retornos de pagamento). |
AWS_* | Acesso ao armazenamento S3. |
PAGSEGURO_TOKEN, PAGBANK_ENV | Chave do PagBank e se está em produção ou teste. |
BLING_*, COMPANY_ID_TESTE, ID_TIPO_NEGOCIO | Acesso ao Bling. |
TRELLO_* | Chave do Trello e identificação de cada coluna do quadro. |
TOKEN_FRENET, CEP_ORIGEM | Frete. |
TRANSPORTER_EMAIL, TRANSPORTER_SENHA, EMAIL_EQUIPE_SUPORTE | Envio de e-mails. |
CONTAGEM_PIN | PIN padrão da tela de contagem de estoque (o PIN definido em Configurações tem prioridade). |
PRAZO_CANCELAMENTO_HORAS | Horas até cancelar pedidos não pagos. Padrão: 48. |
DXF_PROCESSING_*, DXF_BATCH_CONCURRENCY | Limites de memória e de quantos desenhos o servidor lê ao mesmo tempo. |
O servidor executa sozinho, sem ninguém clicar:
| Frequência | O que faz |
|---|---|
| A cada minuto | (1) Devolve ao estoque o material de checkouts cuja reserva venceu sem pagamento. (2) Emite a nota fiscal de pedidos marcados como "pronto para envio" depois de uma tolerância de 3 minutos, que dá tempo de desfazer um clique errado. |
| A cada 5 minutos | Tenta de novo os envios ao Bling que falharam (até 5 tentativas por pedido). Só roda se a integração estiver ligada em Integrações. |
| A cada 30 minutos | Tenta de novo a criação de cartões no Trello que falharam (até 5 tentativas). Só roda se a integração estiver ligada. |
| A cada hora | Cancela pedidos que continuam "aguardando pagamento" há mais de 48 horas e estorna o estoque. |
Cada pedido pago vira uma linha na planilha de controle da Makers, com uma coluna para cada parcela do preço (corte, material, fator K, imposto etc.). Existe um arquivo por ano ("ORÇAMENTOS 2026", "ORÇAMENTOS 2027"...), criado sozinho no primeiro pedido do ano. A conexão é feita por um pequeno programa (Google Apps Script) que fica dentro da planilha e recebe os dados do servidor.
O servidor (Makers-backend/src/sheets/sheets.service.ts) mostra com precisão o que ele envia. O Apps Script que roda dentro da planilha não está em nenhum repositório: a única cópia de referência é a desta página. Cada instalação preenche duas coisas suas: o prefixo do nome dos arquivos (se não for "ORÇAMENTOS "), que vai no código do script, e a URL do script publicado, que vai na tela de Configurações. Se já existir uma planilha com script funcionando, exporte o original (Extensões › Apps Script) e guarde uma cópia no cofre da empresa antes de trocar qualquer coisa.
doPost acrescenta uma linha no fim da aba, colocando cada valor na coluna de mesmo título.PREFIXO_ARQUIVO, "ORÇAMENTOS ") seguido do ano de quatro dígitos. O ano vem da data do pedido, no horário de Brasília.O script grava pelo título da coluna (linha 1 da aba), não pela posição. A equipe pode reordenar, esconder ou apagar colunas à vontade. Se o sistema enviar um valor para uma coluna que não existe, ela é criada no fim da tabela. Colunas vazias de dados que a equipe lança à mão continuam funcionando. Para usar o modelo, faça uma cópia dele no Google Drive da Makers (Arquivo › Fazer uma cópia) com o nome "ORÇAMENTOS 2026" e siga o passo a passo.
| Título da coluna | Campo enviado | Quem preenche |
|---|---|---|
| Data | data | Sistema (data do pedido, em Brasília) |
| Responsável | responsavel | Sistema grava "Sistema"; a equipe usa o próprio nome nas linhas manuais |
| Cliente / Trabalho | clienteTrabalho | Sistema (nome do pedido) |
| Pago? | pago | Sistema envia true. Ver "Pontos a decidir". |
| Valor | valor | Sistema (total do pedido) |
| Inserido no Bling | inseridoBling | Sistema (true se a conta a receber e a ordem de serviço foram criadas) |
| Tempo de corte | tempoCorte | Sistema, no formato "1h23" (soma do tempo de máquina de corte). Vazio em pedido sem composição. |
| Trello | trello | Sistema (true se criou ao menos um cartão) |
| Corte | corte | Sistema: só o valor do corte, antes de imposto, sem gravação, manuseio e mínimo (cada um tem coluna própria) |
| Materiais | materiais | Sistema: soma das parcelas de material (usado + fator K + markup − desconto), antes de imposto |
| Gravação | gravacao | Sistema (valor da gravação, quando houver) |
| Terceirizados, Overprice, Criação, Montagem | terceirizados, overprice, criacao, montagem | Equipe (o sistema envia vazio) |
| Frete | frete | Sistema (frete do pedido) |
| Val, Pagamento, NF / OS, Obs | val, pagamento, nfOs, obs | Equipe. Exceção: em Obs o sistema avisa quando a composição do preço está desatualizada. |
| Como o preço foi formado (colunas novas; valores antes de imposto, exceto as duas últimas) | ||
| Tempo de gravação | tempoGravacao | Sistema, "1h23" |
| Setup de gravação | setupGravacao | Sistema (taxa de setup por arquivo gravado) |
| Desconto no corte | descontoCorte | Sistema (valor negativo) |
| Manuseio | manuseio | Sistema (taxa de manuseio, somada ao corte) |
| Complemento do mínimo | complementoMinimo | Sistema (valor para completar o mínimo da máquina e o mínimo do pedido) |
| Material usado | materialUsado | Sistema (custo da parte usada da chapa) |
| Completar com fator K | completarFatorK | Sistema (cobrança da sobra da chapa) |
| Fator K | fatorK | Sistema, como percentual ("20%"; "20% / 30%" se os materiais do pedido têm K diferentes) |
| Markup do material | markupMaterial | Sistema |
| Desconto no material | descontoMaterial | Sistema (valor negativo) |
| Imposto | imposto | Sistema (valor em R$ do imposto) |
| Taxa regional | taxaRegional | Sistema (valor em R$) |
Como conferir: somando todas as colunas de preço (Corte, Gravação, Setup de gravação, Desconto no corte, Manuseio, Complemento do mínimo, Material usado, Completar com fator K, Markup do material, Desconto no material, Imposto e Taxa regional) dá o valor dos itens do pedido. O Valor inclui ainda o adicional que o administrador tenha lançado no pedido, quando houver. As colunas de preço ficam vazias em pedidos com preço manual, em pedidos anteriores a esta versão e quando o pedido foi editado depois do pagamento (aí a coluna Obs avisa). O motivo: o sistema não grava números que não fecham.
pago = true. Ou o script antigo ignora esses dois campos para a equipe conferir à mão, ou as linhas da amostra são de uma versão anterior. O script abaixo tem uma chave para escolher (MARCAR_PAGO_E_BLING).COLUNAS do script.dd/mm/aaaa como texto; o script converte para data de verdade, e a coluna mostra no formato que a planilha já usa.Método POST, cabeçalho Content-Type: application/json, com um objeto por pedido. Campos de preço vazios ("") significam "zero ou indisponível":
{
"data": "20/10/2026",
"responsavel": "Sistema",
"clienteTrabalho": "Diogo - Suporte Ferro",
"pago": true,
"valor": 851.31,
"inseridoBling": true,
"trello": true,
"tempoCorte": "1h23",
"corte": 120.50, "gravacao": "", "tempoGravacao": "", "setupGravacao": "",
"descontoCorte": -12.05, "manuseio": 15.20, "complementoMinimo": "",
"materialUsado": 450.00, "completarFatorK": 90.00, "fatorK": "20%",
"markupMaterial": 67.50, "descontoMaterial": "",
"materiais": 607.50,
"imposto": 56.17, "taxaRegional": "",
"frete": 0,
"terceirizados": "", "overprice": "", "criacao": "", "montagem": "",
"val": "", "pagamento": "", "nfOs": "", "obs": ""
}
ABA./exec e tem o formato https://script.google.com/macros/s/…/exec.Se a planilha já estava ligada ao sistema, a URL já está cadastrada: basta atualizar o script e publicar uma nova versão (ver "Cuidados"), sem mexer em Configurações. Atualizando de uma versão antiga (uma planilha só, sem ano no nome): renomeie o arquivo para "ORÇAMENTOS 2026" antes de publicar; sem isso o script cria um arquivo vazio com esse nome na primeira gravação.
Acrescenta uma linha no fim da aba, na coluna de mesmo título, copiando o formato e as caixas de seleção da linha de cima. Cria o arquivo do ano quando ele ainda não existe.
// Webhook de pedidos da Makers -> planilha de controle (um arquivo por ano).
// Cole em Extensões > Apps Script e publique como App da Web.
// Cada ano tem o seu arquivo: "ORÇAMENTOS 2026", "ORÇAMENTOS 2027"... O pedido vai para o
// arquivo do ano da data dele. Se ele ainda não existe, o script o cria sozinho, copiando o
// arquivo do ano anterior (cabeçalho, formato e caixas de seleção) e apagando os pedidos.
const PREFIXO_ARQUIVO = 'ORÇAMENTOS ';
// Aba onde as linhas são lançadas. Deixe '' para usar a primeira aba do arquivo.
const ABA = '';
// Deixe true para gravar Pago? e Inserido no Bling como o sistema informa.
// Deixe false se a equipe prefere conferir e marcar essas duas caixas à mão.
const MARCAR_PAGO_E_BLING = true;
// Campo que o servidor envia -> título EXATO da coluna, na linha 1 da aba.
// A gravação é pelo TÍTULO, não pela posição: a equipe pode reordenar, esconder ou apagar
// colunas. Se um título não existir e o servidor mandar valor, a coluna é criada no fim.
const COLUNAS = {
data: 'Data',
responsavel: 'Responsável',
clienteTrabalho: 'Cliente / Trabalho',
pago: 'Pago?',
valor: 'Valor',
inseridoBling: 'Inserido no Bling',
tempoCorte: 'Tempo de corte',
trello: 'Trello',
corte: 'Corte',
materiais: 'Materiais',
gravacao: 'Gravação',
terceirizados: 'Terceirizados',
overprice: 'Overprice',
criacao: 'Criação',
montagem: 'Montagem',
frete: 'Frete',
val: 'Val',
pagamento: 'Pagamento',
nfOs: 'NF / OS',
obs: 'Obs',
// Como o preço foi formado (vazias em pedidos sem composição, ex.: preço manual).
tempoGravacao: 'Tempo de gravação',
setupGravacao: 'Setup de gravação',
descontoCorte: 'Desconto no corte',
manuseio: 'Manuseio',
complementoMinimo: 'Complemento do mínimo',
materialUsado: 'Material usado',
completarFatorK: 'Completar com fator K',
fatorK: 'Fator K',
markupMaterial: 'Markup do material',
descontoMaterial: 'Desconto no material',
imposto: 'Imposto',
taxaRegional: 'Taxa regional'
};
function doPost(e) {
const trava = LockService.getScriptLock();
trava.waitLock(20000); // evita duas linhas gravadas em cima uma da outra
try {
const dados = JSON.parse(e.postData.contents);
dados.data = paraData(dados.data);
if (!MARCAR_PAGO_E_BLING) { dados.pago = false; dados.inseridoBling = false; }
const ano = dados.data instanceof Date ? dados.data.getFullYear() : new Date().getFullYear();
const aba = abaDoAno(String(ano));
const colunas = mapearColunas(aba, dados);
const largura = aba.getLastColumn();
const ultima = ultimaLinhaComCliente(aba, colunas.clienteTrabalho);
const nova = ultima + 1;
if (aba.getMaxRows() < nova) aba.insertRowAfter(ultima);
// Herda formato (R$, data) e caixas de seleção da linha de cima.
if (ultima > 1) {
const modelo = aba.getRange(ultima, 1, 1, largura);
const destino = aba.getRange(nova, 1, 1, largura);
modelo.copyTo(destino, SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
modelo.copyTo(destino, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
}
const linha = [];
for (let i = 0; i < largura; i++) linha.push('');
Object.keys(colunas).forEach(function (campo) {
if (dados[campo] !== undefined) linha[colunas[campo] - 1] = dados[campo];
});
aba.getRange(nova, 1, 1, largura).setValues([linha]);
return resposta({ ok: true, arquivo: aba.getParent().getName(), linha: nova });
} catch (erro) {
return resposta({ ok: false, erro: String(erro) });
} finally {
trava.releaseLock();
}
}
// ---- Um arquivo por ano -----------------------------------------------------------------
// Devolve a aba do ano; cria o arquivo do ano se ele ainda não existe.
function abaDoAno(ano) {
const propriedades = PropertiesService.getScriptProperties();
let planilha = abrirNaoExcluida(propriedades.getProperty('arquivo_' + ano));
if (!planilha) {
planilha = procurarPorNome(PREFIXO_ARQUIVO + ano) || criarArquivoDoAno(ano);
propriedades.setProperty('arquivo_' + ano, planilha.getId());
}
const aba = ABA ? planilha.getSheetByName(ABA) : planilha.getSheets()[0];
if (!aba) throw new Error('Aba não encontrada: ' + ABA);
return aba;
}
function abrirNaoExcluida(id) {
if (!id) return null;
try {
return DriveApp.getFileById(id).isTrashed() ? null : SpreadsheetApp.openById(id);
} catch (erro) {
return null;
}
}
function procurarPorNome(nome) {
const achados = DriveApp.getFilesByName(nome);
while (achados.hasNext()) {
const arquivo = achados.next();
if (!arquivo.isTrashed()) return SpreadsheetApp.open(arquivo);
}
return null;
}
// Copia o arquivo de ano mais recente que já existe (ou, na primeira vez, o arquivo onde este
// script está) e deixa só o cabeçalho + 1 linha vazia já formatada para o primeiro pedido.
function criarArquivoDoAno(ano) {
const propriedades = PropertiesService.getScriptProperties();
const anos = Object.keys(propriedades.getProperties())
.filter(function (chave) { return /^arquivo_\d{4}$/.test(chave); })
.map(function (chave) { return chave.slice(8); })
.sort();
let modelo = null;
for (let i = anos.length - 1; i >= 0 && !modelo; i--) {
modelo = abrirNaoExcluida(propriedades.getProperty('arquivo_' + anos[i]));
}
modelo = modelo || SpreadsheetApp.getActiveSpreadsheet();
const copia = modelo.copy(PREFIXO_ARQUIVO + ano);
const pastas = DriveApp.getFileById(modelo.getId()).getParents();
if (pastas.hasNext()) DriveApp.getFileById(copia.getId()).moveTo(pastas.next());
const aba = ABA ? copia.getSheetByName(ABA) : copia.getSheets()[0];
if (aba.getMaxRows() > 2) aba.deleteRows(3, aba.getMaxRows() - 2);
aba.getRange(2, 1, 1, aba.getMaxColumns()).clearContent();
return copia;
}
// ---- Colunas pelo título ----------------------------------------------------------------
function normalizar(texto) {
return String(texto).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '')
.replace(/\s+/g, ' ').trim();
}
// campo -> nº da coluna (1, 2, 3...). Só cria coluna nova para campo que veio com valor.
function mapearColunas(aba, dados) {
let largura = Math.max(aba.getLastColumn(), 1);
const titulos = aba.getRange(1, 1, 1, largura).getValues()[0].map(normalizar);
const mapa = {};
Object.keys(COLUNAS).forEach(function (campo) {
const indice = titulos.indexOf(normalizar(COLUNAS[campo]));
if (indice >= 0) {
mapa[campo] = indice + 1;
} else if (dados[campo] !== undefined && dados[campo] !== '') {
largura += 1;
aba.getRange(1, largura - 1).copyTo(aba.getRange(1, largura), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);
aba.getRange(1, largura).setValue(COLUNAS[campo]);
mapa[campo] = largura;
}
});
return mapa;
}
// Última linha com "Cliente / Trabalho" preenchido. Não usa getLastRow() porque caixas de
// seleção desmarcadas (FALSE) contam como conteúdo e esconderiam a linha vazia do arquivo novo.
function ultimaLinhaComCliente(aba, colunaCliente) {
if (!colunaCliente) return aba.getLastRow();
const valores = aba.getRange(1, colunaCliente, aba.getMaxRows(), 1).getValues();
for (let i = valores.length - 1; i >= 0; i--) {
if (valores[i][0] !== '') return i + 1;
}
return 1;
}
// "20/10/2026" -> data de verdade (a coluna mostra no formato que a planilha já usa).
function paraData(texto) {
const m = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/.exec(String(texto));
return m ? new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1])) : texto;
}
// Abrir a URL no navegador mostra esta mensagem: serve para conferir se a publicação está no ar.
function doGet() {
return ContentService.createTextOutput('Webhook de pedidos da Makers ativo.');
}
function resposta(objeto) {
return ContentService.createTextOutput(JSON.stringify(objeto))
.setMimeType(ContentService.MimeType.JSON);
}
// Teste dentro do editor: escolha "testar" no seletor de funções e clique em Executar.
function testar() {
const r = doPost({ postData: { contents: JSON.stringify({
data: Utilities.formatDate(new Date(), 'America/Sao_Paulo', 'dd/MM/yyyy'),
responsavel: 'Sistema', clienteTrabalho: 'TESTE - pode apagar',
pago: true, valor: 100, inseridoBling: true, trello: true,
corte: 60, materiais: 40, frete: 0, fatorK: '20%'
}) } });
Logger.log(r.getContent());
}
// Teste da virada de ano: cria o ARQUIVO do ano que vem com 1 linha de teste.
// Depois de conferir, mande esse arquivo para a lixeira do Drive (senão ele vira o de verdade
// quando o ano virar) e rode "limparTesteDaVirada".
function testarVirada() {
const ano = new Date().getFullYear() + 1;
const r = doPost({ postData: { contents: JSON.stringify({
data: '02/01/' + ano, responsavel: 'Sistema', clienteTrabalho: 'TESTE VIRADA - pode apagar',
pago: true, valor: 100, inseridoBling: true, trello: true, corte: 60, materiais: 40, frete: 0
}) } });
Logger.log(r.getContent());
}
// Esquece o arquivo do ano que vem registrado pelo teste (depois de mandá-lo para a lixeira).
function limparTesteDaVirada() {
PropertiesService.getScriptProperties()
.deleteProperty('arquivo_' + (new Date().getFullYear() + 1));
}
/exec no navegador. Deve aparecer "Webhook de pedidos da Makers ativo."testar e clique em Executar. Uma linha "TESTE - pode apagar" aparece no fim da aba do ano, com o formato das outras, e a coluna "Fator K" é criada se ainda não existir. Apague a linha depois.testarVirada. Deve surgir, na mesma pasta do Drive, o arquivo "ORÇAMENTOS" do ano que vem, só com o cabeçalho e a linha de teste formatada (caixas de seleção incluídas). Confira e mande esse arquivo para a lixeira; depois execute limparTesteDaVirada. Se esquecer, ele passa a ser o arquivo de verdade do ano seguinte, com a linha de teste dentro.curl -L -X POST -H "Content-Type: application/json" -d "{\"clienteTrabalho\":\"TESTE\",\"valor\":1}" "https://script.google.com/macros/s/.../exec"-L é importante: o Google responde com um redirecionamento, e o servidor da Makers também o segue.PREFIXO_ARQUIVO, ABA, MARCAR_PAGO_E_BLING e a lista COLUNAS (títulos)./exec gerada ao publicar o script.Três repositórios no GitHub, um para cada programa. Todos pertencem à organização cce-fluxo.
| Repositório | O que é | Tecnologia |
|---|---|---|
| Makers-backend | O servidor. Lê os DXFs, calcula tempo e preço, fala com banco, pagamento, Bling, Trello e frete. | NestJS (Node.js), Prisma, PostgreSQL |
| makers-adm-front | O painel administrativo, usado pela equipe da Makers. A aplicação fica na subpasta makers-adm/. | Next.js (React), Tailwind, Formik, React Query |
| makers-front | O site do cliente: cadastro, orçamento, pagamento e acompanhamento de pedidos. | Next.js (React), Tailwind |
Os dois sites não acessam o banco diretamente. Tudo passa pelo servidor: o site pede, o servidor consulta o banco, calcula e responde. É por isso que as regras de preço existem em um só lugar, o servidor, e o site do cliente e o painel sempre mostram o mesmo valor.
O código tem duas ramificações principais: develop, onde as mudanças são feitas e testadas, e main, a versão que vai ao ar. O script git-deploy.ps1 (na pasta que contém os três repositórios) faz o caminho padrão para os três de uma vez: salva as mudanças em develop, junta em main e envia ao GitHub. A publicação final depende do serviço de hospedagem de cada programa (ver Serviços e acessos).
Mudanças no código devem ser feitas por um desenvolvedor, com o ambiente local configurado. O painel administrativo cobre todos os ajustes de rotina (materiais, preços, máquinas, estoque) sem precisar mexer em código.
Roteiro técnico para um desenvolvedor colocar o sistema para funcionar em um computador novo. Quem só opera o painel pode pular esta página.
.env no backend com as variáveis da página Serviços e acessos (os valores estão no segredo envMakers do AWS Secrets Manager, veja Serviços e acessos).Outros comandos úteis: npm run build (gera a versão de produção), npm test (roda os testes automáticos, incluindo os do motor de preço) e npm run lint.
Por padrão, os dois sites falam com o servidor de produção (https://newapi.makers.com.br). Para apontar para o seu servidor local: no painel, defina NEXT_PUBLIC_API_URL=http://localhost:3001 em .env.local; no site do cliente, o endereço fica fixo em src/app/service/axios.tsx (há uma linha comentada para o endereço local).
O desenho do banco está em Makers-backend/prisma/schema.prisma e cada mudança vira uma migration na pasta prisma/migrations (hoje, 65). Regras importantes:
env -u DIRECT_URL npx prisma migrate dev. O prefixo env -u DIRECT_URL é obrigatório, porque a conexão direta (porta 5432) não é acessível de fora; o pooler (porta 6543) funciona.env -u DIRECT_URL npx prisma migrate deploy.prisma migrate resetEsse comando apaga todos os dados do banco. Também não use prisma migrate dev sem o prefixo acima.
npm test deve passar.pwsh .\git-deploy.ps1 -Message "descrição da mudança". Use -DryRun para só ver o que seria feito.Makers-backend): o fluxo publica a imagem e reinicia o servidor no EC2.O servidor é dividido em módulos, um por assunto. Clique nas pastas para abrir.
Quando um valor do orçamento parecer errado, o caminho é: orcamento.service.ts (monta os números) → engines/pricing.engine.ts (as contas de dinheiro). Cada engine tem um arquivo de teste ao lado (*.spec.ts) que documenta o comportamento esperado.
O painel é um site Next.js. Em Next.js, cada pasta dentro de app/ vira uma tela do menu.
O site do cliente segue a mesma organização do painel: cada pasta de src/app/(pages) é uma tela.
O painel é onde a equipe da Makers cadastra tudo o que alimenta o preço e acompanha os pedidos. Quase nada do que você precisa mudar no dia a dia exige mexer em código.
| Item do menu | Para que serve | Quando usar |
|---|---|---|
| Pedidos | Lista e detalhe de todos os pedidos, com status, valores e arquivos. | Todo dia: acompanhar produção, cancelar, conferir um valor. |
| Clientes | Cadastro de pessoas e empresas, com histórico de pedidos. | Consultar dados de um cliente ou aplicar um grupo de desconto. |
| Materiais | Três subtelas: Parâmetros, Condições gerais e Fornecedores. | Cadastrar material novo, ajustar velocidade, margens e sobras. |
| Estoque | Chapas, retalhos e o histórico de movimentações. | Dar entrada em chapa, conferir retalho, corrigir quantidade. |
| Máquinas | Máquinas de corte e gravação e Grupos de preço. | Mudar preço da hora, mesa, valor mínimo. |
| Integrações | Liga ou desliga Trello, Bling e outros. | Quando um serviço externo estiver fora do ar. |
| Configurações | Percentuais gerais, prazos, avisos, pagamento, taxas regionais e grupos de desconto. | Ajustar imposto, markup, manuseio, mínimo ou desligar o sistema. |
| Simulador | Ferramenta técnica para testar arquivos e entender por que um preço saiu como saiu. | Ao calibrar parâmetros ou auditar um pedido. |
| Sair | Encerra a sessão. |
Parâmetros de material e máquina mudam o preço de todos os novos orçamentos imediatamente. Pedidos já feitos mantêm o valor que o cliente pagou. Use o Simulador para testar uma mudança antes de gravá-la.
O acesso ao painel é por e-mail e senha de administrador.
Na tela de login, informe o e-mail e a senha do administrador. A sessão fica aberta até você clicar em Sair no menu.
Se o e-mail de recuperação não chegar, confira a conta de e-mail do sistema em Serviços e acessos.
Os administradores ficam na tabela Admin do banco (ver MER). O painel não tem uma tela para criar novos administradores. O servidor tem a operação pronta (POST /admin, que só funciona com um administrador já logado), e um desenvolvedor a executa quando for preciso.
Se a Makers quiser gerenciar administradores sozinha, é uma melhoria simples a combinar com a Fluxo Consultoria.
A tela mais usada no dia a dia: todos os pedidos, com situação, valor e prazo.
| Coluna | O que mostra |
|---|---|
| Usuário / E-mail / Telefone | Quem fez o pedido. |
| Valor | Total pago, com imposto, taxa regional, frete e descontos já aplicados. |
| Prazo | Prazo de produção informado ao cliente (dias de fila + dias de máquina). |
| Arquivos | Quantos desenhos DXF o pedido tem. |
| Status | Em que ponto do caminho está o pedido (veja abaixo). |
O caminho completo, com os desvios, está em Estados do pedido.
Ao clicar num pedido abre o painel lateral com:
O Simulador é a ferramenta para testar arquivos, comparar cenários e auditar preços. Usa exatamente o mesmo motor que o site do cliente.
Dentro de cada grupo existe um painel de calibração com três blocos. Mudar qualquer campo recalcula o preço na hora, mas só vale para aquela simulação:
| Bloco | Campos |
|---|---|
| Máquina / Corte | Velocidade de deslocamento, aceleração, fator de escala, preço da hora base, tempo até estabilizar (ou taxa de decaimento), mínimo da máquina, setup e taxa de gravação. |
| Material | Velocidade de corte, inlet, piercing, nesting gap, setup, catar peça, troca de chapa, taxas de sobra (estoque e nova), taxa de manuseio, multiplicador de hora (base e amplitude). |
| Financeiro | Markup de material, imposto, mínimo global, desconto de corte, desconto de material e taxa regional. |
Se alguém alterar o cadastro do material depois que você simulou, o painel avisa "Os parâmetros do material mudaram desde esta simulação". Reanalise para usar os valores novos.
As mudanças do bench são só para testar. Para valer nos próximos orçamentos, altere o parâmetro na tela do material ou da máquina.
É o painel que fecha as contas do pedido: para cada máquina mostra o tempo, o preço da hora efetivo, o corte, a gravação, a taxa de manuseio e o "valor para completar o mínimo"; para cada material, a parte usada, o fator K, o markup e as chapas; e por arquivo, quanto de máquina e de material cabe a cada um. A soma sempre fecha com o total do pedido, ao centavo.
O catálogo de materiais. Um material é uma família (Acrílico, MDF, Inox 304); cada espessura/cor dele é uma variante, cadastrada em Parâmetros.
Cada linha é uma família. Os campos editáveis são:
| Campo | O que é |
|---|---|
| Material | Nome da família, como aparece para o cliente. |
| Densidade | Peso por volume do material. Usada em cálculos de peso para frete. |
| Velocidade de gravação | Velocidade da gravação neste material, em mm/min. |
| Multiplicador de gravação | Fator sobre o preço da gravação por área, para materiais mais difíceis (vazio = 1). Ex.: 1,5 cobra 50% a mais. |
| Prazo de compra | Dias para o fornecedor entregar uma chapa nova. Entra no prazo do pedido quando não há chapa suficiente em estoque. |
| SKU Bling, CEST, ST | Códigos do Bling e fiscais usados na emissão da nota. |
| Característica 1, 2, 3 | Os "eixos" que diferenciam as variantes (por exemplo, Cor e Acabamento). |
| Fornecedor | De quem se compra a chapa (ver Fornecedores). |
| Máquina de corte / de gravação | Quais máquinas podem trabalhar este material. É uma ligação "muitos para muitos": um material pode ter várias máquinas, e uma máquina vários materiais. O orçamento escolhe sozinho a máquina mais barata em que a peça cabe (ver Escolha da máquina). |
Uma versão em planilha, com os materiais em estoque, botão para criar um novo material e atalho para ver todas as chapas. Boa para uma conferência rápida.
O motor só considera chapas com preço cadastrado. Variante sem nenhuma chapa com preço gera erro no orçamento do cliente ("não possui nenhuma chapa com preço cadastrado"). Máquina sem coeficiente de preço (A/B) também impede o orçamento.
Aqui ficam os parâmetros de corte de cada variante de material. São os campos que mais pesam no tempo, e portanto no preço.
Cada linha é uma variante (por exemplo, "Acrílico 4 mm Preto"). Você pode editar direto na tabela e usar Salvar mudanças, ou abrir o painel lateral. O botão Criar novo com as mesmas características duplica a variante (útil para outra espessura).
| Campo | O que é |
|---|---|
| ID único | Código legível da variante, não se repete. |
| Espessura / Gauge | Espessura em mm e bitola (para chapas finas). |
| Observação (cliente) | Texto que o cliente vê ao escolher este material. |
| Exige especificação | Obriga o cliente a digitar qual cor/variação quer (para casos como "acrílico, cor específica"). |
| Campo | O que é |
|---|---|
| Fornecemos | Sim: a Makers vende a chapa. Não: o cliente sempre traz o material (cobra só corte e manuseio). |
| Permite retalhos | Se o orçamento pode usar retalhos do estoque neste material. |
| Pode rotacionar | Desmarcado quando o material tem veio: a peça não pode girar 90° na chapa. Isso reduz o aproveitamento e encarece. |
| Campo | Unidade | Efeito |
|---|---|---|
| Velocidade de corte | mm/min | Quanto mais lenta, mais tempo e mais caro. É o campo que mais mexe no preço. |
| Piercing | segundos | Tempo de cada furo inicial. Peças com muitos contornos são mais afetadas. |
| Inlet | mm | Comprimento da entrada de corte por contorno, percorrido na velocidade de corte. |
| Nesting gap | mm | Espaço entre peças na chapa. Mais espaço = menos peças por chapa. |
| Setup time | minutos | Preparação da máquina, cobrada uma vez por pedido. |
| Catar peças | segundos/peça | Tempo para retirar cada peça da máquina. |
| Troca de chapa | minutos | Tempo para trocar a chapa quando o pedido usa mais de uma. |
| Small holes | mm | Furos menores que este valor geram um aviso ao cliente: risco de falha no corte. |
| Multiplicador de hora | curva | Ajuste opcional do preço da hora conforme a duração do trabalho (ver Custo de máquina). Vazio = sem efeito. |
| Campo | O que é |
|---|---|
| Taxa de sobra com material em estoque | Fator K, em %, quando a chapa já está na fábrica. |
| Taxa de sobra sem material em estoque | Fator K, em %, quando é preciso comprar chapa nova. |
| Prazo de compra | Dias para chegar chapa desta espessura (vazio = usa o da família). |
Digite 20 para 20%. O sistema trata todos os valores de K como percentual. Um K em branco vale 0 (não cobra sobra).
Abra o Simulador com um arquivo conhecido, mude o campo no bench e veja o preço. Quando estiver satisfeito, grave o novo valor aqui.
A visão das variantes junto com as chapas e retalhos cadastrados em cada uma: tamanhos, preços e quantidades.
Ao abrir uma chapa você vê o material, o ID único da variante, os parâmetros e o tipo (chapa inteira ou retalho), além das medidas, do preço e da quantidade.
Chapa inteira: o preço é cadastrado por você (o valor que a Makers paga ao fornecedor). Retalho: o preço é calculado automaticamente. O sistema acha a menor chapa inteira em que o retalho caberia e cobra a fatia proporcional da área; o "preço real" soma a parte da sobra (fator K). Quando o preço da chapa muda, os retalhos são recalculados.
Cadastro simples dos fornecedores de chapa.
| Campo | O que é |
|---|---|
| Nome | Nome do fornecedor. |
| E-mail e telefone | Contato para pedidos de compra. |
| Tempo de entrega | Prazo habitual, em texto livre (ex.: "5 dias úteis"). |
O fornecedor é escolhido no cadastro do material. Hoje ele é informativo para a equipe: o prazo que entra no orçamento vem do campo Prazo de compra do material ou da variante.
O estoque físico da fábrica: o que existe, quanto, e tudo o que aconteceu com cada chapa.
Cada linha é um tamanho de chapa (ou retalho) de uma variante de material, com quantidade e preço. Ao receber chapas do fornecedor, dê entrada informando a quantidade; o sistema soma ao estoque e registra no histórico.
000354). Quando não informada, o sistema gera uma.Registra toda mudança de quantidade: quando, qual chapa, quanto entrou ou saiu, o saldo depois do movimento, de onde veio (entrada rápida, contagem, edição, exclusão, pedido, devolução de retalho) e quem fez (nome digitado na tela de contagem ou "admin"). Dá para buscar por código (ex.: CH-000023) ou por medida (ex.: 1000x1000) e filtrar por tipo de movimento.
Se o número de chapas "não bate" com a prateleira, o histórico mostra o caminho completo: quem mexeu, quando e por quê. A descrição de cada linha é uma "foto" da chapa no momento, e continua mesmo que a chapa seja editada ou excluída depois.
Uma tela separada, sem login de administrador, feita para o chão de fábrica contar e ajustar o estoque.
/contagem no painel.O PIN é único e compartilhado pela produção. Troque-o em Configurações sempre que alguém sair da equipe.
O cadastro das máquinas de corte e gravação. É onde está o preço da hora.
| Campo | O que é |
|---|---|
| Nome, marca, modelo, software, potência, manual | Identificação. O nome é o que aparece no resumão e no Trello. |
| Área X e Área Y (mm) | Tamanho da mesa. Define quais peças a máquina consegue cortar: peça maior que a mesa não vai para esta máquina. |
| Vel. deslocamento (mm/min) | Velocidade do cabeçote quando se move sem cortar. |
| Aceleração (mm/s²) | Quão rápido o cabeçote ganha velocidade. Peças com muitas curvas e cantos são mais sensíveis a ela. |
| Valor mínimo (R$) | Menor valor de corte por pedido nesta máquina (ver Valor mínimo). |
| Faz corte / Faz gravação | O que a máquina executa. |
| Ativa | Máquina desativada deixa de ser escolhida nos orçamentos. |
| Campo no painel | O que faz |
|---|---|
| Grupo de preço | Herda o preço da hora de um grupo. |
| Preço da hora (base) | Valor da hora para o qual o preço converge em trabalhos longos. (override) se preenchido, sobrescreve o grupo. |
| Fator de escala | Acréscimo cobrado nos primeiros minutos. (override) |
| Tempo até estabilizar (h) | Em quantas horas o acréscimo praticamente desaparece. (override) |
Máquina sem valor próprio usa o do grupo. Valor da máquina vale mais que o do grupo. A máquina precisa ter ao menos um valor (próprio ou de grupo) em Preço da hora ou Fator de escala; senão, não entra nos orçamentos.
| Campo | O que é |
|---|---|
| Vel. gravação (mm/min) | Velocidade da gravação. |
| Taxa de gravação por área (R$/cm²) | Preço da gravação preenchida, por área gravada. |
| Taxa de setup da gravação (R$) | Valor fixo por arquivo que tem gravação preenchida. |
Se a máquina de gravação não tiver "Taxa de gravação por área", a gravação preenchida sai de graça. O simulador e o resumão mostram um aviso nesse caso.
No painel lateral da máquina aparece a lista de materiais vinculados e o botão para vincular outros. A ligação é a mesma configurada em Materiais, vista do outro lado.
Um grupo reúne máquinas parecidas que compartilham o mesmo preço da hora. Mudar o grupo muda todas as máquinas dele de uma vez.
| Campo | O que é | No código |
|---|---|---|
| Nome do grupo | Ex.: "Corte de Metais", "Corte de Acrílico". | nome |
| Preço da hora (base) | Para onde o preço da hora converge em trabalhos longos. | coefB |
| Fator de escala | Acréscimo no início do trabalho, somado ao preço base. | coefA |
| Tempo para estabilizar (h) | Em quantas horas o acréscimo cai a 1% do valor inicial. | coefF (convertido) |
Cada grupo mostra as máquinas que pertencem a ele. Uma máquina com valores próprios aparece sinalizada ("esta máquina tem coeficientes próprios"). A fórmula completa, com exemplos, está em Custo de máquina.
Se o grupo "Corte de Metais" tem preço base R$ 600/h e fator de escala R$ 400, um trabalho de poucos minutos é cobrado perto de R$ 1.000/h e um trabalho de 2h30 perto de R$ 609/h. É a regra combinada com a Makers: primeiros minutos mais caros, depois a hora vai baratando.
A lista de quem se cadastrou no site, sejam pessoas físicas ou empresas.
Excluir pede confirmação, pois remove também o endereço e os vínculos do cadastro. Prefira excluir só quando for um cadastro de teste.
As regras gerais do orçamento e do sistema. O menu da página tem sete seções.
Se você mexeu em algum campo da seção Geral e tentar sair da tela pelo menu (ou fechar ou recarregar a aba do navegador), o painel avisa e deixa escolher entre Continuar editando e Sair sem salvar. O botão Salvar fica no fim da página. O botão "Voltar" do navegador ainda não pede confirmação.
Cada grupo tem um nome e três percentuais: corte, material e frete. Para dar o desconto a um cliente, associe-o ao grupo (ou aplique no simulador ao orçar). Desconto de corte reduz só o valor de máquina; desconto de material reduz só o valor do material.
| Campo | O que é | Onde entra no preço |
|---|---|---|
| Preço mínimo de pedido | Menor valor total aceito, em R$. | Último degrau (ver Valor mínimo). |
| Imposto geral (%) | Somado ao total. | Fechamento. |
| Markup – Material (%) | Margem sobre o material usado. | Material. |
| Taxa de manuseio (%) | Percentual sobre o material usado, somado ao corte. | Manuseio. |
| Campo | O que é |
|---|---|
| Tempo padrão de setup (min) | Usado quando a variante de material não define o seu. |
| Jornada de trabalho (h/dia) | Quantas horas de máquina por dia. Converte o tempo de produção em dias do prazo. |
| Fila de produção (dias) | Dias de espera antes de começar. Somados ao prazo. |
| Reserva de material (min) | Quanto tempo o checkout segura o material antes de devolver ao estoque. |
| Limite de upload DXF (MB) | Tamanho máximo do arquivo aceito. |
| PIN da contagem de estoque | PIN da tela de contagem. |
Prazo do pedido = dias de fila + (tempo total de produção ÷ jornada diária, arredondado para cima) + dias de compra de chapa, se faltar estoque.
Avisos que o sistema mostra ao cliente quando uma pequena mudança melhora o preço (por exemplo, "pedindo mais 2 peças, o custo por peça cai"). Cada aviso pode ser ligado ou desligado, e tem limiares ajustáveis.
Uma lista de estados com um percentual cada. A taxa do estado do cliente é somada ao total do pedido (não subtraída do corte), junto com o imposto geral.
Imposto, markup, manuseio e mínimo afetam todo orçamento novo de imediato. Teste no Simulador antes de salvar.
Uma chave liga/desliga para cada serviço externo conectado.
Cada cartão representa uma integração (por exemplo, "Trello" e "Bling ERP"). Desligar uma integração suspende o envio de novos pedidos para ela e as tentativas automáticas de reenvio. Os pedidos continuam sendo criados normalmente.
Cada tentativa fica registrada por pedido (tabela PedidoIntegracao): status, mensagem, número de tentativas e o que foi enviado e respondido. O sistema tenta de novo sozinho, até 5 vezes. Depois disso é preciso reenviar manualmente ou acionar a equipe técnica.
Edite o texto de cada e-mail que o sistema envia, ligue ou desligue qualquer um deles e crie novos e-mails que saem quando um card chega numa coluna do Trello. Tudo pelo painel, sem precisar da equipe técnica.
| Para quem | Quando sai | |
|---|---|---|
| Pedido confirmado | Cliente | Assim que o pagamento é aprovado |
| Pedido expedido (envio) | Cliente | Depois que o pedido chega em Concluído e passa a tolerância de 3 minutos, quando o serviço não é retirada |
| Pedido pronto para retirada | Cliente | Mesmo momento do anterior, quando o serviço é retirada. Usa o endereço e o horário de Configurações |
| Orçamento pronto para pagamento | Cliente | Quando a Makers cria o pedido pelo simulador para o cliente. Leva um botão "Pagar agora" |
| Conta criada | Cliente | Quando a Makers cadastra o cliente. Leva um botão "Criar minha senha" |
| Novo pedido pago (aviso para a equipe) | Equipe | Assim que o pagamento é aprovado. Ver "O aviso de novo pedido" |
Cada um tem um interruptor Ligado / Desligado. Desligado, o e-mail simplesmente não sai; o resto do pedido segue normalmente. Esses seis não podem ser apagados, só desligados.
# vira o título verde ("# Olá, {primeiro_nome}!").| Chave | Vira | Exemplo |
|---|---|---|
{nome} | Nome completo do cliente | Maria da Silva |
{primeiro_nome} | Primeiro nome | Maria |
{pedido} | Número do pedido | 1234 |
{valor} | Valor do pedido | R$ 851,31 |
{data} | Data do envio do e-mail | 21/10/2026 |
{prazo} | Prazo de produção | 5 dias úteis |
{link} | Link de pagamento ou de criar senha. Se não estiver no texto, o botão é adicionado no fim | |
{endereco_retirada} | Endereço de retirada (Configurações) | |
{horario_retirada} | Horário de funcionamento (Configurações) |
{nme}) aparece no e-mail do jeito que foi escrita, sem travar o envio. Confira na pré-visualização.{nome} e {pedido} existem em todos, menos em "Conta criada" (só tem {nome} e {link}). {valor} não existe em "Conta criada". {prazo} só existe no aviso de novo pedido e nos e-mails por coluna do Trello. {link} só em "Orçamento pronto para pagamento" e "Conta criada". {endereco_retirada} e {horario_retirada} existem em todos.Em Novo e-mail por coluna do Trello, escolha uma coluna do quadro (a lista vem direto do Trello) e ajuste o texto. Quando o card de um pedido chegar nessa coluna, o cliente recebe o e-mail.
A cada pedido pago a equipe recebe um e-mail com tudo para começar a produzir, sem abrir o painel:
Quem recebe: em Configurações, campo "Quem recebe o aviso de novo pedido", com um ou mais e-mails separados por vírgula. Vazio, vai para o e-mail de suporte do servidor. Assunto e texto de abertura se editam aqui, como nos outros; os blocos de dados abaixo do texto são sempre incluídos.
O mesmo pedido nunca gera dois avisos, mesmo que o PagBank confirme o pagamento mais de uma vez.
TRANSPORTER_EMAIL e TRANSPORTER_SENHA, ver Serviços e acessos). Se a senha dela mudar, nenhum e-mail sai e o painel não avisa; o erro aparece só no registro do servidor.Rótulo: valor (por exemplo "Pedido: #{pedido}" e "Valor: {valor}") vira uma caixa verde-clara com o rótulo em negrito; o título "# ..." fica em verde. Isso é automático, não precisa de código.O site do cliente é o "balcão" da Makers: o cliente cria a conta, envia o desenho, vê o preço na hora e paga. Esta página mostra o caminho completo, para você saber o que o cliente enxerga quando conversa com ele.
| O cliente vê… | Você controla em… |
|---|---|
| Quais materiais e espessuras aparecem | Materiais (e a opção de ocultar a seção na home em Configurações) |
| Foto da home e links extras do menu | Configurações › Sistema |
| Banner na tela de pagamento | Configurações › Sistema |
| Tela de "sistema em manutenção" | Configurações › Sistema › Desabilitar sistema |
| Termos de serviço | Configurações › Sistema |
| Avisos de aproveitamento | Configurações › Insights de aproveitamento |
| Prazo e opções de pagamento | Configurações › Produção e prazos / Integrações |
O site do cliente e o Simulador do painel usam o mesmo motor de cálculo no servidor. Se o simulador mostra R$ 851,31, o cliente com os mesmos dados vê R$ 851,31. Quando os valores divergirem, o primeiro suspeito é um parâmetro que mudou entre uma simulação e outra.
O banco de dados é o arquivo organizado do sistema: tudo o que você cadastra e tudo o que o cliente faz fica gravado nele, em tabelas. Esta página explica a lógica; o mapa completo está na próxima.
Cada tabela é como uma planilha especializada (uma para clientes, uma para pedidos, uma para máquinas). Em vez de repetir informações, as tabelas se ligam: um pedido não guarda o nome do cliente, guarda o número do cliente, e o sistema vai buscá-lo na tabela de clientes. É isso que evita dados desencontrados.
Um pedido tem vários grupos; um grupo tem vários itens; cada item aponta para um DXF e para a máquina escolhida.
O pedido guarda uma cópia do endereço de entrega, dos percentuais de desconto e do valor total no momento da compra. Se amanhã o cliente mudar de endereço ou a Makers alterar um desconto, os pedidos antigos continuam mostrando o que valia naquele dia.
O mapa é gerado automaticamente do arquivo prisma/schema.prisma do servidor. Quando o banco mudar, basta rodar node build.js na pasta do manual para atualizar o mapa, sem redesenhar nada.
Modelo Entidade-Relacionamento do sistema Makers. Clique em qualquer tabela para ver seus campos, para que serve cada um e a que outras tabelas ela se liga.
Para ler o mapa: "N:1" significa "muitos para um" (muitos pedidos para um cliente); "1:1" é "um para um"; "N:N" é "muitos para muitos" (um material tem várias máquinas, e uma máquina trabalha vários materiais). Os valores possíveis de campos de lista fixa aparecem dentro da descrição do campo.
O preço de um pedido é a soma de três coisas: o que custa usar a máquina, o que custa o material e os tributos. Cada uma tem regras próprias, explicadas nas páginas seguintes, na ordem em que o sistema as calcula.
E cada parte, em resumo:
Depois entram o valor mínimo (que pode elevar o corte) e, no pagamento, o frete (com desconto próprio) e qualquer valor extra lançado pela Makers.
Use os botões para avançar uma peça por vez, ou reproduza a sequência inteira. O exemplo é o pedido de 30 peças explicado em detalhe mais adiante.
| Bloco | O que paga | O que mais pesa |
|---|---|---|
| Máquina (corte) | O tempo da máquina trabalhando, incluindo setup, troca de chapa e catar peças. | Velocidade de corte do material e preço da hora da máquina. |
| Material | A chapa usada e uma parte da sobra, com margem da Makers. | Preço da chapa, aproveitamento e fator K. |
| Tributos | Imposto geral e taxa regional do estado do cliente. | Percentuais em Configurações. |
Todas as contas acontecem no servidor. O site do cliente, o simulador do painel e o checkout do PagBank apenas exibem ou cobram o resultado. Por isso o mesmo arquivo, com os mesmos parâmetros, dá o mesmo valor em qualquer tela, ao centavo.
Para ver tudo funcionando com números, vá direto ao exemplo completo ou experimente a calculadora interativa.
Antes de calcular qualquer coisa, o servidor precisa entender o desenho: onde estão os contornos, que tamanho tem a peça e o que a máquina deve fazer com cada cor.
Cada cor do desenho recebe uma ação. O cliente (ou você, no simulador) pode escolher; sem escolha, o sistema sugere pela cor:
| Ação | O que a máquina faz | Como é cobrada | Cor sugerida |
|---|---|---|---|
| Cortar | Atravessa o material. | Por tempo (com furos e entradas). | Vermelho, preto e branco puros e a maioria das cores. |
| Gravar riscado | Marca uma linha na superfície, sem atravessar. | Por tempo, na velocidade de gravação, sem furo. | Azul. |
| Gravar preenchido | Preenche uma área (como uma impressão). | Por área (R$/cm²). Ver Gravação preenchida. | Cinza. |
| Ignorar | Nada: a camada é descartada. | Não entra no cálculo. | (escolha manual) |
A área só é calculada para contornos fechados. Uma camada marcada como "gravar preenchido" cujos contornos estejam abertos (ou que seja texto não convertido em curvas) tem área zero, e o sistema avisa em vez de cobrar R$ 0 em silêncio.
O tempo de corte não é simplesmente "perímetro dividido pela velocidade". O sistema simula o movimento do cabeçote como a máquina faria, com aceleração, curvas e deslocamentos.
| Componente | De onde vem | O que representa |
|---|---|---|
| Corte | Velocidade de corte do material (mm/min), aceleração da máquina. | O cabeçote percorrendo os contornos. Desacelera nos cantos e acelera nas retas. |
| Inlet (entrada) | Campo "Inlet" do material (mm). | Trecho de entrada de cada contorno, cortado na velocidade de corte. |
| Deslocamento (G0) | Velocidade de deslocamento da máquina (mm/min) e aceleração. | O cabeçote indo de um contorno ao seguinte sem cortar. |
| Piercing (furos) | Campo "Piercing" do material (s). | O tempo que o laser leva para furar o material no início de cada contorno. |
O sistema assume que o cabeçote já começa posicionado no primeiro corte. Não conta um deslocamento fantasma desde a origem do desenho, o que antes inflava o tempo de peças desenhadas longe do ponto zero.
A animação abaixo executa a mesma simulação do servidor. Escolha uma peça, aperte Reproduzir e mexa nos controles: o tempo por peça e o impacto no preço do pedido de 30 peças são recalculados na hora.
A física por trás do tempo é a de um carro andando em linha reta: acelera, mantém velocidade e freia. A distância percorrida é a área sob o gráfico de velocidade. Em linguagem de cálculo, d = ∫ v(t) dt. O sistema faz a conta inversa: conhece a distância (o comprimento do segmento) e descobre o tempo que a área exige.
Repare no que o controle Comprimento mostra: segmentos longos têm um trecho em cruzeiro, onde a conta é quase "distância ÷ velocidade". Segmentos curtos nem chegam à velocidade máxima, e o tempo por milímetro fica muito maior. Por isso uma peça cheia de detalhes pequenos custa mais que o perímetro sugere.
Entre um segmento e o seguinte o cabeçote precisa dobrar a direção. Quanto mais fechada a curva, menor a velocidade que a máquina aguenta sem "derrapar" o contorno. O sistema usa o método junction deviation, o mesmo de controladores de CNC e impressoras 3D: a velocidade no canto é a maior que mantém o desvio do traçado abaixo de 0,1 mm.
Depois de definidas as velocidades máximas nos cantos, o sistema faz duas passadas, uma para frente e outra para trás, para garantir que a aceleração e a frenagem realmente permitem chegar a cada canto na velocidade prevista. Com as velocidades de entrada e saída de cada segmento, aplica-se a conta do trapézio ou do triângulo acima e soma-se o tempo.
Velocidade de corte 1.500 mm/min, deslocamento 20.000 mm/min, aceleração 1.500 mm/s², piercing 0,5 s, inlet 2 mm. Perímetro total: 1.000 + 160 = 1.160 mm.
| Componente | Tempo | Observação |
|---|---|---|
| Corte puro | 46,44 s | 1.160 mm ÷ 25 mm/s = 46,40 s, mais um pequeno custo de frear/arrancar nos 8 cantos. |
| Inlet | 0,16 s | 2 contornos × 2 mm ÷ 25 mm/s. |
| Deslocamento | 0,68 s | Do furo até o contorno externo. |
| Piercing | 1,00 s | 2 contornos × 0,5 s. |
| Tempo por peça | 48,28 s | ≈ 0,80 min |
Esse tempo por peça é multiplicado pela quantidade. Para 30 peças: 30 × 48,28 s = 1.448,4 s (24,1 min) de corte. O tempo total do pedido, que inclui setup e trocas, é calculado na etapa 4.
| Para mexer em… | Altere em… | Efeito |
|---|---|---|
| Velocidade de corte | Materiais › Parâmetros | Mais lenta = mais tempo = mais caro. O campo de maior impacto. |
| Piercing, inlet | Materiais › Parâmetros | Pesam nas peças com muitos contornos. |
| Aceleração, vel. de deslocamento | Máquinas | Pesam nas peças com muitos cantos e distâncias. |
Corte uma peça de verdade, cronometre e compare com o tempo do sistema. Se o real for maior, normalmente o problema é velocidade efetiva abaixo da cadastrada ou piercing maior. Ajuste o campo correspondente (ver Guia de calibração).
Para saber o custo do material, o sistema precisa decidir em que chapa a peça cabe e quantas chapas o pedido consome. Isso é o nesting: um "Tetris" de peças dentro das chapas.
| Situação | O que o sistema faz |
|---|---|
| O desenho é maior que a maior chapa (ex.: um arquivo com muitas peças) | Separa as peças e as encaixa uma a uma em várias chapas. Mostra o aviso "o arquivo é maior que a chapa: as N peças foram redistribuídas em M chapas — estimativa de material". |
| A peça não cabe em nenhuma chapa (cliente) | Recusa o orçamento e informa a maior chapa disponível. Se o bloqueio é só o veio, sugere ativar a rotação. |
| A peça não cabe em nenhuma chapa (simulador do painel) | Calcula com a maior chapa como referência e mostra um aviso amarelo. O material fica sem valor, porque não existe preço honesto de material para o que não cabe. |
| A peça é maior que a mesa de todas as máquinas | Cliente: erro "nenhuma máquina comporta o tamanho". Simulador: calcula na maior máquina, com aviso. |
| Chapa em estoque e retalho | Entram na conta com os preços cadastrados. O retalho tem preço proporcional ao seu tamanho, por isso costuma sair mais barato. A taxa de sobra usada depende de a chapa estar em estoque ou ser nova (ver Material e fator K). |
Depois de decidir quantas peças vão em cada chapa, o sistema as posiciona sem deixar buracos no meio: ordena da peça mais alta para a mais baixa e vai enchendo primeiro o lado menor da chapa (uma fileira ao longo da menor dimensão); quando a fileira fecha, avança pelo lado maior. Numa chapa de 2.000 × 1.000 mm, as fileiras correm ao longo dos 1.000 mm e vão se somando ao longo dos 2.000 mm. Assim a sobra fica concentrada em uma ponta da chapa, em forma de retângulo aproveitável como retalho, e não espalhada em pedaços. Essa ordem só organiza o desenho: não muda quantas peças cabem nem o preço.
30 peças de 300 × 200 mm em chapas de 2.000 × 1.000 mm, com espaço de 3 mm. Sem girar a peça, cabem 6 ao longo do comprimento e 4 na largura: 24 peças por chapa. Para 30 peças são necessárias 2 chapas (a segunda leva só 6). Se o material permitisse girar 90°, caberiam 27 por chapa (9 × 3): o exemplo trata o material como se não pudesse girar.
O encaixe exato é calculado pelo servidor (o resultado real pode variar um pouco). O exemplo usa 24 peças por chapa para que as contas possam ser acompanhadas à mão.
Mude o tamanho da peça, o espaço entre elas e a quantidade. Marque "pode girar" para ver o ganho de um material sem veio. Repare em como o aproveitamento (p) oscila: uma peça pouco menor pode caber duas vezes mais, ou nenhuma a mais.
Cortar não é só o laser funcionando. O pedido também gasta tempo com setup, troca de chapa e catar peças. Tudo isso é tempo de máquina ocupada e entra no preço.
| Parcela | Campo (Parâmetros do material) | Como entra |
|---|---|---|
| Corte | (calculado na etapa 2) | Tempo por peça × quantidade. |
| Setup | Setup time (minutos) | Uma vez por pedido (no primeiro grupo de chapa). |
| Troca de chapa | Troca de chapa (minutos) | Cada vez que a máquina passa de uma chapa para a seguinte. |
| Catar peças | Catar peças (segundos por peça) | Por peça física retirada da máquina. |
Enquanto alguém cata as peças de uma chapa, também precisa trocar para a próxima. Então, em cada chapa, o sistema cobra o maior dos dois (o que tomar mais tempo), em vez de somá-los. A última chapa não tem troca depois dela, mas suas peças ainda precisam ser catadas.
30 peças, 24 por chapa, 2 chapas; catar = 3 s por peça; troca = 2 min; setup = 5 min.
| Item | Conta | Tempo |
|---|---|---|
| Corte | 30 × 48,28 s | 1.448,4 s |
| Chapa 1 | catar 24 × 3 s = 72 s; troca 120 s → vale o maior | 120 s |
| Chapa 2 | catar 6 × 3 s = 18 s; sem troca depois | 18 s |
| Setup | 5 min × 60 | 300 s |
| Tempo total | 1.448,4 + 138 + 300 | 1.886,4 s = 31,44 min = 0,524 h |
O mesmo tempo gera o prazo informado ao cliente:
Dias de fila e jornada vêm de Configurações. Os dias de compra de chapa só entram quando falta chapa em estoque e o cliente não trouxe o material. No exemplo, com fila de 3 dias e jornada de 8 h: 3 + ⌈31,44 ÷ 480⌉ = 4 dias, mais o prazo de compra se não houver chapas em estoque.
Aqui o tempo vira dinheiro. Primeiro o sistema escolhe a máquina; depois aplica o preço da hora dela, que não é fixo: começa mais alto e baixa conforme o trabalho fica mais longo.
Se nenhuma máquina comportar a peça, o cliente recebe um erro claro ("nenhuma máquina vinculada ao material comporta o tamanho desta peça"). Máquinas sem coeficiente de preço cadastrado nunca são escolhidas, para não "vencer" por parecer grátis.
O cliente não escolhe máquina. Uma peça pequena vai para a máquina mais barata; uma peça grande vai automaticamente para a que tem mesa maior. Um pedido com vários arquivos pode usar mais de uma máquina; o resumão mostra cada uma.
A regra combinada com a Makers: cobrar mais caro pelos primeiros minutos (que cobrem o custo de preparar a máquina) e ir barateando a hora à medida que o tempo passa, de forma suave, sem degraus. Matematicamente é uma curva de decaimento exponencial:
| Letra | Nome no painel | O que faz |
|---|---|---|
| B | Preço da hora (base) | O valor para o qual a hora converge em trabalhos longos. É o "preço de regime". |
| A | Fator de escala | O acréscimo cobrado no instante zero. No primeiro minuto a hora custa B + A. |
| F | Tempo até estabilizar (h) | Quanto maior o tempo, mais lenta a queda. Internamente F = −4,605 ÷ tempo. Em "tempo até estabilizar", o acréscimo A já caiu a 1% do valor inicial. |
| Tempo cobrado | 0,1 h (6 min) | 0,5 h | 1 h | 2 h | 4 h | 8 h |
|---|---|---|---|---|---|---|
| Preço da hora (Vh) | R$ 195,12 | R$ 177,88 | R$ 160,65 | R$ 136,79 | R$ 113,53 | R$ 101,83 |
O retângulo verde é o custo (preço da hora × tempo). Deslize o tempo cobrado e veja a hora cair, mas o retângulo crescer.
Tempo total 0,524 h; B = 100; A = 100; F = −0,5:
De cada grupo de preço, para todas as máquinas dele. Uma máquina pode ter valor próprio, que vence o do grupo. A regra é aplicada campo a campo: valor da máquina; se vazio, do grupo; se vazio, zero.
Alguns materiais (por exemplo, metais grossos) exigem uma hora mais cara que outros na mesma máquina. Em Parâmetros há os campos de multiplicador de hora, que escalam a hora de acordo com a duração do trabalho:
Sem esses campos preenchidos, M = 1 e não há efeito. Aplica-se somente ao corte, nunca à gravação.
O valor usado é a média do multiplicador ao longo de todo o trabalho, ou seja, uma integral dividida pelo tempo. Veja como ela se comporta:
Gravação preenchida (um logotipo, uma foto, uma área rasterizada) é cobrada pela área gravada, não pelo tempo, porque o tempo depende de detalhes que o cliente não controla.
Num pedido com corte e gravação preenchida por área, os tempos de setup, troca de chapa e catar peças ficam inteiros no corte. A gravação é paga só pela área; o overhead não é dividido entre as duas, para nada deixar de ser cobrado.
Se a máquina de gravação não tiver "Taxa de gravação por área" preenchida, a gravação preenchida sai com R$ 0. O simulador e o resumão exibem aviso nesse caso ("gravação preenchida NÃO está sendo cobrada"). Confira esse campo ao cadastrar uma máquina de gravação.
Uma logo de 60 cm² numa máquina com taxa de R$ 0,80/cm², setup de R$ 15 e multiplicador 1,0: 60 × 0,80 + 15 = R$ 63,00, somados ao corte da peça.
O material é cobrado em duas partes: a parte usada da chapa e uma parcela da sobra, controlada pelo fator K. A margem da Makers (markup) incide apenas sobre a parte usada.
p = (quantidade × área da peça) ÷ área total das chapas, no máximo 100%.custo das chapas × p: o material que de fato virou peça.custo das chapas × (1 − p): o que sobra na chapa.sobra × K. É o risco de a sobra não ser reaproveitada.usada × (1 + markup). A sobra entra sem margem.Quando o cliente traz o material (ou a variante tem "Fornecemos = não"), a Makers não cobra a chapa: material, markup e K zeram. Continuam sendo cobrados o corte e a taxa de manuseio. Num pedido com vários arquivos, a fração de material própria é proporcional à área de cada arquivo.
2 chapas de R$ 480,00; 30 peças de 300 × 200 mm (60.000 mm² cada); K = 20%; markup = 30%.
| Passo | Conta | Valor |
|---|---|---|
| Custo das chapas | 2 × 480,00 | R$ 960,00 |
| Aproveitamento p | 30 × 60.000 ÷ (2 × 2.000.000) | 45% |
| Parte usada | 960,00 × 0,45 | R$ 432,00 |
| Sobra | 960,00 × 0,55 | R$ 528,00 |
| Parcela K da sobra | 528,00 × 0,20 | R$ 105,60 |
| Usada com markup | 432,00 × 1,30 | R$ 561,60 |
| Material | 561,60 + 105,60 | R$ 667,20 |
A barra representa o custo das chapas. Veja como o aproveitamento e o fator K decidem quanto dela chega ao cliente:
Retalhos entram na conta como chapas menores, com preço proporcional ao tamanho (ver Condições gerais). Por isso o orçamento tende a ficar mais barato quando existe um retalho adequado.
A taxa de manuseio cobre o trabalho de separar, movimentar e armazenar a chapa. É um percentual do material usado, somado ao corte.
Parte usada R$ 432,00 × 10% = R$ 43,20. Corte efetivo: 92,72 + 43,20 = R$ 135,92.
A base do manuseio já foi alterada por pedido do cliente: só material usado (até 02/09/2026), com o fator K (06/09/2026) e, de novo, só material usado, sem K (10/09/2026, valendo hoje). O valor também já foi somado ao material e depois ao corte (03/09 e 06/09/2026). Isso só muda o "balde" onde aparece, não o total. Antes de "corrigir" para uma versão antiga, confirme com o cliente.
Clientes de grupos de desconto pagam menos no corte, no material e/ou no frete. Cada desconto incide só sobre a sua parte.
| Desconto | Incide sobre | Não incide sobre |
|---|---|---|
| Corte (%) | O custo de máquina (corte e gravação). | Taxa de manuseio, material, imposto. |
| Material (%) | O custo de material (já com markup e K). | Corte e manuseio. |
| Frete (%) | O valor do frete, no pagamento. | Qualquer outro item. |
O desconto fica gravado no pedido (percentuais de corte, material e frete), então alterar o grupo depois não muda pedidos antigos.
Com 10% de desconto no corte e 5% no material: corte 92,72 × 0,90 = 83,45 (+ manuseio 43,20 = 126,65); material 667,20 × 0,95 = 633,84. Base: 760,49. Com imposto de 6%: R$ 806,12 (contra R$ 851,31 sem desconto).
Pedidos muito pequenos custam, em tempo e esforço, mais do que o cálculo "puro" sugere. O valor mínimo garante que a Makers nunca cobre menos que um piso.
| Piso | Onde se configura | O que compara |
|---|---|---|
| Valor mínimo da máquina | Máquinas › Valor mínimo (R$) | Corte + taxa de manuseio (sem material, sem imposto). |
| Preço mínimo do pedido | Configurações › Preço mínimo de pedido | O total final do pedido, com imposto. |
Quando um pedido tem vários grupos (vários materiais), o piso é aplicado uma única vez sobre o corte somado de todos eles, usando o maior valor mínimo entre as máquinas envolvidas. Isso evita cobrar "um mínimo por material" de quem enviou um pedido com 3 materiais.
É a última barreira: se, depois de tudo (imposto e taxa regional incluídos), o total ficar abaixo do "Preço mínimo de pedido", o total vira esse valor.
| Item | Valor | Observação |
|---|---|---|
| Tempo total | 351,28 s (0,098 h) | 48,28 s de corte + 3 s de catar + 300 s de setup. |
| Preço da hora | R$ 195,24 | Trabalho curto: hora mais cara. |
| Custo de máquina | R$ 19,05 | |
| Manuseio | R$ 1,44 | 10% da parte usada (R$ 14,40). |
| Piso da máquina | R$ 100,00 | 19,05 + 1,44 = 20,49, abaixo do piso → corte sobe para 98,56, e corte + manuseio = 100,00. |
| Material | R$ 111,84 | Usada 14,40 × 1,3 = 18,72, mais sobra 93,12 (K de 20% sobre a chapa quase inteira). |
| Total com imposto de 6% | R$ 224,55 | (100,00 + 111,84) × 1,06 |
Repare que, mesmo com o mínimo aplicado, quase metade do preço é material: com uma única peça, a chapa quase inteira "sobra" e o fator K pesa.
Somadas as partes, entram os tributos e, no pagamento, o frete. Este é o caminho final até o valor que o cliente vê.
O resumo do pedido (no painel e no site) mostra o preço como uma escada, de cima para baixo:
| Linha | O que é |
|---|---|
| Corte / gravação | Custo de máquina, já com desconto de corte (e mostra o desconto separado, quando existe). |
| Taxa de manuseio | Percentual do material usado. |
| Valor mínimo do pedido | Só aparece se o piso foi acionado: quanto faltou para completar o mínimo. |
| Material | Material com markup e K, já com desconto de material. |
| BASE | Corte + manuseio + mínimo + material. |
| Imposto | Base × imposto geral (%). |
| Taxa regional | Base × taxa do estado do cliente (%). É somada ao total, não subtraída do corte. |
| TOTAL FINAL | Base + imposto + taxa regional (e, se necessário, completado até o preço mínimo global). |
Base = 135,92 + 667,20 = R$ 803,12. Imposto de 6% = R$ 48,19. Total = R$ 851,31.
| Item | Como entra |
|---|---|
| Frete | Valor da transportadora (Frenet) × ( 1 − desconto de frete ). Retirada na fábrica = sem frete. |
| Valor extra | Lançado pela Makers no simulador (ex.: "desenho simples"). Pode aparecer como linha separada ao cliente, ou diluído no total. |
No checkout, o servidor recalcula o pedido inteiro a partir do banco e cobra no PagBank esse valor, ignorando qualquer número enviado pelo navegador. Se o site mostrasse um valor diferente, vale o do servidor.
Todas as contas intermediárias usam precisão total; o arredondamento a centavos acontece só no total final, e as divisões por máquina, material e arquivo do resumão são ajustadas para sempre somar exatamente o total.
Quando um pedido tem mais de um grupo (mais de um material) cortado na mesma máquina, o preço da hora é calculado pelo tempo total dessa máquina no pedido, e não por grupo.
Como vimos, o preço da hora cai conforme o trabalho fica mais longo. Se alguém pede acrílico e MDF no mesmo pedido, e ambos passam pela mesma máquina de CO₂, faz sentido tratar como um trabalho só: a hora é tão barata quanto seria para o tempo somado. Cada grupo continua pagando apenas o seu próprio tempo; o que muda é a tarifa.
Dois grupos de 1 hora cada, na mesma máquina (B = 100, A = 100, F = −0,5):
| Cenário | Vh | Grupo 1 | Grupo 2 | Total de máquina |
|---|---|---|---|---|
| Sem volume (pedidos separados) | 160,65 | 160,65 | 160,65 | R$ 321,30 |
| Com volume (tempo somado = 2 h) | 136,79 | 136,79 | 136,79 | R$ 273,58 |
| Economia | R$ 47,72 |
Um pedido real de ponta a ponta, usando as regras das páginas anteriores. Todos os valores abaixo foram calculados pelo mesmo código que roda no servidor.
| Item | Valor |
|---|---|
| Peça | Acrílico 4 mm, 300 × 200 mm com um furo quadrado de 40 mm (perímetro 1.160 mm). |
| Quantidade | 30 peças. |
| Material | Velocidade de corte 1.500 mm/min · piercing 0,5 s · inlet 2 mm · nesting gap 3 mm · setup 5 min · catar 3 s/peça · troca de chapa 2 min · K 20%. |
| Chapa | 2.000 × 1.000 mm, R$ 480,00, sem estoque. |
| Máquina | Deslocamento 20.000 mm/min · aceleração 1.500 mm/s² · B = R$ 100/h · A = R$ 100/h · F = −0,5 · valor mínimo R$ 100,00. |
| Configurações | Markup 30% · manuseio 10% · imposto 6% · sem taxa regional e sem desconto. |
| # | Etapa | Conta | Resultado |
|---|---|---|---|
| 1 | Tempo por peça | 46,44 corte + 0,16 inlet + 0,68 desloc. + 1,00 piercing | 48,28 s |
| 2 | Chapas | 24 peças por chapa → ⌈30 ÷ 24⌉ | 2 chapas |
| 3 | Tempo total | 1.448,4 corte + 138 trocas/catar + 300 setup | 1.886,4 s = 0,524 h |
| 4 | Preço da hora | 100 + 100 × e(−0,5 × 0,524) | R$ 176,95/h |
| 5 | Custo de máquina | 176,95 × 0,524 | R$ 92,72 |
| 6 | Material | 432,00 × 1,3 + 105,60 | R$ 667,20 |
| 7 | Manuseio | 432,00 × 10% | R$ 43,20 |
| 8 | Corte efetivo | 92,72 + 43,20 | R$ 135,92 |
| 9 | Mínimo da máquina | 135,92 ≥ 100 → não é acionado | — |
| 10 | Base | 135,92 + 667,20 | R$ 803,12 |
| 11 | Imposto 6% | 803,12 × 0,06 | R$ 48,19 |
| Total | 803,12 + 48,19 | R$ 851,31 |
Prazo: 3 dias de fila + ⌈31,44 ÷ 480⌉ = 4 dias (mais o prazo de compra de chapa, se não houver estoque).
| Situação | O que muda | Total |
|---|---|---|
| Pedido base (30 peças) | — | R$ 851,31 |
| Cliente traz o material | Material = 0 (e markup, K). Continuam: corte R$ 92,72 + manuseio R$ 43,20; × 1,06. | R$ 144,08 |
| Cliente do grupo "10% corte / 5% material" | Corte 83,45 + manuseio 43,20; material 633,84; × 1,06. | R$ 806,12 |
| Apenas 1 peça | Piso da máquina acionado; sobra da chapa quase inteira com K. | R$ 224,55 |
Abra a calculadora: ela já vem preenchida com os valores deste exemplo e reproduz R$ 851,31. Mude qualquer campo e veja o efeito no total.
Mude os números e acompanhe o preço se formar. A calculadora segue as mesmas fórmulas do servidor (corte, material, manuseio, mínimo da máquina e imposto), e vem preenchida com o exemplo completo.
Não inclui descontos de grupo, taxa regional, multiplicador de hora, gravação, frete nem preço mínimo global. Serve para entender a lógica; o valor oficial é sempre o do sistema.
Quando o preço ou o tempo do sistema não bate com a realidade da fábrica, este guia aponta qual parâmetro olhar primeiro.
| Sintoma | Onde olhar | Por quê |
|---|---|---|
| O corte real é mais lento que o do sistema | Velocidade de corte e piercing do material; aceleração da máquina. | A velocidade que o laser realmente consegue cortar com qualidade costuma ser menor que a nominal. |
| O corte real é mais rápido que o do sistema | Velocidade de corte; aceleração e velocidade de deslocamento da máquina. | Aceleração baixa demais (no cadastro) superestima peças com muitos cantos. |
| Peças pequenas e detalhadas saem caras demais | Aceleração, inlet, piercing. | São os componentes que mais crescem por contorno. |
| Pedidos longos saem caros demais | Tempo até estabilizar e preço da hora base (grupo da máquina). | A curva da hora define o preço de regime. |
| Pedidos curtos saem baratos demais | Fator de escala (A), setup time, valor mínimo da máquina. | São eles que cobram os primeiros minutos e a preparação. |
| Material sai caro em pedidos pequenos | Fator K (com e sem estoque) e tamanho das chapas cadastradas. | A sobra pesa mais quando o aproveitamento é baixo. |
| Um mesmo arquivo custa diferente em dois dias | Houve mudança em algum parâmetro (cadastro, K, markup, preço da chapa)? | O preço sempre reflete o cadastro do momento do orçamento. |
Antes de calibrar, vale saber onde está o dinheiro. O gráfico recalcula o pedido inteiro variando um parâmetro de cada vez.
No pedido de 30 peças, o material domina e os parâmetros de máquina quase não aparecem. Troque para "cliente traz o material" e a lista se inverte: aí a velocidade de corte, o preço da hora e o setup passam a decidir o preço. Em uma peça só, o preço da chapa, o valor mínimo da máquina e o fator K lideram, e a velocidade de corte nem aparece.
O servidor guarda scripts de calibração usados em arquivos reais de clientes (Makers-backend/scripts/calibracao-tempo.ts), que um desenvolvedor pode rodar para comparar o tempo do sistema com o tempo medido na fábrica.
As perguntas que mais aparecem quando um cliente ou alguém da equipe olha um orçamento.
Abra o Simulador com o arquivo e olhe o resumão. Quase sempre é um destes: (1) muitos furos pequenos (cada contorno paga piercing e inlet); (2) material de velocidade de corte baixa (inox grosso, por exemplo); (3) o valor mínimo foi acionado; (4) aproveitamento ruim da chapa (fator K pesando); (5) material com veio, que impede girar as peças.
O tempo de corte cai e, com ele, o custo de máquina. O efeito é menor do que proporcional, porque o tempo de piercing, de deslocamento e de setup não dependem da velocidade de corte. Material não muda.
Porque corte + manuseio deram menos que o valor mínimo da máquina. Está no resumão como "valor para completar o mínimo". Veja Valor mínimo.
Três motivos: o setup é cobrado uma vez por pedido (pesa mais em poucas peças); o preço da hora é maior em trabalhos curtos; e, com uma peça só, quase toda a chapa é sobra e o fator K a cobra. Pedir mais peças dilui tudo isso.
Material, markup e fator K zeram. Continuam: corte e taxa de manuseio. No exemplo, o pedido cai de R$ 851,31 para R$ 144,08.
Porque ele depende da duração do trabalho (curva de decaimento) e, em pedidos com vários materiais na mesma máquina, do tempo somado dessa máquina. Veja Escolha da máquina e preço da hora e Desconto por volume.
O prazo soma dias de fila, dias de máquina e, se faltar chapa em estoque, o prazo de compra do material. Em pedidos de material próprio, o prazo de compra é descontado.
Os dois usam o mesmo motor. A diferença quase sempre vem de: parâmetro alterado entre uma simulação e outra; grupo de desconto ou taxa regional diferentes; ou ações das cores diferentes. O simulador avisa quando o cadastro do material mudou desde a simulação.
A peça é maior que a mesa de todas as máquinas ligadas ao material (ou só cabe se girada, e o material tem veio). Confira as áreas das máquinas e o campo "Pode rotacionar" do material.
Provavelmente a máquina de gravação está sem "Taxa de gravação por área", ou a logo tem contornos abertos (área zero). O sistema avisa nos dois casos. Veja Gravação preenchida.
Os três documentos de projeto que acompanham o sistema.
Estes arquivos fazem parte do histórico do projeto e registram regras combinadas com o cliente:
| Documento | O que registra |
|---|---|
| Regra de precificação dinâmica (curva exponencial) | A definição da curva do preço da hora (Preço base, Acréscimo, Fator exponencial) com o caso de teste R$ 609,41/h e R$ 1.523,52 para 150 minutos. Descrita na página Escolha da máquina e preço da hora. |
| Cálculo de preço de corte e de material | Notas e planilha com a lógica original de preço, usadas como referência para validar o motor. |
| Materiais, tamanhos, valores e características | Planilha com o catálogo inicial de materiais. |
| Velocidades das máquinas | Planilha de referência das velocidades de corte por material e máquina. |
Logins dos serviços. O conteúdo está cifrado: só aparece com a senha do manual.