first commit
This commit is contained in:
commit
e6c52820cd
227 changed files with 16156 additions and 0 deletions
157
modules/crm/prospect_handler.py
Normal file
157
modules/crm/prospect_handler.py
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue