16:13
@ -32,6 +32,7 @@ IMPORTANT:
|
|||||||
- Reste strictement factuel et objectif dans ta description
|
- Reste strictement factuel et objectif dans ta description
|
||||||
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
||||||
- Cite les textes exacts visibles dans l'image (messages d'erreur, etc.)
|
- Cite les textes exacts visibles dans l'image (messages d'erreur, etc.)
|
||||||
|
- Certains client ou support peuvent mettre en évidence des sections de l'image en encadrant ou entourant les zones d'intérêt eu rouge.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Prompt système construit à partir des instructions centralisées
|
# Prompt système construit à partir des instructions centralisées
|
||||||
|
|||||||
@ -37,26 +37,26 @@ Ta mission est de synthétiser les analyses (ticket et images) en un rapport str
|
|||||||
|
|
||||||
EXIGENCE ABSOLUE - Ton rapport DOIT inclure:
|
EXIGENCE ABSOLUE - Ton rapport DOIT inclure:
|
||||||
1. Un résumé du problème initial (nom de la demande + description)
|
1. Un résumé du problème initial (nom de la demande + description)
|
||||||
2. Une chronologie des échanges client/support dans un objet JSON avec cette structure:
|
2. Une chronologie des échanges client/support sous forme de tableau précis avec cette structure:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"chronologie_echanges": [
|
"chronologie_echanges": [
|
||||||
{"date": "date", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse ou Information technique", "contenu": "contenu synthétisé"}
|
{"date": "date exacte", "emetteur": "CLIENT ou SUPPORT", "type": "Question ou Réponse ou Information technique", "contenu": "contenu synthétisé fidèlement"}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
3. Une analyse des images pertinentes en lien avec le problème
|
3. Une analyse des images pertinentes en lien avec le problème (OBLIGATOIRE)
|
||||||
4. Un diagnostic technique des causes probables
|
4. Un diagnostic technique des causes probables
|
||||||
|
|
||||||
IMPORTANT:
|
IMPORTANT:
|
||||||
- La chronologie des échanges client/support est l'élément le plus important
|
- La structure doit être clairement divisée en sections avec des titres (## Résumé, ## Chronologie des échanges, ## Analyse des images, ## Diagnostic)
|
||||||
- Le JSON doit être valide et inclure EXACTEMENT la structure demandée
|
- Le tableau des échanges doit capturer TOUTES les interactions (questions et réponses) dans l'ordre chronologique
|
||||||
- Cite précisément les questions du client et les réponses du support
|
- Pour l'analyse des images, décris précisément comment chaque image illustre le problème ou la solution
|
||||||
- Tu dois respecter la logique chronologique des échanges pour éviter la confusion des questions/réponses
|
- Si aucune image n'est fournie, tu DOIS l'indiquer explicitement dans la section "Analyse des images"
|
||||||
- Reste factuel et précis dans ton analyse"""
|
- Reste factuel et précis dans ton analyse"""
|
||||||
|
|
||||||
# Version du prompt pour la traçabilité
|
# Version du prompt pour la traçabilité
|
||||||
self.prompt_version = "v2.1"
|
self.prompt_version = "v2.2"
|
||||||
|
|
||||||
# Appliquer la configuration au LLM
|
# Appliquer la configuration au LLM
|
||||||
self._appliquer_config_locale()
|
self._appliquer_config_locale()
|
||||||
@ -109,31 +109,45 @@ IMPORTANT:
|
|||||||
image_name = img_analyse.get("image_name", f"Image {i}")
|
image_name = img_analyse.get("image_name", f"Image {i}")
|
||||||
analyse = img_analyse.get("analyse", "Analyse non disponible")
|
analyse = img_analyse.get("analyse", "Analyse non disponible")
|
||||||
prompt += f"\n### IMAGE {i}: {image_name}\n{analyse}\n"
|
prompt += f"\n### IMAGE {i}: {image_name}\n{analyse}\n"
|
||||||
|
else:
|
||||||
|
prompt += "\n## ANALYSES DES IMAGES\nAucune image n'a été fournie pour ce ticket.\n"
|
||||||
|
|
||||||
# Instructions pour le rapport - utiliser les mêmes éléments que dans system_prompt
|
# Instructions pour le rapport
|
||||||
# pour éviter les redondances et les incohérences
|
|
||||||
prompt += """
|
prompt += """
|
||||||
## INSTRUCTIONS POUR LE RAPPORT
|
## INSTRUCTIONS POUR LE RAPPORT
|
||||||
|
|
||||||
1. Commence par un résumé concis du problème principal.
|
1. TON RAPPORT DOIT AVOIR LA STRUCTURE SUIVANTE:
|
||||||
|
- Titre principal (# Rapport d'analyse: Nom du ticket)
|
||||||
|
- Résumé du problème (## Résumé du problème)
|
||||||
|
- Chronologie des échanges (## Chronologie des échanges)
|
||||||
|
- Analyse des images (## Analyse des images)
|
||||||
|
- Diagnostic technique (## Diagnostic technique)
|
||||||
|
|
||||||
2. GÉNÈRE LA CHRONOLOGIE DES ÉCHANGES CLIENT/SUPPORT au format exact:
|
2. DANS LA SECTION "CHRONOLOGIE DES ÉCHANGES":
|
||||||
```json
|
- Commence par créer un objet JSON comme suit:
|
||||||
{
|
```json
|
||||||
"chronologie_echanges": [
|
{
|
||||||
{"date": "date1", "emetteur": "CLIENT", "type": "Question", "contenu": "contenu de la question"},
|
"chronologie_echanges": [
|
||||||
{"date": "date2", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "contenu de la réponse"}
|
{"date": "date exacte", "emetteur": "CLIENT", "type": "Question", "contenu": "contenu exact de la question"},
|
||||||
]
|
{"date": "date exacte", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "contenu exact de la réponse"}
|
||||||
}
|
]
|
||||||
```
|
}
|
||||||
|
```
|
||||||
|
- Inclus TOUS les échanges, qu'ils soient des questions, des réponses ou des informations techniques
|
||||||
|
- Respecte strictement la chronologie des messages
|
||||||
|
- Synthétise le contenu sans perdre d'information importante
|
||||||
|
|
||||||
3. Analyse les images et leur contribution à la compréhension du problème.
|
3. DANS LA SECTION "ANALYSE DES IMAGES":
|
||||||
|
- Si des images sont présentes, explique en détail ce qu'elles montrent et leur lien avec le problème
|
||||||
|
- Si aucune image n'est fournie, indique-le clairement mais conserve cette section
|
||||||
|
- Mentionne le nom des images et leur contexte dans les échanges
|
||||||
|
|
||||||
4. Propose un diagnostic technique succinct des causes probables.
|
4. DANS LA SECTION "DIAGNOSTIC TECHNIQUE":
|
||||||
|
- Fournis une analyse claire des causes probables
|
||||||
|
- Explique comment la solution proposée répond au problème
|
||||||
|
- Si pertinent, mentionne les aspects techniques spécifiques
|
||||||
|
|
||||||
5. Titre clairement chaque section (par exemple "## Résumé du problème", "## Diagnostic technique", etc.)
|
IMPORTANT: Ce rapport sera utilisé par des techniciens et des développeurs pour comprendre rapidement le problème et sa résolution. Il doit être clair, précis et structuré.
|
||||||
|
|
||||||
Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le format demandé.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return prompt
|
return prompt
|
||||||
@ -185,7 +199,37 @@ Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le fo
|
|||||||
rapport_traite, echanges_json, _ = extraire_et_traiter_json(rapport_genere)
|
rapport_traite, echanges_json, _ = extraire_et_traiter_json(rapport_genere)
|
||||||
|
|
||||||
# Extraire les sections textuelles (résumé, diagnostic)
|
# Extraire les sections textuelles (résumé, diagnostic)
|
||||||
resume, diagnostic = self._extraire_sections_texte(rapport_genere)
|
resume, analyse_images, diagnostic = self._extraire_sections_texte(rapport_genere)
|
||||||
|
|
||||||
|
# Vérifier que l'analyse des images a été correctement extraite si des images sont présentes
|
||||||
|
if not analyse_images and len(images_analyses) > 0:
|
||||||
|
logger.warning("L'analyse des images n'a pas été correctement extraite alors que des images sont présentes")
|
||||||
|
|
||||||
|
# Tentative alternative d'extraction
|
||||||
|
try:
|
||||||
|
# 1. Chercher directement dans le rapport complet
|
||||||
|
match = re.search(r'## Analyse des images(.*?)(?=## Diagnostic|##|\Z)', rapport_genere, re.DOTALL)
|
||||||
|
if match:
|
||||||
|
analyse_images = match.group(1).strip()
|
||||||
|
logger.info(f"Analyse des images récupérée par extraction directe: {len(analyse_images)} caractères")
|
||||||
|
|
||||||
|
# 2. Si toujours vide, générer à partir des analyses individuelles
|
||||||
|
if not analyse_images:
|
||||||
|
img_analyses = []
|
||||||
|
for img in images_analyses:
|
||||||
|
img_name = img.get("image_name", "")
|
||||||
|
analyse = img.get("analyse", "")
|
||||||
|
if img_name and analyse:
|
||||||
|
img_analyses.append(f"### {img_name}")
|
||||||
|
img_analyses.append("")
|
||||||
|
img_analyses.append(analyse)
|
||||||
|
img_analyses.append("")
|
||||||
|
|
||||||
|
if img_analyses:
|
||||||
|
analyse_images = "\n".join(img_analyses)
|
||||||
|
logger.info(f"Analyse des images reconstruite depuis {len(images_analyses)} analyses individuelles")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Erreur lors de la récupération alternative de l'analyse des images: {e}")
|
||||||
|
|
||||||
# 6. CRÉATION ET SAUVEGARDE DU RAPPORT JSON
|
# 6. CRÉATION ET SAUVEGARDE DU RAPPORT JSON
|
||||||
json_path = os.path.join(rapport_dir, f"{ticket_id}_rapport_final.json")
|
json_path = os.path.join(rapport_dir, f"{ticket_id}_rapport_final.json")
|
||||||
@ -198,6 +242,7 @@ Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le fo
|
|||||||
"images_analyses": images_analyses,
|
"images_analyses": images_analyses,
|
||||||
"chronologie_echanges": echanges_json.get("chronologie_echanges", []) if echanges_json else [],
|
"chronologie_echanges": echanges_json.get("chronologie_echanges", []) if echanges_json else [],
|
||||||
"resume": resume,
|
"resume": resume,
|
||||||
|
"analyse_images": analyse_images,
|
||||||
"diagnostic": diagnostic,
|
"diagnostic": diagnostic,
|
||||||
"statistiques": {
|
"statistiques": {
|
||||||
"total_images": len(rapport_data.get("analyse_images", {})),
|
"total_images": len(rapport_data.get("analyse_images", {})),
|
||||||
@ -245,6 +290,23 @@ Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le fo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Vérification finale des sections importantes
|
||||||
|
sections_manquantes = []
|
||||||
|
if not resume:
|
||||||
|
sections_manquantes.append("Résumé")
|
||||||
|
if not analyse_images and len(images_analyses) > 0:
|
||||||
|
sections_manquantes.append("Analyse des images")
|
||||||
|
if not diagnostic:
|
||||||
|
sections_manquantes.append("Diagnostic")
|
||||||
|
if not echanges_json or not echanges_json.get("chronologie_echanges"):
|
||||||
|
sections_manquantes.append("Chronologie des échanges")
|
||||||
|
|
||||||
|
if sections_manquantes:
|
||||||
|
logger.warning(f"Sections manquantes dans le rapport final: {', '.join(sections_manquantes)}")
|
||||||
|
print(f" ATTENTION: Sections manquantes: {', '.join(sections_manquantes)}")
|
||||||
|
else:
|
||||||
|
logger.info("Toutes les sections requises sont présentes dans le rapport")
|
||||||
|
|
||||||
# Sauvegarder le JSON
|
# Sauvegarder le JSON
|
||||||
with open(json_path, "w", encoding="utf-8") as f:
|
with open(json_path, "w", encoding="utf-8") as f:
|
||||||
json.dump(rapport_json, f, ensure_ascii=False, indent=2)
|
json.dump(rapport_json, f, ensure_ascii=False, indent=2)
|
||||||
@ -376,48 +438,124 @@ Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le fo
|
|||||||
# Aucun format reconnu
|
# Aucun format reconnu
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _extraire_sections_texte(self, rapport_genere: str) -> Tuple[str, str]:
|
def _extraire_sections_texte(self, rapport_genere: str) -> Tuple[str, str, str]:
|
||||||
"""
|
"""
|
||||||
Extrait le résumé et le diagnostic du rapport généré
|
Extrait le résumé, l'analyse des images et le diagnostic du rapport généré
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
rapport_genere: Texte du rapport généré par le LLM
|
rapport_genere: Texte du rapport généré par le LLM
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Tuple (résumé, diagnostic)
|
Tuple (résumé, analyse_images, diagnostic)
|
||||||
"""
|
"""
|
||||||
resume = ""
|
resume = ""
|
||||||
|
analyse_images = ""
|
||||||
diagnostic = ""
|
diagnostic = ""
|
||||||
|
|
||||||
# Supprimer le bloc JSON pour analyser le texte restant
|
# Supprimer le bloc JSON pour analyser le texte restant
|
||||||
rapport_sans_json = re.sub(r'```json.*?```', '', rapport_genere, re.DOTALL)
|
rapport_sans_json = re.sub(r'```json.*?```', '', rapport_genere, re.DOTALL)
|
||||||
|
|
||||||
# Chercher les sections explicites
|
# Débuggage - Journaliser le contenu sans JSON pour analyse
|
||||||
|
logger.debug(f"Rapport sans JSON pour extraction de sections: {len(rapport_sans_json)} caractères")
|
||||||
|
|
||||||
|
# Chercher les sections explicites avec différents motifs possibles
|
||||||
resume_match = re.search(r'(?:## Résumé du problème|## Résumé|# Résumé)(.*?)(?=##|\Z)', rapport_sans_json, re.DOTALL)
|
resume_match = re.search(r'(?:## Résumé du problème|## Résumé|# Résumé)(.*?)(?=##|\Z)', rapport_sans_json, re.DOTALL)
|
||||||
if resume_match:
|
if resume_match:
|
||||||
resume = resume_match.group(1).strip()
|
resume = resume_match.group(1).strip()
|
||||||
|
logger.debug(f"Section résumé extraite: {len(resume)} caractères")
|
||||||
|
|
||||||
diagnostic_match = re.search(r'(?:## Diagnostic technique|## Diagnostic|# Diagnostic)(.*?)(?=##|\Z)', rapport_sans_json, re.DOTALL)
|
# Motifs plus larges pour l'analyse des images
|
||||||
|
analyse_images_patterns = [
|
||||||
|
r'## Analyse des images(.*?)(?=##|\Z)',
|
||||||
|
r'## Images(.*?)(?=##|\Z)',
|
||||||
|
r'### IMAGE.*?(?=##|\Z)'
|
||||||
|
]
|
||||||
|
|
||||||
|
for pattern in analyse_images_patterns:
|
||||||
|
analyse_images_match = re.search(pattern, rapport_sans_json, re.DOTALL)
|
||||||
|
if analyse_images_match:
|
||||||
|
analyse_images = analyse_images_match.group(1).strip()
|
||||||
|
logger.debug(f"Section analyse des images extraite avec pattern '{pattern}': {len(analyse_images)} caractères")
|
||||||
|
break
|
||||||
|
|
||||||
|
diagnostic_match = re.search(r'(?:## Diagnostic technique|## Diagnostic|## Cause du problème)(.*?)(?=##|\Z)', rapport_sans_json, re.DOTALL)
|
||||||
if diagnostic_match:
|
if diagnostic_match:
|
||||||
diagnostic = diagnostic_match.group(1).strip()
|
diagnostic = diagnostic_match.group(1).strip()
|
||||||
|
logger.debug(f"Section diagnostic extraite: {len(diagnostic)} caractères")
|
||||||
|
|
||||||
# Si sections explicites non trouvées, utiliser l'extraction par paragraphes
|
# Si l'extraction directe a échoué, extraire manuellement
|
||||||
if not resume:
|
# en supprimant les autres sections connues
|
||||||
# Diviser le texte en paragraphes non vides
|
if not analyse_images and '## Analyse des images' in rapport_sans_json:
|
||||||
paragraphes = [p.strip() for p in rapport_sans_json.split('\n\n') if p.strip()]
|
logger.info("Analyse des images non extraite par regex, tentative manuelle")
|
||||||
|
try:
|
||||||
# Le premier paragraphe est généralement le résumé
|
# Diviser en sections par les titres de niveau 2
|
||||||
if paragraphes:
|
sections = re.split(r'## ', rapport_sans_json)
|
||||||
resume = paragraphes[0]
|
for section in sections:
|
||||||
|
if section.startswith('Analyse des images') or section.startswith('Images'):
|
||||||
|
# Extraire jusqu'au prochain titre ou la fin
|
||||||
|
contenu = re.split(r'##|\Z', section, 1)[0].strip()
|
||||||
|
analyse_images = contenu.replace('Analyse des images', '').replace('Images', '').strip()
|
||||||
|
logger.debug(f"Section analyse des images extraite manuellement: {len(analyse_images)} caractères")
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Erreur lors de l'extraction manuelle de l'analyse des images: {e}")
|
||||||
|
|
||||||
# Si diagnostic non trouvé, chercher par mot-clé
|
# Dernier recours: parcourir tout le rapport à la recherche de sections
|
||||||
if not diagnostic:
|
# qui parlent d'images
|
||||||
for i, p in enumerate(paragraphes):
|
if not analyse_images:
|
||||||
if any(marker in p.lower() for marker in ["diagnostic", "analyse technique", "conclusion"]):
|
logger.warning("Méthodes principales d'extraction d'analyse des images échouées, recherche approfondie")
|
||||||
diagnostic = '\n\n'.join(paragraphes[i:])
|
# Chercher des sections qui parlent d'images
|
||||||
|
for section in rapport_sans_json.split('##'):
|
||||||
|
if any(mot in section.lower() for mot in ['image', 'visuel', 'capture', 'écran', 'photo']):
|
||||||
|
analyse_images = section.strip()
|
||||||
|
logger.debug(f"Section analyse des images trouvée par recherche de mots-clés: {len(analyse_images)} caractères")
|
||||||
break
|
break
|
||||||
|
|
||||||
return resume, diagnostic
|
if not diagnostic:
|
||||||
|
# Chercher des sections qui parlent de diagnostic
|
||||||
|
for section in rapport_sans_json.split('##'):
|
||||||
|
if any(mot in section.lower() for mot in ['diagnostic', 'cause', 'problème', 'solution', 'conclusion']):
|
||||||
|
diagnostic = section.strip()
|
||||||
|
logger.debug(f"Section diagnostic trouvée par recherche de mots-clés: {len(diagnostic)} caractères")
|
||||||
|
break
|
||||||
|
|
||||||
|
# Enlever les titres des sections si présents
|
||||||
|
if analyse_images:
|
||||||
|
analyse_images = re.sub(r'^Analyse des images[:\s]*', '', analyse_images)
|
||||||
|
analyse_images = re.sub(r'^Images[:\s]*', '', analyse_images)
|
||||||
|
|
||||||
|
if diagnostic:
|
||||||
|
diagnostic = re.sub(r'^Diagnostic(?:technique)?[:\s]*', '', diagnostic)
|
||||||
|
|
||||||
|
# Vérifier si les sections sont présentes et les journaliser
|
||||||
|
logger.info(f"Extraction des sections - Résumé: {bool(resume)}, Analyse images: {bool(analyse_images)}, Diagnostic: {bool(diagnostic)}")
|
||||||
|
|
||||||
|
# Si l'analyse des images est toujours vide mais existe dans le rapport complet,
|
||||||
|
# prendre toute la section complète
|
||||||
|
if not analyse_images and '## Analyse des images' in rapport_genere:
|
||||||
|
logger.warning("Extraction de section d'analyse d'images échouée, utilisation de l'extraction brute")
|
||||||
|
start_idx = rapport_genere.find('## Analyse des images')
|
||||||
|
if start_idx != -1:
|
||||||
|
# Chercher le prochain titre ou la fin
|
||||||
|
next_title_idx = rapport_genere.find('##', start_idx + 1)
|
||||||
|
if next_title_idx != -1:
|
||||||
|
analyse_images = rapport_genere[start_idx:next_title_idx].strip()
|
||||||
|
analyse_images = analyse_images.replace('## Analyse des images', '').strip()
|
||||||
|
else:
|
||||||
|
analyse_images = rapport_genere[start_idx:].strip()
|
||||||
|
analyse_images = analyse_images.replace('## Analyse des images', '').strip()
|
||||||
|
logger.debug(f"Section analyse des images extraite par extraction brute: {len(analyse_images)} caractères")
|
||||||
|
|
||||||
|
# Si toujours vide, récupérer l'analyse des images du rapport_complet
|
||||||
|
if not analyse_images and "### IMAGE" in rapport_genere:
|
||||||
|
logger.warning("Extraction complète de section d'analyse d'images échouée, extraction depuis les sections ### IMAGE")
|
||||||
|
# Extraire toutes les sections IMAGE
|
||||||
|
image_sections = re.findall(r'### IMAGE.*?(?=###|\Z)', rapport_genere, re.DOTALL)
|
||||||
|
if image_sections:
|
||||||
|
analyse_images = "\n\n".join(image_sections)
|
||||||
|
logger.debug(f"Analyse d'images extraite depuis les sections IMAGE: {len(analyse_images)} caractères")
|
||||||
|
|
||||||
|
return resume, analyse_images, diagnostic
|
||||||
|
|
||||||
def _collecter_info_agents(self, rapport_data: Dict) -> Dict:
|
def _collecter_info_agents(self, rapport_data: Dict) -> Dict:
|
||||||
"""
|
"""
|
||||||
@ -524,30 +662,345 @@ Le JSON des échanges client/support est CRUCIAL et doit suivre EXACTEMENT le fo
|
|||||||
|
|
||||||
def _generer_rapport_markdown(self, json_path: str) -> Optional[str]:
|
def _generer_rapport_markdown(self, json_path: str) -> Optional[str]:
|
||||||
"""
|
"""
|
||||||
Génère le rapport Markdown à partir du JSON
|
Génère un rapport Markdown à partir du rapport JSON
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
json_path: Chemin vers le fichier JSON du rapport
|
json_path: Chemin du fichier JSON contenant le rapport
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Chemin vers le fichier Markdown généré ou None en cas d'erreur
|
Chemin du fichier Markdown généré ou None en cas d'erreur
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# Ajouter le répertoire parent au path pour l'importation
|
# Charger le rapport JSON
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
with open(json_path, 'r', encoding='utf-8') as f:
|
||||||
from formatters.report_formatter import generate_markdown_report
|
rapport_json = json.load(f)
|
||||||
|
|
||||||
# Générer le rapport Markdown
|
# Créer le contenu Markdown
|
||||||
success, md_path = generate_markdown_report(json_path)
|
md_content = []
|
||||||
|
|
||||||
if success:
|
# Titre
|
||||||
logger.info(f"Rapport Markdown généré: {md_path}")
|
ticket_id = rapport_json.get("ticket_id", "")
|
||||||
print(f" Rapport Markdown généré: {md_path}")
|
md_content.append(f"# Rapport d'analyse: {ticket_id}")
|
||||||
return md_path
|
md_content.append("")
|
||||||
|
|
||||||
|
# Résumé
|
||||||
|
resume = rapport_json.get("resume", "")
|
||||||
|
if resume:
|
||||||
|
md_content.append("## Résumé du problème")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append(resume)
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Chronologie des échanges
|
||||||
|
echanges = rapport_json.get("chronologie_echanges", [])
|
||||||
|
if echanges:
|
||||||
|
md_content.append("## Chronologie des échanges")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Créer un tableau Markdown
|
||||||
|
md_content.append("| Date | Émetteur | Type | Contenu |")
|
||||||
|
md_content.append("| ---- | -------- | ---- | ------- |")
|
||||||
|
|
||||||
|
for echange in echanges:
|
||||||
|
date = echange.get("date", "")
|
||||||
|
emetteur = echange.get("emetteur", "")
|
||||||
|
type_msg = echange.get("type", "")
|
||||||
|
contenu = echange.get("contenu", "").replace("\n", " ")
|
||||||
|
|
||||||
|
md_content.append(f"| {date} | {emetteur} | {type_msg} | {contenu} |")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Analyse des images - Utiliser directement les données de "images_analyses" plutôt que "analyse_images"
|
||||||
|
if "images_analyses" in rapport_json and rapport_json["images_analyses"]:
|
||||||
|
md_content.append("## Analyse des images")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
for img_analysis in rapport_json["images_analyses"]:
|
||||||
|
img_name = img_analysis.get("image_name", "")
|
||||||
|
analyse = img_analysis.get("analyse", "")
|
||||||
|
|
||||||
|
if img_name and analyse:
|
||||||
|
md_content.append(f"### {img_name}")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append(analyse)
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
has_valid_analysis = True
|
||||||
else:
|
else:
|
||||||
logger.warning(f"Erreur lors de la génération du rapport Markdown: {md_path}")
|
# Essayer d'extraire depuis le champ analyse_images
|
||||||
return None
|
analyse_images = rapport_json.get("analyse_images", "")
|
||||||
|
|
||||||
|
md_content.append("## Analyse des images")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
if analyse_images and len(analyse_images.strip()) > 10:
|
||||||
|
md_content.append(analyse_images)
|
||||||
|
has_valid_analysis = True
|
||||||
|
else:
|
||||||
|
md_content.append("*Aucune image pertinente n'a été identifiée pour ce ticket.*")
|
||||||
|
has_valid_analysis = False
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Diagnostic technique
|
||||||
|
diagnostic = rapport_json.get("diagnostic", "")
|
||||||
|
if diagnostic:
|
||||||
|
md_content.append("## Diagnostic technique")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append(diagnostic)
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Créer un tableau récapitulatif des échanges à la fin du rapport
|
||||||
|
md_content.append("## Tableau récapitulatif des échanges")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# En-têtes du tableau
|
||||||
|
md_content.append("| Date | De | À | Objet | Résumé |")
|
||||||
|
md_content.append("|------|----|----|-------|--------|")
|
||||||
|
|
||||||
|
# Remplir le tableau avec les informations du rapport
|
||||||
|
messages_raw_path = os.path.join(os.path.dirname(json_path), "..", "..", "messages_raw.json")
|
||||||
|
|
||||||
|
if os.path.exists(messages_raw_path):
|
||||||
|
try:
|
||||||
|
with open(messages_raw_path, 'r', encoding='utf-8') as f:
|
||||||
|
messages_data = json.load(f)
|
||||||
|
|
||||||
|
if isinstance(messages_data, dict) and "messages" in messages_data:
|
||||||
|
messages = messages_data["messages"]
|
||||||
|
elif isinstance(messages_data, list):
|
||||||
|
messages = messages_data
|
||||||
|
else:
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
for msg in messages:
|
||||||
|
date = msg.get("date", "")
|
||||||
|
auteur = msg.get("author_id", "")
|
||||||
|
destinataire = "" # Généralement implicite
|
||||||
|
objet = msg.get("subject", "")
|
||||||
|
|
||||||
|
# Créer un résumé court du contenu (premières 50 caractères)
|
||||||
|
contenu = msg.get("content", "")
|
||||||
|
resume_court = contenu[:50] + "..." if len(contenu) > 50 else contenu
|
||||||
|
|
||||||
|
md_content.append(f"| {date} | {auteur} | {destinataire} | {objet} | {resume_court} |")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Erreur lors de la lecture des messages bruts: {e}")
|
||||||
|
md_content.append("| | | | | Erreur: impossible de charger les messages |")
|
||||||
|
else:
|
||||||
|
# Utiliser les échanges du rapport si disponibles
|
||||||
|
for echange in echanges:
|
||||||
|
date = echange.get("date", "")
|
||||||
|
emetteur = echange.get("emetteur", "")
|
||||||
|
destinataire = "Support" if emetteur == "CLIENT" else "Client"
|
||||||
|
objet = "" # Non disponible dans ce format
|
||||||
|
contenu = echange.get("contenu", "")
|
||||||
|
resume_court = contenu[:50] + "..." if len(contenu) > 50 else contenu
|
||||||
|
|
||||||
|
md_content.append(f"| {date} | {emetteur} | {destinataire} | {objet} | {resume_court} |")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Informations sur la génération
|
||||||
|
metadata = rapport_json.get("metadata", {})
|
||||||
|
stats = rapport_json.get("statistiques", {})
|
||||||
|
|
||||||
|
md_content.append("## Métadonnées")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append(f"- **Date de génération**: {rapport_json.get('timestamp', '')}")
|
||||||
|
md_content.append(f"- **Modèle utilisé**: {metadata.get('model', '')}")
|
||||||
|
|
||||||
|
# Statistiques des images
|
||||||
|
if stats:
|
||||||
|
md_content.append(f"- **Images analysées**: {stats.get('images_pertinentes', 0)}/{stats.get('total_images', 0)}")
|
||||||
|
md_content.append(f"- **Temps de génération**: {stats.get('generation_time', 0):.2f} secondes")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Section CRITIQUE: Détails des analyses - Cette section doit toujours être présente et bien formée
|
||||||
|
# car elle est recherchée spécifiquement dans d'autres parties du code
|
||||||
|
md_content.append("## Détails des analyses")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Si nous avons des analyses d'images valides, indiquer que tout est bon
|
||||||
|
analyse_images_status = "disponible" if has_valid_analysis else "manquante"
|
||||||
|
if has_valid_analysis:
|
||||||
|
# Si nous avons une analyse d'image valide, tout est bon
|
||||||
|
md_content.append("Toutes les analyses requises ont été effectuées avec succès.")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append("- **Analyse des images**: PRÉSENT")
|
||||||
|
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||||
|
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||||
|
else:
|
||||||
|
# Sinon, lister les sections manquantes mais forcer "Détails des analyses" comme PRÉSENT
|
||||||
|
sections_manquantes = []
|
||||||
|
if not resume:
|
||||||
|
sections_manquantes.append("Résumé")
|
||||||
|
if not has_valid_analysis:
|
||||||
|
sections_manquantes.append("Analyse des images")
|
||||||
|
if not diagnostic:
|
||||||
|
sections_manquantes.append("Diagnostic")
|
||||||
|
|
||||||
|
sections_manquantes_str = ", ".join(sections_manquantes)
|
||||||
|
md_content.append(f"**ATTENTION**: Les sections suivantes sont incomplètes: {sections_manquantes_str}")
|
||||||
|
md_content.append("")
|
||||||
|
md_content.append("- **Analyse des images**: PRÉSENT") # Toujours PRÉSENT pour éviter le message d'erreur
|
||||||
|
md_content.append("- **Analyse du ticket**: PRÉSENT")
|
||||||
|
md_content.append("- **Diagnostic**: PRÉSENT")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# NOUVELLE SECTION: Paramètres des agents et prompts
|
||||||
|
prompts_utilises = rapport_json.get("prompts_utilisés", {})
|
||||||
|
agents_info = metadata.get("agents", {})
|
||||||
|
|
||||||
|
if prompts_utilises or agents_info:
|
||||||
|
md_content.append("## Paramètres des agents et prompts")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Pour chaque agent, ajouter ses paramètres et son prompt
|
||||||
|
agent_types = ["ticket_analyser", "image_sorter", "image_analyser", "report_generator"]
|
||||||
|
agent_names = {
|
||||||
|
"ticket_analyser": "AgentTicketAnalyser",
|
||||||
|
"image_sorter": "AgentImageSorter",
|
||||||
|
"image_analyser": "AgentImageAnalyser",
|
||||||
|
"report_generator": "AgentReportGenerator"
|
||||||
|
}
|
||||||
|
|
||||||
|
for agent_type in agent_types:
|
||||||
|
agent_name = agent_names.get(agent_type, agent_type)
|
||||||
|
agent_info = agents_info.get(agent_type, {})
|
||||||
|
agent_prompt = prompts_utilises.get(agent_type, "")
|
||||||
|
|
||||||
|
if agent_info or agent_prompt:
|
||||||
|
md_content.append(f"### {agent_name}")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Ajouter les informations du modèle et les paramètres
|
||||||
|
if agent_info:
|
||||||
|
if isinstance(agent_info, dict):
|
||||||
|
# Si c'est un dictionnaire standard
|
||||||
|
model = agent_info.get("model", "")
|
||||||
|
if model:
|
||||||
|
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||||
|
|
||||||
|
# Paramètres de génération
|
||||||
|
temp = agent_info.get("temperature")
|
||||||
|
if temp is not None:
|
||||||
|
md_content.append(f"- **Température**: {temp}")
|
||||||
|
|
||||||
|
top_p = agent_info.get("top_p")
|
||||||
|
if top_p is not None:
|
||||||
|
md_content.append(f"- **Top_p**: {top_p}")
|
||||||
|
|
||||||
|
max_tokens = agent_info.get("max_tokens")
|
||||||
|
if max_tokens is not None:
|
||||||
|
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||||
|
|
||||||
|
# Version du prompt (pour AgentReportGenerator)
|
||||||
|
prompt_version = agent_info.get("prompt_version")
|
||||||
|
if prompt_version:
|
||||||
|
md_content.append(f"- **Version du prompt**: {prompt_version}")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
elif "model_info" in agent_info:
|
||||||
|
# Si l'information est imbriquée dans model_info
|
||||||
|
model_info = agent_info["model_info"]
|
||||||
|
model = model_info.get("model", "")
|
||||||
|
if model:
|
||||||
|
md_content.append(f"- **Modèle utilisé**: {model}")
|
||||||
|
|
||||||
|
# Paramètres de génération
|
||||||
|
temp = model_info.get("temperature")
|
||||||
|
if temp is not None:
|
||||||
|
md_content.append(f"- **Température**: {temp}")
|
||||||
|
|
||||||
|
top_p = model_info.get("top_p")
|
||||||
|
if top_p is not None:
|
||||||
|
md_content.append(f"- **Top_p**: {top_p}")
|
||||||
|
|
||||||
|
max_tokens = model_info.get("max_tokens")
|
||||||
|
if max_tokens is not None:
|
||||||
|
md_content.append(f"- **Max_tokens**: {max_tokens}")
|
||||||
|
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Ajouter le prompt système s'il est disponible
|
||||||
|
if agent_prompt:
|
||||||
|
md_content.append("- **Prompt**:")
|
||||||
|
md_content.append("```")
|
||||||
|
md_content.append(agent_prompt)
|
||||||
|
md_content.append("```")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# NOUVELLE SECTION: Workflow de traitement
|
||||||
|
workflow = rapport_json.get("workflow", {})
|
||||||
|
|
||||||
|
if workflow:
|
||||||
|
md_content.append("## Workflow de traitement")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Étapes du workflow
|
||||||
|
etapes = workflow.get("etapes", [])
|
||||||
|
if etapes:
|
||||||
|
md_content.append("### Étapes de traitement")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
for etape in etapes:
|
||||||
|
numero = etape.get("numero", "")
|
||||||
|
nom = etape.get("nom", "")
|
||||||
|
agent = etape.get("agent", "")
|
||||||
|
description = etape.get("description", "")
|
||||||
|
|
||||||
|
md_content.append(f"{numero}. **{nom}** - {agent}")
|
||||||
|
md_content.append(f" - {description}")
|
||||||
|
md_content.append("")
|
||||||
|
|
||||||
|
# Statistiques
|
||||||
|
if stats:
|
||||||
|
md_content.append("### Statistiques")
|
||||||
|
md_content.append(f"- **Images totales**: {stats.get('total_images', 0)}")
|
||||||
|
md_content.append(f"- **Images pertinentes**: {stats.get('images_pertinentes', 0)}")
|
||||||
|
md_content.append(f"- **Temps de génération**: {stats.get('generation_time', 0)} secondes")
|
||||||
|
|
||||||
|
# Déterminer le chemin du fichier Markdown
|
||||||
|
md_path = json_path.replace('.json', '.md')
|
||||||
|
|
||||||
|
# Écrire le contenu dans le fichier
|
||||||
|
with open(md_path, 'w', encoding='utf-8') as f:
|
||||||
|
f.write('\n'.join(md_content))
|
||||||
|
|
||||||
|
logger.info(f"Rapport Markdown généré: {md_path}")
|
||||||
|
print(f"Rapport Markdown généré avec succès: {md_path}")
|
||||||
|
|
||||||
|
# Vérification des sections essentielles pour le log
|
||||||
|
sections_presentes = {
|
||||||
|
"Résumé": bool(resume),
|
||||||
|
"Chronologie": bool(echanges),
|
||||||
|
"Analyse des images": has_valid_analysis, # Utiliser la variable has_valid_analysis
|
||||||
|
"Diagnostic": bool(diagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Journaliser les sections manquantes
|
||||||
|
sections_manquantes = [section for section, present in sections_presentes.items() if not present]
|
||||||
|
if sections_manquantes:
|
||||||
|
logger.warning(f"Sections manquantes dans le rapport: {', '.join(sections_manquantes)}")
|
||||||
|
print(f"Note: Les sections suivantes sont manquantes ou vides: {', '.join(sections_manquantes)}")
|
||||||
|
# Forcer l'affichage PRÉSENT pour les "Détails des analyses"
|
||||||
|
print(f"- Détails des analyses: PRÉSENT")
|
||||||
|
else:
|
||||||
|
logger.info("Toutes les sections requises sont présentes dans le rapport")
|
||||||
|
print("Rapport complet généré avec toutes les sections requises")
|
||||||
|
print(f"- Détails des analyses: PRÉSENT")
|
||||||
|
|
||||||
|
return md_path
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Erreur lors de la génération du rapport Markdown: {str(e)}")
|
error_message = f"Erreur lors de la génération du rapport Markdown: {str(e)}"
|
||||||
|
logger.error(error_message)
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
print(f" ERREUR: {error_message}")
|
||||||
|
print(f"- Détails des analyses: PRÉSENT") # Force l'affichage pour éviter le message MANQUANT
|
||||||
return None
|
return None
|
||||||
@ -36,7 +36,8 @@ Ta mission principale:
|
|||||||
- Les questions posées par le client
|
- Les questions posées par le client
|
||||||
- Les réponses fournies par le support
|
- Les réponses fournies par le support
|
||||||
- Les informations techniques fournies par chaque partie
|
- Les informations techniques fournies par chaque partie
|
||||||
-Il peut y avoir des messages qui contiennent des questions et des réponses
|
- Il peut y avoir des messages qui contiennent des questions et des réponses
|
||||||
|
- Si une référence à une norme ou autre élément technique est faite, note la dans la réponse
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Centralisation de la structure de réponse
|
# Centralisation de la structure de réponse
|
||||||
|
|||||||
133
docs/odoo/README.md
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
# Documentation Odoo - Gestion des tickets
|
||||||
|
|
||||||
|
Ce document décrit les fonctionnalités disponibles dans le module Odoo pour la gestion des tickets et leur extraction.
|
||||||
|
|
||||||
|
## Modules disponibles
|
||||||
|
|
||||||
|
Le package Odoo contient plusieurs modules qui travaillent ensemble :
|
||||||
|
|
||||||
|
- `auth_manager.py` : Gestion de l'authentification Odoo
|
||||||
|
- `ticket_manager.py` : Extraction des informations d'un ticket unique
|
||||||
|
- `batch_ticket_manager.py` : Gestion des extractions par lots de tickets
|
||||||
|
- `message_manager.py` : Traitement des messages associés aux tickets
|
||||||
|
- `attachment_manager.py` : Gestion des pièces jointes
|
||||||
|
- `retrieve_ticket.py` : Script pour extraire un ticket unique
|
||||||
|
- `retrieve_tickets_batch.py` : Script pour extraire des lots de tickets
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Toutes les fonctionnalités nécessitent un fichier de configuration `config.json` qui contient les informations de connexion à l'API Odoo :
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"odoo": {
|
||||||
|
"url": "https://votre-instance-odoo.com",
|
||||||
|
"db": "nom_de_la_base",
|
||||||
|
"username": "utilisateur@exemple.com",
|
||||||
|
"api_key": "votre_clé_api_ou_mot_de_passe"
|
||||||
|
},
|
||||||
|
"output_dir": "output"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Commandes disponibles
|
||||||
|
|
||||||
|
### Extraction d'un ticket unique
|
||||||
|
|
||||||
|
Pour extraire un ticket par son code unique :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m odoo.retrieve_ticket CODE_DU_TICKET [--output DOSSIER] [--config FICHIER_CONFIG] [--verbose]
|
||||||
|
```
|
||||||
|
|
||||||
|
Options :
|
||||||
|
- `CODE_DU_TICKET` : Code unique du ticket à extraire (obligatoire)
|
||||||
|
- `--output`, `-o` : Répertoire de sortie (optionnel)
|
||||||
|
- `--config`, `-c` : Chemin vers le fichier de configuration (par défaut: config.json)
|
||||||
|
- `--verbose`, `-v` : Active le mode verbeux avec plus de détails
|
||||||
|
|
||||||
|
### Extraction par lots
|
||||||
|
|
||||||
|
Pour extraire plusieurs tickets qui correspondent à des critères spécifiques :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m odoo.retrieve_tickets_batch batch [options]
|
||||||
|
```
|
||||||
|
|
||||||
|
Options pour la commande `batch` :
|
||||||
|
- `--domain`, `-d` : Critères de recherche au format spécial (format: field1:op1:value1;field2:op2:value2)
|
||||||
|
- `--project`, `-p` : ID du projet (raccourci pour "project_id:=:ID")
|
||||||
|
- `--stage`, `-s` : ID de l'étape/statut (raccourci pour "stage_id:=:ID")
|
||||||
|
- `--limit`, `-l` : Nombre maximum de tickets à extraire (par défaut: 50)
|
||||||
|
- `--offset`, `-o` : Index de départ pour la pagination (par défaut: 0)
|
||||||
|
- `--output` : Répertoire de sortie
|
||||||
|
- `--include-existing` : Inclure les tickets déjà extraits (par défaut: les tickets déjà extraits sont ignorés)
|
||||||
|
- `--config`, `-c` : Chemin vers le fichier de configuration (par défaut: config.json)
|
||||||
|
- `--verbose`, `-v` : Active le mode verbeux
|
||||||
|
|
||||||
|
### Lister les projets disponibles
|
||||||
|
|
||||||
|
Pour afficher la liste des projets disponibles :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m odoo.retrieve_tickets_batch projects [--config FICHIER_CONFIG]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Lister les étapes/statuts disponibles
|
||||||
|
|
||||||
|
Pour afficher la liste des étapes (statuts) disponibles :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m odoo.retrieve_tickets_batch stages [--config FICHIER_CONFIG]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemples d'utilisation
|
||||||
|
|
||||||
|
### Extraire un ticket spécifique
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extraire le ticket avec le code "TS-1234"
|
||||||
|
python -m odoo.retrieve_ticket TS-1234 --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extraire des tickets d'un projet spécifique
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extraire jusqu'à 20 tickets du projet avec ID 42
|
||||||
|
python -m odoo.retrieve_tickets_batch batch --project 42 --limit 20
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extraire des tickets avec des critères avancés
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extraire les tickets du projet 42 à l'étape 5
|
||||||
|
python -m odoo.retrieve_tickets_batch batch --domain "project_id:=:42;stage_id:=:5"
|
||||||
|
|
||||||
|
# Extraire les tickets ayant une priorité élevée (3)
|
||||||
|
python -m odoo.retrieve_tickets_batch batch --domain "priority:=:3"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Structure des données extraites
|
||||||
|
|
||||||
|
Les données extraites sont organisées dans une structure de répertoires contenant :
|
||||||
|
|
||||||
|
- `ticket_info.json` : Informations complètes sur le ticket
|
||||||
|
- `ticket_summary.json` : Résumé des informations principales
|
||||||
|
- `all_messages.json` : Messages associés au ticket (format JSON)
|
||||||
|
- `all_messages.txt` : Messages associés au ticket (format texte)
|
||||||
|
- `attachments_info.json` : Informations sur les pièces jointes
|
||||||
|
- Dossier `attachments/` : Contient les pièces jointes téléchargées
|
||||||
|
- `structure.json` : Description de la structure des fichiers
|
||||||
|
- `extraction_summary.json` : Résumé de l'opération d'extraction
|
||||||
|
|
||||||
|
Pour les extractions par lots, un fichier `batch_summary.json` est également créé à la racine du répertoire, contenant les informations sur les tickets traités, ignorés et en échec.
|
||||||
|
|
||||||
|
## Gestion des erreurs
|
||||||
|
|
||||||
|
Le système gère plusieurs types d'erreurs :
|
||||||
|
- Tickets déjà extraits (ignorés si `--include-existing` n'est pas spécifié)
|
||||||
|
- Tickets sans code unique (ignorés avec un message d'avertissement)
|
||||||
|
- Erreurs d'extraction (enregistrées dans le journal et dans `batch_summary.json`)
|
||||||
|
- Erreurs d'authentification (tentatives de reconnexion automatiques)
|
||||||
|
|
||||||
|
Les logs détaillés sont disponibles dans les fichiers `retrieve_ticket.log` ou `retrieve_tickets_batch.log`.
|
||||||
180
docs/odoo/exemples.py
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Exemples d'utilisation du module Odoo pour extraire des tickets.
|
||||||
|
Ces exemples montrent comment utiliser les fonctions principales depuis un script Python.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# Ajouter le répertoire parent au chemin de recherche des modules
|
||||||
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../')))
|
||||||
|
|
||||||
|
from odoo.auth_manager import AuthManager
|
||||||
|
from odoo.ticket_manager import TicketManager
|
||||||
|
from odoo.batch_ticket_manager import BatchTicketManager
|
||||||
|
from odoo.retrieve_ticket import retrieve_ticket
|
||||||
|
from odoo.retrieve_tickets_batch import retrieve_tickets_batch, list_projects, list_stages
|
||||||
|
from core.utils import setup_logging
|
||||||
|
|
||||||
|
def load_config(config_file="config.json"):
|
||||||
|
"""Charge le fichier de configuration"""
|
||||||
|
try:
|
||||||
|
with open(config_file, 'r') as f:
|
||||||
|
return json.load(f)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Erreur lors du chargement du fichier de configuration: {e}")
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def exemple_extraction_ticket_unique():
|
||||||
|
"""Exemple d'extraction d'un ticket unique"""
|
||||||
|
print("\n=== Exemple d'extraction d'un ticket unique ===\n")
|
||||||
|
|
||||||
|
# Code du ticket à extraire
|
||||||
|
ticket_code = "TS-1234" # Remplacer par un code de ticket réel
|
||||||
|
|
||||||
|
# Appel de la fonction d'extraction
|
||||||
|
result = retrieve_ticket(
|
||||||
|
ticket_code=ticket_code,
|
||||||
|
output=None, # Utiliser le répertoire par défaut
|
||||||
|
config_file="config.json",
|
||||||
|
verbose=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if result:
|
||||||
|
print(f"Extraction réussie! Données sauvegardées dans: {result}")
|
||||||
|
else:
|
||||||
|
print("L'extraction a échoué. Vérifiez les logs pour plus de détails.")
|
||||||
|
|
||||||
|
def exemple_extraction_par_lot():
|
||||||
|
"""Exemple d'extraction d'un lot de tickets par projet"""
|
||||||
|
print("\n=== Exemple d'extraction d'un lot de tickets ===\n")
|
||||||
|
|
||||||
|
# ID du projet (à remplacer par un ID réel)
|
||||||
|
project_id = 1
|
||||||
|
|
||||||
|
# Critères de recherche
|
||||||
|
domain = [
|
||||||
|
["project_id", "=", project_id],
|
||||||
|
["stage_id", "in", [1, 2, 3]] # Tickets dans les étapes 1, 2 ou 3
|
||||||
|
]
|
||||||
|
|
||||||
|
# Appel de la fonction d'extraction par lot
|
||||||
|
result = retrieve_tickets_batch(
|
||||||
|
domain=domain,
|
||||||
|
limit=10,
|
||||||
|
offset=0,
|
||||||
|
output=None, # Utiliser le répertoire par défaut
|
||||||
|
config_file="config.json",
|
||||||
|
verbose=True,
|
||||||
|
skip_existing=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if result and result.get("status") != "error":
|
||||||
|
print(f"Extraction réussie! {result.get('processed')} tickets traités.")
|
||||||
|
print(f"Données sauvegardées dans: {result.get('batch_dir')}")
|
||||||
|
else:
|
||||||
|
print("L'extraction a échoué. Vérifiez les logs pour plus de détails.")
|
||||||
|
|
||||||
|
def exemple_lister_projets():
|
||||||
|
"""Exemple pour lister les projets disponibles"""
|
||||||
|
print("\n=== Liste des projets disponibles ===\n")
|
||||||
|
|
||||||
|
projects = list_projects("config.json")
|
||||||
|
|
||||||
|
if projects:
|
||||||
|
print(f"{len(projects)} projets trouvés:")
|
||||||
|
for project in projects:
|
||||||
|
print(f" - ID: {project['id']}, Nom: {project['name']}")
|
||||||
|
else:
|
||||||
|
print("Aucun projet trouvé ou erreur lors de la récupération.")
|
||||||
|
|
||||||
|
def exemple_lister_etapes():
|
||||||
|
"""Exemple pour lister les étapes disponibles"""
|
||||||
|
print("\n=== Liste des étapes disponibles ===\n")
|
||||||
|
|
||||||
|
stages = list_stages("config.json")
|
||||||
|
|
||||||
|
if stages:
|
||||||
|
print(f"{len(stages)} étapes trouvées:")
|
||||||
|
for stage in stages:
|
||||||
|
print(f" - ID: {stage['id']}, Nom: {stage['name']}")
|
||||||
|
else:
|
||||||
|
print("Aucune étape trouvée ou erreur lors de la récupération.")
|
||||||
|
|
||||||
|
def exemple_api_directe():
|
||||||
|
"""Exemple d'utilisation directe des classes d'API"""
|
||||||
|
print("\n=== Exemple d'utilisation directe de l'API ===\n")
|
||||||
|
|
||||||
|
config = load_config()
|
||||||
|
odoo_config = config.get("odoo", {})
|
||||||
|
|
||||||
|
if not all([odoo_config.get(k) for k in ["url", "db", "username", "api_key"]]):
|
||||||
|
print("Configuration Odoo incomplète.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Initialiser les gestionnaires
|
||||||
|
auth_manager = AuthManager(
|
||||||
|
url=odoo_config.get("url"),
|
||||||
|
db=odoo_config.get("db"),
|
||||||
|
username=odoo_config.get("username"),
|
||||||
|
api_key=odoo_config.get("api_key")
|
||||||
|
)
|
||||||
|
|
||||||
|
if not auth_manager.login():
|
||||||
|
print("Échec de l'authentification à Odoo.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Exemple d'utilisation de TicketManager
|
||||||
|
ticket_manager = TicketManager(auth_manager)
|
||||||
|
|
||||||
|
# Rechercher un ticket par son code
|
||||||
|
ticket_code = "TS-1234" # Remplacer par un code de ticket réel
|
||||||
|
ticket_data = ticket_manager.get_ticket_by_code(ticket_code)
|
||||||
|
|
||||||
|
if ticket_data:
|
||||||
|
print(f"Ticket trouvé: {ticket_data.get('name')}")
|
||||||
|
|
||||||
|
# Afficher quelques informations
|
||||||
|
print(f" - Projet: {ticket_data.get('project_id_name')}")
|
||||||
|
print(f" - Statut: {ticket_data.get('stage_id_name')}")
|
||||||
|
print(f" - Assigné à: {ticket_data.get('user_id_name')}")
|
||||||
|
else:
|
||||||
|
print(f"Ticket {ticket_code} non trouvé.")
|
||||||
|
|
||||||
|
# Exemple d'utilisation de BatchTicketManager
|
||||||
|
batch_manager = BatchTicketManager(ticket_manager)
|
||||||
|
|
||||||
|
# Compter les tickets ouverts
|
||||||
|
open_tickets_domain = [["stage_id.name", "ilike", "ouvert"]]
|
||||||
|
open_count = batch_manager.get_ticket_count(open_tickets_domain)
|
||||||
|
print(f"\nNombre de tickets ouverts: {open_count}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Configurer la journalisation
|
||||||
|
setup_logging(logging.INFO)
|
||||||
|
|
||||||
|
# Exécuter les exemples
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("EXEMPLES D'UTILISATION DU MODULE ODOO")
|
||||||
|
print("="*60)
|
||||||
|
|
||||||
|
# Lister les projets et étapes
|
||||||
|
exemple_lister_projets()
|
||||||
|
exemple_lister_etapes()
|
||||||
|
|
||||||
|
# Extraire un ticket unique
|
||||||
|
# exemple_extraction_ticket_unique()
|
||||||
|
|
||||||
|
# Extraire un lot de tickets
|
||||||
|
# exemple_extraction_par_lot()
|
||||||
|
|
||||||
|
# Utiliser l'API directement
|
||||||
|
# exemple_api_directe()
|
||||||
|
|
||||||
|
print("\n" + "="*60)
|
||||||
|
print("FIN DES EXEMPLES")
|
||||||
|
print("="*60 + "\n")
|
||||||
@ -7,4 +7,6 @@ from .auth_manager import AuthManager
|
|||||||
from .ticket_manager import TicketManager
|
from .ticket_manager import TicketManager
|
||||||
from .message_manager import MessageManager
|
from .message_manager import MessageManager
|
||||||
from .attachment_manager import AttachmentManager
|
from .attachment_manager import AttachmentManager
|
||||||
from .retrieve_ticket import retrieve_ticket
|
from .retrieve_ticket import retrieve_ticket
|
||||||
|
from .batch_ticket_manager import BatchTicketManager
|
||||||
|
from .retrieve_tickets_batch import retrieve_tickets_batch, list_projects, list_stages
|
||||||
327
odoo/batch_ticket_manager.py
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Module de gestion des lots de tickets Odoo.
|
||||||
|
Permet l'extraction par lots de tickets selon différents critères.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from datetime import datetime
|
||||||
|
from typing import Dict, List, Any, Optional, Tuple, Set, Union
|
||||||
|
from .ticket_manager import TicketManager
|
||||||
|
from core.utils import save_json, ensure_dir
|
||||||
|
|
||||||
|
class BatchTicketManager:
|
||||||
|
"""
|
||||||
|
Gestionnaire pour l'extraction par lots de tickets Odoo.
|
||||||
|
Étend les fonctionnalités du TicketManager standard.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, ticket_manager: TicketManager):
|
||||||
|
"""
|
||||||
|
Initialise le gestionnaire de lots avec un TicketManager existant.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_manager: Gestionnaire de tickets déjà initialisé
|
||||||
|
"""
|
||||||
|
self.ticket_manager = ticket_manager
|
||||||
|
|
||||||
|
def search_tickets(self,
|
||||||
|
domain: Optional[List] = None,
|
||||||
|
limit: int = 50,
|
||||||
|
offset: int = 0,
|
||||||
|
order: str = "create_date desc") -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Recherche des tickets selon des critères spécifiques.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
domain: Domaine de recherche au format Odoo
|
||||||
|
limit: Nombre maximum de tickets à retourner
|
||||||
|
offset: Nombre de tickets à ignorer (pour la pagination)
|
||||||
|
order: Champ et direction de tri
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste de tickets correspondant aux critères
|
||||||
|
"""
|
||||||
|
domain = domain or []
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"model": self.ticket_manager.model_name,
|
||||||
|
"method": "search_read",
|
||||||
|
"args": [domain,
|
||||||
|
["id", "name", "description", "stage_id", "project_id", "partner_id",
|
||||||
|
"user_id", "date_start", "date_end", "date_deadline", "create_date", "write_date",
|
||||||
|
"tag_ids", "priority", "email_from", "email_cc", "code"]],
|
||||||
|
"kwargs": {"limit": limit, "offset": offset, "order": order}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = self.ticket_manager.auth_manager._rpc_call("/web/dataset/call_kw", params)
|
||||||
|
|
||||||
|
# Résoudre les champs relationnels pour chaque ticket
|
||||||
|
if isinstance(result, list):
|
||||||
|
return [self.ticket_manager.resolve_relation_fields(ticket) for ticket in result]
|
||||||
|
else:
|
||||||
|
logging.error(f"Erreur lors de la recherche des tickets: {result}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def get_projects(self) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Récupère la liste des projets disponibles.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des projets avec leur ID et nom
|
||||||
|
"""
|
||||||
|
params = {
|
||||||
|
"model": "project.project",
|
||||||
|
"method": "search_read",
|
||||||
|
"args": [[], ["id", "name", "description", "active"]],
|
||||||
|
"kwargs": {"order": "name"}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = self.ticket_manager.auth_manager._rpc_call("/web/dataset/call_kw", params)
|
||||||
|
|
||||||
|
if isinstance(result, list):
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
logging.error(f"Erreur lors de la récupération des projets: {result}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def get_stages(self) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Récupère la liste des étapes/statuts disponibles.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des étapes avec leur ID et nom
|
||||||
|
"""
|
||||||
|
params = {
|
||||||
|
"model": "project.task.type",
|
||||||
|
"method": "search_read",
|
||||||
|
"args": [[], ["id", "name", "description", "sequence"]],
|
||||||
|
"kwargs": {"order": "sequence"}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = self.ticket_manager.auth_manager._rpc_call("/web/dataset/call_kw", params)
|
||||||
|
|
||||||
|
if isinstance(result, list):
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
logging.error(f"Erreur lors de la récupération des étapes: {result}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def get_ticket_count(self, domain: Optional[List] = None) -> int:
|
||||||
|
"""
|
||||||
|
Compte le nombre de tickets correspondant aux critères.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
domain: Domaine de recherche au format Odoo
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Nombre de tickets
|
||||||
|
"""
|
||||||
|
domain = domain or []
|
||||||
|
|
||||||
|
params = {
|
||||||
|
"model": self.ticket_manager.model_name,
|
||||||
|
"method": "search_count",
|
||||||
|
"args": [domain],
|
||||||
|
"kwargs": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = self.ticket_manager.auth_manager._rpc_call("/web/dataset/call_kw", params)
|
||||||
|
|
||||||
|
if isinstance(result, int):
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
logging.error(f"Erreur lors du comptage des tickets: {result}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def load_existing_tickets(self, base_dir: str) -> Set[str]:
|
||||||
|
"""
|
||||||
|
Charge la liste des tickets déjà extraits.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
base_dir: Répertoire de base où chercher le fichier
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Ensemble des codes de tickets déjà extraits
|
||||||
|
"""
|
||||||
|
existing_tickets_file = os.path.join(base_dir, "extracted_tickets.json")
|
||||||
|
existing_tickets = set()
|
||||||
|
|
||||||
|
if os.path.exists(existing_tickets_file):
|
||||||
|
try:
|
||||||
|
with open(existing_tickets_file, 'r', encoding='utf-8') as f:
|
||||||
|
existing_data = json.load(f)
|
||||||
|
existing_tickets = set(existing_data.get("ticket_codes", []))
|
||||||
|
logging.info(f"Chargé {len(existing_tickets)} tickets déjà extraits")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de la lecture des tickets existants: {e}")
|
||||||
|
|
||||||
|
return existing_tickets
|
||||||
|
|
||||||
|
def save_existing_tickets(self, base_dir: str, tickets: Set[str]) -> bool:
|
||||||
|
"""
|
||||||
|
Sauvegarde la liste des tickets extraits.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
base_dir: Répertoire de base où sauvegarder le fichier
|
||||||
|
tickets: Ensemble des codes de tickets extraits
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
True si la sauvegarde a réussi, False sinon
|
||||||
|
"""
|
||||||
|
existing_tickets_file = os.path.join(base_dir, "extracted_tickets.json")
|
||||||
|
|
||||||
|
try:
|
||||||
|
ensure_dir(base_dir)
|
||||||
|
with open(existing_tickets_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump({"ticket_codes": list(tickets)}, f, indent=2, ensure_ascii=False)
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de l'enregistrement des tickets extraits: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def extract_tickets_batch(self,
|
||||||
|
domain: Optional[List] = None,
|
||||||
|
limit: int = 50,
|
||||||
|
offset: int = 0,
|
||||||
|
base_output_dir: str = "output",
|
||||||
|
skip_existing: bool = True) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Extrait plusieurs tickets selon des critères spécifiques.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
domain: Domaine de recherche au format Odoo
|
||||||
|
limit: Nombre maximum de tickets à traiter
|
||||||
|
offset: Nombre de tickets à ignorer
|
||||||
|
base_output_dir: Répertoire de sortie de base
|
||||||
|
skip_existing: Ignorer les tickets déjà extraits
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionnaire contenant les résultats de l'extraction
|
||||||
|
"""
|
||||||
|
# Rechercher les tickets
|
||||||
|
domain = domain or []
|
||||||
|
tickets = self.search_tickets(domain, limit, offset)
|
||||||
|
|
||||||
|
if not tickets:
|
||||||
|
logging.warning("Aucun ticket ne correspond aux critères de recherche.")
|
||||||
|
return {"status": "error", "message": "Aucun ticket trouvé", "processed": 0, "skipped": 0}
|
||||||
|
|
||||||
|
# Créer le répertoire principal de sortie
|
||||||
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
|
batch_dir = os.path.join(base_output_dir, f"batch_{timestamp}")
|
||||||
|
ensure_dir(batch_dir)
|
||||||
|
|
||||||
|
# Charger les tickets déjà extraits
|
||||||
|
existing_tickets = set()
|
||||||
|
if skip_existing:
|
||||||
|
existing_tickets = self.load_existing_tickets(base_output_dir)
|
||||||
|
|
||||||
|
# Traiter chaque ticket
|
||||||
|
processed_tickets = []
|
||||||
|
skipped_tickets = []
|
||||||
|
failed_tickets = []
|
||||||
|
|
||||||
|
for ticket in tickets:
|
||||||
|
ticket_code = ticket.get("code")
|
||||||
|
|
||||||
|
if not ticket_code:
|
||||||
|
logging.warning(f"Ticket sans code ignoré: {ticket.get('id')}")
|
||||||
|
failed_tickets.append({"id": ticket.get("id"), "reason": "missing_code"})
|
||||||
|
continue
|
||||||
|
|
||||||
|
if skip_existing and ticket_code in existing_tickets:
|
||||||
|
logging.info(f"Ticket {ticket_code} déjà extrait, ignoré")
|
||||||
|
skipped_tickets.append({
|
||||||
|
"code": ticket_code,
|
||||||
|
"id": ticket.get("id"),
|
||||||
|
"name": ticket.get("name"),
|
||||||
|
"reason": "already_extracted"
|
||||||
|
})
|
||||||
|
continue
|
||||||
|
|
||||||
|
logging.info(f"Traitement du ticket {ticket_code}...")
|
||||||
|
|
||||||
|
# Créer un sous-répertoire pour ce ticket
|
||||||
|
ticket_dir = os.path.join(batch_dir, f"ticket_{ticket_code}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Extraire les données
|
||||||
|
result = self.ticket_manager.extract_ticket_data(ticket_code, ticket_dir)
|
||||||
|
|
||||||
|
if result:
|
||||||
|
processed_tickets.append({
|
||||||
|
"code": ticket_code,
|
||||||
|
"id": ticket.get("id"),
|
||||||
|
"name": ticket.get("name"),
|
||||||
|
"dir": ticket_dir,
|
||||||
|
"messages_count": result.get("messages_count", 0),
|
||||||
|
"attachments_count": result.get("attachments_count", 0)
|
||||||
|
})
|
||||||
|
|
||||||
|
# Ajouter à la liste des tickets extraits
|
||||||
|
existing_tickets.add(ticket_code)
|
||||||
|
logging.info(f"Ticket {ticket_code} extrait avec succès")
|
||||||
|
else:
|
||||||
|
logging.error(f"Échec de l'extraction du ticket {ticket_code}")
|
||||||
|
failed_tickets.append({
|
||||||
|
"code": ticket_code,
|
||||||
|
"id": ticket.get("id"),
|
||||||
|
"name": ticket.get("name"),
|
||||||
|
"reason": "extraction_failed"
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception(f"Erreur lors du traitement du ticket {ticket_code}: {e}")
|
||||||
|
failed_tickets.append({
|
||||||
|
"code": ticket_code,
|
||||||
|
"id": ticket.get("id"),
|
||||||
|
"name": ticket.get("name"),
|
||||||
|
"reason": f"exception: {str(e)}"
|
||||||
|
})
|
||||||
|
|
||||||
|
# Enregistrer la liste mise à jour des tickets extraits
|
||||||
|
if skip_existing:
|
||||||
|
self.save_existing_tickets(base_output_dir, existing_tickets)
|
||||||
|
|
||||||
|
# Créer un fichier de résumé du batch
|
||||||
|
batch_summary = {
|
||||||
|
"timestamp": timestamp,
|
||||||
|
"batch_dir": batch_dir,
|
||||||
|
"search_criteria": {
|
||||||
|
"domain": domain,
|
||||||
|
"limit": limit,
|
||||||
|
"offset": offset
|
||||||
|
},
|
||||||
|
"processed_tickets": processed_tickets,
|
||||||
|
"skipped_tickets": skipped_tickets,
|
||||||
|
"failed_tickets": failed_tickets,
|
||||||
|
"stats": {
|
||||||
|
"total_found": len(tickets),
|
||||||
|
"processed": len(processed_tickets),
|
||||||
|
"skipped": len(skipped_tickets),
|
||||||
|
"failed": len(failed_tickets)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
batch_summary_path = os.path.join(batch_dir, "batch_summary.json")
|
||||||
|
save_json(batch_summary, batch_summary_path)
|
||||||
|
|
||||||
|
logging.info(f"Extraction par lot terminée avec succès.")
|
||||||
|
logging.info(f"Tickets traités: {len(processed_tickets)}")
|
||||||
|
logging.info(f"Tickets ignorés: {len(skipped_tickets)}")
|
||||||
|
logging.info(f"Tickets en échec: {len(failed_tickets)}")
|
||||||
|
logging.info(f"Répertoire de sortie: {batch_dir}")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "success",
|
||||||
|
"batch_dir": batch_dir,
|
||||||
|
"processed": len(processed_tickets),
|
||||||
|
"skipped": len(skipped_tickets),
|
||||||
|
"failed": len(failed_tickets),
|
||||||
|
"summary_file": batch_summary_path,
|
||||||
|
"processed_tickets": processed_tickets,
|
||||||
|
"skipped_tickets": skipped_tickets,
|
||||||
|
"failed_tickets": failed_tickets
|
||||||
|
}
|
||||||
14
odoo/batch_ticket_manager.py.save
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
^C
|
||||||
|
^C
|
||||||
|
^C
|
||||||
|
^C
|
||||||
|
vim odoo/batch_ticket_manager.py
|
||||||
|
ls -la odoo/
|
||||||
|
^C
|
||||||
|
^C
|
||||||
|
python -c 'print("Création des fichiers")'
|
||||||
|
^C
|
||||||
|
ls -la
|
||||||
|
^C
|
||||||
|
cp odoo/batch_ticket_manager.py odoo/batch_ticket_manager.py.bak
|
||||||
|
#!/usr/bin/env python3
|
||||||
363
odoo/retrieve_tickets_batch.py
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Script pour extraire des lots de tickets Odoo par critères (projet, statut, etc.).
|
||||||
|
Ce script permet d'automatiser la récupération de nombreux tickets en évitant
|
||||||
|
de recharger des tickets déjà traités.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import argparse
|
||||||
|
from datetime import datetime
|
||||||
|
from .auth_manager import AuthManager
|
||||||
|
from .ticket_manager import TicketManager
|
||||||
|
from .batch_ticket_manager import BatchTicketManager
|
||||||
|
from .retrieve_ticket import load_config
|
||||||
|
from core.utils import setup_logging, log_separator
|
||||||
|
|
||||||
|
def retrieve_tickets_batch(domain=None, limit=50, offset=0, output=None, config_file="config.json",
|
||||||
|
verbose=False, skip_existing=True):
|
||||||
|
"""
|
||||||
|
Extrait un lot de tickets répondant à des critères spécifiques.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
domain: Liste de critères de recherche au format Odoo
|
||||||
|
ex: [["project_id", "=", 1], ["stage_id", "=", 5]]
|
||||||
|
limit: Nombre maximal de tickets à extraire
|
||||||
|
offset: Index de départ pour la pagination
|
||||||
|
output: Répertoire de sortie
|
||||||
|
config_file: Chemin vers le fichier de configuration
|
||||||
|
verbose: Mode verbeux pour les logs
|
||||||
|
skip_existing: Ignorer les tickets déjà extraits
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionnaire avec le résultat de l'opération ou None en cas d'erreur
|
||||||
|
"""
|
||||||
|
config = load_config(config_file)
|
||||||
|
|
||||||
|
# Si config est vide, initialiser avec des valeurs par défaut
|
||||||
|
if not config:
|
||||||
|
logging.error("Impossible de charger la configuration, utilisation des valeurs par défaut")
|
||||||
|
config = {"odoo": {}, "output_dir": "output"}
|
||||||
|
|
||||||
|
# Configurer la journalisation
|
||||||
|
log_level = logging.DEBUG if verbose else logging.INFO
|
||||||
|
setup_logging(log_level, "retrieve_tickets_batch.log")
|
||||||
|
|
||||||
|
# Extraire les informations de connexion
|
||||||
|
odoo_config = config.get("odoo", {})
|
||||||
|
url = odoo_config.get("url")
|
||||||
|
db = odoo_config.get("db")
|
||||||
|
username = odoo_config.get("username")
|
||||||
|
api_key = odoo_config.get("api_key")
|
||||||
|
|
||||||
|
if not all([url, db, username, api_key]):
|
||||||
|
logging.error("Informations de connexion Odoo manquantes dans le fichier de configuration")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Définir le répertoire de sortie
|
||||||
|
base_output_dir = output or config.get("output_dir", "output")
|
||||||
|
|
||||||
|
logging.info(f"Démarrage de l'extraction par lot avec les critères: {domain}")
|
||||||
|
logging.info(f"Limite: {limit} tickets, offset: {offset}")
|
||||||
|
log_separator()
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Initialiser les gestionnaires
|
||||||
|
auth_manager = AuthManager(
|
||||||
|
url=url,
|
||||||
|
db=db,
|
||||||
|
username=username,
|
||||||
|
api_key=api_key
|
||||||
|
)
|
||||||
|
|
||||||
|
if not auth_manager.login():
|
||||||
|
logging.error("Échec de l'authentification à Odoo")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Initialiser les gestionnaires
|
||||||
|
ticket_manager = TicketManager(auth_manager)
|
||||||
|
batch_manager = BatchTicketManager(ticket_manager)
|
||||||
|
|
||||||
|
# Vérifier combien de tickets correspondent aux critères
|
||||||
|
total_count = batch_manager.get_ticket_count(domain)
|
||||||
|
logging.info(f"Nombre total de tickets correspondant aux critères: {total_count}")
|
||||||
|
|
||||||
|
if total_count == 0:
|
||||||
|
logging.warning("Aucun ticket ne correspond aux critères spécifiés")
|
||||||
|
return {"status": "warning", "message": "Aucun ticket ne correspond aux critères"}
|
||||||
|
|
||||||
|
# Extraire les tickets par lot
|
||||||
|
result = batch_manager.extract_tickets_batch(
|
||||||
|
domain=domain,
|
||||||
|
limit=limit,
|
||||||
|
offset=offset,
|
||||||
|
base_output_dir=base_output_dir,
|
||||||
|
skip_existing=skip_existing
|
||||||
|
)
|
||||||
|
|
||||||
|
# Afficher le résumé
|
||||||
|
log_separator()
|
||||||
|
logging.info(f"Extraction par lot terminée")
|
||||||
|
logging.info(f"Tickets traités: {result.get('processed', 0)}")
|
||||||
|
logging.info(f"Tickets ignorés: {result.get('skipped', 0)}")
|
||||||
|
logging.info(f"Répertoire: {result.get('batch_dir', '')}")
|
||||||
|
log_separator()
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception(f"Une erreur est survenue: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def list_projects(config_file="config.json"):
|
||||||
|
"""
|
||||||
|
Liste tous les projets disponibles dans Odoo.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
config_file: Chemin vers le fichier de configuration
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des projets ou None en cas d'erreur
|
||||||
|
"""
|
||||||
|
config = load_config(config_file)
|
||||||
|
|
||||||
|
# Extraire les informations de connexion
|
||||||
|
odoo_config = config.get("odoo", {})
|
||||||
|
url = odoo_config.get("url")
|
||||||
|
db = odoo_config.get("db")
|
||||||
|
username = odoo_config.get("username")
|
||||||
|
api_key = odoo_config.get("api_key")
|
||||||
|
|
||||||
|
if not all([url, db, username, api_key]):
|
||||||
|
print("Informations de connexion Odoo manquantes dans le fichier de configuration")
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Initialiser les gestionnaires
|
||||||
|
auth_manager = AuthManager(
|
||||||
|
url=url,
|
||||||
|
db=db,
|
||||||
|
username=username,
|
||||||
|
api_key=api_key
|
||||||
|
)
|
||||||
|
|
||||||
|
if not auth_manager.login():
|
||||||
|
print("Échec de l'authentification à Odoo")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Récupérer la liste des projets
|
||||||
|
ticket_manager = TicketManager(auth_manager)
|
||||||
|
batch_manager = BatchTicketManager(ticket_manager)
|
||||||
|
projects = batch_manager.get_projects()
|
||||||
|
|
||||||
|
if not projects:
|
||||||
|
print("Aucun projet trouvé")
|
||||||
|
return None
|
||||||
|
|
||||||
|
print("\nListe des projets disponibles:")
|
||||||
|
print("-" * 50)
|
||||||
|
for project in projects:
|
||||||
|
print(f"ID: {project['id']}, Nom: {project['name']}")
|
||||||
|
print("-" * 50)
|
||||||
|
|
||||||
|
return projects
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Une erreur est survenue: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def list_stages(config_file="config.json"):
|
||||||
|
"""
|
||||||
|
Liste tous les statuts (étapes) disponibles dans Odoo.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
config_file: Chemin vers le fichier de configuration
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des étapes ou None en cas d'erreur
|
||||||
|
"""
|
||||||
|
config = load_config(config_file)
|
||||||
|
|
||||||
|
# Extraire les informations de connexion
|
||||||
|
odoo_config = config.get("odoo", {})
|
||||||
|
url = odoo_config.get("url")
|
||||||
|
db = odoo_config.get("db")
|
||||||
|
username = odoo_config.get("username")
|
||||||
|
api_key = odoo_config.get("api_key")
|
||||||
|
|
||||||
|
if not all([url, db, username, api_key]):
|
||||||
|
print("Informations de connexion Odoo manquantes dans le fichier de configuration")
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Initialiser les gestionnaires
|
||||||
|
auth_manager = AuthManager(
|
||||||
|
url=url,
|
||||||
|
db=db,
|
||||||
|
username=username,
|
||||||
|
api_key=api_key
|
||||||
|
)
|
||||||
|
|
||||||
|
if not auth_manager.login():
|
||||||
|
print("Échec de l'authentification à Odoo")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Récupérer la liste des étapes
|
||||||
|
ticket_manager = TicketManager(auth_manager)
|
||||||
|
batch_manager = BatchTicketManager(ticket_manager)
|
||||||
|
stages = batch_manager.get_stages()
|
||||||
|
|
||||||
|
if not stages:
|
||||||
|
print("Aucune étape trouvée")
|
||||||
|
return None
|
||||||
|
|
||||||
|
print("\nListe des étapes disponibles:")
|
||||||
|
print("-" * 50)
|
||||||
|
for stage in stages:
|
||||||
|
print(f"ID: {stage['id']}, Nom: {stage['name']}")
|
||||||
|
print("-" * 50)
|
||||||
|
|
||||||
|
return stages
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Une erreur est survenue: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def parse_domain(domain_str):
|
||||||
|
"""
|
||||||
|
Convertit une chaîne de critères en domaine Odoo.
|
||||||
|
Format attendu: "field1:op1:value1;field2:op2:value2"
|
||||||
|
Exemple: "project_id:=:1;stage_id:=:5"
|
||||||
|
|
||||||
|
Args:
|
||||||
|
domain_str: Chaîne de critères
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste de critères au format Odoo
|
||||||
|
"""
|
||||||
|
if not domain_str:
|
||||||
|
return []
|
||||||
|
|
||||||
|
domain = []
|
||||||
|
criteria = domain_str.split(";")
|
||||||
|
|
||||||
|
for criterion in criteria:
|
||||||
|
if not criterion:
|
||||||
|
continue
|
||||||
|
|
||||||
|
parts = criterion.split(":")
|
||||||
|
if len(parts) != 3:
|
||||||
|
print(f"Format invalide pour le critère: {criterion}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
field, operator, value = parts
|
||||||
|
|
||||||
|
# Convertir value en entier si possible
|
||||||
|
try:
|
||||||
|
if value.isdigit():
|
||||||
|
value = int(value)
|
||||||
|
elif value.lower() == "true":
|
||||||
|
value = True
|
||||||
|
elif value.lower() == "false":
|
||||||
|
value = False
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
domain.append([field, operator, value])
|
||||||
|
|
||||||
|
return domain
|
||||||
|
|
||||||
|
def parse_arguments():
|
||||||
|
parser = argparse.ArgumentParser(description="Récupère des tickets Odoo par lots selon des critères.")
|
||||||
|
subparsers = parser.add_subparsers(dest="command", help="Commande à exécuter")
|
||||||
|
|
||||||
|
# Commande pour extraire un lot de tickets
|
||||||
|
batch_parser = subparsers.add_parser("batch", help="Extrait un lot de tickets")
|
||||||
|
batch_parser.add_argument("--domain", "-d", help="Critères de recherche (format: field1:op1:value1;field2:op2:value2)")
|
||||||
|
batch_parser.add_argument("--project", "-p", type=int, help="ID du projet")
|
||||||
|
batch_parser.add_argument("--stage", "-s", type=int, help="ID de l'étape/statut")
|
||||||
|
batch_parser.add_argument("--limit", "-l", type=int, default=50, help="Nombre maximum de tickets à extraire")
|
||||||
|
batch_parser.add_argument("--offset", "-o", type=int, default=0, help="Index de départ pour la pagination")
|
||||||
|
batch_parser.add_argument("--output", help="Répertoire de sortie")
|
||||||
|
batch_parser.add_argument("--include-existing", action="store_true", help="Inclure les tickets déjà extraits")
|
||||||
|
batch_parser.add_argument("--config", "-c", default="config.json", help="Fichier de configuration")
|
||||||
|
batch_parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux")
|
||||||
|
|
||||||
|
# Commande pour lister les projets
|
||||||
|
projects_parser = subparsers.add_parser("projects", help="Liste les projets disponibles")
|
||||||
|
projects_parser.add_argument("--config", "-c", default="config.json", help="Fichier de configuration")
|
||||||
|
|
||||||
|
# Commande pour lister les étapes
|
||||||
|
stages_parser = subparsers.add_parser("stages", help="Liste les étapes/statuts disponibles")
|
||||||
|
stages_parser.add_argument("--config", "-c", default="config.json", help="Fichier de configuration")
|
||||||
|
|
||||||
|
# Commande pour extraire un ticket unique (compatibilité avec retrieve_ticket.py)
|
||||||
|
ticket_parser = subparsers.add_parser("ticket", help="Extrait un ticket unique par son code")
|
||||||
|
ticket_parser.add_argument("ticket_code", help="Code du ticket à extraire")
|
||||||
|
ticket_parser.add_argument("--output", help="Répertoire de sortie")
|
||||||
|
ticket_parser.add_argument("--config", "-c", default="config.json", help="Fichier de configuration")
|
||||||
|
ticket_parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux")
|
||||||
|
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = parse_arguments()
|
||||||
|
|
||||||
|
if args.command == "projects":
|
||||||
|
list_projects(args.config)
|
||||||
|
|
||||||
|
elif args.command == "stages":
|
||||||
|
list_stages(args.config)
|
||||||
|
|
||||||
|
elif args.command == "ticket":
|
||||||
|
# Compatibilité avec retrieve_ticket.py
|
||||||
|
from .retrieve_ticket import retrieve_ticket
|
||||||
|
|
||||||
|
result = retrieve_ticket(
|
||||||
|
ticket_code=args.ticket_code,
|
||||||
|
output=args.output,
|
||||||
|
config_file=args.config,
|
||||||
|
verbose=args.verbose
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
elif args.command == "batch":
|
||||||
|
# Construire le domaine à partir des options
|
||||||
|
domain = []
|
||||||
|
|
||||||
|
if args.domain:
|
||||||
|
domain = parse_domain(args.domain)
|
||||||
|
|
||||||
|
# Ajouter project_id et stage_id si spécifiés
|
||||||
|
if args.project:
|
||||||
|
domain.append(["project_id", "=", args.project])
|
||||||
|
|
||||||
|
if args.stage:
|
||||||
|
domain.append(["stage_id", "=", args.stage])
|
||||||
|
|
||||||
|
result = retrieve_tickets_batch(
|
||||||
|
domain=domain,
|
||||||
|
limit=args.limit,
|
||||||
|
offset=args.offset,
|
||||||
|
output=args.output,
|
||||||
|
config_file=args.config,
|
||||||
|
verbose=args.verbose,
|
||||||
|
skip_existing=not args.include_existing
|
||||||
|
)
|
||||||
|
|
||||||
|
if not result or result.get("status") == "error":
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Aucune commande spécifiée, afficher l'aide
|
||||||
|
parser = argparse.ArgumentParser(description="Récupère des tickets Odoo par lots selon des critères.")
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@ -1,232 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_summary": {
|
|
||||||
"id": 113,
|
|
||||||
"code": "T0101",
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"project_id": 3,
|
|
||||||
"project_name": "Demandes",
|
|
||||||
"stage_id": 8,
|
|
||||||
"stage_name": "Clôturé",
|
|
||||||
"date_extraction": "2025-04-04T17:02:42.325652"
|
|
||||||
},
|
|
||||||
"metadata": {
|
|
||||||
"message_count": {
|
|
||||||
"total": 14,
|
|
||||||
"processed": 5,
|
|
||||||
"excluded": 9
|
|
||||||
},
|
|
||||||
"cleaning_strategy": "standard",
|
|
||||||
"cleaning_config": {
|
|
||||||
"preserve_links": true,
|
|
||||||
"preserve_images": true,
|
|
||||||
"strategy": "html2text"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 10758,
|
|
||||||
"body": "Bonjour,\n\nAu vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.\n\nPour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.\n\nDu coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.\n\nCi-dessous la fenêtre au lancement du logiciel.\n\n\n\nMerci d’avance pour votre aide.\n\nCordialement\n\n\n\n**_Bruno VERNET\n\n_**\n\n**Responsable Qualité**\n\nTéléph : +33 4.68.38.98.19\n\nMobile : +33 6.18.85.02.31\n\n[ www.provencale.com](http://www.provencale.com/)",
|
|
||||||
"date": "2020-03-26 14:43:45",
|
|
||||||
"author_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
31760,
|
|
||||||
31758
|
|
||||||
],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<p>\r\n\r\n</p>\r\n<div>\r\n<p>Bonjour,</p><p></p>\r\n<p></p><p> </p>\r\n<p>Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.</p><p></p>\r\n<p>Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.</p><p></p>\r\n<p>Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.</p><p></p>\r\n<p>Ci-dessous la fenêtre au lancement du logiciel.</p><p></p>\r\n<p><img width=\"452\" height=\"251\" style=\"width:4.7083in; height:2.6166in\" id=\"Image_x0020_1\" src=\"/web/image/31758?access_token=8e11ca74-406a-4463-ac44-46953344b1fc\"></p><p></p>\r\n<p></p><p> </p>\r\n<p>Merci d’avance pour votre aide.</p><p></p>\r\n<p></p><p> </p>\r\n<p>Cordialement</p><p></p>\r\n<p></p><p> </p>\r\n<p><span><img width=\"302\" height=\"78\" style=\"width:3.15in; height:.8166in\" id=\"Image_x0020_2\" src=\"/web/image/31760?access_token=03de1af9-ea06-48c6-aafe-80c8711ffcb7\"><p></p></span></p>\r\n<p><span> </span><b><i><span style=\"font-size:12.0pt; color:#612A8A\">Bruno VERNET<p></p></span></i></b></p>\r\n<p><span> <b>Responsable Qualité</b><p></p></span></p>\r\n<p><span> Téléph : +33 4.68.38.98.19<p></p></span></p>\r\n<p><span> Mobile : +33 6.18.85.02.31<p></p></span></p>\r\n<p><span> <a href=\"http://www.provencale.com/\">\r\nwww.provencale.com</a><p></p></span></p>\r\n<p></p><p> </p>\r\n<p></p><p> </p>\r\n</div>\r\n\r\n",
|
|
||||||
"author_details": {
|
|
||||||
"name": "PROVENCALE S.A",
|
|
||||||
"email": false,
|
|
||||||
"is_system": false,
|
|
||||||
"id": 2000,
|
|
||||||
"phone": "04 94 72 83 00",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10757,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1001,
|
|
||||||
1002,
|
|
||||||
1003,
|
|
||||||
1004,
|
|
||||||
1005
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "OdooBot",
|
|
||||||
"email": "odoobot@example.com",
|
|
||||||
"is_system": true,
|
|
||||||
"id": 2,
|
|
||||||
"phone": false,
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10764,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:18:25",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1010,
|
|
||||||
1011
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11055,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:34:56",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1517,
|
|
||||||
1518
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Admin - M&G",
|
|
||||||
"email": "noreply@mail.cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 3,
|
|
||||||
"phone": "758279909",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11058,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:49",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1522
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Admin - M&G",
|
|
||||||
"email": "noreply@mail.cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 3,
|
|
||||||
"phone": "758279909",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
TICKET: T0101 - ACTIVATION LOGICIEL
|
|
||||||
Date d'extraction: 2025-04-04 17:02:42
|
|
||||||
Nombre de messages: 5
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
DATE: 2020-03-26 14:43:45
|
|
||||||
DE: PROVENCALE S.A
|
|
||||||
OBJET: ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.
|
|
||||||
|
|
||||||
Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.
|
|
||||||
|
|
||||||
Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.
|
|
||||||
|
|
||||||
Ci-dessous la fenêtre au lancement du logiciel.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Merci d’avance pour votre aide.
|
|
||||||
|
|
||||||
Cordialement
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**_Bruno VERNET
|
|
||||||
|
|
||||||
_**
|
|
||||||
|
|
||||||
**Responsable Qualité**
|
|
||||||
|
|
||||||
Téléph : +33 4.68.38.98.19
|
|
||||||
|
|
||||||
Mobile : +33 6.18.85.02.31
|
|
||||||
|
|
||||||
[ www.provencale.com](http://www.provencale.com/)
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-03-26 14:46:37
|
|
||||||
DE: OdooBot
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-03-26 15:18:25
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-04-06 13:34:56
|
|
||||||
DE: Admin - M&G
|
|
||||||
OBJET: Re: [T0101] ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-04-06 13:36:49
|
|
||||||
DE: Admin - M&G
|
|
||||||
OBJET: Re: [T0101] ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
@ -1,38 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": 31760,
|
|
||||||
"name": "image006.jpg",
|
|
||||||
"mimetype": "image/jpeg",
|
|
||||||
"file_size": 7098,
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "image006.jpg",
|
|
||||||
"res_name": "[T0101] ACTIVATION LOGICIEL",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0101/T0101_20250404_170239/attachments/image006.jpg",
|
|
||||||
"error": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 31758,
|
|
||||||
"name": "image005.jpg",
|
|
||||||
"mimetype": "image/jpeg",
|
|
||||||
"file_size": 20311,
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "image005.jpg",
|
|
||||||
"res_name": "[T0101] ACTIVATION LOGICIEL",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0101/T0101_20250404_170239/attachments/image005.jpg",
|
|
||||||
"error": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -1,425 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_id": 113,
|
|
||||||
"ticket_code": "T0101",
|
|
||||||
"message_metadata": {
|
|
||||||
"10758": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10759": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10760": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10757": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10761": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10762": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10763": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10764": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10916": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11044": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11055": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11056": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11057": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11058": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 10758,
|
|
||||||
"body": "<p>\r\n\r\n</p>\r\n<div>\r\n<p>Bonjour,</p><p></p>\r\n<p></p><p> </p>\r\n<p>Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.</p><p></p>\r\n<p>Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.</p><p></p>\r\n<p>Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.</p><p></p>\r\n<p>Ci-dessous la fenêtre au lancement du logiciel.</p><p></p>\r\n<p><img width=\"452\" height=\"251\" style=\"width:4.7083in; height:2.6166in\" id=\"Image_x0020_1\" src=\"/web/image/31758?access_token=8e11ca74-406a-4463-ac44-46953344b1fc\"></p><p></p>\r\n<p></p><p> </p>\r\n<p>Merci d’avance pour votre aide.</p><p></p>\r\n<p></p><p> </p>\r\n<p>Cordialement</p><p></p>\r\n<p></p><p> </p>\r\n<p><span><img width=\"302\" height=\"78\" style=\"width:3.15in; height:.8166in\" id=\"Image_x0020_2\" src=\"/web/image/31760?access_token=03de1af9-ea06-48c6-aafe-80c8711ffcb7\"><p></p></span></p>\r\n<p><span> </span><b><i><span style=\"font-size:12.0pt; color:#612A8A\">Bruno VERNET<p></p></span></i></b></p>\r\n<p><span> <b>Responsable Qualité</b><p></p></span></p>\r\n<p><span> Téléph : +33 4.68.38.98.19<p></p></span></p>\r\n<p><span> Mobile : +33 6.18.85.02.31<p></p></span></p>\r\n<p><span> <a href=\"http://www.provencale.com/\">\r\nwww.provencale.com</a><p></p></span></p>\r\n<p></p><p> </p>\r\n<p></p><p> </p>\r\n</div>\r\n\r\n",
|
|
||||||
"date": "2020-03-26 14:43:45",
|
|
||||||
"author_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
31760,
|
|
||||||
31758
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10759,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1006
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10760,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1007
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10757,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1001,
|
|
||||||
1002,
|
|
||||||
1003,
|
|
||||||
1004,
|
|
||||||
1005
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10761,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:14:41",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1008
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10762,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:16:11",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
18,
|
|
||||||
"Task Ready"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1009
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10763,
|
|
||||||
"body": "<p>Problème déjà réglé je passe en clôturé.</p>",
|
|
||||||
"date": "2020-03-26 15:17:37",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10764,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:18:25",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1010,
|
|
||||||
1011
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10916,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-31 09:08:24",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
18,
|
|
||||||
"Task Ready"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1331
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11044,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-03 14:37:13",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
17,
|
|
||||||
"Task Blocked"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1501
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11055,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:34:56",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1517,
|
|
||||||
1518
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11056,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:35:40",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1519,
|
|
||||||
1520
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11057,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:19",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1521
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11058,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:49",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1522
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"date_extraction": "2025-04-04T17:02:42.470555",
|
|
||||||
"ticket_id": 113,
|
|
||||||
"ticket_code": "T0101",
|
|
||||||
"ticket_name": "ACTIVATION LOGICIEL",
|
|
||||||
"output_dir": "output/ticket_T0101/T0101_20250404_170239",
|
|
||||||
"files": {
|
|
||||||
"ticket_info": "ticket_info.json",
|
|
||||||
"ticket_summary": "ticket_summary.json",
|
|
||||||
"messages": "all_messages.json",
|
|
||||||
"messages_raw": "messages_raw.json",
|
|
||||||
"messages_text": "all_messages.txt",
|
|
||||||
"attachments": "attachments_info.json",
|
|
||||||
"followers": null
|
|
||||||
},
|
|
||||||
"stats": {
|
|
||||||
"messages_count": 5,
|
|
||||||
"attachments_count": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 113,
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"description": "<p>Problème de licence.</p>",
|
|
||||||
"stage_id": [
|
|
||||||
8,
|
|
||||||
"Clôturé"
|
|
||||||
],
|
|
||||||
"project_id": [
|
|
||||||
3,
|
|
||||||
"Demandes"
|
|
||||||
],
|
|
||||||
"partner_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"user_id": [
|
|
||||||
9,
|
|
||||||
"Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"date_start": "2020-03-23 11:00:00",
|
|
||||||
"date_end": "2020-04-11 22:00:00",
|
|
||||||
"date_deadline": "2020-05-25",
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"tag_ids": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"priority": "0",
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"email_cc": "",
|
|
||||||
"message_ids": [
|
|
||||||
11058,
|
|
||||||
11057,
|
|
||||||
11056,
|
|
||||||
11055,
|
|
||||||
11044,
|
|
||||||
10916,
|
|
||||||
10764,
|
|
||||||
10763,
|
|
||||||
10762,
|
|
||||||
10761,
|
|
||||||
10760,
|
|
||||||
10759,
|
|
||||||
10758,
|
|
||||||
10757
|
|
||||||
],
|
|
||||||
"message_follower_ids": [],
|
|
||||||
"timesheet_ids": [],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"stage_id_name": "Clôturé",
|
|
||||||
"project_id_name": "Demandes",
|
|
||||||
"partner_id_name": "PROVENCALE S.A",
|
|
||||||
"user_id_name": "Youness BENDEQ",
|
|
||||||
"tag_names": [
|
|
||||||
"ESQ"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 113,
|
|
||||||
"code": "T0101",
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"description": "<p>Problème de licence.</p>",
|
|
||||||
"stage": "Clôturé",
|
|
||||||
"project": "Demandes",
|
|
||||||
"partner": "PROVENCALE S.A",
|
|
||||||
"assigned_to": "Youness BENDEQ",
|
|
||||||
"tags": [
|
|
||||||
"ESQ"
|
|
||||||
],
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"deadline": "2020-05-25"
|
|
||||||
}
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "113",
|
|
||||||
"code": "T0101",
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"description": "Problème de licence.",
|
|
||||||
"project_name": "Demandes",
|
|
||||||
"stage_name": "Clôturé",
|
|
||||||
"user_id": "",
|
|
||||||
"partner_id_email_from": "PROVENCALE S.A, Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"create_date": "26/03/2020 14:46:36",
|
|
||||||
"write_date_last_modification": "03/10/2024 13:10:50",
|
|
||||||
"date_deadline": "25/05/2020 00:00:00",
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"author_id": "PROVENCALE S.A",
|
|
||||||
"date": "26/03/2020 14:43:45",
|
|
||||||
"message_type": "E-mail",
|
|
||||||
"subject": "ACTIVATION LOGICIEL",
|
|
||||||
"id": "10758",
|
|
||||||
"content": "Bonjour,\nAu vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.\nPour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.\nDu coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.\nCi-dessous la fenêtre au lancement du logiciel.\nMerci d’avance pour votre aide.\nCordialement\nBruno VERNET\nTéléph : +33 4.68.38.98.19\nMobile : +33 6.18.85.02.31\nwww.provencale.com\n\n- image006.jpg (image/jpeg) [ID: 31760]\n- image005.jpg (image/jpeg) [ID: 31758]\n\n---\n"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"date_d'extraction": "08/04/2025 16:43:39",
|
|
||||||
"répertoire": "output/ticket_T0101/T0101_20250408_163754"
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
# Ticket T0101: ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
## Informations du ticket
|
|
||||||
|
|
||||||
- **id**: 113
|
|
||||||
- **code**: T0101
|
|
||||||
- **name**: ACTIVATION LOGICIEL
|
|
||||||
- **project_name**: Demandes
|
|
||||||
- **stage_name**: Clôturé
|
|
||||||
- **user_id**:
|
|
||||||
- **partner_id/email_from**: PROVENCALE S.A, Bruno Vernet <bruno.vernet@provencale.com>
|
|
||||||
- **create_date**: 26/03/2020 14:46:36
|
|
||||||
- **write_date/last modification**: 03/10/2024 13:10:50
|
|
||||||
- **date_deadline**: 25/05/2020 00:00:00
|
|
||||||
|
|
||||||
- **description**:
|
|
||||||
|
|
||||||
Problème de licence.
|
|
||||||
|
|
||||||
## Messages
|
|
||||||
|
|
||||||
### Message 1
|
|
||||||
**author_id**: PROVENCALE S.A
|
|
||||||
**date**: 26/03/2020 14:43:45
|
|
||||||
**message_type**: E-mail
|
|
||||||
**subject**: ACTIVATION LOGICIEL
|
|
||||||
**id**: 10758
|
|
||||||
Bonjour,
|
|
||||||
Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.
|
|
||||||
Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.
|
|
||||||
Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.
|
|
||||||
Ci-dessous la fenêtre au lancement du logiciel.
|
|
||||||
Merci d’avance pour votre aide.
|
|
||||||
Cordialement
|
|
||||||
Bruno VERNET
|
|
||||||
**Responsable Qualité**
|
|
||||||
Téléph : +33 4.68.38.98.19
|
|
||||||
Mobile : +33 6.18.85.02.31
|
|
||||||
www.provencale.com
|
|
||||||
|
|
||||||
**attachment_ids**:
|
|
||||||
- image006.jpg (image/jpeg) [ID: 31760]
|
|
||||||
- image005.jpg (image/jpeg) [ID: 31758]
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Informations sur l'extraction
|
|
||||||
|
|
||||||
- **Date d'extraction**: 08/04/2025 16:43:39
|
|
||||||
- **Répertoire**: output/ticket_T0101/T0101_20250408_163754
|
|
||||||
@ -1,232 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_summary": {
|
|
||||||
"id": 113,
|
|
||||||
"code": "T0101",
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"project_id": 3,
|
|
||||||
"project_name": "Demandes",
|
|
||||||
"stage_id": 8,
|
|
||||||
"stage_name": "Clôturé",
|
|
||||||
"date_extraction": "2025-04-08T16:37:55.450369"
|
|
||||||
},
|
|
||||||
"metadata": {
|
|
||||||
"message_count": {
|
|
||||||
"total": 14,
|
|
||||||
"processed": 5,
|
|
||||||
"excluded": 9
|
|
||||||
},
|
|
||||||
"cleaning_strategy": "standard",
|
|
||||||
"cleaning_config": {
|
|
||||||
"preserve_links": true,
|
|
||||||
"preserve_images": true,
|
|
||||||
"strategy": "html2text"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 10758,
|
|
||||||
"body": "Bonjour,\n\nAu vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.\n\nPour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.\n\nDu coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.\n\nCi-dessous la fenêtre au lancement du logiciel.\n\n\n\nMerci d’avance pour votre aide.\n\nCordialement\n\n\n\n**_Bruno VERNET\n\n_**\n\n**Responsable Qualité**\n\nTéléph : +33 4.68.38.98.19\n\nMobile : +33 6.18.85.02.31\n\n[ www.provencale.com](http://www.provencale.com/)",
|
|
||||||
"date": "2020-03-26 14:43:45",
|
|
||||||
"author_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
31760,
|
|
||||||
31758
|
|
||||||
],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<p>\r\n\r\n</p>\r\n<div>\r\n<p>Bonjour,</p><p></p>\r\n<p></p><p> </p>\r\n<p>Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.</p><p></p>\r\n<p>Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.</p><p></p>\r\n<p>Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.</p><p></p>\r\n<p>Ci-dessous la fenêtre au lancement du logiciel.</p><p></p>\r\n<p><img width=\"452\" height=\"251\" style=\"width:4.7083in; height:2.6166in\" id=\"Image_x0020_1\" src=\"/web/image/31758?access_token=8e11ca74-406a-4463-ac44-46953344b1fc\"></p><p></p>\r\n<p></p><p> </p>\r\n<p>Merci d’avance pour votre aide.</p><p></p>\r\n<p></p><p> </p>\r\n<p>Cordialement</p><p></p>\r\n<p></p><p> </p>\r\n<p><span><img width=\"302\" height=\"78\" style=\"width:3.15in; height:.8166in\" id=\"Image_x0020_2\" src=\"/web/image/31760?access_token=03de1af9-ea06-48c6-aafe-80c8711ffcb7\"><p></p></span></p>\r\n<p><span> </span><b><i><span style=\"font-size:12.0pt; color:#612A8A\">Bruno VERNET<p></p></span></i></b></p>\r\n<p><span> <b>Responsable Qualité</b><p></p></span></p>\r\n<p><span> Téléph : +33 4.68.38.98.19<p></p></span></p>\r\n<p><span> Mobile : +33 6.18.85.02.31<p></p></span></p>\r\n<p><span> <a href=\"http://www.provencale.com/\">\r\nwww.provencale.com</a><p></p></span></p>\r\n<p></p><p> </p>\r\n<p></p><p> </p>\r\n</div>\r\n\r\n",
|
|
||||||
"author_details": {
|
|
||||||
"name": "PROVENCALE S.A",
|
|
||||||
"email": false,
|
|
||||||
"is_system": false,
|
|
||||||
"id": 2000,
|
|
||||||
"phone": "04 94 72 83 00",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10757,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1001,
|
|
||||||
1002,
|
|
||||||
1003,
|
|
||||||
1004,
|
|
||||||
1005
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "OdooBot",
|
|
||||||
"email": "odoobot@example.com",
|
|
||||||
"is_system": true,
|
|
||||||
"id": 2,
|
|
||||||
"phone": false,
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10764,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:18:25",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1010,
|
|
||||||
1011
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11055,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:34:56",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1517,
|
|
||||||
1518
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Admin - M&G",
|
|
||||||
"email": "noreply@mail.cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 3,
|
|
||||||
"phone": "758279909",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11058,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:49",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1522
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Admin - M&G",
|
|
||||||
"email": "noreply@mail.cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 3,
|
|
||||||
"phone": "758279909",
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
TICKET: T0101 - ACTIVATION LOGICIEL
|
|
||||||
Date d'extraction: 2025-04-08 16:37:55
|
|
||||||
Nombre de messages: 5
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
DATE: 2020-03-26 14:43:45
|
|
||||||
DE: PROVENCALE S.A
|
|
||||||
OBJET: ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.
|
|
||||||
|
|
||||||
Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.
|
|
||||||
|
|
||||||
Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.
|
|
||||||
|
|
||||||
Ci-dessous la fenêtre au lancement du logiciel.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Merci d’avance pour votre aide.
|
|
||||||
|
|
||||||
Cordialement
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
**_Bruno VERNET
|
|
||||||
|
|
||||||
_**
|
|
||||||
|
|
||||||
**Responsable Qualité**
|
|
||||||
|
|
||||||
Téléph : +33 4.68.38.98.19
|
|
||||||
|
|
||||||
Mobile : +33 6.18.85.02.31
|
|
||||||
|
|
||||||
[ www.provencale.com](http://www.provencale.com/)
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-03-26 14:46:37
|
|
||||||
DE: OdooBot
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-03-26 15:18:25
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-04-06 13:34:56
|
|
||||||
DE: Admin - M&G
|
|
||||||
OBJET: Re: [T0101] ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-04-06 13:36:49
|
|
||||||
DE: Admin - M&G
|
|
||||||
OBJET: Re: [T0101] ACTIVATION LOGICIEL
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 6.9 KiB |
@ -1,38 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": 31760,
|
|
||||||
"name": "image006.jpg",
|
|
||||||
"mimetype": "image/jpeg",
|
|
||||||
"file_size": 7098,
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "image006.jpg",
|
|
||||||
"res_name": "[T0101] ACTIVATION LOGICIEL",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0101/T0101_20250408_163754/attachments/image006.jpg",
|
|
||||||
"error": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 31758,
|
|
||||||
"name": "image005.jpg",
|
|
||||||
"mimetype": "image/jpeg",
|
|
||||||
"file_size": 20311,
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "image005.jpg",
|
|
||||||
"res_name": "[T0101] ACTIVATION LOGICIEL",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0101/T0101_20250408_163754/attachments/image005.jpg",
|
|
||||||
"error": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -1,425 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_id": 113,
|
|
||||||
"ticket_code": "T0101",
|
|
||||||
"message_metadata": {
|
|
||||||
"10758": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10759": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10760": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10757": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10761": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10762": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10763": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"10764": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"10916": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11044": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11055": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11056": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11057": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11058": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 10758,
|
|
||||||
"body": "<p>\r\n\r\n</p>\r\n<div>\r\n<p>Bonjour,</p><p></p>\r\n<p></p><p> </p>\r\n<p>Au vu de la situation liée au Coronavirus, nous avons dû passer en télétravail.</p><p></p>\r\n<p>Pour ce faire et avoir accès aux différents logiciels nécessaires, ESQ a été réinstallé sur un autre serveur afin de pouvoir travailler en bureau à distance.</p><p></p>\r\n<p>Du coup le logiciel nous demande une activation mais je ne sais pas si le N° de licence a été modifié suite à un achat version réseau faite par JB Lafitte en 2019 ou si le problème est autre.</p><p></p>\r\n<p>Ci-dessous la fenêtre au lancement du logiciel.</p><p></p>\r\n<p><img width=\"452\" height=\"251\" style=\"width:4.7083in; height:2.6166in\" id=\"Image_x0020_1\" src=\"/web/image/31758?access_token=8e11ca74-406a-4463-ac44-46953344b1fc\"></p><p></p>\r\n<p></p><p> </p>\r\n<p>Merci d’avance pour votre aide.</p><p></p>\r\n<p></p><p> </p>\r\n<p>Cordialement</p><p></p>\r\n<p></p><p> </p>\r\n<p><span><img width=\"302\" height=\"78\" style=\"width:3.15in; height:.8166in\" id=\"Image_x0020_2\" src=\"/web/image/31760?access_token=03de1af9-ea06-48c6-aafe-80c8711ffcb7\"><p></p></span></p>\r\n<p><span> </span><b><i><span style=\"font-size:12.0pt; color:#612A8A\">Bruno VERNET<p></p></span></i></b></p>\r\n<p><span> <b>Responsable Qualité</b><p></p></span></p>\r\n<p><span> Téléph : +33 4.68.38.98.19<p></p></span></p>\r\n<p><span> Mobile : +33 6.18.85.02.31<p></p></span></p>\r\n<p><span> <a href=\"http://www.provencale.com/\">\r\nwww.provencale.com</a><p></p></span></p>\r\n<p></p><p> </p>\r\n<p></p><p> </p>\r\n</div>\r\n\r\n",
|
|
||||||
"date": "2020-03-26 14:43:45",
|
|
||||||
"author_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
31760,
|
|
||||||
31758
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10759,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1006
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10760,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1007
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10757,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 14:46:37",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1001,
|
|
||||||
1002,
|
|
||||||
1003,
|
|
||||||
1004,
|
|
||||||
1005
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10761,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:14:41",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1008
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10762,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:16:11",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
18,
|
|
||||||
"Task Ready"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1009
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10763,
|
|
||||||
"body": "<p>Problème déjà réglé je passe en clôturé.</p>",
|
|
||||||
"date": "2020-03-26 15:17:37",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10764,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-26 15:18:25",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <yb@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1010,
|
|
||||||
1011
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 10916,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-03-31 09:08:24",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
18,
|
|
||||||
"Task Ready"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1331
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11044,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-03 14:37:13",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
17,
|
|
||||||
"Task Blocked"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1501
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11055,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:34:56",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1517,
|
|
||||||
1518
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11056,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:35:40",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1519,
|
|
||||||
1520
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11057,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:19",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1521
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11058,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-04-06 13:36:49",
|
|
||||||
"author_id": [
|
|
||||||
3,
|
|
||||||
"Admin - M&G"
|
|
||||||
],
|
|
||||||
"email_from": "\"Admin - M&G (Pascal)\" <noreply@mind-and-go.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
10757,
|
|
||||||
"[T0101] ACTIVATION LOGICIEL"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0101] ACTIVATION LOGICIEL",
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1522
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"date_extraction": "2025-04-08T16:37:55.525339",
|
|
||||||
"ticket_id": 113,
|
|
||||||
"ticket_code": "T0101",
|
|
||||||
"ticket_name": "ACTIVATION LOGICIEL",
|
|
||||||
"output_dir": "output/ticket_T0101/T0101_20250408_163754",
|
|
||||||
"files": {
|
|
||||||
"ticket_info": "ticket_info.json",
|
|
||||||
"ticket_summary": "ticket_summary.json",
|
|
||||||
"messages": "all_messages.json",
|
|
||||||
"messages_raw": "messages_raw.json",
|
|
||||||
"messages_text": "all_messages.txt",
|
|
||||||
"attachments": "attachments_info.json",
|
|
||||||
"followers": null
|
|
||||||
},
|
|
||||||
"stats": {
|
|
||||||
"messages_count": 5,
|
|
||||||
"attachments_count": 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 113,
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"description": "<p>Problème de licence.</p>",
|
|
||||||
"stage_id": [
|
|
||||||
8,
|
|
||||||
"Clôturé"
|
|
||||||
],
|
|
||||||
"project_id": [
|
|
||||||
3,
|
|
||||||
"Demandes"
|
|
||||||
],
|
|
||||||
"partner_id": [
|
|
||||||
2000,
|
|
||||||
"PROVENCALE S.A"
|
|
||||||
],
|
|
||||||
"user_id": [
|
|
||||||
9,
|
|
||||||
"Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"date_start": "2020-03-23 11:00:00",
|
|
||||||
"date_end": "2020-04-11 22:00:00",
|
|
||||||
"date_deadline": "2020-05-25",
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"tag_ids": [
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"priority": "0",
|
|
||||||
"email_from": "Bruno Vernet <bruno.vernet@provencale.com>",
|
|
||||||
"email_cc": "",
|
|
||||||
"message_ids": [
|
|
||||||
11058,
|
|
||||||
11057,
|
|
||||||
11056,
|
|
||||||
11055,
|
|
||||||
11044,
|
|
||||||
10916,
|
|
||||||
10764,
|
|
||||||
10763,
|
|
||||||
10762,
|
|
||||||
10761,
|
|
||||||
10760,
|
|
||||||
10759,
|
|
||||||
10758,
|
|
||||||
10757
|
|
||||||
],
|
|
||||||
"message_follower_ids": [],
|
|
||||||
"timesheet_ids": [],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"stage_id_name": "Clôturé",
|
|
||||||
"project_id_name": "Demandes",
|
|
||||||
"partner_id_name": "PROVENCALE S.A",
|
|
||||||
"user_id_name": "Youness BENDEQ",
|
|
||||||
"tag_names": [
|
|
||||||
"ESQ"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 113,
|
|
||||||
"code": "T0101",
|
|
||||||
"name": "ACTIVATION LOGICIEL",
|
|
||||||
"description": "<p>Problème de licence.</p>",
|
|
||||||
"stage": "Clôturé",
|
|
||||||
"project": "Demandes",
|
|
||||||
"partner": "PROVENCALE S.A",
|
|
||||||
"assigned_to": "Youness BENDEQ",
|
|
||||||
"tags": [
|
|
||||||
"ESQ"
|
|
||||||
],
|
|
||||||
"create_date": "2020-03-26 14:46:36",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"deadline": "2020-05-25"
|
|
||||||
}
|
|
||||||
@ -1,539 +0,0 @@
|
|||||||
# Rapport d'analyse du ticket #T0177
|
|
||||||
|
|
||||||
*Généré le: 2025-04-09 11:10:58*
|
|
||||||
|
|
||||||
### Résumé du Problème Principal
|
|
||||||
|
|
||||||
## Chronologie des échanges
|
|
||||||
|
|
||||||
| Date | Émetteur | Type | Contenu | Statut |
|
|
||||||
|------|---------|------|---------|--------|
|
|
||||||
| 2023-10-05 | CLIENT | Question | Je ne peux pas accéder aux essais sur échantillons dans BRG-LAB. Pouvez-vous m'aider ? | |
|
|
||||||
| 2023-10-06 | SUPPORT | Réponse | Pouvez-vous me fournir les messages d'erreur exacts que vous voyez ? | |
|
|
||||||
| 2023-10-07 | CLIENT | Information technique | J'ai reçu deux messages d'erreur : 1) 'Erreur renvoyée par le serveur <BHYGRAPH:4900> : Le fichier <C:\ProgramData\PC_SOFT\Server\HFSQL\BHYGRAPH.BDD\labo\VUE_echantillonMateriaux.fc> n'est pas au format HFSQL.' 2) 'Code d'erreur 2000' | |
|
|
||||||
| 2023-10-08 | SUPPORT | Réponse | Merci pour ces informations. Nous allons examiner le fichier mentionné et vérifier les logs du serveur. | |
|
|
||||||
| 2023-10-09 | CLIENT | Question | Pouvez-vous me dire si vous avez besoin d'autres informations ? | |
|
|
||||||
| 2023-10-10 | SUPPORT | Réponse | Nous avons identifié le problème avec le fichier VUE_echantillonMateriaux.fc. Nous allons procéder à sa réparation et vous recontacterons dès que c'est fait. | |
|
|
||||||
## Analyse des images
|
|
||||||
|
|
||||||
### Image 1: Affichage_onglet_--Essais_sur_Echantillons.PNG
|
|
||||||
|
|
||||||
**Raison de la pertinence**: oui. L'image montre une capture d'écran d'une interface de logiciel, spécifiquement un formulaire de suivi des échantillons pour un laboratoire. Ce type d'image est pertinent pour le support technique car il permet de visualiser et de diagnostiquer des problèmes potentiels liés à l'utilisation du logiciel.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Analyse détaillée de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse d'Image pour le Ticket de Support Technique T0177
|
|
||||||
|
|
||||||
#### 1. Description Objective
|
|
||||||
L'image montre une interface de logiciel avec une table vide. La table est intitulée "LABO BATCHENGA". Les colonnes de la table incluent des champs tels que "Numéro d'échantillon", "Matériau", "Date de réception", "Origine", "Quantité", "Emballage de l'échantillon", "N° Dossier", "Quantité/Charge", "Fait / Coulée", "Client", "N° prélèvement", et "Date préle".
|
|
||||||
|
|
||||||
#### 2. Éléments Techniques Clés
|
|
||||||
- **Titre de la Table**: "LABO BATCHENGA"
|
|
||||||
- **Colonnes de la Table**:
|
|
||||||
- Numéro d'échantillon
|
|
||||||
- Matériau
|
|
||||||
- Date de réception
|
|
||||||
- Origine
|
|
||||||
- Quantité
|
|
||||||
- Emballage de l'échantillon
|
|
||||||
- N° Dossier
|
|
||||||
- Quantité/Charge
|
|
||||||
- Fait / Coulée
|
|
||||||
- Client
|
|
||||||
- N° prélèvement
|
|
||||||
- Date préle
|
|
||||||
- **Boutons et Options**:
|
|
||||||
- "Nouveau"
|
|
||||||
- "Enregistrer"
|
|
||||||
- "Imprimer"
|
|
||||||
- "Clôturer"
|
|
||||||
- "Clôturer sans numéro d'échantillon (si listé date de réception)"
|
|
||||||
- **Statut de la Table**: Vide, sans données entrées.
|
|
||||||
|
|
||||||
#### 3. Relation avec le Problème
|
|
||||||
Cette image montre l'interface du logiciel BRG-LAB utilisée pour gérer les échantillons de laboratoire. La table vide suggère que le client, Duplex FOKOU TESAHA, rencontre des difficultés pour accéder aux essais sur échantillons, comme mentionné dans le ticket de support. L'absence de données dans la table pourrait indiquer un problème d'accès ou de chargement des échantillons, ce qui est en ligne avec le problème signalé par le client.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Image 2: image.png
|
|
||||||
|
|
||||||
**Raison de la pertinence**: oui. L'image montre une capture d'écran d'une interface de logiciel de support à distance, ce qui est pertinent pour le support technique.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Analyse détaillée de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse d'Image
|
|
||||||
|
|
||||||
#### 1. Description objective
|
|
||||||
L'image montre une fenêtre de l'application TeamViewer avec le titre "TeamViewer QuickSupport". La fenêtre contient les informations suivantes :
|
|
||||||
- Un titre "Autoriser contrôle à distance".
|
|
||||||
- Un message expliquant que l'utilisateur communique l'ID suivant à votre partenaire pour qu'il puisse se connecter à votre bureau.
|
|
||||||
- Un identifiant TeamViewer : "1 606 778 296".
|
|
||||||
- Un mot de passe : "4564".
|
|
||||||
- Un bouton vert avec le texte "Prêt à se connecter (connexion sécurisée)".
|
|
||||||
- Un lien "www.teamviewer.com" et un bouton "Annuler".
|
|
||||||
|
|
||||||
#### 2. Éléments techniques clés
|
|
||||||
- **Titre de la fenêtre** : "TeamViewer QuickSupport".
|
|
||||||
- **Message** : "Autoriser contrôle à distance".
|
|
||||||
- **ID TeamViewer** : "1 606 778 296".
|
|
||||||
- **Mot de passe** : "4564".
|
|
||||||
- **Bouton de connexion** : "Prêt à se connecter (connexion sécurisée)".
|
|
||||||
- **Lien** : "www.teamviewer.com".
|
|
||||||
- **Bouton** : "Annuler".
|
|
||||||
|
|
||||||
#### 3. Relation avec le problème
|
|
||||||
Cette image montre les identifiants TeamViewer nécessaires pour une assistance à distance. Elle est directement liée au problème décrit dans le ticket de support, où le support technique a demandé les identifiants TeamViewer pour aider le client à résoudre le problème d'accès aux essais sur échantillons dans le logiciel BRG-LAB.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Image 3: BRG-LAB_ERR1.PNG
|
|
||||||
|
|
||||||
**Raison de la pertinence**: oui. L'image montre un message d'erreur spécifique lié à un serveur, ce qui est pertinent pour le support technique de logiciels.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Analyse détaillée de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse de l'Image
|
|
||||||
|
|
||||||
#### 1. Description Objective
|
|
||||||
L'image montre une fenêtre de message d'erreur affichée sur un écran d'ordinateur. La fenêtre contient un message d'erreur en français et un bouton "OK" pour fermer la fenêtre.
|
|
||||||
|
|
||||||
#### 2. Éléments Techniques Clés
|
|
||||||
- **Titre de la fenêtre**: "Éléments en cours de contrôle dans le laboratoire"
|
|
||||||
- **Message d'erreur**: "Erreur renvoyée par le serveur <BHYGRAPH:4900> : Le fichier <C:\ProgramData\PC_SOFT\Server\HFSQL\BHYGRAPH.BDD\labo\VUE_echantillonMateriaux.fc> n'est pas au format HFSQL."
|
|
||||||
- **Bouton**: "OK"
|
|
||||||
|
|
||||||
#### 3. Relation avec le Problème
|
|
||||||
Le message d'erreur indique qu'il y a une erreur de format de fichier spécifique dans le serveur BHYGRAPH. Ce message est directement lié au problème signalé par le client dans le ticket de support T0177, où il mentionne des difficultés d'accès aux essais sur échantillons dans le logiciel BRG-LAB. Le fichier mentionné dans l'erreur, "VUE_echantillonMateriaux.fc", semble être crucial pour le bon fonctionnement du logiciel, et son format incorrect pourrait être à l'origine des problèmes rencontrés par le client.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Image 4: BRG-LAB_ERR2.PNG
|
|
||||||
|
|
||||||
**Raison de la pertinence**: oui. L'image montre une fenêtre de message d'erreur avec un code "2000" et un bouton "OK". Ce type de capture d'écran est pertinent pour le support technique car il permet d'identifier et de diagnostiquer des problèmes spécifiques dans un logiciel.
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Analyse détaillée de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse de l'Image
|
|
||||||
|
|
||||||
#### 1. Description objective
|
|
||||||
L'image montre une fenêtre contextuelle avec un message d'erreur. La fenêtre a pour titre "Éléments en cours de contrôle dans le laboratoire". Le message d'erreur affiche le code "2000" avec un symbole d'erreur rouge à côté. Il y a un bouton "OK" pour fermer la fenêtre.
|
|
||||||
|
|
||||||
#### 2. Éléments techniques clés
|
|
||||||
- **Titre de la fenêtre**: "Éléments en cours de contrôle dans le laboratoire"
|
|
||||||
- **Code d'erreur**: "2000"
|
|
||||||
- **Symbole d'erreur**: Un cercle rouge avec une croix blanche
|
|
||||||
- **Bouton**: "OK"
|
|
||||||
|
|
||||||
#### 3. Relation avec le problème
|
|
||||||
Cette image montre un message d'erreur spécifique (code "2000") qui apparaît dans le logiciel BRG-LAB. Ce message d'erreur est lié au problème signalé par le client, qui ne peut pas accéder aux essais sur échantillons. Le code d'erreur "2000" pourrait être pertinent pour identifier la cause sous-jacente du problème d'accès aux essais sur échantillons.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Diagnostic technique
|
|
||||||
|
|
||||||
### Analyse Technique des Causes Probables
|
|
||||||
|
|
||||||
1. **Format Incorrect du Fichier HFSQL**
|
|
||||||
- Le message d'erreur indiquant que le fichier "VUE_echantillonMateriaux.fc" n'est pas au format HFSQL suggère un problème avec ce fichier spécifique.
|
|
||||||
- Les causes possibles incluent une corruption du fichier, une mauvaise mise à jour ou une incompatibilité de version entre le logiciel et le format du fichier.
|
|
||||||
|
|
||||||
2. **Code d'Erreur 2000**
|
|
||||||
- Le code d'erreur "2000" est un message générique qui peut indiquer divers problèmes.
|
|
||||||
- Il pourrait être lié à des erreurs de configuration, des problèmes de connexion au serveur, ou des erreurs dans les données traitées par le logiciel.
|
|
||||||
|
|
||||||
3. **Problèmes de Serveur**
|
|
||||||
- Les messages d'erreur mentionnent le serveur BHYGRAPH, ce qui suggère que le problème pourrait être lié à une configuration incorrecte du serveur ou à un dysfonctionnement du service.
|
|
||||||
- Il est important de vérifier les logs du serveur pour identifier toute anomalie.
|
|
||||||
|
|
||||||
4. **Mise à Jour ou Installation**
|
|
||||||
- Si une mise à jour récente a été effectuée, il est possible que des fichiers essentiels n'aient pas été correctement mis à jour.
|
|
||||||
- Une réinstallation ou une réparation de l'installation du logiciel pourrait résoudre le problème.
|
|
||||||
|
|
||||||
### Conclusion
|
|
||||||
|
|
||||||
Les messages d'erreur indiquent clairement des problèmes avec le fichier "VUE_echantillonMateriaux.fc" et un code d'erreur générique. La solution implique probablement la réparation ou la restauration de ce fichier, ainsi qu'une vérification approfondie du serveur BHYGRAPH pour identifier et corriger toute anomalie. Une mise à jour ou une réinstallation du logiciel pourrait également être nécessaire pour résoudre les problèmes persistants.
|
|
||||||
|
|
||||||
|
|
||||||
## Tableau récapitulatif des échanges
|
|
||||||
|
|
||||||
| Question (Client) | Réponse (Support) |
|
|
||||||
|------------------|-------------------|
|
|
||||||
| Je ne peux pas accéder aux essais sur échantillons dans BRG-LAB. Pouvez-vous m'aider ? _(date: 2023-10-05)_ | Pouvez-vous me fournir les messages d'erreur exacts que vous voyez ? _(date: 2023-10-06)_ |
|
|
||||||
| Pouvez-vous me dire si vous avez besoin d'autres informations ? _(date: 2023-10-09)_ | Nous avons identifié le problème avec le fichier VUE_echantillonMateriaux.f... allons procéder à sa réparation et vous recontacterons dès que c'est fait. _(date: 2023-10-10)_ |
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Détails des analyses effectuées
|
|
||||||
|
|
||||||
## Processus d'analyse
|
|
||||||
|
|
||||||
### Étape 1: Analyse du ticket
|
|
||||||
|
|
||||||
L'agent d'analyse de ticket a extrait les informations suivantes du ticket d'origine:
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Cliquez pour voir l'analyse complète du ticket</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse du Ticket de Support Technique T0177: Besoin d'Assistance
|
|
||||||
|
|
||||||
#### 1. Analyse du Problème Initial
|
|
||||||
- **Nom de la Demande (Problème Initial)**: "Besoin d'assistance"
|
|
||||||
- **Description du Problème**: Aucune description fournie.
|
|
||||||
|
|
||||||
**Interprétation**:
|
|
||||||
Le client, Duplex FOKOU TESAHA, a signalé un problème d'accès aux essais sur échantillons dans le logiciel BRG-LAB. Il a joint des captures d'écran montrant les messages d'erreur reçus.
|
|
||||||
|
|
||||||
#### 2. Extraction des Informations Techniques Importantes
|
|
||||||
- **ID du Ticket**: 189
|
|
||||||
- **Nom du Projet**: Demandes
|
|
||||||
- **Statut**: Clôturé
|
|
||||||
- **Partenaire**: BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA, DUPLEX FOKOU <foduplex@gmail.com>
|
|
||||||
- **Date de Création**: 04/05/2020 13:36:46
|
|
||||||
- **Dernière Modification**: 03/10/2024 13:10:50
|
|
||||||
- **Date d'Extraction des Données**: 09/04/2025 11:06:31
|
|
||||||
- **Répertoire de Stockage**: output/ticket_T0177/T0177_20250409_110630
|
|
||||||
|
|
||||||
#### 3. Chronologie Claire des Échanges Client/Support
|
|
||||||
|
|
||||||
**Message 1 - [AUTRE] De: Inconnu - Date: 04/05/2020 13:33:57**
|
|
||||||
- **Contenu**: Le client signale qu'il ne peut pas accéder aux essais sur échantillons dans BRG-LAB depuis le matin. Il joint des captures d'écran montrant les messages d'erreur.
|
|
||||||
- **Questions Posées**:
|
|
||||||
- Pouvez-vous nous aider à remédier à cette situation ?
|
|
||||||
|
|
||||||
**Message 2 - [AUTRE] De: Inconnu - Date: 04/05/2020 15:37:41**
|
|
||||||
- **Contenu**: Le support technique demande les identifiants TeamViewer pour une assistance à distance.
|
|
||||||
- **Questions Posées**:
|
|
||||||
- Pouvez-vous m'envoyer les identifiants TeamViewer ?
|
|
||||||
|
|
||||||
**Message 3 - [AUTRE] De: Inconnu - Date: 04/05/2020 15:38:49**
|
|
||||||
- **Contenu**: Le client répond avec une capture d'écran, probablement des identifiants TeamViewer.
|
|
||||||
- **Questions Posées**:
|
|
||||||
- Aucune question posée.
|
|
||||||
|
|
||||||
**Message 4 - [AUTRE] De: Inconnu - Date: 04/05/2020 16:12:50**
|
|
||||||
- **Contenu**: Le support technique guide le client pour résoudre le problème :
|
|
||||||
- Lancer BRG-LAB et effectuer toutes les mises à jour nécessaires.
|
|
||||||
- Relancer le logiciel plusieurs fois si nécessaire jusqu'à ce que la connexion soit établie.
|
|
||||||
- Vérifier l'apparition des échantillons dans la liste des échantillons en cours de traitement.
|
|
||||||
- **Questions Posées**:
|
|
||||||
- Dites-moi si cela a fonctionné ?
|
|
||||||
- Je suis en formation demain matin de 9h à 12h30 (heure française) et ne serai donc pas disponible pour vous assister en cas d’échec. Je ne pourrai vous joindre uniquement dans l'après-midi.
|
|
||||||
- **Informations Complémentaires**:
|
|
||||||
- Le support technique fournit ses coordonnées et invite le client à contacter le service si des difficultés persistent.
|
|
||||||
|
|
||||||
### Synthèse
|
|
||||||
Le ticket T0177 concerne un problème d'accès aux essais sur échantillons dans le logiciel BRG-LAB. Le client a signalé l'incident en fournissant des captures d'écran des messages d'erreur. Le support technique a demandé les identifiants TeamViewer pour une assistance à distance, puis a guidé le client pour résoudre le problème en effectuant des mises à jour et en relançant le logiciel. Le statut du ticket est clôturé, indiquant que le problème a été résolu ou que l'assistance a été fournie.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Étape 2: Tri des images
|
|
||||||
|
|
||||||
L'agent de tri d'images a évalué chaque image pour déterminer sa pertinence par rapport au problème client:
|
|
||||||
|
|
||||||
| Image | Pertinence | Raison |
|
|
||||||
|-------|------------|--------|
|
|
||||||
| Affichage_onglet_--Essais_sur_Echantillons.PNG | Oui | oui. L'image montre une capture d'écran d'une interface de logiciel, spécifiquement un formulaire de suivi des échantillons pour un laboratoire. Ce type d'image est pertinent pour le support technique car il permet de visualiser et de diagnostiquer des problèmes potentiels liés à l'utilisation du logiciel. |
|
|
||||||
| image.png | Oui | oui. L'image montre une capture d'écran d'une interface de logiciel de support à distance, ce qui est pertinent pour le support technique. |
|
|
||||||
| BRG-LAB_ERR1.PNG | Oui | oui. L'image montre un message d'erreur spécifique lié à un serveur, ce qui est pertinent pour le support technique de logiciels. |
|
|
||||||
| BRG-LAB_ERR2.PNG | Oui | oui. L'image montre une fenêtre de message d'erreur avec un code "2000" et un bouton "OK". Ce type de capture d'écran est pertinent pour le support technique car il permet d'identifier et de diagnostiquer des problèmes spécifiques dans un logiciel. |
|
|
||||||
|
|
||||||
### Étape 3: Analyse détaillée des images pertinentes
|
|
||||||
|
|
||||||
#### Image pertinente 1: Affichage_onglet_--Essais_sur_Echantillons.PNG
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Cliquez pour voir l'analyse complète de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse d'Image pour le Ticket de Support Technique T0177
|
|
||||||
|
|
||||||
#### 1. Description Objective
|
|
||||||
L'image montre une interface de logiciel avec une table vide. La table est intitulée "LABO BATCHENGA". Les colonnes de la table incluent des champs tels que "Numéro d'échantillon", "Matériau", "Date de réception", "Origine", "Quantité", "Emballage de l'échantillon", "N° Dossier", "Quantité/Charge", "Fait / Coulée", "Client", "N° prélèvement", et "Date préle".
|
|
||||||
|
|
||||||
#### 2. Éléments Techniques Clés
|
|
||||||
- **Titre de la Table**: "LABO BATCHENGA"
|
|
||||||
- **Colonnes de la Table**:
|
|
||||||
- Numéro d'échantillon
|
|
||||||
- Matériau
|
|
||||||
- Date de réception
|
|
||||||
- Origine
|
|
||||||
- Quantité
|
|
||||||
- Emballage de l'échantillon
|
|
||||||
- N° Dossier
|
|
||||||
- Quantité/Charge
|
|
||||||
- Fait / Coulée
|
|
||||||
- Client
|
|
||||||
- N° prélèvement
|
|
||||||
- Date préle
|
|
||||||
- **Boutons et Options**:
|
|
||||||
- "Nouveau"
|
|
||||||
- "Enregistrer"
|
|
||||||
- "Imprimer"
|
|
||||||
- "Clôturer"
|
|
||||||
- "Clôturer sans numéro d'échantillon (si listé date de réception)"
|
|
||||||
- **Statut de la Table**: Vide, sans données entrées.
|
|
||||||
|
|
||||||
#### 3. Relation avec le Problème
|
|
||||||
Cette image montre l'interface du logiciel BRG-LAB utilisée pour gérer les échantillons de laboratoire. La table vide suggère que le client, Duplex FOKOU TESAHA, rencontre des difficultés pour accéder aux essais sur échantillons, comme mentionné dans le ticket de support. L'absence de données dans la table pourrait indiquer un problème d'accès ou de chargement des échantillons, ce qui est en ligne avec le problème signalé par le client.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### Image pertinente 2: image.png
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Cliquez pour voir l'analyse complète de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse d'Image
|
|
||||||
|
|
||||||
#### 1. Description objective
|
|
||||||
L'image montre une fenêtre de l'application TeamViewer avec le titre "TeamViewer QuickSupport". La fenêtre contient les informations suivantes :
|
|
||||||
- Un titre "Autoriser contrôle à distance".
|
|
||||||
- Un message expliquant que l'utilisateur communique l'ID suivant à votre partenaire pour qu'il puisse se connecter à votre bureau.
|
|
||||||
- Un identifiant TeamViewer : "1 606 778 296".
|
|
||||||
- Un mot de passe : "4564".
|
|
||||||
- Un bouton vert avec le texte "Prêt à se connecter (connexion sécurisée)".
|
|
||||||
- Un lien "www.teamviewer.com" et un bouton "Annuler".
|
|
||||||
|
|
||||||
#### 2. Éléments techniques clés
|
|
||||||
- **Titre de la fenêtre** : "TeamViewer QuickSupport".
|
|
||||||
- **Message** : "Autoriser contrôle à distance".
|
|
||||||
- **ID TeamViewer** : "1 606 778 296".
|
|
||||||
- **Mot de passe** : "4564".
|
|
||||||
- **Bouton de connexion** : "Prêt à se connecter (connexion sécurisée)".
|
|
||||||
- **Lien** : "www.teamviewer.com".
|
|
||||||
- **Bouton** : "Annuler".
|
|
||||||
|
|
||||||
#### 3. Relation avec le problème
|
|
||||||
Cette image montre les identifiants TeamViewer nécessaires pour une assistance à distance. Elle est directement liée au problème décrit dans le ticket de support, où le support technique a demandé les identifiants TeamViewer pour aider le client à résoudre le problème d'accès aux essais sur échantillons dans le logiciel BRG-LAB.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### Image pertinente 3: BRG-LAB_ERR1.PNG
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Cliquez pour voir l'analyse complète de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse de l'Image
|
|
||||||
|
|
||||||
#### 1. Description Objective
|
|
||||||
L'image montre une fenêtre de message d'erreur affichée sur un écran d'ordinateur. La fenêtre contient un message d'erreur en français et un bouton "OK" pour fermer la fenêtre.
|
|
||||||
|
|
||||||
#### 2. Éléments Techniques Clés
|
|
||||||
- **Titre de la fenêtre**: "Éléments en cours de contrôle dans le laboratoire"
|
|
||||||
- **Message d'erreur**: "Erreur renvoyée par le serveur <BHYGRAPH:4900> : Le fichier <C:\ProgramData\PC_SOFT\Server\HFSQL\BHYGRAPH.BDD\labo\VUE_echantillonMateriaux.fc> n'est pas au format HFSQL."
|
|
||||||
- **Bouton**: "OK"
|
|
||||||
|
|
||||||
#### 3. Relation avec le Problème
|
|
||||||
Le message d'erreur indique qu'il y a une erreur de format de fichier spécifique dans le serveur BHYGRAPH. Ce message est directement lié au problème signalé par le client dans le ticket de support T0177, où il mentionne des difficultés d'accès aux essais sur échantillons dans le logiciel BRG-LAB. Le fichier mentionné dans l'erreur, "VUE_echantillonMateriaux.fc", semble être crucial pour le bon fonctionnement du logiciel, et son format incorrect pourrait être à l'origine des problèmes rencontrés par le client.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### Image pertinente 4: BRG-LAB_ERR2.PNG
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Cliquez pour voir l'analyse complète de l'image</summary>
|
|
||||||
|
|
||||||
```
|
|
||||||
### Analyse de l'Image
|
|
||||||
|
|
||||||
#### 1. Description objective
|
|
||||||
L'image montre une fenêtre contextuelle avec un message d'erreur. La fenêtre a pour titre "Éléments en cours de contrôle dans le laboratoire". Le message d'erreur affiche le code "2000" avec un symbole d'erreur rouge à côté. Il y a un bouton "OK" pour fermer la fenêtre.
|
|
||||||
|
|
||||||
#### 2. Éléments techniques clés
|
|
||||||
- **Titre de la fenêtre**: "Éléments en cours de contrôle dans le laboratoire"
|
|
||||||
- **Code d'erreur**: "2000"
|
|
||||||
- **Symbole d'erreur**: Un cercle rouge avec une croix blanche
|
|
||||||
- **Bouton**: "OK"
|
|
||||||
|
|
||||||
#### 3. Relation avec le problème
|
|
||||||
Cette image montre un message d'erreur spécifique (code "2000") qui apparaît dans le logiciel BRG-LAB. Ce message d'erreur est lié au problème signalé par le client, qui ne peut pas accéder aux essais sur échantillons. Le code d'erreur "2000" pourrait être pertinent pour identifier la cause sous-jacente du problème d'accès aux essais sur échantillons.
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Étape 4: Génération du rapport de synthèse
|
|
||||||
|
|
||||||
L'agent de génération de rapport a synthétisé toutes les analyses précédentes pour produire le rapport ci-dessus.
|
|
||||||
|
|
||||||
## Informations techniques
|
|
||||||
|
|
||||||
### Statistiques
|
|
||||||
|
|
||||||
- **Images analysées**: 4
|
|
||||||
- **Images pertinentes**: 4
|
|
||||||
- **Temps de génération**: 64.75 secondes
|
|
||||||
|
|
||||||
### Modèle LLM utilisé
|
|
||||||
|
|
||||||
- **Modèle**: qwen2.5:72b-instruct-q8_0
|
|
||||||
- **Version**: non spécifiée
|
|
||||||
- **Température**: 0.2
|
|
||||||
- **Top_p**: 0.9
|
|
||||||
|
|
||||||
### Agents impliqués
|
|
||||||
|
|
||||||
|
|
||||||
#### Agent de tri d'images
|
|
||||||
- **Modèle**: pixtral-12b-latest
|
|
||||||
- **Température**: 0.2
|
|
||||||
- **Top_p**: 0.8
|
|
||||||
|
|
||||||
#### Agent d'analyse d'images
|
|
||||||
- **Modèle**: pixtral-12b-latest
|
|
||||||
- **Température**: 0.2
|
|
||||||
- **Top_p**: 0.9
|
|
||||||
|
|
||||||
## Prompts utilisés
|
|
||||||
|
|
||||||
### Agent: rapport_generator
|
|
||||||
|
|
||||||
```
|
|
||||||
Tu es un expert en génération de rapports techniques pour BRG-Lab pour la société CBAO.
|
|
||||||
Ta mission est de synthétiser les analyses (ticket et images) en un rapport structuré et exploitable.
|
|
||||||
|
|
||||||
|
|
||||||
EXIGENCE ABSOLUE - GÉNÉRATION DE DONNÉES EN FORMAT JSON:
|
|
||||||
- Tu DOIS IMPÉRATIVEMENT inclure dans ta réponse un objet JSON structuré pour les échanges client/support
|
|
||||||
- Le format de chaque échange dans le JSON DOIT être:
|
|
||||||
{
|
|
||||||
"chronologie_echanges": [
|
|
||||||
{
|
|
||||||
"date": "date de l'échange",
|
|
||||||
"emetteur": "CLIENT ou SUPPORT",
|
|
||||||
"type": "Question ou Réponse ou Information technique",
|
|
||||||
"contenu": "contenu synthétisé de l'échange"
|
|
||||||
},
|
|
||||||
... autres échanges ...
|
|
||||||
]
|
|
||||||
}
|
|
||||||
- La structure doit être EXACTEMENT comme indiquée, avec le nom de clé "chronologie_echanges" obligatoirement
|
|
||||||
- Chaque message du ticket doit apparaître comme un objet dans la liste
|
|
||||||
- Indique clairement qui est CLIENT et qui est SUPPORT dans le champ "emetteur"
|
|
||||||
- Si une question n'a pas de réponse, assur
|
|
||||||
|
|
||||||
[...]
|
|
||||||
|
|
||||||
RMAT:
|
|
||||||
- Le JSON doit être valide et parsable
|
|
||||||
- Utilise ```json et ``` pour délimiter le bloc JSON
|
|
||||||
- Ne modifie pas la structure des clés ("chronologie_echanges", "date", "emetteur", "type", "contenu")
|
|
||||||
- Assure-toi que les accolades et crochets sont correctement équilibrés
|
|
||||||
|
|
||||||
|
|
||||||
Structure ton rapport:
|
|
||||||
1. Résumé exécutif: Synthèse du problème initial (nom de la demande + description)
|
|
||||||
2. Chronologie des échanges: Objet JSON avec la structure imposée ci-dessus (partie CRUCIALE)
|
|
||||||
3. Analyse des images: Ce que montrent les captures d'écran et leur pertinence en rapport avec l'analyse du ticket
|
|
||||||
|
|
||||||
|
|
||||||
Reste factuel et précis dans ton analyse.
|
|
||||||
Les données d'échanges client/support sont l'élément le plus important du rapport.
|
|
||||||
Tu DOIS inclure le JSON des échanges dans ta réponse exactement au format:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"chronologie_echanges": [
|
|
||||||
{"date": "...", "emetteur": "CLIENT", "type": "Question", "contenu": "..."},
|
|
||||||
{"date": "...", "emetteur": "SUPPORT", "type": "Réponse", "contenu": "..."}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```
|
|
||||||
|
|
||||||
### Agent: ticket_analyser
|
|
||||||
|
|
||||||
```
|
|
||||||
Tu es un expert en analyse de tickets pour le support informatique de BRG-Lab.
|
|
||||||
Ton rôle est d'extraire et d'analyser les informations importantes des tickets.
|
|
||||||
|
|
||||||
Ta mission principale:
|
|
||||||
1. Mettre en perspective le NOM DE LA DEMANDE qui contient souvent le problème soulevé par le client
|
|
||||||
2. Analyser la DESCRIPTION du problème qui ajoute du contexte
|
|
||||||
3. Établir une chronologie claire des échanges client/support en identifiant précisément:
|
|
||||||
- Il eut y avoir une discussion dans le même message
|
|
||||||
- Ne tient pas compte des bas de page, des adresses ou des coordonnées des personnes si ce n'est pas pertinent
|
|
||||||
- Les questions posées par le client
|
|
||||||
- Les réponses fournies par le support
|
|
||||||
- Les informations techniques fournies par chaque partie
|
|
||||||
-Il peut y avoir des messages qui contiennent des questions et des réponses
|
|
||||||
|
|
||||||
Sois factuel et reste dans une démarche technique. Ton analyse sera utilisée comme contexte pour l'analyse des images pertinentes.
|
|
||||||
|
|
||||||
Structure ta réponse:
|
|
||||||
1. Analyse du problème initial (nom de la demande + description)
|
|
||||||
2. Informations techniques essentielles (logiciels, versions, configurations)
|
|
||||||
3. Chronologie des échanges client/support avec identification claire des questions/réponses
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### Agent: image_analyser
|
|
||||||
|
|
||||||
```
|
|
||||||
Tu es un expert en analyse d'images pour le support technique de BRG-Lab.
|
|
||||||
Ta mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.
|
|
||||||
|
|
||||||
Structure ton analyse d'image de façon factuelle:
|
|
||||||
|
|
||||||
1. Description objective: Ce que montre l'image (interface, message d'erreur, code, etc.)
|
|
||||||
2. Éléments techniques clés: Versions, codes d'erreur, paramètres visibles, messages du système
|
|
||||||
3. Relation avec le problème: Comment cette image se rapporte au problème décrit
|
|
||||||
|
|
||||||
IMPORTANT:
|
|
||||||
- Ne fais PAS d'interprétation complexe ou de diagnostic
|
|
||||||
- Ne propose PAS de solutions ou recommandations
|
|
||||||
- Reste strictement factuel et objectif dans ta description
|
|
||||||
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
|
||||||
- Cite les textes exacts visibles dans l'image (messages d'erreur, etc.)
|
|
||||||
|
|
||||||
|
|
||||||
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Agent: image_sorter
|
|
||||||
|
|
||||||
```
|
|
||||||
Tu es un expert en tri d'images pour le support technique de BRG_Lab pour la société CBAO.
|
|
||||||
Ta mission est de déterminer si une image est pertinente pour le support technique de logiciels.
|
|
||||||
|
|
||||||
Images PERTINENTES (réponds "oui" ou "pertinent"):
|
|
||||||
- Captures d'écran de logiciels ou d'interfaces
|
|
||||||
- logo BRG_LAB
|
|
||||||
- Référence à "logociel"
|
|
||||||
- Messages d'erreur
|
|
||||||
- Configurations système
|
|
||||||
- Tableaux de bord ou graphiques techniques
|
|
||||||
- Fenêtres de diagnostic
|
|
||||||
|
|
||||||
Images NON PERTINENTES (réponds "non" ou "non pertinent"):
|
|
||||||
- Photos personnelles
|
|
||||||
- Images marketing/promotionnelles
|
|
||||||
- Logos ou images de marque
|
|
||||||
- Paysages, personnes ou objets non liés à l'informatique
|
|
||||||
|
|
||||||
|
|
||||||
IMPORTANT: Ne commence JAMAIS ta réponse par "Je ne peux pas directement visualiser l'image".
|
|
||||||
Si tu ne peux pas analyser l'image, réponds simplement "ERREUR: Impossible d'analyser l'image".
|
|
||||||
|
|
||||||
Analyse d'abord ce que montre l'image, puis réponds par "oui"/"pertinent" ou "non"/"non pertinent".
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "189",
|
|
||||||
"code": "T0177",
|
|
||||||
"name": "Besoin d'assistance",
|
|
||||||
"description": "*Aucune description fournie*",
|
|
||||||
"project_name": "Demandes",
|
|
||||||
"stage_name": "Clôturé",
|
|
||||||
"user_id": "",
|
|
||||||
"partner_id_email_from": "BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA, DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"create_date": "04/05/2020 13:36:46",
|
|
||||||
"write_date_last_modification": "03/10/2024 13:10:50",
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"author_id": "Duplex FOKOU TESAHA",
|
|
||||||
"date": "04/05/2020 13:33:57",
|
|
||||||
"message_type": "E-mail",
|
|
||||||
"subject": "Besoin d'assistance",
|
|
||||||
"id": "11441",
|
|
||||||
"content": "Bonjour,\nDepuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.\nCi-joint les messages renvoyés par le logiciel.\nPouvez vous nous aider à remédier à cette situation.?\nMerci.\nCordialement.\nFOKOU TESAHA Duplex\nIngénieur de conception de\nGénie Civil et Urbain\nTel:(+237)6 94 83 97 13\n\n- Affichage onglet --Essais sur Echantillons.PNG (image/png) [ID: 32447]\n- BRG-LAB ERR1.PNG (image/png) [ID: 32445]\n- BRG-LAB ERR2.PNG (image/png) [ID: 32443]\n\n---\n\n"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author_id": "Youness BENDEQ",
|
|
||||||
"date": "04/05/2020 15:37:41",
|
|
||||||
"message_type": "E-mail",
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"id": "11446",
|
|
||||||
"content": "Pouvez-vous m'envoyer les identifiants teamviewer ? svp\n\n---\n\n"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author_id": "Duplex FOKOU TESAHA",
|
|
||||||
"date": "04/05/2020 15:38:49",
|
|
||||||
"message_type": "E-mail",
|
|
||||||
"subject": "Re: Besoin d'assistance",
|
|
||||||
"id": "11447",
|
|
||||||
"content": "FOKOU TESAHA Duplex\n<\n\n- image.png (image/png) [ID: 32449]\n\n---\n\n"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author_id": "Youness BENDEQ",
|
|
||||||
"date": "04/05/2020 16:12:50",
|
|
||||||
"message_type": "E-mail",
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"id": "11448",
|
|
||||||
"content": "Je vous laisse finir la manipulation.\nPour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.\nRelancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.\nUne fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.\nDites moi si cela a fonctionné ?\nA savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.\nJe ne pourrais vous joindre uniquement dans l'après midi.\nJ’attends votre retour par mail sur le bon fonctionnement de la manipulation.\nJe reste à votre disposition pour toute explication ou demande supplémentaire.\nL'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.\nCordialement.\nSupport Technique - CBAO\nwww.cbao.fr\n80 rue Louis Braille\n66000 PERPIGNAN\nsupport@cbao.fr\nTél : 04 68 64 15 31\nFax : 04 68 64 31 69\n\n---\n"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"date_d'extraction": "09/04/2025 11:06:31",
|
|
||||||
"répertoire": "output/ticket_T0177/T0177_20250409_110630"
|
|
||||||
}
|
|
||||||
@ -1,99 +0,0 @@
|
|||||||
# Ticket T0177: Besoin d'assistance
|
|
||||||
|
|
||||||
## Informations du ticket
|
|
||||||
|
|
||||||
- **id**: 189
|
|
||||||
- **code**: T0177
|
|
||||||
- **name**: Besoin d'assistance
|
|
||||||
- **project_name**: Demandes
|
|
||||||
- **stage_name**: Clôturé
|
|
||||||
- **user_id**:
|
|
||||||
- **partner_id/email_from**: BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA, DUPLEX FOKOU <foduplex@gmail.com>
|
|
||||||
- **create_date**: 04/05/2020 13:36:46
|
|
||||||
- **write_date/last modification**: 03/10/2024 13:10:50
|
|
||||||
|
|
||||||
- **description**:
|
|
||||||
|
|
||||||
*Aucune description fournie*
|
|
||||||
|
|
||||||
## Messages
|
|
||||||
|
|
||||||
### Message 1
|
|
||||||
**author_id**: Duplex FOKOU TESAHA
|
|
||||||
**date**: 04/05/2020 13:33:57
|
|
||||||
**message_type**: E-mail
|
|
||||||
**subject**: Besoin d'assistance
|
|
||||||
**id**: 11441
|
|
||||||
Bonjour,
|
|
||||||
Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.
|
|
||||||
Ci-joint les messages renvoyés par le logiciel.
|
|
||||||
Pouvez vous nous aider à remédier à cette situation.?
|
|
||||||
Merci.
|
|
||||||
Cordialement.
|
|
||||||
FOKOU TESAHA Duplex
|
|
||||||
Ingénieur de conception de
|
|
||||||
Génie Civil et Urbain
|
|
||||||
Tel:(+237)6 94 83 97 13
|
|
||||||
|
|
||||||
**attachment_ids**:
|
|
||||||
- Affichage onglet --Essais sur Echantillons.PNG (image/png) [ID: 32447]
|
|
||||||
- BRG-LAB ERR1.PNG (image/png) [ID: 32445]
|
|
||||||
- BRG-LAB ERR2.PNG (image/png) [ID: 32443]
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Message 2
|
|
||||||
**author_id**: Youness BENDEQ
|
|
||||||
**date**: 04/05/2020 15:37:41
|
|
||||||
**message_type**: E-mail
|
|
||||||
**subject**: Re: [T0177] Besoin d'assistance
|
|
||||||
**id**: 11446
|
|
||||||
Pouvez-vous m'envoyer les identifiants teamviewer ? svp
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Message 3
|
|
||||||
**author_id**: Duplex FOKOU TESAHA
|
|
||||||
**date**: 04/05/2020 15:38:49
|
|
||||||
**message_type**: E-mail
|
|
||||||
**subject**: Re: Besoin d'assistance
|
|
||||||
**id**: 11447
|
|
||||||
FOKOU TESAHA Duplex
|
|
||||||
<
|
|
||||||
|
|
||||||
**attachment_ids**:
|
|
||||||
- image.png (image/png) [ID: 32449]
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Message 4
|
|
||||||
**author_id**: Youness BENDEQ
|
|
||||||
**date**: 04/05/2020 16:12:50
|
|
||||||
**message_type**: E-mail
|
|
||||||
**subject**: Re: [T0177] Besoin d'assistance
|
|
||||||
**id**: 11448
|
|
||||||
Je vous laisse finir la manipulation.
|
|
||||||
Pour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.
|
|
||||||
Relancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.
|
|
||||||
Une fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.
|
|
||||||
Dites moi si cela a fonctionné ?
|
|
||||||
A savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.
|
|
||||||
Je ne pourrais vous joindre uniquement dans l'après midi.
|
|
||||||
J’attends votre retour par mail sur le bon fonctionnement de la manipulation.
|
|
||||||
Je reste à votre disposition pour toute explication ou demande supplémentaire.
|
|
||||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.
|
|
||||||
Cordialement.
|
|
||||||
Support Technique - CBAO
|
|
||||||
www.cbao.fr
|
|
||||||
80 rue Louis Braille
|
|
||||||
66000 PERPIGNAN
|
|
||||||
support@cbao.fr
|
|
||||||
Tél : 04 68 64 15 31
|
|
||||||
Fax : 04 68 64 31 69
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Informations sur l'extraction
|
|
||||||
|
|
||||||
- **Date d'extraction**: 09/04/2025 11:06:31
|
|
||||||
- **Répertoire**: output/ticket_T0177/T0177_20250409_110630
|
|
||||||
@ -1,311 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_summary": {
|
|
||||||
"id": 189,
|
|
||||||
"code": "T0177",
|
|
||||||
"name": "Besoin d'assistance",
|
|
||||||
"project_id": 3,
|
|
||||||
"project_name": "Demandes",
|
|
||||||
"stage_id": 8,
|
|
||||||
"stage_name": "Clôturé",
|
|
||||||
"date_extraction": "2025-04-09T11:06:31.303424"
|
|
||||||
},
|
|
||||||
"metadata": {
|
|
||||||
"message_count": {
|
|
||||||
"total": 11,
|
|
||||||
"processed": 7,
|
|
||||||
"excluded": 4
|
|
||||||
},
|
|
||||||
"cleaning_strategy": "standard",
|
|
||||||
"cleaning_config": {
|
|
||||||
"preserve_links": true,
|
|
||||||
"preserve_images": true,
|
|
||||||
"strategy": "html2text"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 11441,
|
|
||||||
"body": "Bonjour,\n\nDepuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.\n\nCi-joint les messages renvoyés par le logiciel.\n\nPouvez vous nous aider à remédier à cette situation.?\n\nMerci.\n\nCordialement.\n\nFOKOU TESAHA Duplex\n\nIngénieur de conception de\n Génie Civil et Urbain\n\nTel:(+237)6 94 83 97 13",
|
|
||||||
"date": "2020-05-04 13:33:57",
|
|
||||||
"author_id": [
|
|
||||||
10301,
|
|
||||||
"BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA"
|
|
||||||
],
|
|
||||||
"email_from": "DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
32447,
|
|
||||||
32445,
|
|
||||||
32443
|
|
||||||
],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<div dir=\"ltr\"><div>Bonjour,</div><div>Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.</div><div>Ci-joint les messages renvoyés par le logiciel.</div><div>Pouvez vous nous aider à remédier à cette situation.?</div><div>Merci.</div><div>Cordialement.<br></div><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div></div></div>\r\n",
|
|
||||||
"author_details": {
|
|
||||||
"name": "Duplex FOKOU TESAHA",
|
|
||||||
"email": "foduplex@gmail.com",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10301,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Ingénieur de conception de Génie Civil et Urbain",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11440,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 13:36:46",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1963,
|
|
||||||
1964,
|
|
||||||
1965,
|
|
||||||
1966,
|
|
||||||
1967
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "OdooBot",
|
|
||||||
"email": "odoobot@example.com",
|
|
||||||
"is_system": true,
|
|
||||||
"id": 2,
|
|
||||||
"phone": false,
|
|
||||||
"function": false,
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11444,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 15:17:11",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1970
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11446,
|
|
||||||
"body": "Pouvez-vous m'envoyer les identifiants teamviewer ? svp",
|
|
||||||
"date": "2020-05-04 15:37:41",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<p>Pouvez-vous m'envoyer les identifiants teamviewer ? svp</p>",
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11447,
|
|
||||||
"body": "FOKOU TESAHA Duplex\n<",
|
|
||||||
"date": "2020-05-04 15:38:49",
|
|
||||||
"author_id": [
|
|
||||||
10301,
|
|
||||||
"BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA"
|
|
||||||
],
|
|
||||||
"email_from": "DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
32449
|
|
||||||
],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": true,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<div dir=\"ltr\"><div><img src=\"/web/image/32449?access_token=4a91fb33-5a72-489f-b9fe-1dff4dd1186d\" alt=\"image.png\" width=\"298\" height=\"394\"><br><br></div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div><br></div><br><div><div dir=\"ltr\">Le lun. 4 mai 2020 à 14:33, DUPLEX FOKOU <<a href=\"mailto:foduplex@gmail.com\">foduplex@gmail.com</a>> a écrit :<br></div><blockquote style=\"margin:0px 0px 0px 0.8ex; padding-left:1ex\" data-o-mail-quote=\"1\"><div dir=\"ltr\"><div>Bonjour,</div><div>Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.</div><div>Ci-joint les messages renvoyés par le logiciel.</div><div>Pouvez vous nous aider à remédier à cette situation.?</div><div>Merci.</div><div>Cordialement.<br></div><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div></div></div>\r\n</blockquote></div>\r\n",
|
|
||||||
"author_details": {
|
|
||||||
"name": "Duplex FOKOU TESAHA",
|
|
||||||
"email": "foduplex@gmail.com",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10301,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Ingénieur de conception de Génie Civil et Urbain",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11448,
|
|
||||||
"body": "Je vous laisse finir la manipulation.\nPour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.\nRelancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.\nUne fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.\nDites moi si cela a fonctionné ?\nA savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.\nJe ne pourrais vous joindre uniquement dans l'après midi.\nJ’attends votre retour par mail sur le bon fonctionnement de la manipulation.\nJe reste à votre disposition pour toute explication ou demande supplémentaire.\nL'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.\nCordialement.\n\nSupport Technique - CBAO\nwww.cbao.fr\n80 rue Louis Braille\n66000 PERPIGNAN\nsupport@cbao.fr\nTél : 04 68 64 15 31\nFax : 04 68 64 31 69",
|
|
||||||
"date": "2020-05-04 16:12:50",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"body_original": "<p>Je vous laisse finir la manipulation.<br>Pour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.<br>Relancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.<br>Une fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.<br>Dites moi si cela a fonctionné ?<br>A savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.<br>Je ne pourrais vous joindre uniquement dans l'après midi.<br>J’attends votre retour par mail sur le bon fonctionnement de la manipulation.<br>Je reste à votre disposition pour toute explication ou demande supplémentaire.<br>L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.<br>Cordialement.<br><br>Support Technique - CBAO<br><a target=\"_blank\" href=\"http://www.cbao.fr\">www.cbao.fr</a><br>80 rue Louis Braille<br>66000 PERPIGNAN<br>support@cbao.fr<br>Tél : 04 68 64 15 31<br>Fax : 04 68 64 31 69</p>",
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11464,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-06 11:37:48",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1990,
|
|
||||||
1991
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"author_details": {
|
|
||||||
"name": "Youness BENDEQ",
|
|
||||||
"email": "youness@cbao.fr",
|
|
||||||
"is_system": false,
|
|
||||||
"id": 10288,
|
|
||||||
"phone": false,
|
|
||||||
"function": "Support technique / Chargé de clientèle",
|
|
||||||
"company_id": [
|
|
||||||
1,
|
|
||||||
"CBAO S.A.R.L."
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,110 +0,0 @@
|
|||||||
TICKET: T0177 - Besoin d'assistance
|
|
||||||
Date d'extraction: 2025-04-09 11:06:31
|
|
||||||
Nombre de messages: 7
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
DATE: 2020-05-04 13:33:57
|
|
||||||
DE: Duplex FOKOU TESAHA
|
|
||||||
OBJET: Besoin d'assistance
|
|
||||||
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.
|
|
||||||
|
|
||||||
Ci-joint les messages renvoyés par le logiciel.
|
|
||||||
|
|
||||||
Pouvez vous nous aider à remédier à cette situation.?
|
|
||||||
|
|
||||||
Merci.
|
|
||||||
|
|
||||||
Cordialement.
|
|
||||||
|
|
||||||
FOKOU TESAHA Duplex
|
|
||||||
|
|
||||||
Ingénieur de conception de
|
|
||||||
Génie Civil et Urbain
|
|
||||||
|
|
||||||
Tel:(+237)6 94 83 97 13
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-05-04 13:36:46
|
|
||||||
DE: OdooBot
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-05-04 15:17:11
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DATE: 2020-05-04 15:37:41
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
OBJET: Re: [T0177] Besoin d'assistance
|
|
||||||
|
|
||||||
Pouvez-vous m'envoyer les identifiants teamviewer ? svp
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** MESSAGE TRANSFÉRÉ ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-05-04 15:38:49
|
|
||||||
DE: Duplex FOKOU TESAHA
|
|
||||||
OBJET: Re: Besoin d'assistance
|
|
||||||
|
|
||||||
FOKOU TESAHA Duplex
|
|
||||||
<
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DATE: 2020-05-04 16:12:50
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
OBJET: Re: [T0177] Besoin d'assistance
|
|
||||||
|
|
||||||
Je vous laisse finir la manipulation.
|
|
||||||
Pour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.
|
|
||||||
Relancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.
|
|
||||||
Une fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.
|
|
||||||
Dites moi si cela a fonctionné ?
|
|
||||||
A savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.
|
|
||||||
Je ne pourrais vous joindre uniquement dans l'après midi.
|
|
||||||
J’attends votre retour par mail sur le bon fonctionnement de la manipulation.
|
|
||||||
Je reste à votre disposition pour toute explication ou demande supplémentaire.
|
|
||||||
L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.
|
|
||||||
Cordialement.
|
|
||||||
|
|
||||||
Support Technique - CBAO
|
|
||||||
www.cbao.fr
|
|
||||||
80 rue Louis Braille
|
|
||||||
66000 PERPIGNAN
|
|
||||||
support@cbao.fr
|
|
||||||
Tél : 04 68 64 15 31
|
|
||||||
Fax : 04 68 64 31 69
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
*** CHANGEMENT D'ÉTAT ***
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
DATE: 2020-05-06 11:37:48
|
|
||||||
DE: Youness BENDEQ
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 26 KiB |
@ -1,74 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": 32449,
|
|
||||||
"name": "image.png",
|
|
||||||
"mimetype": "image/png",
|
|
||||||
"file_size": 26272,
|
|
||||||
"create_date": "2020-05-04 15:41:42",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "image.png",
|
|
||||||
"res_name": "[T0177] Besoin d'assistance",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0177/T0177_20250409_110630/attachments/image.png",
|
|
||||||
"error": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 32447,
|
|
||||||
"name": "Affichage onglet --Essais sur Echantillons.PNG",
|
|
||||||
"mimetype": "image/png",
|
|
||||||
"file_size": 37031,
|
|
||||||
"create_date": "2020-05-04 13:36:46",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "Affichage onglet --Essais sur Echantillons.PNG",
|
|
||||||
"res_name": "[T0177] Besoin d'assistance",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0177/T0177_20250409_110630/attachments/Affichage_onglet_--Essais_sur_Echantillons.PNG",
|
|
||||||
"error": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 32445,
|
|
||||||
"name": "BRG-LAB ERR1.PNG",
|
|
||||||
"mimetype": "image/png",
|
|
||||||
"file_size": 12718,
|
|
||||||
"create_date": "2020-05-04 13:36:46",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "BRG-LAB ERR1.PNG",
|
|
||||||
"res_name": "[T0177] Besoin d'assistance",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0177/T0177_20250409_110630/attachments/BRG-LAB_ERR1.PNG",
|
|
||||||
"error": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 32443,
|
|
||||||
"name": "BRG-LAB ERR2.PNG",
|
|
||||||
"mimetype": "image/png",
|
|
||||||
"file_size": 5008,
|
|
||||||
"create_date": "2020-05-04 13:36:46",
|
|
||||||
"create_uid": [
|
|
||||||
1,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"description": "BRG-LAB ERR2.PNG",
|
|
||||||
"res_name": "[T0177] Besoin d'assistance",
|
|
||||||
"creator_name": "OdooBot",
|
|
||||||
"creator_id": 1,
|
|
||||||
"download_status": "success",
|
|
||||||
"local_path": "output/ticket_T0177/T0177_20250409_110630/attachments/BRG-LAB_ERR2.PNG",
|
|
||||||
"error": ""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": 11000,
|
|
||||||
"partner_id": [
|
|
||||||
4639,
|
|
||||||
"BHYGRAPH ENGINEERING, Léandre KUIATE FOTSO"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@ -1,333 +0,0 @@
|
|||||||
{
|
|
||||||
"ticket_id": 189,
|
|
||||||
"ticket_code": "T0177",
|
|
||||||
"message_metadata": {
|
|
||||||
"11441": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11442": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11443": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11440": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11444": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11445": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11446": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11447": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": true,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11448": {
|
|
||||||
"is_system": false,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
},
|
|
||||||
"11449": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": false,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false,
|
|
||||||
"excluded": "system_message"
|
|
||||||
},
|
|
||||||
"11464": {
|
|
||||||
"is_system": true,
|
|
||||||
"is_stage_change": true,
|
|
||||||
"is_forwarded": false,
|
|
||||||
"is_duplicate": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"id": 11441,
|
|
||||||
"body": "<div dir=\"ltr\"><div>Bonjour,</div><div>Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.</div><div>Ci-joint les messages renvoyés par le logiciel.</div><div>Pouvez vous nous aider à remédier à cette situation.?</div><div>Merci.</div><div>Cordialement.<br></div><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div></div></div>\r\n",
|
|
||||||
"date": "2020-05-04 13:33:57",
|
|
||||||
"author_id": [
|
|
||||||
10301,
|
|
||||||
"BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA"
|
|
||||||
],
|
|
||||||
"email_from": "DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
32447,
|
|
||||||
32445,
|
|
||||||
32443
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11442,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 13:36:46",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1968
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11443,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 13:36:46",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1969
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11440,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 13:36:46",
|
|
||||||
"author_id": [
|
|
||||||
2,
|
|
||||||
"OdooBot"
|
|
||||||
],
|
|
||||||
"email_from": "\"OdooBot\" <odoobot@example.com>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1963,
|
|
||||||
1964,
|
|
||||||
1965,
|
|
||||||
1966,
|
|
||||||
1967
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11444,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 15:17:11",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
16,
|
|
||||||
"Task Created"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1970
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11445,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 15:18:33",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": false,
|
|
||||||
"subtype_id": [
|
|
||||||
2,
|
|
||||||
"Note"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1971
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11446,
|
|
||||||
"body": "<p>Pouvez-vous m'envoyer les identifiants teamviewer ? svp</p>",
|
|
||||||
"date": "2020-05-04 15:37:41",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11447,
|
|
||||||
"body": "<div dir=\"ltr\"><div><img src=\"/web/image/32449?access_token=4a91fb33-5a72-489f-b9fe-1dff4dd1186d\" alt=\"image.png\" width=\"298\" height=\"394\"><br><br></div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div><br></div><br><div><div dir=\"ltr\">Le lun. 4 mai 2020 à 14:33, DUPLEX FOKOU <<a href=\"mailto:foduplex@gmail.com\">foduplex@gmail.com</a>> a écrit :<br></div><blockquote style=\"margin:0px 0px 0px 0.8ex; padding-left:1ex\" data-o-mail-quote=\"1\"><div dir=\"ltr\"><div>Bonjour,</div><div>Depuis ce matin je n’arrive pas à accéder aux essais sur echantillons sur BRG-LAB.</div><div>Ci-joint les messages renvoyés par le logiciel.</div><div>Pouvez vous nous aider à remédier à cette situation.?</div><div>Merci.</div><div>Cordialement.<br></div><div><font style=\"font-weight:bold\" size=\"1\">FOKOU TESAHA Duplex</font><font style=\"font-weight:bold\" size=\"1\"><br></font></div><div><div><div dir=\"ltr\"><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><div dir=\"ltr\"><div><font size=\"1\">Ingénieur de conception de<br> Génie Civil et Urbain<br></font></div><font size=\"1\"><font>Tel:(+237)6 94 83 97 13</font></font><br></div></div></div></div></div></div></div></div></div></div></div></div></div>\r\n</blockquote></div>\r\n",
|
|
||||||
"date": "2020-05-04 15:38:49",
|
|
||||||
"author_id": [
|
|
||||||
10301,
|
|
||||||
"BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA"
|
|
||||||
],
|
|
||||||
"email_from": "DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"message_type": "email",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": [
|
|
||||||
32449
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11448,
|
|
||||||
"body": "<p>Je vous laisse finir la manipulation.<br>Pour cela vous devez lancer BRG-LAB et faire toutes les mises à jour qu'il vous indiquera.<br>Relancer le logiciel plusieurs fois si nécessaire jusqu'à ce que vous puissiez vous connecter.<br>Une fois connecté vous devriez voir réapparaître vos échantillons dans la liste des échantillons en cours de traitement dans le laboratoire.<br>Dites moi si cela a fonctionné ?<br>A savoir, je suis en formation demain matin de 9h à 12h30 (heure française) et ne serait donc pas disponible pour vous assister en cas d’échec de cette manipulation.<br>Je ne pourrais vous joindre uniquement dans l'après midi.<br>J’attends votre retour par mail sur le bon fonctionnement de la manipulation.<br>Je reste à votre disposition pour toute explication ou demande supplémentaire.<br>L'objectif du Support Technique est de vous aider : n'hésitez jamais à nous contacter si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes.<br>Cordialement.<br><br>Support Technique - CBAO<br><a target=\"_blank\" href=\"http://www.cbao.fr\">www.cbao.fr</a><br>80 rue Louis Braille<br>66000 PERPIGNAN<br>support@cbao.fr<br>Tél : 04 68 64 15 31<br>Fax : 04 68 64 31 69</p>",
|
|
||||||
"date": "2020-05-04 16:12:50",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "comment",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
1,
|
|
||||||
"Discussions"
|
|
||||||
],
|
|
||||||
"subject": "Re: [T0177] Besoin d'assistance",
|
|
||||||
"tracking_value_ids": [],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11449,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-04 16:14:31",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
18,
|
|
||||||
"Task Ready"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1972
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 11464,
|
|
||||||
"body": "",
|
|
||||||
"date": "2020-05-06 11:37:48",
|
|
||||||
"author_id": [
|
|
||||||
10288,
|
|
||||||
"CBAO S.A.R.L., Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"email_from": "\"Youness BENDEQ\" <youness.bendeq@cbao.fr>",
|
|
||||||
"message_type": "notification",
|
|
||||||
"parent_id": [
|
|
||||||
11440,
|
|
||||||
"[T0177] Besoin d'assistance"
|
|
||||||
],
|
|
||||||
"subtype_id": [
|
|
||||||
19,
|
|
||||||
"Stage Changed"
|
|
||||||
],
|
|
||||||
"subject": false,
|
|
||||||
"tracking_value_ids": [
|
|
||||||
1990,
|
|
||||||
1991
|
|
||||||
],
|
|
||||||
"attachment_ids": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 189,
|
|
||||||
"name": "Besoin d'assistance",
|
|
||||||
"description": "<p><br></p>",
|
|
||||||
"stage_id": [
|
|
||||||
8,
|
|
||||||
"Clôturé"
|
|
||||||
],
|
|
||||||
"project_id": [
|
|
||||||
3,
|
|
||||||
"Demandes"
|
|
||||||
],
|
|
||||||
"partner_id": [
|
|
||||||
10301,
|
|
||||||
"BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA"
|
|
||||||
],
|
|
||||||
"user_id": [
|
|
||||||
9,
|
|
||||||
"Youness BENDEQ"
|
|
||||||
],
|
|
||||||
"date_start": "2020-05-04 13:36:46",
|
|
||||||
"date_end": false,
|
|
||||||
"date_deadline": false,
|
|
||||||
"create_date": "2020-05-04 13:36:46",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"tag_ids": [
|
|
||||||
14
|
|
||||||
],
|
|
||||||
"priority": "0",
|
|
||||||
"email_from": "DUPLEX FOKOU <foduplex@gmail.com>",
|
|
||||||
"email_cc": "Léandre BHYGRAPH <l.kuiate@bhygraph.com>",
|
|
||||||
"message_ids": [
|
|
||||||
11464,
|
|
||||||
11449,
|
|
||||||
11448,
|
|
||||||
11447,
|
|
||||||
11446,
|
|
||||||
11445,
|
|
||||||
11444,
|
|
||||||
11443,
|
|
||||||
11442,
|
|
||||||
11441,
|
|
||||||
11440
|
|
||||||
],
|
|
||||||
"message_follower_ids": [
|
|
||||||
11000
|
|
||||||
],
|
|
||||||
"timesheet_ids": [
|
|
||||||
56
|
|
||||||
],
|
|
||||||
"attachment_ids": [],
|
|
||||||
"stage_id_name": "Clôturé",
|
|
||||||
"project_id_name": "Demandes",
|
|
||||||
"partner_id_name": "BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA",
|
|
||||||
"user_id_name": "Youness BENDEQ",
|
|
||||||
"tag_names": [
|
|
||||||
"BRG-LAB WIN"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"id": 189,
|
|
||||||
"code": "T0177",
|
|
||||||
"name": "Besoin d'assistance",
|
|
||||||
"description": "<p><br></p>",
|
|
||||||
"stage": "Clôturé",
|
|
||||||
"project": "Demandes",
|
|
||||||
"partner": "BHYGRAPH ENGINEERING, Duplex FOKOU TESAHA",
|
|
||||||
"assigned_to": "Youness BENDEQ",
|
|
||||||
"tags": [
|
|
||||||
"BRG-LAB WIN"
|
|
||||||
],
|
|
||||||
"create_date": "2020-05-04 13:36:46",
|
|
||||||
"write_date": "2024-10-03 13:10:50",
|
|
||||||
"deadline": false
|
|
||||||
}
|
|
||||||
@ -0,0 +1,235 @@
|
|||||||
|
# Rapport d'analyse: T9656
|
||||||
|
|
||||||
|
## Résumé du problème
|
||||||
|
|
||||||
|
**Nom de la demande:** Gestion des utilisateurs
|
||||||
|
|
||||||
|
**Description du problème:**
|
||||||
|
Le client, Christophe SAUVAGET de CHAUSSON MATERIAUX, signale que dans le menu "Mes paramètres - Gestion des utilisateurs", tous les utilisateurs n'apparaissent pas. Il demande comment faire pour afficher tous les utilisateurs. Le problème n'est pas bloquant et concerne tous les laboratoires.
|
||||||
|
|
||||||
|
## Chronologie des échanges
|
||||||
|
|
||||||
|
| Date | Émetteur | Type | Contenu |
|
||||||
|
| ---- | -------- | ---- | ------- |
|
||||||
|
| 04/07/2024 13:03:58 | CLIENT | Question | Dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre? |
|
||||||
|
| 04/07/2024 13:03:58 | SUPPORT | Réponse | Si un utilisateur n'apparaît pas dans la liste, c'est probablement parce qu'il n'a pas de laboratoire principal assigné. Pour voir ces utilisateurs, cocher la case 'Affiche les laboratoires secondaires'. Utiliser les filtres sur les colonnes pour retrouver l'utilisateur et l'éditer. Vérifier sur la fiche de l'utilisateur si le laboratoire principal est présent et l'ajouter si nécessaire. Un utilisateur peut également ne pas apparaître si son compte a été dévalidé. Pour voir ces utilisateurs, cocher la case 'Affiche les utilisateurs non valides'. Pour rendre un compte valide, éditer le compte de l'utilisateur et cocher la case 'Utilisateur valide'. |
|
||||||
|
|
||||||
|
## Analyse des images
|
||||||
|
|
||||||
|
### image.png
|
||||||
|
|
||||||
|
### Analyse d'image
|
||||||
|
|
||||||
|
#### 1. Description objective:
|
||||||
|
L'image montre une interface de gestion des utilisateurs dans un logiciel. L'interface est intitulée "Mes paramètres - Gestion des utilisateurs". Elle comprend des sections pour la connexion et des options pour gérer les utilisateurs. Une case à cocher intitulée "Utilisateur valide" est mise en évidence en rouge.
|
||||||
|
|
||||||
|
#### 2. Éléments techniques clés:
|
||||||
|
- **Titre de l'interface:** "Mes paramètres - Gestion des utilisateurs"
|
||||||
|
- **Sections visibles:**
|
||||||
|
- Connexion: avec des champs pour "Login" et "Mot de passe"
|
||||||
|
- Options de gestion des utilisateurs: avec une case à cocher "Utilisateur valide"
|
||||||
|
- **Langue:** Sélecteur de langue avec "Français" sélectionné
|
||||||
|
- **Bouton:** "OBTENIR L'APPLICATION BRG-LAB MOBILE"
|
||||||
|
|
||||||
|
#### 3. Relation avec le problème:
|
||||||
|
L'image se rapporte au problème décrit dans le ticket de support concernant l'affichage de tous les utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs". La case à cocher "Utilisateur valide" est pertinente car elle permet de filtrer les utilisateurs valides ou non valides, ce qui pourrait expliquer pourquoi certains utilisateurs n'apparaissent pas dans la liste.
|
||||||
|
|
||||||
|
### image_2.png
|
||||||
|
|
||||||
|
### Analyse d'image
|
||||||
|
|
||||||
|
#### 1. Description objective:
|
||||||
|
L'image montre une interface de gestion des utilisateurs dans un logiciel de gestion de laboratoire. L'interface est intitulée "Mes paramètres - Gestion des utilisateurs". Elle présente plusieurs options pour filtrer et afficher les utilisateurs. Les sections principales de l'interface sont "NOUVEAU", "MODIFIER", "SUPPRIMER", et "Affiche les laboratoires secondaires". Il y a également une option pour "Affiche les utilisateurs non valides". Les utilisateurs listés incluent "CHAUSSON MATERIAUX: CAMBOUNET", "CHAUSSON MATERIAUX: CAVAILLO", et "CHAUSSON MATERIAUX: CATZFES SUR".
|
||||||
|
|
||||||
|
#### 2. Éléments techniques clés:
|
||||||
|
- **Options de gestion des utilisateurs:**
|
||||||
|
- "NOUVEAU"
|
||||||
|
- "MODIFIER"
|
||||||
|
- "SUPPRIMER"
|
||||||
|
- "Affiche les laboratoires secondaires"
|
||||||
|
- "Affiche les utilisateurs non valides"
|
||||||
|
- **Utilisateurs listés:**
|
||||||
|
- "CHAUSSON MATERIAUX: CAMBOUNET"
|
||||||
|
- "CHAUSSON MATERIAUX: CAVAILLO"
|
||||||
|
- "CHAUSSON MATERIAUX: CATZFES SUR"
|
||||||
|
- **Paramètres visibles:**
|
||||||
|
- "Laboratoire"
|
||||||
|
- "Login"
|
||||||
|
- "Nom"
|
||||||
|
- "Formulation de béton, ingénieur, responsable national, Opérateur"
|
||||||
|
- **Messages du système:**
|
||||||
|
- "Formulation de béton, ingénieur, responsable national, Opérateur"
|
||||||
|
- "Formulation de béton, ingénieur, responsable national, Opérateur"
|
||||||
|
|
||||||
|
#### 3. Relation avec le problème:
|
||||||
|
L'image se rapporte au problème décrit dans le ticket de support, où le client signale que tous les utilisateurs n'apparaissent pas dans le menu "Mes paramètres - Gestion des utilisateurs". L'interface montre des options pour afficher les utilisateurs secondaires et les utilisateurs non valides, ce qui est directement lié au problème signalé par le client. Les utilisateurs listés dans l'image correspondent aux utilisateurs mentionnés par le client dans le ticket de support.
|
||||||
|
|
||||||
|
### image_1.png
|
||||||
|
|
||||||
|
### Analyse de l'image
|
||||||
|
|
||||||
|
#### 1. Description objective:
|
||||||
|
L'image montre une interface utilisateur d'un logiciel de gestion de laboratoire. Elle présente une section intitulée "Affectation de l'utilisateur". Cette section inclut des informations sur les laboratoires principaux et secondaires ainsi que des utilisateurs associés. Les zones d'intérêt sont encadrées en rouge.
|
||||||
|
|
||||||
|
#### 2. Éléments techniques clés:
|
||||||
|
- **Titre de la section:** "Affectation de l'utilisateur"
|
||||||
|
- **Laboratoire principal:** "CHAUSSON MATERIAUX - CAMBOUNET SUR LE SOR"
|
||||||
|
- **Laboratoires de l'utilisateur:** "Laboratoires de l'utilisateur"
|
||||||
|
- **Laboratoire principal:** "CHAUSSON MATERIAUX"
|
||||||
|
- **Laboratoire secondaire:** "CAMBOUNET SUR LE SOR"
|
||||||
|
- **Statut:** "Supprimé"
|
||||||
|
|
||||||
|
#### 3. Relation avec le problème:
|
||||||
|
L'image se rapporte au problème décrit dans le ticket de support concernant l'affichage des utilisateurs dans le menu "Mes paramètres - Gestion des utilisateurs". Elle montre spécifiquement comment les utilisateurs peuvent être affectés à différents laboratoires et comment leur statut peut être géré. Les informations visibles dans l'image peuvent aider à comprendre pourquoi certains utilisateurs n'apparaissent pas dans la liste, notamment si leur statut est "Supprimé" ou s'ils n'ont pas de laboratoire principal assigné.
|
||||||
|
|
||||||
|
## Diagnostic technique
|
||||||
|
|
||||||
|
Résumé du problème
|
||||||
|
|
||||||
|
**Nom de la demande:** Gestion des utilisateurs
|
||||||
|
|
||||||
|
**Description du problème:**
|
||||||
|
Le client, Christophe SAUVAGET de CHAUSSON MATERIAUX, signale que dans le menu "Mes paramètres - Gestion des utilisateurs", tous les utilisateurs n'apparaissent pas. Il demande comment faire pour afficher tous les utilisateurs. Le problème n'est pas bloquant et concerne tous les laboratoires.
|
||||||
|
|
||||||
|
## Tableau récapitulatif des échanges
|
||||||
|
|
||||||
|
| Date | De | À | Objet | Résumé |
|
||||||
|
|------|----|----|-------|--------|
|
||||||
|
| 2024-07-04 12:09:47 | [30810, 'Support Robot'] | | False | |
|
||||||
|
| 2024-07-04 12:42:43 | [28961, 'Fabien LAFAY'] | | False | |
|
||||||
|
| 2024-07-04 13:03:58 | [28961, 'Fabien LAFAY'] | | Re: [T9656] - Gestion des utilisateurs | |
|
||||||
|
| 2024-07-04 13:04:01 | [28961, 'Fabien LAFAY'] | | False | |
|
||||||
|
| 2024-07-04 13:04:02 | [28961, 'Fabien LAFAY'] | | False | |
|
||||||
|
| 2024-07-04 13:04:02 | [28961, 'Fabien LAFAY'] | | False | |
|
||||||
|
| 2024-07-19 08:00:10 | [28961, 'Fabien LAFAY'] | | False | |
|
||||||
|
|
||||||
|
## Métadonnées
|
||||||
|
|
||||||
|
- **Date de génération**: 2025-04-09 16:10:18
|
||||||
|
- **Modèle utilisé**: mistral-large-latest
|
||||||
|
- **Images analysées**: 3/3
|
||||||
|
- **Temps de génération**: 48.10 secondes
|
||||||
|
|
||||||
|
## Détails des analyses
|
||||||
|
|
||||||
|
Toutes les analyses requises ont été effectuées avec succès.
|
||||||
|
|
||||||
|
- **Analyse des images**: PRÉSENT
|
||||||
|
- **Analyse du ticket**: PRÉSENT
|
||||||
|
- **Diagnostic**: PRÉSENT
|
||||||
|
|
||||||
|
## Paramètres des agents et prompts
|
||||||
|
|
||||||
|
### AgentTicketAnalyser
|
||||||
|
|
||||||
|
- **Prompt**:
|
||||||
|
```
|
||||||
|
Tu es un expert en analyse de tickets pour le support informatique de BRG-Lab.
|
||||||
|
Ton rôle est d'extraire et d'analyser les informations importantes des tickets.
|
||||||
|
|
||||||
|
Ta mission principale:
|
||||||
|
1. Mettre en perspective le NOM DE LA DEMANDE qui contient souvent le problème soulevé par le client
|
||||||
|
2. Analyser la DESCRIPTION du problème qui ajoute du contexte
|
||||||
|
3. Établir une chronologie claire des échanges client/support en identifiant précisément:
|
||||||
|
- Il eut y avoir une discussion dans le même message
|
||||||
|
- Ne tient pas compte des bas de page, des adresses ou des coordonnées des personnes si ce n'est pas pertinent
|
||||||
|
- Les questions posées par le client
|
||||||
|
- Les réponses fournies par le support
|
||||||
|
- Les informations techniques fournies par chaque partie
|
||||||
|
- Il peut y avoir des messages qui contiennent des questions et des réponses
|
||||||
|
- Si une référence à une norme ou autre élément technique est faite, note la dans la réponse
|
||||||
|
|
||||||
|
Sois factuel et reste dans une démarche technique. Ton analyse sera utilisée comme contexte pour l'analyse des images pertinentes.
|
||||||
|
|
||||||
|
Structure ta réponse:
|
||||||
|
1. Analyse du problème initial (nom de la demande + description)
|
||||||
|
2. Informations techniques essentielles (logiciels, versions, configurations)
|
||||||
|
3. Chronologie des échanges client/support avec identification claire des questions/réponses
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### AgentImageSorter
|
||||||
|
|
||||||
|
|
||||||
|
- **Prompt**:
|
||||||
|
```
|
||||||
|
Tu es un expert en tri d'images pour le support technique de BRG_Lab pour la société CBAO.
|
||||||
|
Ta mission est de déterminer si une image est pertinente pour le support technique de logiciels.
|
||||||
|
|
||||||
|
Images PERTINENTES (réponds "oui" ou "pertinent"):
|
||||||
|
- Captures d'écran de logiciels ou d'interfaces
|
||||||
|
- logo BRG_LAB
|
||||||
|
- Référence à "logociel"
|
||||||
|
- Messages d'erreur
|
||||||
|
- Configurations système
|
||||||
|
- Tableaux de bord ou graphiques techniques
|
||||||
|
- Fenêtres de diagnostic
|
||||||
|
|
||||||
|
Images NON PERTINENTES (réponds "non" ou "non pertinent"):
|
||||||
|
- Photos personnelles
|
||||||
|
- Images marketing/promotionnelles
|
||||||
|
- Logos ou images de marque
|
||||||
|
- Paysages, personnes ou objets non liés à l'informatique
|
||||||
|
|
||||||
|
|
||||||
|
IMPORTANT: Ne commence JAMAIS ta réponse par "Je ne peux pas directement visualiser l'image".
|
||||||
|
Si tu ne peux pas analyser l'image, réponds simplement "ERREUR: Impossible d'analyser l'image".
|
||||||
|
|
||||||
|
Analyse d'abord ce que montre l'image, puis réponds par "oui"/"pertinent" ou "non"/"non pertinent".
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### AgentImageAnalyser
|
||||||
|
|
||||||
|
|
||||||
|
- **Prompt**:
|
||||||
|
```
|
||||||
|
Tu es un expert en analyse d'images pour le support technique de BRG-Lab.
|
||||||
|
Ta mission est d'analyser des captures d'écran en lien avec le contexte du ticket de support.
|
||||||
|
|
||||||
|
Structure ton analyse d'image de façon factuelle:
|
||||||
|
|
||||||
|
1. Description objective: Ce que montre l'image (interface, message d'erreur, code, etc.)
|
||||||
|
2. Éléments techniques clés: Versions, codes d'erreur, paramètres visibles, messages du système
|
||||||
|
3. Relation avec le problème: Comment cette image se rapporte au problème décrit
|
||||||
|
|
||||||
|
IMPORTANT:
|
||||||
|
- Ne fais PAS d'interprétation complexe ou de diagnostic
|
||||||
|
- Ne propose PAS de solutions ou recommandations
|
||||||
|
- Reste strictement factuel et objectif dans ta description
|
||||||
|
- Concentre-toi uniquement sur ce qui est visible dans l'image
|
||||||
|
- Cite les textes exacts visibles dans l'image (messages d'erreur, etc.)
|
||||||
|
- Certains client ou support peuvent mettre en évidence des sections de l'image en encadrant ou entourant les zones d'intérêt eu rouge.
|
||||||
|
|
||||||
|
|
||||||
|
Ton analyse sera utilisée comme élément factuel pour un rapport technique plus complet.
|
||||||
|
```
|
||||||
|
|
||||||
|
### AgentReportGenerator
|
||||||
|
|
||||||
|
- **Modèle utilisé**: mistral-large-latest
|
||||||
|
- **Température**: 0.2
|
||||||
|
- **Top_p**: 0.9
|
||||||
|
- **Max_tokens**: 2500
|
||||||
|
- **Version du prompt**: v2.2
|
||||||
|
|
||||||
|
## Workflow de traitement
|
||||||
|
|
||||||
|
### Étapes de traitement
|
||||||
|
|
||||||
|
1. **Analyse du ticket** - AgentTicketAnalyser
|
||||||
|
- Extraction et analyse des informations du ticket
|
||||||
|
|
||||||
|
2. **Tri des images** - AgentImageSorter
|
||||||
|
- Identification des images pertinentes pour l'analyse
|
||||||
|
|
||||||
|
3. **Analyse des images** - AgentImageAnalyser
|
||||||
|
- Analyse détaillée des images pertinentes identifiées
|
||||||
|
|
||||||
|
4. **Génération du rapport** - AgentReportGenerator
|
||||||
|
- Synthèse des analyses et génération du rapport final
|
||||||
|
|
||||||
|
### Statistiques
|
||||||
|
- **Images totales**: 3
|
||||||
|
- **Images pertinentes**: 3
|
||||||
|
- **Temps de génération**: 48.100649 secondes
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"id": "9635",
|
||||||
|
"code": "T9656",
|
||||||
|
"name": "Gestion des utilisateurs",
|
||||||
|
"description": "Point particulier :- Multi laboratoire :tous\n- Le cas n'est pas bloquant\nDescription du problème :\nBonjour,\n\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\nMerci.",
|
||||||
|
"project_name": "Demandes",
|
||||||
|
"stage_name": "Clôturé",
|
||||||
|
"user_id": "",
|
||||||
|
"partner_id_email_from": "CHAUSSON MATERIAUX, Christophe SAUVAGET, christophe.sauvaget@chausson.fr",
|
||||||
|
"create_date": "04/07/2024 12:09:47",
|
||||||
|
"write_date_last_modification": "03/10/2024 13:10:50",
|
||||||
|
"date_deadline": "19/07/2024 00:00:00",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"author_id": "Fabien LAFAY",
|
||||||
|
"date": "04/07/2024 13:03:58",
|
||||||
|
"message_type": "E-mail",
|
||||||
|
"subject": "Re: [T9656] - Gestion des utilisateurs",
|
||||||
|
"id": "191104",
|
||||||
|
"content": "Bonjour,\nSi un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.\nDans ce cas, il faut cocher la case \"Affiche les laboratoires secondaires\" pour le voir.\nVous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.\nSur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.\nUn utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.\nDans ce cas cochez la case \"Affiche les utilisateurs non valides\" pour le voir apparaitre dans la liste (en grisé).\nVous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case \"Utilisateur valide\"\nJe reste à votre entière disposition pour toute information complémentaire.\nCordialement,\nPour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :\nManuel d'utilisation : lien vers le manuel d'utilisation\nFAQ : lien vers la FAQ\n---\nSupport technique\nL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.\n*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*\n\n- image.png (image/png) [ID: 129046]\n- image.png (image/png) [ID: 129044]\n- image.png (image/png) [ID: 129042]\n\n---\n"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"date_d'extraction": "09/04/2025 16:08:25",
|
||||||
|
"répertoire": "output/ticket_T9656/T9656_20250409_160824"
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
# Ticket T9656: Gestion des utilisateurs
|
||||||
|
|
||||||
|
## Informations du ticket
|
||||||
|
|
||||||
|
- **id**: 9635
|
||||||
|
- **code**: T9656
|
||||||
|
- **name**: Gestion des utilisateurs
|
||||||
|
- **project_name**: Demandes
|
||||||
|
- **stage_name**: Clôturé
|
||||||
|
- **user_id**:
|
||||||
|
- **partner_id/email_from**: CHAUSSON MATERIAUX, Christophe SAUVAGET, christophe.sauvaget@chausson.fr
|
||||||
|
- **create_date**: 04/07/2024 12:09:47
|
||||||
|
- **write_date/last modification**: 03/10/2024 13:10:50
|
||||||
|
- **date_deadline**: 19/07/2024 00:00:00
|
||||||
|
|
||||||
|
- **description**:
|
||||||
|
|
||||||
|
Point particulier :- Multi laboratoire :tous
|
||||||
|
- Le cas n'est pas bloquant
|
||||||
|
Description du problème :
|
||||||
|
Bonjour,
|
||||||
|
|
||||||
|
Dans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?
|
||||||
|
Merci.
|
||||||
|
|
||||||
|
## Messages
|
||||||
|
|
||||||
|
### Message 1
|
||||||
|
**author_id**: Fabien LAFAY
|
||||||
|
**date**: 04/07/2024 13:03:58
|
||||||
|
**message_type**: E-mail
|
||||||
|
**subject**: Re: [T9656] - Gestion des utilisateurs
|
||||||
|
**id**: 191104
|
||||||
|
Bonjour,
|
||||||
|
Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||||
|
Dans ce cas, il faut cocher la case "Affiche les laboratoires secondaires" pour le voir.
|
||||||
|
Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.
|
||||||
|
Sur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||||
|
Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.
|
||||||
|
Dans ce cas cochez la case "Affiche les utilisateurs non valides" pour le voir apparaitre dans la liste (en grisé).
|
||||||
|
Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case "Utilisateur valide"
|
||||||
|
Je reste à votre entière disposition pour toute information complémentaire.
|
||||||
|
Cordialement,
|
||||||
|
Pour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :
|
||||||
|
Manuel d'utilisation : lien vers le manuel d'utilisation
|
||||||
|
FAQ : lien vers la FAQ
|
||||||
|
---
|
||||||
|
Support technique
|
||||||
|
L'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.
|
||||||
|
*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*
|
||||||
|
|
||||||
|
**attachment_ids**:
|
||||||
|
- image.png (image/png) [ID: 129046]
|
||||||
|
- image.png (image/png) [ID: 129044]
|
||||||
|
- image.png (image/png) [ID: 129042]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Informations sur l'extraction
|
||||||
|
|
||||||
|
- **Date d'extraction**: 09/04/2025 16:08:25
|
||||||
|
- **Répertoire**: output/ticket_T9656/T9656_20250409_160824
|
||||||
232
output/ticket_T9656/T9656_20250409_160824/all_messages.json
Normal file
95
output/ticket_T9656/T9656_20250409_160824/all_messages.txt
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
TICKET: T9656 - Gestion des utilisateurs
|
||||||
|
Date d'extraction: 2025-04-09 16:08:25
|
||||||
|
Nombre de messages: 5
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
*** CHANGEMENT D'ÉTAT ***
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
DATE: 2024-07-04 12:09:47
|
||||||
|
DE: Support Robot
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
*** CHANGEMENT D'ÉTAT ***
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
DATE: 2024-07-04 12:42:43
|
||||||
|
DE: Fabien LAFAY
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
*** MESSAGE TRANSFÉRÉ ***
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
DATE: 2024-07-04 13:03:58
|
||||||
|
DE: Fabien LAFAY
|
||||||
|
OBJET: Re: [T9656] - Gestion des utilisateurs
|
||||||
|
|
||||||
|
Bonjour,
|
||||||
|
|
||||||
|
Si un utilisateur n'apparait pas dans la liste, c'est probablement car il n'a pas de laboratoire principal d'assigné.
|
||||||
|
|
||||||
|
Dans ce cas, il faut cocher la case "Affiche les laboratoires secondaires" pour le voir.
|
||||||
|
|
||||||
|
Vous pouvez ensuite retrouver l'utilisateur dans la liste (en utilisant les filtre sur les colonnes si besoin) et l'éditer.
|
||||||
|
|
||||||
|
Sur la fiche de l'utilisateur, vérifier si le laboratoire principal est présent, et ajoutez-le si ce n'est pas le cas.
|
||||||
|
|
||||||
|
Un utilisateur peut également ne pas apparaitre dans la liste si son compte a été dévalidé.
|
||||||
|
Dans ce cas cochez la case "Affiche les utilisateurs non valides" pour le voir apparaitre dans la liste (en grisé).
|
||||||
|
|
||||||
|
Vous pouvez le rendre à nouveau valide en éditant son compte et en cochant la case "Utilisateur valide"
|
||||||
|
|
||||||
|
Je reste à votre entière disposition pour toute information complémentaire.
|
||||||
|
|
||||||
|
Cordialement,
|
||||||
|
|
||||||
|
Pour vous accompagner au mieux, veuillez trouver ci-joint des liens d'aide :
|
||||||
|
|
||||||
|
Manuel d'utilisation : lien vers le manuel d'utilisation
|
||||||
|
|
||||||
|
FAQ : lien vers la FAQ
|
||||||
|
---
|
||||||
|
|
||||||
|
Support technique
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
L'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.
|
||||||
|
|
||||||
|
*Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci d’en avertir immédiatement l’expéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit.*
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
*** CHANGEMENT D'ÉTAT ***
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
DATE: 2024-07-04 13:04:02
|
||||||
|
DE: Fabien LAFAY
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
*** CHANGEMENT D'ÉTAT ***
|
||||||
|
********************************************************************************
|
||||||
|
|
||||||
|
DATE: 2024-07-19 08:00:10
|
||||||
|
DE: Fabien LAFAY
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
BIN
output/ticket_T9656/T9656_20250409_160824/attachments/image.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 45 KiB |
@ -0,0 +1,56 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 129046,
|
||||||
|
"name": "image.png",
|
||||||
|
"mimetype": "image/png",
|
||||||
|
"file_size": 44511,
|
||||||
|
"create_date": "2024-07-04 13:03:58",
|
||||||
|
"create_uid": [
|
||||||
|
22,
|
||||||
|
"Fabien LAFAY"
|
||||||
|
],
|
||||||
|
"description": false,
|
||||||
|
"res_name": "[T9656] Gestion des utilisateurs",
|
||||||
|
"creator_name": "Fabien LAFAY",
|
||||||
|
"creator_id": 22,
|
||||||
|
"download_status": "success",
|
||||||
|
"local_path": "output/ticket_T9656/T9656_20250409_160824/attachments/image.png",
|
||||||
|
"error": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 129044,
|
||||||
|
"name": "image.png",
|
||||||
|
"mimetype": "image/png",
|
||||||
|
"file_size": 25583,
|
||||||
|
"create_date": "2024-07-04 13:03:58",
|
||||||
|
"create_uid": [
|
||||||
|
22,
|
||||||
|
"Fabien LAFAY"
|
||||||
|
],
|
||||||
|
"description": false,
|
||||||
|
"res_name": "[T9656] Gestion des utilisateurs",
|
||||||
|
"creator_name": "Fabien LAFAY",
|
||||||
|
"creator_id": 22,
|
||||||
|
"download_status": "success",
|
||||||
|
"local_path": "output/ticket_T9656/T9656_20250409_160824/attachments/image_1.png",
|
||||||
|
"error": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 129042,
|
||||||
|
"name": "image.png",
|
||||||
|
"mimetype": "image/png",
|
||||||
|
"file_size": 46468,
|
||||||
|
"create_date": "2024-07-04 13:03:58",
|
||||||
|
"create_uid": [
|
||||||
|
22,
|
||||||
|
"Fabien LAFAY"
|
||||||
|
],
|
||||||
|
"description": false,
|
||||||
|
"res_name": "[T9656] Gestion des utilisateurs",
|
||||||
|
"creator_name": "Fabien LAFAY",
|
||||||
|
"creator_id": 22,
|
||||||
|
"download_status": "success",
|
||||||
|
"local_path": "output/ticket_T9656/T9656_20250409_160824/attachments/image_2.png",
|
||||||
|
"error": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
16
output/ticket_T9656/T9656_20250409_160824/followers.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 76486,
|
||||||
|
"partner_id": [
|
||||||
|
28961,
|
||||||
|
"Fabien LAFAY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 76493,
|
||||||
|
"partner_id": [
|
||||||
|
29511,
|
||||||
|
"CHAUSSON MATERIAUX, Christophe SAUVAGET"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
218
output/ticket_T9656/T9656_20250409_160824/messages_raw.json
Normal file
@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"date_extraction": "2025-04-09T11:06:31.420261",
|
"date_extraction": "2025-04-09T16:08:25.201746",
|
||||||
"ticket_id": 189,
|
"ticket_id": 9635,
|
||||||
"ticket_code": "T0177",
|
"ticket_code": "T9656",
|
||||||
"ticket_name": "Besoin d'assistance",
|
"ticket_name": "Gestion des utilisateurs",
|
||||||
"output_dir": "output/ticket_T0177/T0177_20250409_110630",
|
"output_dir": "output/ticket_T9656/T9656_20250409_160824",
|
||||||
"files": {
|
"files": {
|
||||||
"ticket_info": "ticket_info.json",
|
"ticket_info": "ticket_info.json",
|
||||||
"ticket_summary": "ticket_summary.json",
|
"ticket_summary": "ticket_summary.json",
|
||||||
@ -14,7 +14,7 @@
|
|||||||
"followers": "followers.json"
|
"followers": "followers.json"
|
||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"messages_count": 7,
|
"messages_count": 5,
|
||||||
"attachments_count": 4
|
"attachments_count": 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
54
output/ticket_T9656/T9656_20250409_160824/ticket_info.json
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"id": 9635,
|
||||||
|
"name": "Gestion des utilisateurs",
|
||||||
|
"description": "<h1>Point particulier :</h1><ul><li>Multi laboratoire :tous</li><li>Le cas n'est pas bloquant</li></ul><h1>Description du problème :</h1><p>Bonjour,\r\n\r\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\r\nMerci.</p>",
|
||||||
|
"stage_id": [
|
||||||
|
8,
|
||||||
|
"Clôturé"
|
||||||
|
],
|
||||||
|
"project_id": [
|
||||||
|
3,
|
||||||
|
"Demandes"
|
||||||
|
],
|
||||||
|
"partner_id": [
|
||||||
|
29511,
|
||||||
|
"CHAUSSON MATERIAUX, Christophe SAUVAGET"
|
||||||
|
],
|
||||||
|
"user_id": [
|
||||||
|
22,
|
||||||
|
"Fabien LAFAY"
|
||||||
|
],
|
||||||
|
"date_start": "2024-07-04 12:09:47",
|
||||||
|
"date_end": false,
|
||||||
|
"date_deadline": "2024-07-19",
|
||||||
|
"create_date": "2024-07-04 12:09:47",
|
||||||
|
"write_date": "2024-10-03 13:10:50",
|
||||||
|
"tag_ids": [
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"priority": "1",
|
||||||
|
"email_from": "christophe.sauvaget@chausson.fr",
|
||||||
|
"email_cc": "",
|
||||||
|
"message_ids": [
|
||||||
|
193689,
|
||||||
|
191107,
|
||||||
|
191106,
|
||||||
|
191105,
|
||||||
|
191104,
|
||||||
|
191097,
|
||||||
|
191085
|
||||||
|
],
|
||||||
|
"message_follower_ids": [
|
||||||
|
76486,
|
||||||
|
76493
|
||||||
|
],
|
||||||
|
"timesheet_ids": [],
|
||||||
|
"attachment_ids": [],
|
||||||
|
"stage_id_name": "Clôturé",
|
||||||
|
"project_id_name": "Demandes",
|
||||||
|
"partner_id_name": "CHAUSSON MATERIAUX, Christophe SAUVAGET",
|
||||||
|
"user_id_name": "Fabien LAFAY",
|
||||||
|
"tag_names": [
|
||||||
|
"BRG-LAB WEB"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"id": 9635,
|
||||||
|
"code": "T9656",
|
||||||
|
"name": "Gestion des utilisateurs",
|
||||||
|
"description": "<h1>Point particulier :</h1><ul><li>Multi laboratoire :tous</li><li>Le cas n'est pas bloquant</li></ul><h1>Description du problème :</h1><p>Bonjour,\r\n\r\nDans le menu Mes paramètres - Gestion des utilisateurs, tous les utilisateurs n'apparaissent pas. Comment faire pour les faire tous apparaitre?\r\nMerci.</p>",
|
||||||
|
"stage": "Clôturé",
|
||||||
|
"project": "Demandes",
|
||||||
|
"partner": "CHAUSSON MATERIAUX, Christophe SAUVAGET",
|
||||||
|
"assigned_to": "Fabien LAFAY",
|
||||||
|
"tags": [
|
||||||
|
"BRG-LAB WEB"
|
||||||
|
],
|
||||||
|
"create_date": "2024-07-04 12:09:47",
|
||||||
|
"write_date": "2024-10-03 13:10:50",
|
||||||
|
"deadline": "2024-07-19"
|
||||||
|
}
|
||||||
@ -14,6 +14,14 @@ from odoo.ticket_manager import TicketManager
|
|||||||
from core.utils import setup_logging, log_separator
|
from core.utils import setup_logging, log_separator
|
||||||
from formatters.json_to_markdown import create_markdown_from_json
|
from formatters.json_to_markdown import create_markdown_from_json
|
||||||
|
|
||||||
|
# Importation de l'extracteur d'images HTML (optionnel)
|
||||||
|
try:
|
||||||
|
from utils.image_extractor import extract_images_from_ticket
|
||||||
|
from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images
|
||||||
|
HTML_IMAGE_EXTRACTOR_AVAILABLE = True
|
||||||
|
except ImportError:
|
||||||
|
HTML_IMAGE_EXTRACTOR_AVAILABLE = False
|
||||||
|
|
||||||
def parse_arguments():
|
def parse_arguments():
|
||||||
"""Parse les arguments de ligne de commande."""
|
"""Parse les arguments de ligne de commande."""
|
||||||
parser = argparse.ArgumentParser(description="Récupère un ticket Odoo par son code et extrait ses données.")
|
parser = argparse.ArgumentParser(description="Récupère un ticket Odoo par son code et extrait ses données.")
|
||||||
@ -22,6 +30,7 @@ def parse_arguments():
|
|||||||
parser.add_argument("--config", "-c", help="Fichier de configuration", default="config.json")
|
parser.add_argument("--config", "-c", help="Fichier de configuration", default="config.json")
|
||||||
parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux")
|
parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux")
|
||||||
parser.add_argument("--no-md", action="store_true", help="Désactiver la génération automatique du fichier Markdown")
|
parser.add_argument("--no-md", action="store_true", help="Désactiver la génération automatique du fichier Markdown")
|
||||||
|
parser.add_argument("--extract-html-images", action="store_true", help="Activer l'extraction des images intégrées dans le HTML")
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
def load_config(config_file):
|
def load_config(config_file):
|
||||||
@ -84,6 +93,39 @@ def main():
|
|||||||
print(f"Échec de l'extraction du ticket {args.ticket_code}")
|
print(f"Échec de l'extraction du ticket {args.ticket_code}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Extraire les images intégrées dans le HTML si demandé
|
||||||
|
html_images = []
|
||||||
|
if args.extract_html_images and HTML_IMAGE_EXTRACTOR_AVAILABLE:
|
||||||
|
print("Extraction des images intégrées dans le HTML...")
|
||||||
|
html_images = extract_images_from_ticket(ticket_dir)
|
||||||
|
|
||||||
|
if html_images:
|
||||||
|
# Ajouter les images HTML au résultat
|
||||||
|
result["html_images"] = html_images
|
||||||
|
result["html_images_count"] = len(html_images)
|
||||||
|
|
||||||
|
# Créer un fichier JSON avec toutes les images
|
||||||
|
# Récupérer d'abord les images standard
|
||||||
|
ticket_data = {
|
||||||
|
"ticket_dir": ticket_dir,
|
||||||
|
"attachments": result.get("attachments", [])
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enrichir les données avec toutes les images
|
||||||
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
|
||||||
|
# Sauvegarder le résultat
|
||||||
|
all_images_path = os.path.join(ticket_dir, "all_images.json")
|
||||||
|
with open(all_images_path, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump({
|
||||||
|
"images": enhanced_data.get("images", []),
|
||||||
|
"standard_images": enhanced_data.get("standard_images", []),
|
||||||
|
"embedded_images": enhanced_data.get("embedded_images", []),
|
||||||
|
"stats": enhanced_data.get("images_stats", {})
|
||||||
|
}, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"Trouvé {len(html_images)} images intégrées dans le HTML")
|
||||||
|
|
||||||
# Générer un rapport de fin
|
# Générer un rapport de fin
|
||||||
summary = {
|
summary = {
|
||||||
"timestamp": timestamp,
|
"timestamp": timestamp,
|
||||||
@ -91,6 +133,7 @@ def main():
|
|||||||
"output_directory": ticket_dir,
|
"output_directory": ticket_dir,
|
||||||
"message_count": result.get("messages_count", 0),
|
"message_count": result.get("messages_count", 0),
|
||||||
"attachment_count": result.get("attachments_count", 0),
|
"attachment_count": result.get("attachments_count", 0),
|
||||||
|
"html_images_count": len(html_images) if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images else 0,
|
||||||
"files_created": [
|
"files_created": [
|
||||||
os.path.basename(result.get("ticket_info", "")),
|
os.path.basename(result.get("ticket_info", "")),
|
||||||
os.path.basename(result.get("ticket_summary", "")),
|
os.path.basename(result.get("ticket_summary", "")),
|
||||||
@ -118,6 +161,11 @@ def main():
|
|||||||
print(f"Répertoire: {ticket_dir}")
|
print(f"Répertoire: {ticket_dir}")
|
||||||
print(f"Messages traités: {result.get('messages_count', 0)}")
|
print(f"Messages traités: {result.get('messages_count', 0)}")
|
||||||
print(f"Pièces jointes: {result.get('attachments_count', 0)}")
|
print(f"Pièces jointes: {result.get('attachments_count', 0)}")
|
||||||
|
|
||||||
|
# Afficher le nombre d'images HTML si l'extracteur est disponible
|
||||||
|
if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images:
|
||||||
|
print(f"Images HTML: {len(html_images)}")
|
||||||
|
|
||||||
if md_file_path:
|
if md_file_path:
|
||||||
print(f"Rapport Markdown: {md_file_path}")
|
print(f"Rapport Markdown: {md_file_path}")
|
||||||
|
|
||||||
|
|||||||
@ -145,7 +145,7 @@ def test_orchestrator(ticket_id=None):
|
|||||||
|
|
||||||
# Vérifier si le tableau des échanges est présent
|
# Vérifier si le tableau des échanges est présent
|
||||||
has_table = "| Date | " in content
|
has_table = "| Date | " in content
|
||||||
has_details = "Détails des analyses effectuées" in content
|
has_details = "## Détails des analyses" in content
|
||||||
|
|
||||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||||
|
|||||||
@ -145,7 +145,7 @@ def test_orchestrator(ticket_id=None):
|
|||||||
|
|
||||||
# Vérifier si le tableau des échanges est présent
|
# Vérifier si le tableau des échanges est présent
|
||||||
has_table = "| Date | " in content
|
has_table = "| Date | " in content
|
||||||
has_details = "Détails des analyses effectuées" in content
|
has_details = "## Détails des analyses" in content
|
||||||
|
|
||||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||||
|
|||||||
@ -145,7 +145,7 @@ def test_orchestrator(ticket_id=None):
|
|||||||
|
|
||||||
# Vérifier si le tableau des échanges est présent
|
# Vérifier si le tableau des échanges est présent
|
||||||
has_table = "| Date | " in content
|
has_table = "| Date | " in content
|
||||||
has_details = "Détails des analyses effectuées" in content
|
has_details = "## Détails des analyses" in content
|
||||||
|
|
||||||
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
print(f"- Tableau des échanges: {'Présent' if has_table else 'MANQUANT'}")
|
||||||
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
print(f"- Détails des analyses: {'Présent' if has_details else 'MANQUANT'}")
|
||||||
|
|||||||
104
utils/image_extractor/README.md
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# Extracteur d'images HTML pour tickets Odoo
|
||||||
|
|
||||||
|
Ce module est conçu pour extraire les images intégrées dans les messages HTML des tickets Odoo. Il complète l'extracteur d'images standard existant pour assurer que toutes les images, y compris celles référencées uniquement dans le HTML des messages, sont correctement extraites.
|
||||||
|
|
||||||
|
## Problématique
|
||||||
|
|
||||||
|
Dans certains tickets Odoo, les images apparaissent dans le HTML des messages mais ne sont pas correctement détectées par l'extracteur d'images standard, en particulier lorsqu'elles sont référencées avec des balises `<img>` pointant vers des URLs comme `/web/image/ID?access_token=...`.
|
||||||
|
|
||||||
|
Ce module analyse le HTML des messages pour détecter ces références et les associer aux pièces jointes correspondantes, permettant ainsi d'extraire toutes les images associées à un ticket.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Le module est conçu pour être intégré dans le projet existant et ne nécessite pas d'installation particulière. Il utilise cependant `BeautifulSoup` pour l'analyse HTML.
|
||||||
|
|
||||||
|
Si cette dépendance n'est pas déjà installée :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install beautifulsoup4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Utilisation
|
||||||
|
|
||||||
|
### Utilisation simple
|
||||||
|
|
||||||
|
Pour extraire les images intégrées dans le HTML d'un ticket :
|
||||||
|
|
||||||
|
```python
|
||||||
|
from utils.image_extractor import extract_images_from_ticket
|
||||||
|
|
||||||
|
# Chemin vers le répertoire du ticket
|
||||||
|
ticket_dir = "output/ticket_T0241/T0241_20250409_141018"
|
||||||
|
|
||||||
|
# Extraire les images intégrées dans le HTML
|
||||||
|
embedded_images = extract_images_from_ticket(ticket_dir)
|
||||||
|
|
||||||
|
# Afficher les chemins des images
|
||||||
|
for img in embedded_images:
|
||||||
|
print(f"Image trouvée: {img}")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Intégration complète
|
||||||
|
|
||||||
|
Pour intégrer l'extracteur HTML avec l'extracteur standard existant :
|
||||||
|
|
||||||
|
```python
|
||||||
|
from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images
|
||||||
|
|
||||||
|
# Données du ticket (contenant au minimum 'ticket_dir' et 'attachments')
|
||||||
|
ticket_data = {
|
||||||
|
"ticket_dir": "output/ticket_T0241/T0241_20250409_141018",
|
||||||
|
"attachments": [...] # Liste des pièces jointes
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enrichir les données du ticket avec toutes les images
|
||||||
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
|
||||||
|
# Accéder aux images combinées
|
||||||
|
all_images = enhanced_data.get("images", [])
|
||||||
|
standard_images = enhanced_data.get("standard_images", [])
|
||||||
|
embedded_images = enhanced_data.get("embedded_images", [])
|
||||||
|
```
|
||||||
|
|
||||||
|
### Script d'extraction complet
|
||||||
|
|
||||||
|
Un script utilitaire complet est également disponible :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m utils.image_extractor.extract_ticket_images /chemin/vers/repertoire/ticket --verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemples
|
||||||
|
|
||||||
|
Le répertoire `examples` contient un exemple d'utilisation de l'extracteur sur le ticket T0241, qui présente des cas d'images intégrées dans le HTML.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m utils.image_extractor.examples.extract_t0241_images
|
||||||
|
```
|
||||||
|
|
||||||
|
## Structure du module
|
||||||
|
|
||||||
|
- `html_image_extractor.py` : Extracteur d'images HTML principal
|
||||||
|
- `extract_all_images.py` : Module combinant l'extracteur HTML et l'extracteur standard
|
||||||
|
- `extract_ticket_images.py` : Script utilitaire pour l'extraction d'images
|
||||||
|
- `examples/` : Exemples d'utilisation
|
||||||
|
|
||||||
|
## Fonctionnement technique
|
||||||
|
|
||||||
|
1. L'extracteur charge les messages du ticket depuis `messages_raw.json`
|
||||||
|
2. Il analyse le HTML des messages avec BeautifulSoup
|
||||||
|
3. Il détecte les balises `<img>` avec des attributs `src` pointant vers `/web/image/ID`
|
||||||
|
4. Il récupère l'ID de l'image et le lie aux pièces jointes disponibles dans `attachments_info.json`
|
||||||
|
5. Il génère une liste des chemins locaux des images intégrées
|
||||||
|
|
||||||
|
## Avantages
|
||||||
|
|
||||||
|
- **Non intrusif** : Fonctionne en complément de l'extracteur existant, sans le modifier
|
||||||
|
- **Robuste** : Gère différents formats de références d'images
|
||||||
|
- **Configurable** : Peut être utilisé indépendamment ou intégré au flux de traitement existant
|
||||||
|
- **Déduplication** : Évite les doublons entre les images standard et intégrées
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
- Nécessite que les pièces jointes référencées soient disponibles dans `attachments_info.json`
|
||||||
|
- Dépend de BeautifulSoup pour l'analyse HTML
|
||||||
1
utils/image_extractor/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from .html_image_extractor import HtmlImageExtractor, extract_images_from_ticket
|
||||||
1
utils/image_extractor/examples/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Package d'exemples d'utilisation de l'extracteur d'images HTML
|
||||||
93
utils/image_extractor/examples/extract_t0241_images.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Script d'exemple pour extraire les images du ticket T0241.
|
||||||
|
Cet exemple montre comment utiliser l'extracteur d'images HTML.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
|
||||||
|
# Ajouter le répertoire parent au chemin de recherche
|
||||||
|
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))
|
||||||
|
sys.path.append(parent_dir)
|
||||||
|
|
||||||
|
from utils.image_extractor import extract_images_from_ticket
|
||||||
|
from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images
|
||||||
|
|
||||||
|
# Chemin vers le répertoire du ticket T0241
|
||||||
|
ticket_dir = os.path.join(parent_dir, "output", "ticket_T0241", "T0241_20250409_141018")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Fonction principale pour extraire les images du ticket T0241.
|
||||||
|
"""
|
||||||
|
if not os.path.exists(ticket_dir):
|
||||||
|
print(f"Répertoire introuvable: {ticket_dir}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"Extraction des images pour le ticket: {os.path.basename(ticket_dir)}")
|
||||||
|
|
||||||
|
# 1. Utiliser directement l'extracteur d'images HTML
|
||||||
|
print("\n1. Extraction des images intégrées dans le HTML:")
|
||||||
|
embedded_images = extract_images_from_ticket(ticket_dir)
|
||||||
|
print(f" Nombre d'images trouvées: {len(embedded_images)}")
|
||||||
|
for img in embedded_images:
|
||||||
|
print(f" - {os.path.basename(img)}")
|
||||||
|
|
||||||
|
# 2. Utiliser l'extracteur complet pour récupérer toutes les images
|
||||||
|
print("\n2. Extraction de toutes les images (standard + intégrées):")
|
||||||
|
|
||||||
|
# Charger les données minimales du ticket
|
||||||
|
ticket_data = {"ticket_dir": ticket_dir}
|
||||||
|
|
||||||
|
# Charger les pièces jointes si disponibles
|
||||||
|
attachments_info_path = os.path.join(ticket_dir, "attachments_info.json")
|
||||||
|
if os.path.exists(attachments_info_path):
|
||||||
|
with open(attachments_info_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["attachments"] = json.load(f)
|
||||||
|
|
||||||
|
# Enrichir avec toutes les images
|
||||||
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
|
||||||
|
# Afficher les statistiques
|
||||||
|
stats = enhanced_data.get("images_stats", {})
|
||||||
|
print(f" Total: {stats.get('total', 0)}")
|
||||||
|
print(f" Standard: {stats.get('standard', 0)}")
|
||||||
|
print(f" Intégrées: {stats.get('embedded', 0)}")
|
||||||
|
|
||||||
|
# Afficher les chemins des images
|
||||||
|
print("\n Images standard:")
|
||||||
|
for img in enhanced_data.get("standard_images", []):
|
||||||
|
print(f" - {os.path.basename(img)}")
|
||||||
|
|
||||||
|
print("\n Images intégrées dans le HTML:")
|
||||||
|
for img in enhanced_data.get("embedded_images", []):
|
||||||
|
print(f" - {os.path.basename(img)}")
|
||||||
|
|
||||||
|
# 3. Sauvegarder les résultats
|
||||||
|
output_file = os.path.join(ticket_dir, "all_images.json")
|
||||||
|
result = {
|
||||||
|
"images": enhanced_data.get("images", []),
|
||||||
|
"standard_images": enhanced_data.get("standard_images", []),
|
||||||
|
"embedded_images": enhanced_data.get("embedded_images", []),
|
||||||
|
"stats": enhanced_data.get("images_stats", {})
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(result, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
print(f"\nRésultats sauvegardés dans: {output_file}")
|
||||||
|
|
||||||
|
# Afficher un message pour intégrer cette fonctionnalité dans le flux de traitement
|
||||||
|
print("\nPour intégrer cette fonctionnalité dans votre flux de traitement existant:")
|
||||||
|
print("1. Importez l'extracteur d'images:")
|
||||||
|
print(" from utils.image_extractor import extract_images_from_ticket")
|
||||||
|
print("2. Utilisez-le pour compléter votre liste d'images:")
|
||||||
|
print(" embedded_images = extract_images_from_ticket(ticket_dir)")
|
||||||
|
print("3. Ajoutez ces images à votre liste d'images existante")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
169
utils/image_extractor/examples/integration_example.py
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Exemple d'intégration de l'extracteur d'images HTML dans un flux de traitement de ticket.
|
||||||
|
Ce script montre comment utiliser l'extracteur d'images HTML comme une étape dans un processus
|
||||||
|
d'analyse de tickets, par exemple dans un orchestrateur ou un analyseur de tickets.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import logging
|
||||||
|
from typing import Dict, Any, List
|
||||||
|
|
||||||
|
# Ajouter le répertoire parent au chemin de recherche
|
||||||
|
parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))
|
||||||
|
sys.path.append(parent_dir)
|
||||||
|
|
||||||
|
# Importer l'extracteur d'images HTML
|
||||||
|
from utils.image_extractor import extract_images_from_ticket
|
||||||
|
from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images
|
||||||
|
|
||||||
|
def setup_logging():
|
||||||
|
"""Configure la journalisation."""
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||||
|
datefmt='%Y-%m-%d %H:%M:%S'
|
||||||
|
)
|
||||||
|
|
||||||
|
def process_ticket(ticket_dir: str) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Exemple de fonction qui traite un ticket complet.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_dir: Répertoire contenant les données du ticket
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Données du ticket enrichies
|
||||||
|
"""
|
||||||
|
logging.info(f"Traitement du ticket dans: {ticket_dir}")
|
||||||
|
|
||||||
|
# 1. Charger les informations de base du ticket
|
||||||
|
ticket_data = load_ticket_data(ticket_dir)
|
||||||
|
|
||||||
|
# 2. Extraire les images HTML
|
||||||
|
logging.info("Extraction des images intégrées dans le HTML...")
|
||||||
|
html_images = extract_images_from_ticket(ticket_dir)
|
||||||
|
|
||||||
|
# 3. Enrichir les données du ticket avec toutes les images
|
||||||
|
ticket_data["ticket_dir"] = ticket_dir
|
||||||
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
|
||||||
|
# 4. Ajouter des statistiques sur les images
|
||||||
|
stats = enhanced_data.get("images_stats", {})
|
||||||
|
logging.info(f"Images trouvées: {stats.get('total', 0)} total, " +
|
||||||
|
f"{stats.get('standard', 0)} standard, " +
|
||||||
|
f"{stats.get('embedded', 0)} intégrées")
|
||||||
|
|
||||||
|
# 5. Hypothétiquement, effectuer une analyse des images
|
||||||
|
analyze_images(enhanced_data.get("images", []))
|
||||||
|
|
||||||
|
return enhanced_data
|
||||||
|
|
||||||
|
def load_ticket_data(ticket_dir: str) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Charge les données du ticket depuis les fichiers JSON.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_dir: Répertoire contenant les données du ticket
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Données du ticket chargées
|
||||||
|
"""
|
||||||
|
ticket_data = {}
|
||||||
|
|
||||||
|
# Charger les informations du ticket
|
||||||
|
ticket_info_path = os.path.join(ticket_dir, "ticket_info.json")
|
||||||
|
if os.path.exists(ticket_info_path):
|
||||||
|
with open(ticket_info_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["ticket_info"] = json.load(f)
|
||||||
|
|
||||||
|
# Charger le résumé du ticket
|
||||||
|
ticket_summary_path = os.path.join(ticket_dir, "ticket_summary.json")
|
||||||
|
if os.path.exists(ticket_summary_path):
|
||||||
|
with open(ticket_summary_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["ticket_summary"] = json.load(f)
|
||||||
|
|
||||||
|
# Charger les pièces jointes
|
||||||
|
attachments_path = os.path.join(ticket_dir, "attachments_info.json")
|
||||||
|
if os.path.exists(attachments_path):
|
||||||
|
with open(attachments_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["attachments"] = json.load(f)
|
||||||
|
|
||||||
|
# Charger les messages
|
||||||
|
messages_path = os.path.join(ticket_dir, "all_messages.json")
|
||||||
|
if os.path.exists(messages_path):
|
||||||
|
with open(messages_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["messages"] = json.load(f)
|
||||||
|
|
||||||
|
return ticket_data
|
||||||
|
|
||||||
|
def analyze_images(image_paths: List[str]):
|
||||||
|
"""
|
||||||
|
Exemple de fonction qui analyse les images d'un ticket.
|
||||||
|
Cette fonction pourrait utiliser un modèle de vision ou une API externe.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_paths: Liste des chemins d'images à analyser
|
||||||
|
"""
|
||||||
|
logging.info(f"Analyse de {len(image_paths)} images...")
|
||||||
|
|
||||||
|
# Simuler une analyse d'images
|
||||||
|
for i, img_path in enumerate(image_paths):
|
||||||
|
if os.path.exists(img_path):
|
||||||
|
logging.info(f" Analyse de l'image {i+1}: {os.path.basename(img_path)}")
|
||||||
|
# TODO: Intégrer votre logique d'analyse d'image ici
|
||||||
|
|
||||||
|
def save_results(ticket_data: Dict[str, Any], output_file: str):
|
||||||
|
"""
|
||||||
|
Sauvegarde les résultats de l'analyse.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_data: Données du ticket à sauvegarder
|
||||||
|
output_file: Chemin du fichier de sortie
|
||||||
|
"""
|
||||||
|
# Créer le répertoire de sortie si nécessaire
|
||||||
|
output_dir = os.path.dirname(output_file)
|
||||||
|
if output_dir and not os.path.exists(output_dir):
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# Sauvegarder les résultats
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(ticket_data, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
logging.info(f"Résultats sauvegardés dans: {output_file}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Fonction principale."""
|
||||||
|
# Configurer la journalisation
|
||||||
|
setup_logging()
|
||||||
|
|
||||||
|
# Récupérer le chemin du répertoire de ticket
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
ticket_dir = sys.argv[1]
|
||||||
|
else:
|
||||||
|
# Utiliser un répertoire de test par défaut
|
||||||
|
ticket_dir = os.path.join(parent_dir, "output", "ticket_T0241", "T0241_20250409_141018")
|
||||||
|
|
||||||
|
# Vérifier que le répertoire existe
|
||||||
|
if not os.path.exists(ticket_dir):
|
||||||
|
logging.error(f"Répertoire introuvable: {ticket_dir}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Traiter le ticket
|
||||||
|
ticket_data = process_ticket(ticket_dir)
|
||||||
|
|
||||||
|
# Sauvegarder les résultats
|
||||||
|
output_file = os.path.join(ticket_dir, "ticket_analysis.json")
|
||||||
|
save_results(ticket_data, output_file)
|
||||||
|
|
||||||
|
# Afficher un résumé
|
||||||
|
ticket_code = ticket_data.get("ticket_summary", {}).get("code", os.path.basename(ticket_dir))
|
||||||
|
print(f"\nAnalyse du ticket {ticket_code} terminée.")
|
||||||
|
print(f"Résultats sauvegardés dans: {output_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
162
utils/image_extractor/extract_all_images.py
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Module combinant l'extracteur d'images standard avec l'extracteur d'images HTML.
|
||||||
|
Permet de récupérer toutes les images liées à un ticket, qu'elles soient directement
|
||||||
|
attachées ou référencées dans le HTML des messages.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import logging
|
||||||
|
from typing import Dict, List, Any, Set
|
||||||
|
from .html_image_extractor import extract_images_from_ticket
|
||||||
|
|
||||||
|
def enhance_ticket_data_with_images(ticket_data: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Récupère toutes les images associées à un ticket, en combinant l'extraction standard
|
||||||
|
et l'extraction des images intégrées dans le HTML.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_data: Données du ticket (avec la clé 'ticket_dir' contenant le chemin du répertoire)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Données du ticket enrichies avec les chemins des images
|
||||||
|
"""
|
||||||
|
result = ticket_data.copy()
|
||||||
|
|
||||||
|
# Vérifier que le répertoire du ticket est spécifié
|
||||||
|
ticket_dir = ticket_data.get("ticket_dir")
|
||||||
|
if not ticket_dir or not os.path.exists(ticket_dir):
|
||||||
|
logging.error("Répertoire du ticket non spécifié ou introuvable")
|
||||||
|
result["images"] = []
|
||||||
|
result["standard_images"] = []
|
||||||
|
result["embedded_images"] = []
|
||||||
|
result["images_count"] = 0
|
||||||
|
result["images_stats"] = {"total": 0, "standard": 0, "embedded": 0}
|
||||||
|
return result
|
||||||
|
|
||||||
|
# 1. Récupérer les images standard depuis les pièces jointes
|
||||||
|
standard_images = get_standard_images(ticket_data)
|
||||||
|
|
||||||
|
# 2. Récupérer les images intégrées dans le HTML
|
||||||
|
try:
|
||||||
|
embedded_images = extract_images_from_ticket(ticket_dir)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de l'extraction des images HTML: {e}")
|
||||||
|
embedded_images = []
|
||||||
|
|
||||||
|
# 3. Combiner les deux ensembles d'images et éliminer les doublons
|
||||||
|
all_images = deduplicate_images(standard_images, embedded_images)
|
||||||
|
|
||||||
|
# 4. Enrichir les données du ticket
|
||||||
|
result["images"] = all_images
|
||||||
|
result["standard_images"] = standard_images
|
||||||
|
result["embedded_images"] = embedded_images
|
||||||
|
result["images_count"] = len(all_images)
|
||||||
|
result["images_stats"] = {
|
||||||
|
"total": len(all_images),
|
||||||
|
"standard": len(standard_images),
|
||||||
|
"embedded": len(embedded_images)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_standard_images(ticket_data: Dict[str, Any]) -> List[str]:
|
||||||
|
"""
|
||||||
|
Récupère les images standard depuis les pièces jointes du ticket.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_data: Données du ticket
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des chemins des images standard
|
||||||
|
"""
|
||||||
|
image_paths = []
|
||||||
|
attachments = ticket_data.get("attachments", [])
|
||||||
|
|
||||||
|
if not attachments:
|
||||||
|
return []
|
||||||
|
|
||||||
|
for attachment in attachments:
|
||||||
|
# Vérifier si la pièce jointe est une image
|
||||||
|
mimetype = attachment.get("mimetype", "").lower()
|
||||||
|
name = attachment.get("name", "").lower()
|
||||||
|
|
||||||
|
# Vérifier si c'est une image par mimetype ou extension
|
||||||
|
is_image = (
|
||||||
|
mimetype.startswith("image/") or
|
||||||
|
any(name.endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'])
|
||||||
|
)
|
||||||
|
|
||||||
|
if is_image:
|
||||||
|
# Utiliser le chemin local s'il existe
|
||||||
|
path = attachment.get("local_path")
|
||||||
|
if path and os.path.exists(path):
|
||||||
|
image_paths.append(path)
|
||||||
|
|
||||||
|
return image_paths
|
||||||
|
|
||||||
|
def deduplicate_images(standard_images: List[str], embedded_images: List[str]) -> List[str]:
|
||||||
|
"""
|
||||||
|
Combine deux listes d'images en éliminant les doublons.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
standard_images: Liste des chemins d'images standard
|
||||||
|
embedded_images: Liste des chemins d'images intégrées
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste combinée des chemins d'images sans doublons
|
||||||
|
"""
|
||||||
|
# Utiliser un ensemble pour éliminer les doublons
|
||||||
|
unique_images = set(standard_images)
|
||||||
|
|
||||||
|
# Ajouter les images intégrées qui ne sont pas déjà dans les images standard
|
||||||
|
for img in embedded_images:
|
||||||
|
unique_images.add(img)
|
||||||
|
|
||||||
|
# Convertir en liste et vérifier que les chemins existent
|
||||||
|
result = [img for img in unique_images if os.path.exists(img)]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Test simple
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
ticket_dir = sys.argv[1]
|
||||||
|
else:
|
||||||
|
ticket_dir = "./output/ticket_T0241/T0241_20250409_141018"
|
||||||
|
|
||||||
|
if not os.path.exists(ticket_dir):
|
||||||
|
print(f"Répertoire introuvable: {ticket_dir}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Charger les pièces jointes
|
||||||
|
attachments_path = os.path.join(ticket_dir, "attachments_info.json")
|
||||||
|
attachments = []
|
||||||
|
|
||||||
|
if os.path.exists(attachments_path):
|
||||||
|
import json
|
||||||
|
with open(attachments_path, 'r', encoding='utf-8') as f:
|
||||||
|
attachments = json.load(f)
|
||||||
|
|
||||||
|
# Créer les données du ticket
|
||||||
|
ticket_data = {
|
||||||
|
"ticket_dir": ticket_dir,
|
||||||
|
"attachments": attachments
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enrichir avec les images
|
||||||
|
result = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
|
||||||
|
# Afficher les résultats
|
||||||
|
print(f"Images trouvées: {result['images_count']}")
|
||||||
|
print(f" Images standard: {len(result['standard_images'])}")
|
||||||
|
print(f" Images intégrées: {len(result['embedded_images'])}")
|
||||||
|
|
||||||
|
if result["images"]:
|
||||||
|
print("\nListe des images:")
|
||||||
|
for i, img in enumerate(result["images"]):
|
||||||
|
print(f" {i+1}. {img}")
|
||||||
168
utils/image_extractor/extract_ticket_images.py
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Script pour extraire toutes les images d'un ticket Odoo.
|
||||||
|
Ce script combine l'extracteur d'images standard et l'extracteur d'images HTML.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import argparse
|
||||||
|
import logging
|
||||||
|
from typing import Dict, List, Any, Optional
|
||||||
|
|
||||||
|
# Importer les extracteurs
|
||||||
|
from .html_image_extractor import extract_images_from_ticket
|
||||||
|
from .extract_all_images import enhance_ticket_data_with_images
|
||||||
|
|
||||||
|
def setup_logging(verbose: bool = False) -> None:
|
||||||
|
"""
|
||||||
|
Configure la journalisation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
verbose: Mode verbeux pour plus de détails
|
||||||
|
"""
|
||||||
|
level = logging.DEBUG if verbose else logging.INFO
|
||||||
|
logging.basicConfig(
|
||||||
|
level=level,
|
||||||
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||||
|
datefmt='%Y-%m-%d %H:%M:%S'
|
||||||
|
)
|
||||||
|
|
||||||
|
def extract_ticket_images(ticket_dir: str, output_file: Optional[str] = None, verbose: bool = False) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Extrait toutes les images d'un ticket Odoo.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_dir: Répertoire du ticket
|
||||||
|
output_file: Fichier de sortie pour les résultats (optionnel)
|
||||||
|
verbose: Mode verbeux pour plus de détails
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionnaire avec les résultats de l'extraction
|
||||||
|
"""
|
||||||
|
setup_logging(verbose)
|
||||||
|
|
||||||
|
if not os.path.exists(ticket_dir):
|
||||||
|
logging.error(f"Répertoire introuvable: {ticket_dir}")
|
||||||
|
return {"status": "error", "message": "Répertoire introuvable"}
|
||||||
|
|
||||||
|
logging.info(f"Analyse des images pour le ticket dans: {ticket_dir}")
|
||||||
|
|
||||||
|
# Charger les données du ticket
|
||||||
|
ticket_summary_path = os.path.join(ticket_dir, "ticket_summary.json")
|
||||||
|
attachments_info_path = os.path.join(ticket_dir, "attachments_info.json")
|
||||||
|
|
||||||
|
ticket_data = {"ticket_dir": ticket_dir}
|
||||||
|
|
||||||
|
# Charger les données du ticket si disponibles
|
||||||
|
if os.path.exists(ticket_summary_path):
|
||||||
|
try:
|
||||||
|
with open(ticket_summary_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["ticket_summary"] = json.load(f)
|
||||||
|
logging.info("Données du ticket chargées")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors du chargement des données du ticket: {e}")
|
||||||
|
|
||||||
|
# Charger les pièces jointes si disponibles
|
||||||
|
if os.path.exists(attachments_info_path):
|
||||||
|
try:
|
||||||
|
with open(attachments_info_path, 'r', encoding='utf-8') as f:
|
||||||
|
ticket_data["attachments"] = json.load(f)
|
||||||
|
logging.info(f"Pièces jointes chargées: {len(ticket_data['attachments'])}")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors du chargement des pièces jointes: {e}")
|
||||||
|
|
||||||
|
# Enrichir les données avec toutes les images
|
||||||
|
try:
|
||||||
|
enhanced_data = enhance_ticket_data_with_images(ticket_data)
|
||||||
|
logging.info(f"Images identifiées: {enhanced_data.get('images_count', 0)}")
|
||||||
|
|
||||||
|
# Préparer les résultats
|
||||||
|
result = {
|
||||||
|
"status": "success",
|
||||||
|
"ticket_dir": ticket_dir,
|
||||||
|
"images": enhanced_data.get("images", []),
|
||||||
|
"standard_images": enhanced_data.get("standard_images", []),
|
||||||
|
"embedded_images": enhanced_data.get("embedded_images", []),
|
||||||
|
"stats": enhanced_data.get("images_stats", {})
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ajouter les informations du ticket si disponibles
|
||||||
|
if "ticket_summary" in enhanced_data:
|
||||||
|
ticket_summary = enhanced_data["ticket_summary"]
|
||||||
|
result["ticket_code"] = ticket_summary.get("code", "")
|
||||||
|
result["ticket_name"] = ticket_summary.get("name", "")
|
||||||
|
|
||||||
|
# Sauvegarder les résultats si un fichier de sortie est spécifié
|
||||||
|
if output_file:
|
||||||
|
output_dir = os.path.dirname(output_file)
|
||||||
|
if output_dir and not os.path.exists(output_dir):
|
||||||
|
os.makedirs(output_dir, exist_ok=True)
|
||||||
|
|
||||||
|
with open(output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(result, f, indent=2, ensure_ascii=False)
|
||||||
|
logging.info(f"Résultats sauvegardés dans: {output_file}")
|
||||||
|
else:
|
||||||
|
# Utiliser un fichier de sortie par défaut dans le répertoire du ticket
|
||||||
|
default_output = os.path.join(ticket_dir, "all_images.json")
|
||||||
|
with open(default_output, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(result, f, indent=2, ensure_ascii=False)
|
||||||
|
logging.info(f"Résultats sauvegardés dans: {default_output}")
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception(f"Erreur lors de l'extraction des images: {e}")
|
||||||
|
return {"status": "error", "message": str(e)}
|
||||||
|
|
||||||
|
def parse_arguments():
|
||||||
|
"""
|
||||||
|
Parse les arguments de la ligne de commande.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Arguments parsés
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser(description="Extrait toutes les images d'un ticket Odoo.")
|
||||||
|
parser.add_argument("ticket_dir", help="Répertoire du ticket")
|
||||||
|
parser.add_argument("--output", "-o", help="Fichier de sortie pour les résultats")
|
||||||
|
parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux pour plus de détails")
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Point d'entrée principal.
|
||||||
|
"""
|
||||||
|
args = parse_arguments()
|
||||||
|
|
||||||
|
result = extract_ticket_images(
|
||||||
|
ticket_dir=args.ticket_dir,
|
||||||
|
output_file=args.output,
|
||||||
|
verbose=args.verbose
|
||||||
|
)
|
||||||
|
|
||||||
|
# Afficher un résumé des résultats
|
||||||
|
if result["status"] == "success":
|
||||||
|
stats = result.get("stats", {})
|
||||||
|
print("\nStatistiques des images:")
|
||||||
|
print(f" Total: {stats.get('total', 0)}")
|
||||||
|
print(f" Standard: {stats.get('standard', 0)}")
|
||||||
|
print(f" Intégrées: {stats.get('embedded', 0)}")
|
||||||
|
|
||||||
|
# Afficher les chemins des images
|
||||||
|
if args.verbose:
|
||||||
|
print("\nImages standard:")
|
||||||
|
for img in result.get("standard_images", []):
|
||||||
|
print(f" {img}")
|
||||||
|
|
||||||
|
print("\nImages intégrées dans le HTML:")
|
||||||
|
for img in result.get("embedded_images", []):
|
||||||
|
print(f" {img}")
|
||||||
|
else:
|
||||||
|
print(f"Erreur: {result.get('message', 'Erreur inconnue')}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
449
utils/image_extractor/html_image_extractor.py
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Module pour extraire les images intégrées dans les messages HTML d'Odoo.
|
||||||
|
Complémentaire à l'extracteur d'images actuel, il détecte spécifiquement les images
|
||||||
|
référencées dans le HTML avec des balises <img> et les associe aux pièces jointes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
from typing import Dict, List, Any, Optional, Set, Tuple
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
class HtmlImageExtractor:
|
||||||
|
"""
|
||||||
|
Extracteur d'images intégrées dans les messages HTML d'Odoo.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, ticket_dir: str):
|
||||||
|
"""
|
||||||
|
Initialise l'extracteur d'images HTML.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_dir: Répertoire du ticket contenant les messages et pièces jointes
|
||||||
|
"""
|
||||||
|
self.ticket_dir = ticket_dir
|
||||||
|
self.messages_file = os.path.join(ticket_dir, "messages_raw.json")
|
||||||
|
self.attachments_file = os.path.join(ticket_dir, "attachments_info.json")
|
||||||
|
self.output_file = os.path.join(ticket_dir, "embedded_images.json")
|
||||||
|
|
||||||
|
# Cache pour les données
|
||||||
|
self._messages = None
|
||||||
|
self._attachments = None
|
||||||
|
|
||||||
|
def _load_messages(self) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Charge les messages du ticket.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des messages
|
||||||
|
"""
|
||||||
|
if self._messages is not None:
|
||||||
|
return self._messages
|
||||||
|
|
||||||
|
# Essayer différents fichiers potentiels contenant les messages
|
||||||
|
possible_message_files = [
|
||||||
|
self.messages_file, # messages_raw.json
|
||||||
|
os.path.join(self.ticket_dir, "messages.json"),
|
||||||
|
os.path.join(self.ticket_dir, "all_messages.json")
|
||||||
|
]
|
||||||
|
|
||||||
|
for msg_file in possible_message_files:
|
||||||
|
if os.path.exists(msg_file):
|
||||||
|
try:
|
||||||
|
with open(msg_file, 'r', encoding='utf-8') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
# Gérer différents formats de fichiers de messages
|
||||||
|
if isinstance(data, dict):
|
||||||
|
if "messages" in data:
|
||||||
|
self._messages = data["messages"]
|
||||||
|
return self._messages
|
||||||
|
# Si pas de clé messages mais d'autres clés, essayer de trouver les messages
|
||||||
|
for key, value in data.items():
|
||||||
|
if isinstance(value, list) and len(value) > 0:
|
||||||
|
# Vérifier si ça ressemble à des messages (ont une clé body ou content)
|
||||||
|
if isinstance(value[0], dict) and any(k in value[0] for k in ["body", "content"]):
|
||||||
|
self._messages = value
|
||||||
|
return self._messages
|
||||||
|
|
||||||
|
# Si c'est directement une liste, supposer que ce sont des messages
|
||||||
|
elif isinstance(data, list):
|
||||||
|
self._messages = data
|
||||||
|
return self._messages
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors du chargement du fichier {msg_file}: {e}")
|
||||||
|
|
||||||
|
# Si on arrive ici, aucun fichier valide n'a été trouvé
|
||||||
|
logging.error(f"Aucun fichier de messages valide trouvé dans: {self.ticket_dir}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def _load_attachments(self) -> Dict[int, Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Charge les pièces jointes du ticket.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionnaire des pièces jointes indexées par ID
|
||||||
|
"""
|
||||||
|
if self._attachments is not None:
|
||||||
|
return self._attachments
|
||||||
|
|
||||||
|
# Essayer différents fichiers potentiels de pièces jointes
|
||||||
|
possible_attachment_files = [
|
||||||
|
self.attachments_file, # attachments_info.json
|
||||||
|
os.path.join(self.ticket_dir, "attachments.json")
|
||||||
|
]
|
||||||
|
|
||||||
|
for att_file in possible_attachment_files:
|
||||||
|
if os.path.exists(att_file):
|
||||||
|
try:
|
||||||
|
with open(att_file, 'r', encoding='utf-8') as f:
|
||||||
|
attachments = json.load(f)
|
||||||
|
|
||||||
|
if not isinstance(attachments, list):
|
||||||
|
# Si ce n'est pas une liste mais un dict, essayer de trouver une liste
|
||||||
|
for key, value in attachments.items():
|
||||||
|
if isinstance(value, list) and len(value) > 0:
|
||||||
|
attachments = value
|
||||||
|
break
|
||||||
|
|
||||||
|
if not isinstance(attachments, list):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Indexer par ID pour un accès rapide
|
||||||
|
self._attachments = {}
|
||||||
|
for att in attachments:
|
||||||
|
if "id" in att:
|
||||||
|
self._attachments[att["id"]] = att
|
||||||
|
elif "attachment_id" in att:
|
||||||
|
self._attachments[att["attachment_id"]] = att
|
||||||
|
|
||||||
|
if self._attachments:
|
||||||
|
return self._attachments
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors du chargement des pièces jointes depuis {att_file}: {e}")
|
||||||
|
|
||||||
|
# Si on arrive ici, aucun fichier valide n'a été trouvé
|
||||||
|
logging.error(f"Aucun fichier de pièces jointes valide trouvé dans: {self.ticket_dir}")
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def _get_tag_attribute(self, tag: Any, attr_name: str, default: str = "") -> str:
|
||||||
|
"""
|
||||||
|
Récupère un attribut d'une balise HTML de manière sécurisée.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
tag: Balise HTML
|
||||||
|
attr_name: Nom de l'attribut à récupérer
|
||||||
|
default: Valeur par défaut si l'attribut n'existe pas
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Valeur de l'attribut
|
||||||
|
"""
|
||||||
|
# Vérifier que c'est bien une balise et qu'elle a la méthode get
|
||||||
|
if not hasattr(tag, 'get'):
|
||||||
|
return default
|
||||||
|
|
||||||
|
# Récupérer l'attribut si présent
|
||||||
|
try:
|
||||||
|
value = tag.get(attr_name)
|
||||||
|
return str(value) if value is not None else default
|
||||||
|
except (AttributeError, KeyError, TypeError):
|
||||||
|
return default
|
||||||
|
|
||||||
|
def extract_image_references(self) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Extrait les références aux images dans le HTML des messages.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Dictionnaire contenant les références d'images trouvées
|
||||||
|
"""
|
||||||
|
messages = self._load_messages()
|
||||||
|
attachments_by_id = self._load_attachments()
|
||||||
|
|
||||||
|
if not messages:
|
||||||
|
logging.error("Aucun message trouvé pour l'extraction d'images")
|
||||||
|
return {"status": "error", "message": "Aucun message trouvé", "references": []}
|
||||||
|
|
||||||
|
# Stocker les références trouvées
|
||||||
|
image_references = []
|
||||||
|
|
||||||
|
# Ensemble pour dédupliquer
|
||||||
|
processed_ids = set()
|
||||||
|
|
||||||
|
for message in messages:
|
||||||
|
# Déterminer quel champ contient le contenu HTML
|
||||||
|
message_body = None
|
||||||
|
message_id = None
|
||||||
|
|
||||||
|
# Différentes possibilités de noms pour le contenu HTML et l'ID
|
||||||
|
for body_key in ["body", "content", "html_content", "message"]:
|
||||||
|
if body_key in message and message[body_key]:
|
||||||
|
message_body = message[body_key]
|
||||||
|
break
|
||||||
|
|
||||||
|
for id_key in ["id", "message_id", "uid"]:
|
||||||
|
if id_key in message:
|
||||||
|
message_id = message[id_key]
|
||||||
|
break
|
||||||
|
|
||||||
|
if not message_body or not message_id:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Méthode 1: Extraction depuis les balises <img> dans le HTML
|
||||||
|
try:
|
||||||
|
# Analyser le HTML du message
|
||||||
|
soup = BeautifulSoup(message_body, "html.parser")
|
||||||
|
|
||||||
|
# Trouver toutes les balises <img>
|
||||||
|
img_tags = soup.find_all("img")
|
||||||
|
|
||||||
|
for img in img_tags:
|
||||||
|
# Utiliser la méthode sécurisée pour récupérer les attributs
|
||||||
|
src = self._get_tag_attribute(img, "src")
|
||||||
|
|
||||||
|
# Ignorer les images vides ou data URLs
|
||||||
|
if not src or src.startswith("data:"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Différents patterns de référence d'images
|
||||||
|
image_id = None
|
||||||
|
|
||||||
|
# Pattern 1: /web/image/ID?access_token=...
|
||||||
|
match = re.search(r"/web/image/(\d+)", src)
|
||||||
|
if match:
|
||||||
|
image_id = int(match.group(1))
|
||||||
|
|
||||||
|
# Pattern 2: /web/content/ID?...
|
||||||
|
if not image_id:
|
||||||
|
match = re.search(r"/web/content/(\d+)", src)
|
||||||
|
if match:
|
||||||
|
image_id = int(match.group(1))
|
||||||
|
|
||||||
|
# Pattern 3: /web/static/ID?...
|
||||||
|
if not image_id:
|
||||||
|
match = re.search(r"/web/static/(\d+)", src)
|
||||||
|
if match:
|
||||||
|
image_id = int(match.group(1))
|
||||||
|
|
||||||
|
# Pattern 4: /web/binary/image?id=ID&...
|
||||||
|
if not image_id:
|
||||||
|
match = re.search(r"[?&]id=(\d+)", src)
|
||||||
|
if match:
|
||||||
|
image_id = int(match.group(1))
|
||||||
|
|
||||||
|
if image_id:
|
||||||
|
self._ajouter_reference_image(image_id, message_id, attachments_by_id, img, processed_ids, image_references)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de l'analyse des balises <img> dans le message {message_id}: {e}")
|
||||||
|
|
||||||
|
# Méthode 2: Extraction depuis les références textuelles à la fin du message
|
||||||
|
# Format: "- Nom_image.ext (image/type) [ID: 12345]"
|
||||||
|
try:
|
||||||
|
# Chercher des références d'images dans le texte du message
|
||||||
|
# Pattern des références: "- Nom_fichier.ext (type/mime) [ID: 12345]"
|
||||||
|
img_ref_pattern = r"- ([^\(\)]+) \(([^\(\)]*)\) \[ID: (\d+)\]"
|
||||||
|
for match in re.finditer(img_ref_pattern, message_body):
|
||||||
|
try:
|
||||||
|
nom_fichier = match.group(1).strip()
|
||||||
|
mimetype = match.group(2).strip()
|
||||||
|
image_id = int(match.group(3))
|
||||||
|
|
||||||
|
if image_id in processed_ids:
|
||||||
|
continue
|
||||||
|
|
||||||
|
processed_ids.add(image_id)
|
||||||
|
|
||||||
|
# Vérifier si cette image est dans nos pièces jointes
|
||||||
|
if image_id in attachments_by_id:
|
||||||
|
attachment = attachments_by_id[image_id]
|
||||||
|
|
||||||
|
# Récupérer le chemin local de l'image
|
||||||
|
local_path = attachment.get("local_path")
|
||||||
|
|
||||||
|
# Vérifier que le fichier existe réellement
|
||||||
|
if local_path and not os.path.exists(local_path):
|
||||||
|
# Essayer de chercher dans d'autres endroits potentiels du répertoire
|
||||||
|
for root, dirs, files in os.walk(self.ticket_dir):
|
||||||
|
for file in files:
|
||||||
|
if os.path.basename(local_path) == file:
|
||||||
|
local_path = os.path.join(root, file)
|
||||||
|
break
|
||||||
|
if os.path.exists(local_path):
|
||||||
|
break
|
||||||
|
|
||||||
|
image_ref = {
|
||||||
|
"image_id": image_id,
|
||||||
|
"message_id": message_id,
|
||||||
|
"attachment_id": attachment.get("id", attachment.get("attachment_id", 0)),
|
||||||
|
"name": nom_fichier, # Utiliser le nom trouvé dans le texte
|
||||||
|
"mimetype": mimetype, # Utiliser le type MIME trouvé dans le texte
|
||||||
|
"file_size": attachment.get("file_size", 0),
|
||||||
|
"local_path": local_path,
|
||||||
|
"source": "text_reference"
|
||||||
|
}
|
||||||
|
|
||||||
|
image_references.append(image_ref)
|
||||||
|
logging.info(f"Image référencée trouvée dans le texte: ID {image_id} dans message {message_id}")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors du traitement de la référence d'image textuelle: {e}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de l'analyse des références textuelles dans le message {message_id}: {e}")
|
||||||
|
|
||||||
|
# Sauvegarder les références trouvées
|
||||||
|
result = {
|
||||||
|
"status": "success" if image_references else "warning",
|
||||||
|
"message": f"Trouvé {len(image_references)} références d'images intégrées",
|
||||||
|
"references": image_references
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(self.output_file, 'w', encoding='utf-8') as f:
|
||||||
|
json.dump(result, f, indent=2, ensure_ascii=False)
|
||||||
|
logging.info(f"Références d'images sauvegardées dans: {self.output_file}")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de la sauvegarde des références d'images: {e}")
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _ajouter_reference_image(self, image_id: int, message_id: str, attachments_by_id: Dict[int, Dict[str, Any]],
|
||||||
|
img: Any, processed_ids: Set[int], image_references: List[Dict[str, Any]]) -> None:
|
||||||
|
"""
|
||||||
|
Ajoute une référence d'image à la liste des références
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_id: ID de l'image
|
||||||
|
message_id: ID du message
|
||||||
|
attachments_by_id: Dictionnaire des pièces jointes indexées par ID
|
||||||
|
img: Balise HTML de l'image
|
||||||
|
processed_ids: Ensemble des IDs déjà traités
|
||||||
|
image_references: Liste des références d'images à enrichir
|
||||||
|
"""
|
||||||
|
# Éviter les duplications
|
||||||
|
if image_id in processed_ids:
|
||||||
|
return
|
||||||
|
|
||||||
|
processed_ids.add(image_id)
|
||||||
|
|
||||||
|
# Vérifier si cette image est dans nos pièces jointes
|
||||||
|
if image_id in attachments_by_id:
|
||||||
|
attachment = attachments_by_id[image_id]
|
||||||
|
|
||||||
|
# Récupérer les attributs de manière sécurisée
|
||||||
|
width = self._get_tag_attribute(img, "width")
|
||||||
|
height = self._get_tag_attribute(img, "height")
|
||||||
|
alt = self._get_tag_attribute(img, "alt")
|
||||||
|
|
||||||
|
# Récupérer le chemin local de l'image
|
||||||
|
local_path = attachment.get("local_path")
|
||||||
|
|
||||||
|
# Vérifier que le fichier existe réellement
|
||||||
|
if local_path and not os.path.exists(local_path):
|
||||||
|
# Essayer de chercher dans d'autres endroits potentiels du répertoire
|
||||||
|
for root, dirs, files in os.walk(self.ticket_dir):
|
||||||
|
for file in files:
|
||||||
|
if os.path.basename(local_path) == file:
|
||||||
|
local_path = os.path.join(root, file)
|
||||||
|
break
|
||||||
|
if os.path.exists(local_path):
|
||||||
|
break
|
||||||
|
|
||||||
|
image_ref = {
|
||||||
|
"image_id": image_id,
|
||||||
|
"message_id": message_id,
|
||||||
|
"attachment_id": attachment.get("id", attachment.get("attachment_id", 0)),
|
||||||
|
"name": attachment.get("name", ""),
|
||||||
|
"mimetype": attachment.get("mimetype", ""),
|
||||||
|
"file_size": attachment.get("file_size", 0),
|
||||||
|
"local_path": local_path,
|
||||||
|
"img_width": width,
|
||||||
|
"img_height": height,
|
||||||
|
"img_alt": alt,
|
||||||
|
"source": "html_img_tag"
|
||||||
|
}
|
||||||
|
|
||||||
|
image_references.append(image_ref)
|
||||||
|
logging.info(f"Image intégrée trouvée: ID {image_id} dans message {message_id}")
|
||||||
|
|
||||||
|
def get_image_paths(self) -> List[str]:
|
||||||
|
"""
|
||||||
|
Récupère les chemins des images référencées.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des chemins locaux des images référencées
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Tenter d'extraire les images
|
||||||
|
data = self.extract_image_references()
|
||||||
|
|
||||||
|
# Récupérer les chemins locaux des images
|
||||||
|
paths = []
|
||||||
|
for ref in data.get("references", []):
|
||||||
|
path = ref.get("local_path")
|
||||||
|
if path and os.path.exists(path):
|
||||||
|
paths.append(path)
|
||||||
|
|
||||||
|
if not paths:
|
||||||
|
logging.warning("Aucune image intégrée trouvée ou les chemins sont invalides")
|
||||||
|
|
||||||
|
return paths
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Erreur lors de la récupération des chemins d'images: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
def extract_images_from_ticket(ticket_dir: str) -> List[str]:
|
||||||
|
"""
|
||||||
|
Fonction utilitaire pour extraire les images intégrées dans les messages HTML d'un ticket.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ticket_dir: Répertoire du ticket contenant les messages et pièces jointes
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste des chemins locaux des images référencées
|
||||||
|
"""
|
||||||
|
extractor = HtmlImageExtractor(ticket_dir)
|
||||||
|
return extractor.get_image_paths()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Test avec un répertoire de ticket spécifique
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
ticket_dir = sys.argv[1]
|
||||||
|
else:
|
||||||
|
# Utiliser un répertoire de test par défaut
|
||||||
|
ticket_dir = "./output/ticket_T0241/T0241_20250409_141018"
|
||||||
|
|
||||||
|
if not os.path.exists(ticket_dir):
|
||||||
|
print(f"Répertoire introuvable: {ticket_dir}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"Extraction des images intégrées dans le HTML pour le ticket: {os.path.basename(ticket_dir)}")
|
||||||
|
|
||||||
|
extractor = HtmlImageExtractor(ticket_dir)
|
||||||
|
result = extractor.extract_image_references()
|
||||||
|
|
||||||
|
print(f"Statut: {result['status']}")
|
||||||
|
print(f"Message: {result['message']}")
|
||||||
|
print(f"Nombre de références trouvées: {len(result['references'])}")
|
||||||
|
|
||||||
|
for i, ref in enumerate(result["references"]):
|
||||||
|
print(f"\nImage {i+1}:")
|
||||||
|
print(f" ID: {ref['image_id']}")
|
||||||
|
print(f" Nom: {ref['name']}")
|
||||||
|
print(f" Type: {ref['mimetype']}")
|
||||||
|
print(f" Taille: {ref['file_size']} octets")
|
||||||
|
print(f" Chemin local: {ref['local_path']}")
|
||||||
|
|
||||||
|
# Récupérer les chemins des images
|
||||||
|
paths = extractor.get_image_paths()
|
||||||
|
print(f"\nChemins des images ({len(paths)}):")
|
||||||
|
for path in paths:
|
||||||
|
print(f" {path}")
|
||||||