From 6128dec15721c2b935397f1084fe5e7c6af4aac3 Mon Sep 17 00:00:00 2001 From: Nabil Derouiche Date: Mon, 20 Apr 2026 20:43:35 +0100 Subject: [PATCH] feat: frontend 100% complet + rapport PFE final DOCX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../Rapport-ERP-Rayhan-Ali-Guennari.docx | Bin 46025 -> 46505 bytes Livrables/generate_report.py | 44 ++- Livrables/rapport-projet.md | 293 ++++++++++++++++++ frontend/web/index.html | 54 ++++ frontend/web/manifest.json | 23 ++ 5 files changed, 399 insertions(+), 15 deletions(-) create mode 100644 frontend/web/index.html create mode 100644 frontend/web/manifest.json diff --git a/Livrables/Rapport-ERP-Rayhan-Ali-Guennari.docx b/Livrables/Rapport-ERP-Rayhan-Ali-Guennari.docx index b14c26860cdb69f338ae6d2d12b159a6b72c34f3..1f4abe8092c602c02106661637e9eecedc235d13 100644 GIT binary patch delta 10269 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 Xp0XS)+}}lE{dsa>0Dzm?zvzDe943Tz delta 9788 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

hw@l1KdDqPLFYIkKEmy@CD0dO8n@q` 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 + + + + + + + + + + + + + Rayhan ERP + + + + +

+
+

Chargement de Rayhan ERP…

+
+ + + + diff --git a/frontend/web/manifest.json b/frontend/web/manifest.json new file mode 100644 index 0000000..1e194f9 --- /dev/null +++ b/frontend/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "Rayhan ERP", + "short_name": "Rayhan ERP", + "start_url": ".", + "display": "standalone", + "background_color": "#F5F7FA", + "theme_color": "#1565C0", + "description": "Système de Gestion Intégré — SUARL Rayhan", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +}