O problema
Muita oficina mecânica, assistência técnica e empresa de refrigeração ainda controla o serviço no bloco de papel ou numa planilha. O orçamento sai à mão, a peça usada não baixa do estoque e ninguém sabe ao certo quanto tem a receber no fim do mês.
Sistemas de ordem de serviço existem aos montes, mas quase todos pedem uma infraestrutura que esse cliente não tem: servidor próprio, terminal, Composer para instalar dependências e tarefas agendadas no cron. Na hospedagem compartilhada, que é o que cabe no orçamento de uma oficina pequena, nada disso está disponível ou funciona direito.
O Megauto nasceu dessa restrição. A regra do projeto foi: tem de funcionar numa hospedagem compartilhada comum, instalado só com FTP e phpMyAdmin, sem nenhum passo de linha de comando.
Arquitetura
Escrevi o sistema do zero em PHP puro com PDO, sem framework. O index.php é o único ponto de entrada; dentro de app/ ficam o núcleo, os serviços com as regras de negócio, os controllers e as views. As rotas ficam num arquivo só, e cada rota declara a permissão de que precisa, o que deixa a segurança fácil de auditar.
O acesso ao banco passa por uma classe única com prepared statements em todas as consultas. As tabelas e o código são em inglês; as telas, em português.
Cada cliente tem a própria instalação e o próprio banco. Não há mistura de dados entre empresas, e uma instalação com problema não derruba as outras.
Instalação e atualização sem terminal
Como o cliente final não tem terminal, a instalação também não podia depender de um. Um instalar.php na raiz confere os requisitos do servidor, recebe os dados do banco e da empresa, importa a estrutura, grava o arquivo de configuração e depois se apaga. Ele se recusa a rodar sobre um banco que já tem usuários.
As mudanças de banco de cada versão vão em scripts SQL numerados que podem ser importados mais de uma vez sem quebrar nada. Para criar colunas e índices só quando ainda não existem, os scripts consultam o information_schema e montam o comando com PREPARE. Assim funcionam tanto no MySQL quanto no MariaDB, já que o ADD COLUMN IF NOT EXISTS só existe no MariaDB.
Cada atualização é conferida importando o script duas vezes sobre o banco da versão anterior e comparando a estrutura resultante com a de uma instalação nova. Uma página de diagnóstico mostra o que falta no servidor e quais atualizações ainda não foram importadas.
Tarefas agendadas sem cron
Fila de e-mail, limpeza diária e backup automático normalmente ficariam no cron, que na hospedagem compartilhada é pago ou instável. No Megauto, essas tarefas rodam depois que a página já foi entregue ao usuário, com fastcgi_finish_request, sem atrasar a navegação.
Uma trava no banco (GET_LOCK) impede que duas requisições executem a mesma tarefa ao mesmo tempo. O e-mail que falha volta para a fila e é tentado até cinco vezes, com intervalo crescente.
Sem Composer
Sem Composer, cada dependência comum de um projeto PHP precisou de uma solução própria, pequena e testada:
- E-mail: cliente SMTP próprio, no lugar do PHPMailer.
- Verificação em duas etapas: implementação própria do TOTP, compatível com os aplicativos autenticadores.
- PIX copia e cola: gerado por código próprio, com o CRC16 conferido contra o padrão do Banco Central.
- Código de barras: Code 128 gerado em SVG, conferido com leitor, para as etiquetas de produto.
- Cobranças: boleto, PIX e link de pagamento pelo Asaas e pelo Mercado Pago, com chamadas REST em cURL, sem os SDKs.
- PDFs e relatórios: impressão do navegador com CSS de impressão, e planilhas em CSV que abrem direto no Excel, com proteção contra injeção de fórmula.
Problemas reais de hospedagem compartilhada
Dois problemas só apareceram em produção, e ambos vinham do ambiente, não do código.
O primeiro: a sessão de login em arquivo sumia, e o usuário era desconectado justamente ao salvar um formulário. Passei as sessões para o banco de dados. Além disso, se a sessão expira com um formulário aberto, o que foi digitado volta preenchido depois do novo login.
O segundo: a hospedagem entrega o HTTPS por um proxy, então o PHP enxerga a requisição como HTTP. Todo redirecionamento com endereço relativo virava http://. A correção foi montar todos os redirecionamentos com o endereço completo, a partir da URL configurada na instalação.
Regras de negócio
O núcleo do sistema é a ordem de serviço, com nove situações, do orçamento ao faturado. Em volta dela, cada módulo tem regras que evitam inconsistência:
- Estoque: toda movimentação passa por um único serviço, que trava a linha do produto e grava o saldo depois de cada movimento. A peça sai do estoque ao entrar na OS e volta se o item for removido ou a OS cancelada.
- Financeiro: faturar a OS ou a venda cria o lançamento a receber. Há parcelamento de 2 a 48 vezes, com os centavos da divisão na última parcela e o vencimento do dia 31 ajustado para os meses curtos.
- Cobranças: o aviso do gateway serve só como gatilho. A situação do pagamento é sempre consultada de novo no gateway antes de dar baixa, o que impede uma notificação falsa de marcar algo como pago.
- Permissões: grupos configuráveis, com matriz de ver, adicionar, editar e excluir por módulo. Ninguém concede uma permissão que não tem, e o administrador não pode tirar o próprio acesso.
- Área do cliente: o cliente da oficina acompanha as próprias OS, vê o andamento e paga as cobranças, numa sessão totalmente separada da equipe.
Produto
O Megauto é vendido por assinatura. O interessado testa por 7 dias, sem cartão de crédito, e quem assina recebe a própria instalação. Os planos são grupos de permissão mais um limite de usuários definido na configuração de cada cliente, então existe uma única versão do código para todos.
A identidade visual também é própria: azul-petróleo, tipografia Barlow e a etiqueta de OS como elemento da marca, registradas num design system. As telas funcionam no computador e no celular, com as listas virando cartões nas telas pequenas.
Resultado
O resultado é um sistema completo de gestão, com ordens de serviço, vendas, estoque, financeiro, cobranças, relatórios, backup e área do cliente, que roda numa hospedagem barata e se instala sem terminal.
Mais do que o código, o projeto me obrigou a pensar como quem coloca um produto no ar e cobra por ele: instalação que o próprio cliente consegue fazer, atualização que não pode quebrar o banco de ninguém e correções entregues sem parar quem está usando.

