diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/CompanyController.java b/src/main/java/br/edu/utfpr/servicebook/controller/CompanyController.java index 59b65f23..ce1aa3a3 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/CompanyController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/CompanyController.java @@ -6,6 +6,7 @@ import br.edu.utfpr.servicebook.model.entity.*; import br.edu.utfpr.servicebook.model.mapper.*; import br.edu.utfpr.servicebook.security.IAuthentication; +import br.edu.utfpr.servicebook.security.ProfileEnum; import br.edu.utfpr.servicebook.security.RoleType; import br.edu.utfpr.servicebook.service.*; import br.edu.utfpr.servicebook.sse.EventSSE; @@ -23,16 +24,19 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.annotation.security.RolesAllowed; import javax.persistence.EntityNotFoundException; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -98,6 +102,8 @@ public class CompanyController { @Autowired private PaginationUtil paginationUtil; + @Autowired + private IndividualService individualService; @GetMapping @RolesAllowed({RoleType.COMPANY}) @@ -154,8 +160,7 @@ public ModelAndView newProfessional(@RequestParam(required = false, defaultValue Optional oProfessionalFollowingAmount = followsService.countByProfessional(oProfessional.get()); professionalDTO.setFollowingAmount(oProfessionalFollowingAmount.get()); UserTemplateInfo individualInfo = templateUtil.getUserInfo(professionalDTO); - UserTemplateStatisticInfo statisticInfo = templateUtil.getProfessionalStatisticInfo(oProfessional.get(), expertiseId.get()); - mv.addObject("userInfo", individualInfo); + mv.addObject("individualInfo", individualInfo); List professionalExpertises = professionalExpertiseService.findByProfessional(oProfessional.get()); List expertiseDTOs = professionalExpertises.stream() @@ -172,12 +177,22 @@ public ModelAndView newProfessional(@RequestParam(required = false, defaultValue .collect(Collectors.toList()); UserDTO professionalDTO1 = userMapper.toDto(oProfessional.get()); + List users = userService.findProfessionalsNotExist(); + + List professionPage = userService.findProfessionalsNotExist(); + + List professionDTOs = professionPage.stream() + .map(s -> userMapper.toDto(s)) + .collect(Collectors.toList()); + mv.addObject("eventsse", eventSSEDTOs); - mv.addObject("expertises", expertiseDTOs); - mv.addObject("userInfo", individualInfo); +// mv.addObject("expertises", professionDTOs); + mv.addObject("individualInfo", individualInfo); mv.addObject("professionalDTO1", professionalDTO1); - mv.addObject("statisticInfo", statisticInfo); + mv.addObject("cities", users); mv.addObject("company", true); + mv.addObject("expertises", expertiseDTOs); + return mv; } diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/CompanyProfessionalController.java b/src/main/java/br/edu/utfpr/servicebook/controller/CompanyProfessionalController.java new file mode 100644 index 00000000..7bbe61fb --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/controller/CompanyProfessionalController.java @@ -0,0 +1,232 @@ +package br.edu.utfpr.servicebook.controller; + +import br.edu.utfpr.servicebook.model.dto.*; +import br.edu.utfpr.servicebook.model.entity.*; +import br.edu.utfpr.servicebook.model.mapper.*; +import br.edu.utfpr.servicebook.model.repository.UserRepository; +import br.edu.utfpr.servicebook.security.IAuthentication; +import br.edu.utfpr.servicebook.security.RoleType; +import br.edu.utfpr.servicebook.service.*; +import br.edu.utfpr.servicebook.sse.EventSSE; +import br.edu.utfpr.servicebook.sse.EventSSEDTO; +import br.edu.utfpr.servicebook.sse.EventSseMapper; +import br.edu.utfpr.servicebook.sse.SSEService; +import br.edu.utfpr.servicebook.util.TemplateUtil; +import br.edu.utfpr.servicebook.util.UserTemplateInfo; +import br.edu.utfpr.servicebook.util.UserTemplateStatisticInfo; +import com.cloudinary.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.annotation.security.RolesAllowed; +import javax.persistence.EntityNotFoundException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.validation.Valid; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; +@RequestMapping("/minha-conta/empresa/profissionais") +@Controller +public class CompanyProfessionalController { + public static final Logger log = LoggerFactory.getLogger(CompanyProfessionalController.class); + @Autowired + private UserService userService; + + @Autowired + private CompanyProfessionalService companyProfessionalService; + + @Autowired + private IAuthentication authentication; + + @Autowired + private UserMapper userMapper; + + @Autowired + private CompanyProfessionalMapper companyProfessionalMapper; + + @Autowired + private TemplateUtil templateUtil; + + @Autowired + private UserRepository userRepository; + + @Autowired + private QuartzService quartzService; + + @Autowired + private UserCodeMapper userCodeMapper; + + @Autowired + private UserCodeService userCodeService; + + @Autowired + private UserTokenMapper userTokenMapper; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private StateService stateService; + + @Autowired + private SSEService sseService; + + @Autowired + private EventSseMapper eventSseMapper; + @Autowired + private ProfessionalExpertiseService professionalExpertiseService; + @Autowired + private ExpertiseService expertiseService; + + @Autowired + private ExpertiseMapper expertiseMapper; + + /** + * Apresenta a tela para a empresa adicionar profissionais. + * @param id + * @return + * @throws Exception + */ + @GetMapping() + @RolesAllowed({RoleType.COMPANY}) + public ModelAndView showProfessionals(@RequestParam(required = false, defaultValue = "0") Optional expertiseId) throws Exception { + + User company = this.getCompany(); + UserDTO professionalMinDTO = userMapper.toDto(company); + + ModelAndView mv = new ModelAndView("company/new-professional"); + + UserTemplateInfo userTemplateInfo = templateUtil.getUserInfo(professionalMinDTO); + UserTemplateStatisticInfo sidePanelStatisticDTO = templateUtil.getCompanyStatisticInfo(company, expertiseId.get()); + + mv.addObject("statisticInfo", sidePanelStatisticDTO); + + mv.addObject("id", expertiseId.orElse(0L)); + + List professionals = userService.findProfessionalsNotExist(); + + List companyProfessionals = companyProfessionalService.findByCompany(company.getId()); + + List companyProfessionalDTO2s = companyProfessionals.stream() + .map(s -> companyProfessionalMapper.toResponseDTO(s)) + .collect(Collectors.toList()); + + Optional oProfessional = (userService.findByEmail(authentication.getEmail())); + + UserTemplateInfo individualInfo = templateUtil.getUserInfo(professionalMinDTO); + + //envia a notificação ao usuário + List eventSsesList = sseService.findPendingEventsByEmail(authentication.getEmail()); + List eventSSEDTOs = eventSsesList.stream() + .map(eventSse -> { + return eventSseMapper.toFullDto(eventSse); + }) + .collect(Collectors.toList()); + List professionalExpertises = professionalExpertiseService.findByProfessional(oProfessional.get()); + + List expertiseDTOs = professionalExpertises.stream() + .map(professionalExpertise -> professionalExpertise.getExpertise()) + .map(expertise -> expertiseMapper.toDto(expertise)) + .collect(Collectors.toList()); + + + mv.addObject("professionals", professionals); + mv.addObject("professionalCompanies", companyProfessionalDTO2s); + mv.addObject("statisticInfo", sidePanelStatisticDTO); + mv.addObject("eventsse", eventSSEDTOs); + mv.addObject("expertises", expertiseDTOs); + mv.addObject("company", true); + + return mv; + } + + @PostMapping() + @RolesAllowed({RoleType.COMPANY}) + public ModelAndView saveProfessionals(@Valid CompanyProfessionalDTO dto, BindingResult errors, RedirectAttributes redirectAttributes) throws Exception { + + ModelAndView mv = new ModelAndView("redirect:profissionais"); + String ids = dto.getIds(); + User company = this.getCompany(); + Optional company_name = userService.findById(company.getId()); + Optional oCompany = (userService.findByEmail(authentication.getEmail())); + + Optional oProfessional = userService.findByEmail(ids); + if(!oProfessional.isPresent()){ + Random random = new Random(); + int numberRandom = random.nextInt(100 - 1) + 1; + + String token = "RP0"+company.getId()+numberRandom; + UserTokenDTO userTokenDTO = new UserTokenDTO(); + userTokenDTO.setUser(company); + userTokenDTO.setEmail(ids); + userTokenDTO.setToken(token); + UserToken userToken = userTokenMapper.toEntity(userTokenDTO); + + userTokenService.save(userToken); + + String tokenLink = ServletUriComponentsBuilder.fromCurrentContextPath().build().toString() + + "/cadastrar-se?passo-1&code="+token; + + quartzService.sendEmailToRegisterUser(dto.getIds(), company.getName(), tokenLink); + Optional optionalUserToken = userTokenService.findByEmail(ids); + +// CompanyProfessional p = companyProfessionalService.save(new CompanyProfessional(company, dto.getIds())); +// redirectAttributes.addFlashAttribute("msg", "Convite enviado para usuário, aguardando confirmação!"); + + } else { + String tokenLink = ServletUriComponentsBuilder.fromCurrentContextPath().build().toString() + "/confirmar?empresa=" + company_name.get().getName() +"&email=" + dto.getIds(); + quartzService.sendEmailWithConfirmationUser(dto.getIds(), company.getName(), tokenLink); + + Optional optionalCompanyProfessional = companyProfessionalService.findByCompanyAndProfessional(company, oProfessional.get()); + + if(!optionalCompanyProfessional.isPresent()){ + CompanyProfessional p = companyProfessionalService.save(new CompanyProfessional(company, oProfessional.get(), false)); + redirectAttributes.addFlashAttribute("msg", "Convite enviado para usuário, aguardando confirmação!"); + } else { + redirectAttributes.addFlashAttribute("msg", "Usuário ja está na empresa!"); + } + } + return mv; + } + + @DeleteMapping("/{id}") + @RolesAllowed({RoleType.COMPANY}) + @Transactional + public String delete(@PathVariable User id, RedirectAttributes redirectAttributes) throws Exception { + User company = this.getCompany(); + Optional oProfessional = userService.findById(id.getId()); + + Optional optionalCompanyProfessional = companyProfessionalService.findByCompanyAndProfessional(company, oProfessional.get()); + + if (optionalCompanyProfessional.get().getProfessional().getId().equals(id.getId())) { + this.companyProfessionalService.delete(optionalCompanyProfessional.get().getId()); + } + return "redirect:/minha-conta/empresa/profissionais"; + } + + /** + * Retorna a empresa logado. + * @return + * @throws Exception + */ + private User getCompany() throws Exception { + Optional oCompany = (userService.findByEmail(authentication.getEmail())); + + if (!oCompany.isPresent()) { + throw new Exception("Opss! Não foi possivel encontrar seus dados, tente fazer login novamente"); + } + + return oCompany.get(); + } +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/IndexController.java b/src/main/java/br/edu/utfpr/servicebook/controller/IndexController.java index 355158b6..886d77d2 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/IndexController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/IndexController.java @@ -1,8 +1,10 @@ package br.edu.utfpr.servicebook.controller; import br.edu.utfpr.servicebook.model.entity.City; -import br.edu.utfpr.servicebook.model.entity.Company; +import br.edu.utfpr.servicebook.model.entity.CompanyProfessional; import br.edu.utfpr.servicebook.model.entity.User; +import br.edu.utfpr.servicebook.model.entity.UserToken; +import br.edu.utfpr.servicebook.model.mapper.UserTokenMapper; import br.edu.utfpr.servicebook.security.IAuthentication; import br.edu.utfpr.servicebook.service.*; @@ -13,9 +15,13 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.annotation.security.PermitAll; +import javax.persistence.EntityNotFoundException; +import javax.servlet.http.HttpSession; import java.util.List; import java.util.Optional; @@ -47,6 +53,14 @@ public class IndexController { @Autowired private IAuthentication authentication; + @Autowired + private CompanyProfessionalService companyProfessionalService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private UserTokenMapper userTokenMapper; @GetMapping @PermitAll public ModelAndView showIndexPage() { @@ -86,4 +100,40 @@ public String showHowWorks() { return "visitor/how-works"; } + @GetMapping("/confirmar") + @PermitAll + public ModelAndView saveProfessionalsConfirm( + @RequestParam(value = "code", required = false) String token, + HttpSession httpSession, + RedirectAttributes redirectAttributes + ) throws Exception{ + if(token != null){ + UserToken userToken = userTokenService.findByUserToken(token); + + Optional oProfessional = userService.findByEmail(userToken.getEmail()); + + if(!oProfessional.isPresent()){ + throw new EntityNotFoundException("O usuário não foi encontrado!"); + } + + User user_professional = oProfessional.get(); + user_professional.setConfirmed(true); + userService.save(user_professional); + + if(user_professional.isConfirmed()){ + Optional companyProfessional = companyProfessionalService.findByCompanyAndProfessional(userToken.getUser(), oProfessional.get()); + + CompanyProfessional companyProfessional1 = companyProfessional.get(); + companyProfessional1.setConfirmed(true); + companyProfessionalService.save(companyProfessional1); +// CompanyProfessional p = companyProfessionalService.save(new CompanyProfessional(userToken.getUser(), oProfessional.get())); + } + + redirectAttributes.addFlashAttribute("msg", "Você foi incluido na empresa com sucesso!"); + } else { + redirectAttributes.addFlashAttribute("msg", "Token não existe!"); + } + + return new ModelAndView("redirect:/"); + } } \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/MyAccountController.java b/src/main/java/br/edu/utfpr/servicebook/controller/MyAccountController.java index 1daf723b..81154d14 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/MyAccountController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/MyAccountController.java @@ -72,6 +72,10 @@ public class MyAccountController { @Autowired private TemplateUtil templateUtil; + + @Autowired + private CompanyProfessionalService companyProfessionalService; + @GetMapping public String home(HttpServletRequest request) { return "redirect:/minha-conta/cliente"; diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/ProfessionalExpertiseController.java b/src/main/java/br/edu/utfpr/servicebook/controller/ProfessionalExpertiseController.java index 4977a57b..63816b99 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/ProfessionalExpertiseController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/ProfessionalExpertiseController.java @@ -27,6 +27,7 @@ import javax.validation.Valid; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @RequestMapping("/minha-conta/profissional/especialidades") @@ -112,9 +113,10 @@ public ModelAndView showExpertises(@RequestParam(required = false, defaultValue @PostMapping() @RolesAllowed({RoleType.USER}) - public ModelAndView saveExpertises(@Valid List ids, BindingResult errors, RedirectAttributes redirectAttributes) throws Exception { + public ModelAndView saveExpertises(@Valid ProfessionalExpertiseDTO dto, BindingResult errors, RedirectAttributes redirectAttributes) throws Exception { ModelAndView mv = new ModelAndView("redirect:especialidades"); + Set ids = dto.getIds(); if (ids == null) { return mv; diff --git a/src/main/java/br/edu/utfpr/servicebook/controller/UserRegisterController.java b/src/main/java/br/edu/utfpr/servicebook/controller/UserRegisterController.java index c806442b..4923c049 100644 --- a/src/main/java/br/edu/utfpr/servicebook/controller/UserRegisterController.java +++ b/src/main/java/br/edu/utfpr/servicebook/controller/UserRegisterController.java @@ -101,6 +101,16 @@ public class UserRegisterController { @Autowired private ProfessionalExpertiseMapper professionalExpertiseMapper; + @Autowired + private UserTokenService userTokenService; + + @Autowired + private UserTokenMapper userTokenMapper; + + @Autowired + private CompanyProfessionalService companyProfessionalService; + + private String userRegistrationErrorForwarding(String step, UserDTO dto, Model model, BindingResult errors) { model.addAttribute("dto", dto); model.addAttribute("errors", errors.getAllErrors()); @@ -133,6 +143,7 @@ private String userAddressRegistrationErrorForwarding(String step, AddressDTO dt @PermitAll public String showUserRegistrationWizard( @RequestParam(value = "passo", required = false, defaultValue = "1") Long step, + @RequestParam(value = "code", required = false, defaultValue = "") String tokenCompany, HttpSession httpSession, Model model ) throws Exception{ @@ -141,6 +152,18 @@ public String showUserRegistrationWizard( step = 1L; } + if(tokenCompany != "" && step == 1){ + UserToken userToken = userTokenService.findByUserToken(tokenCompany); + if(userToken != null){ + model.addAttribute("emailProfessional", userToken.getEmail()); + UserTokenDTO userTokenDTO = (UserTokenDTO) userWizardUtil.getWizardState(httpSession, UserTokenDTO.class, UserWizardUtil.KEY_WIZARD_COMPANY_ID); + model.addAttribute("userTokenDTO", userTokenDTO); + userTokenDTO.setToken(tokenCompany); + userTokenDTO.setUser(userToken.getUser()); + userTokenDTO.setEmail(userToken.getEmail()); + } + } + if(step == 8){ List professionPage = expertiseService.findAll(); List expertiseDTOs = professionPage.stream() @@ -171,7 +194,6 @@ public String showUserRegistrationWizard( model.addAttribute("professionalExpertises", professionalExpertises); } } - return "visitor/user-registration/wizard-step-0" + step; } @@ -183,6 +205,7 @@ private void resetSessionAttributes(HttpSession httpSession) { userWizardUtil.removeWizardState(httpSession, UserWizardUtil.KEY_WIZARD_INDIVIDUAL); userWizardUtil.removeWizardState(httpSession, UserWizardUtil.KEY_EXPERTISES); userWizardUtil.removeWizardState(httpSession, UserWizardUtil.KEY_WIZARD_COMPANY); + userWizardUtil.removeWizardState(httpSession, UserWizardUtil.KEY_WIZARD_COMPANY_ID); } /** @@ -206,11 +229,11 @@ public String saveUserEmail( BindingResult errors, RedirectAttributes redirectAttributes, Model model - ) throws MessagingException { + ) throws MessagingException { - if(errors.hasErrors()) { - return this.userRegistrationErrorForwarding("1", dto, model, errors); - } +// if(errors.hasErrors()) { +// return this.userRegistrationErrorForwarding("1", dto, model, errors); +// } String email = dto.getEmail().trim(); httpSession.setAttribute(UserWizardUtil.KEY_IS_REGISTER_COMPANY, false); @@ -222,9 +245,9 @@ public String saveUserEmail( errors.rejectValue("email", "error.dto", "Email já cadastrado! Por favor, insira um email não cadastrado."); } - if (errors.hasErrors()) { - return this.userRegistrationErrorForwarding("1", dto, model, errors); - } +// if (errors.hasErrors()) { +// return this.userRegistrationErrorForwarding("1", dto, model, errors); +// } //gera um código para validar o email no passo seguinte Optional oUserCode = userCodeService.findByEmail(email); @@ -370,7 +393,6 @@ public String saveUserEmailCode( } userSessionDTO.setEmailVerified(true); - redirectAttributes.addFlashAttribute("msg", "Email verificado com sucesso!"); return "redirect:/cadastrar-se?passo=3"; @@ -394,6 +416,7 @@ public String saveUserPassword( RedirectAttributes redirectAttributes, Model model ) { + if (errors.hasErrors()) { return this.userRegistrationErrorForwarding("3", dto, model, errors); } @@ -410,6 +433,7 @@ public String saveUserPassword( userSessionDTO.setPassword(dto.getPassword()); userSessionDTO.setRepassword(dto.getRepassword()); + redirectAttributes.addFlashAttribute("msg", "Email verificado com sucesso!"); return "redirect:/cadastrar-se?passo=4"; } @@ -702,7 +726,7 @@ public String saveUser( IndividualDTO userSessionDTO = (IndividualDTO) userWizardUtil.getWizardState(httpSession, IndividualDTO.class, UserWizardUtil.KEY_WIZARD_INDIVIDUAL); validator.validate(userSessionDTO, errors, new Class[]{ - IndividualDTO.RequestUserEmailInfoGroupValidation.class, +// IndividualDTO.RequestUserEmailInfoGroupValidation.class, IndividualDTO.RequestUserPasswordInfoGroupValidation.class, IndividualDTO.RequestUserPhoneInfoGroupValidation.class, IndividualDTO.RequestUserNameAndCPFInfoGroupValidation.class, @@ -715,6 +739,7 @@ public String saveUser( Individual individual = individualMapper.toEntity(userSessionDTO); email = individual.getEmail(); + individual.setConfirmed(false); userService.save(individual); } @@ -738,6 +763,17 @@ public String saveUser( } } + UserTokenDTO userTokenDTO = (UserTokenDTO) userWizardUtil.getWizardState(httpSession, UserTokenDTO.class, UserWizardUtil.KEY_WIZARD_COMPANY_ID); + UserToken userTokenDTO1 = userTokenMapper.toEntity(userTokenDTO); + Optional userToken = userService.findById(userTokenDTO1.getUser().getId()); + + if(userToken.isPresent()){ + String tokenLink = ServletUriComponentsBuilder.fromCurrentContextPath().build().toString() + "/confirmar?code=" + userTokenDTO1.getToken(); + quartzService.sendEmailWithConfirmationUser(userTokenDTO1.getEmail(), userToken.get().getName(), tokenLink); + UserToken userToken1 = userTokenService.findByUserToken(userTokenDTO1.getToken()); + CompanyProfessional p = companyProfessionalService.save(new CompanyProfessional(userToken1.getUser(), oUser.get(), false)); + } + redirectAttributes.addFlashAttribute("msg", "Usuário cadastrado com sucesso! Realize o login no Servicebook!"); this.resetSessionAttributes(httpSession); diff --git a/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailToRegisterUser.java b/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailToRegisterUser.java new file mode 100644 index 00000000..88d9f357 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailToRegisterUser.java @@ -0,0 +1,39 @@ +package br.edu.utfpr.servicebook.jobs; + +import br.edu.utfpr.servicebook.service.EmailSenderService; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.mail.MessagingException; +@Component +public class SendEmailToRegisterUser implements Job { + public static final String RECIPIENT_KEY = "recipient"; + public static final String CODE_KEY = "token"; + public static final String LINK_KEY = "link"; + public static final String USER_KEY = "user"; + + @Autowired + private EmailSenderService emailSenderService; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + String email = (String) jobDataMap.get(SendEmailWithVerificationCodeJob.RECIPIENT_KEY); + String code = (String) jobDataMap.get(SendEmailWithVerificationCodeJob.CODE_KEY); + String company = (String) jobDataMap.get(SendEmailToRegisterUser.USER_KEY); + String link = (String) jobDataMap.get(SendEmailToAuthenticateJob.LINK_KEY); + + String text = "Olá

A empresa "+ company + ", deseja incluir você ao quadro de funcionários." + + "
Para isto é necessário realizar o cadastro na plataforma, você pode se cadastrar usando o link: " + link + ".

"; + + try { + emailSenderService.sendHTMLEmail(email, "Service Book", text); + } catch (MessagingException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailWithConfirmationUser.java b/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailWithConfirmationUser.java new file mode 100644 index 00000000..022fe679 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/jobs/SendEmailWithConfirmationUser.java @@ -0,0 +1,40 @@ +package br.edu.utfpr.servicebook.jobs; + +import br.edu.utfpr.servicebook.service.EmailSenderService; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.mail.MessagingException; + +@Component +public class SendEmailWithConfirmationUser implements Job { + public static final String RECIPIENT_KEY = "recipient"; + public static final String CODE_KEY = "token"; + public static final String LINK_KEY = "link"; + public static final String USER_KEY = "user"; + + @Autowired + private EmailSenderService emailSenderService; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + String email = (String) jobDataMap.get(SendEmailWithConfirmationUser.RECIPIENT_KEY); + String code = (String) jobDataMap.get(SendEmailWithConfirmationUser.CODE_KEY); + String link = (String) jobDataMap.get(SendEmailWithConfirmationUser.LINK_KEY); + String company = (String) jobDataMap.get(SendEmailWithConfirmationUser.USER_KEY); + + String text = "Olá " + "!

a empresa "+ company + ", deseja incluir você ao quadro de funcionários." + + " Se desejar fazer parte da empresa basta confirmar acessando o link: " + link + ".

"; + + try { + emailSenderService.sendHTMLEmail(email, "Service Book", text); + } catch (MessagingException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO.java new file mode 100644 index 00000000..98b1b639 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO.java @@ -0,0 +1,17 @@ +package br.edu.utfpr.servicebook.model.dto; + +import br.edu.utfpr.servicebook.util.IWizardDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CompanyProfessionalDTO implements IWizardDTO, Serializable { + private String ids; +// private Set ids = new HashSet<>(); +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO2.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO2.java new file mode 100644 index 00000000..058c575e --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/CompanyProfessionalDTO2.java @@ -0,0 +1,23 @@ +package br.edu.utfpr.servicebook.model.dto; + +import br.edu.utfpr.servicebook.model.entity.CompanyProfessionalPK; +import br.edu.utfpr.servicebook.util.IWizardDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class CompanyProfessionalDTO2 implements IWizardDTO, Serializable { + + private CompanyProfessionalPK id; + private String name; + private String email; + private String profilePicture; + private String isConfirmed; +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO.java index 28762b78..320260f7 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO.java @@ -58,6 +58,7 @@ public String getOnlyNumbersFromPhone() { protected boolean phoneVerified; protected boolean emailVerified; protected boolean profileVerified; + protected boolean isConfirmed; private String description; diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO2.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO2.java new file mode 100644 index 00000000..4fc04303 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserDTO2.java @@ -0,0 +1,19 @@ +package br.edu.utfpr.servicebook.model.dto; + +import br.edu.utfpr.servicebook.util.IWizardDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserDTO2 implements IWizardDTO, Serializable { + protected Long id; + + protected String name; + +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/dto/UserTokenDTO.java b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserTokenDTO.java new file mode 100644 index 00000000..bf2fc964 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/dto/UserTokenDTO.java @@ -0,0 +1,20 @@ +package br.edu.utfpr.servicebook.model.dto; + +import br.edu.utfpr.servicebook.model.entity.User; +import br.edu.utfpr.servicebook.util.IWizardDTO; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class UserTokenDTO implements IWizardDTO, Serializable { + private String token; + private String email; + private User user; + +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/Company.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/Company.java index 2d0b2f99..d421dd8f 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/entity/Company.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/Company.java @@ -4,7 +4,9 @@ import lombok.*; import javax.persistence.*; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @NoArgsConstructor @@ -23,6 +25,10 @@ public class Company extends User { @Column(nullable = false) private ProfileEnum profile; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + public Company(String name, String email, String password, String phoneNumber, String cnpj){ super(name, email, password, phoneNumber); setCnpj(cnpj); diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessional.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessional.java new file mode 100644 index 00000000..eb734dfd --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessional.java @@ -0,0 +1,56 @@ +package br.edu.utfpr.servicebook.model.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Cascade; + +import javax.persistence.*; + +/** + * Classe para armazenar as informações necessárias para a classe auxiliar n x n + */ +@Data +@NoArgsConstructor + +@Table(name = "company_professionals") +@Entity +public class CompanyProfessional { + + private static final long serialVersionUID = 1L; + + @EmbeddedId + private CompanyProfessionalPK id; + private Integer rating; + private boolean isConfirmed; + private String email; + + @ManyToOne() + @MapsId("professionalId") + @JoinColumn(name = "professional_id") + private User professional; + + @ManyToOne() + @MapsId("companyId") + @JoinColumn(name = "company_id") + private User company; + + public CompanyProfessional(User company, User professional, boolean isConfirmed){ + this.professional = professional; + this.company = company; + this.isConfirmed = isConfirmed; + this.id = new CompanyProfessionalPK(company.getId(), professional.getId()); + } + + public CompanyProfessional(User company, User professional){ + this.professional = professional; + this.company = company; + this.id = new CompanyProfessionalPK(company.getId(), professional.getId()); + } + + public CompanyProfessional(User company, String email){ + this.company = company; + this.email = email; + this.professional = professional; + this.id = new CompanyProfessionalPK(company.getId(), professional.getId()); + } +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessionalPK.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessionalPK.java new file mode 100644 index 00000000..b750a582 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/CompanyProfessionalPK.java @@ -0,0 +1,21 @@ +package br.edu.utfpr.servicebook.model.entity; + +import lombok.*; + +import javax.persistence.Embeddable; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import java.io.Serializable; + +/** + * Classe auxiliar para chave composta em um relacionamento n x n + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Embeddable +public class CompanyProfessionalPK implements Serializable { + + Long companyId; + Long professionalId; +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/User.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/User.java index 66e469cd..719d11ba 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/entity/User.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/User.java @@ -1,9 +1,7 @@ package br.edu.utfpr.servicebook.model.entity; import java.io.Serializable; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; +import java.util.*; import javax.persistence.*; @@ -68,6 +66,10 @@ public class User implements Serializable { protected String description; protected Integer denounceAmount; protected Long followsAmount; + protected boolean isConfirmed; + + public User(Long id, String name) { + } @PrePersist @PreUpdate diff --git a/src/main/java/br/edu/utfpr/servicebook/model/entity/UserToken.java b/src/main/java/br/edu/utfpr/servicebook/model/entity/UserToken.java index 7bc7a9e6..85d97362 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/entity/UserToken.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/entity/UserToken.java @@ -22,9 +22,8 @@ @RequiredArgsConstructor @Entity public class UserToken { - private static final long serialVersionUID = 1L; - + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -35,13 +34,14 @@ public class UserToken { private User user; @NonNull - @Column(unique = true) private String token; @NonNull private String type; - + + @NonNull + private String email; + @NonNull private Date expiredDate; - } diff --git a/src/main/java/br/edu/utfpr/servicebook/model/mapper/CompanyProfessionalMapper.java b/src/main/java/br/edu/utfpr/servicebook/model/mapper/CompanyProfessionalMapper.java new file mode 100644 index 00000000..9cdd9acb --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/mapper/CompanyProfessionalMapper.java @@ -0,0 +1,34 @@ +package br.edu.utfpr.servicebook.model.mapper; + +import br.edu.utfpr.servicebook.model.dto.CompanyProfessionalDTO; +import br.edu.utfpr.servicebook.model.dto.CompanyProfessionalDTO2; +import br.edu.utfpr.servicebook.model.dto.ProfessionalExpertiseDTO2; +import br.edu.utfpr.servicebook.model.entity.CompanyProfessional; +import br.edu.utfpr.servicebook.model.entity.ProfessionalExpertise; +import br.edu.utfpr.servicebook.model.entity.User; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component +public class CompanyProfessionalMapper { + @Autowired + private ModelMapper mapper; + public CompanyProfessionalDTO2 toDTO(User entity) { + return mapper.map(entity, CompanyProfessionalDTO2.class); + } + + public CompanyProfessionalDTO2 toResponseDTO(CompanyProfessional entity) { + CompanyProfessionalDTO2 dto = mapper.map(entity, CompanyProfessionalDTO2.class); + dto.setId(entity.getId()); + dto.setName(entity.getProfessional().getName()); + dto.setEmail(entity.getProfessional().getEmail()); + dto.setProfilePicture(entity.getProfessional().getProfilePicture()); +// dto.setConfirmed(entity.getProfessional().isConfirmed())); + dto.setIsConfirmed(String.valueOf(entity.isConfirmed())); + return dto; + } + + public CompanyProfessional toEntity(CompanyProfessionalDTO dto) { + return mapper.map(dto, CompanyProfessional.class); + } +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserMapper.java b/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserMapper.java index 816a3372..0c226ba6 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserMapper.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserMapper.java @@ -1,7 +1,9 @@ package br.edu.utfpr.servicebook.model.mapper; +import br.edu.utfpr.servicebook.model.dto.CompanyProfessionalDTO2; import br.edu.utfpr.servicebook.model.dto.UserDTO; +import br.edu.utfpr.servicebook.model.entity.CompanyProfessional; import br.edu.utfpr.servicebook.model.entity.User; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -23,4 +25,11 @@ public User toEntity(UserDTO dto) { return entity; } + public UserDTO toResponseDTO(User entity) { + UserDTO dto = mapper.map(entity, UserDTO.class); + dto.setId(entity.getId()); + dto.setName(entity.getName()); + return dto; + } + } diff --git a/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserTokenMapper.java b/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserTokenMapper.java new file mode 100644 index 00000000..d3768ef9 --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/mapper/UserTokenMapper.java @@ -0,0 +1,25 @@ +package br.edu.utfpr.servicebook.model.mapper; + +import br.edu.utfpr.servicebook.model.dto.UserCodeDTO; +import br.edu.utfpr.servicebook.model.dto.UserTokenDTO; +import br.edu.utfpr.servicebook.model.entity.UserCode; +import br.edu.utfpr.servicebook.model.entity.UserToken; +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class UserTokenMapper { + @Autowired + private ModelMapper mapper; + + public UserTokenDTO toDto(UserToken entity) { + UserTokenDTO dto = mapper.map(entity, UserTokenDTO.class); + return dto; + } + + public UserToken toEntity(UserTokenDTO dto) { + UserToken entity = mapper.map(dto, UserToken.class); + return entity; + } +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/repository/CompanyProfessionalRepository.java b/src/main/java/br/edu/utfpr/servicebook/model/repository/CompanyProfessionalRepository.java new file mode 100644 index 00000000..3021d1ed --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/repository/CompanyProfessionalRepository.java @@ -0,0 +1,56 @@ +package br.edu.utfpr.servicebook.model.repository; + +import br.edu.utfpr.servicebook.model.entity.*; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; +public interface CompanyProfessionalRepository extends JpaRepository { + + /** + * Retorna uma especialidade profissional, dado um profissional e sua especialidade + * + * @param user + * @param company + * @return Optional + */ + Optional findByProfessionalAndCompany(User company, User user); + + @Query("SELECT pe FROM CompanyProfessional pe WHERE pe.professional.id = :professional_id AND pe.company.id = :company_id") + Optional findByProfessionalAndCompany1(@Param("professional_id") Long professional_id, @Param("company_id") Long company_id); + + + @Query("select distinct p from User p left join CompanyProfessional pe on p.id = pe.professional.id where " + + "lower(p.name) like lower(concat('%', :term, '%'))" + + "or lower(p.email) like lower(concat('%', :term, '%')) " ) + List findDistinctByTermIgnoreCase(String term); + + List findByProfessional(User company); + + /** + * Retorna a avaliação da especialidade de um profissional + * + * @param professional_id + * @param company_id + * @return Optional + */ + @Query("SELECT pe.rating FROM CompanyProfessional pe WHERE pe.professional.id = :professional_id AND pe.company.id = :company_id") + Optional selectRatingByProfessionalAndExpertise(@Param("professional_id") Long professional_id, @Param("company_id") Long company_id); + + + @Query("SELECT pe FROM CompanyProfessional pe left join User u on pe.professional.id = u.id WHERE pe.company.id = :company_id") + List findByCompany(@Param("company_id") Long company_id); + + /** + * Retorna uma especialidade profissional, dado um profissional e sua especialidade + * + * @param company + * @param professional + * @return Optional + */ + Optional findByCompanyAndProfessional(User company, User professional); + + +} diff --git a/src/main/java/br/edu/utfpr/servicebook/model/repository/IndividualRepository.java b/src/main/java/br/edu/utfpr/servicebook/model/repository/IndividualRepository.java index 93828008..635ca4cb 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/repository/IndividualRepository.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/repository/IndividualRepository.java @@ -53,4 +53,8 @@ Page findDistinctByTermIgnoreCaseWithPagination( "or lower(p.description) like lower(concat('%', :term, '%')) " + "or lower(pe.expertise.name) like lower(concat('%', :term, '%'))") List findDistinctByTermIgnoreCase(String term); + + @Query("SELECT distinct e FROM Individual e WHERE e.profile = 'ROLE_USER'") + List findProfessionals(); + } \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/servicebook/model/repository/UserRepository.java b/src/main/java/br/edu/utfpr/servicebook/model/repository/UserRepository.java index a5f63636..8404cf6d 100644 --- a/src/main/java/br/edu/utfpr/servicebook/model/repository/UserRepository.java +++ b/src/main/java/br/edu/utfpr/servicebook/model/repository/UserRepository.java @@ -1,10 +1,14 @@ package br.edu.utfpr.servicebook.model.repository; +import br.edu.utfpr.servicebook.model.entity.CompanyProfessional; +import br.edu.utfpr.servicebook.model.entity.Expertise; +import br.edu.utfpr.servicebook.model.entity.Individual; import br.edu.utfpr.servicebook.model.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface UserRepository extends JpaRepository { @@ -28,6 +32,13 @@ public interface UserRepository extends JpaRepository { */ Optional findByPhoneNumber(String phoneNumber); + @Query("SELECT e FROM User e WHERE e.profile = 'ROLE_USER'") + List findProfessionals(); + List findByNameContainingIgnoreCase(String name); + + @Query("SELECT e.name FROM User e") + List findProfessionalsNames(); + @Query("SELECT COUNT(DISTINCT pe.professional.id) FROM ProfessionalExpertise pe") Long countProfessionals(); diff --git a/src/main/java/br/edu/utfpr/servicebook/model/repository/UserTokenRepository.java b/src/main/java/br/edu/utfpr/servicebook/model/repository/UserTokenRepository.java new file mode 100644 index 00000000..d26a470c --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/model/repository/UserTokenRepository.java @@ -0,0 +1,19 @@ +package br.edu.utfpr.servicebook.model.repository; + +import br.edu.utfpr.servicebook.model.entity.Company; +import br.edu.utfpr.servicebook.model.entity.User; +import br.edu.utfpr.servicebook.model.entity.UserToken; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +public interface UserTokenRepository extends JpaRepository { + Optional findByEmail(String email); + + @Query("SELECT t FROM UserToken t WHERE t.token = :token") + UserToken findByToken(@Param("token")String token); +} diff --git a/src/main/java/br/edu/utfpr/servicebook/service/CompanyProfessionalService.java b/src/main/java/br/edu/utfpr/servicebook/service/CompanyProfessionalService.java new file mode 100644 index 00000000..24048c6e --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/service/CompanyProfessionalService.java @@ -0,0 +1,48 @@ +package br.edu.utfpr.servicebook.service; + +import br.edu.utfpr.servicebook.model.entity.*; +import br.edu.utfpr.servicebook.model.repository.CompanyProfessionalRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class CompanyProfessionalService { + + @Autowired + private CompanyProfessionalRepository companyProfessionalRepository; + + public Optional findByProfessionalAndCompany(User company, User individual) { + return this.companyProfessionalRepository.findByProfessionalAndCompany(company, individual); + } + + public CompanyProfessional save(CompanyProfessional companyProfessional) { + return this.companyProfessionalRepository.save(companyProfessional); + } + + public void delete(CompanyProfessionalPK professional_id){ + companyProfessionalRepository.deleteById(professional_id); + } + + public List findDistinctByTermIgnoreCase(String searchTerm){ + return this.companyProfessionalRepository.findDistinctByTermIgnoreCase(searchTerm); + } + + public Optional selectRatingByProfessionalAndExpertise(Long professional_id, Long expertise_id) { + return this.companyProfessionalRepository.selectRatingByProfessionalAndExpertise(professional_id, expertise_id); + } + + public List findByCompany(Long user) {return this.companyProfessionalRepository.findByCompany(user);} + + public List findByProfessional(User individual) { + return this.companyProfessionalRepository.findByProfessional(individual); + } + + public Optional findByCompanyAndProfessional(User company, User professional) { + return this.companyProfessionalRepository.findByCompanyAndProfessional(company, professional); + } + + +} diff --git a/src/main/java/br/edu/utfpr/servicebook/service/QuartzService.java b/src/main/java/br/edu/utfpr/servicebook/service/QuartzService.java index de9d2e74..cbdbcd06 100644 --- a/src/main/java/br/edu/utfpr/servicebook/service/QuartzService.java +++ b/src/main/java/br/edu/utfpr/servicebook/service/QuartzService.java @@ -213,4 +213,46 @@ public void deleteJobsAvailableToHide() { System.out.println(e.getMessage()); } } + + public void sendEmailToRegisterUser(String email, String company, String link) { + try { + JobDetail job = JobBuilder.newJob(SendEmailToRegisterUser.class) + .withIdentity(SendEmailToRegisterUser.class.getSimpleName(), GROUP).build(); + job.getJobDataMap().put(SendEmailToRegisterUser.RECIPIENT_KEY, email); + job.getJobDataMap().put(SendEmailToRegisterUser.USER_KEY, company); + job.getJobDataMap().put(SendEmailToRegisterUser.LINK_KEY, link); + + Trigger trigger = getTrigger(SendEmailToRegisterUser.class.getSimpleName(), GROUP); + + scheduler.scheduleJob(job, trigger); + + if (!scheduler.isStarted()) { + scheduler.start(); + } + + }catch (SchedulerException e){ + System.out.println(e.getMessage()); + } + } + + public void sendEmailWithConfirmationUser(String email, String company, String link) { + try { + JobDetail job = JobBuilder.newJob(SendEmailWithConfirmationUser.class) + .withIdentity(SendEmailWithConfirmationUser.class.getSimpleName(), GROUP).build(); + job.getJobDataMap().put(SendEmailWithConfirmationUser.RECIPIENT_KEY, email); + job.getJobDataMap().put(SendEmailWithConfirmationUser.USER_KEY, company); + job.getJobDataMap().put(SendEmailWithConfirmationUser.LINK_KEY, link); + + Trigger trigger = getTrigger(SendEmailWithConfirmationUser.class.getSimpleName(), GROUP); + + scheduler.scheduleJob(job, trigger); + + if (!scheduler.isStarted()) { + scheduler.start(); + } + + }catch (SchedulerException e){ + System.out.println(e.getMessage()); + } + } } diff --git a/src/main/java/br/edu/utfpr/servicebook/service/UserService.java b/src/main/java/br/edu/utfpr/servicebook/service/UserService.java index 6f307b2d..601a0c03 100644 --- a/src/main/java/br/edu/utfpr/servicebook/service/UserService.java +++ b/src/main/java/br/edu/utfpr/servicebook/service/UserService.java @@ -1,8 +1,12 @@ package br.edu.utfpr.servicebook.service; +import br.edu.utfpr.servicebook.model.entity.CompanyProfessional; +import br.edu.utfpr.servicebook.model.entity.Expertise; +import br.edu.utfpr.servicebook.model.entity.Individual; import br.edu.utfpr.servicebook.model.entity.User; import br.edu.utfpr.servicebook.model.repository.ProfessionalExpertiseRepository; import br.edu.utfpr.servicebook.model.repository.UserRepository; +import br.edu.utfpr.servicebook.security.ProfileEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -46,6 +50,14 @@ public Optional findByPhoneNumber(String phoneNumber) { return this.userRepository.findByPhoneNumber(phoneNumber); } + public List findProfessionalsNotExist() { + return this.userRepository.findProfessionals(); + } + public List findAllByNames() { + return this.userRepository.findProfessionalsNames(); + } + + public Long countProfessionals(){ return this.userRepository.countProfessionals(); } diff --git a/src/main/java/br/edu/utfpr/servicebook/service/UserTokenService.java b/src/main/java/br/edu/utfpr/servicebook/service/UserTokenService.java new file mode 100644 index 00000000..c805e0ce --- /dev/null +++ b/src/main/java/br/edu/utfpr/servicebook/service/UserTokenService.java @@ -0,0 +1,33 @@ +package br.edu.utfpr.servicebook.service; + +import br.edu.utfpr.servicebook.model.entity.UserToken; +import br.edu.utfpr.servicebook.model.repository.UserTokenRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class UserTokenService { + + @Autowired + private UserTokenRepository userTokenRepository; + + public UserToken save(UserToken entity) { + userTokenRepository.save(entity); + return entity; + } + + public void deleteById(Long id) { + userTokenRepository.deleteById(id); + } + + public Optional findByEmail(String email) { + return this.userTokenRepository.findByEmail(email); + } + + public UserToken findByUserToken(String token) { + return this.userTokenRepository.findByToken(token); + } + +} diff --git a/src/main/java/br/edu/utfpr/servicebook/util/TemplateUtil.java b/src/main/java/br/edu/utfpr/servicebook/util/TemplateUtil.java index 889452fa..7c5672cb 100644 --- a/src/main/java/br/edu/utfpr/servicebook/util/TemplateUtil.java +++ b/src/main/java/br/edu/utfpr/servicebook/util/TemplateUtil.java @@ -101,7 +101,7 @@ public UserTemplateStatisticInfo getProfessionalStatisticInfo(User oProfessional ); } - public UserTemplateStatisticInfo getCompanyStatisticInfo(Individual oProfessional, Long expertiseId) { + public UserTemplateStatisticInfo getCompanyStatisticInfo(User oProfessional, Long expertiseId) { if (expertiseId == 0L) { ProfessionalDTO professional = professionalMapper.toResponseDto(oProfessional); diff --git a/src/main/java/br/edu/utfpr/servicebook/util/UserWizardUtil.java b/src/main/java/br/edu/utfpr/servicebook/util/UserWizardUtil.java index b0576fae..1551eebf 100644 --- a/src/main/java/br/edu/utfpr/servicebook/util/UserWizardUtil.java +++ b/src/main/java/br/edu/utfpr/servicebook/util/UserWizardUtil.java @@ -21,6 +21,7 @@ public class UserWizardUtil { */ public static final String KEY_IS_REGISTER_COMPANY = "KEY_IS_REGISTER_COMPANY"; + public static final String KEY_WIZARD_COMPANY_ID = "KEY_WIZARD_COMPANY_ID"; /** * Retorna um objeto DTO para armazenar os dados do Wizard na sessão. diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 39abd15b..4a71ac49 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -41,21 +41,21 @@ VALUES ('Industrial', '800', '85053525', 'Avenida Professora Laura Pacheco Basto INSERT INTO users (email, email_verified, name, phone_number, phone_verified, profile_picture, profile_verified, - address_id, rating, profile, password, description) + address_id, rating, profile, password, description, is_confirmed) VALUES ('profissional1@gmail.com', 'true', 'Nome do Primeiro Profissional', '(42) 99999-9991', 'true', - 'https://i.imgur.com/owhNAKK.png', 'true', '1', 2, 'ROLE_ADMIN','$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'), + 'https://i.imgur.com/owhNAKK.png', 'true', '1', 2, 'ROLE_ADMIN','$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'true'), ('profissional2@gmail.com', 'true', 'Nome do Segundo Profissional', '(42) 99999-9992', 'true', - 'https://i.imgur.com/sHAg9pz.png', 'true', '1', 4,'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'), + 'https://i.imgur.com/sHAg9pz.png', 'true', '1', 4,'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'true'), ('cliente1@gmail.com', 'true', 'Nome do Primeiro Cliente', '(42) 99999-9993', 'true', - 'https://i.imgur.com/y9dH2bJ.jpeg', 'true', '1', 5, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'), + 'https://i.imgur.com/y9dH2bJ.jpeg', 'true', '1', 5, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'false'), ('cliente2@gmail.com', 'true', 'Nome do Segundo Cliente', '(42) 99999-9994', 'true', - 'https://i.imgur.com/owhNAKK.png', 'true', '1', 1, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'), + 'https://i.imgur.com/owhNAKK.png', 'true', '1', 1, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'false'), ('empresa@gmail.com', 'true', 'Nome Empresa', '(42) 99999-9994', 'true', - 'https://i.imgur.com/owhNAKK.png', 'true', '1', 1, 'ROLE_COMPANY', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição empresa 1'), + 'https://i.imgur.com/owhNAKK.png', 'true', '1', 1, 'ROLE_COMPANY', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição empresa 1', 'false'), ('profissional3@gmail.com', 'true', 'Nome do Terceiro Profissional', '(42) 99999-9995', 'false', - null, 'false', '1', 3, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'), + null, 'false', '1', 3, 'ROLE_USER', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'true'), ('empresa1@gmail.com', 'true', 'Alguma Empresa', '(42) 99999-9996', 'true', - 'https://i.imgur.com/owhNAKK.png', 'true', '1', 2, 'ROLE_COMPANY', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1'); + 'https://i.imgur.com/owhNAKK.png', 'true', '1', 2, 'ROLE_COMPANY', '$2a$10$ZqgnFnwi6/8qjELs5.Y7rOXacIu/vbudYDl4vA55KDvDuGcpaEFzS', 'Descrição profissional 1', 'false'); -- qwerty123 INSERT INTO individuals (cpf, gender, birth_date, id) VALUES ('982.988.640-93', 'MASCULINE', '2003-01-01', '1'), @@ -81,7 +81,18 @@ VALUES (1, 1, 1), (2, 6, 4); INSERT INTO companies (cnpj, id) -VALUES ('98.988.640/0001-91', 1); +VALUES ('98.988.640/0001-91', 1), + ('01.988.640/0001-10', 2), + ('01.988.640/0001-78', 3), + ('01.988.640/0001-65', 4), + ('01.988.640/0001-24', 5), + ('01.988.640/0001-15', 6), + ('78.988.640/0001-02', 7); + +INSERT INTO company_professionals (company_id, professional_id, rating, is_confirmed) +VALUES (7, 2, 1, true), + (5, 6, 1, true), + (7, 6, 1, false); INSERT INTO job_requests (client_confirmation, date_created, date_target, description, professional_confirmation, quantity_candidators_max, diff --git a/src/main/webapp/WEB-INF/tags/banner.tag b/src/main/webapp/WEB-INF/tags/banner.tag index 4fd803f1..b0e58c42 100644 --- a/src/main/webapp/WEB-INF/tags/banner.tag +++ b/src/main/webapp/WEB-INF/tags/banner.tag @@ -5,6 +5,15 @@
+ +
+
+
+ ${msg} +
+
+
+


ServiceBook

diff --git a/src/main/webapp/WEB-INF/tags/side-panel.tag b/src/main/webapp/WEB-INF/tags/side-panel.tag index 7e5c19ca..a6ab7697 100644 --- a/src/main/webapp/WEB-INF/tags/side-panel.tag +++ b/src/main/webapp/WEB-INF/tags/side-panel.tag @@ -186,7 +186,7 @@
@@ -241,6 +241,22 @@
+ + +
+
+ +
+
+
+
diff --git a/src/main/webapp/WEB-INF/tags/template.tag b/src/main/webapp/WEB-INF/tags/template.tag index 2029ec21..692c4c19 100644 --- a/src/main/webapp/WEB-INF/tags/template.tag +++ b/src/main/webapp/WEB-INF/tags/template.tag @@ -16,10 +16,12 @@ ${title} + + @@ -116,12 +118,15 @@ + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/professional/my-expertises.jsp b/src/main/webapp/WEB-INF/view/professional/my-expertises.jsp index 9ecc95c7..42ba1b00 100644 --- a/src/main/webapp/WEB-INF/view/professional/my-expertises.jsp +++ b/src/main/webapp/WEB-INF/view/professional/my-expertises.jsp @@ -28,7 +28,7 @@