01
O problema
O telefonema "encontrámos mais uma coisa" corre mal: o cliente não vê, desconfia e diz que não. Com fotografia e preço por linha, decide sozinho e com calma.
02
O modelo
Cada ponto da checklist tem estado (OK, Atenção, Urgente), nota, fotografia e preço. Só os pontos que não estão OK passam para o orçamento.
| Tabela | Para que serve |
|---|---|
| inspections | Uma por viatura e visita: mecânico, hora de envio e hora de aprovação. |
| inspection_items | Ponto da checklist: estado, nota, fotografia, preço e se o cliente aceitou. |
| photos | Ficheiros em armazenamento na nuvem, com link único para o cliente. |
03
A aprovação
O cliente aceita ou recusa cada linha. O que é urgente vem aceite por omissão, mas pode recusar. O total aprovado é o que a oficina pode fazer sem voltar a ligar.
ts
// Só o que não está OK vai para o orçamento.
// O que é urgente nasce aceite: o cliente pode recusar,
// mas tem de o fazer de propósito.
function setLevel(id, level) {
set(id, { level, accepted: level === "urgente" });
}
const quote = ITEMS.filter(id => checks[id].level && checks[id].level !== "ok");04
O que faria diferente em produção
As fotografias iam para armazenamento na nuvem e o cliente recebia um link único por SMS. Nesta demo as fotos ficam só no seu telemóvel e desaparecem ao recarregar.
ts
// O total aprovado é o que a oficina pode fazer sem voltar a ligar.
const total = quote
.filter(id => checks[id].accepted)
.reduce((sum, id) => sum + checks[id].cents, 0);