Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
@Tag(name = "Onboarding", description = "Fluxo de entrada de administradores e criação de empresas")
public interface OnboardingOpenapi {
@Operation(summary = "Verifica a empresa e inicia o onboarding do gestor")
@ApiResponse(responseCode = "200", description = "Empresa identificada ou próxima etapa liberada", content = @Content(schema = @Schema(implementation = OnboardingResponseDTO.class)))
@ApiResponse(responseCode = "200", description = "Empresa identificada, orientação para solicitar convite a um ADMIN ativo ou próxima etapa liberada", content = @Content(schema = @Schema(implementation = OnboardingResponseDTO.class)))
@ApiAuthenticationResponses
@ApiBadRequestResponse
@ApiConflictResponse
Expand All @@ -32,4 +32,4 @@ public interface OnboardingOpenapi {
@ApiConflictResponse
ResponseEntity<OnboardingResponseDTO> cadastrarEmpresa(@Parameter(hidden = true) FirebaseIdentity identity, @RequestBody(description = "Dados do gestor, empresa e endereço principal", required = true, content = @Content(schema = @Schema(implementation = OnboardingRequestDTO.class))) OnboardingRequestDTO dto);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ default OnboardingResponseDTO toResponse(Usuario usuario, boolean empresaExisten
dados.statusEmpresa(),
dados.idUsuario(),
dados.tipoUsuario(),
dados.statusUsuario());
dados.statusUsuario(),
null);
}

default OnboardingResponseDTO solicitarDadosEmpresa() {
return new OnboardingResponseDTO(false, false, true, null, null, null, null, null);
return new OnboardingResponseDTO(false, false, true, null, null, null, null, null, null);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public record OnboardingResponseDTO(
StatusGeral statusEmpresa,
Long idUsuario,
TipoUsuario tipoUsuario,
StatusGeral statusUsuario
StatusGeral statusUsuario,
String mensagem
) {
}
}
42 changes: 3 additions & 39 deletions src/main/java/br/com/acta/service/OnboardingService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package br.com.acta.service;

import br.com.acta.common.client.BrevoClient;
import br.com.acta.common.config.firebase.FirebaseAuthFilter.FirebaseIdentity;
import br.com.acta.common.handler.exception.BusinessRuleException;
import br.com.acta.common.handler.exception.FirebaseAccessRevokedException;
import br.com.acta.common.handler.exception.RegexException;
import br.com.acta.common.handler.exception.UniqueViolationException;
import br.com.acta.common.utils.TokenUtils;
import br.com.acta.dto.core.colaborador.ColaboradorMapper;
import br.com.acta.dto.core.colaborador.ColaboradorRequestDTO;
import br.com.acta.dto.core.contato.email.EmailRequestDTO;
Expand All @@ -21,13 +18,11 @@
import br.com.acta.dto.core.usuario.UsuarioMapper;
import br.com.acta.dto.core.usuario.UsuarioRequestDTO;
import br.com.acta.entity.core.Colaborador;
import br.com.acta.entity.core.Convite;
import br.com.acta.entity.core.Empresa;
import br.com.acta.entity.core.Usuario;
import br.com.acta.entity.enums.StatusGeral;
import br.com.acta.entity.enums.TipoUsuario;
import br.com.acta.repository.padrao.ColaboradorRepository;
import br.com.acta.repository.padrao.ConviteRepository;
import br.com.acta.repository.padrao.EmpresaRepository;
import br.com.acta.repository.padrao.UsuarioRepository;
import br.com.caelum.stella.validation.CNPJValidator;
Expand All @@ -38,23 +33,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.OffsetDateTime;
import java.util.List;

@Service
@RequiredArgsConstructor
public class OnboardingService {
private static final int VALIDADE_CONVITE_MINUTOS = 30;

private final EmpresaRepository empresaRepo;
private final UsuarioRepository usuarioRepo;
private final ColaboradorRepository colaboradorRepo;
private final ConviteRepository conviteRepo;
private final EmpresaMapper empresaMapper;
private final ColaboradorMapper colaboradorMapper;
private final UsuarioMapper usuarioMapper;
private final OnboardingMapper onboardingMapper;
private final BrevoClient brevoClient;
private final CNPJValidator cnpjValidator = new CNPJValidator();

@PersistenceContext
Expand All @@ -74,34 +64,8 @@ public OnboardingResponseDTO iniciar(FirebaseIdentity identity, OnboardingInicio
Empresa empresa = empresaRepo.findByCnpj(dto.cnpj()).orElse(null);
if (empresa == null) return onboardingMapper.solicitarDadosEmpresa();

// Empresas pendentes não têm administrador ativo para um convite
if (empresa.getStatus() == StatusGeral.PENDENTE) {
return new OnboardingResponseDTO(true, false, false, empresa.getId(), empresa.getStatus(), null, null, null);
}

Usuario criadoPor = usuarioRepo.findByTipoAndStatusAndEmpresaId(TipoUsuario.ADMIN, StatusGeral.ATIVO, empresa.getId())
.stream()
.findFirst()
.orElseThrow(() -> new BusinessRuleException("A empresa não possui um administrador ativo"));

Usuario usuario = criarUsuario(dto.gestor(), identity.email(), empresa, null, StatusGeral.PENDENTE);
Colaborador colaborador = criarColaborador(dto.gestor(), identity.email(), empresa, usuario, StatusGeral.PENDENTE);
usuario.setColaborador(colaborador);

String codigo = TokenUtils.gerarCodigo();
Convite convite = new Convite();
convite.setUsuario(usuario);
convite.setEmailDestino(usuario.getEmailLogin());
convite.setTokenHash(TokenUtils.hashToken(codigo));
convite.setStatus("PENDENTE");
convite.setExpiraEm(OffsetDateTime.now().plusMinutes(VALIDADE_CONVITE_MINUTOS));
convite.setCriadoPor(criadoPor);
Convite conviteSalvo = conviteRepo.save(convite);

conviteRepo.flush();
brevoClient.enviarConviteAdmin(conviteSalvo.getEmailDestino(), usuario.getNome(), empresa.getNome(), conviteSalvo.getExpiraEm(), codigo);

return onboardingMapper.toResponse(usuario, true, true, false);
return new OnboardingResponseDTO(true, false, false, empresa.getId(), empresa.getStatus(), null, null, null,
"Esta empresa já possui cadastro. Peça a um ADMIN ativo da empresa para convidar você.");
}

@PreAuthorize("hasAuthority('ROLE_FIREBASE')")
Expand Down Expand Up @@ -183,4 +147,4 @@ private Colaborador criarColaborador(OnboardingRequestDTO.Gestor gestor, String
colaborador.setUsuario(usuario);
return colaboradorRepo.save(colaborador);
}
}
}
Loading