From fa9ba84d5cdf2d8b1aff2666c44c028b685e1094 Mon Sep 17 00:00:00 2001 From: 230409 <230409@epvc.pt> Date: Tue, 14 Apr 2026 15:28:45 +0100 Subject: [PATCH] ... --- .../example/pap_teste/GerirMesasActivity.java | 11 ++- .../pap_teste/NovaReservaActivity.java | 89 ++++++++++++++++++- .../com/example/pap_teste/models/Mesa.java | 12 ++- app/src/main/res/drawable/ic_visibility.xml | 9 ++ .../main/res/drawable/ic_visibility_off.xml | 9 ++ 5 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/ic_visibility.xml create mode 100644 app/src/main/res/drawable/ic_visibility_off.xml diff --git a/app/src/main/java/com/example/pap_teste/GerirMesasActivity.java b/app/src/main/java/com/example/pap_teste/GerirMesasActivity.java index 3dd8329..9a5ebe1 100644 --- a/app/src/main/java/com/example/pap_teste/GerirMesasActivity.java +++ b/app/src/main/java/com/example/pap_teste/GerirMesasActivity.java @@ -21,6 +21,7 @@ import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; +import com.google.firebase.auth.FirebaseAuth; import java.util.ArrayList; import java.util.List; @@ -86,9 +87,12 @@ public class GerirMesasActivity extends AppCompatActivity { public void onDataChange(@NonNull DataSnapshot snapshot) { mesas.clear(); adapter.clear(); + String currentUserEmail = FirebaseAuth.getInstance().getCurrentUser() != null + ? FirebaseAuth.getInstance().getCurrentUser().getEmail() + : ""; for (DataSnapshot postSnapshot : snapshot.getChildren()) { Mesa mesa = postSnapshot.getValue(Mesa.class); - if (mesa != null) { + if (mesa != null && (mesa.getRestauranteEmail() == null || mesa.getRestauranteEmail().equals(currentUserEmail))) { // Ensure the ID is set from the snapshot key if it's missing in the value mesa.setId(postSnapshot.getKey()); mesas.add(mesa); @@ -184,10 +188,13 @@ public class GerirMesasActivity extends AppCompatActivity { Mesa existente = findMesa(numero); String mesaId; + String currentUserEmail = FirebaseAuth.getInstance().getCurrentUser() != null + ? FirebaseAuth.getInstance().getCurrentUser().getEmail() + : ""; if (existente == null) { mesaId = mDatabase.push().getKey(); - Mesa novaMesa = new Mesa(mesaId, numero, capacidade, estado); + Mesa novaMesa = new Mesa(mesaId, numero, capacidade, estado, currentUserEmail); if (mesaId != null) { mDatabase.child(mesaId).setValue(novaMesa); } diff --git a/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java b/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java index 2f3501e..ff33656 100644 --- a/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java +++ b/app/src/main/java/com/example/pap_teste/NovaReservaActivity.java @@ -164,10 +164,11 @@ public class NovaReservaActivity extends AppCompatActivity { private void saveReservation() { android.widget.EditText etPartySize = findViewById(R.id.etPartySize); - int partySize = 0; + int val = 0; try { - partySize = Integer.parseInt(etPartySize.getText().toString()); + val = Integer.parseInt(etPartySize.getText().toString()); } catch (Exception e) {} + final int partySize = val; if (selectedDate == null || selectedTime == null || partySize == 0) { android.widget.Toast.makeText(this, "Por favor, selecione data, hora e número de pessoas.", @@ -175,6 +176,86 @@ public class NovaReservaActivity extends AppCompatActivity { return; } + String restEmail = selectedRestaurant.getEmail(); + + com.google.firebase.database.DatabaseReference mesasRef = com.google.firebase.database.FirebaseDatabase.getInstance().getReference("Mesas"); + + mesasRef.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() { + @Override + public void onDataChange(@androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) { + int totalMesas = 0; + for (com.google.firebase.database.DataSnapshot ds : snapshot.getChildren()) { + com.example.pap_teste.models.Mesa m = ds.getValue(com.example.pap_teste.models.Mesa.class); + if (m != null && restEmail.equals(m.getRestauranteEmail())) { + totalMesas++; + } + } + + if (totalMesas == 0) { + proceedWithReservation(partySize); + return; + } + + checkReservationsAndSave(totalMesas, partySize); + } + + @Override + public void onCancelled(@androidx.annotation.NonNull com.google.firebase.database.DatabaseError error) { + proceedWithReservation(partySize); + } + }); + } + + private void checkReservationsAndSave(int totalMesas, final int partySize) { + String restEmail = selectedRestaurant.getEmail(); + com.google.firebase.database.DatabaseReference reservasRef = com.google.firebase.database.FirebaseDatabase.getInstance().getReference("reservas"); + + reservasRef.orderByChild("restauranteEmail").equalTo(restEmail).addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() { + @Override + public void onDataChange(@androidx.annotation.NonNull com.google.firebase.database.DataSnapshot snapshot) { + int ocupadas = 0; + java.util.Map ocupacaoPorHora = new java.util.HashMap<>(); + + for (com.google.firebase.database.DataSnapshot ds : snapshot.getChildren()) { + com.example.pap_teste.models.Reserva r = ds.getValue(com.example.pap_teste.models.Reserva.class); + if (r != null && selectedDate.equals(r.getData()) && !"Cancelada".equals(r.getEstado()) && !"Recusada".equals(r.getEstado())) { + int count = ocupacaoPorHora.getOrDefault(r.getHora(), 0) + 1; + ocupacaoPorHora.put(r.getHora(), count); + if (selectedTime.equals(r.getHora())) { + ocupadas++; + } + } + } + + if (ocupadas >= totalMesas) { + String sugestao = ""; + String[] horasComuns = {"12:00", "12:30", "13:00", "13:30", "14:00", "19:00", "19:30", "20:00", "20:30", "21:00", "21:30", "22:00"}; + for (String h : horasComuns) { + if (ocupacaoPorHora.getOrDefault(h, 0) < totalMesas && !h.equals(selectedTime)) { + sugestao = h; + break; // Encontramos a primeira sugestão livre + } + } + String msg = "Não há mesas disponíveis para as " + selectedTime + "."; + if (!sugestao.isEmpty()) { + msg += " Sugestão: tente reservar para as " + sugestao + "."; + } else { + msg += " Tente para outro dia."; + } + android.widget.Toast.makeText(NovaReservaActivity.this, msg, android.widget.Toast.LENGTH_LONG).show(); + } else { + proceedWithReservation(partySize); + } + } + + @Override + public void onCancelled(@androidx.annotation.NonNull com.google.firebase.database.DatabaseError error) { + proceedWithReservation(partySize); + } + }); + } + + private void proceedWithReservation(int partySize) { String userEmail = com.google.firebase.auth.FirebaseAuth.getInstance().getCurrentUser() != null ? com.google.firebase.auth.FirebaseAuth.getInstance().getCurrentUser().getEmail() : "cliente@teste.com"; @@ -196,11 +277,11 @@ public class NovaReservaActivity extends AppCompatActivity { ref.child(id).setValue(reserva).addOnCompleteListener(task -> { if (task.isSuccessful()) { android.widget.Toast - .makeText(this, "Reserva solicitada com sucesso!", android.widget.Toast.LENGTH_SHORT) + .makeText(NovaReservaActivity.this, "Reserva solicitada com sucesso!", android.widget.Toast.LENGTH_SHORT) .show(); finish(); } else { - android.widget.Toast.makeText(this, "Erro ao salvar reserva.", android.widget.Toast.LENGTH_SHORT) + android.widget.Toast.makeText(NovaReservaActivity.this, "Erro ao salvar reserva.", android.widget.Toast.LENGTH_SHORT) .show(); } }); diff --git a/app/src/main/java/com/example/pap_teste/models/Mesa.java b/app/src/main/java/com/example/pap_teste/models/Mesa.java index b23db6c..28b226f 100644 --- a/app/src/main/java/com/example/pap_teste/models/Mesa.java +++ b/app/src/main/java/com/example/pap_teste/models/Mesa.java @@ -5,16 +5,18 @@ public class Mesa { private int numero; private int capacidade; private String estado; + private String restauranteEmail; public Mesa() { // Default constructor required for calls to DataSnapshot.getValue(Mesa.class) } - public Mesa(String id, int numero, int capacidade, String estado) { + public Mesa(String id, int numero, int capacidade, String estado, String restauranteEmail) { this.id = id; this.numero = numero; this.capacidade = capacidade; this.estado = estado; + this.restauranteEmail = restauranteEmail; } public String getId() { @@ -49,6 +51,14 @@ public class Mesa { this.estado = estado; } + public String getRestauranteEmail() { + return restauranteEmail; + } + + public void setRestauranteEmail(String restauranteEmail) { + this.restauranteEmail = restauranteEmail; + } + @Override public String toString() { return "Mesa " + numero; diff --git a/app/src/main/res/drawable/ic_visibility.xml b/app/src/main/res/drawable/ic_visibility.xml new file mode 100644 index 0000000..97580c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_off.xml b/app/src/main/res/drawable/ic_visibility_off.xml new file mode 100644 index 0000000..ef3c1bc --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off.xml @@ -0,0 +1,9 @@ + + +