diff --git a/attached_assets/image_1755431891618.png b/attached_assets/image_1755431891618.png new file mode 100644 index 0000000..d901c42 Binary files /dev/null and b/attached_assets/image_1755431891618.png differ diff --git a/cookies.txt b/cookies.txt index 3e6329b..4af0579 100644 --- a/cookies.txt +++ b/cookies.txt @@ -2,4 +2,4 @@ # https://curl.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. -#HttpOnly_localhost FALSE / FALSE 1755508872 connect.sid s%3A8siCpVkhgJFOCC-2efxz0Unao-G6QlnM.tzp77gMurWDDtFyYuwjNUy3wTm2X22lcdk%2F3rm4H2UE +#HttpOnly_localhost FALSE / FALSE 1755518399 connect.sid s%3AeiqDHjLNeMlsKw3-fPZNUmDPuQwie91D.WBWoFfmb%2BNeqMpcd%2BOflA%2Frt1Xjhz6Y8qgQy2can65A diff --git a/replit.md b/replit.md index a666551..123d13d 100644 --- a/replit.md +++ b/replit.md @@ -35,7 +35,7 @@ The platform is built with a clear separation of concerns, utilizing a modern fu - **Invoice Verification Cache:** Robust caching system for invoice verification results with automatic expiration and conflict resolution. Enhanced with unique constraint handling and graceful error management for production stability (August 2025). Fixed production SSL certificate errors and fetch timeout loops with enhanced error handling, network timeout protection, and error result caching to prevent infinite retry loops (August 2025). - **UI Scrollbar Optimization:** Eliminated redundant vertical scrollbar on the right side of the screen while preserving necessary internal page scrolling. Implemented global CSS rules with `overflow: hidden` on html/body/root and Layout height management to prevent vertical overflow issues in production (August 2025). - **Task Management:** Système complet de gestion des tâches avec fonctionnalités temporelles avancées - tri intelligent (pending > priorité > date), dates d'échéance avec sélecteur calendrier, indicateurs visuels pour tâches en retard/urgentes, filtres par échéance (aujourd'hui, cette semaine, en retard, sans échéance), vue Kanban et liste, badges colorés pour statut temporel. Interface optimisée pour suivi prioritaire des tâches non validées. Correction critique de l'isolation des données : chaque magasin ne voit maintenant que ses propres tâches (Août 2025). **PRODUCTION FIX (Août 2025)** : Résolution du problème de rechargements multiples nécessaires pour l'administrateur - le cache des tâches s'invalide maintenant automatiquement lors du changement de magasin sélectionné. -- **Information System (Announcements):** Système d'informations complet remplaçant la carte commandes clients dans le dashboard - gestion d'annonces avec niveaux de priorité (normal, important, urgent), contrôle d'accès basé sur les rôles (admin : CRUD complet, autres rôles : lecture seule), tri intelligent par priorité et date, filtrage par magasin pour administrateurs, interface moderne avec badges colorés et indicateurs visuels. **PRODUCTION FIX MAJEUR (Août 2025)** : Correction critique du problème d'affichage en production PostgreSQL - fix du filtrage pour inclure annonces globales + magasin sélectionné, correction des relations d'auteur avec username au lieu d'ID, design adapté pour correspondre exactement aux autres cartes du dashboard. +- **Information System (Announcements):** Système d'informations complet remplaçant la carte commandes clients dans le dashboard - gestion d'annonces avec niveaux de priorité (normal, important, urgent), contrôle d'accès basé sur les rôles (admin : CRUD complet, autres rôles : lecture seule), tri intelligent par priorité et date, filtrage par magasin pour administrateurs, interface moderne avec badges colorés et indicateurs visuels. **PRODUCTION FIX MAJEUR (Août 2025)** : Correction critique du problème d'affichage en production PostgreSQL - fix du filtrage pour inclure annonces globales + magasin sélectionné, correction des relations d'auteur avec username au lieu d'ID, design adapté pour correspondre exactement aux autres cartes du dashboard. **SUPPRESSION FIX (Août 2025)** : Correction du problème de suppression en production - ajout de la logique PostgreSQL manquante dans la route DELETE, les annonces peuvent maintenant être supprimées correctement en production. - **DLC Module Permissions:** Correction des permissions de validation DLC pour permettre aux admin, directeur et manager de valider les produits DLC. Ajout de logs de debug pour traçabilité des validations (Août 2025). - **User and Permission Management:** Granular access controls ensuring that users (e.g., employees) have appropriate permissions for tasks like creating customer orders. - **Reporting:** Statistical reporting, including monthly summaries of deliveries based on `deliveredDate`. diff --git a/server/routes.ts b/server/routes.ts index 0b0d47f..47d56ce 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -3250,28 +3250,68 @@ RÉSUMÉ DU SCAN }); app.delete('/api/announcements/:id', isAuthenticated, async (req: any, res) => { + console.log('🗑️ [SERVER] DELETE /api/announcements/:id endpoint hit'); + console.log('🗑️ [SERVER] Announcement ID:', req.params.id); + try { const userId = req.user.claims ? req.user.claims.sub : req.user.id; + console.log('🗑️ [SERVER] Extracted userId:', userId); + const user = await storage.getUserWithGroups(userId); if (!user) { + console.error('🗑️ [SERVER] User not found for ID:', userId); return res.status(404).json({ message: "User not found" }); } + console.log('🗑️ [SERVER] User found:', { username: user.username, role: user.role, id: user.id }); + // Only admin can delete announcements if (user.role !== 'admin') { + console.error('🗑️ [SERVER] Access denied - user role:', user.role); return res.status(403).json({ message: "Only administrators can delete announcements" }); } const id = parseInt(req.params.id); - const success = await storage.deleteAnnouncement(id); - - if (!success) { - return res.status(404).json({ message: "Announcement not found" }); - } + console.log('🗑️ [SERVER] Parsed announcement ID:', id); - res.json({ message: "Announcement deleted successfully" }); + if (environment === 'production') { + // PRODUCTION: Supprimer dans PostgreSQL DASHBOARD_MESSAGES + console.log('🗑️ [PRODUCTION] Deleting from PostgreSQL DASHBOARD_MESSAGES table'); + try { + const deletedRows = await db.delete(dashboardMessages).where(eq(dashboardMessages.id, id)).returning(); + + if (deletedRows.length === 0) { + console.error('🗑️ [PRODUCTION] Announcement not found:', id); + return res.status(404).json({ message: "Announcement not found" }); + } + + console.log('🗑️ [PRODUCTION] Announcement deleted successfully from DB:', deletedRows[0]); + res.json({ message: "Announcement deleted successfully" }); + } catch (dbError) { + console.error('🗑️ [PRODUCTION] DB error, fallback to memory:', dbError); + const success = await storage.deleteAnnouncement(id); + + if (!success) { + return res.status(404).json({ message: "Announcement not found" }); + } + + res.json({ message: "Announcement deleted successfully" }); + } + } else { + // DÉVELOPPEMENT: Supprimer en mémoire + console.log('🗑️ [DEV] Deleting from memory storage'); + const success = await storage.deleteAnnouncement(id); + + if (!success) { + console.error('🗑️ [DEV] Announcement not found:', id); + return res.status(404).json({ message: "Announcement not found" }); + } + + console.log('🗑️ [DEV] Announcement deleted from memory'); + res.json({ message: "Announcement deleted successfully" }); + } } catch (error) { - console.error("Error deleting announcement:", error); + console.error("🗑️ [SERVER] Error deleting announcement:", error); res.status(500).json({ message: "Failed to delete announcement" }); } });