Negócio

Usuarios

Perfis de acesso, fluxos de cadastro, verificacao de email, consultores e exclusao de conta (LGPD).

Usuarios

O sistema possui 4 perfis de usuario, cada um com fluxo de cadastro e funcionalidades distintas.

Perfis de Acesso

PerfilCampo profileDescricao
ProdutorproducerProdutor rural que cria cotacoes para compra de insumos
FornecedorsupplierRevendedor de insumos que participa de cotacoes enviando propostas
ConsultorconsultantProfissional vinculado a produtores, age em nome deles
AdministradoradminGerencia 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

CampoTipoDescricao
namestringNome completo
emailstringEmail (unico)
documentstringCPF ou CNPJ
celularstringTelefone/WhatsApp
passwordhashedSenha (pode ser null no Step 1)
profilestringPerfil: producer, supplier, consultant, admin
statusbooleanAtivo/inativo
email_verified_atdatetimeData de verificacao do email
terms_accepted_atdatetimeData de aceite dos termos
terms_versionintegerVersao dos termos aceitos
consultant_activated_atdatetimeData de ativacao do consultor
email_verification_codestringCodigo de verificacao pendente
email_verification_expires_atdatetimeExpiracao 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
  • Email

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 ProducerProfile automaticamente
  • Retorna token de autenticacao (login automatico)

Perfil do Produtor (ProducerProfile)

Tabela producer_profiles com campos:

CampoTipoDescricao
user_idFKVinculo com User
planted_areadecimal(2)Area plantada em hectares
association_namestringNome da associacao
producer_cooperative_namestringNome da cooperativa de producao
credit_cooperative_namestringNome 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
  • Email
  • Telefone

Step 2 -- Senha e Ativacao

POST /api/v1/register/supplier/step2

Recebe supplier_id e senha. Cria:

  1. User com profile=supplier
  2. Vincula o Supplier ao User (supplier.user_id)
  3. Cria UserAccess com access_type_id=2 (fornecedor)
  4. Notifica administradores
  5. Retorna token (login automatico)

Perfil do Fornecedor (Supplier)

Tabela suppliers com campos:

CampoTipoDescricao
user_idFKVinculo com User
cnpjstringCNPJ da empresa
nomestringRazao social
emailstringEmail da empresa
telefonestringTelefone
sitestringWebsite
statusbooleanAtivo/inativo
email_verified_atdatetimeVerificacao 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:

  1. POST /api/v1/supplier/verification/send -- gera codigo e envia por email
  2. POST /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

CampoTipoDescricao
consultant_user_idFKConsultor convidado
token_hashstringHash SHA-256 do token
invited_by_user_idFKQuem convidou
expires_atdatetimeExpiracao (48 horas)
used_atdatetimeData de uso

Fluxo de Ativacao

  1. Um produtor ou admin convida o consultor
  2. O sistema cria um User com profile=consultant e consultant_activated_at=null
  3. Gera um token de 64 caracteres via ConsultantActivationToken::issue()
  4. Envia link de ativacao por email
  5. O consultor acessa o link, define sua senha
  6. O campo consultant_activated_at e preenchido

Tokens anteriores nao utilizados sao invalidados ao emitir um novo.

CampoTipoDescricao
consultant_user_idFKConsultor
producer_user_idFKProdutor
statusstringStatus: active, revoked
permissionsJSONPermissoes especificas
invited_by_user_idFKQuem criou o vinculo
accepted_atdatetimeData de aceite
revoked_atdatetimeData 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_at preenchido
  • 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 atual
  • isOnTrial() -- verifica se esta em periodo de teste
  • isSubscriptionActive() -- verifica se assinatura esta ativa
  • hasFeature(key) -- verifica acesso a feature booleana
  • getLimit(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 usuario
  • reputationPoints() -- historico de pontos
  • getTotalReputationPoints() -- total acumulado

Exclusao de Conta (LGPD)

O sistema permite que o usuario exclua sua propria conta em conformidade com a LGPD.

Fluxo de Exclusao

  1. Solicitar exclusao -- POST /api/v1/account/request-deletion
    • Gera codigo de 6 digitos
    • Envia email de confirmacao
    • Codigo expira em 30 minutos
  2. 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:

AcaoDetalhe
Anonimizar UserNome vira "Usuario Removido #ID", email vira removed_ID@deleted.agrsis.com, document e celular viram null
Anonimizar SupplierSe existir, mesma logica de anonimizacao
Revogar tokensTodos os tokens Sanctum sao deletados
Cancelar cotacoes ativasOrders com status published sao canceladas
Cancelar propostas ativasProposals com status submitted sao canceladas
Desativar assinaturaauto_renew=false, status=cancelled
Desvincular consultoresLinks consultor-produtor sao revogados
Registrar auditoriaEvento 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.

Copyright © 2026