Fala pessoal, tudo bem? Eu estou enfrentando um problema com um trabalho que me foi passado. No trabalho é necessário fazer a subtração entre duas tabelas, Marcação e Horário de Trabalho.
Nas duas tabelas temos os campos de entrada e saída. O resultado esperado é o seguinte:
/**
* Exemplo de entrada
* Horários:
* - 08:00 12:00
* - 13:30 17:30
* Marcações:
* - 06:00 20:00
*
* Exemplo de saída:
*
* Atraso:
* -
* Hora Extra:
* - 06:00 08:00
* - 12:00 13:30
* - 17:30 20:00
*
*/
Ou
/**
* Exemplo de entrada
* Horários:
* - 08:00 12:00
* Marcações:
* - 07:00 11:00
*
* Exemplo de saída:
*
* Atraso:
* - 11:00 12:00
* Hora Extra:
* - 07:00 08:00
*
*/
Bom, eu montei um código que já está funcionando pra maioria dos casos, mas, estou tendo problemas quando é de madrugada, pois da forma que eu fiz, ele entende errado a comparação e acaba não identificando atrasos.
/**
* Exemplo de entrada para madrugada
* Horários:
* - 22:00 05:00
* Marcações:
* - 03:00 07:00
*
* Exemplo de saída:
*
* Atraso:
* - 22:00 03:00
* Hora Extra:
* - 05:00 07:00
*
*/
Se alguém puder me dar umas dicas do que melhorar, ou no que eu estou errando…
Segue meu código JAVA (PS: os campos de entrada e saída são do tipo String)
public static void main(String[] args) {
List<WorkSchedule> schedules = new ArrayList<>();
//Exemplo 1
//schedules.add(new WorkSchedule("08:00","12:00"));
//HourMarker hm = new HourMarker("07:00", "11:00");
//Exemplo 2
//schedules.add(new WorkSchedule("08:00","12:00"));
//HourMarker hm = new HourMarker("07:00", "11:00");
//Exemplo 3
//schedules.add(new WorkSchedule("08:00","12:00"));
//schedules.add(new WorkSchedule("13:30","17:30"));
//HourMarker hm = new HourMarker("06:00", "20:00");
//Exemplo 3
schedules.add(new WorkSchedule("22:00","05:00"));
//schedules.add(new WorkSchedule("13:30","17:30"));
HourMarker hm = new HourMarker("03:00", "07:00");
int markerEntryHour = Integer.parseInt(hm.getEntryHour().split(":")[0]);
int markerEntryMinute = Integer.parseInt(hm.getEntryHour().split(":")[1]);
int markerDepartureHour = Integer.parseInt(hm.getDepartureTime().split(":")[0]);
int markerDepartureMinute = Integer.parseInt(hm.getDepartureTime().split(":")[1]);
//Guarda a hora extra
String horaExtra = "";
//Guarda a hora de atraso
String horaAtraso = "";
//Início da jornada
int hour = 0;
//Guarda o último minuto processado
int lastMinute = 0;
//Percorro os horários de trabalho
for (WorkSchedule schedule : schedules) {
boolean horaExtraEncontrada = false;
boolean horaDeAtrasoEncontrada = false;
int horarioDeEntrada = Integer.parseInt(schedule.getEntryHour().split(":")[0]);
int horarioDeSaida = Integer.parseInt(schedule.getDepartureTime().split(":")[0]);
lastMinute = Integer.parseInt(schedule.getDepartureTime().split(":")[1]);
/**
* Jornada de Trabalho do funcionário
*
* Se hour for == 0, então quer dizer que ele iniciou o cálculo agora, mas caso já exista um valor, continua de onde parou
* Casos como uma jornada que passa de um turno para o outro por exemplo....
*/
for(hour = hour == 0 ? markerEntryHour : hour; hour <= markerDepartureHour; hour++) {
if(hour == horarioDeSaida) {
/**
* Isto marca a chegada ao final do expediente, então passa para o próximo horário, caso exista
*/
break;
}
if(hour < horarioDeEntrada && hour < horarioDeSaida) {
/**
* Entrou antes
*/
if(!horaExtraEncontrada) {
horaExtraEncontrada = true;
horaExtra = hour + ":" + markerEntryMinute;
}
} else if(hour == horarioDeEntrada && hour < horarioDeSaida) {
/**
* Entrou no horário
*/
if(horaExtraEncontrada) {
/**
* Se tiver encontrado hora extra antesm quer dizer que tinha algo para colocar na variável
*/
horaExtra += " " + schedule.getEntryHour();
System.out.println("Hora extra antes do expediente: " + horaExtra);
} else {
System.out.println("Entrou no horário");
}
} else if(hour > horarioDeEntrada && hour < horarioDeSaida) {
//Se ele encontrou hora extra antes, quer dizer que o funcionário chegou antes do horário...
/**
* Entrou Atrasado
*/
if(hour > horarioDeEntrada && !horaExtraEncontrada) {
/**
* Se não, ele entrou atrasado
*/
if(!horaDeAtrasoEncontrada) {
horaDeAtrasoEncontrada = true;
horaAtraso = hour + ":" + markerEntryMinute;
} else {
horaAtraso += " " + schedule.getDepartureTime();
System.out.println("Entrou atrasado: " + horaAtraso);
}
} else if(hour == markerDepartureHour) {
/* Se a hora for igual ao horário de saída marcado, então quer dizer que
* o funcionário saiu, mas ainda deveria estar no expediente dele e será considerado
* um atraso
*/
horaDeAtrasoEncontrada = true;
horaAtraso = hour + ":" + markerDepartureMinute + " " + schedule.getDepartureTime();
System.out.println("Saiu mais cedo: " + horaAtraso);
}
} else if(hour > horarioDeEntrada && hour > horarioDeSaida) {
/**
* Saiu depois do horário
*/
if(!horaExtraEncontrada) {
/**
* Pega o início da hora extra
*/
horaExtraEncontrada = true;
horaExtra = schedule.getDepartureTime();
} else {
/**
* Fica atualizando até achar o final da hora extra
*/
horaExtra += " " + hour + ":" + markerDepartureMinute;
System.out.println("Hora extra após o expediente: " + horaExtra);
}
}
}
}
if(hour < markerDepartureHour) {
/**
* Caso ainda tenham sobrado horas, serão horas extras após o expediente
*/
String horasExtrasRestantes = hour + ":" + lastMinute + " " + markerDepartureHour + ":" + markerDepartureMinute;
System.out.println("Hora extra após expediente: " + horasExtrasRestantes);
}
}
Desde já agradeço a atenção de todos!