SuiteConsultance/modules/crm/prospect_handler.py
2025-09-20 13:18:04 +02:00

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)