Olá, estou tentendo implementar uma lógica de subtração de Date de acordo com os horários de trabalho e marcação de funcionarios. O grande problema é quando tento façar e implementar a lógica quando o horario passa de meia noite.
Consigo fazer a lógica e a diferença quando se trata do periodo de 1 dia(24). Agora quando por exemplo Horario de trabalho é 22:00 - 05:00 e horario de marcacao é 21:00 - 04:00. Tem que me retornar 04:00 - 05:00 como horairo de atraso. Mas quando passa da meia noite se trata de ouro dia. E estou tendo problemas ao implementar essa lógica. Quem souber me ajudar serei grato!
Seria basicamente o seguinte:
Exemplo :
Tabela-Horario De Trabalho:
registros:
08:00 12:00
Tabela-Marcacoes Feitas:
registros:
07:00 11:00
Se chamarmos a função de subtração passando como parâmetro 1 os registros da Tabela-Horario De Trabalho e 2 os registros da Tabela-Marcacoes Feitas, a função tem que retornar os períodos da Tabela 1 menos o da tabela 2.
Seria assim:
das 08:00 às 12:00 eu devo tirar das 07:00 às 11:00, portanto fica no primeiro período 11:00 às 12:00
Vamos analisar, 11:00 às 12:00 seria o período que o funcionário não cumpriu, então seria o atraso.
Já consegui implementar o seguinte:
// Obter parâmetros do request
String[] tabelaHorarioParam = request.getParameterValues("tabelaHorario");
String[] tabelaMarcacoesParam = request.getParameterValues("tabelaMarcacoes");
/ Converter os parâmetros para listas de períodos
List<Periodo> tabelaHorario = converterStringParaLista(tabelaHorarioParam);
// Calcular a subtração paraatrasos e horas extras
List<Periodo> atrasos = calcularAtraso(tabelaHorario, tabelaMarcacoes);
private List<Periodo> converterStringParaLista(String[] array) throws ParseException {
List<Periodo> lista = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
if (array != null) {
for (String item : array) {
String horario = item.replace("[", "").replace("]", ""); // Remover colchetes
String[] horarios = horario.trim().split(","); // Dividir por vírgula, se necessário
for (String periodo : horarios) {
String[] partes = periodo.trim().split("-");
if (partes.length == 2) {
String inicioStr = partes[0].trim().replaceFirst("\"", "");
String fimStr = partes[1].trim();
Date inicio = sdf.parse(inicioStr);
Date fim = sdf.parse(fimStr);
lista.add(new Periodo(inicio, fim));
} else {
throw new ParseException("Formato inválido para o período: " + periodo, 0);
}
}
}
}
return lista;
}```
private List<Periodo> calcularAtraso(List<Periodo> tabelaHorario, List<Periodo> tabelaMarcacoes) {
List<Periodo> atrasos = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
for (Periodo periodoTrabalho : tabelaHorario) {
for (Periodo periodoMarcacao : tabelaMarcacoes) {
// Verificar se há sobreposição entre os períodos
if (periodoTrabalho.getFim().after(periodoMarcacao.getInicio()) && periodoTrabalho.getInicio().before(periodoMarcacao.getFim())) {
// Calcular o atraso
Date inicioAtraso = periodoMarcacao.getFim();
Date fimAtraso = periodoTrabalho.getFim();
Periodo atraso = new Periodo(inicioAtraso, fimAtraso);
atrasos.add(atraso);
}
}
}
return atrasos;
}```