Precificação, pedidos, catálogo e estoque para impressão 3D.
Translation pending
CommerceGitHub @GuilhermemlimaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Calculadora de precificação para impressão 3D sob encomenda. Página única em HTML, sem dependências e sem build: baixe index.html e abra no navegador, ou publique a pasta em qualquer hospedagem estática (Vercel, Netlify, GitHub Pages) sem nenhuma configuração.
O app funciona sozinho, sem conta. Ligando a nuvem, os dados passam a existir também num Postgres no Supabase, e celular e computador enxergam os mesmos pedidos.
Desenho local-first: o navegador continua sendo o armazenamento de trabalho — o app abre e funciona sem internet, e a sincronização acontece por trás. Nada depende de estar online.
supabase-schema.sql. Ele cria a tabela, as regras de acesso por usuário e as views de consulta.A chave anon é feita para ficar no navegador; quem protege os dados é o Row Level Security, que amarra cada linha ao auth.uid() do dono. Ela fica salva só no seu aparelho — não vai para o repositório.
fetch, mantendo o arquivo único e o funcionamento offline.As views meus_pedidos, meu_estoque e receita_mensal expõem tudo em colunas SQL comuns, para consultar direto no Supabase.
Servido por HTTPS, instala na tela inicial e abre em tela cheia, sem barra de navegador:
O service worker (sw.js) usa rede primeiro para o HTML, com o cache como reserva — assim uma versão publicada chega na próxima abertura com internet, e o app continua abrindo offline com a última que funcionou. Ícones e manifesto vêm do cache. Como os dados vivem em localStorage e IndexedDB, tudo funciona sem sinal depois da primeira abertura.
Abrindo o arquivo direto (file://) o navegador não permite service worker: nesse caso é uma página comum, sem instalação.
Feita para quem imprime peças coloridas em impressora com sistema multicor (AMS/ACE), onde a purga de troca de cor costuma pesar tanto quanto a própria peça.
Custo real por peça, item por item:
| Linha | Como sai |
|---|---|
| Filamento na peça | gramas do fatiador × preço do kg |
| Purga / desperdício | gramas da torre de purga × preço do kg |
| Energia | watts médios × horas × tarifa de kWh |
| Máquina | (preço da impressora ÷ vida útil) × horas + reserva de peças por hora |
| Trabalho | minutos de preparo e acabamento × valor da hora |
| Materiais e entrega | tinta, itens extras, embalagem e frete embutido rateado |
| Custos fixos e falhas | rateio dos custos mensais + reserva de impressão perdida |
E o preço de venda por:
preço = custo × (1 + margem) ÷ (1 − taxas)
A divisão é o ponto: comissão de marketplace, taxa de pagamento e imposto incidem sobre o preço, não sobre o custo. Somar 15% em cima do custo faz você receber menos do que planejou.
Outras regras do modelo:
A segunda aba é o controle do negócio. Cada cálculo pode virar um pedido, que congela os números do momento (receita, custo por categoria, horas de máquina, depreciação) — mexer no preço do filamento depois não reescreve o histórico.
Status: em negociação → aguardando pagamento → pago, mais cancelado. Só o que está pago entra na receita; o resto aparece como pipeline.
Indicadores do mês:
| Métrica | Como sai |
|---|---|
| Receita recebida | soma dos pedidos pagos |
| Lucro bruto | receita − custo de produção − seu trabalho |
| Lucro líquido | lucro bruto − taxas − custos fixos e reserva de falhas |
| Margem líquida | lucro líquido ÷ receita |
| Retorno sobre o custo (ROI) | lucro líquido ÷ tudo que foi gasto |
| Payback da máquina | lucro líquido acumulado ÷ investimento |
Mais: gráfico de receita dos últimos 6 meses, composição da receita do mês, pipeline em aberto, e a divisão do lucro entre reserva para refazer peça, reinvestimento e o que sobra para você — tudo em percentuais que você define.
Central de alertas derivada dos pedidos e do estoque — nada fica gravado como "aviso", tudo é recalculado. O contador aparece na barra de abas, visível de qualquer tela.
O cálculo que importa é a data limite para comprar filamento, feito de trás para frente:
comprar até = entrega − envio − produção − chegada do filamento
Produção sai do tempo de impressão do pedido, a uma jornada de 8 h por dia. Exemplo real: entrega em 15 dias, 16 h de impressão, fornecedor em 7 dias e envio em 5 → o filamento precisa ser pedido em até 1 dia.
Alertas gerados:
| Tipo | Quando |
|---|---|
| Pedido atrasado | prazo venceu e não foi entregue |
| Entrega próxima | dentro da antecedência configurada (crítico com 2 dias ou menos) |
| Comprar filamento | data limite a 3 dias ou já vencida |
| Filamento acabado / acabando | rolo zerado ou abaixo do mínimo |
| Estoque não cobre os pedidos | soma das gramas em aberto maior que o estoque |
| Proposta parada | em negociação há 7 dias ou mais |
| Pagamento pendente | aguardando há 5 dias ou mais |
Cada aviso pode ser silenciado por 5 dias; depois volta se ainda fizer sentido. O status entregue encerra os avisos do pedido — e conta como receita no painel, junto com pago.
Cadastro de rolos: cor, nome, tipo, marca, gramas restantes e preço do quilo. Resumo com total em kg, valor parado em estoque, quantos rolos estão abaixo do mínimo e quantas cores diferentes você tem para multicor.
Sobe uma foto do personagem e a página diz quantos filamentos a peça exige, quais cores, quanto de cada uma e se você tem em estoque.
Como funciona, sem enfeite: é quantização de cor por k-means no espaço OKLab, rodando no navegador — nenhuma imagem sai do computador. Não é reconhecimento de objeto: o programa lê as cores que dominam a imagem, não entende que "aquilo é o cabelo do personagem".
Quando o automático erra, dá para corrigir: clicar na foto fixa aquela cor como filamento (conta-gotas) e o × descarta uma cor que era sombra. Os percentuais são recalculados reatribuindo todos os pixels à paleta corrigida.
Um botão desconta do estoque as gramas estimadas de cada cor.
Ao escolher a foto de um produto ou a capa de uma categoria, abre um ajuste antes de salvar. Arraste para posicionar, use o controle para aproximar — o quadro na tela é o mesmo quadro da vitrine, então o que estiver dentro é o que vai aparecer.
Dois atalhos:
A saída é sempre quadrada, em 1600 px. Isso resolve o desalinhamento da vitrine: foto em pé e foto deitada acabam ocupando o mesmo espaço, e nenhuma delas perde a cabeça no corte.
Não dá para arrastar a peça para fora do quadro: quando a foto chega na borda, ela trava.
Botão Cupons da loja, na aba Catálogo. Dali você cria, liga, desliga e exclui cupons sem tocar em SQL.
Três tipos:
Cada um aceita compra mínima, validade e limite de usos. A coluna Usos mostra quantas vezes já foi aplicado.
Desligar para de aceitar o cupom mas mantém o histórico. Excluir apaga de vez, e quem tentar usar recebe "cupom não encontrado" — prefira desligar quando for uma pausa.
Quem confere se o cupom vale é o banco, no momento do pedido, com o subtotal que ele mesmo calcula. Editar a tela não gera desconto.
Cada produto do catálogo tem uma caixa Publicar na loja. Marcada, a peça passa a aparecer no site da Moldarte 3D — com nome, descrição, categoria, foto, tamanhos e preços. Ao marcar, aparecem dois campos ao lado: prazo de produção, em dias úteis, e estoque.
O endereço da peça no site (/produto/dragao-articulado) é gerado do nome na primeira publicação e não muda mais: renomear a peça depois não quebra um link que já foi divulgado.
Peça no modo sob consulta entra na loja sem botão de compra — no lugar dele vai um "Pedir orçamento". Cópias vinculadas não são publicadas: virariam o mesmo produto duas vezes, com endereços diferentes.
Desmarcar tira a peça do ar na sincronização seguinte.
O catálogo inteiro sobe como um documento só, então liberar a leitura dele exporia junto o que não foi publicado: rascunho, preço em estudo, produto fora do ar. Por isso publicar grava uma linha por produto numa coleção separada (loja), contendo apenas o que a vitrine mostra. A regra de segurança abre exatamente essa coleção para quem não tem login — pedidos, rolos de filamento, configurações e clientes continuam trancados.
As fotos dos produtos publicados sobem para o Storage, e não como base64 dentro do banco: numa vitrine elas precisam de cache de CDN. Cada uma só é reenviada quando muda de verdade.
Antes da primeira publicação, rode o arquivo
supabase-loja.sqlno SQL Editor do projeto. Ele cria a regra de leitura pública e o espaço das fotos. Sem ele o resto continua sincronizando normalmente — só as fotos da loja não sobem, e o aviso aparece no console do navegador.
Terceira aba. Categorias livres (Anime, Games, Marvel, DC, Carros…), cada uma com capa horizontal ou vertical e quantos produtos você quiser. Cada produto tem foto, descrição e uma lista de tamanhos com preço próprio — 15 cm, 20 cm, 25 cm, 30 cm — e três modos de exibição: a partir de (mostra o menor preço), preço único ou sob consulta.
O botão gera um PDF de várias páginas: capa com sua logo, uma página por categoria com os produtos em grade de duas colunas, e uma página final de condições.
Cada produto tem um botão que escreve a descrição sozinho. Não é IA e não enxerga o personagem: o que ele sabe vem do nome digitado, do nome da categoria e dos tamanhos cadastrados.
Além de nome e tamanhos, cada produto tem três campos que alimentam o texto: universo/jogo, estilo (25 opções) e características.
O texto monta até seis partes a partir de bancos de frases:
15 cm, 20 cm e 25 cm vira 15, 20 e 25 cm.As frases usam variáveis {{nome}}, {{jogo}}, {{estilo}}, {{caracteristicas}} e outras; frase cujo campo esteja vazio é descartada na escolha, então nunca sai texto com lacuna. A seleção vem de um hash do nome do produto — cada peça recebe um texto diferente, e apertar de novo gira para outra variação.
Produtos se movem entre categorias e sobem/descem dentro delas. Duplicar oferece dois modos:
Apagar um original que tem cópias vinculadas não deixa nada órfão: as cópias são materializadas como produtos independentes, com os dados preservados, antes da exclusão.
As imagens do catálogo ficam em IndexedDB, não no localStorage — dezenas de fotos passam muito dos ~5 MB que o localStorage oferece. Textos e preços continuam no localStorage. O backup JSON leva as duas coisas.
Não usa biblioteca de PDF: a página monta uma folha A4 real e chama a impressão do navegador, onde o destino "Salvar como PDF" gera o arquivo. O texto sai vetorial e selecionável, e o nome do arquivo já vem sugerido como Orcamento-0001-Nome-do-Cliente.pdf.
Logo e foto do produto são redimensionadas no navegador antes de guardar (logo em PNG até 700 px para manter transparência, foto em JPEG até 1100 px) e ficam embutidas como data URI no localStorage, junto do resto dos dados.
A folha mostra o preço cheio na linha do item e o desconto por quantidade abatido nos totais — o percentual anunciado bate exatamente com o valor abatido, porque só o preço de tabela é arredondado e todo o resto deriva dele.
Os dados ficam no localStorage do navegador. Nada é enviado para lugar nenhum.
A paleta das séries do gráfico foi validada para deuteranopia, protanopia e tritanopia (separação mínima ΔE ≥ 8 em OKLab entre fatias vizinhas), em tema claro e escuro. Nenhuma informação depende só da cor: toda fatia aparece também na tabela com valor e percentual.
Os valores que abrem na tela são estimativas. Troque pelos seus: