from datetime import date import os import json from .prospect import Prospect from core.data import Data class ProspectHandler: def __init__(self, prospects_folder="Data/prospects"): self.prospects_folder = prospects_folder self.prospects = [] # Créer le dossier des prospects s'il n'existe pas if not os.path.exists(self.prospects_folder): os.makedirs(self.prospects_folder) self.load_prospects() def load_prospects(self): """Charge tous les prospects depuis les fichiers existants""" self.prospects = [] # Charger les prospects depuis les fichiers JSON existants if os.path.exists(self.prospects_folder): for filename in os.listdir(self.prospects_folder): if filename.endswith('.json'): prospect_path = os.path.join(self.prospects_folder, filename) try: # Utiliser le gestionnaire de données pour charger le fichier JSON data_manager = Data(prospect_path) prospect_data = data_manager.load_data() # Si le fichier a la structure d'un prospect, créer un objet Prospect if "name" in prospect_data: prospect = Prospect.from_dict(prospect_data) self.prospects.append(prospect) except Exception as e: print(f"Erreur lors du chargement du prospect {filename}: {e}") return self.prospects def get_all_prospects(self): """Retourne tous les prospects""" return self.prospects def get_prospect_by_id(self, prospect_id): """Retourne un prospect par son ID""" for prospect in self.prospects: if prospect.id == prospect_id: return prospect return None def get_prospect_by_name(self, prospect_name): """Retourne un prospect par son nom""" for prospect in self.prospects: if prospect.name.lower() == prospect_name.lower(): return prospect return None def add_prospect(self, prospect): """Ajoute un nouveau prospect""" self.prospects.append(prospect) # Sauvegarder le prospect dans un fichier JSON self._save_prospect(prospect) return prospect def update_prospect(self, prospect): """Met à jour un prospect existant""" for i, existing_prospect in enumerate(self.prospects): if existing_prospect.id == prospect.id: self.prospects[i] = prospect # Sauvegarder le prospect mis à jour self._save_prospect(prospect) return prospect return None def delete_prospect(self, prospect_id): """Supprime un prospect""" for i, prospect in enumerate(self.prospects): if prospect.id == prospect_id: deleted_prospect = self.prospects.pop(i) # Supprimer le fichier JSON du prospect prospect_file = os.path.join(self.prospects_folder, f"{deleted_prospect.id}.json") if os.path.exists(prospect_file): os.remove(prospect_file) return deleted_prospect return None def convert_to_client(self, prospect_id, client_handler): """Convertit un prospect en client et le supprime de la liste des prospects""" prospect = self.get_prospect_by_id(prospect_id) if prospect: # Créer un client à partir du prospect client = prospect.convert_to_client() # Ajouter le client client_handler.add_client(client) # Supprimer le prospect self.delete_prospect(prospect_id) return client return None def _save_prospect(self, prospect): """Sauvegarde un prospect dans un fichier JSON""" prospect_data = prospect.to_dict() prospect_file = os.path.join(self.prospects_folder, f"{prospect.id}.json") data_manager = Data(prospect_file) data_manager.save_data(prospect_data) return prospect_file def get_prospects_by_status(self, status): """Retourne les prospects par statut""" return [p for p in self.prospects if p.status.lower() == status.lower()] def get_recent_prospects(self, days=30): """Retourne les prospects créés dans les X derniers jours""" today = date.today() recent_prospects = [] for prospect in self.prospects: try: created_date = date.fromisoformat(prospect.created_at) delta = today - created_date if delta.days <= days: recent_prospects.append(prospect) except ValueError: # Si la date n'est pas au format ISO, ignorer ce prospect pass return recent_prospects def add_task_for_prospect(self, prospect_id: str, title: str, due_date: str, description: str = "", priority: str = "normale", metadata: dict = None): """ Crée une tâche liée à un prospect. :param prospect_id: ID du prospect :param title: Titre de la tâche :param due_date: Date d'échéance au format ISO (YYYY-MM-DD) :param description: Description optionnelle :param priority: 'basse' | 'normale' | 'haute' :param metadata: métadonnées optionnelles :return: ID de la tâche créée ou None si prospect introuvable """ prospect = self.get_prospect_by_id(prospect_id) if not prospect: return None from modules.tasks.task import Task from modules.tasks.task_handler import TaskHandler task = Task( title=title, due_date=due_date, description=description, entity_type="prospect", entity_id=prospect_id, priority=priority, metadata=metadata or {}, ) return TaskHandler().add_task(task)