import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;
/**
* Classe responsável por controlar o expediente de um usuário,
* calculando o saldo de horas com base no horário de entrada,
* carga horária diária e horário de saída.
*
* O sistema informa se o usuário possui:
* - Horas extras (+)
* - Débito de horas (-)
* - Saldo zerado (0)
*/
public class ControleExpediente {
public static void main(String[] args) {
// Scanner para leitura de dados do usuário
Scanner scanner = new Scanner(System.in);
// Formato padrão de horário (HH:mm)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
// =========================
// Entrada de dados
// =========================
System.out.print("Digite o horário de entrada (HH:mm): ");
LocalTime entrada = LocalTime.parse(scanner.next(), formatter);
System.out.print("Digite a carga horária diária (em horas): ");
int cargaHoraria = scanner.nextInt();
System.out.print("Digite o horário de saída: ");
LocalTime fim = LocalTime.parse(scanner.next(), formatter);
// =========================
// Regra de negócio
// =========================
// Calcula o horário esperado de saída
LocalTime saidaPrevista = entrada.plusHours(cargaHoraria);
/*
* Verifica o saldo de horas:
* - Se saiu depois → hora extra (+)
* - Se saiu antes → débito (-)
* - Se saiu no horário → saldo zero (0)
*/
if (fim.isAfter(saidaPrevista)) {
String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "+");
System.out.println(saldoFormatado);
} else if (fim.isBefore(saidaPrevista)) {
String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "-");
System.out.println(saldoFormatado);
} else {
String saldoFormatado = formatarSaldo(entrada, saidaPrevista, fim, "0");
System.out.println(saldoFormatado);
}
}
/**
* Calcula e formata o saldo de horas do usuário.
*
* @param entrada Horário de entrada
* @param saidaPrevista Horário esperado de saída (entrada + carga horária)
* @param fim Horário real de saída
* @param sinal Indica o tipo de saldo:
* "+" para hora extra
* "-" para débito
* "0" para saldo zerado
*
* @return String formatada com resumo do expediente e saldo de horas
*/
public static String formatarSaldo(LocalTime entrada, LocalTime saidaPrevista, LocalTime fim, String sinal) {
// Calcula a diferença entre saída prevista e saída real
Duration banco = Duration.between(saidaPrevista, fim);
long horas = banco.toHours();
int minutos = banco.toMinutesPart();
String saldoHoras;
// Define o formato do saldo
if (sinal.equals("0")) {
saldoHoras = "0h 0min";
} else {
saldoHoras = sinal + Math.abs(horas) + "h " + Math.abs(minutos) + "min";
}
// Retorna mensagem final formatada
return String.format(
"Horário de entrada: " + entrada +
"%nHorário de saída previsto: " + saidaPrevista +
"%nHorário de saída: " + fim +
"%nSaldo de horas: " + saldoHoras
);
}
}