# MAKOMBE — revisão local de desempenho, segurança e experiência Data: 17 de Setembro de 2026. Branch: `improvement/homepage-performance-ux`. ## Estado da entrega Esta etapa implementa e testa correcções prioritárias. Não representa a conclusão integral dos 25 grupos de requisitos nem uma autorização para produção. Não houve publicação, `git push`, alteração do `.env` ou execução de migrations na base de dados real. As 53 alterações locais anteriores foram preservadas no commit `837122a`. A comparação das melhorias deve começar nesse commit; o trabalho anterior não deve ser confundido com esta revisão. Cópia de segurança anterior às alterações: `C:/Users/HP/AppData/Local/Temp/makombe-before-improvements-20260916-075908`. Inclui os ficheiros então existentes e o estado inicial do Git. Novos ficheiros desta etapa ficam identificados pelo Git. Esta cópia temporária não substitui a política de backups da clínica. ## Problemas encontrados e correcções ### Desempenho e homepage - A homepage carregava dados sem um serviço público com limites e cache. Foi criado `PublicHomepageData`, com cache de 120 segundos, selecção de campos públicos, relações antecipadas e limite de 12 profissionais e quatro avaliações. Profissionais destacados são filtrados antes do limite. Alterações nos modelos principais invalidam a cache; algumas alterações de relações ou fotografias ficam sujeitas ao prazo de 120 segundos. - Foram centralizados os dados utilizados pela homepage e pela pré-visualização administrativa, evitando implementações divergentes. - A imagem principal PNG tinha aproximadamente 1,96 MB. A versão WebP tem 67.146 bytes, cerca de 96,6% menos. Outra imagem de campanha passou para 42.020 bytes. Os originais foram preservados. - CSS e JavaScript principais da homepage foram separados em entradas do Vite. Foram substituídos scripts de carrossel concorrentes por uma implementação única. Ainda existem regras CSS antigas que merecem uma revisão posterior. - A imagem principal é carregada prioritariamente, com dimensões definidas. Fotografias abaixo da primeira área visível usam carregamento diferido e imagem neutra quando falham. - Foram melhorados o destaque, menu móvel, foco, ligação para saltar conteúdo, carrosséis, pesquisa sem acentos, mensagem sem resultados, expansão de especialidades, filtro da equipa e janelas de detalhes. - Foi aplicada Lato nas superfícies alteradas, com carregamento `swap`, mantendo roxo e amarelo. Foram corrigidos o lema institucional, o endereço indicado pelo cliente, uma avaliação com erro ortográfico e a sobreposição do cabeçalho de acesso em telemóvel. ### Segurança, acesso e privacidade - A verificação preliminar do identificador de acesso revelava a existência de contas. Passou a validar apenas o formato; a autenticação continua a validar as credenciais. - Foram acrescentados campos armadilha contra submissões automatizadas nos formulários públicos de acesso, recuperação e registo. Isto não equivale a uma solução completa contra bots. - O registo de actividade passou a ocultar os valores enviados nos formulários e os nomes de ficheiros, mantendo a identificação da operação. Foram evitados valores de palavras-passe, códigos, tokens e dados clínicos nos novos registos. - Foram adicionados cabeçalhos contra interpretação indevida de ficheiros e incorporação, política de referência, restrições de permissões e uma CSP inicial. Páginas privadas recebem indicação de não indexação e respostas autenticadas não devem ser guardadas em cache. - Cookies seguros ficam activos por defeito em produção. HSTS é enviado em produção quando a ligação é HTTPS. A remoção de `X-Powered-By` na aplicação não substitui `expose_php=Off` no servidor. - O acesso directo a `/verificar-contacto` sem sessão válida passou a encaminhar para o registo com mensagem compreensível. ### Marcação - A modalidade, especialidade e profissional seleccionados podem atravessar o acesso e regressar ao formulário. - O formulário apresenta seis etapas, permite recuar, consulta a disponibilidade do profissional escolhido e apresenta um resumo em hora de Moçambique. - O telefone aceita nove dígitos com ou sem `+258`, espaços e separadores admitidos, normalizando para o formato internacional antes de guardar. - Foram introduzidos bloqueios transaccionais do profissional e do paciente antes da verificação de sobreposição na criação de consultas. Pedidos repetidos do mesmo paciente, serviço e horário são rejeitados. - Pedidos enviados pelo portal continuam pendentes de validação pela clínica. Não foram transformados em reservas globais automáticas, pagamentos ou consultas confirmadas. - A listagem e a resposta a pedidos passaram a respeitar as fichas de pacientes actualmente autorizadas para o utilizador. Um teste confirma que um representante com acesso expirado não pode aceitar, rejeitar ou responder a um pedido antigo, mesmo sendo o seu criador. - O número do pedido e a especialidade são apresentados. A designação genérica do profissional em partes do portal foi preservada porque é uma regra explícita do componente existente `IdentityPrivacy`; a sua alteração precisa de ser conciliada com a regra de privacidade do projecto. ### Avaliações, administração e SEO - A publicação de avaliações exige consulta concluída, opção voluntária e aprovação administrativa. A alteração pelo paciente retira a aprovação anterior. Não são apresentados nomes completos nem uma etiqueta de verificação sem fundamento. - A média é calculada a partir das avaliações elegíveis e só é destacada com pelo menos três avaliações. - Foram acrescentadas moderação paginada e perguntas frequentes editáveis nas permissões administrativas existentes. - Pagamentos e seguradoras apresentados dependem da configuração activa. Não foram inventados métodos, números de contas ou planos. - Foram acrescentados sitemap público, metadados de partilha e configuração de domínio canónico. Sem domínio definitivo configurado, a homepage não é destinada à indexação e o sitemap não inventa URLs de produção. - Foram reutilizadas as páginas de erro existentes, actualizando a assinatura institucional. Foi removida uma declaração duplicada de rota do simulador de pagamento. ## Validação efectuada | Verificação | Resultado e alcance | | --- | --- | | Suite Laravel completa | 320 testes aprovados, 2.133 asserções, 31,51 segundos, SQLite em memória. | | Nova verificação após corrigir números das etapas | 49 testes aprovados, 527 asserções, incluindo portal e apresentação. | | Vite | Build concluído; entradas separadas para homepage e aplicação. | | Optimização Laravel | Configuração, eventos, rotas e views compilados com ficheiros de cache isolados; caches de ensaio removidas após validação. Não foi aplicada configuração de produção ao ambiente real. | | Rotas | 256 rotas inventariadas, sem nomes duplicados. | | Cache pública | Teste confirma zero consultas para recuperar o conjunto de dados já em cache; isto não significa zero consultas na resposta HTTP inteira. | | Navegador — homepage | Pesquisa, ausência de resultados, expansão, menu/Escape, perfil/Escape e filtro da equipa verificados. | | Responsividade da homepage | 360×800, 390×844, 412×915, 768×1024, 1366×768, 1440×900 e 1920×1080: sem transbordo horizontal, um h1 e sem imagens quebradas nos dados de ensaio. | | Marcação no navegador | Percurso de teleconsulta em computador e a 390×844, com serviço, profissional, data, hora, contacto, resumo e envio; resultado pendente, usando exclusivamente dados fictícios. Modalidade preservada após acesso e telefone com espaços aceite. | | Ligações locais | Homepage, acesso, entrada de marcação e páginas legais responderam; âncoras públicas verificadas. Não foi feita uma auditoria de todas as ligações externas. | | Tempo local | Cinco respostas da homepage: TTFB entre 0,146 e 0,225 segundos, HTML com cerca de 55,7 KB na medição. Não representa uma ligação móvel nem o desempenho de produção. | A suite abrange módulos existentes de autenticação, consentimentos, recuperação, permissões, agenda, pagamentos, documentos, portal, avaliações e presença em teleconsulta. A aprovação não equivale a uma auditoria completa de todos os cenários possíveis. No navegador foram observados erros `AbortError` de transições automáticas interrompidas. Foi retirada a animação de transição entre páginas de acesso; a navegação posterior para a homepage não acrescentou erros à consola. Não foi demonstrada falha funcional associada aos registos anteriores. A tentativa de medir zoom a 200% não confirmou alteração efectiva da escala; esse teste fica pendente. Não foram medidos LCP, CLS e INP em condições representativas, o peso total com todos os pedidos externos, nem garantida abertura abaixo de três segundos. Não foram testadas corridas concorrentes em MySQL, pagamentos reais, entrega real de SMS/email/WhatsApp, chamada real Google Meet ou acessos com contas reais. ## Migration e preparação posterior Nova migration aditiva, sem remoção de dados: ```text database/migrations/2026_09_16_090000_add_moderation_to_patient_experience_ratings.php ``` Acrescenta `approved_at` e `approved_by`. Não foi executada na base de dados real. Enquanto não estiver aplicada, a homepage oculta avaliações por segurança. As avaliações existentes ficam por aprovar; não há aprovação retroactiva automática. Depois de revisão e backup da base de dados, executar no ambiente escolhido: ```sh php artisan migrate --path=database/migrations/2026_09_16_090000_add_moderation_to_patient_experience_ratings.php npm run build php artisan optimize ``` O último comando deve ser executado apenas depois de configurar correctamente o ambiente desse destino. Não executar operações destrutivas como `migrate:fresh` em dados reais. Para produção ainda é necessário confirmar domínio estável, HTTPS, `APP_URL`, URLs de retorno OAuth e `PUBLIC_SITE_CANONICAL_URL`; definir `APP_DEBUG=false`; servir apenas a pasta `public`; configurar o PHP para não expor a versão; restringir proxies de confiança aos da infra-estrutura; rever a CSP completa com os serviços externos. Nenhuma destas configurações de infra-estrutura foi publicada nesta etapa. ## Requisitos ainda não integralmente encerrados 1. Medições de desempenho em rede móvel, cache persistente e MySQL representativos; revisão final de CSS não utilizado. 2. Verificação individual das fotografias reais, incluindo Antónia Jovenal, e confirmação de direitos de utilização. 3. Perfis profissionais completos e filtro por modalidade, dependentes de dados confirmados e modelação adequada. 4. Revisão de todos os campos, mensagens de erro e páginas de acesso com leitor de ecrã; auditoria WCAG AA e zoom a 200%. 5. Verificação de concorrência real em MySQL e de todo o percurso presencial/domicílio no navegador. Testes automatizados existentes não substituem estas verificações. 6. Revisão completa de enumeração de contas no registo/recuperação, auditoria de acesso horizontal em todas as rotas e trilha de leitura de dados clínicos. 7. Análise antivírus de uploads, política de retenção, protecção e restauro de backups; não foram inventados prazos legais. 8. Revisão de seguradoras, planos, pré-autorização e manutenção dos dados do seguro pelo paciente; nenhuma nova integração foi anunciada como activa. 9. Validação real de teleconsulta, permissões de equipamento, presença, expiração e fim de sessão com domínio permanente. 10. Revisão integral das permissões administrativas por função e dos módulos de horários, feriados e ausências já existentes. 11. Dados estruturados completos e imagem institucional dedicada de partilha, após confirmação dos dados públicos; redireccionamento www/sem www no alojamento. 12. Revisão linguística integral de todas as páginas e aprovação dos textos legais. As correcções desta etapa concentram-se nas superfícies alteradas. ## Informações que dependem do MAKOMBE - Nome legal, NUIT, licença/alvará e contacto institucional definitivo. - Domínio permanente e acesso ao alojamento para futura publicação autorizada. - Fotografias autorizadas, nomes, qualificações, inscrição profissional, experiência, idiomas e disponibilidade dos profissionais. - Especialidades e modalidades efectivamente prestadas, zonas de atendimento ao domicílio e regras de disponibilidade. - Horários, feriados, preços e instruções de pagamento confirmados. - Métodos e contas de pagamento activos; seguradoras e planos aceites, condições e pré-autorização. - Política de Privacidade e Termos aprovados, retenção documental, comunicações opcionais e eventual política de gravação de teleconsultas. - Informações confirmadas sobre estacionamento e referências de localização. ## Inventário de ficheiros A lista abaixo identifica apenas as alterações desta etapa, comparadas com `837122a`; não inclui as 53 alterações anteriores preservadas nesse commit. - `app/Actions/Appointments/CreateAppointment.php` - `app/Http/Controllers/Auth/AuthenticatedSessionController.php` - `app/Http/Controllers/Auth/ContactVerificationController.php` - `app/Http/Controllers/Auth/GoogleAuthenticationController.php` - `app/Http/Controllers/HomepageSettingsController.php` - `app/Http/Controllers/PatientPortalController.php` - `app/Http/Controllers/PortalAppointmentAvailabilityController.php` - `app/Http/Controllers/PublicAppointmentEntryController.php` - `app/Http/Controllers/PublicHomeController.php` - `app/Http/Controllers/PublicSitemapController.php` - `app/Http/Controllers/RatingModerationController.php` - `app/Http/Middleware/PublicFormProtection.php` - `app/Http/Middleware/RecordSystemActivity.php` - `app/Http/Middleware/SecurityHeaders.php` - `app/Http/Requests/StorePortalAppointmentRequest.php` - `app/Models/PatientExperienceRating.php` - `app/Providers/AppServiceProvider.php` - `app/Services/PublicHomepageData.php` - `app/Services/Scheduling/AppointmentAvailabilityService.php` - `app/Support/MozambiquePhone.php` - `bootstrap/app.php` - `config/public_site.php` - `config/session.php` - `database/migrations/2026_09_16_090000_add_moderation_to_patient_experience_ratings.php` - `docs/revisao-homepage-performance-ux.md` - `public/css/auth-compact.css` - `public/css/system-font.css` - `public/images/health-campaign-august-gold.webp` - `public/images/makombe-care-team-hero.webp` - `public/images/professional-placeholder.svg` - `public/robots.txt` - `resources/css/app.css` - `resources/css/home.css` - `resources/js/home.js` - `resources/views/auth/forgot-access.blade.php` - `resources/views/auth/login.blade.php` - `resources/views/auth/register-patient.blade.php` - `resources/views/components/public-form-trap.blade.php` - `resources/views/components/public-site-footer.blade.php` - `resources/views/components/public-site-header.blade.php` - `resources/views/errors/503.blade.php` - `resources/views/errors/layout.blade.php` - `resources/views/home.blade.php` - `resources/views/layouts/portal.blade.php` - `resources/views/layouts/public-auth-modern.blade.php` - `resources/views/portal/_appointments-real-data.blade.php` - `resources/views/portal/appointment-create.blade.php` - `resources/views/settings/homepage.blade.php` - `resources/views/settings/ratings.blade.php` - `routes/web.php` - `tests/Feature/Audit/SystemLogTest.php` - `tests/Feature/Auth/AuthenticationTest.php` - `tests/Feature/Design/BrandInterfaceTest.php` - `tests/Feature/Design/PublicHomepagePerformanceTest.php` - `tests/Feature/Design/RatingModerationTest.php` - `tests/Feature/Design/SecurityHardeningTest.php` - `tests/Feature/ExampleTest.php` - `tests/Feature/Portal/PatientPortalAccessTest.php` - `tests/Unit/MozambiquePhoneTest.php` - `tests/Unit/PreOrthographyInterfaceTest.php` - `vite.config.js` ## Commits locais desta etapa - `2154d35` — segurança dos formulários e acesso. - `9796706` — marcação por etapas, disponibilidade e telefone. - `17c914e` — estrutura de moderação de avaliações. - `5c0aa9d` — homepage, cache, imagens, navegação e integração das rotas. - `ee9fe13` — impedir respostas com autorização expirada. - `d045328` — retirar transições interrompidas das páginas de acesso. Os commits devem ser revistos em conjunto: as rotas e testes de integração dependem dos componentes introduzidos nos commits anteriores. ## Actualização — apresentação da Equipa Médica Em 17 de Setembro, por pedido do utilizador, a secção foi redesenhada: cabeçalho sem sobreposição, filtro separado, três cartões por linha em computador, dois em tablet e navegação horizontal em telemóvel. Fotografias com proporção uniforme, acções de perfil e marcação distintas e destaque de campanha preservado. A navegação avança por cartão e respeita movimento reduzido. Ficheiros: `resources/views/home.blade.php`, `resources/css/home.css`, `resources/js/home.js`. Cópia anterior: `C:/Users/HP/AppData/Local/Temp/makombe-team-before-20260917-150450`. Validação: 18 testes de apresentação e dados públicos aprovados (151 asserções); build Vite concluído; sete tamanhos de ecrã sem transbordo horizontal; filtro, perfil/Escape e setas/rato/teclado verificados. A fotografia pública de Antónia Jovenal carregou neste ensaio; vários outros perfis apresentam a imagem neutra. Não foram alteradas fotografias, dados profissionais nem registos da base de dados.