157 lines
6.1 KiB
Python
157 lines
6.1 KiB
Python
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)
|