Pular para o conteúdo
KW
Voltar aos projetos

amostra 06/protótipo

OrçaFácil

Um orçamento de serralheria montado em minutos, com a plataforma sugerindo e o serralheiro decidindo.

  • Next
  • Prisma
  • Zod
  • Motion

01

Contexto

O OrçaFácil é um protótipo autoral inspirado no fluxo de uma serralheria familiar, com um objetivo simples: montar um orçamento completo em minutos.

O cenário foi modelado a partir de um catálogo de materiais e de um fluxo realista para adicionar cada item ao orçamento.

02

Ponto de partida

O protótipo parte de um catálogo com 15 categorias e de um fluxo de sete passos, definidos antes da primeira linha de código.

15

categorias de ferros e serviços no catálogo

7

passos no fluxo original para adicionar um material

4

passos no fluxo final, condensado

03

Linha do tempo

Marcos registrados durante o desenvolvimento.

  1. 16 de set. de 2026

    Catálogo e fluxo definidos

    Catálogo com 15 categorias e o fluxo de sete passos para adicionar um material.

  2. 16 de set. de 2026

    Modelo de dados

    Esquema pronto para várias empresas desde o início, com cada linha do orçamento guardando um retrato dos valores.

  3. 17 de set. de 2026

    Protótipo navegável

    Painel de orçamentos, editor e o assistente de quatro passos com cálculo ao vivo, ainda com dados simulados.

04

Mapa de decisões

Reconstruído a partir do histórico de commits, do README e da documentação do projeto.

01

A plataforma sugere, o serralheiro decide

Todo valor calculado pode ser sobrescrito. O preço muda com o mercado, e quem está na oficina sabe o valor real.

02

O orçamento é um retrato

Cada linha copia os valores no momento em que é criada. Mudar o catálogo depois não altera um orçamento já enviado.

03

Sete passos viraram quatro

O fluxo original foi condensado em categoria, material, medidas e revisão, com o cálculo aparecendo enquanto se digita.

04

Pronto para várias empresas

Toda tabela já nasce com o identificador da serralheria. O protótipo simula uma operação e pode evoluir para várias sem refazer o banco.

05

Vencido é uma conta, não uma rotina

A validade é calculada a partir da data de emissão. Não existe rotina agendada só para marcar orçamentos vencidos.

06

Feito para a luz da oficina

Tema claro fixo e botão principal com contraste alto para facilitar a leitura em diferentes condições de oficina.

05

Arquitetura

As mesmas cinco camadas desta página, aplicadas ao projeto.

  1. 000 m/interface

    • Painel de orçamentos
    • Assistente de quatro passos com cálculo ao vivo
    • Modais e seleção acessíveis com Radix
  2. 060 m/serviço

    • Módulo único de cálculo: consumo, perda, barras e totais
  3. 090 m/repositório

    • Esquema Prisma com a empresa em toda tabela
    • Linha do orçamento como retrato dos valores
  4. 120 m/persistência

    • Postgres, conectado na próxima fase

06

Código

Um trecho do repositório privado, só para mostrar a camada funcionando.

Da medida à barra comprada

A regra de negócio mora num lugar só, e a interface apenas consome. Barra se compra fechada, por isso o arredondamento é sempre para cima.

src/lib/calc.tsts
// Regra de ouro: a plataforma SUGERE, o serralheiro DECIDE. Estas funções
// calculam os valores propostos; os componentes deixam o usuário sobrescrever
// qualquer campo depois.

/** Consumo real de material somando a perda. Ex.: 14 m + 10% = 15,40 m. */
export function consumoComPerda(quantidadeConsumo: number, perdaPercent: number): number {
  const q = Math.max(0, quantidadeConsumo);
  const p = Math.max(0, perdaPercent);
  return q * (1 + p / 100);
}

/**
 * Quantas barras inteiras comprar pra cobrir o consumo com perda.
 * Compra-se barra fechada: por isso arredonda pra cima. Ex.: 15,40 m ÷ 6 m = 3.
 */
export function barrasNecessarias(consumoComPerdaM: number, comprimentoBarraM: number): number {
  if (!comprimentoBarraM || comprimentoBarraM <= 0) return 0;
  return Math.ceil(consumoComPerdaM / comprimentoBarraM);
}

/** Faz o caminho completo: consumo → perda → barras → subtotal (sugerido). */
export function calcularMaterial(e: EntradaCalculoMaterial): ResultadoCalculoMaterial {
  const comPerda = consumoComPerda(e.quantidadeConsumo, e.perdaPercent);
  const barras = barrasNecessarias(comPerda, e.comprimentoBarraM);
  return {
    consumoComPerda: comPerda,
    quantidadeCompra: barras,
    subtotal: barras * Math.max(0, e.precoUnitario),
  };
}

07

Resultado

4

passos para adicionar um item

6

modelos no esquema de dados

100%

dos valores editáveis pelo serralheiro

Estado atual

Protótipo navegável com dados simulados. A próxima fase conecta o banco e troca a simulação por dados reais.