├── br └── com │ └── alura │ └── rh │ ├── ValidacaoException.java │ ├── model │ ├── Cargo.java │ ├── DadosPessoais.java │ ├── Funcionario.java │ └── Terceirizado.java │ └── service │ ├── promocao │ └── PromocaoService.java │ └── reajuste │ ├── ReajusteService.java │ ├── ValidacaoPercentualReajuste.java │ ├── ValidacaoPeriocidadeEntrelReajuste.java │ └── ValidacaoReajuste.java └── rh.iml /br/com/alura/rh/ValidacaoException.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh; 2 | 3 | public class ValidacaoException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public ValidacaoException(String mensagem) { 8 | super(mensagem); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /br/com/alura/rh/model/Cargo.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.model; 2 | 3 | public enum Cargo { 4 | 5 | ASSISTENTE{ 6 | @Override 7 | public Cargo getProximoCargo() { 8 | return ANALISTA; 9 | } 10 | }, 11 | ANALISTA { 12 | @Override 13 | public Cargo getProximoCargo() { 14 | return ESPECIALISTA; 15 | } 16 | }, 17 | ESPECIALISTA { 18 | @Override 19 | public Cargo getProximoCargo() { 20 | return GERENTE; 21 | } 22 | }, 23 | GERENTE { 24 | @Override 25 | public Cargo getProximoCargo() { 26 | return GERENTE; 27 | } 28 | }; 29 | 30 | public abstract Cargo getProximoCargo(); 31 | } 32 | -------------------------------------------------------------------------------- /br/com/alura/rh/model/DadosPessoais.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.model; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class DadosPessoais { 6 | private String nome; 7 | private String cpf; 8 | private Cargo cargo; 9 | private BigDecimal salario; 10 | 11 | public DadosPessoais(String nome, String cpf, Cargo cargo, BigDecimal salario) { 12 | this.nome = nome; 13 | this.cpf = cpf; 14 | this.cargo = cargo; 15 | this.salario = salario; 16 | } 17 | 18 | public String getNome() { 19 | return nome; 20 | } 21 | 22 | public String getCpf() { 23 | return cpf; 24 | } 25 | 26 | public Cargo getCargo() { 27 | return cargo; 28 | } 29 | 30 | public void setCargo(Cargo cargo) { 31 | this.cargo = cargo; 32 | } 33 | 34 | public BigDecimal getSalario() { 35 | return salario; 36 | } 37 | 38 | public void setSalario(BigDecimal salario) { 39 | this.salario = salario; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /br/com/alura/rh/model/Funcionario.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.model; 2 | 3 | import java.math.BigDecimal; 4 | import java.math.RoundingMode; 5 | import java.time.LocalDate; 6 | 7 | import br.com.alura.rh.ValidacaoException; 8 | 9 | public class Funcionario { 10 | 11 | private DadosPessoais dadosPessoais; 12 | private LocalDate dataUltimoReajuste; 13 | 14 | public Funcionario(String nome, String cpf, Cargo cargo, BigDecimal salario) { 15 | this.dadosPessoais = new DadosPessoais(nome, cpf, cargo, salario); 16 | } 17 | 18 | public void atualizarSalario(BigDecimal novoSalario) { 19 | this.dadosPessoais.setSalario(novoSalario); 20 | this.dataUltimoReajuste = LocalDate.now(); 21 | } 22 | 23 | public void promover(Cargo novoCargo) { 24 | this.dadosPessoais.setCargo(novoCargo); 25 | } 26 | 27 | public String getNome() { 28 | return dadosPessoais.getNome(); 29 | } 30 | 31 | public String getCpf() { 32 | return dadosPessoais.getCpf(); 33 | } 34 | 35 | public Cargo getCargo() { 36 | return dadosPessoais.getCargo(); 37 | } 38 | 39 | public BigDecimal getSalario() { 40 | return dadosPessoais.getSalario(); 41 | } 42 | 43 | public LocalDate getDataUltimoReajuste() { 44 | return dataUltimoReajuste; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /br/com/alura/rh/model/Terceirizado.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.model; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class Terceirizado { 6 | 7 | private DadosPessoais dadosPessoais; 8 | private String empresa; 9 | 10 | public Terceirizado(String nome, String cpf, Cargo cargo, BigDecimal salario, String empresa) { 11 | this.dadosPessoais = new DadosPessoais(nome, cpf, cargo, salario); 12 | this.empresa = empresa; 13 | } 14 | 15 | public String getEmpresa() { 16 | return empresa; 17 | } 18 | 19 | public void setEmpresa(String empresa) { 20 | this.empresa = empresa; 21 | } 22 | 23 | public String getNome() { 24 | return dadosPessoais.getNome(); 25 | } 26 | 27 | public String getCpf() { 28 | return dadosPessoais.getCpf(); 29 | } 30 | 31 | public Cargo getCargo() { 32 | return dadosPessoais.getCargo(); 33 | } 34 | 35 | public BigDecimal getSalario() { 36 | return dadosPessoais.getSalario(); 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /br/com/alura/rh/service/promocao/PromocaoService.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.service.promocao; 2 | 3 | import br.com.alura.rh.ValidacaoException; 4 | import br.com.alura.rh.model.Cargo; 5 | import br.com.alura.rh.model.Funcionario; 6 | 7 | public class PromocaoService { 8 | public void promover(Funcionario funcionario, boolean metaBatida){ 9 | Cargo cargoAtual = funcionario.getCargo(); 10 | if (Cargo.GERENTE == cargoAtual){ 11 | throw new ValidacaoException("Gerentes não podem ser promovidos!"); 12 | } 13 | 14 | if(metaBatida){ 15 | Cargo novoCargo = cargoAtual.getProximoCargo(); 16 | funcionario.promover(novoCargo); 17 | }else{ 18 | throw new ValidacaoException("Funcionario não bateu a meta!"); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /br/com/alura/rh/service/reajuste/ReajusteService.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.service.reajuste; 2 | 3 | import br.com.alura.rh.model.Funcionario; 4 | 5 | import java.math.BigDecimal; 6 | import java.util.List; 7 | 8 | public class ReajusteService { 9 | 10 | private List validacoes; 11 | 12 | public ReajusteService(List validacoes) { 13 | this.validacoes = validacoes; 14 | } 15 | 16 | public void reajustarSalarioDoFuncionario(Funcionario funcionario, BigDecimal aumento) { 17 | this.validacoes.forEach(v -> v.validar(funcionario, aumento)); 18 | 19 | BigDecimal salarioAtualizado = funcionario.getSalario().add(aumento); 20 | funcionario.atualizarSalario(salarioAtualizado); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /br/com/alura/rh/service/reajuste/ValidacaoPercentualReajuste.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.service.reajuste; 2 | 3 | import br.com.alura.rh.ValidacaoException; 4 | import br.com.alura.rh.model.Funcionario; 5 | 6 | import java.math.BigDecimal; 7 | import java.math.RoundingMode; 8 | 9 | public class ValidacaoPercentualReajuste implements ValidacaoReajuste { 10 | 11 | public void validar(Funcionario funcionario, BigDecimal aumento){ 12 | BigDecimal salarioAtual = funcionario.getSalario(); 13 | BigDecimal percentualReajuste = aumento.divide(salarioAtual, RoundingMode.HALF_UP); 14 | if (percentualReajuste.compareTo(new BigDecimal("0.4")) > 0) { 15 | throw new ValidacaoException("Reajuste nao pode ser superior a 40% do salario!"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /br/com/alura/rh/service/reajuste/ValidacaoPeriocidadeEntrelReajuste.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.service.reajuste; 2 | 3 | import br.com.alura.rh.ValidacaoException; 4 | import br.com.alura.rh.model.Funcionario; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.temporal.ChronoUnit; 9 | 10 | public class ValidacaoPeriocidadeEntrelReajuste implements ValidacaoReajuste { 11 | 12 | public void validar(Funcionario funcionario, BigDecimal aumento){ 13 | LocalDate dataUltimoReajuste = funcionario.getDataUltimoReajuste(); 14 | LocalDate dataAtual = LocalDate.now(); 15 | long mesesDeseUltimoReajuste = ChronoUnit.MONTHS.between(dataUltimoReajuste, dataAtual); 16 | if (mesesDeseUltimoReajuste < 6) { 17 | throw new ValidacaoException("Intervalo entre reajuste deve ser de no minimo 6 meses!"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /br/com/alura/rh/service/reajuste/ValidacaoReajuste.java: -------------------------------------------------------------------------------- 1 | package br.com.alura.rh.service.reajuste; 2 | 3 | import br.com.alura.rh.model.Funcionario; 4 | 5 | import java.math.BigDecimal; 6 | 7 | public interface ValidacaoReajuste { 8 | void validar(Funcionario funcionario, BigDecimal aumento); 9 | } 10 | -------------------------------------------------------------------------------- /rh.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------