Skip to content

Commit 340cb94

Browse files
authored
Merge pull request #32 from EngStrategy/feature/inicio
home page
2 parents d48fd48 + 90eeb84 commit 340cb94

File tree

12 files changed

+464
-13
lines changed

12 files changed

+464
-13
lines changed

src/main/java/com/carvalhotechsolutions/mundoanimal/Main.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ public void start(Stage stage) {
1414

1515
// Verifica conexão com o banco de dados
1616
DatabaseChecker.testConnectionAndInitializeAdmin();
17-
// Inicializa o SceneManager
17+
// Inicializa o ScreenManager
1818
ScreenManager sceneManager = new ScreenManager(stage);
19-
// Inicializa o SceneManagerHolder
19+
// Inicializa o ScreenManagerHolder
2020
ScreenManagerHolder.initialize(sceneManager);
2121
// Seleciona a primeira tela da aplicação
2222
sceneManager.switchTo(ScreenEnum.LOGIN);

src/main/java/com/carvalhotechsolutions/mundoanimal/controllers/autenticacao/LoginController.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.carvalhotechsolutions.mundoanimal.controllers.autenticacao;
22

33
import animatefx.animation.FadeIn;
4+
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.MenuController;
45
import com.carvalhotechsolutions.mundoanimal.database.JPAutil;
56
import com.carvalhotechsolutions.mundoanimal.enums.ScreenEnum;
67
import com.carvalhotechsolutions.mundoanimal.model.Usuario;
@@ -64,8 +65,6 @@ private void handleLogin(ActionEvent event) {
6465
// Login bem-sucedido
6566
SessionManager.setCurrentUser(usuario);
6667

67-
// PopupManager.showLoginSuccessPopup(ScreenManagerHolder.getInstance().getStage());
68-
6968
// Atualiza a interface do menu através do ScreenManagerHolder
7069
ScreenManagerHolder.getInstance().getMenuController().updateUserInterface(usuario);
7170

@@ -74,6 +73,13 @@ private void handleLogin(ActionEvent event) {
7473
new FadeIn(menuScreen).play();
7574
ScreenManagerHolder.getInstance().switchTo(ScreenEnum.MENU);
7675

76+
// Obtém a referência do MenuController
77+
MenuController menuController = (MenuController) ScreenManagerHolder.getInstance()
78+
.getMenuController();
79+
80+
// Chama o método para ativar a tela inicial
81+
menuController.activateInitialScreen();
82+
7783
} catch (Exception e) {
7884
showAlert("Erro", "Ocorreu um erro ao verificar as credenciais: " + e.getMessage());
7985
e.printStackTrace();

src/main/java/com/carvalhotechsolutions/mundoanimal/controllers/gerenciamento/AgendamentoController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.carvalhotechsolutions.mundoanimal.model.Cliente;
88
import com.carvalhotechsolutions.mundoanimal.repositories.AgendamentoRepository;
99
import com.carvalhotechsolutions.mundoanimal.utils.FeedbackManager;
10+
import com.carvalhotechsolutions.mundoanimal.utils.ScreenManagerHolder;
1011
import javafx.application.Platform;
1112
import javafx.beans.binding.DoubleBinding;
1213
import javafx.beans.property.IntegerProperty;
@@ -244,6 +245,8 @@ private void abrirModalEditar(Long agendamentoId) {
244245
modalStage.showAndWait();
245246

246247
atualizarTableView();
248+
249+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarProximosAgendamentos());
247250
} catch (IOException e) {
248251
e.printStackTrace();
249252
}
@@ -262,6 +265,8 @@ private void abrirModalCancelar(Long agendamentoId) {
262265
agendamentoRepository.deleteById(agendamentoId);
263266
atualizarTableView(); // Atualizar tabela após exclusão
264267
handleSuccessfulOperation("Agendamento cancelado com sucesso!");
268+
269+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarProximosAgendamentos());
265270
});
266271

267272
// Configurar o Stage do modal
@@ -405,6 +410,8 @@ public void salvarAgendamento(Agendamento agendamento) {
405410
}
406411

407412
agendamentoRepository.save(agendamento);
413+
414+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarProximosAgendamentos());
408415
}
409416

410417
private boolean verificarDisponibilidadeHorario(LocalDate data, LocalTime horario) {
@@ -419,5 +426,10 @@ public void finalizarAgendamento(Long id, String responsavel, String horarioSaid
419426
agendamentoFinalizado.setResponsavelAtendimento(responsavel);
420427
agendamentoRepository.save(agendamentoFinalizado);
421428
handleSuccessfulOperation("Agendamento finalizado com sucesso!");
429+
430+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarProximosAgendamentos());
431+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarAgendamentosFinalizados());
432+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarGraficoServicos());
422433
}
434+
423435
}
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento;
2+
3+
import com.carvalhotechsolutions.mundoanimal.model.Agendamento;
4+
import com.carvalhotechsolutions.mundoanimal.repositories.AgendamentoRepository;
5+
import javafx.application.Platform;
6+
import javafx.beans.binding.DoubleBinding;
7+
import javafx.collections.FXCollections;
8+
import javafx.collections.ObservableList;
9+
import javafx.fxml.FXML;
10+
import javafx.scene.Node;
11+
import javafx.scene.chart.BarChart;
12+
import javafx.scene.chart.CategoryAxis;
13+
import javafx.scene.chart.NumberAxis;
14+
import javafx.scene.chart.XYChart;
15+
import javafx.scene.control.Label;
16+
import javafx.scene.control.TableColumn;
17+
import javafx.scene.control.TableView;
18+
import javafx.scene.control.cell.PropertyValueFactory;
19+
import javafx.scene.text.Text;
20+
import javafx.util.StringConverter;
21+
22+
import java.util.Arrays;
23+
import java.util.List;
24+
import java.util.Map;
25+
import java.util.stream.Collectors;
26+
27+
public class InicioController {
28+
@FXML
29+
private Label nomeServico1, horarioAgendamento1, nomeCliente1;
30+
@FXML
31+
private Label nomeServico2, horarioAgendamento2, nomeCliente2;
32+
@FXML
33+
private Label nomeServico3, horarioAgendamento3, nomeCliente3;
34+
@FXML
35+
private Label nomeServico4, horarioAgendamento4, nomeCliente4;
36+
@FXML
37+
private TableView<Agendamento> tableView;
38+
@FXML
39+
private TableColumn<Agendamento, String> clienteColumn, servicoColumn, dataColumn;
40+
@FXML
41+
private BarChart barChart;
42+
@FXML
43+
private CategoryAxis xAxis;
44+
@FXML
45+
private NumberAxis yAxis;
46+
47+
private AgendamentoRepository agendamentoRepository = new AgendamentoRepository();
48+
49+
@FXML
50+
public void initialize() {
51+
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS);
52+
53+
DoubleBinding larguraDisponivel = tableView.widthProperty().subtract(354);
54+
55+
clienteColumn.prefWidthProperty().bind(larguraDisponivel.multiply(0.35));
56+
servicoColumn.prefWidthProperty().bind(larguraDisponivel.multiply(0.35));
57+
dataColumn.prefWidthProperty().bind(larguraDisponivel.multiply(0.30));
58+
59+
clienteColumn.setCellValueFactory(new PropertyValueFactory<>("cliente"));
60+
servicoColumn.setCellValueFactory(new PropertyValueFactory<>("servico"));
61+
dataColumn.setCellValueFactory(new PropertyValueFactory<>("dataFormatada"));
62+
63+
carregarProximosAgendamentos();
64+
atualizarAgendamentosFinalizados();
65+
configurarGrafico();
66+
atualizarGraficoServicos();
67+
}
68+
69+
private void carregarProximosAgendamentos() {
70+
List<Agendamento> agendamentos = agendamentoRepository.findStatusPendente();
71+
72+
// Lista de Labels para facilitar a atribuição
73+
List<Label> servicos = Arrays.asList(nomeServico1, nomeServico2, nomeServico3, nomeServico4);
74+
List<Label> horarios = Arrays.asList(horarioAgendamento1, horarioAgendamento2, horarioAgendamento3, horarioAgendamento4);
75+
List<Label> clientes = Arrays.asList(nomeCliente1, nomeCliente2, nomeCliente3, nomeCliente4);
76+
77+
for (int i = 0; i < 4; i++) {
78+
if (i < agendamentos.size()) {
79+
Agendamento agendamento = agendamentos.get(i);
80+
servicos.get(i).setText(agendamento.getServico().getNomeServico());
81+
horarios.get(i).setText(agendamento.getDataHoraFormatada());
82+
clientes.get(i).setText(agendamento.getCliente().getNome());
83+
} else {
84+
// Definir mensagens padrão para os HBox vazios
85+
servicos.get(i).setText("Vago");
86+
horarios.get(i).setText("-");
87+
clientes.get(i).setText("-");
88+
}
89+
}
90+
}
91+
92+
public void atualizarAgendamentosFinalizados() {
93+
List<Agendamento> ultimosFinalizados = agendamentoRepository.findUltimosFinalizados(5);
94+
95+
// Atualiza os dados da TableView
96+
tableView.getItems().setAll(ultimosFinalizados);
97+
}
98+
99+
public void atualizarGraficoServicos() {
100+
// Executar dentro do thread do JavaFX
101+
Platform.runLater(() -> {
102+
List<Agendamento> agendamentos = agendamentoRepository.findFinalizadosUltimaSemana();
103+
104+
// Contar quantas vezes cada serviço foi realizado
105+
Map<String, Long> contagemServicos = agendamentos.stream()
106+
.collect(Collectors.groupingBy(a -> a.getServico().getNomeServico(), Collectors.counting()));
107+
108+
// Encontrar o maior valor
109+
long maxValue = contagemServicos.values().stream()
110+
.mapToLong(Long::longValue)
111+
.max()
112+
.orElse(0);
113+
114+
// Configurar o eixo Y com base no valor máximo
115+
yAxis = (NumberAxis) barChart.getYAxis();
116+
// Arredondar para cima para o próximo número inteiro
117+
int upperBound = (int) Math.ceil(maxValue);
118+
yAxis.setUpperBound(upperBound);
119+
yAxis.setLowerBound(0);
120+
// Definir o número de marcações desejado
121+
int tickUnit = calculateTickUnit(upperBound);
122+
yAxis.setTickUnit(tickUnit);
123+
// Forçar apenas números inteiros
124+
yAxis.setAutoRanging(false);
125+
126+
// Criar nova série de dados
127+
XYChart.Series<String, Number> series = new XYChart.Series<>();
128+
series.setName("Quantidade");
129+
130+
// Limpar dados existentes
131+
barChart.getData().clear();
132+
133+
// Atualizar categorias do eixo X
134+
CategoryAxis xAxis = (CategoryAxis) barChart.getXAxis();
135+
xAxis.getCategories().clear();
136+
137+
// Adicionar novas categorias
138+
ObservableList<String> categorias = FXCollections.observableArrayList(contagemServicos.keySet());
139+
xAxis.setCategories(categorias);
140+
141+
// Adicionar dados à série
142+
contagemServicos.forEach((servico, quantidade) ->
143+
series.getData().add(new XYChart.Data<>(servico, quantidade))
144+
);
145+
146+
// Adicionar série ao gráfico
147+
barChart.getData().add(series);
148+
149+
150+
// Forçar atualização do layout
151+
barChart.layout();
152+
});
153+
}
154+
155+
// Método auxiliar para calcular o intervalo de marcação ideal
156+
private int calculateTickUnit(int maxValue) {
157+
if (maxValue <= 5) return 1;
158+
if (maxValue <= 10) return 2;
159+
if (maxValue <= 20) return 4;
160+
if (maxValue <= 50) return 5;
161+
if (maxValue <= 100) return 10;
162+
return Math.max(1, maxValue / 10); // Para valores maiores, dividir em aproximadamente 10 intervalos
163+
}
164+
165+
166+
// Método auxiliar para configuração inicial do gráfico
167+
public void configurarGrafico() {
168+
yAxis.setTickUnit(1); // Incremento de 1 em 1
169+
yAxis.setMinorTickVisible(false);
170+
barChart.setAnimated(false); // Desabilitar animações para evitar problemas de atualização
171+
barChart.setLegendVisible(false);
172+
barChart.setStyle("-fx-font-size: 14px;");
173+
}
174+
175+
public void atualizarProximosAgendamentos() {
176+
Platform.runLater(this::carregarProximosAgendamentos);
177+
}
178+
179+
}

src/main/java/com/carvalhotechsolutions/mundoanimal/controllers/gerenciamento/MenuController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
6060
sair_btn.setOnAction(event -> logout());
6161

6262
// Configure ações para cada botão
63-
// configureButton(inicio_btn, "inicio.fxml");
63+
configureButton(inicio_btn, ScreenEnum.INICIO);
6464
configureButton(historico_btn, ScreenEnum.HISTORICO);
6565
// configureButton(relatorio_btn, "relatorio.fxml");
6666
configureButton(agendamentos_btn, ScreenEnum.AGENDAMENTOS);
@@ -69,6 +69,11 @@ public void initialize(URL url, ResourceBundle resourceBundle) {
6969
configureButton(clientes_btn, ScreenEnum.CLIENTES);
7070
}
7171

72+
public void activateInitialScreen() {
73+
// Simula o clique no botão de início
74+
inicio_btn.fire();
75+
}
76+
7277
public void updateUserInterface(Usuario usuario) {
7378
Platform.runLater(() -> {
7479
userNameLabel.setText(usuario.getNomeUsuario());

src/main/java/com/carvalhotechsolutions/mundoanimal/enums/ScreenEnum.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ public enum ScreenEnum {
1010
CLIENTES("/fxml/gerenciamento/clientes.fxml", "Clientes", ScreenType.CONTENT),
1111
PETS("/fxml/gerenciamento/pets.fxml", "Pets", ScreenType.CONTENT),
1212
AGENDAMENTOS("/fxml/gerenciamento/agendamentos.fxml", "Agendamentos", ScreenType.CONTENT),
13-
HISTORICO("/fxml/gerenciamento/historico.fxml", "Historico", ScreenType.CONTENT);
13+
HISTORICO("/fxml/gerenciamento/historico.fxml", "Historico", ScreenType.CONTENT),
14+
INICIO("/fxml/gerenciamento/inicio.fxml", "Inicio", ScreenType.CONTENT);
1415

1516
private final String fxmlPath;
1617
private final String title;

src/main/java/com/carvalhotechsolutions/mundoanimal/model/Agendamento.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public String getDataHoraFormatada() {
5555
horarioAgendamento.format(timeFormatter);
5656
}
5757

58+
public String getDataFormatada() {
59+
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
60+
return dataAgendamento.format(dateFormatter);
61+
}
62+
5863
public Long getId() {
5964
return id;
6065
}

src/main/java/com/carvalhotechsolutions/mundoanimal/repositories/AgendamentoRepository.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ public List<Agendamento> findStatusFinalizado() {
8888
.setParameter("statusFinalizado", StatusAgendamento.FINALIZADO)
8989
.getResultList();
9090
}
91-
9291
}
9392

9493
public List<Agendamento> findStatusPendente() {
@@ -103,5 +102,33 @@ public List<Agendamento> findStatusPendente() {
103102
}
104103
}
105104

105+
public List<Agendamento> findUltimosFinalizados(int quantidade) {
106+
try (EntityManager em = JPAutil.getEntityManager()) {
107+
String jpql = "SELECT a FROM Agendamento a " +
108+
"WHERE a.status = :statusFinalizado " +
109+
"ORDER BY a.dataAgendamento DESC, a.horarioAgendamento DESC";
110+
111+
return em.createQuery(jpql, Agendamento.class)
112+
.setParameter("statusFinalizado", StatusAgendamento.FINALIZADO)
113+
.setMaxResults(quantidade) // Pegamos no máximo "quantidade" registros
114+
.getResultList();
115+
}
116+
}
117+
118+
public List<Agendamento> findFinalizadosUltimaSemana() {
119+
try (EntityManager em = JPAutil.getEntityManager()) {
120+
LocalDate hoje = LocalDate.now();
121+
LocalDate semanaPassada = hoje.minusDays(7);
122+
123+
String jpql = "SELECT a FROM Agendamento a " +
124+
"WHERE a.status = :statusFinalizado " +
125+
"AND a.dataAgendamento BETWEEN :inicio AND :fim";
106126

127+
return em.createQuery(jpql, Agendamento.class)
128+
.setParameter("statusFinalizado", StatusAgendamento.FINALIZADO)
129+
.setParameter("inicio", semanaPassada)
130+
.setParameter("fim", hoje)
131+
.getResultList();
132+
}
133+
}
107134
}

src/main/java/com/carvalhotechsolutions/mundoanimal/utils/ScreenManager.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.carvalhotechsolutions.mundoanimal.utils;
22

3-
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.AnimalController;
4-
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.ClienteController;
5-
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.HistoricoController;
6-
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.MenuController;
3+
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.*;
74
import com.carvalhotechsolutions.mundoanimal.enums.ScreenEnum;
85
import javafx.fxml.FXMLLoader;
96
import javafx.scene.Node;
@@ -160,4 +157,8 @@ public AnimalController getAnimalController() {
160157
public ClienteController getClienteController() {
161158
return (ClienteController) controllers.get(ScreenEnum.CLIENTES);
162159
}
160+
161+
public InicioController getInicioController() {
162+
return (InicioController) controllers.get(ScreenEnum.INICIO);
163+
}
163164
}

0 commit comments

Comments
 (0)