Erro em Java, ele simplesmente não soma o salário

Fiz uns códigos em Java onde ele deveria somar um salário inicial (double) juntamente com o valor de contrato referente ao mês. Porém, ele só retorna o salário inicial mesmo.

Como devia ser a entrada do programa:

Entre com o nome do departamento: Design
Digite os dados do trabalhador:
Nome: Alex
Nível: PLENO
Base salarial: 1200
Quantos contratos? 3
Contrato 1:
Data (DD/MM/YYYY): 20/08/2018
Valor por hora: 50
Duração do contrato: 20
Contrato 2:
Data (DD/MM/YYYY): 13/06/2018
Valor por hora: 30
Duração do contrato: 18
Contrato 3:
Data (DD/MM/YYYY): 25/08/2018
Valor por hora: 80
Duração do contrato: 10

Entre com mês e ano pra calcular a renda (MM/YYYY): 08/2018

Nome: Alex
Departamento: Design
Renda de 08/2018: 3000,00

Como ele é:

Entre com o nome do departamento: Design
Digite os dados do trabalhador:
Nome: Alex
Nível: PLENO
Base salarial: 1200
Quantos contratos? 3
Contrato 1:
Data (DD/MM/YYYY): 20/08/2018
Valor por hora: 50
Duração do contrato: 20
Contrato 2:
Data (DD/MM/YYYY): 13/06/2018
Valor por hora: 30
Duração do contrato: 18
Contrato 3:
Data (DD/MM/YYYY): 25/08/2018
Valor por hora: 80
Duração do contrato: 10

Entre com mês e ano pra calcular a renda (MM/YYYY): 08/2018

Nome: Alex
Departamento: Design
Renda de 08/2018: 1200,00

O método que devia retornar o salário somado com os contratos do mês: (ele se encontra na classe Trabalhador).

public double renda(int ano, int mes) {
		double soma = baseSalarial;
		Calendar cal = Calendar.getInstance();
		
		for(ContratoPorHora c : contratos) {
			cal.setTime(c.getData());
			int cAno = cal.get(Calendar.YEAR);
			int cMes = cal.get(Calendar.MONTH) + 1;
			
			if(ano == cAno && mes == cMes) {
				soma += c.valorTotal();
			}
		}
		
		return soma;
	}

Método que retorna o valor recebido do contrato (multiplica o valor por hora do contrato, junto com sua duração). Este método se encontra na classe ContratoPorHora.

public double valorTotal() {
		return valorPorHora * horas;
}

O código inteiro. Enum Nivel:

package entidades.enums;

public enum Nivel {
	JUNIOR,
	PLENO,
	SENIOR;
}

Classe Departamento:

package entidades;

public class Departamento {
	private String name;
	
	public Departamento() {
		
	}

	public Departamento(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Classe ContratoPorHora:

package entidades;

import java.util.Date;

public class ContratoPorHora {
	private Date data;
	private Double valorPorHora;
	private Integer horas;
	
	//---------------------------------------------
	
	public ContratoPorHora() {
		
	}
	
	public ContratoPorHora(Date data, Double valorPorHora, Integer horas) {
		this.data = data;
		this.valorPorHora = valorPorHora;
		this.horas = horas;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public Double getValorPorHora() {
		return valorPorHora;
	}

	public void setValorPorHora(Double valorPorHora) {
		this.valorPorHora = valorPorHora;
	}

	public Integer getHoras() {
		return horas;
	}

	public void setHoras(Integer horas) {
		this.horas = horas;
	}

	//---------------------------------------------
	
	public double valorTotal() {
		return valorPorHora * horas;
	}
	
}

Classe Trabalhador:

package entidades;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import entidades.enums.Nivel;

public class Trabalhador {
	
	private String nome;
	private Nivel nivel;
	private Double baseSalarial;
	
	private Departamento departamento;
	private List<ContratoPorHora> contratos = new ArrayList<>();
	
	//-----------------------------------------------
	
	public Trabalhador() {}

	public Trabalhador(String nome, Nivel nivel, Double baseSalarial, Departamento departamento) {
		this.nome = nome;
		this.nivel = nivel;
		this.baseSalarial = baseSalarial;
		this.departamento = departamento;
	}
	
	//-----------------------------------------------

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Nivel getNivel() {
		return nivel;
	}

	public void setNivel(Nivel nivel) {
		this.nivel = nivel;
	}

	public Double getBaseSalarial() {
		return baseSalarial;
	}

	public void setBaseSalarial(Double baseSalarial) {
		this.baseSalarial = baseSalarial;
	}

	public Departamento getDepartamento() {
		return departamento;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	public List<ContratoPorHora> getContratos() {
		return contratos;
	}
	
	//-----------------------------------------------
	
	public void addContrato(ContratoPorHora contrato) {
		contratos.add(contrato);
	}
	
	public void removerContrato(ContratoPorHora contrato) {
		contratos.remove(contrato);
	}
	
	public double renda(int ano, int mes) {
		double soma = baseSalarial;
		Calendar cal = Calendar.getInstance();
		
		for(ContratoPorHora c : contratos) {
			cal.setTime(c.getData());
			int cAno = cal.get(Calendar.YEAR);
			int cMes = cal.get(Calendar.MONTH) + 1;
			
			if(ano == cAno && mes == cMes) {
				soma += c.valorTotal();
			}
		}
		
		return soma;
	}
	
}

Classe com o método main:

package aplicando;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

import entidades.ContratoPorHora;
import entidades.Departamento;
import entidades.Trabalhador;
import entidades.enums.Nivel;

public class Programa {

	public static void main(String[] args) throws ParseException {
		Scanner scan = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		
		System.out.print("Entre com o nome do departamento: ");
		String nomeDepartamento = scan.nextLine();
		
		System.out.println("Digite os dados do trabalhador:");
		System.out.print("Nome: ");
		String nomeTrabalhador = scan.nextLine();
		System.out.print("Nível: ");
		String nivel = scan.nextLine();
		System.out.print("Base salarial: ");
		double baseSalarial = scan.nextDouble();
		
		Trabalhador trabalhador = new Trabalhador(nomeTrabalhador, Nivel.valueOf(nivel), baseSalarial, new Departamento(nomeDepartamento));
		
		System.out.print("Quantos contratos? ");
		int n = scan.nextInt();
		
		for(int i = 1; i <= n; i++) {
			System.out.println("Contrato " + i + ":");
			System.out.print("Data (DD/MM/YYYY): ");
			Date dataContrato = sdf.parse(scan.next());
			System.out.print("Valor por hora: ");
			double valorPorHora = scan.nextDouble();
			System.out.print("Duração do contrato: ");
			int horas = scan.nextInt();
			
			ContratoPorHora contrato = new ContratoPorHora(dataContrato, valorPorHora, horas);
			trabalhador.addContrato(contrato);
			
		}
		
		System.out.println();
		
		System.out.print("Entre com mês e ano pra calcular a renda (MM/YYYY): ");
		String mesAno = scan.next();
		int mes = Integer.parseInt(mesAno.substring(0, 1));
		int ano = Integer.parseInt(mesAno.substring(3, 6));
		
		System.out.println();
		
		System.out.println("Nome: " + trabalhador.getNome());
		System.out.println("Departamento: " + trabalhador.getDepartamento().getName());
		System.out.println("Renda de " + mesAno + ": " + String.format("%.2f", trabalhador.renda(ano, mes)));
		
		
		scan.close();
	}

}

PS: Tentei por este código no github pra ficar mais fácil, mas até lá tá dando erro :face_with_symbols_over_mouth:

Nada que um bocadinho de debug não ajudasse facilmente a descobrir. A segunda posição indicada no método substring é exclusiva, ou seja, é a primeira que não queres que seja incluida.

Assim, em vez de

Deves ter

   int mes = Integer.parseInt(mesAno.substring(0, 2));
   int ano = Integer.parseInt(mesAno.substring(3, 7));

Muito obrigado. :+1: