Usuarios
Usuarios
O sistema possui 4 perfis de usuario, cada um com fluxo de cadastro e funcionalidades distintas.
Perfis de Acesso
| Perfil | Campo profile | Descricao |
|---|---|---|
| Produtor | producer | Produtor rural que cria cotacoes para compra de insumos |
| Fornecedor | supplier | Revendedor de insumos que participa de cotacoes enviando propostas |
| Consultor | consultant | Profissional vinculado a produtores, age em nome deles |
| Administrador | admin | Gerencia a plataforma, usuarios e configuracoes |
Model User
O model User (App\Models\User) utiliza:
- Laravel Sanctum para autenticacao via token de API
- SoftDeletes para exclusao logica (LGPD)
- Notifiable para envio de notificacoes
Campos principais
| Campo | Tipo | Descricao |
|---|---|---|
name | string | Nome completo |
email | string | Email (unico) |
document | string | CPF ou CNPJ |
celular | string | Telefone/WhatsApp |
password | hashed | Senha (pode ser null no Step 1) |
profile | string | Perfil: producer, supplier, consultant, admin |
status | boolean | Ativo/inativo |
email_verified_at | datetime | Data de verificacao do email |
terms_accepted_at | datetime | Data de aceite dos termos |
terms_version | integer | Versao dos termos aceitos |
consultant_activated_at | datetime | Data de ativacao do consultor |
email_verification_code | string | Codigo de verificacao pendente |
email_verification_expires_at | datetime | Expiracao do codigo |
Cadastro de Produtor
O cadastro do produtor e feito em 2 etapas:
Step 1 -- Captura de Lead
POST /api/v1/register/step1
Cria o User com status=false (inativo) e sem senha. Dados capturados:
- Tipo de pessoa (PF/PJ)
- CPF ou CNPJ
- Nome completo
- Telefone
O usuario fica inativo ate completar o Step 2.
Step 2 -- Definicao de Senha
POST /api/v1/register/step2
Busca o User pelo email, define a senha, aceita os termos e ativa a conta (status=true).
Apos conclusao:
- Atribui plano trial padrao via
SubscriptionService::assignDefaultPlan() - Notifica administradores via
NotificationService::notifyAdminProducerRegistered() - Cria
ProducerProfileautomaticamente - Retorna token de autenticacao (login automatico)
Perfil do Produtor (ProducerProfile)
Tabela producer_profiles com campos:
| Campo | Tipo | Descricao |
|---|---|---|
user_id | FK | Vinculo com User |
planted_area | decimal(2) | Area plantada em hectares |
association_name | string | Nome da associacao |
producer_cooperative_name | string | Nome da cooperativa de producao |
credit_cooperative_name | string | Nome da cooperativa de credito |
Culturas do produtor -- tabela pivot producer_plantation_cultures vincula o ProducerProfile a multiplas PlantationCulture (soja, milho, cafe, etc.).
Enderecos -- usa trait HasAddresses com relacionamento polimorfico na tabela addresses.
Referencias -- o produtor pode ter referencias pessoais, comerciais e financeiras via model CustomerReference (tipos: personal, commercial, financial).
Perfil completo -- o metodo hasCompleteProfile() verifica se o produtor tem pelo menos 1 endereco, 1 cultura e area plantada > 0.
Cadastro de Fornecedor
O cadastro do fornecedor tambem e feito em 2 etapas:
Step 1 -- Dados da Empresa
POST /api/v1/register/supplier/step1
Cria o registro Supplier como lead (sem User vinculado):
- CNPJ
- Nome/Razao Social
- Telefone
Step 2 -- Senha e Ativacao
POST /api/v1/register/supplier/step2
Recebe supplier_id e senha. Cria:
- User com
profile=supplier - Vincula o Supplier ao User (
supplier.user_id) - Cria UserAccess com
access_type_id=2(fornecedor) - Notifica administradores
- Retorna token (login automatico)
Perfil do Fornecedor (Supplier)
Tabela suppliers com campos:
| Campo | Tipo | Descricao |
|---|---|---|
user_id | FK | Vinculo com User |
cnpj | string | CNPJ da empresa |
nome | string | Razao social |
email | string | Email da empresa |
telefone | string | Telefone |
site | string | Website |
status | boolean | Ativo/inativo |
email_verified_at | datetime | Verificacao de email |
Enderecos -- usa trait HasAddresses (polimorfico). Suporta endereco principal, de entrega e de cobranca.
Estados de atuacao -- tabela pivot supplier_states vincula o fornecedor aos estados onde atua.
Cidades de atuacao -- tabela pivot supplier_state_cities para granularidade por cidade.
Tipos de produto -- tabela pivot supplier_product_types define quais categorias de insumo o fornecedor trabalha (Defensivos, Fertilizantes, Sementes, Adjuvantes, Bioinsumos).
Gerentes -- tabela pivot supplier_managers vincula gerentes ao fornecedor.
Verificacao de Email
O sistema possui verificacao de email por codigo de 6 digitos, especifico para fornecedores:
POST /api/v1/supplier/verification/send-- gera codigo e envia por emailPOST /api/v1/supplier/verification/verify-- valida o codigo
Regras:
- Codigo expira em 30 minutos
- Cooldown de 1 minuto entre solicitacoes
- Limite de tentativas por codigo
- Apos verificacao, atualiza
supplier.email_verified_at
Consultores
Consultores sao profissionais que atuam em nome de produtores. O fluxo de ativacao utiliza tokens:
Model ConsultantActivationToken
| Campo | Tipo | Descricao |
|---|---|---|
consultant_user_id | FK | Consultor convidado |
token_hash | string | Hash SHA-256 do token |
invited_by_user_id | FK | Quem convidou |
expires_at | datetime | Expiracao (48 horas) |
used_at | datetime | Data de uso |
Fluxo de Ativacao
- Um produtor ou admin convida o consultor
- O sistema cria um User com
profile=consultanteconsultant_activated_at=null - Gera um token de 64 caracteres via
ConsultantActivationToken::issue() - Envia link de ativacao por email
- O consultor acessa o link, define sua senha
- O campo
consultant_activated_ate preenchido
Tokens anteriores nao utilizados sao invalidados ao emitir um novo.
Vinculo Consultor-Produtor (ConsultantProducerLink)
| Campo | Tipo | Descricao |
|---|---|---|
consultant_user_id | FK | Consultor |
producer_user_id | FK | Produtor |
status | string | Status: active, revoked |
permissions | JSON | Permissoes especificas |
invited_by_user_id | FK | Quem criou o vinculo |
accepted_at | datetime | Data de aceite |
revoked_at | datetime | Data de revogacao |
No login, o sistema retorna acting_producers com a lista de produtores vinculados ao consultor, incluindo permissoes.
Login
POST /api/v1/login
O sistema identifica o portal de origem (producer, supplier, admin, consultant) automaticamente pela URL de origem ou pelo campo user_type. Se o profile do usuario nao corresponde ao portal, o login e recusado.
Validacoes no login:
- Usuario deve existir e estar ativo (
status=true) - Consultor deve ter
consultant_activated_atpreenchido - Usuario deve ter senha definida (conta ativada)
- Senha deve ser valida
- Perfil deve ser compativel com o portal
Assinatura e Planos
O User possui relacionamento com UserSubscription (via subscription()) e metodos para verificar acesso:
currentPlan()-- retorna o plano atualisOnTrial()-- verifica se esta em periodo de testeisSubscriptionActive()-- verifica se assinatura esta ativahasFeature(key)-- verifica acesso a feature booleanagetLimit(key)-- retorna limite numerico de feature (-1 = ilimitado)canUse(key, currentUsage?)-- verifica se pode usar recurso (boolean ou limite)
Reputacao
O User possui sistema de reputacao:
reviewsGiven()-- avaliacoes feitas pelo usuarioreputationPoints()-- historico de pontosgetTotalReputationPoints()-- total acumulado
Exclusao de Conta (LGPD)
O sistema permite que o usuario exclua sua propria conta em conformidade com a LGPD.
Fluxo de Exclusao
- Solicitar exclusao --
POST /api/v1/account/request-deletion- Gera codigo de 6 digitos
- Envia email de confirmacao
- Codigo expira em 30 minutos
- Confirmar exclusao --
POST /api/v1/account/confirm-deletion- Valida codigo (max 3 tentativas)
- O usuario pode informar um motivo (opcional, max 500 caracteres)
Anonimizacao
Ao confirmar, o sistema executa dentro de uma transacao:
| Acao | Detalhe |
|---|---|
| Anonimizar User | Nome vira "Usuario Removido #ID", email vira removed_ID@deleted.agrsis.com, document e celular viram null |
| Anonimizar Supplier | Se existir, mesma logica de anonimizacao |
| Revogar tokens | Todos os tokens Sanctum sao deletados |
| Cancelar cotacoes ativas | Orders com status published sao canceladas |
| Cancelar propostas ativas | Proposals com status submitted sao canceladas |
| Desativar assinatura | auto_renew=false, status=cancelled |
| Desvincular consultores | Links consultor-produtor sao revogados |
| Registrar auditoria | Evento ACCOUNT_DELETED com hash do email original e motivo |
Antes da anonimizacao, um email de confirmacao e enviado ao endereco original informando que a conta foi excluida e que dados estatisticos serao mantidos de forma anonimizada.