gmao/app_new/templates/outlook/processed_folders.html
2026-08-14 16:02:25 +00:00

294 lines
No EOL
13 KiB
HTML

{% extends "base.html" %}
{% block title %}Dossiers Traités - GMAO{% endblock %}
{% block content %}
<div class="container mt-4">
<div class="row">
<div class="col-12">
<h2><i class="bi bi-folder2-open me-2"></i>Configuration des dossiers "Traités"</h2>
<p class="text-muted">
Configurez les dossiers où les messages seront déplacés après acceptation ou refus d'une intervention.
</p>
</div>
</div>
<div class="row mt-4">
<!-- Outlook -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-microsoft-outlook me-2"></i>Dossier Outlook</h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">ID du dossier</label>
<input type="text" class="form-control" id="outlook_folder_id"
placeholder="AQMkADM0NTFhNTg2LTYxYTQtNDM2MC1iZDQz...">
</div>
<div class="mb-3">
<label class="form-label">Nom du dossier (optionnel)</label>
<input type="text" class="form-control" id="outlook_folder_name"
placeholder="Traités">
</div>
<div class="alert alert-info">
<h6><i class="bi bi-info-circle me-1"></i>Comment trouver l'ID du dossier Outlook</h6>
<ol class="mb-0 small">
<li>Ouvrez Outlook dans votre navigateur</li>
<li>Naviguez vers le dossier "Traités"</li>
<li>Copiez l'URL depuis la barre d'adresse</li>
<li>L'ID est la partie après <code>/mail/</code> et avant <code>/id/</code></li>
<li>Exemple d'URL: <code>https://outlook.cloud.microsoft/mail/<strong>AQMkADM0NTFh...</strong>/id/...</code></li>
<li>Collez l'ID ou l'URL complète ci-dessus</li>
</ol>
</div>
</div>
</div>
</div>
<!-- ENT -->
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-chat-dots me-2"></i>Dossier ENT</h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">ID du dossier</label>
<input type="text" class="form-control" id="ent_folder_id"
placeholder="7c8daa60-b59a-4acf-a97d-97c71ef9b596">
</div>
<div class="mb-3">
<label class="form-label">Nom du dossier (optionnel)</label>
<input type="text" class="form-control" id="ent_folder_name"
placeholder="Traités">
</div>
<div class="alert alert-info">
<h6><i class="bi bi-info-circle me-1"></i>Comment trouver l'ID du dossier ENT</h6>
<ol class="mb-0 small">
<li>Connectez-vous à l'ENT</li>
<li>Allez dans la messagerie</li>
<li>Naviguez vers le dossier "Traités"</li>
<li>Copiez l'URL depuis la barre d'adresse</li>
<li>L'ID est la dernière partie de l'URL</li>
<li>Exemple: <code>https://ent77.seine-et-marne.fr/conversation/folder/<strong>7c8daa60-b59a...</strong></code></li>
</ol>
</div>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-12">
<button class="btn btn-primary" onclick="saveConfig()">
<i class="bi bi-save me-1"></i>Sauvegarder les dossiers
</button>
<span id="status" class="ms-3"></span>
</div>
</div>
<!-- Configuration PRONOTE -->
<div class="row mt-5">
<div class="col-12">
<h3><i class="bi bi-calendar-week me-2"></i>Synchronisation PRONOTE</h3>
<p class="text-muted">
Configurez la synchronisation automatique des plannings de salles depuis PRONOTE.
</p>
</div>
</div>
<div class="row mt-3">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-gear me-2"></i>Configuration</h5>
</div>
<div class="card-body">
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="pronote_sync_enabled">
<label class="form-check-label" for="pronote_sync_enabled">Activer la synchronisation automatique</label>
</div>
<div class="mb-3">
<label class="form-label">Intervalle de synchronisation (minutes)</label>
<input type="number" class="form-control" id="pronote_sync_interval"
value="360" min="30" max="1440">
<small class="text-muted">Par défaut: 360 minutes (6 heures)</small>
</div>
<div class="mb-3">
<label class="form-label">Nombre de semaines à synchroniser</label>
<input type="number" class="form-control" id="pronote_sync_weeks"
value="4" min="1" max="12">
<small class="text-muted">Par défaut: 4 semaines (semaine actuelle + 3 suivantes)</small>
</div>
<button class="btn btn-success" onclick="savePronoteConfig()">
<i class="bi bi-save me-1"></i>Sauvegarder la configuration PRONOTE
</button>
<span id="pronote_status" class="ms-3"></span>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-info-circle me-2"></i>Informations</h5>
</div>
<div class="card-body">
<div class="alert alert-info">
<h6><i class="bi bi-calendar3 me-1"></i>Fonctionnement</h6>
<ul class="mb-0 small">
<li>Le watchdog synchronise les plannings de toutes les salles d'enseignement</li>
<li>Chaque salle voit son planning importé pour le nombre de semaines configuré</li>
<li>Les anciens plannings sont remplacés par les nouveaux</li>
</ul>
</div>
<div class="alert alert-warning">
<h6><i class="bi bi-exclamation-triangle me-1"></i>Prérequis</h6>
<ul class="mb-0 small">
<li>Une connexion PRONOTE doit être active</li>
<li>Les salles doivent être configurées comme "salle d'enseignement" dans GMAO</li>
</ul>
</div>
<div class="mt-3">
<strong>Statut watchdog:</strong> <span id="watchdog_status">Vérification...</span>
</div>
<div class="mt-2">
<strong>Dernière synchronisation:</strong> <span id="last_sync">--</span>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
loadConfig();
loadPronoteConfig();
checkWatchdogStatus();
});
function loadConfig() {
fetch('/outlook/api/processed-folders')
.then(r => r.json())
.then(data => {
document.getElementById('outlook_folder_id').value = data.outlook_folder_id || '';
document.getElementById('outlook_folder_name').value = data.outlook_folder_name || '';
document.getElementById('ent_folder_id').value = data.ent_folder_id || '';
document.getElementById('ent_folder_name').value = data.ent_folder_name || '';
});
}
function loadPronoteConfig() {
fetch('/outlook/api/pronote-config')
.then(r => r.json())
.then(data => {
document.getElementById('pronote_sync_enabled').checked = data.pronote_sync_enabled || false;
document.getElementById('pronote_sync_interval').value = data.pronote_sync_interval || 360;
document.getElementById('pronote_sync_weeks').value = data.pronote_sync_weeks || 4;
if (data.last_sync) {
document.getElementById('last_sync').textContent = data.last_sync;
}
});
}
function checkWatchdogStatus() {
fetch('/outlook/api/pronote-watchdog-status')
.then(r => r.json())
.then(data => {
const statusEl = document.getElementById('watchdog_status');
if (data.running) {
statusEl.innerHTML = '<span class="text-success"><i class="bi bi-check-circle me-1"></i>En cours d\'exécution</span>';
} else {
statusEl.innerHTML = '<span class="text-warning"><i class="bi bi-pause-circle me-1"></i>En attente</span>';
}
})
.catch(err => {
document.getElementById('watchdog_status').innerHTML = '<span class="text-danger">Erreur</span>';
});
}
function saveConfig() {
const data = {
outlook_folder_id: document.getElementById('outlook_folder_id').value,
outlook_folder_name: document.getElementById('outlook_folder_name').value,
ent_folder_id: document.getElementById('ent_folder_id').value,
ent_folder_name: document.getElementById('ent_folder_name').value
};
// Extraire l'ID depuis une URL si l'utilisateur a collé une URL complète
if (data.outlook_folder_id.includes('outlook.cloud.microsoft')) {
// URL Outlook: https://outlook.cloud.microsoft/mail/ID/id/...
const match = data.outlook_folder_id.match(/\/mail\/([^\/]+)/);
if (match) {
data.outlook_folder_id = decodeURIComponent(match[1]);
}
}
if (data.ent_folder_id.includes('ent77.seine-et-marne.fr')) {
// URL ENT: https://ent77.seine-et-marne.fr/conversation/folder/ID
const match = data.ent_folder_id.match(/\/folder\/([^\/\?]+)/);
if (match) {
data.ent_folder_id = match[1];
}
}
fetch('/outlook/api/processed-folders', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
})
.then(r => r.json())
.then(result => {
if (result.success) {
document.getElementById('status').innerHTML =
'<span class="text-success"><i class="bi bi-check-circle me-1"></i>Configuration sauvegardée</span>';
// Recharger pour afficher les IDs extraits
setTimeout(loadConfig, 500);
} else {
document.getElementById('status').innerHTML =
'<span class="text-danger"><i class="bi bi-x-circle me-1"></i>Erreur: ' + (result.error || 'Erreur inconnue') + '</span>';
}
})
.catch(err => {
document.getElementById('status').innerHTML =
'<span class="text-danger"><i class="bi bi-x-circle me-1"></i>Erreur réseau</span>';
});
}
function savePronoteConfig() {
const data = {
pronote_sync_enabled: document.getElementById('pronote_sync_enabled').checked,
pronote_sync_interval: parseInt(document.getElementById('pronote_sync_interval').value) || 360,
pronote_sync_weeks: parseInt(document.getElementById('pronote_sync_weeks').value) || 4
};
fetch('/outlook/api/pronote-config', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
})
.then(r => r.json())
.then(result => {
if (result.success) {
document.getElementById('pronote_status').innerHTML =
'<span class="text-success"><i class="bi bi-check-circle me-1"></i>Configuration PRONOTE sauvegardée</span>';
// Relancer le watchdog si activé
if (data.pronote_sync_enabled) {
fetch('/outlook/api/pronote-watchdog-restart', {method: 'POST'})
.then(() => checkWatchdogStatus());
}
} else {
document.getElementById('pronote_status').innerHTML =
'<span class="text-danger"><i class="bi bi-x-circle me-1"></i>Erreur: ' + (result.error || 'Erreur inconnue') + '</span>';
}
})
.catch(err => {
document.getElementById('pronote_status').innerHTML =
'<span class="text-danger"><i class="bi bi-x-circle me-1"></i>Erreur réseau</span>';
});
}
</script>
{% endblock %}