diff --git a/persistencia/banco_dados.py b/persistencia/banco_dados.py index 81e5d30..4050a5d 100644 --- a/persistencia/banco_dados.py +++ b/persistencia/banco_dados.py @@ -9,10 +9,39 @@ class BancoDeDados: self.pets = Persistente() self.adocoes = Persistente() - def obter_proximo_id(self): + def obter_proximo_id_pessoa(self): ids_pessoas = [p.id for p in self.pessoas.listar_todos()] - ids_pets = [p.id for p in self.pets.listar_todos()] - ids_adocoes = [a.id for a in self.adocoes.listar_todos()] + return max(ids_pessoas) + 1 if ids_pessoas else 1 - todos_ids = ids_pessoas + ids_pets + ids_adocoes - return max(todos_ids) + 1 if todos_ids else 1 + def obter_proximo_id_pet(self): + ids_pets = [p.id for p in self.pets.listar_todos()] + return max(ids_pets) + 1 if ids_pets else 1 + + def obter_proximo_id_adocao(self): + ids_adocoes = [a.id for a in self.adocoes.listar_todos()] + return max(ids_adocoes) + 1 if ids_adocoes else 1 + + def remover_pessoa(self, id_pessoa: int): + adocoes_para_remover = [ + adocao for adocao in self.adocoes.listar_todos() + if adocao.adotante.id == id_pessoa + ] + for adocao in adocoes_para_remover: + self.adocoes.remover(adocao.id) + + self.pessoas.remover(id_pessoa) + + def remover_pet(self, id_pet: int): + adocoes_para_remover = [] + for adocao in self.adocoes.listar_todos(): + itens_para_manter = [item for item in adocao.itens if item.pet.id != id_pet] + + if len(itens_para_manter) < len(adocao.itens): + adocao.itens = itens_para_manter + if not adocao.itens: + adocoes_para_remover.append(adocao.id) + + for adocao_id in adocoes_para_remover: + self.adocoes.remover(adocao_id) + + self.pets.remover(id_pet) diff --git a/visao/frames/frame_adocao.py b/visao/frames/frame_adocao.py index 0468c22..9c4a118 100644 --- a/visao/frames/frame_adocao.py +++ b/visao/frames/frame_adocao.py @@ -154,7 +154,7 @@ class FrameAdocao(tk.Frame): data = dialog.result["data"] try: - proximo_id = self.bd.obter_proximo_id() + proximo_id = self.bd.obter_proximo_id_adocao() nova_adocao = Adocao(proximo_id, pessoa) for pet in pets: diff --git a/visao/frames/frame_pessoa.py b/visao/frames/frame_pessoa.py index 9c8498a..8bb0a48 100644 --- a/visao/frames/frame_pessoa.py +++ b/visao/frames/frame_pessoa.py @@ -1,5 +1,6 @@ import tkinter as tk from tkinter import ttk, messagebox, simpledialog +from persistencia.excecoes import EntidadeNaoEncontradaException from modelo.pessoa import Pessoa @@ -129,7 +130,7 @@ class FramePessoas(tk.Frame): def adicionar_pessoa(self): nome = simpledialog.askstring("Adicionar Pessoa", "Digite o nome da nova pessoa:", parent=self) if nome: - proximo_id = self.bd.obter_proximo_id() + proximo_id = self.bd.obter_proximo_id_pessoa() nova_pessoa = Pessoa(proximo_id, nome) self.bd.pessoas.inserir(nova_pessoa) self.popular_treeview() @@ -171,11 +172,15 @@ class FramePessoas(tk.Frame): item = self.tree.item(selecionado[0]) id_pessoa, nome_pessoa = item['values'] - if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pessoa}'?"): + + msg = (f"Tem certeza que deseja apagar '{nome_pessoa}'?\n" + "AVISO: Todas as adoções associadas a esta pessoa também serão removidas.") + + if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'): try: - self.bd.pessoas.remover(id_pessoa) + self.bd.remover_pessoa(id_pessoa) self.popular_treeview() - messagebox.showinfo("Sucesso", "Pessoa apagada com sucesso.") + messagebox.showinfo("Sucesso", "Pessoa e suas adoções foram apagadas com sucesso.") except EntidadeNaoEncontradaException as e: messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.") self.popular_treeview() diff --git a/visao/frames/frame_pet.py b/visao/frames/frame_pet.py index 6df41f0..801a01e 100644 --- a/visao/frames/frame_pet.py +++ b/visao/frames/frame_pet.py @@ -1,5 +1,6 @@ import tkinter as tk from tkinter import ttk, messagebox +from persistencia.excecoes import EntidadeNaoEncontradaException from modelo.pet import Pet from visao.componentes.dialogo_adicionar_pet import DialogoAdicionarPet, DialogoEditarPet @@ -137,7 +138,7 @@ class FramePet(tk.Frame): if dialog.result: nome = dialog.result["nome"] especie = dialog.result["especie"] - proximo_id = self.bd.obter_proximo_id() + proximo_id = self.bd.obter_proximo_id_pet() novo_pet = Pet(proximo_id, nome, especie) self.bd.pets.inserir(novo_pet) self.popular_treeview() @@ -179,11 +180,15 @@ class FramePet(tk.Frame): item = self.tree.item(selecionado[0]) id_pet, nome_pet, _ = item['values'] # Ignora a espécie, que agora está na treeview - if messagebox.askyesno("Confirmar", f"Tem certeza que deseja apagar '{nome_pet}'?"): + + msg = (f"Tem certeza que deseja apagar '{nome_pet}'?\n" + "AVISO: O pet será removido de todas as adoções existentes.") + + if messagebox.askyesno("Confirmar Exclusão", msg, icon='warning'): try: - self.bd.pets.remover(id_pet) + self.bd.remover_pet(id_pet) self.popular_treeview() - messagebox.showinfo("Sucesso", "Pet apagada com sucesso.") + messagebox.showinfo("Sucesso", "Pet apagado com sucesso.") except EntidadeNaoEncontradaException as e: messagebox.showerror("Erro", f"Não foi possível apagar: {e}\nA lista será atualizada.") self.popular_treeview()