ncantu 1fd8ddf8b0 fix: Résolution des erreurs DNS et Broken Pipe
- Ajout endpoint manquant /api/notary/document/{id}/status
- Correction erreur BrokenPipeError dans le serveur web
- Création de ressources CSS/JS locales pour éviter les erreurs DNS
- Bootstrap CSS minimal local (bootstrap.min.css)
- Chart.js minimal local (chart.min.js)
- Font Awesome minimal local (fontawesome.min.css)
- Gestion d'erreurs de connexion fermée par le client
- Interface web fonctionnelle sans dépendances externes
- Aperçu PDF avec PDF.js fonctionnel
- Polling de statut des documents opérationnel
2025-09-09 07:45:15 +02:00

442 lines
22 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>4NK Notariat - Traitement de Documents</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📄</text></svg>">
<link href="bootstrap.min.css" rel="stylesheet">
<link href="fontawesome.min.css" rel="stylesheet">
<style>
.upload-area {
border: 2px dashed #007bff;
border-radius: 10px;
padding: 40px;
text-align: center;
background-color: #f8f9fa;
transition: all 0.3s ease;
}
.upload-area:hover {
border-color: #0056b3;
background-color: #e3f2fd;
}
.upload-area.dragover {
border-color: #28a745;
background-color: #d4edda;
}
.document-card {
transition: transform 0.2s ease;
}
.document-card:hover {
transform: translateY(-2px);
}
.status-badge {
font-size: 0.8em;
}
.progress-container {
display: none;
}
.analysis-section {
display: none;
}
.entity-item {
background-color: #f8f9fa;
border-left: 4px solid #007bff;
padding: 10px;
margin: 5px 0;
}
.verification-item {
background-color: #f8f9fa;
border-left: 4px solid #28a745;
padding: 10px;
margin: 5px 0;
}
.verification-item.error {
border-left-color: #dc3545;
}
.verification-item.warning {
border-left-color: #ffc107;
}
.sidebar {
background-color: #f8f9fa;
min-height: 100vh;
}
.main-content {
padding: 20px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<!-- Sidebar -->
<div class="col-md-3 sidebar p-3">
<h4 class="mb-4">
<i class="fas fa-balance-scale text-primary"></i>
4NK Notariat
</h4>
<nav class="nav flex-column">
<a class="nav-link active" href="#upload" data-section="upload">
<i class="fas fa-upload"></i> Upload Document
</a>
<a class="nav-link" href="#documents" data-section="documents">
<i class="fas fa-file-alt"></i> Documents
</a>
<a class="nav-link" href="#stats" data-section="stats">
<i class="fas fa-chart-bar"></i> Statistiques
</a>
<a class="nav-link" href="#settings" data-section="settings">
<i class="fas fa-cog"></i> Paramètres
</a>
</nav>
<hr>
<div class="mt-4">
<h6>Statut du Système</h6>
<div id="system-status">
<div class="d-flex justify-content-between">
<span>API:</span>
<span class="badge bg-success" id="api-status">Connecté</span>
</div>
<div class="d-flex justify-content-between">
<span>LLM:</span>
<span class="badge bg-success" id="llm-status">Disponible</span>
</div>
<div class="d-flex justify-content-between">
<span>APIs Externes:</span>
<span class="badge bg-success" id="external-apis-status">OK</span>
</div>
</div>
</div>
</div>
<!-- Main Content -->
<div class="col-md-9 main-content">
<!-- Upload Section -->
<div id="upload-section" class="content-section">
<h2 class="mb-4">
<i class="fas fa-upload text-primary"></i>
Upload de Document Notarial
</h2>
<div class="row">
<div class="col-md-8">
<div class="card">
<div class="card-body">
<form id="upload-form">
<div class="upload-area" id="upload-area">
<i class="fas fa-cloud-upload-alt fa-3x text-primary mb-3"></i>
<h5>Glissez-déposez votre document ici</h5>
<p class="text-muted">ou cliquez pour sélectionner un fichier</p>
<input type="file" id="file-input" class="d-none" accept=".pdf,.jpg,.jpeg,.png,.tiff,.heic">
<button type="button" class="btn btn-primary" onclick="document.getElementById('file-input').click()">
<i class="fas fa-folder-open"></i> Sélectionner un fichier
</button>
</div>
<div class="mt-4">
<div class="row">
<div class="col-md-6">
<label for="id-dossier" class="form-label">ID Dossier *</label>
<input type="text" class="form-control" id="id-dossier" required>
</div>
<div class="col-md-6">
<label for="etude-id" class="form-label">ID Étude *</label>
<input type="text" class="form-control" id="etude-id" required>
</div>
</div>
<div class="row mt-3">
<div class="col-md-6">
<label for="utilisateur-id" class="form-label">ID Utilisateur *</label>
<input type="text" class="form-control" id="utilisateur-id" required>
</div>
<div class="col-md-6">
<label for="type-document" class="form-label">Type de Document Attendu</label>
<select class="form-select" id="type-document">
<option value="">Auto-détection</option>
<option value="acte_vente">Acte de Vente</option>
<option value="acte_donation">Acte de Donation</option>
<option value="acte_succession">Acte de Succession</option>
<option value="cni">Carte d'Identité</option>
<option value="contrat">Contrat</option>
</select>
</div>
</div>
</div>
<div class="mt-4">
<button type="submit" class="btn btn-success btn-lg">
<i class="fas fa-play"></i> Traiter le Document
</button>
</div>
</form>
<!-- Progress -->
<div class="progress-container mt-4">
<div class="progress">
<div class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar" style="width: 0%"></div>
</div>
<div class="mt-2">
<small class="text-muted" id="progress-text">Initialisation...</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
<h6><i class="fas fa-info-circle"></i> Informations</h6>
</div>
<div class="card-body">
<h6>Formats supportés:</h6>
<ul class="list-unstyled">
<li><i class="fas fa-file-pdf text-danger"></i> PDF</li>
<li><i class="fas fa-file-image text-primary"></i> JPEG, PNG</li>
<li><i class="fas fa-file-image text-info"></i> TIFF, HEIC</li>
</ul>
<h6 class="mt-3">Traitement:</h6>
<ul class="list-unstyled">
<li><i class="fas fa-eye"></i> OCR et extraction de texte</li>
<li><i class="fas fa-tags"></i> Classification automatique</li>
<li><i class="fas fa-search"></i> Extraction d'entités</li>
<li><i class="fas fa-check-circle"></i> Vérifications externes</li>
<li><i class="fas fa-brain"></i> Analyse LLM</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- Documents Section -->
<div id="documents-section" class="content-section" style="display: none;">
<h2 class="mb-4">
<i class="fas fa-file-alt text-primary"></i>
Documents Traités
</h2>
<div class="row mb-3">
<div class="col-md-6">
<input type="text" class="form-control" id="search-documents" placeholder="Rechercher un document...">
</div>
<div class="col-md-3">
<select class="form-select" id="filter-status">
<option value="">Tous les statuts</option>
<option value="processing">En cours</option>
<option value="completed">Terminé</option>
<option value="error">Erreur</option>
</select>
</div>
<div class="col-md-3">
<select class="form-select" id="filter-type">
<option value="">Tous les types</option>
<option value="acte_vente">Acte de Vente</option>
<option value="acte_donation">Acte de Donation</option>
<option value="acte_succession">Acte de Succession</option>
<option value="cni">Carte d'Identité</option>
<option value="contrat">Contrat</option>
</select>
</div>
</div>
<div id="documents-list">
<!-- Documents will be loaded here -->
</div>
</div>
<!-- Statistics Section -->
<div id="stats-section" class="content-section" style="display: none;">
<h2 class="mb-4">
<i class="fas fa-chart-bar text-primary"></i>
Statistiques
</h2>
<div class="row">
<div class="col-md-3">
<div class="card text-center">
<div class="card-body">
<i class="fas fa-file-alt fa-2x text-primary mb-2"></i>
<h4 id="total-documents">0</h4>
<p class="text-muted">Documents traités</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center">
<div class="card-body">
<i class="fas fa-clock fa-2x text-warning mb-2"></i>
<h4 id="processing-documents">0</h4>
<p class="text-muted">En cours</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center">
<div class="card-body">
<i class="fas fa-check-circle fa-2x text-success mb-2"></i>
<h4 id="success-rate">0%</h4>
<p class="text-muted">Taux de réussite</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card text-center">
<div class="card-body">
<i class="fas fa-stopwatch fa-2x text-info mb-2"></i>
<h4 id="avg-time">0s</h4>
<p class="text-muted">Temps moyen</p>
</div>
</div>
</div>
</div>
<div class="row mt-4">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h6>Types de Documents</h6>
</div>
<div class="card-body">
<canvas id="document-types-chart"></canvas>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h6>Évolution Temporelle</h6>
</div>
<div class="card-body">
<canvas id="timeline-chart"></canvas>
</div>
</div>
</div>
</div>
</div>
<!-- Settings Section -->
<div id="settings-section" class="content-section" style="display: none;">
<h2 class="mb-4">
<i class="fas fa-cog text-primary"></i>
Paramètres
</h2>
<div class="row">
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h6>Configuration API</h6>
</div>
<div class="card-body">
<div class="mb-3">
<label for="api-url" class="form-label">URL de l'API</label>
<input type="text" class="form-control" id="api-url" value="http://localhost:8000">
</div>
<div class="mb-3">
<label for="llm-model" class="form-label">Modèle LLM</label>
<select class="form-select" id="llm-model">
<option value="llama3:8b">Llama 3 8B</option>
<option value="mistral:7b">Mistral 7B</option>
</select>
</div>
<button class="btn btn-primary" onclick="testConnection()">
<i class="fas fa-plug"></i> Tester la Connexion
</button>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header">
<h6>APIs Externes</h6>
</div>
<div class="card-body">
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="enable-cadastre" checked>
<label class="form-check-label" for="enable-cadastre">
Cadastre
</label>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="enable-georisques" checked>
<label class="form-check-label" for="enable-georisques">
Géorisques
</label>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="enable-bodacc" checked>
<label class="form-check-label" for="enable-bodacc">
BODACC
</label>
</div>
</div>
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="enable-gel-avoirs" checked>
<label class="form-check-label" for="enable-gel-avoirs">
Gel des Avoirs
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Document Analysis Modal -->
<div class="modal fade" id="analysisModal" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-search"></i> Analyse du Document
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div id="analysis-content">
<!-- Analysis content will be loaded here -->
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
<button type="button" class="btn btn-primary" onclick="downloadReport()">
<i class="fas fa-download"></i> Télécharger le Rapport
</button>
</div>
</div>
</div>
</div>
<script src="chart.min.js"></script>
<script src="app.js"></script>
<script>
// Initialisation de l'application après chargement de app.js
document.addEventListener('DOMContentLoaded', function() {
if (typeof NotaryApp !== 'undefined') {
window.notaryApp = new NotaryApp();
} else {
console.error('NotaryApp class not found');
}
});
</script>
</body>
</html>