🔄 Fluxo Detalhado da Funcionalidade de Co-responsabilidade

📋 Visão Geral do Fluxo

O fluxo completo envolve 2 atores principais:

  1. Responsável Principal (que convida)
  2. Corresponsável (que recebe o convite)

🔄 FLUXO COMPLETO PASSO A PASSO

1. Responsável Principal

  1. API 1: POST /api/CoResponsavel/criar-convite — envia atletaIds, email/telefone/CPF do corresponsável, diasExpiracao (opcional)
  2. Resposta da API inclui linkConvite (link web) e tokenConvite
  3. O link é compartilhado com o corresponsável (WhatsApp/Email/SMS)

2. Corresponsável - Link Web

  1. Recebe o link via WhatsApp/Email/SMS
  2. Clica no link: https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F
  3. Navegador ou app (WebView) abre a página de registro do corresponsável
  4. O token do convite é extraído do path da URL (/registro-corresponsavel/{token})
  5. API 2 (Segura): GET /api/autenticacao/verificar-token-convite/{token}
  6. App/página recebe dados do convite (atletas, responsável, dados pré-preenchidos)
  7. Campos são pré-preenchidos automaticamente (email, telefone, CPF)
  8. Usuário completa o cadastro com senha e outros dados
  9. API 3 (Segura): POST /api/autenticacao/registrar-com-convite
  10. Sistema valida token e dados do convite
  11. Se convite é válido, aceita automaticamente e marca como corresponsável
  12. Usuário é redirecionado para o dashboard como corresponsável

3. Backend (Processamento Seguro)

  1. Recebe requisição de registro com token
  2. Valida dados do usuário
  3. Cria conta no Identity
  4. Cria usuário na tabela Usuarios
  5. Busca convite específico pelo token
  6. Valida se dados coincidem com o convite
  7. Se convite é válido e dados coincidem:
  8. Se convite é inválido ou dados não coincidem:

👤 Informações do corresponsável e foto

Endpoint para obter dados do responsável ou corresponsável (nome, email, atletas vinculados e foto de perfil):

GET /api/Atletas/responsavel/{identificador}

O {identificador} pode ser o ID do usuário (GUID), CPF, email ou nome de usuário. A resposta inclui a lista de atletas vinculados e o objeto responsavel com id, nome, email, foto e thumbUrl.

Sistema de fallback para foto

A foto do responsável/corresponsável é obtida por um sistema de fallback em duas etapas:

  1. Primeiro: busca na tabela anexos, onde Entidade = ID do usuário e Contexto = FOTO_PERFIL (foto armazenada no Blob Storage).
  2. Se não houver registro em anexos: utiliza o campo Foto da tabela usuarios (URL legada), quando preenchido.

Assim, a foto é exibida corretamente tanto para quem fez upload recente (registro em anexos) quanto para perfis que ainda usam apenas o campo usuarios.Foto. O cache de fotos é invalidado automaticamente quando uma nova foto de perfil é enviada (criação ou atualização em anexos).


🔗 Link de Convite (atual: Web)

Atualmente o sistema gera um link web para o convite. O corresponsável clica no link e é levado à página de registro (app web ou WebView). O token do convite fica no path da URL.

Formato do link

https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F

O último segmento da URL é o tokenConvite. A aplicação (web ou app com WebView) extrai esse token e chama a API para verificar e pré-preencher o cadastro.

🔄 Processo do link web

1. Criação do Link (API 1)

POST /api/CoResponsavel/criar-convite
{
  "atletaIds": ["uuid-atleta-1"],
  "email": "[email protected]",
  "telefone": "11999999999",
  "cpf": "12345678901"
}

Response:
{
  "success": true,
  "data": {
    "tokenConvite": "409FD5F2FBC04E2F",
    "linkConvite": "https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F"
  }
}

2. Compartilhamento do Link

3. Clique no Link

Quando o corresponsável clica no link:

  1. Navegador ou app (WebView) abre a URL
  2. A aplicação extrai o token do path (/registro-corresponsavel/{token})
  3. Chamada à API: GET /api/autenticacao/verificar-token-convite/{token}
  4. A API retorna dados para pré-preenchimento (email, telefone, CPF) no cadastro
  5. Usuário completa o cadastro e o sistema vincula como corresponsável

📱 Deep Link (implementação futura)

O deep link (ex.: cordenaai://convite/{token}) será implementado quando o app for publicado na App Store e na Play Store. Com o deep link, ao clicar no link o sistema operacional abrirá o app nativo diretamente (se instalado), em vez da página web. Até lá, o link web atende ao fluxo de convite do corresponsável.

4. Extração do Token e Verificação via API

5. Verificação do Token (API 2)

GET /api/autenticacao/verificar-token-convite/ABC123DEF456GHI789

Response:
{
  "success": true,
  "data": {
    "temConvitePendente": true,
    "atletaNome": "João Silva",
    "responsavelPrincipalNome": "Maria Silva",
    "emailPreenchido": "[email protected]",
    "telefonePreenchido": "11999999999",
    "cpfPreenchido": "12345678901"
  }
}

7. Pré-preenchimento Automático

8. Cadastro com Token (API 3)

POST /api/autenticacao/registrar-com-convite
{
  "userName": "corresponsavel123",
  "email": "[email protected]",
  "password": "MinhaSenh@123",
  "nome": "João Corresponsável",
  "tokenConvite": "ABC123DEF456GHI789"
}

🎯 Vantagens do Deep Link:

  1. Experiência Fluida: Usuário não precisa digitar token
  2. Redução de Erros: Token é extraído automaticamente
  3. Maior Conversão: Processo mais simples e rápido
  4. Integração Nativa: Funciona com WhatsApp, Email, SMS
  5. Segurança: Token não fica visível para o usuário

📱 Configuração Técnica:

Android (AndroidManifest.xml)

<activity
  android:name=".MainActivity"
  android:exported="true"
  android:launchMode="singleTop">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="cordenaai" android:host="convite" />
  </intent-filter>
</activity>

iOS (Info.plist)

<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>cordenaai</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>cordenaai</string>
    </array>
  </dict>
</array>

🔄 Fluxo Visual do Link de Convite (Web):

1. API 1: POST /api/CoResponsavel/criar-convite
   ↓
2. Sistema gera: https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F
   ↓
3. Responsável compartilha link via WhatsApp/Email
   ↓
4. Corresponsável clica no link
   ↓
5. Navegador ou app (WebView) abre a página
   ↓
6. Aplicação extrai token do path: 409FD5F2FBC04E2F
   ↓
7. API 2: GET /api/autenticacao/verificar-token-convite/409FD5F2FBC04E2F
   ↓
8. App/página pré-preenche campos
   ↓
9. Usuário completa cadastro
   ↓
10. API 3: POST /api/autenticacao/registrar-com-convite
   ↓
11. Sistema vincula como corresponsável

📱 Exemplo Prático Completo:

Passo 1: Responsável Cria Convite

POST /api/CoResponsavel/criar-convite
{
  "atletaIds": ["37b109a5-ba6a-463e-bd99-6b59fed9f487"],
  "email": "[email protected]",
  "telefone": "11999999999",
  "cpf": "12345678901",
  "observacoes": "Convite para ser corresponsável do João",
  "diasExpiracao": 7
}

Response:
{
  "success": true,
  "data": {
    "tokenConvite": "409FD5F2FBC04E2F",
    "linkConvite": "https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F",
    "dataExpiracao": "2025-01-30T10:30:00-03:00"
  }
}

Passo 2: Responsável Compartilha Link

Passo 3: Corresponsável Clica no Link

Passo 4: App/Página Processa o Link

// App ou página web extrai o token do link (web ou deep link futuro)
void _handleLinkConvite(String link) {
  // link = "https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F"
  
  final uri = Uri.parse(link);
  final token = uri.pathSegments.last; // "409FD5F2FBC04E2F"
  
  // Salvar token
  SharedPreferences.getInstance().then((prefs) {
    prefs.setString('tokenConvite', token);
  });
  
  // Navegar para cadastro
  Navigator.pushNamed(context, '/cadastro');
}

Passo 5: App Verifica Token

GET /api/autenticacao/verificar-token-convite/ABC123DEF456GHI789

Response:
{
  "success": true,
  "data": {
    "temConvitePendente": true,
    "atletaNome": "João Silva",
    "responsavelPrincipalNome": "Maria Silva",
    "emailPreenchido": "[email protected]",
    "telefonePreenchido": "11999999999",
    "cpfPreenchido": "12345678901"
  }
}

Passo 6: App Pré-preenche Campos

Passo 7: Usuário Completa Cadastro

POST /api/autenticacao/registrar-com-convite
{
  "userName": "joao.corresponsavel",
  "email": "[email protected]",
  "password": "MinhaSenh@123",
  "nome": "João Corresponsável",
  "cpf": "12345678901",
  "celular": "11999999999",
  "genero": "M",
  "dataNascimento": "1990-01-15T00:00:00Z",
  "aceiteReceberComunicado": true,
  "aceiteTermosLgpd": true,
  "status": true,
  "tokenConvite": "ABC123DEF456GHI789"
}

Passo 8: Sistema Vincula Automaticamente

Response:
{
  "success": true,
  "message": "Usuário registrado e vinculado como corresponsável",
  "data": {
    "usuario": {
      "id": "usuario-uuid-456",
      "nome": "João Corresponsável",
      "email": "[email protected]",
      "corresponsavel": true
    },
    "atletasVinculados": [
      {
        "id": "37b109a5-ba6a-463e-bd99-6b59fed9f487",
        "nome": "João Silva"
      }
    ],
    "mensagem": "Convite aceito com sucesso! Você agora é corresponsável pelos atletas vinculados."
  }
}

Passo 9: Usuário é Redirecionado


🎯 DETALHES TÉCNICOS - FASE 1: CRIAÇÃO DO CONVITE (Responsável Principal)

Backend - API 1: Criar Convite

Endpoint: POST /api/CoResponsavel/criar-convite
Autenticação: Bearer Token (usuário logado como responsável)

Request Body:

{
  "atletaIds": ["uuid-atleta-1", "uuid-atleta-2"],
  "email": "[email protected]",
  "telefone": "11999999999",
  "cpf": "12345678901",
  "observacoes": "Convite para ser corresponsável dos atletas João e Maria",
  "diasExpiracao": 2
}

Response:

{
  "success": true,
  "message": "Convite criado com sucesso",
  "data": {
    "id": "convite-uuid-123",
    "tokenConvite": "ABC123DEF456GHI789",
    "linkConvite": "https://cordenaai-dev-app.azurewebsites.net/registro-corresponsavel/409FD5F2FBC04E2F",
    "dataExpiracao": "2024-01-15T10:30:00Z",
    "atletaIds": ["uuid-atleta-1", "uuid-atleta-2"],
    "emailCorresponsavel": "[email protected]",
    "telefoneCorresponsavel": "11999999999",
    "cpfCorresponsavel": "12345678901",
    "status": "Pendente",
    "mensagem": "Convite criado com sucesso"
  }
}

🎯 FASE 2: RECEPÇÃO E CADASTRO (Corresponsável)

Backend - API 2: Verificar Token do Convite (SEGURA)

Endpoint: GET /api/autenticacao/verificar-token-convite/{tokenConvite}
Autenticação: Não requerida (AllowAnonymous)

Request:

GET /api/autenticacao/verificar-token-convite/ABC123DEF456GHI789

Response (Convite Válido):

{
  "success": true,
  "data": {
    "temConvitePendente": true,
    "convites": [
      {
        "id": "convite-uuid-123",
        "atletaId": "uuid-atleta-1",
        "atletaNome": "João Silva",
        "responsavelPrincipalNome": "Maria Silva",
        "dataExpiracao": "2024-01-15T10:30:00Z",
        "observacoes": "Convite para ser corresponsável dos atletas João e Maria"
      },
      {
        "id": "convite-uuid-456",
        "atletaId": "uuid-atleta-2",
        "atletaNome": "Maria Santos",
        "responsavelPrincipalNome": "Maria Silva",
        "dataExpiracao": "2024-01-15T10:30:00Z",
        "observacoes": "Convite para ser corresponsável dos atletas João e Maria"
      }
    ],
    "emailPreenchido": "[email protected]",
    "telefonePreenchido": "11999999999",
    "cpfPreenchido": "12345678901"
  }
}

Response (Convite Inválido/Expirado):

{
  "success": true,
  "data": {
    "temConvitePendente": false,
    "convites": [],
    "mensagem": "Convite expirado"
  }
}

Backend - API 3: Registro com Convite (SEGURA)

Endpoint: POST /api/autenticacao/registrar-com-convite
Autenticação: Não requerida (AllowAnonymous)

Request Body:

{
  "userName": "corresponsavel123",
  "email": "[email protected]",
  "password": "MinhaSenh@123",
  "nome": "João Corresponsável",
  "nomeSocial": "João",
  "cpf": "12345678901",
  "celular": "11999999999",
  "genero": "M",
  "dataNascimento": "1990-01-15T00:00:00Z",
  "aceiteReceberComunicado": true,
  "aceiteTermosLgpd": true,
  "status": true,
  "tokenConvite": "ABC123DEF456GHI789"
}

Response (Com Convite Pendente):

{
  "success": true,
  "message": "Usuário registrado e vinculado como corresponsável",
  "data": {
    "id": "usuario-uuid-456",
    "nome": "João Corresponsável",
    "email": "[email protected]",
    "cpf": "12345678901",
    "celular": "11999999999",
    "corresponsavel": true,
    "dataCadastro": "2024-01-08T10:30:00Z"
  }
}

Response (Sem Convite Pendente):

{
  "success": true,
  "message": "Usuário registrado com sucesso",
  "data": {
    "id": "usuario-uuid-456",
    "nome": "João Corresponsável",
    "email": "[email protected]",
    "cpf": "12345678901",
    "celular": "11999999999",
    "corresponsavel": false,
    "dataCadastro": "2024-01-08T10:30:00Z"
  }
}
class CadastroCorresponsavelScreen extends StatefulWidget {

🎯 PONTOS IMPORTANTES

Automatização:

Flexibilidade:

Segurança:

Limpeza Automática:


Este é o fluxo completo e detalhado da funcionalidade de co-responsabilidade!


Versão: 1.0
Última Atualização: Outubro de 2025
Responsável: Equipe de Desenvolvimento CordenaAi