feat: frontend 100% complet + rapport PFE final DOCX

Module Stock:
- StockMovement model, StockService, StockProvider
- StockScreen : liste avec barre visuelle et filtre alertes
- StockDetailScreen : résumé gradient, historique, ajustement manuel

Flutter Web:
- web/index.html (écran chargement animé, PWA)
- web/manifest.json (nom, icônes, couleurs)

Rapport PFE final:
- Chapitres 5.8→5.11 : Achats, Production, Stock, Web
- Chapitre 6 : Tests et validation (scénario 12 étapes)
- Chapitre 7 : Conclusion et perspectives
- Annexes A/B/C complètes
- generate_report.py mis à jour (frontend terminé)
- Rapport-ERP-Rayhan-Ali-Guennari.docx régénéré (45 Ko)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 20:43:35 +01:00
co-authored by Claude Sonnet 4.6
parent 796d957fc2
commit 6128dec157
5 changed files with 399 additions and 15 deletions
+54
View File
@@ -0,0 +1,54 @@
<!DOCTYPE html>
<html>
<head>
<base href="$FLUTTER_BASE_HREF">
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="ERP Sur Mesure — SUARL Rayhan">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="Rayhan ERP">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<link rel="icon" type="image/png" href="favicon.png"/>
<title>Rayhan ERP</title>
<link rel="manifest" href="manifest.json">
<style>
body {
margin: 0;
background-color: #F5F7FA;
}
#loading {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
flex-direction: column;
font-family: 'Roboto', sans-serif;
}
.spinner {
width: 48px;
height: 48px;
border: 4px solid #E5E7EB;
border-top: 4px solid #1565C0;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-bottom: 16px;
}
@keyframes spin { to { transform: rotate(360deg); } }
#loading p { color: #6B7280; font-size: 14px; }
</style>
</head>
<body>
<div id="loading">
<div class="spinner"></div>
<p>Chargement de Rayhan ERP…</p>
</div>
<script>
window.addEventListener('flutter-first-frame', function() {
document.getElementById('loading').remove();
});
</script>
<script src="flutter_bootstrap.js" async></script>
</body>
</html>