Progressive Web App mobile-first para a ManuSilva — gestão de intervenções técnicas (empilhadores, manutenção, baterias), relatórios em PDF, orçamentos, faturação interna e painel RH.
Backend: Supabase (Postgres + Auth + Storage). E-mail ao cliente via API serverless (pwa/api/enviar-email.js, tipicamente na Vercel).
Manusilva/
├── pwa/
│ ├── index.html Login (técnico / RH)
│ ├── dashboard.html Painel do técnico (tablet)
│ ├── admin.html Painel RH (desktop)
│ ├── js/ Módulos ES (relatórios, serviços, PDF, faturação…)
│ ├── api/ Endpoints serverless (e-mail, clientes, técnicos)
│ ├── supabase/migrations/ SQL versionado (incl. 020 serviços)
│ ├── tests/ Testes Node (`*.test.mjs`)
│ ├── css/ Estilos
│ ├── sw.js Service worker
│ └── vercel.json Deploy da PWA + API
├── scripts/ Utilitários (catálogo, templates)
└── package.json `npm test`, lint, format
A migração pwa/supabase/migrations/020_servicos_multi_relatorio.sql introduz visitas ao cliente com vários relatórios:
| Entidade | Papel |
|---|---|
| servico | Visita (cliente, data, técnicos, assinaturas partilhadas, faturação, e-mail) |
| relatorio | Um por tipo de intervenção na mesma visita (aprovação/rejeição individual) |
| trabalho | Modelo legado (1 relatório); mantido para dados antigos |
- RH cria um serviço no calendário (sem tipo fixo).
- Técnico abre a visita, adiciona N relatórios por tipo, conclui visita com assinaturas únicas.
- RH revê cada relatório na pasta da visita (rejeição individual possível).
- Quando todos aprovados → um e-mail ao cliente com todos os PDFs.
- Faturação regista uma fatura por visita (relatórios legados sem serviço mantêm o fluxo anterior).
Módulos principais: servicos-db.js, servicos-workflow.js, servicos-submit-workflow.js, servicos-rh-review.js, servicos-email-workflow.js, servicos-billing-workflow.js.
cd pwa
python -m http.server 3456Abrir: http://localhost:3456/index.html
Para Supabase em produção, configure as variáveis no runtime da PWA (ver pwa/js/supabase-client.js e scripts npm run sync:api-config). Sem migração 020, a app continua a funcionar em modo legado (só trabalhos).
Na raiz do repositório:
npm testInclui testes de serviços, e-mail agrupado, faturação por visita, PDFs, orçamentos, etc.
- Contas da equipa: ver
pwa/supabase-auth-equipa.md - Joana e Filipa: role
RH(acesso total — clientes, revisão, faturação, calendário) - Após criar utilizadores no Supabase Auth, aplicar migrações RLS (
pwa/supabase-rls-authenticated.sql,006_rh_admin_roles.sql)
Executar no Supabase → SQL Editor, por ordem numérica em pwa/supabase/migrations/.
A 020 é obrigatória para o modelo serviço/visita. Copia faturação legada para servicos e liga relatorios.servico_id.
| Comando | Descrição |
|---|---|
npm test |
Testes unitários |
npm run lint |
ESLint em pwa/js e pwa/api |
npm run sync:rh-config |
Sincroniza config RH (shared/rh-admin-config.json) |
npm run import:catalogo |
Importa catálogo de produtos |
A PWA e a API de e-mail deployam a partir de pwa/ (Vercel). Variáveis de ambiente: SUPABASE_URL, SUPABASE_ANON_KEY, EMAIL_USER, EMAIL_PASS, etc. (ver pwa/api/lib/supabase-env.js e pwa/api/enviar-email.js).