├── br
└── com
│ └── alura
│ └── rh
│ ├── ValidacaoException.java
│ ├── service
│ ├── reajuste
│ │ ├── ValidacaoReajuste.java
│ │ ├── ReajusteService.java
│ │ ├── ValidacaoPercentualReajuste.java
│ │ └── ValidacaoPeriocidadeEntrelReajuste.java
│ └── promocao
│ │ └── PromocaoService.java
│ └── model
│ ├── Cargo.java
│ ├── DadosPessoais.java
│ ├── Terceirizado.java
│ └── Funcionario.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/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 |
--------------------------------------------------------------------------------
/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/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/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/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/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/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/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 |
--------------------------------------------------------------------------------