Skip to content

Commit 65ec480

Browse files
authored
Merge pull request #35 from EngStrategy/feature/details
Feature/details
2 parents 860a168 + 4c300a0 commit 65ec480

File tree

15 files changed

+749
-153
lines changed

15 files changed

+749
-153
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,8 @@ public void finalizarAgendamento(Long id, String responsavel, String horarioSaid
428428
handleSuccessfulOperation("Agendamento finalizado com sucesso!");
429429

430430
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarProximosAgendamentos());
431-
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarAgendamentosFinalizados());
432-
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarGraficoServicos());
431+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarClientesFrequentes());
432+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarServicosUtilizados());
433433
}
434434

435435
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ private void abrirModalEditar(Long clienteId) {
268268
modalStage.showAndWait();
269269

270270
atualizarTableView();
271+
272+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarClientesFrequentes());
271273
} catch (IOException e) {
272274
e.printStackTrace();
273275
}

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

Lines changed: 258 additions & 99 deletions
Large diffs are not rendered by default.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ private void gerarRelatorio() {
3030
LocalDate inicio = dataInicialPicker.getValue();
3131
LocalDate fim = dataFinalPicker.getValue();
3232

33+
dataInicialPicker.getEditor().clear();
34+
dataFinalPicker.getEditor().clear();
35+
3336
if (inicio == null || fim == null) {
3437
mostrarAlerta("Erro", "Selecione um intervalo de datas válido.");
3538
return;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.carvalhotechsolutions.mundoanimal.model.Servico;
77
import com.carvalhotechsolutions.mundoanimal.repositories.ServicoRepository;
88
import com.carvalhotechsolutions.mundoanimal.utils.FeedbackManager;
9+
import com.carvalhotechsolutions.mundoanimal.utils.ScreenManagerHolder;
910
import javafx.application.Platform;
1011
import javafx.beans.binding.DoubleBinding;
1112
import javafx.beans.property.IntegerProperty;
@@ -270,6 +271,8 @@ private void abrirModalEditar(Long servicoId) {
270271

271272
atualizarTableView();
272273

274+
Platform.runLater(() -> ScreenManagerHolder.getInstance().getInicioController().atualizarServicosUtilizados());
275+
273276
} catch (IOException e) {
274277
e.printStackTrace();
275278
}

src/main/java/com/carvalhotechsolutions/mundoanimal/controllers/modals/ModalCriarAgendamentoController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.carvalhotechsolutions.mundoanimal.model.Cliente;
77
import com.carvalhotechsolutions.mundoanimal.model.Servico;
88
import com.carvalhotechsolutions.mundoanimal.repositories.AgendamentoRepository;
9-
import com.carvalhotechsolutions.mundoanimal.repositories.AnimalRepository;
109
import com.carvalhotechsolutions.mundoanimal.repositories.ClienteRepository;
1110
import com.carvalhotechsolutions.mundoanimal.repositories.ServicoRepository;
1211
import javafx.fxml.FXML;

src/main/java/com/carvalhotechsolutions/mundoanimal/controllers/modals/ModalCriarServicoController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import com.carvalhotechsolutions.mundoanimal.controllers.gerenciamento.ServicoController;
55
import com.carvalhotechsolutions.mundoanimal.model.Servico;
66
import com.carvalhotechsolutions.mundoanimal.repositories.ServicoRepository;
7+
import com.carvalhotechsolutions.mundoanimal.utils.ScreenManagerHolder;
78
import com.carvalhotechsolutions.mundoanimal.utils.TextFormatterManager;
9+
import javafx.application.Platform;
810
import javafx.fxml.FXML;
911
import javafx.scene.control.*;
1012
import javafx.stage.Stage;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.carvalhotechsolutions.mundoanimal.controllers.modals;
2+
3+
import com.carvalhotechsolutions.mundoanimal.model.Agendamento;
4+
import javafx.fxml.FXML;
5+
import javafx.scene.text.Text;
6+
import javafx.stage.Stage;
7+
8+
public class ModalDetalhesAgendamentoController {
9+
@FXML
10+
private Text client_name_label;
11+
12+
@FXML
13+
private Text service_name_label;
14+
15+
@FXML
16+
private Text date_hour_label;
17+
18+
@FXML
19+
private Text client_phone_label;
20+
21+
@FXML
22+
private Text pet_name_label;
23+
24+
private Agendamento agendamento;
25+
26+
public void configurarParaExibicao(Agendamento agendamento) {
27+
this.agendamento = agendamento;
28+
29+
client_name_label.setText(agendamento.getCliente().getNome());
30+
service_name_label.setText(agendamento.getServico().getNomeServico());
31+
date_hour_label.setText(agendamento.getDataHoraFormatada());
32+
client_phone_label.setText(agendamento.getCliente().getTelefone());
33+
pet_name_label.setText(agendamento.getAnimal().getNome());
34+
}
35+
36+
@FXML
37+
public void fecharModal() {
38+
Stage stage = (Stage) pet_name_label.getScene().getWindow();
39+
stage.close();
40+
}
41+
}

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

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88

99
import java.time.LocalDate;
1010
import java.time.LocalTime;
11+
import java.util.LinkedHashMap;
1112
import java.util.List;
13+
import java.util.Map;
14+
import java.util.stream.Collectors;
1215

1316
public class AgendamentoRepository {
1417
public Agendamento save(Agendamento agendamento) {
@@ -59,22 +62,25 @@ public void deleteById(Long id) {
5962
public boolean verificarDisponibilidadeHorario(LocalDate data, LocalTime horario) {
6063
String jpql = "SELECT COUNT(a) FROM Agendamento a " +
6164
"WHERE a.dataAgendamento = :data " +
62-
"AND a.horarioAgendamento = :horario";
65+
"AND a.horarioAgendamento = :horario " +
66+
"AND a.status = :statusPendente";
6367

6468
EntityManager em = JPAutil.getEntityManager();
6569
Long count = em.createQuery(jpql, Long.class)
6670
.setParameter("data", data)
6771
.setParameter("horario", horario)
72+
.setParameter("statusPendente", StatusAgendamento.PENDENTE)
6873
.getSingleResult();
6974

7075
return count == 0;
7176
}
7277

7378
public List<Agendamento> buscarAgendamentosPorData(LocalDate data) {
74-
String jpql = "SELECT a FROM Agendamento a WHERE a.dataAgendamento = :data";
79+
String jpql = "SELECT a FROM Agendamento a WHERE a.dataAgendamento = :data AND a.status =:statusPendente";
7580
EntityManager em = JPAutil.getEntityManager();
7681
return em.createQuery(jpql, Agendamento.class)
7782
.setParameter("data", data)
83+
.setParameter("statusPendente", StatusAgendamento.PENDENTE)
7884
.getResultList();
7985
}
8086

@@ -115,23 +121,57 @@ public List<Agendamento> findUltimosFinalizados(int quantidade) {
115121
}
116122
}
117123

118-
public List<Agendamento> findFinalizadosUltimaSemana() {
124+
public List<Agendamento> findFinalizadosPorPeriodo(String periodo) {
119125
try (EntityManager em = JPAutil.getEntityManager()) {
120126
LocalDate hoje = LocalDate.now();
121-
LocalDate semanaPassada = hoje.minusDays(7);
127+
LocalDate dataInicial;
128+
129+
switch (periodo) {
130+
case "Última semana":
131+
dataInicial = hoje.minusDays(7);
132+
break;
133+
case "Último mês":
134+
dataInicial = hoje.minusMonths(1);
135+
break;
136+
case "Últimos 6 meses":
137+
dataInicial = hoje.minusMonths(6);
138+
break;
139+
default: // Total
140+
dataInicial = LocalDate.of(2000, 1, 1); // Data bem antiga para pegar todos
141+
break;
142+
}
122143

123144
String jpql = "SELECT a FROM Agendamento a " +
124145
"WHERE a.status = :statusFinalizado " +
125146
"AND a.dataAgendamento BETWEEN :inicio AND :fim";
126147

127148
return em.createQuery(jpql, Agendamento.class)
128149
.setParameter("statusFinalizado", StatusAgendamento.FINALIZADO)
129-
.setParameter("inicio", semanaPassada)
150+
.setParameter("inicio", dataInicial)
130151
.setParameter("fim", hoje)
131152
.getResultList();
132153
}
133154
}
134155

156+
public Map<String, Long> getServicosMaisUtilizados(String periodo) {
157+
List<Agendamento> agendamentos = findFinalizadosPorPeriodo(periodo);
158+
159+
return agendamentos.stream()
160+
.collect(Collectors.groupingBy(
161+
agendamento -> agendamento.getServico().getNomeServico(),
162+
Collectors.counting()
163+
))
164+
.entrySet().stream()
165+
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
166+
.limit(10) // Pegando os 10 mais utilizados
167+
.collect(Collectors.toMap(
168+
Map.Entry::getKey,
169+
Map.Entry::getValue,
170+
(e1, e2) -> e1,
171+
LinkedHashMap::new
172+
));
173+
}
174+
135175
public List<Agendamento> buscarAgendamentosPorIntervalo(LocalDate dataInicio, LocalDate dataFim) {
136176
try (EntityManager em = JPAutil.getEntityManager()) {
137177
String jpql = "SELECT a FROM Agendamento a " +
@@ -145,5 +185,4 @@ public List<Agendamento> buscarAgendamentosPorIntervalo(LocalDate dataInicio, Lo
145185
.getResultList();
146186
}
147187
}
148-
149188
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.carvalhotechsolutions.mundoanimal.repositories;
22

33
import com.carvalhotechsolutions.mundoanimal.database.JPAutil;
4+
import com.carvalhotechsolutions.mundoanimal.enums.StatusAgendamento;
45
import com.carvalhotechsolutions.mundoanimal.model.Animal;
56
import com.carvalhotechsolutions.mundoanimal.model.Cliente;
67
import jakarta.persistence.EntityManager;
@@ -60,9 +61,10 @@ public void deleteById(Long id) {
6061

6162
public boolean petPossuiAgendamentos(Long animalId) {
6263
try (EntityManager em = JPAutil.getEntityManager()) {
63-
String jpql = "SELECT COUNT(a) FROM Agendamento a WHERE a.animal.id = :animalId";
64+
String jpql = "SELECT COUNT(a) FROM Agendamento a WHERE a.animal.id = :animalId AND a.status = :statusPendente";
6465
Long count = em.createQuery(jpql, Long.class)
6566
.setParameter("animalId", animalId)
67+
.setParameter("statusPendente", StatusAgendamento.PENDENTE)
6668
.getSingleResult();
6769
return count > 0;
6870
}

0 commit comments

Comments
 (0)