politicas_ajustes.md 27 KB

RELATÓRIO COMPLETO — SERPRATI ASSOCIADO APP Publicação na Google Play Store Data: 21/05/2026 | Analista: Claude Sonnet 4.6

PARTE 1 — PREPARATIVOS TÉCNICOS PARA COMPILAÇÃO APK/AAB Stack identificada Framework: Quasar v2 (Vue 3) + Capacitor 8.3.4 App ID: br.com.serprati.associado AGP (Android Gradle Plugin): 8.13.0 Gradle: 8.14.3 (wrapper configurado, baixou com sucesso) Java target: 21 (JavaVersion.VERSION_21 no capacitor.build.gradle) compileSdkVersion / targetSdkVersion: 36 ✅ O que está OK Item Detalhe Node.js v22.21.1 Dentro do range suportado (^22 || ^20 || ^18) npm 10.9.4 Acima do mínimo (>= 6.13.4) Java 21 (OpenJDK) Versão exata exigida pelo capacitor.build.gradle @quasar/cli v2.5.0 Instalado globalmente Capacitor CLI 8.3.4 Disponível via npx cap Android SDK Presente em /usr/lib/android-sdk/ adb Disponível em /usr/bin/adb Gradle wrapper Baixou 8.14.3 com sucesso src-capacitor/android/ Estrutura completa gerada vueRouterMode: "hash" Correto para Capacitor (sem servidor HTTP) AVDs disponíveis Pixel 8 Pro API 34, Pixel Fold API 34 ❌ Problemas Críticos — Bloqueiam a compilação

  1. local.properties ausente no projeto O arquivo src-capacitor/android/local.properties com sdk.dir=/usr/lib/android-sdk não existe neste projeto. Sem ele, o Gradle não encontra o SDK. Outros projetos no sistema têm esse arquivo, mas este não.

  2. ANDROID_HOME / ANDROID_SDK_ROOT não configurados As variáveis de ambiente estão vazias. Sem elas nem o local.properties, qualquer tentativa de build falhará com "SDK location not found".

  3. android-36 platform não instalado O variables.gradle define compileSdkVersion = 36 e targetSdkVersion = 36, mas apenas estas plataformas estão instaladas:

android-33, android-34, android-35 ← falta android-36 A compilação quebrará imediatamente.

  1. google-services.json ausente O app usa @capacitor/push-notifications (FCM). Sem o google-services.json do Firebase Console colocado em android/app/, as notificações push não funcionarão. O build.gradle tem um try/catch que ignora silenciosamente — o app compila, mas push será inoperante.

⚠️ Necessário para Play Store (não bloqueia build, bloqueia publicação)

  1. Keystore de release ausente Só existe ~/.android/debug.keystore. Para publicar na Play Store é necessário gerar um keystore de produção e configurar signingConfigs no app/build.gradle. O AAB/APK debug não é aceito pela Play Store.

  2. Build sem minificação

release { minifyEnabled false } // recomendado true para produção PARTE 2 — ANÁLISE LGPD E CONFORMIDADE GOOGLE PLAY STORE Data da Análise: 21/05/2026 Projetos analisados:

Backend API: /var/www/sfp_api_laravel_serprati Frontend App: /home/softpar/projetos/spas/sfp_front_vue_serprati_associado_app

  1. MAPEAMENTO DE DADOS PESSOAIS Dado Campo/Tabela Finalidade Obrigatório Quem acessa Nome completo users.name Identificação, exibição na carteirinha Sim Associado, Admin E-mail users.email Autenticação, recuperação de senha Sim Associado, Admin CPF users.cpf Identificação, QR Code da carteirinha Sim Associado, Admin Telefone users.phone Contato, relatórios Sim (landing) Admin Senha (hash bcrypt) users.password Autenticação Sim Backend apenas Matrícula users.registration Identificação funcional, QR Code Não Associado, Admin Data de admissão users.admission_date Controle de vigência Não Associado, Admin Data de expiração users.expiry_date Controle de vigência, carteirinha Não Associado Cargo (texto) users.position_label Identificação funcional Sim (landing) Admin Setor (texto) users.sector_label Identificação funcional Sim (landing) Admin Cargo FK users.position_id Vínculo com tabela positions Não Admin Setor FK users.sector_id Vínculo com tabela sectors Não Admin Status do associado users.status Controle ativo/inativo/pendente N/A Admin Data de exclusão users.excluded_at Controle de desligamento N/A Admin Token de acesso personal_access_tokens.token (hash SHA-256) Autenticação API N/A Backend Último uso do token personal_access_tokens.last_used_at Controle de sessão N/A Backend Nome do dependente user_dependents.name Identificação de dependente Sim Associado, Admin Parentesco user_dependents.kinship Tipo de vínculo familiar Sim Associado, Admin Observações de agendamento appointments.observations Contextualizar agendamento Não Associado, Parceiro, Admin Data/hora do agendamento appointments.date, .time Agendamento de serviço Sim Associado, Parceiro, Admin Leitura de notificação notification_sends.read_at Controle de leitura N/A Admin Token FCM (device) Gerado pelo FCM/Google Notificações push Não Google (FCM) Cookie "email" Dispositivo local Lembrar e-mail (opt-in) Não Local Cookie "locale" Dispositivo local Idioma preferido Não Local CNPJ do parceiro partner_agreements.cnpj Identificação da empresa parceira Não Admin Contato do parceiro .responsible, .email, .phone, .whatsapp Dados de contato do parceiro Não Admin Endereço do parceiro .address, .neighborhood, .zip_code Localização para o associado Não Associado (leitura) Fontes: migrations 0001_01_01_000000_create_users_table.php, 2025_01_01_000003_alter_users_table_add_new_fields.php, 2026_04_23_090702_add_phone_and_labels_to_users_table.php, 2026_05_18_000001_add_excluded_at_to_users_table.php, 2025_01_01_000005_create_user_dependents_table.php

  2. AUTENTICAÇÃO E SEGURANÇA Mecanismo Usado Laravel Sanctum com tokens Bearer + refresh token via cookie HttpOnly Access token: expira em 15 minutos Refresh token: expira em 90 dias (sanctum.rt_expiration = 129600 minutos), enviado como cookie httpOnly: true, sameSite: Lax, secure: [env] No frontend, o accessToken é mantido exclusivamente em memória na store Pinia (src/stores/user.js) — sem persistência em localStorage ou sessionStorage Pontos Adequados Senhas com bcrypt via cast "password" => "hashed" no model Tokens de reset armazenados como hash com TTL de 15 minutos Cron job DeleteExpiredTokens exclui tokens expirados automaticamente (a cada minuto) Logout invalida tokens do dispositivo específico Renovação de refresh token em transaction atômica, invalidando o anterior Autenticação exige campo tipo, impedindo cross-login entre tipos de usuário password e remember_token estão no array $hidden do model User Riscos Encontrados CRÍTICO — CORS aberto (): config/cors.php define allowed_origins: [''] com supports_credentials: true. Deve ser restringido às origens do app e do backoffice.

Arquivo: /var/www/sfp_api_laravel_serprati/config/cors.php

ALTO — Push token FCM não enviado ao backend (TODO pendente): usePushNotifications.js obtém o FCM token mas contém // TODO: enviar token para a API Laravel via POST /device/token. O token é console.logado e descartado. Push notifications está incompleto — permissão coletada sem uso real.

Arquivo: src/composables/usePushNotifications.js

ALTO — console.log com dados sensíveis em produção: console.log("Push token:", token.value) expõe dados em logs do dispositivo (acessíveis via ADB).

ALTO — Cookie de e-mail sem flag secure: LoginPage.vue salva cookie email sem secure: true. Em HTTP, o e-mail fica exposto.

Arquivo: src/pages/login/LoginPage.vue

MÉDIO — QR Code expõe CPF e matrícula em texto plano: CarteirinhaPage.vue gera o QR Code com CPF:${user.cpf}|MAT:${user.registration}, sem criptografia ou assinatura digital.

MÉDIO — Refresh token com 90 dias: Período longo para app corporativo. Considerar reduzir para 30 dias.

BAIXO — Sessão database sem criptografia: config/session.php usa driver: database e encrypt: false.

BAIXO — PerformanceMonitor loga queries SQL com dados reais (apenas em ambiente local):

Arquivo: /var/www/sfp_api_laravel_serprati/app/Http/Middleware/PerformanceMonitor.php

  1. PERMISSÕES ANDROID Arquivo: src-capacitor/android/app/src/main/AndroidManifest.xml

Permissão Onde usada Finalidade Necessária? Risco Play Store INTERNET src/boot/axios.js, WebSocket Comunicação com API REST Sim Nenhum VIBRATE Plugin PushNotifications Vibração em notificação Sim (se push ativo) Nenhum POST_NOTIFICATIONS usePushNotifications.js Exibir notificações (Android 13+) Sim Baixo CAMERA Declarada — sem uso identificado no código Não encontrado uso ativo Questionar ALTO android.hardware.camera (feature, required=false) Vinculada à permissão de câmera Hardware de câmera Não obrigatório Baixo Observação crítica sobre CAMERA: O pacote @capacitor/camera está nas dependências de src-capacitor/package.json e a permissão CAMERA está no manifest, porém nenhum arquivo em src/ importa ou usa a API Camera. O botão de editar avatar em ProfilePage.vue está com disable. Permissão sem uso é critério de rejeição na Play Store. Deve ser removida ou implementada.

  1. LOGS E AUDITORIA O que está sendo logado Canal Arquivo Conteúdo Retenção Risco LGPD expiredTokens storage/logs/deleted/expired_tokens.log "Deleted {N} expired tokens" (apenas contagem) 7 dias Nenhum single / stack storage/logs/laravel.log Exceções, stack traces, potencialmente payloads Não definida Alto (debug em prod) PerformanceMonitor php://stderr URI, método, tempo, queries SQL com parâmetros Apenas em local/development Baixo Ausências Críticas Sem log de autenticação — tentativas de login, logins bem-sucedidos, falhas Sem tabela de auditoria de alterações em dados pessoais Sem log de acesso a dados sensíveis (quem consultou CPF de um associado) Sem prazo de retenção definido para laravel.log em produção Recomendações Definir LOG_LEVEL=error em produção Configurar canal daily com days: 30 para laravel.log Implementar tabela audit_logs
  2. DIREITOS DO USUÁRIO — GAPS Direito LGPD (Art. 18) Status Mecanismo Acesso aos próprios dados Parcial GET /user/current/auth retorna dados, sem exportação estruturada Atualização/correção Parcial PUT /user/{id} existe, mas apenas para admin — associado não pode editar o próprio perfil Exportação/portabilidade Ausente (para o titular) Existe exportação Excel para admins; o titular não tem acesso Exclusão / direito ao esquecimento Ausente (auto-solicitação) Admin pode excluir via DELETE /user/{id}; o associado não possui endpoint nem interface Revogação de consentimento Ausente Sem mecanismo formal Oposição ao tratamento Ausente Sem mecanismo formal Itens Críticos para a Play Store (bloqueantes) A Google Play Store exige:

Fluxo de exclusão de conta acessível dentro do app ou URL pública de exclusão Link para política de privacidade na ficha do app O app atualmente não possui nenhum desses mecanismos.

  1. COMPARTILHAMENTO DE DADOS Destinatário Dado transmitido Motivo Risco LGPD Provedor SMTP E-mail + código OTP 6 dígitos Reset de senha Baixo (dado mínimo, TTL 15 min) Google FCM Device token Entrega de notificações push Médio — deve ser declarado no Data Safety Administradores da organização Nome, CPF, e-mail, telefone, matrícula, cargo, setor, status Gestão da associação Baixo (relação contratual) Parceiros cadastrados Dados do agendamento (data, serviço, observações) Prestação do serviço agendado Baixo (relação contratual) Sem rastreamento externo confirmado: nenhuma biblioteca de analytics, publicidade, Crashlytics, Sentry, Mixpanel ou Facebook SDK identificada nos package.json e boots.

  2. ADEQUAÇÕES NECESSÁRIAS (PRIORIDADE) CRÍTICO — Bloqueiam publicação na Play Store Implementar fluxo de exclusão de conta pelo próprio associado — criar rota DELETE /associado/account e interface no app. O campo excluded_at já existe, falta expô-lo ao titular. Publicar Política de Privacidade com URL pública e linká-la no app e na ficha da Play Store. Preencher formulário Data Safety na Play Console. Resolver permissão CAMERA — implementar a funcionalidade de câmera (upload de foto de perfil) ou remover a permissão e o pacote @capacitor/camera. Resolver TODO de push notifications — implementar envio do FCM token ao backend ou remover a permissão POST_NOTIFICATIONS e o plugin. ALTO Remover console.log com dados sensíveis em produção — especialmente console.log("Push token:", token.value) em usePushNotifications.js. Restringir CORS — config/cors.php de allowed_origins: ['*'] para origens específicas. Implementar atualização de perfil pelo associado — botão de editar avatar está com disable em ProfilePage.vue. Adicionar flag secure: true no cookie de e-mail — LoginPage.vue. Implementar exportação de dados para o titular — endpoint GET /associado/my-data com JSON de todos os dados do titular (Art. 18, V da LGPD). MÉDIO Definir política de retenção de logs — canal daily com days: 30 e LOG_LEVEL=error em produção. Adicionar aviso de consentimento para "lembrar e-mail" em LoginPage.vue. Criptografar ou assinar QR Code da carteirinha — usar JWT de curta duração em vez de CPF+matrícula em texto plano. Implementar tabela de auditoria de alterações em dados pessoais. Reduzir refresh token de 90 para 30 dias. Verificar secure: true para refresh token cookie via config('session.secure') em produção. BAIXO Confirmar comportamento de hard delete — DELETE /user/{id} realiza hard delete. Para auditoria LGPD considerar soft delete com marcação temporal. Implementar log de autenticação — tentativas de login com IP, timestamp e resultado. Implementar mecanismo de revogação de sessões ativas pelo usuário. Habilitar criptografia de sessões no banco — config/session.php com encrypt: true.

  3. CHECKLIST LGPD Requisito Status Observação Base legal definida para cada tratamento ⚠️ Parcial Execução de contrato, mas não documentada formalmente Coleta mínima (princípio da necessidade) ⚠️ Parcial position_label e sector_label duplicam FKs — avaliar necessidade Finalidade específica documentada ❌ Ausente Sem registro formal de finalidade por campo Transparência — política de privacidade acessível no app ❌ Ausente Obrigatório Direito de acesso ⚠️ Parcial Endpoint existe, sem exportação estruturada para o titular Direito de correção ❌ Ausente (para o associado) Apenas admin pode editar Direito de exclusão ❌ Ausente (para o associado) Apenas admin pode excluir Direito à portabilidade ❌ Ausente Sem exportação pelo titular Direito de oposição / revogação ❌ Ausente Sem mecanismo formal Segurança em trânsito (HTTPS) ⚠️ A confirmar Depende do ambiente de produção Senha com hash irreversível ✅ Conforme bcrypt Tokens com expiração ✅ Conforme Access: 15 min, Refresh: 90 dias Exclusão automática de tokens expirados ✅ Conforme Cron job a cada minuto Responsável pelo tratamento / DPO identificado ❌ Ausente Sem contato no app Registro de incidentes ❌ Ausente Sem mecanismo Logs de auditoria de acesso ❌ Ausente Sem tabela de auditoria Cookie de e-mail com consentimento ❌ Ausente Sem aviso ao usuário CORS restrito ❌ Não conforme allowed_origins: ['*']

  4. CHECKLIST GOOGLE PLAY DATA SAFETY Categoria Status Observação Política de privacidade com URL pública ❌ Ausente Bloqueante URL de exclusão de conta ❌ Ausente Bloqueante (exigência 2024) Dados coletados declarados no Data Safety ❌ Ausente Bloqueante Nome e contato (e-mail, telefone) ⚠️ Coletado, não declarado Deve ser declarado Identificadores pessoais (CPF) ⚠️ Coletado, não declarado Deve ser declarado Dados financeiros ✅ Não coletado N/A Fotos/vídeos ⚠️ Permissão declarada sem uso Risco de rejeição Localização ✅ Não coletado N/A Dados do app (agendamentos) ⚠️ Coletado, não declarado Deve ser declarado Device ID (FCM token) ⚠️ Coletado pelo Google, não declarado Deve ser declarado Publicidade / analytics externos ✅ Não coletado Confirmado Criptografia em trânsito declarada ⚠️ A confirmar HTTPS depende do ambiente de prod Permissão CAMERA sem uso identificado ❌ Risco Pode causar rejeição

  5. POLÍTICA DE PRIVACIDADE COMPLETA AVISO: Texto elaborado com base exclusiva no código-fonte auditado. Deve ser revisado por advogado especializado em LGPD antes da publicação.

POLÍTICA DE PRIVACIDADE — APLICATIVO SERPRATI ASSOCIADO Versão 1.0 — Maio de 2026

  1. INTRODUÇÃO O aplicativo SerPrati Associado ("Aplicativo") é operado por [RAZÃO SOCIAL DA EMPRESA], inscrita no CNPJ nº [CNPJ], com sede em [ENDEREÇO] ("SerPrati" ou "nós"). Esta Política de Privacidade descreve como coletamos, utilizamos, armazenamos, compartilhamos e protegemos os seus dados pessoais quando você utiliza o Aplicativo, em conformidade com a Lei Geral de Proteção de Dados Pessoais (Lei nº 13.709/2018 — LGPD) e com as políticas da Google Play Store.

Ao utilizar o Aplicativo, você concorda com as práticas descritas nesta Política. Caso não concorde, entre em contato conosco para exercer seus direitos.

  1. DADOS PESSOAIS COLETADOS 2.1. Dados de identificação e cadastro (fornecidos no cadastro ou atualizados pelo gestor):

Nome completo Endereço de e-mail CPF (Cadastro de Pessoa Física) Número de matrícula funcional Número de telefone Cargo e setor na organização 2.2. Dados de acesso e autenticação:

Senha (armazenada exclusivamente em formato de hash — não é possível recuperar a senha original) Tokens de acesso à API (identificadores técnicos de sessão, armazenados em formato hash) Data e hora do último uso da sessão 2.3. Dados funcionais:

Data de admissão e data de validade da associação Status da associação (ativo, inativo, pendente) Informações de dependentes cadastrados: nome e grau de parentesco 2.4. Dados de uso do Aplicativo:

Agendamentos realizados: convênio escolhido, serviço, data, hora e observações Histórico de notificações recebidas e data de leitura Itens de interesse marcados na loja de benefícios 2.5. Dados de preferências locais (armazenados no seu dispositivo):

Endereço de e-mail, caso você marque "Lembrar e-mail" na tela de login (cookie local) Preferência de idioma do Aplicativo 2.6. Dados gerados automaticamente:

Identificador técnico de dispositivo para gerenciamento de sessões (não é IMEI nem identificador de hardware) Caso você autorize notificações push, um token de identificação junto ao serviço FCM do Google pode ser gerado

  1. FINALIDADE DO TRATAMENTO E BASE LEGAL Dado Finalidade Base Legal (LGPD) Nome, e-mail, CPF, matrícula, telefone Identificação do associado, acesso ao app, carteirinha digital Execução de contrato — Art. 7º, V Senha (hash) Autenticação segura Execução de contrato — Art. 7º, V Tokens de sessão Controle de acesso e segurança Legítimo interesse — Art. 7º, IX E-mail (reset de senha) Envio de código OTP temporário Execução de contrato — Art. 7º, V Dados de dependentes Cadastro de beneficiários Execução de contrato — Art. 7º, V Agendamentos Registro e acompanhamento de serviços Execução de contrato — Art. 7º, V Histórico de notificações Comunicação institucional Legítimo interesse — Art. 7º, IX Cookie "lembrar e-mail" Conveniência no login (opt-in) Consentimento — Art. 7º, I
  2. COMO COLETAMOS OS DADOS Cadastro pela organização: dados básicos são cadastrados pelo gestor via portal SerPrati ou página de pré-cadastro. Uso do Aplicativo: ao realizar agendamentos, marcar interesses e interagir com notificações. Opção "lembrar e-mail": somente se você marcar a caixa correspondente na tela de login.
  3. ARMAZENAMENTO E SEGURANÇA 5.1. Onde os dados são armazenados: Banco de dados PostgreSQL em servidor sob controle da SerPrati. Arquivos de mídia armazenados em sistema de arquivos do servidor.

5.2. Medidas de segurança:

Comunicação exclusivamente via HTTPS (TLS) Senhas com hash bcrypt (irreversível) Tokens de acesso com validade de 15 minutos; tokens de renovação com validade de 90 dias Tokens de redefinição de senha com validade de 15 minutos, armazenados como hash Exclusão automática de tokens expirados Access token mantido exclusivamente em memória do app (não gravado em disco) Invalidação de todas as sessões do dispositivo no logout 5.3. Dados armazenados no dispositivo:

Cookie de e-mail (opcional, ativado pelo usuário) Cookie de idioma preferido Esses cookies são técnicos, não rastreiam comportamento e não são compartilhados com terceiros

  1. COMPARTILHAMENTO DE DADOS Não vendemos, alugamos ou comercializamos seus dados. Os dados podem ser compartilhados em:

6.1. Provedor de e-mail (SMTP): Ao solicitar redefinição de senha, seu e-mail e um código numérico temporário de 6 dígitos são enviados ao servidor de e-mail. O código expira em 15 minutos.

6.2. Google Firebase Cloud Messaging (FCM): Caso você autorize notificações push, um token de identificação do dispositivo é gerado pelo FCM da Google. Consulte a Política de Privacidade da Google.

6.3. Gestores da organização: Administradores têm acesso a dados cadastrais (nome, CPF, e-mail, telefone, matrícula, cargo, setor, status) para fins de gestão da associação.

6.4. Parceiros cadastrados: Dados do agendamento (convênio, serviço, data, hora) são acessíveis ao parceiro para prestação do serviço solicitado.

  1. RETENÇÃO E EXCLUSÃO DE DADOS Tokens de acesso: excluídos automaticamente após expiração ou logout Tokens de reset de senha: excluídos imediatamente após uso ou após 15 minutos Dados cadastrais: mantidos enquanto a associação estiver vigente ou conforme exigência legal Logs operacionais: mantidos por até 30 dias Exclusão de conta: ao solicitar a exclusão, os dados são removidos dos sistemas ativos. Dados necessários por obrigação legal (tributária, trabalhista) poderão ser mantidos pelo prazo legalmente exigido
  2. SEUS DIREITOS COMO TITULAR Nos termos do Art. 18 da LGPD, você tem direito a:

Confirmação e acesso: verificar se tratamos seus dados e obter cópia Correção: solicitar atualização de dados incompletos ou incorretos Eliminação: solicitar exclusão de dados desnecessários ou excessivos Portabilidade: receber seus dados em formato estruturado Revogação do cookie "lembrar e-mail": desativando a opção na tela de login Revogação de notificações push: em Configurações do dispositivo > Notificações > SerPrati Associado Informação sobre compartilhamento: descrito na Seção 6 Para exercer seus direitos: [e-mail de contato LGPD]

  1. EXCLUSÃO DA CONTA Para solicitar a exclusão permanente da sua conta e de todos os seus dados, entre em contato através de [e-mail de contato] ou acesse [URL do formulário de exclusão]. O prazo de processamento é de até 15 dias úteis.

  2. TECNOLOGIAS LOCAIS (COOKIES E ARMAZENAMENTO) Cookie Dado armazenado Finalidade Duração email E-mail do usuário Facilitar login (opt-in) Sessão locale Código de idioma (pt/en) Preferência de idioma Sessão refresh_token (HttpOnly) Token de renovação de sessão Manutenção da sessão autenticada 90 dias miniState Preferência de menu Interface do usuário Sessão O cookie email é opcional e controlado pelo usuário. Os demais são estritamente necessários para o funcionamento do app.

  3. ALTERAÇÕES NESTA POLÍTICA Esta Política pode ser atualizada periodicamente. Notificaremos alterações significativas por notificação no app. A versão mais recente sempre estará disponível em [URL pública da política].

  4. CONTATO E ENCARREGADO DE DADOS (DPO) [Nome/Departamento responsável] E-mail: [dpo@serprati.com.br] [RAZÃO SOCIAL DA EMPRESA] [ENDEREÇO COMPLETO] CNPJ: [CNPJ]

  5. JSON DATA SAFETY — GOOGLE PLAY

{ "data_safety": {

"privacy_policy_url": "https://[URL_PUBLICA]/politica-de-privacidade",
"account_deletion_url": "https://[URL_PUBLICA]/excluir-conta",
"data_collection": {
  "collects_data": true,
  "data_types_collected": [
    {
      "category": "Personal info",
      "type": "Name",
      "is_required": true,
      "purpose": ["App functionality"],
      "shared_with_third_parties": false,
      "ephemeral": false,
      "user_can_delete": true
    },
    {
      "category": "Personal info",
      "type": "Email address",
      "is_required": true,
      "purpose": ["App functionality", "Account management"],
      "shared_with_third_parties": true,
      "third_party_note": "Enviado ao provedor SMTP para recuperação de senha",
      "ephemeral": false,
      "user_can_delete": true
    },
    {
      "category": "Personal info",
      "type": "Phone number",
      "is_required": false,
      "purpose": ["App functionality"],
      "shared_with_third_parties": false,
      "ephemeral": false,
      "user_can_delete": true
    },
    {
      "category": "Personal info",
      "type": "Other personal info",
      "description": "CPF, matrícula funcional, cargo, setor, datas de admissão e validade",
      "is_required": true,
      "purpose": ["App functionality"],
      "shared_with_third_parties": false,
      "ephemeral": false,
      "user_can_delete": true
    },
    {
      "category": "Personal info",
      "type": "Other personal info",
      "description": "Dados de dependentes: nome e grau de parentesco",
      "is_required": false,
      "purpose": ["App functionality"],
      "shared_with_third_parties": false,
      "ephemeral": false,
      "user_can_delete": true
    },
    {
      "category": "Device or other IDs",
      "type": "Device or other IDs",
      "description": "Token FCM para notificações push",
      "is_required": false,
      "purpose": ["App functionality"],
      "shared_with_third_parties": true,
      "third_party_note": "Firebase Cloud Messaging (Google) para entrega de notificações",
      "ephemeral": false,
      "user_can_delete": true,
      "user_can_opt_out": true,
      "opt_out_note": "Usuário pode revogar POST_NOTIFICATIONS nas configurações do dispositivo"
    },
    {
      "category": "App activity",
      "type": "App interactions",
      "description": "Agendamentos realizados (convênio, serviço, data/hora, observações), itens de interesse, notificações lidas",
      "is_required": false,
      "purpose": ["App functionality"],
      "shared_with_third_parties": false,
      "ephemeral": false,
      "user_can_delete": true
    }
  ],
  "security_practices": {
    "data_encrypted_in_transit": true,
    "encryption_in_transit_note": "HTTPS/TLS para todas as comunicações com a API",
    "data_encrypted_at_rest": false,
    "encrypted_at_rest_note": "Senhas e tokens armazenados como hash irreversível; dados pessoais não criptografados em repouso no banco",
    "follows_families_policy": false,
    "provides_way_to_delete_data": true,
    "deletion_note": "Via contato com suporte ou formulário em [URL_PUBLICA]/excluir-conta"
  }
}

} } RESUMO EXECUTIVO Bloqueantes para publicação na Play Store (resolver antes de submeter) Implementar fluxo de exclusão de conta no app + URL pública Publicar Política de Privacidade com URL acessível Preencher o formulário Data Safety na Play Console Resolver permissão CAMERA sem uso identificado Resolver local.properties ausente e instalar android-36 (para compilar) Conformidade LGPD — Status Geral Segurança técnica: ✅ Boa base (bcrypt, tokens com expiração, Sanctum) Direitos do titular: ❌ Deficiente (sem auto-atendimento para exclusão, correção ou exportação) Transparência: ❌ Ausente (sem política de privacidade no app) Logs e auditoria: ❌ Ausente (sem auditoria de alterações em dados pessoais) CORS: ❌ Aberto (*) — corrigir imediatamente