using System.Collections.Generic;
public static void Main()
List<IValidacaoReajuste> validacoes = new List<IValidacaoReajuste>();
validacoes.Add(new ValidacaoPercentual());
validacoes.Add(new ValidacaoPeriodicidadeEntreReajustes());
Endereco endereco = new Endereco();
endereco.cep = "07094-190";
endereco.logradouro = "Rua Osborne, 345";
DadosPessoais dadosPessoais = new DadosPessoais();
dadosPessoais.nome = "José";
dadosPessoais.cargo = Cargo.ANALISTA;
dadosPessoais.salario = new Decimal(10345.56);
Funcionario ze = new Funcionario();
ze.dataDoUltimoReajuste = DateTime.Parse("01/25/2022");
ze.dadosPessoais = dadosPessoais;
Console.WriteLine("NOME: " + ze.dadosPessoais.nome);
Console.WriteLine("CARGO: " + ze.dadosPessoais.cargo);
Console.WriteLine("SALÁRIO: " + ze.dadosPessoais.salario);
Console.WriteLine("CEP: " + ze.endereco.cep);
Console.WriteLine("LOGRADOURO: " + ze.endereco.logradouro);
ReajusteService reajusteService = new ReajusteService(validacoes);
reajusteService.ReajustarSalario(ze, new Decimal(100));
PromocaoService promocaoService = new PromocaoService();
promocaoService.Promover(ze, true);
Console.WriteLine("NOVO SALÁRIO: " + ze.dadosPessoais.salario);
Console.WriteLine("NOVO CARGO: " + ze.dadosPessoais.cargo);
public class DadosPessoais {
public class Funcionario {
public DateTime dataDoUltimoReajuste;
public Endereco endereco;
public DadosPessoais dadosPessoais;
public void AtualizarSalario(Decimal salarioReajustado) {
this.dadosPessoais.salario = salarioReajustado;
this.dataDoUltimoReajuste = DateTime.Now;
public void Promover(Cargo novoCargo) {
this.dadosPessoais.cargo = novoCargo;
public class Terceirizado {
public DadosPessoais dadosPessoais;
public class ReajusteService {
private List<IValidacaoReajuste> validacoes;
public ReajusteService(List<IValidacaoReajuste> validacoes) {
this.validacoes = validacoes;
public void ReajustarSalario(Funcionario funcionario, Decimal aumento) {
foreach(IValidacaoReajuste validacao in validacoes) {
validacao.Validar(funcionario, aumento);
Decimal salarioAtual = funcionario.dadosPessoais.salario;
Decimal salarioReajustado = salarioAtual + aumento;
funcionario.AtualizarSalario(salarioReajustado);
public interface IValidacaoReajuste {
void Validar(Funcionario funcionario, Decimal aumento);
public class ValidacaoPercentual : IValidacaoReajuste {
public void Validar(Funcionario funcionario, Decimal aumento) {
Decimal salarioAtual = funcionario.dadosPessoais.salario;
Decimal percentualDeAumento = aumento / salarioAtual;
if(percentualDeAumento.CompareTo(new Decimal(0.4)) > 0) {
throw new ValidationException("O valor do aumento não pode ser superior a 40% em relação ao salário !");
public class ValidacaoPeriodicidadeEntreReajustes : IValidacaoReajuste {
public void Validar(Funcionario funcionario, Decimal aumento) {
DateTime dataDoUltimoReajuste = funcionario.dataDoUltimoReajuste;
DateTime dataAtual = DateTime.Parse("12/25/2022");
long mesesDesdeOUltimoReajuste = dataAtual.Month - dataDoUltimoReajuste.Month;
if(mesesDesdeOUltimoReajuste < 3) {
throw new ValidationException("O último reajuste foi há menos de 3 meses !");
public class ValidationException : Exception {
public ValidationException(String message) : base(message) {
public String logradouro;
public class CargosService {
public static Cargo GetProximoCargo(Cargo cargo) {
Array cargos = Enum.GetValues(typeof(Cargo));
int indice = Array.IndexOf(Enum.GetValues(cargo.GetType()), cargo);
return (Cargo) cargos.GetValue(indice);
public class PromocaoService {
public void Promover(Funcionario funcionario, bool bateuAMeta) {
Cargo cargoAtual = funcionario.dadosPessoais.cargo;
if(cargoAtual == Cargo.GERENTE) {
throw new ValidationException("Gerentes não podem ser promovidos !");
Cargo novoCargo = CargosService.GetProximoCargo(cargoAtual);
funcionario.Promover(novoCargo);
throw new ValidationException("O funcionário não bateu a meta !");
public interface IReajuste {
Decimal ValorDoReajuste();
DateTime DataDoReajuste();
public interface IReajusteTributavel : IReajuste {
Decimal ValorDoImpostoDeRendaSobreReajute();
public class Anuenio : IReajuste {
public Decimal ValorDoReajuste() {
public DateTime DataDoReajuste() {
public class Promocao : IReajusteTributavel {
public Decimal ValorDoReajuste() {
public DateTime DataDoReajuste() {
public Decimal ValorDoImpostoDeRendaSobreReajute() {
return this.valor * new Decimal(0.1);