294 lines
13 KiB
HTML
294 lines
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 %}
|