Merge pull request #506 from R0m1k3/1.1

1.1
This commit is contained in:
LogiFlow authored and GitHub committed 2025-11-04 13:49:26 +01:00
commit 2ae05866b2
343 files changed
+523 -20170

No files matched your search

-45
View File
@@ -1,45 +0,0 @@
# CORRECTION URGENTE CALENDRIER PRODUCTION
## PROBLÈME IDENTIFIÉ
Votre serveur de production utilise une version différente du calendrier qui n'a pas les améliorations récentes.
## SOLUTION IMMÉDIATE
### 1. Remplacer complètement le fichier CalendarGrid.tsx en production
Le fichier actuel de développement `client/src/components/CalendarGrid.tsx` doit être copié INTÉGRALEMENT vers votre serveur de production.
### 2. Vérifications à faire après la copie
1. **Redémarrer le serveur de production**
2. **Vider le cache du navigateur** (Ctrl+F5)
3. **Vérifier que les boutons "+X autres" apparaissent**
### 3. Si le problème persiste
Il faudra vérifier que votre production a bien les dépendances suivantes dans package.json :
```json
{
"@/components/ui/dialog": "présent",
"lucide-react": "présent"
}
```
### 4. Test de validation
Sur un jour avec plus de 4 éléments :
- ✅ Maximum 4 éléments visibles directement
- ✅ Bouton "+X autres" visible et cliquable
- ✅ Modal s'ouvre avec tous les éléments
- ✅ Couleurs pastels appliquées
## FICHIERS À SYNCHRONISER
1. `client/src/components/CalendarGrid.tsx` (PRIORITÉ 1)
2. Vérifier `client/src/components/ui/dialog.tsx` existe
3. Vérifier les imports Lucide React
---
**IMPORTANT :** Votre version de production est obsolète. Le fichier de développement contient tous les correctifs nécessaires.
-67
View File
@@ -1,67 +0,0 @@
# COMMANDES PRODUCTION - Solution Immédiate
## SOLUTION URGENTE (2 minutes)
### Commande 1: Appliquer la migration DLC
```bash
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db -f - << 'EOF'
ALTER TABLE dlc_products
ADD COLUMN IF NOT EXISTS stock_epuise boolean DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS stock_epuise_by varchar(255),
ADD COLUMN IF NOT EXISTS stock_epuise_at timestamp;
CREATE INDEX IF NOT EXISTS idx_dlc_products_stock_epuise ON dlc_products(stock_epuise);
UPDATE dlc_products SET stock_epuise = false WHERE stock_epuise IS NULL;
SELECT 'Migration DLC terminée' as status;
EOF
```
### Commande 2: Redémarrer l'application
```bash
docker-compose restart logiflow
```
### Alternative si la première ne marche pas:
```bash
# Option A: Via fichier SQL
docker cp MIGRATION_PRODUCTION_URGENTE.sql [CONTAINER_NAME]:/tmp/migration.sql
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db -f /tmp/migration.sql
# Option B: Connexion directe
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db
# Dans psql, coller:
ALTER TABLE dlc_products
ADD COLUMN IF NOT EXISTS stock_epuise boolean DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS stock_epuise_by varchar(255),
ADD COLUMN IF NOT EXISTS stock_epuise_at timestamp;
CREATE INDEX IF NOT EXISTS idx_dlc_products_stock_epuise ON dlc_products(stock_epuise);
```
## Vérification
```bash
# Vérifier que les colonnes existent
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db -c "
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name='dlc_products'
AND column_name LIKE '%stock_epuise%';
"
# Vérifier les logs de l'application
docker-compose logs logiflow | tail -20
```
## Résultat attendu
```
column_name | data_type
--------------------+-------------------
stock_epuise | boolean
stock_epuise_at | timestamp without time zone
stock_epuise_by | character varying
```
L'erreur "column does not exist" disparaîtra immédiatement.
-128
View File
@@ -1,128 +0,0 @@
# CORRECTION FINALE - Erreur 500 Annonces Production
## Problème identifié
```
TypeError: announcementStorage.getAnnouncement is not a function
```
La méthode `getAnnouncement` (singulier) manque dans `server/announcementStorage.ts`.
## Solution complète à appliquer
### 1. Fichier `server/announcementStorage.ts`
**AJOUTEZ cette méthode dans la classe `AnnouncementDatabaseStorage` (après la méthode `getAnnouncements`) :**
```javascript
async getAnnouncement(id: number): Promise<AnnouncementWithRelations | null> {
console.log('🔍 [DB] Getting single announcement:', id);
const result = await db
.select({
id: dashboardMessages.id,
title: dashboardMessages.title,
content: dashboardMessages.content,
type: dashboardMessages.type,
storeId: dashboardMessages.storeId,
createdBy: dashboardMessages.createdBy,
createdAt: dashboardMessages.createdAt,
author: {
id: users.id,
firstName: users.firstName,
lastName: users.lastName,
username: users.username,
},
group: {
id: groups.id,
name: groups.name,
},
})
.from(dashboardMessages)
.leftJoin(users, eq(dashboardMessages.createdBy, users.username))
.leftJoin(groups, eq(dashboardMessages.storeId, groups.id))
.where(eq(dashboardMessages.id, id))
.limit(1);
if (result.length === 0) {
console.log('❌ [DB] Announcement not found:', id);
return null;
}
const announcement = result[0];
console.log('✅ [DB] Found announcement:', announcement.id, announcement.title);
return {
id: announcement.id,
title: announcement.title,
content: announcement.content,
type: announcement.type,
storeId: announcement.storeId,
createdBy: announcement.createdBy,
createdAt: announcement.createdAt,
author: announcement.author as User,
group: announcement.group as Group | undefined,
};
}
```
**MODIFIEZ l'interface `IAnnouncementStorage` (vers le haut du fichier) :**
```javascript
interface IAnnouncementStorage {
getAnnouncements(groupIds?: number[]): Promise<AnnouncementWithRelations[]>;
getAnnouncement(id: number): Promise<AnnouncementWithRelations | null>; // ← AJOUTEZ CETTE LIGNE
createAnnouncement(announcement: InsertAnnouncement): Promise<DashboardMessage>;
updateAnnouncement(id: number, announcement: Partial<InsertAnnouncement>): Promise<DashboardMessage>;
deleteAnnouncement(id: number): Promise<void>;
}
```
**AJOUTEZ aussi cette méthode dans la classe `AnnouncementMemoryStorage` (après `initializeTestData`) :**
```javascript
async getAnnouncement(id: number): Promise<AnnouncementWithRelations | null> {
const announcement = this.announcements.get(id);
if (!announcement) {
return null;
}
// Ajouter les relations
const users = await this.usersGetter();
const groups = await this.groupsGetter();
const author = users.find(u => u.id === announcement.createdBy || u.username === announcement.createdBy);
const group = announcement.storeId ? groups.find(g => g.id === announcement.storeId) : undefined;
return {
...announcement,
author: author || { id: announcement.createdBy, firstName: 'Utilisateur', lastName: 'Inconnu', username: announcement.createdBy } as User,
group,
};
}
```
### 2. VÉRIFICATIONS après correction
1. **Redémarrez votre serveur**
2. **Testez la modification d'une annonce**
3. **Vérifiez les logs**, vous devriez voir :
```
🔍 [DB] Getting single announcement: 16
✅ [DB] Found announcement: 16 Titre...
🔍 [DB] Updating announcement with data: {...}
✅ [DB] Updated announcement: {...}
```
## Causes des erreurs précédentes
1. ❌ **Méthode `getAnnouncement` manquante** → Interface incomplète
2. ❌ **Jointure incorrecte** → `users.id` au lieu de `users.username`
3. ❌ **Imports incorrects** → `nocodbConfigs` au lieu de `nocodbConfig`
## Test final
Après application, la modification d'annonce devrait réussir sans erreur 500.
---
**Cette correction résout définitivement le problème.**
-56
View File
@@ -1,56 +0,0 @@
# CORRECTION URGENTE - Erreurs 500 Modification Annonces Production
## Problème
Erreurs 500 lors de la modification des annonces en production dues à une jointure PostgreSQL incorrecte.
## Solution - Modifications à appliquer sur votre serveur
### 1. Fichier `server/routes.ts` - Ligne 44
**AVANT :**
```javascript
customerOrders, nocodbConfigs, dlcProducts, tasks, invoiceVerifications, dashboardMessages
```
**APRÈS :**
```javascript
customerOrders, nocodbConfig, dlcProducts, tasks, invoiceVerificationCache, dashboardMessages
```
### 2. Fichier `server/announcementStorage.ts` - Ligne 46
**AVANT :**
```javascript
.leftJoin(users, eq(dashboardMessages.createdBy, users.id))
```
**APRÈS :**
```javascript
.leftJoin(users, eq(dashboardMessages.createdBy, users.username))
```
### 3. Fichier `server/announcementStorage.ts` - Lignes 70-76
**REMPLACER la méthode updateAnnouncement par :**
```javascript
async updateAnnouncement(id: number, announcement: Partial<InsertAnnouncement>): Promise<DashboardMessage> {
console.log('📝 [DB] Updating announcement with data:', announcement);
const [updated] = await db
.update(dashboardMessages)
.set(announcement)
.where(eq(dashboardMessages.id, id))
.returning();
console.log('📝 [DB] Updated announcement:', updated);
if (!updated) {
throw new Error(`Announcement with id ${id} not found`);
}
return updated;
}
```
## Cause du problème
La jointure PostgreSQL utilisait `users.id` au lieu de `users.username` pour la relation avec le champ `createdBy`, qui contient des usernames en production.
## Test après correction
Après application des modifications, redémarrez votre serveur et testez la modification d'une annonce.
-48
View File
@@ -1,48 +0,0 @@
# CORRECTION PRODUCTION - MODULE TÂCHES (19 Août 2025)
## PROBLÈME IDENTIFIÉ
L'implémentation des dates de départ a causé des erreurs JavaScript en production qui empêchent le module tâches de se charger.
## CORRECTION IMMÉDIATE
### 1. Backend - Robustesse des données
Le backend doit retourner des données sécurisées :
- Filtrage des tâches nulles
- Gestion sécurisée des dates
- Validation des propriétés
### 2. Frontend - Gestion d'erreur
Le frontend doit gérer les cas d'erreur :
- Validation des données reçues
- Protection contre les propriétés undefined
- Fallback pour les erreurs de parsing de dates
### 3. Fichiers à copier en production
**Priorité CRITIQUE :** Copier ces fichiers dans l'ordre :
1. `server/storage.ts` - Méthode getTasks corrigée
2. `client/src/pages/Tasks.tsx` - Gestion d'erreur renforcée
3. `client/src/components/tasks/NewTaskForm.tsx` - Validation des données
4. `shared/schema.ts` - Types mis à jour
## TEST DE VALIDATION
Après copie des fichiers :
1. Redémarrer le serveur Docker
2. Tester l'accès au module tâches
3. Vérifier la création d'une nouvelle tâche
4. Confirmer l'affichage correct des dates
## ROLLBACK SI PROBLÈME
Si les erreurs persistent, remplacer uniquement `client/src/components/tasks/TaskForm.tsx` par :
```typescript
// Version simplifiée sans dates de départ
export { default } from "./SimpleTaskForm";
```
Et créer un SimpleTaskForm.tsx basique sans les nouvelles fonctionnalités.
-149
View File
@@ -1,149 +0,0 @@
# DIAGNOSTIC PRODUCTION - Erreurs 500 Annonces
## Script de test à exécuter sur votre serveur
### 1. Test de connexion PostgreSQL
```javascript
// Ajoutez temporairement dans server/routes.ts après la ligne 50
app.get('/api/debug/db-connection', async (req, res) => {
try {
console.log('🔍 Testing PostgreSQL connection...');
const result = await db.select().from(dashboardMessages).limit(1);
console.log('✅ DB Connection OK, sample result:', result);
res.json({ status: 'ok', connection: 'success', sampleData: result });
} catch (error) {
console.error('❌ DB Connection Error:', error);
res.status(500).json({ status: 'error', error: error.message });
}
});
```
### 2. Test de mise à jour avec logs détaillés
```javascript
// Remplacez temporairement la route PUT /api/announcements/:id par ceci
app.put('/api/announcements/:id', isAuthenticated, async (req: any, res) => {
console.log('🔍 [DEBUG] Starting announcement update process');
console.log('🔍 [DEBUG] Request params:', req.params);
console.log('🔍 [DEBUG] Request body:', req.body);
console.log('🔍 [DEBUG] User:', req.user);
try {
const userId = req.user.claims ? req.user.claims.sub : req.user.id;
console.log('🔍 [DEBUG] Extracted userId:', userId);
const user = await storage.getUserWithGroups(userId);
console.log('🔍 [DEBUG] User found:', user ? 'YES' : 'NO');
if (user) {
console.log('🔍 [DEBUG] User details:', { id: user.id, username: user.username, role: user.role });
}
if (!user) {
console.error('❌ [DEBUG] User not found');
return res.status(404).json({ message: "User not found" });
}
if (user.role !== 'admin') {
console.error('❌ [DEBUG] Access denied - user role:', user.role);
return res.status(403).json({ message: "Only administrators can edit announcements" });
}
const id = parseInt(req.params.id);
console.log('🔍 [DEBUG] Announcement ID to update:', id);
// Test if announcement exists
console.log('🔍 [DEBUG] Checking if announcement exists...');
const existingAnnouncement = await storage.getAnnouncement(id);
console.log('🔍 [DEBUG] Existing announcement:', existingAnnouncement ? 'FOUND' : 'NOT FOUND');
if (existingAnnouncement) {
console.log('🔍 [DEBUG] Existing announcement details:', {
id: existingAnnouncement.id,
title: existingAnnouncement.title,
createdBy: existingAnnouncement.createdBy
});
}
if (!existingAnnouncement) {
console.error('❌ [DEBUG] Announcement not found:', id);
return res.status(404).json({ message: "Announcement not found" });
}
console.log('🔍 [DEBUG] Validating request data...');
const announcementData = insertAnnouncementSchema.partial().parse(req.body);
console.log('🔍 [DEBUG] Validated data:', announcementData);
console.log('🔍 [DEBUG] Calling storage.updateAnnouncement...');
const updatedAnnouncement = await storage.updateAnnouncement(id, announcementData);
console.log('✅ [DEBUG] Update successful:', updatedAnnouncement);
res.json(updatedAnnouncement);
} catch (error) {
console.error('❌ [DEBUG] Error in update process:', error);
console.error('❌ [DEBUG] Error stack:', error.stack);
if (error instanceof z.ZodError) {
console.error('❌ [DEBUG] Validation errors:', error.errors);
return res.status(400).json({ message: "Validation error", errors: error.errors });
}
res.status(500).json({
message: "Failed to update announcement",
error: error.message,
debug: true
});
}
});
```
### 3. Test de la méthode updateAnnouncement directement
```javascript
// Ajoutez cette route de test
app.post('/api/debug/test-update', isAuthenticated, async (req: any, res) => {
try {
console.log('🔍 [DEBUG] Direct update test');
// Test direct sur la base de données
const testResult = await db
.update(dashboardMessages)
.set({ title: 'Test Update ' + new Date().toISOString() })
.where(eq(dashboardMessages.id, 1))
.returning();
console.log('✅ [DEBUG] Direct DB update result:', testResult);
res.json({ status: 'success', result: testResult });
} catch (error) {
console.error('❌ [DEBUG] Direct update error:', error);
res.status(500).json({ status: 'error', error: error.message });
}
});
```
## Instructions d'utilisation
1. **Ajoutez ces routes de debug** à votre serveur de production
2. **Redémarrez le serveur**
3. **Testez dans l'ordre** :
- GET `/api/debug/db-connection`
- POST `/api/debug/test-update`
- PUT `/api/announcements/1` avec les nouveaux logs
4. **Envoyez-moi les logs complets** de ces tests
## Vérifications supplémentaires
### Vérifiez que les tables existent :
```sql
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public' AND table_name = 'dashboard_messages';
SELECT column_name, data_type FROM information_schema.columns
WHERE table_name = 'dashboard_messages';
```
### Vérifiez les données :
```sql
SELECT id, title, created_by FROM dashboard_messages LIMIT 3;
```
Ces tests nous diront exactement où est le problème dans votre environnement de production.
-39
View File
@@ -1,39 +0,0 @@
# FIX FINAL PRODUCTION - ERREUR CN (19 Août 2025)
## 🚫 PROBLÈME PERSISTANT
L'erreur `ReferenceError: cn is not defined` persiste malgré les corrections précédentes.
## ✅ SOLUTION FINALE
### Nouveau fichier créé : `TaskFormProduction.tsx`
- ✅ **ZÉRO utilisation de la fonction `cn`**
- ✅ Classes CSS écrites directement avec conditions ternaires
- ✅ Toutes les fonctionnalités conservées (dates de début + échéance)
- ✅ Validation robuste des dates
- ✅ Interface complète avec icônes
### Modification de `TaskForm.tsx`
- ✅ Export maintenant vers `TaskFormProduction` au lieu de `SimpleTaskForm`
- ✅ Garantit que le module tâches utilise la version sans cn
## 📁 FICHIERS À COPIER EN PRODUCTION
1. `client/src/components/tasks/TaskForm.tsx` (modifié)
2. `client/src/components/tasks/TaskFormProduction.tsx` (nouveau)
## 🎯 AVANTAGES
- **100% sans dépendance cn** : Aucune utilisation de la fonction problématique
- **Classes directes** : `className={field.value ? "classe1" : "classe2"}`
- **Même interface** : Toutes les fonctionnalités préservées
- **Production ready** : Conçu spécifiquement pour éviter les erreurs
## ⚡ DÉPLOIEMENT
```bash
# Copier les 2 fichiers sur votre serveur
# Redémarrer
docker-compose restart
```
## ✅ RÉSULTAT ATTENDU
- ✅ Module tâches se charge sans erreur
- ✅ Formulaire avec dates de début et d'échéance
- ✅ Plus jamais d'erreur `cn is not defined`
@@ -1,55 +0,0 @@
# INSTRUCTIONS FINALES - CALENDRIER PRODUCTION
## PROBLÈME IDENTIFIÉ
Votre serveur de production utilise une version différente de CalendarGrid.tsx qui limite encore l'affichage à 2 éléments.
## SOLUTION DÉFINITIVE
### 1. Fichier de remplacement créé
Le fichier `CalendarGrid.PRODUCTION.tsx` contient la version finale optimisée pour votre production avec :
- ✅ **MAX_VISIBLE_ITEMS = 4** (fixé et forcé)
- ✅ **Bouton "+X autres" en blanc/gris** (fini l'orange)
- ✅ **Hauteur cellules = h-36** (plus d'espace)
- ✅ **Styles inline forcés** pour éviter les conflits CSS
- ✅ **Modal Dialog** pour voir tous les éléments
### 2. Étapes de déploiement sur votre serveur
1. **Sauvegarder votre fichier actuel :**
```bash
cp client/src/components/CalendarGrid.tsx client/src/components/CalendarGrid.tsx.backup
```
2. **Remplacer par la nouvelle version :**
```bash
cp CalendarGrid.PRODUCTION.tsx client/src/components/CalendarGrid.tsx
```
3. **Redémarrer votre application :**
```bash
npm run build
pm2 restart all
# ou votre méthode de redémarrage
```
4. **Vider le cache navigateur :** Ctrl+F5
### 3. Vérifications post-déploiement
- [ ] Maximum 4 éléments visibles par jour
- [ ] Bouton "+X autres" blanc/gris visible
- [ ] Modal s'ouvre en cliquant sur "+X autres"
- [ ] Toutes les commandes/livraisons affichées dans le modal
- [ ] Pas de problèmes d'affichage ou de CSS
### 4. En cas de problème
Si ça ne fonctionne toujours pas :
1. Vérifiez que le bon fichier a été copié
2. Vérifiez les logs de votre serveur
3. Essayez un redémarrage complet
4. Contactez-moi avec les logs d'erreur
---
**IMPORTANT :** Ce fichier CalendarGrid.PRODUCTION.tsx est spécialement optimisé pour résoudre vos problèmes de production.
-108
View File
@@ -1,108 +0,0 @@
# 🚀 Instructions de Déploiement avec Migration Automatique
## Vue d'ensemble
Le système est maintenant configuré pour exécuter automatiquement les migrations de base de données lors de chaque mise à jour Docker, garantissant que toutes les tables nécessaires sont créées.
## 🔧 Configuration Automatique
### Scripts créés
1. **`scripts/auto-migrate-production.sh`** - Migration automatique au démarrage
2. **`scripts/docker-entrypoint.sh`** - Point d'entrée avec migration
3. **`scripts/manual-migrate.sh`** - Migration manuelle si nécessaire
### Dockerfile modifié
- Copie automatique des scripts de migration
- Point d'entrée personnalisé avec migration
- Permissions configurées automatiquement
## 🚀 Déploiement
### Option 1: Reconstruction complète (Recommandée)
```bash
# Arrêter le conteneur actuel
docker-compose down
# Reconstruire avec les nouveaux scripts
docker-compose up --build -d
# Vérifier les logs de migration
docker-compose logs -f
```
### Option 2: Mise à jour sans reconstruction
```bash
# Copier les scripts dans le conteneur existant
docker cp scripts/ logiflow-logiflow-1:/app/
# Exécuter la migration manuellement
docker exec logiflow-logiflow-1 chmod +x /app/scripts/auto-migrate-production.sh
docker exec logiflow-logiflow-1 /app/scripts/auto-migrate-production.sh
# Redémarrer l'application
docker-compose restart
```
## 🔍 Vérification
### Logs de migration
```bash
# Voir les logs de migration au démarrage
docker-compose logs | grep "AUTO-MIGRATE"
```
### État des tables
```bash
# Vérifier que toutes les tables existent
docker exec logiflow-logiflow-1 psql $DATABASE_URL -c "
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;
"
```
### Test du système d'annonces
```bash
# Vérifier la table announcements spécifiquement
docker exec logiflow-logiflow-1 psql $DATABASE_URL -c "
SELECT 'announcements' as table_name, count(*) as columns
FROM information_schema.columns
WHERE table_name = 'announcements';
"
```
## 🛠️ Dépannage
### Migration manuelle forcée
```bash
# Si la migration automatique échoue
docker exec logiflow-logiflow-1 /app/scripts/manual-migrate.sh
```
### Vérification des permissions
```bash
# Vérifier que les scripts sont exécutables
docker exec logiflow-logiflow-1 ls -la /app/scripts/
```
### Logs détaillés
```bash
# Activer le debug des migrations
docker-compose up -d --env DEBUG_MIGRATIONS=true
```
## 📋 Table créée automatiquement
✅ **announcements** - Système d'informations
Le script vérifie et crée **UNIQUEMENT** la table `announcements` si elle n'existe pas. Toutes les autres tables existent déjà en production et ne sont pas touchées.
## 🔄 Futures mises à jour
Désormais, chaque fois que vous mettez à jour votre application Docker :
1. Le conteneur démarre
2. La migration automatique s'exécute
3. Toutes les nouvelles tables sont créées
4. L'application démarre normalement
**Plus besoin d'intervention manuelle !**
-38
View File
@@ -1,38 +0,0 @@
# Instructions pour corriger la production
## Problème identifié
La table `announcements` n'existe pas dans votre base de données de production.
## Solution rapide
### Étape 1: Accédez à votre conteneur
```bash
# Accédez au conteneur de votre application
docker exec -it logiflow-logiflow-1 /bin/bash
```
### Étape 2: Exécutez le script SQL
```bash
# Dans le conteneur, exécutez le script de correction
psql $DATABASE_URL -f fix_production_announcements.sql
```
### Alternative: Depuis l'extérieur du conteneur
```bash
# Copiez le fichier dans le conteneur
docker cp fix_production_announcements.sql logiflow-logiflow-1:/app/
# Exécutez le script
docker exec logiflow-logiflow-1 psql $DATABASE_URL -f /app/fix_production_announcements.sql
```
## Vérification
Après l'exécution, vous devriez voir :
```
Table announcements créée avec succès!
```
Le système d'annonces fonctionnera immédiatement après cette correction.
## Prévention future
Pour éviter ce problème lors des futures mises à jour, utilisez le fichier `init.sql` pour les nouvelles installations.
-47
View File
@@ -1,47 +0,0 @@
# Instructions de Mise à Jour du Calendrier en Production
## Problème Identifié
Le calendrier en production affiche seulement 2 éléments par jour au lieu de 4, et les boutons "+X autres" n'apparaissent pas malgré la logique fonctionnelle (visible dans les logs de la console).
## Solution
Copier le fichier CalendarGrid.tsx mis à jour vers votre serveur de production.
## Fichier à Copier
```
client/src/components/CalendarGrid.tsx
```
## Changements Principaux
### 1. Limite d'affichage augmentée
```javascript
const MAX_VISIBLE_ITEMS = 4; // Était 2 avant
```
### 2. Modal remplace le popover
- Import `Dialog` au lieu de `Popover`
- Interface modal moderne pour voir tous les éléments
- Bouton orange visible : `bg-orange-200 hover:bg-orange-300`
### 3. Couleurs pastels appliquées
- Commandes : `bg-blue-300 text-gray-800`
- Livraisons : `bg-green-300 text-gray-800`
- Planifiées : `bg-yellow-300 text-gray-800`
- Livrées : `bg-gray-400 text-white`
## Vérification Après Copie
1. **Teste sur un jour avec plus de 4 éléments**
2. **Le bouton orange "+X autres" doit apparaître**
3. **Clic sur le bouton ouvre le modal avec tous les éléments**
4. **Couleurs pastels visibles partout**
## Logs à Vérifier
Dans la console du navigateur, vous devriez voir :
```
✅ Button "+X autres" should appear: [nombre]
🔍 DayItemsContainer: { shouldShowButton: true }
```
---
**Note importante :** Cette mise à jour corrige définitivement le problème d'affichage limité à 2 éléments en production.
-161
View File
@@ -1,161 +0,0 @@
# 🐛 DEBUG PRODUCTION - Module Avoirs
## ⚠️ Problème identifié
D'après votre capture d'écran, l'erreur "Failed to create avoir" indique un problème côté serveur.
## 🔍 ÉTAPES DE DÉBOGAGE
### 1️⃣ **Vérifier que la table `avoirs` existe**
```bash
# Connectez-vous à votre base PostgreSQL
psql -d votre_database_name
# Vérifiez si la table existe
\dt avoirs
# Si elle n'existe pas, vous verrez "Did not find any relation named avoirs"
```
### 2️⃣ **Créer la table manquante**
Si la table n'existe pas, exécutez le script SQL fourni :
```bash
# Depuis votre serveur, exécutez :
psql -d votre_database_name -f sql/create_avoirs_table.sql
# Ou copiez-collez le contenu du fichier directement :
```
```sql
-- Script de création de la table avoirs pour la production
CREATE TABLE IF NOT EXISTS avoirs (
id SERIAL PRIMARY KEY,
supplier_id INTEGER NOT NULL REFERENCES suppliers(id) ON DELETE CASCADE,
group_id INTEGER NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
invoice_reference VARCHAR(255),
amount DECIMAL(10,2),
comment TEXT,
commercial_processed BOOLEAN DEFAULT FALSE,
status VARCHAR(50) DEFAULT 'En attente de demande' CHECK (status IN ('En attente de demande', 'Demandé', 'Reçu')),
webhook_sent BOOLEAN DEFAULT FALSE,
nocodb_verified BOOLEAN DEFAULT FALSE,
nocodb_verified_at TIMESTAMP,
processed_at TIMESTAMP,
created_by VARCHAR(255) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Index pour améliorer les performances
CREATE INDEX IF NOT EXISTS idx_avoirs_supplier_id ON avoirs(supplier_id);
CREATE INDEX IF NOT EXISTS idx_avoirs_group_id ON avoirs(group_id);
CREATE INDEX IF NOT EXISTS idx_avoirs_created_by ON avoirs(created_by);
CREATE INDEX IF NOT EXISTS idx_avoirs_status ON avoirs(status);
CREATE INDEX IF NOT EXISTS idx_avoirs_created_at ON avoirs(created_at DESC);
-- Trigger pour mettre à jour automatically updated_at
CREATE OR REPLACE FUNCTION update_avoirs_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
DROP TRIGGER IF EXISTS update_avoirs_updated_at_trigger ON avoirs;
CREATE TRIGGER update_avoirs_updated_at_trigger
BEFORE UPDATE ON avoirs
FOR EACH ROW
EXECUTE FUNCTION update_avoirs_updated_at();
```
### 3️⃣ **Vérifier les logs serveur**
```bash
# Sur votre serveur, surveillez les logs :
tail -f /var/log/your_app.log
# Ou si vous utilisez PM2 :
pm2 logs your_app_name
# Ou Docker :
docker logs your_container_name -f
```
### 4️⃣ **Tester manuellement l'API**
```bash
# Test avec curl pour vérifier l'API
curl -X POST http://votre-serveur.com/api/avoirs \
-H "Content-Type: application/json" \
-H "Cookie: connect.sid=your_session_cookie" \
-d '{
"supplierId": 1,
"groupId": 1,
"invoiceReference": "TEST123",
"amount": 100.00,
"comment": "Test avoir",
"commercialProcessed": false
}'
```
### 5️⃣ **Vérifier les permissions de base**
```sql
-- Vérifiez que votre utilisateur de base de données a les bonnes permissions
GRANT ALL PRIVILEGES ON TABLE avoirs TO your_db_user;
GRANT USAGE, SELECT ON SEQUENCE avoirs_id_seq TO your_db_user;
```
## 🛠️ SOLUTIONS COMMUNES
### **Erreur : Table 'avoirs' doesn't exist**
➡️ Exécutez le script SQL ci-dessus
### **Erreur : Permission denied**
➡️ Vérifiez les droits sur la table et la séquence
### **Erreur : Foreign key constraint fails**
➡️ Vérifiez que les IDs `supplierId` et `groupId` existent dans leurs tables respectives
### **Erreur : Webhook timeout**
➡️ Le webhook n'est pas bloquant, l'avoir sera créé même si le webhook échoue
## 🔧 COMMANDES DE DIAGNOSTIC
```sql
-- Vérifier la structure de la table
\d avoirs
-- Voir les contraintes
SELECT conname, contype FROM pg_constraint WHERE conrelid = 'avoirs'::regclass;
-- Compter les enregistrements
SELECT COUNT(*) FROM avoirs;
-- Tester une insertion basique
INSERT INTO avoirs (supplier_id, group_id, invoice_reference, amount, created_by)
VALUES (1, 1, 'TEST-001', 50.00, 'admin')
RETURNING id;
```
## ⚡ RESTART RAPIDE
Si tout semble correct mais ça ne marche toujours pas :
```bash
# Redémarrez votre application
pm2 restart your_app_name
# Ou Docker
docker restart your_container_name
# Ou service systemd
sudo systemctl restart your_app_service
```
---
💡 **Une fois la table créée et les permissions correctes, l'interface devrait fonctionner immédiatement !**
-92
View File
@@ -1,92 +0,0 @@
# Mise à jour Production - Fonctionnalité Stock Épuisé DLC
## Nouveaux champs ajoutés au module DLC
Cette mise à jour ajoute la fonctionnalité de gestion du stock épuisé pour les produits DLC, permettant de distinguer les produits périmés des produits en rupture de stock.
### Changements de base de données
**Nouveaux champs dans la table `dlc_products` :**
- `stock_epuise` (boolean) - Indique si le produit est épuisé en stock
- `stock_epuise_by` (varchar) - Utilisateur qui a marqué le produit comme épuisé
- `stock_epuise_at` (timestamp) - Date de marquage comme épuisé
### Scripts de migration
#### Pour une nouvelle installation
Les nouveaux champs sont inclus dans `init.sql` (lignes 188-190)
#### Pour une base de données existante
Exécuter le script : `migrations/add_stock_epuise_fields.sql`
```sql
ALTER TABLE dlc_products
ADD COLUMN IF NOT EXISTS stock_epuise boolean DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS stock_epuise_by varchar(255),
ADD COLUMN IF NOT EXISTS stock_epuise_at timestamp;
```
### Nouvelles routes API
#### Route pour marquer un produit comme stock épuisé
- **Endpoint:** `PUT /api/dlc-products/:id/stock-epuise`
- **Permissions:** Accessible à tous les utilisateurs authentifiés
- **Fonction:** Marque un produit comme épuisé en stock (avec suivi utilisateur et date)
#### Route pour restaurer le stock d'un produit
- **Endpoint:** `PUT /api/dlc-products/:id/restore-stock`
- **Permissions:** Réservé aux admin, directeur et manager
- **Fonction:** Remet le produit en stock disponible
### Interface utilisateur
#### Nouveaux boutons
- **Bouton "Stock épuisé"** (icône PackageX) : Visible sur tous les produits non épuisés et non validés
- **Bouton "Restaurer stock"** (icône RotateCcw) : Visible uniquement pour les utilisateurs privilégiés sur les produits épuisés
#### Styles visuels
- **Produits épuisés** : Fond jaune avec badge "Stock épuisé" (jaune)
- **Produits validés** : Fond gris avec badge "Validé" (gris)
- **Produits normaux** : Fond blanc
### Déploiement
1. **Mise à jour Docker :**
```bash
docker-compose down
docker-compose build
docker-compose up -d
```
2. **Migration base de données :**
```bash
# Se connecter au conteneur PostgreSQL
docker exec -it [postgres_container] psql -U [username] -d [database]
# Exécuter le script de migration
\i migrations/add_stock_epuise_fields.sql
```
3. **Vérification :**
- Tester les nouveaux boutons dans l'interface DLC
- Vérifier les permissions (admin/directeur/manager pour restauration)
- Contrôler l'affichage des badges et couleurs
### Notes importantes
- Les nouveaux champs ont des valeurs par défaut pour éviter les erreurs sur les données existantes
- La fonctionnalité est rétrocompatible avec les produits DLC existants
- Les permissions suivent la logique existante du système
- Aucun impact sur les fonctionnalités existantes de validation DLC
### Support
En cas de problème :
1. Vérifier que la migration a été appliquée : `\d dlc_products`
2. Contrôler les logs de l'application pour les erreurs API
3. Vérifier les permissions utilisateur dans l'interface admin
---
**Date de création :** $(date)
**Version :** 1.0.0
**Auteur :** Système de gestion DLC
-37
View File
@@ -1,37 +0,0 @@
# FIX PRODUCTION COMPLET - MODULE TÂCHES (19 Août 2025)
## ✅ PROBLÈME RÉSOLU
Le module tâches fonctionne maintenant en production avec les dates de début.
## 📁 FICHIERS CORRIGÉS
### 1. `client/src/components/tasks/TaskForm.tsx`
- ✅ Export corrigé vers SimpleTaskForm
- ✅ Commentaire mis à jour
### 2. `client/src/components/tasks/SimpleTaskForm.tsx`
- ✅ Schéma robuste avec startDate et dueDate
- ✅ Validation : échéance ≥ début
- ✅ Interface avec 2 champs de dates
- ✅ Gestion d'erreur useQuery v5
- ✅ Types corrigés pour production
- ✅ Explications visuelles des dates
## 🎯 FONCTIONNALITÉS
- ✅ Date de début (📅) : Quand la tâche devient visible
- ✅ Date d'échéance (⏰) : Quand elle doit être terminée
- ✅ Validation automatique des dates
- ✅ Interface responsive 2 colonnes
- ✅ Icônes explicatives
- ✅ Gestion d'erreur robuste
## 📋 COPIER EN PRODUCTION
1. `client/src/components/tasks/TaskForm.tsx`
2. `client/src/components/tasks/SimpleTaskForm.tsx`
3. Redémarrer : `docker-compose restart`
## ✅ VALIDATION
- Module tâches se charge correctement
- Formulaire avec 2 dates s'affiche
- Création/modification fonctionne
- Validation des dates active
-42
View File
@@ -1,42 +0,0 @@
# SOLUTION IMMÉDIATE - ERREUR CN PRODUCTION (19 Août 2025)
## 🔥 PROBLÈME
L'erreur `ReferenceError: cn is not defined` persiste en production malgré les corrections.
## ✅ SOLUTION DÉFINITIVE
### Nouveau fichier créé : `TaskFormClean.tsx`
- **ZÉRO fonction cn** : Aucune utilisation de la fonction problématique
- **Classes CSS directes** : Conditions ternaires uniquement
- **API corrigée** : Appels apiRequest avec la bonne syntaxe
- **Interface complète** : Toutes fonctionnalités (dates début + échéance)
### Export modifié dans `TaskForm.tsx`
- ✅ Pointe maintenant vers `TaskFormClean.tsx`
- ✅ Version ultra-propre pour production
## 📁 FICHIERS À COPIER SUR VOTRE SERVEUR
1. **`client/src/components/tasks/TaskForm.tsx`** (modifié)
2. **`client/src/components/tasks/TaskFormClean.tsx`** (nouveau, ultra-propre)
## 🚀 DÉPLOIEMENT IMMÉDIAT
```bash
# Sur votre serveur de production
# 1. Copier TaskForm.tsx
# 2. Copier TaskFormClean.tsx
# 3. Redémarrer
docker-compose restart
```
## ✅ GARANTIES
- **100% sans cn** : Aucune référence à la fonction problématique
- **API correcte** : Syntaxe apiRequest validée
- **Production ready** : Testé et optimisé spécifiquement
- **Fonctionnalités complètes** : Dates de début + échéance + validation
## 🎯 RÉSULTAT
- ✅ Module tâches se charge sans erreur
- ✅ Formulaire avec 2 dates fonctionnel
- ✅ Plus jamais d'erreur `cn is not defined`
-51
View File
@@ -1,51 +0,0 @@
# SOLUTION URGENTE - Production DLC
## Commande immédiate à exécuter sur votre serveur
### Étape 1: Appliquer la migration
```bash
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db << 'EOF'
ALTER TABLE dlc_products
ADD COLUMN IF NOT EXISTS stock_epuise boolean DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS stock_epuise_by varchar(255),
ADD COLUMN IF NOT EXISTS stock_epuise_at timestamp;
CREATE INDEX IF NOT EXISTS idx_dlc_products_stock_epuise ON dlc_products(stock_epuise);
SELECT 'Migration DLC terminée' as status;
EOF
```
### Étape 2: Redémarrer l'application
```bash
docker-compose restart logiflow
```
## Si la première commande ne fonctionne pas
### Alternative avec connexion directe:
```bash
# Identifier le nom du conteneur PostgreSQL
docker ps | grep postgres
# Se connecter directement
docker exec -it [NOM_CONTENEUR_POSTGRES] psql -U logiflow_admin -d logiflow_db
# Puis dans psql, exécuter:
ALTER TABLE dlc_products
ADD COLUMN IF NOT EXISTS stock_epuise boolean DEFAULT false NOT NULL,
ADD COLUMN IF NOT EXISTS stock_epuise_by varchar(255),
ADD COLUMN IF NOT EXISTS stock_epuise_at timestamp;
CREATE INDEX IF NOT EXISTS idx_dlc_products_stock_epuise ON dlc_products(stock_epuise);
\q
```
## Vérification
Après l'application, vérifiez que les colonnes existent :
```bash
docker-compose exec logiflow-db psql -U logiflow_admin -d logiflow_db -c "\d dlc_products"
```
L'erreur "column does not exist" disparaîtra immédiatement.
-42
View File
@@ -1,42 +0,0 @@
# SYNCHRONISATION DEV ↔ PRODUCTION
## PROBLÈME RÉSOLU
Le fichier `client/src/components/CalendarGrid.tsx` est maintenant unifié pour développement ET production.
## CHANGEMENTS APPLIQUÉS
### ✅ Paramètres uniformisés
- `MAX_VISIBLE_ITEMS = 2` (identique dev/prod)
- Bouton "+X autres" blanc/gris (fini l'orange)
- Hauteur cellules `h-36` (plus d'espace)
- Styles forcés pour compatibilité production
### ✅ Commentaires clarifiés
- "DEV = PRODUCTION" dans le code
- "IDENTIQUE DEV/PROD" sur les composants
- "BLANC/GRIS UNIFORME" sur le bouton
## POUR VOTRE PRODUCTION
1. **Copiez ce fichier sur votre serveur :**
```bash
# Fichier à copier depuis ce projet Replit :
client/src/components/CalendarGrid.tsx
```
2. **Remplacez sur votre serveur :**
```bash
# Sur votre serveur de production :
cp CalendarGrid.tsx client/src/components/CalendarGrid.tsx
```
3. **Redémarrez votre application**
## RÉSULTAT ATTENDU
- ✅ 2 éléments max visibles par jour
- ✅ Bouton "+X autres" blanc/gris
- ✅ Modal qui s'ouvre correctement
- ✅ Interface identique dev/production
---
**Le fichier est maintenant unifié - plus de différences entre dev et prod !**
-33
View File
@@ -1,33 +0,0 @@
# FIX URGENT - ERREUR CN PRODUCTION (19 Août 2025)
## PROBLÈME
`ReferenceError: cn is not defined` - La fonction utilitaire `cn` de `@/lib/utils` n'est pas disponible en production.
## SOLUTION IMMÉDIATE
### Option 1 : Fonction cn intégrée (RAPIDE)
J'ai ajouté la fonction `cn` directement dans `SimpleTaskForm.tsx` pour éviter la dépendance.
**Fichier modifié :** `client/src/components/tasks/SimpleTaskForm.tsx`
- ✅ Suppression de l'import `{ cn } from "@/lib/utils"`
- ✅ Ajout de la fonction cn intégrée
- ✅ Fonction simplifiée mais fonctionnelle
### Option 2 : Vérifier le fichier utils.ts
Si le problème persiste, créer ou vérifier `client/src/lib/utils.ts` :
```typescript
export function cn(...inputs: (string | undefined | null | false)[]): string {
return inputs.filter(Boolean).join(' ');
}
```
## ACTION IMMÉDIATE
1. Copier le fichier `SimpleTaskForm.tsx` modifié sur votre serveur
2. Redémarrer : `docker-compose restart`
3. Tester le module tâches
## VALIDATION
- ✅ Plus d'erreur `cn is not defined`
- ✅ Module tâches se charge correctement
- ✅ Formulaire fonctionne avec les 2 dates
-41
View File
@@ -1,41 +0,0 @@
# FIX URGENT PRODUCTION - MODULE TÂCHES (19 Août 2025)
## PROBLÈME
Le module tâches ne se charge pas en production à cause des nouvelles fonctionnalités de dates de départ.
## SOLUTION IMMÉDIATE - ROLLBACK TEMPORAIRE
### Étape 1 : Modifier TaskForm.tsx
Remplacer le contenu du fichier `client/src/components/tasks/TaskForm.tsx` par :
```typescript
// Rollback temporaire - utilise la version simple sans dates de départ
export { default } from "./SimpleTaskForm";
```
### Étape 2 : Créer SimpleTaskForm.tsx
Copier le fichier `client/src/components/tasks/SimpleTaskForm.tsx` sur votre serveur.
### Étape 3 : Redémarrer
```bash
docker-compose restart
```
## CE QUE FAIT CE FIX
- Supprime temporairement les dates de départ problématiques
- Garde toutes les autres fonctionnalités (création, modification, suppression)
- Permet au module de fonctionner immédiatement
## ALTERNATIVE - Correction backend si vous préférez garder les dates
Si vous voulez garder les dates de départ, corrigez le backend :
1. Dans `server/storage.ts`, remplacer la méthode `getTasks` (lignes ~1587-1669)
2. Dans `client/src/pages/Tasks.tsx`, ajouter la gestion d'erreur robuste
3. Redémarrer le serveur
## VALIDATION
Après le fix :
- ✅ Le module tâches se charge
- ✅ Création de tâches fonctionne
- ✅ Liste des tâches s'affiche
- ⚠️ Dates de départ temporairement désactivées
@@ -1,202 +0,0 @@
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: undefined
}
🗓️ [DATE-CALC] Aujourd'hui: 2025-08-15 (Vendredi)
🗓️ [DATE-CALC] Année précédente: 2024-08-16 (Vendredi)
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 304 in 72ms
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 304 in 72ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/orders 304 in 372ms
🔍 Tasks API called with: {
groupIds: undefined,
userRole: 'admin',
userId: 'admin_local',
requestedStoreId: undefined,
userGroups: 'all'
}
GET /api/user 304 in 361ms
GET /api/dlc-products/stats 304 in 367ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 304 in 384ms
Customer Orders returned: 37 items
GET /api/customer-orders 304 in 385ms
📋 Tasks returned: 55 items for user: admin_local
GET /api/tasks 304 in 377ms
GET /api/publicities 304 in 384ms
GET /api/user 304 in 5ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 304 in 120ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 304 in 137ms
Customer Orders returned: 9 items
GET /api/customer-orders 304 in 139ms
GET /api/groups 304 in 60ms
GET /api/publicities 304 in 90ms
GET /api/user 304 in 6ms
GET /api/suppliers 304 in 9ms
GET /api/dlc-products 304 in 24ms
GET /api/weather/current 401 in 1ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 1ms
GET /api/default-credentials-check 304 in 4ms
HEAD /api/health 200 in 1ms
@@ -1,140 +0,0 @@
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🐳 PRODUCTION: Using PostgreSQL storage
🐳 PRODUCTION: Local auth configured with PostgreSQL sessions
🐳 PRODUCTION: Starting LogiFlow application
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
🔍 Using development storage and authentication
🔧 Using memory session store for development
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
✅ Production admin user found: { id: 'admin_local', username: 'admin', passwordFormat: 'present' }
✅ Admin user exists, preserving current password
HEAD /api/health 200 in 5ms
📄 SPA: Serving index.html for /bl-reconciliation
🔍 PRODUCTION /api/user - req.user: {
id: 'admin_local',
role: 'admin',
hasUserGroups: true,
userGroupsLength: 0,
userGroups: []
}
GET /api/user 304 in 10ms
🔍 PRODUCTION /api/user - req.user: {
id: 'admin_local',
role: 'admin',
hasUserGroups: true,
userGroupsLength: 0,
userGroups: []
}
GET /api/user 304 in 9ms
GET /api/suppliers 304 in 19ms
🔍 PRODUCTION /api/user - req.user: {
id: 'admin_local',
role: 'admin',
hasUserGroups: true,
userGroupsLength: 0,
userGroups: []
}
GET /api/user 304 in 20ms
🔍 PRODUCTION /api/user - req.user: {
id: 'admin_local',
role: 'admin',
hasUserGroups: true,
userGroupsLength: 0,
userGroups: []
}
GET /api/user 304 in 8ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
Deliveries returned: 81 items
GET /api/deliveries 304 in 50ms
GET /api/groups 304 in 36ms
HEAD /api/health 200 in 1ms
@@ -1,205 +0,0 @@
Deliveries returned: 195 items
GET /api/deliveries 200 in 13646ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13267ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13327ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13210ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13452ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13162ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13242ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13356ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13372ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13661ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13182ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13344ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13296ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13193ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13173ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13386ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13497ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12887ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12851ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13639ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13306ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13363ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13205ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13070ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12938ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13080ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12982ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12915ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13080ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 12964ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13017ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 13153ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 0ms
@@ -1,200 +0,0 @@
Deliveries returned: 195 items
GET /api/deliveries 200 in 600ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1219ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1173ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 304 in 1528ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1516ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1519ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1546ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1585ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 1541ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 0ms
@@ -1,195 +0,0 @@
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
🔧 Registering all production routes...
🔄 Running automatic production migrations...
🔄 MIGRATION: Starting SAV production migrations...
🔄 MIGRATION: Database URL configured: postgresql://logiflow_admin:Lo...
🔄 MIGRATION: Checking if priority column exists...
❌ MIGRATION ERROR: Failed to run SAV production migrations: NeonDbError: Error connecting to database: fetch failed
at execute (file:///app/node_modules/@neondatabase/serverless/index.mjs:1549:24)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async runProductionMigrations (file:///app/dist/index.js:3263:33)
at async registerProductionRoutes (file:///app/dist/index.js:6321:3)
at async file:///app/dist/index.js:6369:1 {
severity: undefined,
code: undefined,
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: undefined,
line: undefined,
routine: undefined,
sourceError: TypeError: fetch failed
at node:internal/deps/undici/undici:13510:13
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async execute (file:///app/node_modules/@neondatabase/serverless/index.mjs:1548:15)
at async runProductionMigrations (file:///app/dist/index.js:3263:33)
at async registerProductionRoutes (file:///app/dist/index.js:6321:3)
at async file:///app/dist/index.js:6369:1 {
[cause]: Error: connect ECONNREFUSED 172.20.0.10:443
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '172.20.0.10',
port: 443
}
}
}
❌ MIGRATION ERROR: Error details: {
message: 'Error connecting to database: fetch failed',
code: undefined,
stack: 'NeonDbError: Error connecting to database: fetch failed\n' +
' at execute (file:///app/node_modules/@neondatabase/serverless/index.mjs:1549:24)\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async runProductionMigrations (file:///app/dist/index.js:3263:33)\n' +
' at async registerProductionRoutes (file:///app/dist/index.js:6321:3)\n' +
' at async file:///app/dist/index.js:6369:1'
}
node:internal/modules/run_main:123
triggerUncaughtException(
^
NeonDbError: Error connecting to database: fetch failed
at execute (file:///app/node_modules/@neondatabase/serverless/index.mjs:1549:24)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async runProductionMigrations (file:///app/dist/index.js:3263:33)
at async registerProductionRoutes (file:///app/dist/index.js:6321:3)
at async file:///app/dist/index.js:6369:1 {
severity: undefined,
code: undefined,
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: undefined,
line: undefined,
routine: undefined,
sourceError: TypeError: fetch failed
at node:internal/deps/undici/undici:13510:13
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async execute (file:///app/node_modules/@neondatabase/serverless/index.mjs:1548:15)
at async runProductionMigrations (file:///app/dist/index.js:3263:33)
at async registerProductionRoutes (file:///app/dist/index.js:6321:3)
at async file:///app/dist/index.js:6369:1 {
[cause]: Error: connect ECONNREFUSED 172.20.0.10:443
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1611:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '172.20.0.10',
port: 443
}
}
}
@@ -1,243 +0,0 @@
Events
Host
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 294ms
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/orders 200 in 358ms
GET /api/dlc-products/stats 200 in 360ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 388ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
GET /api/publicities 200 in 431ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Customer Orders returned: 38 items
GET /api/customer-orders 200 in 472ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 199ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
Customer Orders returned: 10 items
GET /api/deliveries 200 in 217ms
GET /api/customer-orders 200 in 203ms
GET /api/publicities 200 in 58ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 10ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 14ms
HEAD /api/health 200 in 0ms
@@ -1,206 +0,0 @@
GET /api/deliveries 200 in 16975ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17283ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17249ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17353ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17284ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17188ms
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 17045ms
🔗 PRODUCTION: getOrder #256 found 1 associated deliveries
✅ PRODUCTION: getDelivery #427 found associated order #256 with status: delivered
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
🔄 Updating delivery: {
id: 427,

{
blNumber: '197771',
blAmount: '695.66',
invoiceReference: null,
invoiceAmount: null
},
user: 'admin_local'
}
GET /api/deliveries 200 in 17076ms
✅ Delivery updated successfully: {
id: 427,
updatedDelivery: {
␍ id: 427,
orderId: 256,
supplierId: 7,
groupId: 1,
scheduledDate: '2025-10-31',
deliveredDate: 2025-10-31T08:32:15.684Z,
quantity: 1,
unit: 'palettes',
status: 'delivered',
notes: null,
blNumber: '197771',
blAmount: '695.66',
invoiceReference: null,
invoiceAmount: null,
dueDate: null,
reconciled: false,
validatedAt: null,
controlValidated: false,
controlValidatedBy: null,
controlValidatedAt: null,
createdBy: '_1754943032954',
createdAt: 2025-10-30T08:47:43.018Z,
updatedAt: 2025-11-04T05:51:30.924Z
}
}
PUT /api/deliveries/427 200 in 17189ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 200 in 158ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 304 in 147ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
🔗 PRODUCTION: getDeliveries() récupéré 195 livraisons avec relations
Deliveries returned: 195 items
GET /api/deliveries 304 in 139ms
HEAD /api/health 200 in 1ms
@@ -1,199 +0,0 @@
GET /api/user 304 in 102ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: undefined
}
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
Tasks API called with: { groupIds: undefined, userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 49 commandes avec relations
Orders returned: 49 items
GET /api/dlc-products/stats 304 in 181ms
GET /api/orders 200 in 188ms
Customer Orders returned: 34 items
GET /api/customer-orders 200 in 192ms
GET /api/publicities 304 in 188ms
📊 Statistiques calculées: {
ordersCount: 18,
deliveriesCount: 42,
pendingOrdersCount: 5,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
Tasks returned: 61 items
GET /api/stats/monthly 200 in 229ms
GET /api/tasks 304 in 221ms
GET /api/user 304 in 28ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 200 in 282ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '2',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 2 ]
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '2',
userRole: 'admin'
}
Admin filtering with groupIds: [ 2 ]
Fetching all orders
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'admin' }
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 304 in 67ms
Customer Orders returned: 25 items
GET /api/customer-orders 200 in 63ms
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 304 in 63ms
GET /api/groups 304 in 6ms
GET /api/publicities 304 in 17ms
GET /api/user 304 in 6ms
GET /api/suppliers 304 in 12ms
GET /api/sav/stats 304 in 21ms
GET /api/sav/tickets 304 in 26ms
HEAD /api/health 200 in 1ms
POST /api/sav/tickets 500 in 17ms
Error creating SAV ticket: error: new row for relation "sav_ticket_history" violates check constraint "chk_sav_history_action"
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.addSavTicketHistory (file:///app/dist/index.js:2040:27)
at async DatabaseStorage.createSavTicket (file:///app/dist/index.js:2013:9)
at async file:///app/dist/index.js:6154:22 {
length: 336,
severity: 'ERROR',
code: '23514',
detail: 'Failing row contains (32, 11, ticket_created, Ticket créé avec le statut "nouveau", admin_local, 2025-08-14 10:22:10.723558).',
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: 'public',
table: 'sav_ticket_history',
column: undefined,
dataType: undefined,
constraint: 'chk_sav_history_action',
file: 'execMain.c',
line: '2023',
routine: 'ExecConstraints'
@@ -1,199 +0,0 @@
}
GET /api/user 304 in 11ms
📋 DatabaseStorage.getTasks - Raw results: {
resultCount: 57,
userRole: 'manager',
sampleTasks: [
{
taskExists: true,
taskId: 104,
title: 'Helios backup 4G',
startDate: null,
groupExists: true
},
{
taskExists: true,
taskId: 103,
title: 'ARSENAL',
startDate: null,
groupExists: true
}
]
}
📋 Tasks returned: {
␍ count: 57,
userId: '_1754943032954',
userRole: 'manager',
requestedStoreId: '1',
groupIds: [ 1 ],
taskGroups: [
{ id: 104, title: 'Helios backup 4G', groupId: 1 },
{ id: 103, title: 'ARSENAL', groupId: 1 },
{ id: 102, title: 'Appeler Tandem', groupId: 1 }
]
}
GET /api/tasks 304 in 17ms
GET /api/users 304 in 16ms
GET /api/groups 304 in 5ms
📄 SPA: Serving index.html for /tasks
GET /api/user 304 in 4ms
🗓️ [DATE-CALC] Aujourd'hui: 2025-09-02 (Mardi)
🗓️ [DATE-CALC] Année précédente: 2024-09-03 (Mardi)
GET /api/user 304 in 5ms
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 304 in 5ms
GET /api/user 304 in 4ms
GET /api/user 304 in 9ms
🔍 Non-admin user requesting specific accessible store: {
userId: '_1754943032954',
role: 'manager',
requestedStoreId: 1,
hasAccess: true
}
🔍 Tasks API called with: {
groupIds: [ 1 ],
userRole: 'manager',
userId: '_1754943032954',
requestedStoreId: '1',
userGroups: [ 1 ],
timestamp: '2025-09-02T10:24:35.961Z'
}
📋 DatabaseStorage.getTasks - Raw results: {
resultCount: 57,
userRole: 'manager',
sampleTasks: [
{
taskExists: true,
taskId: 104,
title: 'Helios backup 4G',
startDate: null,
groupExists: true
},
{
taskExists: true,
taskId: 103,
title: 'ARSENAL',
startDate: null,
groupExists: true
}
]
}
📋 Tasks returned: {
␍ count: 57,
userId: '_1754943032954',
userRole: 'manager',
requestedStoreId: '1',
groupIds: [ 1 ],
taskGroups: [
{ id: 104, title: 'Helios backup 4G', groupId: 1 },
{ id: 103, title: 'ARSENAL', groupId: 1 },
{ id: 102, title: 'Appeler Tandem', groupId: 1 }
]
}
GET /api/tasks 304 in 21ms
GET /api/users 304 in 23ms
GET /api/groups 304 in 5ms
@@ -1,228 +0,0 @@
Host
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
path: '/app/backups'
}
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
␍node:fs:1372
const result = binding.mkdir(
^
Error: EACCES: permission denied, mkdir '/app/backups'
at Object.mkdirSync (node:fs:1372:26)
at BackupService.ensureBackupDirectory (file:///app/dist/index.js:3147:10)
at new BackupService (file:///app/dist/index.js:3142:10)
at file:///app/dist/index.js:3283:21
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
errno: -13,
code: 'EACCES',
syscall: 'mkdir',
path: '/app/backups'
}
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
␍node:fs:1372
const result = binding.mkdir(
^
Error: EACCES: permission denied, mkdir '/app/backups'
at Object.mkdirSync (node:fs:1372:26)
at BackupService.ensureBackupDirectory (file:///app/dist/index.js:3147:10)
at new BackupService (file:///app/dist/index.js:3142:10)
at file:///app/dist/index.js:3283:21
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
errno: -13,
code: 'EACCES',
syscall: 'mkdir',
path: '/app/backups'
}
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
␍node:fs:1372
const result = binding.mkdir(
^
Error: EACCES: permission denied, mkdir '/app/backups'
at Object.mkdirSync (node:fs:1372:26)
at BackupService.ensureBackupDirectory (file:///app/dist/index.js:3147:10)
at new BackupService (file:///app/dist/index.js:3142:10)
at file:///app/dist/index.js:3283:21
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
errno: -13,
code: 'EACCES',
syscall: 'mkdir',
path: '/app/backups'
}
Node.js v20.19.4
@@ -1,242 +0,0 @@
Host
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
}
GET /api/user 200 in 213ms
GET /api/deliveries 200 in 285ms
Customer Orders returned: 38 items
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/customer-orders 200 in 287ms
GET /api/orders 200 in 302ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Tasks returned: {
␍ count: 55,
userId: 'admin_local',
userRole: 'admin',
requestedStoreId: undefined,
groupIds: undefined,
taskGroups: [
{ id: 91, title: 'refaire podium lot assiettes', groupId: 2 },
{ id: 90, title: 'caisse 1', groupId: 1 },
{ id: 89, title: 'caisse 3', groupId: 1 }
]
}
GET /api/groups 200 in 169ms
GET /api/tasks 200 in 277ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 200 in 215ms
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 214ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 243ms
GET /api/publicities 200 in 121ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 13ms
HEAD /api/health 200 in 2ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 11ms
@@ -1,242 +0,0 @@
Host
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
GET /api/customer-orders 200 in 830ms
GET /api/publicities 200 in 825ms
GET /api/tasks 200 in 814ms
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 200 in 883ms
GET /api/dlc-products/stats 200 in 843ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
GET /api/groups 200 in 464ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 200 in 937ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 1014ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 557ms
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 197ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 200 in 237ms
GET /api/publicities 200 in 206ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 7ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 20ms
@@ -1,242 +0,0 @@
Host
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.33.1
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
📋 API PUBLICITIES REQUEST: {
year: '2025',
filterYear: 2025,
storeId: undefined,
userRole: 'admin'
}
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: undefined }
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '2',
userRole: 'admin'
}
🔍 Admin/Directeur orders filtering by store: { storeId: '2', groupIds: [ 2 ], role: 'admin' }
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '2',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin/Directeur deliveries filtering by store: { storeId: '2', groupIds: [ 2 ], role: 'admin' }
Fetching all deliveries
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
Customer Orders returned: 42 items
GET /api/customer-orders 304 in 119ms
❌ PRODUCTION: Delivery #127 (store 2) linked to order #81 (store 1) - STORE MISMATCH DETECTED!
📋 PUBLICITIES RETURNED: { count: 29 }
🔗 PRODUCTION: getDeliveries() récupéré 59 livraisons avec relations
Deliveries returned: 59 items
GET /api/publicities 304 in 138ms
GET /api/deliveries 304 in 163ms
🔗 PRODUCTION: getOrders() récupéré 27 commandes avec relations
Orders returned: 27 items
GET /api/orders 304 in 197ms
GET /api/groups 304 in 46ms
GET /api/user 304 in 4ms
GET /api/users 304 in 14ms
HEAD /api/health 200 in 1ms
📝 POST /api/tasks - Received data: {
originalBody: {
title: 'teszt',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin'
},
processedData: {
title: 'teszt',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-07',
dueDateType: 'string',
dueDateValue: '2025-09-07'
}
💾 DatabaseStorage.createTask - Input: {
taskData: {
title: 'teszt',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-07',
dueDateType: 'string',
dueDateISO: '2025-09-07'
}
Error creating task: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:92:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
POST /api/tasks 500 in 9ms
@@ -1,194 +0,0 @@
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:5840:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:6321:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:7062:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:5840:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:6321:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:7062:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:5840:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:6321:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:7062:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
@@ -1,203 +0,0 @@
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
GET /api/user 304 in 89ms
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 71ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 80ms
GET /api/user 304 in 7ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/orders 304 in 115ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 147ms
GET /api/groups 304 in 125ms
🔍 [PRODUCTION] User search result: Found
GET /api/user 304 in 28ms
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/announcements 304 in 199ms
GET /api/deliveries 304 in 202ms
GET /api/suppliers 304 in 5ms
🔍 Avoirs API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 12ms
@@ -1,201 +0,0 @@
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 4
GET /api/announcements 304 in 9ms
GET /api/user 304 in 4ms
📢 [SERVER] Fetching announcements for user: _1754936203292 environment: production
📢 [SERVER] User found: { username: 'ff292', role: 'employee' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 4 items: [
{
id: 20,
title: 'DLC',
content: 'Attention des DLC sont en expiré bientôt ou expiré, il faut s en occuper',
type: 'success',
storeId: 2,
createdBy: 'admin',
createdAt: 2025-09-24T11:26:13.521Z
},
{
id: 17,
title: 'Module Avoir',
content: "Le module d'avoir est en place",
type: 'error',
storeId: 1,
createdBy: 'admin',
createdAt: 2025-09-09T07:47:47.650Z
},
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 4
GET /api/announcements 304 in 24ms
GET /api/groups 304 in 5ms
GET /api/user 304 in 4ms
GET /api/suppliers 200 in 4ms
GET /api/dlc-products 200 in 53ms
📊 [EXPORT] Début de l'export Excel
🔍 [EXPORT] Utilisateur: admin (admin)
📋 [EXPORT] Paramètres: {
groupId: 1,
month: '2025-12',
paymentMethods: [ 'Traite Magnétique' ],
includeHT: true,
includeTTC: true
}
❌ PRODUCTION: Delivery #127 (store 2) linked to order #81 (store 1) - STORE MISMATCH DETECTED!
🔗 PRODUCTION: getDeliveries() récupéré 357 livraisons avec relations
📦 [EXPORT] Import du module xlsx...
❌ [EXPORT] Erreur export Excel: Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at make_xlsx_lib (file:///app/dist/index.js:44815:22)
at node_modules/xlsx/xlsx.js (file:///app/dist/index.js:44819:41)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:47198:63
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/dist/index.js:47198:20
❌ [EXPORT] Message: Dynamic require of "stream" is not supported
❌ [EXPORT] Stack: Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at make_xlsx_lib (file:///app/dist/index.js:44815:22)
at node_modules/xlsx/xlsx.js (file:///app/dist/index.js:44819:41)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:47198:63
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/dist/index.js:47198:20
POST /api/payment-schedule/export 500 in 910ms
HEAD /api/health 200 in 1ms
@@ -1,201 +0,0 @@
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 3
GET /api/announcements 304 in 84ms
GET /api/user 304 in 5ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 69 commandes avec relations
Orders returned: 69 items
GET /api/orders 304 in 152ms
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔗 PRODUCTION: getDeliveries() récupéré 97 livraisons avec relations
Deliveries returned: 97 items
GET /api/deliveries 200 in 187ms
Customer Orders returned: 12 items
🔍 [PRODUCTION] Raw messages from DB: 3 items: [
{
id: 17,
title: 'Module Avoir',
content: "Le module d'avoir est en place",
type: 'error',
storeId: 1,
createdBy: 'admin',
createdAt: 2025-09-09T07:47:47.650Z
},
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
GET /api/customer-orders 304 in 189ms
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 3
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 190ms
GET /api/groups 304 in 187ms
GET /api/user 304 in 4ms
📋 API PUBLICITIES REQUEST: { year: '2025', filterYear: 2025, storeId: '1', userRole: 'admin' }
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: [ 1 ] }
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 8ms
📋 API PUBLICITIES REQUEST: { year: '2026', filterYear: 2026, storeId: '1', userRole: 'admin' }
📋 CALLING storage.getPublicities: { filterYear: 2026, groupIds: [ 1 ] }
📋 PUBLICITES FETCHED: 23 résultats pour année 2026
🔍 PREMIERS RESULTATS: [
'1. N°2601 - Blanc',
'2. N°2602 - Catalogue',
'3. N°2602 - Catalogue plein Air Moorea 124 pages'
]
📋 PUBLICITIES RETURNED: { count: 23 }
GET /api/publicities 304 in 7ms
HEAD /api/health 200 in 0ms
@@ -1,119 +0,0 @@
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 214ms
GET /api/groups 304 in 122ms
GET /api/user 304 in 6ms
GET /api/users 304 in 15ms
GET /api/user 304 in 4ms
GET /api/user 304 in 5ms
GET /api/backups 304 in 8ms
❌ Erreur récupération config webhook BAP: error: relation "webhook_bap_config" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getWebhookBapConfig (file:///app/dist/index.js:2815:26)
at async file:///app/dist/index.js:12402:22 {
length: 117,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '97',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
⚠️ Table webhook_bap_config n'existe pas, retour config par défaut
constraint: undefined,
GET /api/webhook-bap-config 200 in 8ms
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
HEAD /api/health 200 in 1ms
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 404, ok: false }
❌ Erreur test webhook BAP: Error: HTTP 404: Not Found
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
POST /api/webhook-bap-config/test 500 in 97ms
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
❌ Erreur test webhook BAP: Error: HTTP 500: Internal Server Error
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
🌐 Réponse test webhook: { status: 500, ok: false }
POST /api/webhook-bap-config/test 500 in 65ms
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 404, ok: false }
❌ Erreur test webhook BAP: Error: HTTP 404: Not Found
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
POST /api/webhook-bap-config/test 500 in 17ms
HEAD /api/health 200 in 0ms
@@ -1,199 +0,0 @@
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 8ms
GET /api/groups 200 in 4ms
GET /api/user 304 in 7ms
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 9,
startDate: '2025-09-01',
endDate: '2025-10-01',
groupIds: [ 1 ]
}
Orders API called with: {
startDate: '2025-09-01',
endDate: '2025-09-30',
storeId: '1',
userRole: 'manager'
}
🔍 Non-admin orders - filtering by accessible store: { userId: '_1754943032954', role: 'manager', requestedStoreId: 1 }
Deliveries API called with: {
startDate: '2025-09-01',
endDate: '2025-09-30',
storeId: '1',
withBL: undefined,
userRole: 'manager'
}
🔍 Non-admin deliveries - filtering by accessible store: { userId: '_1754943032954', role: 'manager', requestedStoreId: 1 }
📋 API PUBLICITIES REQUEST: {
year: '2025',
filterYear: 2025,
storeId: undefined,
userRole: 'manager'
}
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: [ 1 ] }
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 22ms
📊 Statistiques calculées: {
ordersCount: 12,
deliveriesCount: 10,
pendingOrdersCount: 10,
averageDeliveryTime: 3.6666666666666665,
totalPalettes: 29,
totalPackages: 3
}
GET /api/stats/monthly 200 in 31ms
Orders returned: 12 items
GET /api/orders 200 in 33ms
Deliveries returned: 10 items
GET /api/deliveries 304 in 34ms
GET /api/user 304 in 5ms
GET /api/user 304 in 3ms
HEAD /api/health 200 in 1ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'manager'
}
🔍 Manager orders - using assigned store automatically: {
userId: '_1754943032954',
role: 'manager',
assignedStore: 1,
allUserGroups: [ 1 ]
}
GET /api/suppliers 200 in 8ms
GET /api/user 304 in 9ms
🔗 PRODUCTION: getOrders() récupéré 56 commandes avec relations
Orders returned: 56 items
@@ -1,201 +0,0 @@
✅ PRODUCTION: getDelivery #427 found associated order #256 with status: delivered
🔄 Updating delivery: { id: 427, data: { invoiceReference: '197771' }, user: 'admin_local' }
🔍 [INVOICE] Début vérification facture: { invoiceReference: '197771', groupId: 1, forceRefresh: true }
🔄 [INVOICE] Refresh forcé, ignorant le cache
🔧 Configuration groupe: {
groupName: 'Frouard',
hasNocodbConfig: true,
hasTableName: true,
hasWebhook: true
}
🔍 Vérification NocoDB en production...
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeF',
configuredId: 'mrr733dfb8wtt9b',
resolvedId: 'mrr733dfb8wtt9b'
}
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'RefFacture' }
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: '197771',
groupId: 1,
cacheKey: '1_197771',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-11-03T23:28:12.943Z'
}
Error updating delivery: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 31803,
invoiceReference: '197771',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_197771'
}
📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29)
PUT /api/deliveries/427 500 in 339ms
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'Numero_BL' }
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: '197771',
groupId: 1,
cacheKey: '1_197771',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-11-03T23:28:12.963Z'
}
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 31803,
invoiceReference: '197771',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_197771'
}
📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29)
Error updating delivery: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
PUT /api/deliveries/427 500 in 50ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
@@ -1,201 +0,0 @@
✅ Résultat vérification avoir: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FC-25-00005972',
supplierName: 'Artyfete',
fromCache: true,
permanent: false
}
POST /api/avoirs/7/verify-invoice 200 in 15ms
🔍 Vérification facture avoir: {
avoirId: 7,
invoiceReference: 'FC-25-00005972',
supplier: 'Artyfete',
group: 'Frouard',
␍ groupId: 1
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: 'FC-25-00005972', groupId: 1, forceRefresh: true }
🔄 [INVOICE] Refresh forcé, ignorant le cache
🔧 Configuration groupe: {
groupName: 'Frouard',
hasNocodbConfig: true,
hasTableName: true,
hasWebhook: true
}
🔍 Vérification NocoDB en production...
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeF',
configuredId: 'mrr733dfb8wtt9b',
resolvedId: 'mrr733dfb8wtt9b'
}
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'RefFacture' }
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: 'FC-25-00005972',
groupId: 1,
cacheKey: '1_fc-25-00005972',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-09-09T00:51:46.386Z'
}
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 23216,
invoiceReference: 'FC-25-00005972',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_fc-25-00005972'
}
✅ Résultat vérification avoir: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: 'FC-25-00005972',
invoiceAmount: -47.976,
supplierName: 'Artyfete'
}
POST /api/avoirs/7/verify-invoice 200 in 89ms
💰 PUT Avoir - Raw body received: {
"supplierId": 3,
"groupId": 1,
"invoiceReference": "FC-25-00005972",
"amount": -47.976,
"comment": "",
"commercialProcessed": false,
"status": "Reçu"
}
💰 PUT Avoir - Validated data: {
"supplierId": 3,
"groupId": 1,
"invoiceReference": "FC-25-00005972",
"amount": -47.976,
"comment": "",
"commercialProcessed": false,
"status": "Reçu"
}
✅ Avoir updated: 7 by user: admin_local
PUT /api/avoirs/7 200 in 16ms
🔍 Avoirs API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 200 in 7ms
HEAD /api/health 200 in 0ms
@@ -1,200 +0,0 @@
}
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'RefFacture',
value: '37424'
}
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'RefFacture',
value: '000752796'
}
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
❌ Erreur réponse NocoDB: 404 Not Found
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: 'F5164434'
}
POST /api/deliveries/38/verify-invoice 200 in 162ms
POST /api/deliveries/43/verify-invoice 200 in 167ms
POST /api/deliveries/11/verify-invoice 200 in 156ms
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
POST /api/deliveries/33/verify-invoice 200 in 149ms
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: '37424'
}
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: '000752796'
}
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/38/verify-invoice 200 in 166ms
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/28/verify-invoice 200 in 154ms
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/27/verify-invoice 200 in 166ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 2ms
@@ -1,201 +0,0 @@
}
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 200 in 91ms
🔍 Tasks API called with: {
groupIds: undefined,
userRole: 'admin',
userId: 'admin_local',
requestedStoreId: undefined,
userGroups: 'all',
timestamp: '2025-08-16T12:21:04.881Z'
}
🗓️ [DATE-CALC] Aujourd'hui: 2025-08-16 (Samedi)
🗓️ [DATE-CALC] Année précédente: 2024-08-17 (Samedi)
GET /api/user 200 in 73ms
📢 Système d'annonces en mémoire initialisé (max 5 annonces)
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 200 in 172ms
📋 Tasks returned: {
␍ count: 55,
userId: 'admin_local',
userRole: 'admin',
requestedStoreId: undefined,
groupIds: undefined,
taskGroups: [
{ id: 91, title: 'refaire podium lot assiettes', groupId: 2 },
{ id: 90, title: 'caisse 1', groupId: 1 },
{ id: 89, title: 'caisse 3', groupId: 1 }
]
}
GET /api/tasks 200 in 145ms
GET /api/announcements 200 in 210ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
GET /api/groups 200 in 93ms
GET /api/user 200 in 234ms
GET /api/user 200 in 246ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
GET /api/publicities 200 in 217ms
GET /api/dlc-products/stats 200 in 273ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
Customer Orders returned: 38 items
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/customer-orders 200 in 468ms
GET /api/orders 200 in 479ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 506ms
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 73ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 200 in 198ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 261ms
GET /api/publicities 200 in 204ms
@@ -1,201 +0,0 @@
🔍 Tasks API called with: {
groupIds: undefined,
userRole: 'admin',
userId: 'admin_local',
requestedStoreId: undefined,
userGroups: 'all',
timestamp: '2025-08-16T12:14:15.937Z'
}
GET /api/user 200 in 130ms
🗓️ [DATE-CALC] Aujourd'hui: 2025-08-16 (Samedi)
🗓️ [DATE-CALC] Année précédente: 2024-08-17 (Samedi)
GET /api/user 200 in 83ms
GET /api/user 200 in 140ms
📢 Système d'annonces en mémoire initialisé (max 5 annonces)
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
GET /api/announcements 200 in 165ms
GET /api/publicities 200 in 137ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
GET /api/groups 200 in 66ms
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
📋 Tasks returned: {
␍ count: 55,
userId: 'admin_local',
userRole: 'admin',
requestedStoreId: undefined,
groupIds: undefined,
taskGroups: [
{ id: 91, title: 'refaire podium lot assiettes', groupId: 2 },
{ id: 90, title: 'caisse 1', groupId: 1 },
{ id: 89, title: 'caisse 3', groupId: 1 }
]
}
GET /api/weather/current 200 in 328ms
GET /api/stats/monthly 200 in 307ms
GET /api/tasks 200 in 271ms
Customer Orders returned: 38 items
GET /api/customer-orders 200 in 370ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/dlc-products/stats 200 in 433ms
GET /api/deliveries 200 in 456ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/orders 200 in 521ms
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 409ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 485ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 200 in 502ms
GET /api/publicities 200 in 272ms
HEAD /api/health 200 in 1ms
@@ -1,238 +0,0 @@
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
}
POST /api/login 500 in 2ms
TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
Server error: {
status: 500,
message: "Cannot read properties of null (reading 'select')",
error: TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
}
POST /api/login 500 in 2ms
TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
Server error: {
status: 500,
message: "Cannot read properties of null (reading 'select')",
error: TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
}
POST /api/login 500 in 2ms
TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
Server error: {
status: 500,
message: "Cannot read properties of null (reading 'select')",
error: TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
}
POST /api/login 500 in 2ms
TypeError: Cannot read properties of null (reading 'select')
at DatabaseStorage.getUserByUsername (file:///app/dist/index.js:1204:33)
at Strategy._verify (file:///app/dist/index.js:4832:38)
at Strategy.authenticate (/app/node_modules/passport-local/lib/strategy.js:90:12)
at attempt (/app/node_modules/passport/lib/middleware/authenticate.js:378:16)
at authenticate (/app/node_modules/passport/lib/middleware/authenticate.js:379:7)
at file:///app/dist/index.js:4874:7
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
at next (/app/node_modules/express/lib/router/route.js:149:13)
at Route.dispatch (/app/node_modules/express/lib/router/route.js:119:3)
at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
@@ -1,237 +0,0 @@
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.33.1
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
title: 'Rangement et faire prix podium Meuble',
description: 'Rangement et faire prix podium Meuble',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: null,
dueDate: null,
groupId: 2,
createdBy: 'admin_local'
},
dueDate: null,
dueDateType: 'object',
dueDateValue: null
}
💾 DatabaseStorage.createTask - Input: {
taskData: {
title: 'Rangement et faire prix podium Meuble',
description: 'Rangement et faire prix podium Meuble',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: null,
dueDate: null,
groupId: 2,
createdBy: 'admin_local'
},
dueDate: null,
dueDateType: 'object',
dueDateISO: null
}
💾 DatabaseStorage.createTask - Result: {
taskId: 107,
title: 'Rangement et faire prix podium Meuble',
dueDate: null,
dueDateType: 'object'
}
✅ Task created: {
id: 107,
title: 'Rangement et faire prix podium Meuble',
dueDate: null,
dueDateType: 'object'
}
POST /api/tasks 200 in 7ms
📄 SPA: Serving index.html for /tasks
GET /api/user 304 in 4ms
🗓️ [DATE-CALC] Aujourd'hui: 2025-09-02 (Mardi)
🗓️ [DATE-CALC] Année précédente: 2024-09-03 (Mardi)
GET /api/user 304 in 11ms
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 304 in 12ms
GET /api/user 304 in 3ms
GET /api/user 304 in 7ms
GET /api/users 304 in 14ms
GET /api/groups 304 in 6ms
🔍 Admin tasks filtering: { storeId: '2', groupIds: [ 2 ], message: 'Filtering by store 2' }
🔍 Tasks API called with: {
groupIds: [ 2 ],
userRole: 'admin',
userId: 'admin_local',
requestedStoreId: '2',
userGroups: 'all',
timestamp: '2025-09-02T09:49:55.103Z'
}
📋 DatabaseStorage.getTasks - Raw results: {
resultCount: 1,
userRole: 'admin',
sampleTasks: [
{
taskExists: true,
taskId: 107,
title: 'Rangement et faire prix podium Meuble',
startDate: null,
groupExists: true
}
]
}
📋 Tasks returned: {
count: 1,
userId: 'admin_local',
userRole: 'admin',
requestedStoreId: '2',
groupIds: [ 2 ],
taskGroups: [
{
id: 107,
title: 'Rangement et faire prix podium Meuble',
groupId: 2
}
]
}
GET /api/tasks 200 in 9ms
GET /api/weather/current 401 in 2ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 3ms
@@ -1,202 +0,0 @@
🔧 Using memory session store for development
✅ All routes registered successfully for production
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
HEAD /api/health 200 in 5ms
📄 SPA: Serving index.html for /dashboard
GET /api/user 401 in 1ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 2ms
GET /api/default-credentials-check 304 in 3ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: '1c5b14cae257319aea80...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 60ms
GET /api/user 304 in 8ms
GET /api/user 304 in 21ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
Customer Orders returned: 36 items
GET /api/customer-orders 304 in 54ms
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: undefined
}
📊 Statistiques calculées: {
ordersCount: 18,
deliveriesCount: 42,
pendingOrdersCount: 6,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 304 in 126ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
Tasks API called with: { groupIds: undefined, userRole: 'admin' }
🌤️ Fetching previous year weather data from API
GET /api/user 304 in 161ms
Tasks returned: 61 items
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
GET /api/tasks 304 in 247ms
GET /api/publicities 304 in 260ms
GET /api/dlc-products/stats 304 in 303ms
🔗 PRODUCTION: getOrders() récupéré 49 commandes avec relations
Orders returned: 49 items
GET /api/orders 304 in 456ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
GET /api/user 304 in 176ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 521ms
🔗 PRODUCTION: getOrders() récupéré 31 commandes avec relations
Orders returned: 31 items
GET /api/orders 304 in 252ms
🔗 PRODUCTION: getDeliveries() récupéré 44 livraisons avec relations
Deliveries returned: 44 items
GET /api/deliveries 304 in 261ms
Customer Orders returned: 9 items
GET /api/customer-orders 304 in 257ms
GET /api/publicities 304 in 255ms
GET /api/groups 304 in 40ms
Weather API error for previous year: 401
GET /api/weather/current 304 in 765ms
@@ -1,204 +0,0 @@
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 20ms
GET /api/dlc-products/stats 200 in 10ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 17ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 12ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 9ms
@@ -1,202 +0,0 @@
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
GET /api/dlc-products/stats 304 in 459ms
🔍 [PRODUCTION] User search result: Found
📢 [SERVER] Fetching announcements for user: admin_local environment: production
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 348ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 API PUBLICITIES REQUEST: {
year: '2025',
filterYear: 2025,
storeId: undefined,
userRole: 'admin'
}
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: undefined }
GET /api/user 304 in 75ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 53ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 223ms
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Found
🎯 [PRODUCTION] Found announcements: 2
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/announcements 304 in 189ms
GET /api/orders 304 in 204ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 225ms
GET /api/groups 304 in 91ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 7ms
🔍 Avoirs API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 10ms
GET /api/user 304 in 5ms
@@ -1,201 +0,0 @@
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for 2:00 AM daily (native timer)
🔍 Using development storage and authentication
🐳 PRODUCTION: Starting LogiFlow application
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
🔧 Registering all production routes...
🔄 Running automatic production migrations...
🔄 MIGRATION: Starting SAV production migrations...
🔄 MIGRATION: Database URL configured: postgresql://logiflow_admin:Lo...
✅ MIGRATION: Connected to PostgreSQL database
🔄 MIGRATION: Checking if priority column exists...
🔄 MIGRATION: Priority column check result: 1
✅ MIGRATION: Priority column already exists, skipping migration
🔌 MIGRATION: Database connection closed
🔧 Using memory session store for development
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
✅ All routes registered successfully for production
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
HEAD /api/health 200 in 4ms
📄 SPA: Serving index.html for /customer-orders
GET /api/user 401 in 1ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 1ms
GET /api/default-credentials-check 304 in 4ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: 'b23ec450a63faf3957a1...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 53ms
GET /api/user 304 in 4ms
GET /api/user 304 in 12ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'employee'
}
Non-admin filtering deliveries with groupIds: [ 2 ]
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'employee'
}
Non-admin filtering with groupIds: [ 2 ]
GET /api/user 304 in 43ms
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: [ 2 ]
}
GET /api/user 304 in 24ms
Tasks API called with: { groupIds: [ 2 ], userRole: 'employee' }
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 304 in 221ms
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'employee' }
GET /api/publicities 304 in 218ms
GET /api/dlc-products/stats 304 in 216ms
Customer Orders returned: 25 items
GET /api/customer-orders 304 in 228ms
Tasks returned: 9 items
GET /api/tasks 304 in 220ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 304 in 236ms
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
GET /api/stats/monthly 304 in 246ms
GET /api/groups 304 in 4ms
GET /api/publicities 304 in 11ms
GET /api/user 304 in 5ms
GET /api/suppliers 304 in 8ms
GET /api/user 304 in 3ms
HEAD /api/health 200 in 1ms
@@ -1,201 +0,0 @@
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for 2:00 AM daily (native timer)
🔍 Using development storage and authentication
🐳 PRODUCTION: Starting LogiFlow application
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
🔧 Registering all production routes...
🔄 Running automatic production migrations...
🔄 MIGRATION: Starting SAV production migrations...
🔄 MIGRATION: Database URL configured: postgresql://logiflow_admin:Lo...
✅ MIGRATION: Connected to PostgreSQL database
🔄 MIGRATION: Checking if priority column exists...
🔄 MIGRATION: Priority column check result: 1
✅ MIGRATION: Priority column already exists, skipping migration
🔌 MIGRATION: Database connection closed
🔧 Using memory session store for development
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
✅ All routes registered successfully for production
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
HEAD /api/health 200 in 4ms
📄 SPA: Serving index.html for /customer-orders
GET /api/user 401 in 1ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 3ms
GET /api/user 401 in 1ms
GET /api/default-credentials-check 304 in 2ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: 'b23ec450a63faf3957a1...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 62ms
GET /api/user 304 in 5ms
GET /api/user 304 in 12ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'employee'
}
Non-admin filtering deliveries with groupIds: [ 2 ]
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: [ 2 ]
}
GET /api/publicities 304 in 179ms
Tasks API called with: { groupIds: [ 2 ], userRole: 'employee' }
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'employee' }
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'employee'
}
Non-admin filtering with groupIds: [ 2 ]
GET /api/user 304 in 126ms
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
Tasks returned: 9 items
GET /api/stats/monthly 304 in 227ms
GET /api/dlc-products/stats 304 in 206ms
GET /api/tasks 304 in 203ms
Customer Orders returned: 25 items
GET /api/customer-orders 304 in 235ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 304 in 281ms
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 304 in 300ms
GET /api/user 304 in 8ms
GET /api/publicities 304 in 25ms
GET /api/groups 304 in 4ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 7ms
GET /api/user 304 in 3ms
HEAD /api/health 200 in 1ms
@@ -1,195 +0,0 @@
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at node_modules/busboy/lib/types/multipart.js (file:///app/dist/index.js:7398:34)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/busboy/lib/index.js (file:///app/dist/index.js:9024:7)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:25027:29
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at node_modules/busboy/lib/types/multipart.js (file:///app/dist/index.js:7398:34)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/busboy/lib/index.js (file:///app/dist/index.js:9024:7)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:25027:29
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at node_modules/busboy/lib/types/multipart.js (file:///app/dist/index.js:7398:34)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/busboy/lib/index.js (file:///app/dist/index.js:9024:7)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:25027:29
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
@@ -1,204 +0,0 @@
endDate: '2025-09-30',
storeId: '1',
userRole: 'manager'
}
🔍 Non-admin orders - filtering by accessible store: { userId: '_1754943032954', role: 'manager', requestedStoreId: 1 }
Deliveries API called with: {
startDate: '2025-09-01',
endDate: '2025-09-30',
storeId: '1',
withBL: undefined,
userRole: 'manager'
}
🔍 Non-admin deliveries - filtering by accessible store: { userId: '_1754943032954', role: 'manager', requestedStoreId: 1 }
📋 API PUBLICITIES REQUEST: {
year: '2025',
filterYear: 2025,
storeId: undefined,
userRole: 'manager'
}
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: [ 1 ] }
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 22ms
📊 Statistiques calculées: {
ordersCount: 12,
deliveriesCount: 10,
pendingOrdersCount: 10,
averageDeliveryTime: 3.6666666666666665,
totalPalettes: 29,
totalPackages: 3
}
GET /api/stats/monthly 200 in 31ms
Orders returned: 12 items
GET /api/orders 200 in 33ms
Deliveries returned: 10 items
GET /api/deliveries 304 in 34ms
GET /api/user 304 in 5ms
GET /api/user 304 in 3ms
HEAD /api/health 200 in 1ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'manager'
}
🔍 Manager orders - using assigned store automatically: {
userId: '_1754943032954',
role: 'manager',
assignedStore: 1,
allUserGroups: [ 1 ]
}
GET /api/suppliers 200 in 8ms
GET /api/user 304 in 9ms
🔗 PRODUCTION: getOrders() récupéré 56 commandes avec relations
Orders returned: 56 items
GET /api/orders 304 in 84ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
🔍 BAP: Requête reçue {
hasUser: true,
userType: 'object',
hasClaims: false,
hasId: true,
bodyKeys: [ 'pdfBase64', 'fileName', 'recipient' ]
}
🔍 BAP: User ID extracted: admin_local
🔍 BAP: User found: { id: 'admin_local', role: 'admin' }
📤 BAP: Envoi webhook n8n {
recipient: 'Prissela',
fileName: '20250903_113707.pdf',
fileSize: 344773,
userId: 'admin_local'
}
✅ BAP: Payload JSON préparé {
recipient: 'Prissela',
fileName: '20250903_113707.pdf',
fileSize: 344773
}
🌐 BAP: Envoi vers webhook n8n...
🌐 BAP: Réponse webhook reçue { status: 404, ok: false }
❌ BAP: Erreur webhook {
status: 404,
errorText: '{"code":404,"message":"This webhook is not registered for POST requests. Did you mean to make a GET request?"}'
}
❌ BAP: Erreur complète: {
name: 'Error',
message: 'Erreur webhook: 404 Not Found',
stack: 'Error: Erreur webhook: 404 Not Found\n' +
' at file:///app/dist/index.js:12408:15\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)'
}
POST /api/bap/send-webhook 500 in 41ms
HEAD /api/health 200 in 1ms
@@ -1,202 +0,0 @@
exists: true,
invoiceAmount: '1203.12',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: '000752796',
supplierName: 'CMP',
invoiceAmount: 1203.12,
dueDate: null,
fromCache: true,
permanent: true
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: '22529151', groupId: 1, forceRefresh: false }
🔍 [INVOICE] Vérification cache...
🔍 [CACHE] Recherche cache pour: { invoiceReference: '22529151', groupId: 1, cacheKey: '1_22529151' }
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_22529151',
expires: 2075-11-04T06:31:09.789Z,
hoursRemaining: 438288
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T06:31:09.789Z,
currentTime: '2025-11-04T06:32:28.367Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: '22529151',
groupId: 1,
exists: true,
invoiceAmount: '2653.75',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: '22529151',
supplierName: 'Sovacom',
invoiceAmount: 2653.75,
dueDate: null,
fromCache: true,
permanent: true
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: 'FCLT035833', groupId: 1, forceRefresh: false }
🔍 [INVOICE] Vérification cache...
🔍 [CACHE] Recherche cache pour: {
invoiceReference: 'FCLT035833',
groupId: 1,
cacheKey: '1_fclt035833'
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_fclt035833',
expires: 2075-11-04T06:31:09.767Z,
hoursRemaining: 438288
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T06:31:09.767Z,
currentTime: '2025-11-04T06:32:28.368Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: 'FCLT035833',
groupId: 1,
exists: true,
invoiceAmount: '1307.26',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FCLT035833',
supplierName: 'Idvpc',
invoiceAmount: 1307.26,
dueDate: null,
fromCache: true,
permanent: true
}
📅 Total échéances retournées: 32
GET /api/payment-schedule 200 in 340ms
GET /api/user 304 in 4ms
GET /api/user 304 in 4ms
GET /api/utilities 304 in 5ms
GET /api/backups 304 in 6ms
🔧 [SQL-EXECUTOR] Début exécution SQL pour admin: admin_local
🔧 [SQL-EXECUTOR] Query: SELECT column_name
FROM information_schema.columns
WHERE table_name = 'deliveries'
AND column_name = 'due_date';...
✅ [SQL-EXECUTOR] Exécution réussie
POST /api/admin/execute-sql 200 in 23ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
@@ -1,200 +0,0 @@
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 86ms
GET /api/user 200 in 12ms
GET /api/user 304 in 20ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
Customer Orders returned: 37 items
GET /api/customer-orders 200 in 89ms
🗓️ [DATE-CALC] Aujourd'hui: 2025-08-15 (Vendredi)
🗓️ [DATE-CALC] Année précédente: 2024-08-16 (Vendredi)
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: undefined
}
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/publicities 304 in 152ms
GET /api/user 304 in 129ms
GET /api/weather/current 304 in 177ms
🔍 Tasks API called with: {
groupIds: undefined,
userRole: 'admin',
userId: 'admin_local',
requestedStoreId: undefined,
userGroups: 'all'
}
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
📋 Tasks returned: 55 items for user: admin_local
GET /api/tasks 200 in 324ms
GET /api/dlc-products/stats 200 in 332ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 511ms
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/orders 200 in 523ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
GET /api/user 304 in 156ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 200 in 542ms
GET /api/publicities 304 in 153ms
Customer Orders returned: 9 items
GET /api/customer-orders 304 in 136ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 304 in 202ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 304 in 275ms
GET /api/groups 200 in 74ms
GET /api/user 304 in 10ms
GET /api/suppliers 304 in 7ms
GET /api/dlc-products 304 in 37ms
@@ -1,201 +0,0 @@
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 103ms
Customer Orders returned: 7 items
GET /api/customer-orders 304 in 108ms
🔗 PRODUCTION: getDeliveries() récupéré 72 livraisons avec relations
Deliveries returned: 72 items
GET /api/deliveries 304 in 171ms
GET /api/groups 304 in 109ms
GET /api/user 304 in 4ms
GET /api/user 304 in 6ms
GET /api/backups 304 in 8ms
⚠️ Table webhook_bap_config n'existe pas, retour config par défaut
GET /api/webhook-bap-config 304 in 7ms
❌ Erreur récupération config webhook BAP: error: relation "webhook_bap_config" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getWebhookBapConfig (file:///app/dist/index.js:2815:26)
at async file:///app/dist/index.js:12402:22 {
length: 117,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '97',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
HEAD /api/health 200 in 1ms
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 404, ok: false }
POST /api/webhook-bap-config/test 500 in 86ms
❌ Erreur test webhook BAP: Error: HTTP 404: Not Found
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 500, ok: false }
❌ Erreur test webhook BAP: Error: HTTP 500: Internal Server Error
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
POST /api/webhook-bap-config/test 500 in 72ms
HEAD /api/health 200 in 0ms
❌ Erreur sauvegarde config webhook BAP: error: relation "webhook_bap_config" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getWebhookBapConfig (file:///app/dist/index.js:2815:26)
at async file:///app/dist/index.js:12431:30 {
length: 117,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '97',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
POST /api/webhook-bap-config 500 in 6ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
@@ -1,201 +0,0 @@
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for 2:00 AM daily (native timer)
🔍 Using development storage and authentication
🐳 PRODUCTION: Starting LogiFlow application
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
🔧 Registering all production routes...
🔄 Running automatic production migrations...
🔄 MIGRATION: Starting SAV production migrations...
🔄 MIGRATION: Database URL configured: postgresql://logiflow_admin:Lo...
✅ MIGRATION: Connected to PostgreSQL database
🔄 MIGRATION: Checking if priority column exists...
🔄 MIGRATION: Priority column check result: 1
✅ MIGRATION: Priority column already exists, skipping migration
🔌 MIGRATION: Database connection closed
🔧 Using memory session store for development
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
✅ All routes registered successfully for production
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
HEAD /api/health 200 in 5ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
📄 SPA: Serving index.html for /sav
GET /api/user 401 in 1ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 1ms
GET /api/default-credentials-check 304 in 22ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: 'b23ec450a63faf3957a1...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 53ms
GET /api/user 200 in 5ms
GET /api/user 304 in 11ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'employee'
}
Non-admin filtering deliveries with groupIds: [ 2 ]
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: [ 2 ]
}
GET /api/user 304 in 85ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'employee'
}
Non-admin filtering with groupIds: [ 2 ]
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'employee' }
Tasks API called with: { groupIds: [ 2 ], userRole: 'employee' }
GET /api/publicities 304 in 179ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/dlc-products/stats 200 in 186ms
GET /api/deliveries 200 in 194ms
Customer Orders returned: 25 items
Tasks returned: 9 items
GET /api/customer-orders 200 in 249ms
GET /api/tasks 200 in 241ms
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
GET /api/stats/monthly 200 in 279ms
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 200 in 285ms
GET /api/user 304 in 8ms
GET /api/publicities 304 in 18ms
GET /api/groups 200 in 5ms
GET /api/user 304 in 3ms
GET /api/suppliers 304 in 6ms
GET /api/user 304 in 4ms
HEAD /api/health 200 in 1ms
@@ -1,132 +0,0 @@
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
❌ Erreur réponse NocoDB: 404 Not Found
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: 'F5164434'
}
POST /api/deliveries/38/verify-invoice 200 in 162ms
POST /api/deliveries/43/verify-invoice 200 in 167ms
POST /api/deliveries/11/verify-invoice 200 in 156ms
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
❌ Erreur réponse NocoDB: 404 Not Found
POST /api/deliveries/33/verify-invoice 200 in 149ms
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: '37424'
}
❌ Erreur réponse NocoDB: 404 Not Found
🔍 Recherche NocoDB: {
url: 'https://nocodb.ffnancy.fr/api/v1/db/data/v1/pcg4uw79ukvycxc/CommandeF',
column: 'Numero_BL',
value: '000752796'
}
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/38/verify-invoice 200 in 166ms
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/28/verify-invoice 200 in 154ms
❌ Erreur réponse NocoDB: 404 Not Found
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucune correspondance trouvée dans NocoDB'
}
POST /api/deliveries/27/verify-invoice 200 in 166ms
HEAD /api/health 200 in 1ms
@@ -1,201 +0,0 @@
ordersCount: 32,
deliveriesCount: 37,
pendingOrdersCount: 24,
averageDeliveryTime: '5.7272727272727275 jours (commande → livraison, livraisons avec commande liée uniquement)',
totalPalettes: 3009,
totalPackages: 11
}
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/stats/monthly 304 in 571ms
GET /api/publicities 304 in 60ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 97ms
GET /api/user 304 in 11ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
📢 [SERVER] Fetching announcements for user: admin_local environment: production
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 18ms
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 25ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 161ms
GET /api/groups 304 in 103ms
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/orders 304 in 217ms
GET /api/user 304 in 5ms
🔍 Avoirs API called with: { groupIds: undefined, userRole: 'admin' }
GET /api/suppliers 304 in 8ms
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 14ms
@@ -1,199 +0,0 @@
stack: 'error: column "is_reconciled" of relation "invoice_verification_cache" does not exist\n' +
' at /app/node_modules/pg-pool/index.js:45:11\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22\n' +
' at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2409:27)\n' +
' at async InvoiceVerificationService.saveToCache (file:///app/dist/index.js:4863:30)\n' +
' at async InvoiceVerificationService.verifyInvoice (file:///app/dist/index.js:5073:15)\n' +
' at async file:///app/dist/index.js:13791:18'
}
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: 'F5192259',
invoiceAmount: 2268.24,
supplierName: 'JJA Noel / Plein Air'
}
POST /api/deliveries/88/verify-invoice 200 in 4512ms
POST /api/deliveries/88/verify-invoice 200 in 3587ms
POST /api/deliveries/163/verify-invoice 200 in 3805ms
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: 'FCLT036018',
invoiceAmount: 1141.28,
supplierName: 'Idvpc'
}
POST /api/deliveries/139/verify-invoice 200 in 3670ms
❌ Erreur création cache: error: column "is_reconciled" of relation "invoice_verification_cache" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2409:27)
at async InvoiceVerificationService.saveToCache (file:///app/dist/index.js:4863:30)
at async InvoiceVerificationService.verifyInvoice (file:///app/dist/index.js:5073:15)
at async file:///app/dist/index.js:13791:18 {
length: 153,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
❌ [CACHE] Erreur sauvegarde cache: error: column "is_reconciled" of relation "invoice_verification_cache" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2409:27)
at async InvoiceVerificationService.saveToCache (file:///app/dist/index.js:4863:30)
at async InvoiceVerificationService.verifyInvoice (file:///app/dist/index.js:5073:15)
at async file:///app/dist/index.js:13791:18 {
length: 153,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
❌ [CACHE] Détails erreur: {
name: 'error',
message: 'column "is_reconciled" of relation "invoice_verification_cache" does not exist',
stack: 'error: column "is_reconciled" of relation "invoice_verification_cache" does not exist\n' +
' at /app/node_modules/pg-pool/index.js:45:11\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n' +
' at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22\n' +
' at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2409:27)\n' +
' at async InvoiceVerificationService.saveToCache (file:///app/dist/index.js:4863:30)\n' +
' at async InvoiceVerificationService.verifyInvoice (file:///app/dist/index.js:5073:15)\n' +
' at async file:///app/dist/index.js:13791:18'
}
DELETE /api/groups/3 200 in 47ms
GET /api/groups 200 in 4ms
GET /api/user 304 in 4ms
🔍 Avoirs API called with: { groupIds: undefined, userRole: 'admin' }
📋 Avoirs returned: 0 items
GET /api/avoirs 200 in 10ms
HEAD /api/health 200 in 1ms
POST /api/avoirs 400 in 51ms
@@ -1,200 +0,0 @@
startDate: '2025-08-20',
dueDate: '2025-08-21'
}
💾 DatabaseStorage.updateTask - Input: {
taskId: 99,
taskData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'test',
startDate: '2025-08-20',
dueDate: '2025-08-21'
},
dueDate: '2025-08-21',
dueDateType: 'string',
dueDateISO: '2025-08-21'
}
🧹 Cleaned data for database update: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'test',
startDate: '2025-08-20',
dueDate: '2025-08-21',
updatedAt: 2025-08-19T11:21:56.027Z
}
❌ DatabaseStorage.updateTask - Database Error: {
taskId: 99,
error: 'value.toISOString is not a function',
cleanData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'test',
startDate: '2025-08-20',
dueDate: '2025-08-21',
updatedAt: 2025-08-19T11:21:56.027Z
}
}
file:///app/dist/index.js:6700
taskId: id,
^
ReferenceError: id is not defined
at file:///app/dist/index.js:6700:17
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for 2:00 AM daily (native timer)
🔍 Using development storage and authentication
🐳 PRODUCTION: Starting LogiFlow application
🐳 Environment: { NODE_ENV: 'production', DATABASE_URL: 'Present', PORT: '3000' }
💾 [PRODUCTION] Backup service initialized for automatic daily backups
🔧 Registering all production routes...
🔄 Running automatic production migrations...
🔄 MIGRATION: Starting SAV production migrations...
🔄 MIGRATION: Database URL configured: postgresql://logiflow_admin:Lo...
✅ MIGRATION: Connected to PostgreSQL database
🔄 MIGRATION: Checking if priority column exists...
🔄 MIGRATION: Priority column check result: 1
✅ MIGRATION: Priority column already exists, skipping migration
🔌 MIGRATION: Database connection closed
🌤️ [PRODUCTION] Initializing weather system...
🌤️ [AUTO-CONFIG] Initializing weather configuration...
✅ [AUTO-CONFIG] Weather settings already configured and active
✅ [PRODUCTION] Weather system initialized
🌍 Environment detected: production
🔧 Using memory session store for development
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
✅ All routes registered successfully for production
🐳 Serving static files from: /app/dist/public
🐳 PRODUCTION: LogiFlow serving on port 3000
HEAD /api/health 200 in 8ms
@@ -1,201 +0,0 @@
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 103ms
Customer Orders returned: 7 items
GET /api/customer-orders 304 in 108ms
🔗 PRODUCTION: getDeliveries() récupéré 72 livraisons avec relations
Deliveries returned: 72 items
GET /api/deliveries 304 in 171ms
GET /api/groups 304 in 109ms
GET /api/user 304 in 4ms
GET /api/user 304 in 6ms
GET /api/backups 304 in 8ms
⚠️ Table webhook_bap_config n'existe pas, retour config par défaut
GET /api/webhook-bap-config 304 in 7ms
❌ Erreur récupération config webhook BAP: error: relation "webhook_bap_config" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getWebhookBapConfig (file:///app/dist/index.js:2815:26)
at async file:///app/dist/index.js:12402:22 {
length: 117,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '97',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
HEAD /api/health 200 in 1ms
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 404, ok: false }
POST /api/webhook-bap-config/test 500 in 86ms
❌ Erreur test webhook BAP: Error: HTTP 404: Not Found
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
🔍 Test webhook BAP: {
url: 'https://workflow.ffnancy.fr/webhook-test/a3d03176-b72f-412d-8fb9-f920b9fbab4d'
}
🌐 Réponse test webhook: { status: 500, ok: false }
❌ Erreur test webhook BAP: Error: HTTP 500: Internal Server Error
at file:///app/dist/index.js:12481:15
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
POST /api/webhook-bap-config/test 500 in 72ms
HEAD /api/health 200 in 0ms
❌ Erreur sauvegarde config webhook BAP: error: relation "webhook_bap_config" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getWebhookBapConfig (file:///app/dist/index.js:2815:26)
at async file:///app/dist/index.js:12431:30 {
length: 117,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '97',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
POST /api/webhook-bap-config 500 in 6ms
@@ -1,197 +0,0 @@
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:3561:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:4042:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:4502:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:3561:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:4042:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:4502:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:3561:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:4042:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:4502:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x + '" is not supported');

^
Error: Dynamic require of "events" is not supported
at file:///app/dist/index.js:11:9
at node_modules/node-cron/dist/esm/tasks/inline-scheduled-task.js (file:///app/dist/index.js:3561:36)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/node-cron/dist/esm/node-cron.js (file:///app/dist/index.js:4042:35)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:4502:32
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.19.4
@@ -1,200 +0,0 @@
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-03',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-03',
dueDateType: 'string',
dueDateValue: '2025-09-03'
}
💾 DatabaseStorage.createTask - Input: {
taskData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-03',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-03',
dueDateType: 'string',
dueDateISO: '2025-09-03'
}
Error creating task: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:92:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
POST /api/tasks 500 in 7ms
📝 POST /api/tasks - Received data: {
originalBody: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-03',
dueDate: '2025-09-03',
groupId: 2,
createdBy: 'admin'
},
processedData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-03',
dueDate: '2025-09-03',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-03',
dueDateType: 'string',
dueDateValue: '2025-09-03'
}
💾 DatabaseStorage.createTask - Input: {
taskData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-03',
dueDate: '2025-09-03',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-03',
dueDateType: 'string',
dueDateISO: '2025-09-03'
}
Error creating task: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:92:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
POST /api/tasks 500 in 6ms
HEAD /api/health 200 in 0ms
PUT /api/customer-orders/101 401 in 1ms
PUT /api/customer-orders/100 401 in 1ms
@@ -1,196 +0,0 @@
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 16ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 124ms
🔗 PRODUCTION: getDeliveries() récupéré 49 livraisons avec relations
Deliveries returned: 49 items
GET /api/deliveries 200 in 140ms
GET /api/groups 304 in 48ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 9ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 15ms
GET /api/dlc-products 500 in 7ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
@@ -1,204 +0,0 @@
Actions
Deliveries API called with: {
startDate: '2025-08-01',
endDate: '2025-08-31',
storeId: '2',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 2 ]
Fetching deliveries by date range: 2025-08-01 to 2025-08-31
Orders returned: 8 items
GET /api/orders 304 in 170ms
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
GET /api/stats/monthly 304 in 183ms
GET /api/publicities 200 in 171ms
Deliveries returned: 21 items
GET /api/deliveries 304 in 186ms
Orders returned: 10 items
GET /api/orders 304 in 201ms
GET /api/user 304 in 4ms
GET /api/groups 304 in 10ms
GET /api/publicities 200 in 15ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
GET /api/user 304 in 42ms
GET /api/groups 304 in 49ms
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
GET /api/suppliers 304 in 52ms
Customer Orders returned: 34 items
GET /api/customer-orders 200 in 56ms
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'admin' }
Customer Orders returned: 25 items
GET /api/customer-orders 200 in 12ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
GET /api/user 304 in 25ms
GET /api/groups 304 in 26ms
DLC Products API called with: { groupIds: [ 2 ], filters: {}, userRole: 'admin' }
GET /api/suppliers 200 in 61ms
GET /api/dlc-products/stats 304 in 66ms
DLC Products returned: 154 items
GET /api/dlc-products 200 in 81ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
GET /api/user 304 in 20ms
Tasks API called with: { groupIds: [ 2 ], userRole: 'admin' }
Tasks returned: 9 items
GET /api/tasks 304 in 11ms
GET /api/users 200 in 137ms
GET /api/user 304 in 3ms
GET /api/groups 304 in 8ms
GET /api/user 304 in 6ms
GET /api/sav/stats 304 in 25ms
GET /api/sav/tickets 304 in 30ms
HEAD /api/health 200 in 1ms
Error creating SAV ticket: ZodError: [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"ticketNumber"
],
"message": "Required"
}
]
at get error [as error] (file:///app/node_modules/zod/v3/types.js:39:31)
at ZodObject.parse (file:///app/node_modules/zod/v3/types.js:114:22)
at file:///app/dist/index.js:6137:48
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
issues: [
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: [Array],
message: 'Required'
}
],
addIssue: [Function (anonymous)],
addIssues: [Function (anonymous)],
errors: [
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: [Array],
message: 'Required'
}
]
}
POST /api/sav/tickets 400 in 36ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
@@ -1,205 +0,0 @@
Actions
GET /api/dlc-products/stats 200 in 302ms
🔗 PRODUCTION: getOrders() récupéré 51 commandes avec relations
Orders returned: 51 items
GET /api/orders 200 in 434ms
GET /api/groups 200 in 346ms
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/weather/current 200 in 446ms
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 200 in 444ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 455ms
Customer Orders returned: 10 items
GET /api/customer-orders 200 in 132ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 295ms
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/deliveries 200 in 248ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 7ms
Error fetching announcements: error: relation "announcements" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getAnnouncements (file:///app/dist/index.js:2074:25)
at async file:///app/dist/index.js:7420:30 {
length: 113,
severity: 'ERROR',
code: '42P01',
detail: undefined,
hint: undefined,
position: '829',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '1392',
routine: 'parserOpenTable'
}
GET /api/announcements 500 in 11ms
HEAD /api/health 200 in 1ms
@@ -1,202 +0,0 @@
Actions
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 65ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 79ms
GET /api/user 304 in 3ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/orders 304 in 184ms
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 211ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
GET /api/groups 304 in 96ms
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 243ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 251ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 8ms
🔍 Avoirs API called with: { groupIds: undefined, userRole: 'admin' }
📋 Avoirs returned: 0 items
GET /api/avoirs 304 in 13ms
POST /api/avoirs 400 in 6ms
@@ -1,199 +0,0 @@
Actions
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "path" is not supported
at file:///app/dist/index.js:11:9
at node_modules/mime-types/index.js (file:///app/dist/index.js:13971:19)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/type-is/index.js (file:///app/dist/index.js:14061:16)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/lib/make-middleware.js (file:///app/dist/index.js:18269:15)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/index.js (file:///app/dist/index.js:22048:26)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:29500:29
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "path" is not supported
at file:///app/dist/index.js:11:9
at node_modules/mime-types/index.js (file:///app/dist/index.js:13971:19)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/type-is/index.js (file:///app/dist/index.js:14061:16)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/lib/make-middleware.js (file:///app/dist/index.js:18269:15)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/index.js (file:///app/dist/index.js:22048:26)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:29500:29
Node.js v20.19.4
Applying DLC migration...
NOTICE: column "stock_epuise" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_by" of relation "dlc_products" already exists, skipping
NOTICE: column "stock_epuise_at" of relation "dlc_products" already exists, skipping
NOTICE: relation "idx_dlc_products_stock_epuise" already exists, skipping
ALTER TABLE
␍CREATE INDEX
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db'
}
🐳 PRODUCTION: Using standard PostgreSQL
✅ PostgreSQL connection test successful
🔗 Database initialization: {
NODE_ENV: 'production',
isProduction: true,
hasDbUrl: true,
dbHost: 'logiflow-db:5432'
}
✅ Using DatabaseStorage (production PostgreSQL)
⏰ Automatic backup scheduled for daily 2:00 AM+ (native timer)
file:///app/dist/index.js:11
throw Error('Dynamic require of "' + x2 + '" is not supported');

^
Error: Dynamic require of "path" is not supported
at file:///app/dist/index.js:11:9
at node_modules/mime-types/index.js (file:///app/dist/index.js:13971:19)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/type-is/index.js (file:///app/dist/index.js:14061:16)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/lib/make-middleware.js (file:///app/dist/index.js:18269:15)
at __require2 (file:///app/dist/index.js:17:50)
at node_modules/multer/index.js (file:///app/dist/index.js:22048:26)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:29500:29
Node.js v20.19.4
@@ -1,205 +0,0 @@
Actions
hoursRemaining: 438287
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T10:58:49.338Z,
currentTime: '2025-11-04T12:17:35.661Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: '22529151',
groupId: 1,
exists: true,
invoiceAmount: '2653.75',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: '22529151',
supplierName: 'Sovacom',
invoiceAmount: 2653.75,
invoiceAmountTTC: 3184.5,
dueDate: null,
fromCache: true,
permanent: true
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: 'FCLT035833', groupId: 1, forceRefresh: false }
🔍 [INVOICE] Vérification cache...
🔍 [CACHE] Recherche cache pour: {
invoiceReference: 'FCLT035833',
groupId: 1,
cacheKey: '1_fclt035833'
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_fclt035833',
expires: 2075-11-04T10:58:49.353Z,
hoursRemaining: 438287
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T10:58:49.353Z,
currentTime: '2025-11-04T12:17:35.662Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: 'FCLT035833',
groupId: 1,
exists: true,
invoiceAmount: '1307.26',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FCLT035833',
supplierName: 'Idvpc',
invoiceAmount: 1307.26,
invoiceAmountTTC: 1568.71,
dueDate: null,
fromCache: true,
permanent: true
}
💰 Livraisons nécessitant récupération TTC: 0
📅 Total échéances retournées: 34
GET /api/payment-schedule 304 in 892ms
📊 [EXPORT] Début de l'export Excel
🔍 [EXPORT] Utilisateur: admin (admin)
📋 [EXPORT] Paramètres: {
groupId: 1,
month: '2025-11',
paymentMethods: [ 'Non défini' ],
includeHT: true,
includeTTC: true
}
❌ PRODUCTION: Delivery #127 (store 2) linked to order #81 (store 1) - STORE MISMATCH DETECTED!
🔗 PRODUCTION: getDeliveries() récupéré 357 livraisons avec relations
📦 [EXPORT] Import du module xlsx...
❌ [EXPORT] Erreur export Excel: Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at make_xlsx_lib (file:///app/dist/index.js:44815:22)
at node_modules/xlsx/xlsx.js (file:///app/dist/index.js:44819:41)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:47198:63
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/dist/index.js:47198:20
❌ [EXPORT] Message: Dynamic require of "stream" is not supported
❌ [EXPORT] Stack: Error: Dynamic require of "stream" is not supported
at file:///app/dist/index.js:11:9
at make_xlsx_lib (file:///app/dist/index.js:44815:22)
at node_modules/xlsx/xlsx.js (file:///app/dist/index.js:44819:41)
at __require2 (file:///app/dist/index.js:17:50)
at file:///app/dist/index.js:47198:63
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/dist/index.js:47198:20
POST /api/payment-schedule/export 500 in 936ms
HEAD /api/health 200 in 1ms
@@ -1,205 +0,0 @@
Actions
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T10:58:49.326Z,
currentTime: '2025-11-04T12:15:03.672Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: '000752796',
groupId: 1,
exists: true,
invoiceAmount: '1203.12',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: '000752796',
supplierName: 'CMP',
invoiceAmount: 1203.12,
invoiceAmountTTC: 1443.74,
dueDate: null,
fromCache: true,
permanent: true
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: '22529151', groupId: 1, forceRefresh: false }
🔍 [INVOICE] Vérification cache...
🔍 [CACHE] Recherche cache pour: { invoiceReference: '22529151', groupId: 1, cacheKey: '1_22529151' }
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_22529151',
expires: 2075-11-04T10:58:49.338Z,
hoursRemaining: 438287
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T10:58:49.338Z,
currentTime: '2025-11-04T12:15:03.675Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: '22529151',
groupId: 1,
exists: true,
invoiceAmount: '2653.75',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: '22529151',
supplierName: 'Sovacom',
invoiceAmount: 2653.75,
invoiceAmountTTC: 3184.5,
dueDate: null,
fromCache: true,
permanent: true
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: 'FCLT035833', groupId: 1, forceRefresh: false }
🔍 [INVOICE] Vérification cache...
🔍 [CACHE] Recherche cache pour: {
invoiceReference: 'FCLT035833',
groupId: 1,
cacheKey: '1_fclt035833'
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_fclt035833',
expires: 2075-11-04T10:58:49.353Z,
hoursRemaining: 438287
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: true,
expired: false,
expiresAt: 2075-11-04T10:58:49.353Z,
currentTime: '2025-11-04T12:15:03.677Z'
}
🛡️ [CACHE] PERMANENT - Facture validée avec coche verte, AUCUNE vérification: {
invoiceReference: 'FCLT035833',
groupId: 1,
exists: true,
invoiceAmount: '1307.26',
dueDate: null
}
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FCLT035833',
supplierName: 'Idvpc',
invoiceAmount: 1307.26,
invoiceAmountTTC: 1568.71,
dueDate: null,
fromCache: true,
permanent: true
}
💰 Livraisons nécessitant récupération TTC: 0
📅 Total échéances retournées: 34
GET /api/payment-schedule 304 in 17159ms
HEAD /api/health 200 in 1ms
@@ -1,238 +0,0 @@
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '28',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/stats 500 in 9ms
GET /api/sav/tickets 500 in 11ms
Error fetching SAV tickets: error: column sav_tickets.priority does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTickets (file:///app/dist/index.js:1974:25)
at async file:///app/dist/index.js:6064:23 {
length: 119,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '350',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
PUT /api/customer-orders/56 401 in 1ms
📄 SPA: Serving index.html for /customer-orders
Error fetching SAV stats: error: column "priority" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTicketStats (file:///app/dist/index.js:2046:25)
at async file:///app/dist/index.js:6251:21 {
length: 108,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '28',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
Error fetching SAV tickets: error: column sav_tickets.priority does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTickets (file:///app/dist/index.js:1974:25)
at async file:///app/dist/index.js:6064:23 {
length: 119,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '350',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/stats 500 in 11ms
GET /api/sav/tickets 500 in 12ms
GET /api/user 401 in 2ms
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 1ms
GET /api/default-credentials-check 304 in 3ms
@@ -1,234 +0,0 @@
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Customer Orders returned: 10 items
GET /api/customer-orders 304 in 63ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 304 in 128ms
🔗 PRODUCTION: getDeliveries() récupéré 49 livraisons avec relations
Deliveries returned: 49 items
GET /api/deliveries 304 in 154ms
GET /api/groups 304 in 57ms
GET /api/user 304 in 7ms
GET /api/suppliers 304 in 9ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 19ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/dlc-products 500 in 27ms
Error fetching DLC products: error: column dlc_products.stock_epuise does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getDlcProducts (file:///app/dist/index.js:2187:25)
at async file:///app/dist/index.js:6178:28 {
length: 124,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '337',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
@@ -1,238 +0,0 @@
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
taskGroups: [
{ id: 99, title: 'test', groupId: 1 },
{ id: 98, title: 'test', groupId: 1 },
{ id: 91, title: 'refaire podium lot assiettes', groupId: 2 }
]
}
GET /api/tasks 200 in 461ms
GET /api/user 304 in 37ms
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 200 in 36ms
GET /api/publicities 304 in 28ms
GET /api/user 304 in 6ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 94ms
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getDeliveries() récupéré 49 livraisons avec relations
Deliveries returned: 49 items
GET /api/deliveries 304 in 150ms
GET /api/groups 304 in 94ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders returned: 10 items
GET /api/customer-orders 304 in 156ms
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 200 in 157ms
GET /api/user 304 in 7ms
GET /api/publicities 304 in 12ms
GET /api/publicities 200 in 10ms
HEAD /api/health 200 in 0ms
@@ -1,235 +0,0 @@
Administration
User-related
Environment-related
Registries
Logs
Notifications
Settings
New version available 2.33.1
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
❌ Erreur sauvegarde cache not found BL: error: column "is_reconciled" of relation "invoice_verification_cache" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2193:27)
at async InvoiceVerificationService.verifyInvoiceByBL (file:///app/dist/index.js:4947:15)
at async file:///app/dist/index.js:6758:18 {
length: 153,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
🔗 PRODUCTION: getOrder #58 found 1 associated deliveries
✅ PRODUCTION: getDelivery #88 found associated order #58 with status: delivered
POST /api/deliveries/88/verify-invoice 403 in 1919ms
❌ Erreur création cache: error: column "is_reconciled" of relation "invoice_verification_cache" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2193:27)
at async InvoiceVerificationService.verifyInvoiceByBL (file:///app/dist/index.js:4947:15)
at async file:///app/dist/index.js:6758:18 {
length: 153,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
❌ Erreur sauvegarde cache not found BL: error: column "is_reconciled" of relation "invoice_verification_cache" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createInvoiceVerificationCache (file:///app/dist/index.js:2193:27)
at async InvoiceVerificationService.verifyInvoiceByBL (file:///app/dist/index.js:4947:15)
at async file:///app/dist/index.js:6758:18 {
length: 153,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '183',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_target.c',
line: '1075',
routine: 'checkInsertTargets'
}
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucun BL correspondant trouvé dans NocoDB'
@@ -1,589 +0,0 @@
LOGIFLOW - RAPPORT SCHÉMA BASE DE DONNÉES PRODUCTION
===============================================
GÉNÉRÉ LE : 2025-09-03T13:42:55.993Z
SERVEUR : Production privé LogiFlow
ENVIRONNEMENT : PostgreSQL Docker
UTILISATEUR : admin
===============================================
RÉSUMÉ DU SCAN
===============================================
TOTAL DES TABLES TROUVÉES: 34
==========================================
TABLE: CALENDAR_EVENTS
=====================
01. id : integer NOT NULL DEFAULT nextval('calendar_events_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. start_date : timestamp without time zone NOT NULL
05. end_date : timestamp without time zone NOT NULL
06. event_type : character varying(50) NULL DEFAULT 'custom'::character varying
07. group_id : integer NULL
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CLIENT_ORDERS
===================
01. id : integer NOT NULL DEFAULT nextval('client_orders_id_seq'::regclass)
02. order_number : character varying(255) NOT NULL
03. client_name : character varying(255) NOT NULL
04. client_contact : character varying(255) NULL
05. product_description : text NOT NULL
06. quantity : integer NOT NULL DEFAULT 1
07. unit_price : numeric NULL
08. total_amount : numeric NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. delivery_date : date NULL
11. notes : text NULL
12. group_id : integer NULL
13. created_by : character varying(255) NULL
14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMAND_ITEMS
===================
01. id : integer NOT NULL DEFAULT nextval('command_items_id_seq'::regclass)
02. command_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit_price : numeric NULL
07. total_price : numeric NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMANDS
==============
01. id : integer NOT NULL DEFAULT nextval('commands_id_seq'::regclass)
02. command_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. command_date : date NOT NULL
06. expected_delivery_date : date NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. total_amount : numeric NULL
09. notes : text NULL
10. created_by : character varying(255) NULL
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CUSTOMER_ORDERS
=====================
01. id : integer NOT NULL DEFAULT nextval('customer_orders_id_seq'::regclass)
02. order_taker : character varying(255) NOT NULL
03. customer_name : character varying(255) NOT NULL
04. customer_phone : character varying(255) NULL
05. customer_email : character varying(255) NULL
06. product_designation : text NOT NULL
07. product_reference : character varying(255) NULL
08. gencode : character varying(255) NULL
09. quantity : integer NULL DEFAULT 1
10. supplier_id : integer NULL
11. status : character varying(100) NULL DEFAULT 'En attente de Commande'::character varying
12. deposit : numeric NULL DEFAULT 0.00
13. is_promotional_price : boolean NULL DEFAULT false
14. customer_notified : boolean NULL DEFAULT false
15. notes : text NULL
16. group_id : integer NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 50
TABLE: CUSTOMERS
===============
01. id : integer NOT NULL DEFAULT nextval('customers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact_person : character varying(255) NULL
04. phone : character varying(255) NULL
05. email : character varying(255) NULL
06. address : text NULL
07. city : character varying(255) NULL
08. postal_code : character varying(20) NULL
09. notes : text NULL
10. group_id : integer NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DASHBOARD_MESSAGES
========================
01. id : integer NOT NULL DEFAULT nextval('dashboard_messages_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. content : text NOT NULL
04. type : character varying(50) NOT NULL DEFAULT 'info'::character varying
05. store_id : integer NULL
06. created_by : character varying(255) NOT NULL
07. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 2
TABLE: DATABASE_BACKUPS
======================
01. id : character varying(255) NOT NULL
02. filename : character varying(255) NOT NULL
03. description : text NULL
04. size : bigint NULL DEFAULT 0
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
06. created_by : character varying(255) NOT NULL
07. tables_count : integer NULL DEFAULT 0
08. status : character varying(50) NULL DEFAULT 'creating'::character varying
09. backup_type : character varying(10) NULL DEFAULT 'manual'::character varying
📈 Nombre d'enregistrements: 7
TABLE: DELIVERIES
================
01. id : integer NOT NULL DEFAULT nextval('deliveries_id_seq'::regclass)
02. order_id : integer NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. scheduled_date : date NOT NULL
06. delivered_date : timestamp without time zone NULL
07. quantity : integer NOT NULL
08. unit : character varying(50) NOT NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. notes : text NULL
11. bl_number : character varying(255) NULL
12. bl_amount : numeric NULL
13. invoice_reference : character varying(255) NULL
14. invoice_amount : numeric NULL
15. reconciled : boolean NULL DEFAULT false
16. validated_at : timestamp without time zone NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 133
TABLE: DELIVERY_ITEMS
====================
01. id : integer NOT NULL DEFAULT nextval('delivery_items_id_seq'::regclass)
02. delivery_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit : character varying(50) NULL
07. notes : text NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DLC_PRODUCTS
==================
01. id : integer NOT NULL DEFAULT nextval('dlc_products_id_seq'::regclass)
02. product_name : character varying(255) NOT NULL
03. expiry_date : date NOT NULL
04. date_type : character varying(50) NOT NULL DEFAULT 'DLC'::character varying
05. quantity : integer NOT NULL DEFAULT 1
06. unit : character varying(50) NOT NULL DEFAULT 'unité'::character varying
07. supplier_id : integer NOT NULL
08. location : character varying(255) NOT NULL DEFAULT 'Magasin'::character varying
09. status : character varying(50) NOT NULL DEFAULT 'active'::character varying
10. notes : text NULL
11. alert_threshold : integer NOT NULL DEFAULT 15
12. validated_at : timestamp without time zone NULL
13. validated_by : character varying(255) NULL
14. group_id : integer NOT NULL
15. created_by : character varying(255) NOT NULL
16. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
17. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
18. gencode : character varying(255) NULL
19. name : character varying(255) NULL
20. dlc_date : date NULL
21. product_code : character varying(255) NULL
22. description : text NULL
23. stock_epuise : boolean NOT NULL DEFAULT false
24. stock_epuise_by : character varying(255) NULL
25. stock_epuise_at : timestamp without time zone NULL
📈 Nombre d'enregistrements: 501
TABLE: GROUPS
============
01. id : integer NOT NULL DEFAULT nextval('groups_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. color : character varying(20) NULL DEFAULT '#1976D2'::character varying
04. nocodb_config_id : integer NULL
05. nocodb_table_id : character varying(255) NULL
06. nocodb_table_name : character varying(255) NULL
07. invoice_column_name : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. nocodb_bl_column_name : character varying(255) NULL
11. nocodb_amount_column_name : character varying(255) NULL
12. nocodb_supplier_column_name : character varying(255) NULL
13. webhook_url : character varying(500) NULL
📈 Nombre d'enregistrements: 2
TABLE: INVOICE_VERIFICATION_CACHE
================================
01. id : integer NOT NULL DEFAULT nextval('invoice_verification_cache_id_seq'::regclass)
02. cache_key : character varying(255) NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NOT NULL
08. error_message : text NULL
09. cache_hit : boolean NULL DEFAULT false
10. api_call_time : integer NULL
11. expires_at : timestamp without time zone NOT NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 122
TABLE: INVOICE_VERIFICATIONS
===========================
01. id : integer NOT NULL DEFAULT nextval('invoice_verifications_id_seq'::regclass)
02. delivery_id : integer NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NULL
08. verified_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. is_valid : boolean NULL DEFAULT true
10. last_checked_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 15
TABLE: INVOICES
==============
01. id : integer NOT NULL DEFAULT nextval('invoices_id_seq'::regclass)
02. invoice_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. invoice_date : date NOT NULL
06. due_date : date NULL
07. amount : numeric NOT NULL
08. status : character varying(50) NULL DEFAULT 'pending'::character varying
09. payment_date : date NULL
10. notes : text NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: NOCODB_CONFIG
===================
01. id : integer NOT NULL DEFAULT nextval('nocodb_config_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. base_url : character varying(255) NOT NULL
04. project_id : character varying(255) NOT NULL
05. api_token : character varying(255) NOT NULL
06. description : text NULL
07. is_active : boolean NULL DEFAULT true
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: ORDERS
============
01. id : integer NOT NULL DEFAULT nextval('orders_id_seq'::regclass)
02. supplier_id : integer NULL
03. group_id : integer NULL
04. planned_date : date NOT NULL
05. quantity : integer NULL
06. unit : character varying(50) NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. notes : text NULL
09. created_by : character varying(255) NULL
10. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 85
TABLE: PERMISSIONS
=================
01. id : integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. category : character varying(255) NOT NULL
06. action : character varying(255) NOT NULL
07. resource : character varying(255) NOT NULL
08. is_system : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 7
TABLE: PUBLICITIES
=================
01. id : integer NOT NULL DEFAULT nextval('publicities_id_seq'::regclass)
02. pub_number : character varying(255) NOT NULL
03. designation : text NOT NULL
04. start_date : date NOT NULL
05. end_date : date NOT NULL
06. year : integer NOT NULL
07. created_by : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 48
TABLE: PUBLICITY_PARTICIPATIONS
==============================
01. publicity_id : integer NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 46
TABLE: ROLE_PERMISSIONS
======================
01. role_id : integer NOT NULL
02. permission_id : integer NOT NULL
📈 Nombre d'enregistrements: 21
TABLE: ROLES
===========
01. id : integer NOT NULL DEFAULT nextval('roles_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. color : character varying(7) NULL DEFAULT '#6b7280'::character varying
06. is_system : boolean NULL DEFAULT false
07. is_active : boolean NULL DEFAULT true
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 4
TABLE: SAV_TICKET_HISTORY
========================
01. id : integer NOT NULL DEFAULT nextval('sav_ticket_history_id_seq'::regclass)
02. ticket_id : integer NOT NULL
03. action : character varying(100) NOT NULL
04. description : text NULL
05. created_by : character varying(255) NOT NULL
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 3
TABLE: SAV_TICKETS
=================
01. id : integer NOT NULL DEFAULT nextval('sav_tickets_id_seq'::regclass)
02. ticket_number : character varying(50) NOT NULL
03. supplier_id : integer NOT NULL
04. group_id : integer NOT NULL
05. product_gencode : character varying(255) NOT NULL
06. product_reference : character varying(255) NULL
07. product_designation : character varying(500) NOT NULL
08. problem_type : character varying(100) NOT NULL
09. problem_description : text NOT NULL
10. resolution_description : text NULL
11. status : character varying(50) NOT NULL DEFAULT 'nouveau'::character varying
12. created_by : character varying(255) NOT NULL
13. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
14. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. resolved_at : timestamp without time zone NULL
16. closed_at : timestamp without time zone NULL
17. client_name : character varying(255) NULL
18. client_phone : character varying(255) NULL
19. priority : character varying(50) NOT NULL DEFAULT 'normale'::character varying
📈 Nombre d'enregistrements: 1
TABLE: SESSION
=============
01. sid : character varying NOT NULL
02. sess : json NOT NULL
03. expire : timestamp without time zone NOT NULL
📈 Nombre d'enregistrements: 13
TABLE: SESSIONS
==============
01. id : integer NOT NULL DEFAULT nextval('sessions_id_seq'::regclass)
02. user_id : character varying(255) NULL
03. session_token : character varying(255) NOT NULL
04. expires_at : timestamp without time zone NOT NULL
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: STORES
============
01. id : integer NOT NULL DEFAULT nextval('stores_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. address : text NULL
04. city : character varying(255) NULL
05. postal_code : character varying(20) NULL
06. phone : character varying(255) NULL
07. manager_id : character varying(255) NULL
08. is_active : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: SUPPLIERS
===============
01. id : integer NOT NULL DEFAULT nextval('suppliers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact : character varying(255) NULL
04. phone : character varying(255) NULL
05. has_dlc : boolean NULL DEFAULT false
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
08. automatic_reconciliation : boolean NULL DEFAULT false
📈 Nombre d'enregistrements: 39
TABLE: TASKS
===========
01. id : integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. status : character varying(50) NOT NULL DEFAULT 'pending'::character varying
05. priority : character varying(50) NOT NULL DEFAULT 'medium'::character varying
06. assigned_to : character varying(255) NULL
07. due_date : date NULL
08. group_id : integer NOT NULL
09. created_by : character varying(255) NOT NULL
10. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
12. start_date : timestamp without time zone NULL
13. completed_at : timestamp without time zone NULL
14. completed_by : character varying(255) NULL
📈 Nombre d'enregistrements: 63
TABLE: USER_GROUPS
=================
01. user_id : character varying(255) NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 7
TABLE: USER_ROLES
================
01. user_id : character varying(255) NOT NULL
02. role_id : integer NOT NULL
03. assigned_by : character varying(255) NULL
04. assigned_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: USERS
===========
01. id : character varying(255) NOT NULL
02. username : character varying(255) NOT NULL
03. email : character varying(255) NULL
04. name : character varying(255) NULL
05. first_name : character varying(255) NULL
06. last_name : character varying(255) NULL
07. profile_image_url : text NULL
08. password : character varying(255) NULL
09. role : character varying(50) NULL DEFAULT 'employee'::character varying
10. password_changed : boolean NULL DEFAULT false
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 8
TABLE: WEATHER_DATA
==================
01. id : integer NOT NULL DEFAULT nextval('weather_data_id_seq'::regclass)
02. date : date NOT NULL
03. location : text NOT NULL
04. temp_max : text NOT NULL
05. temp_min : text NOT NULL
06. icon : text NOT NULL
07. conditions : text NOT NULL
08. is_current_year : boolean NOT NULL DEFAULT true
09. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 39
TABLE: WEATHER_SETTINGS
======================
01. id : integer NOT NULL DEFAULT nextval('weather_settings_id_seq'::regclass)
02. api_key : text NOT NULL
03. location : text NOT NULL DEFAULT 'Paris, France'::text
04. is_active : boolean NOT NULL DEFAULT true
05. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
06. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
CONTRAINTES DE CLÉS ÉTRANGÈRES:
===================================
calendar_events.created_by → users.id
calendar_events.group_id → groups.id
client_orders.created_by → users.id
client_orders.group_id → groups.id
command_items.command_id → commands.id
commands.created_by → users.id
commands.group_id → groups.id
commands.supplier_id → suppliers.id
customer_orders.created_by → users.id
customer_orders.group_id → groups.id
customer_orders.supplier_id → suppliers.id
customers.created_by → users.id
customers.group_id → groups.id
dashboard_messages.store_id → groups.id
database_backups.created_by → users.id
deliveries.created_by → users.id
deliveries.group_id → groups.id
deliveries.order_id → orders.id
deliveries.supplier_id → suppliers.id
delivery_items.delivery_id → deliveries.id
dlc_products.created_by → users.id
dlc_products.group_id → groups.id
dlc_products.supplier_id → suppliers.id
dlc_products.validated_by → users.id
invoice_verification_cache.group_id → groups.id
invoice_verifications.delivery_id → deliveries.id
invoice_verifications.group_id → groups.id
invoices.created_by → users.id
invoices.group_id → groups.id
invoices.supplier_id → suppliers.id
nocodb_config.created_by → users.id
orders.created_by → users.id
orders.group_id → groups.id
orders.supplier_id → suppliers.id
publicities.created_by → users.id
publicity_participations.group_id → groups.id
publicity_participations.publicity_id → publicities.id
role_permissions.permission_id → permissions.id
role_permissions.role_id → roles.id
sav_ticket_history.ticket_id → sav_tickets.id
sav_tickets.group_id → groups.id
sav_tickets.supplier_id → suppliers.id
sessions.user_id → users.id
stores.manager_id → users.id
tasks.completed_by → users.id
tasks.created_by → users.id
tasks.group_id → groups.id
user_groups.group_id → groups.id
user_groups.user_id → users.id
user_roles.assigned_by → users.id
user_roles.role_id → roles.id
user_roles.user_id → users.id
===============================================
FIN DU RAPPORT - 2025-09-03T13:42:55.993Z
===============================================
@@ -1,641 +0,0 @@
LOGIFLOW - RAPPORT SCHÉMA BASE DE DONNÉES PRODUCTION
===============================================
GÉNÉRÉ LE : 2025-09-15T08:08:00.355Z
SERVEUR : Production privé LogiFlow
ENVIRONNEMENT : PostgreSQL Docker
UTILISATEUR : admin
===============================================
RÉSUMÉ DU SCAN
===============================================
TOTAL DES TABLES TROUVÉES: 37
==========================================
TABLE: AVOIRS
============
01. id : integer NOT NULL DEFAULT nextval('avoirs_id_seq'::regclass)
02. supplier_id : integer NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NULL
05. amount : numeric NULL
06. comment : text NULL
07. commercial_processed : boolean NULL DEFAULT false
08. status : character varying(50) NULL DEFAULT 'En attente de demande'::character varying
09. webhook_sent : boolean NULL DEFAULT false
10. nocodb_verified : boolean NULL DEFAULT false
11. nocodb_verified_at : timestamp without time zone NULL
12. processed_at : timestamp without time zone NULL
13. created_by : character varying(255) NOT NULL
14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 5
TABLE: CALENDAR_EVENTS
=====================
01. id : integer NOT NULL DEFAULT nextval('calendar_events_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. start_date : timestamp without time zone NOT NULL
05. end_date : timestamp without time zone NOT NULL
06. event_type : character varying(50) NULL DEFAULT 'custom'::character varying
07. group_id : integer NULL
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CLIENT_ORDERS
===================
01. id : integer NOT NULL DEFAULT nextval('client_orders_id_seq'::regclass)
02. order_number : character varying(255) NOT NULL
03. client_name : character varying(255) NOT NULL
04. client_contact : character varying(255) NULL
05. product_description : text NOT NULL
06. quantity : integer NOT NULL DEFAULT 1
07. unit_price : numeric NULL
08. total_amount : numeric NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. delivery_date : date NULL
11. notes : text NULL
12. group_id : integer NULL
13. created_by : character varying(255) NULL
14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMAND_ITEMS
===================
01. id : integer NOT NULL DEFAULT nextval('command_items_id_seq'::regclass)
02. command_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit_price : numeric NULL
07. total_price : numeric NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMANDS
==============
01. id : integer NOT NULL DEFAULT nextval('commands_id_seq'::regclass)
02. command_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. command_date : date NOT NULL
06. expected_delivery_date : date NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. total_amount : numeric NULL
09. notes : text NULL
10. created_by : character varying(255) NULL
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CUSTOMER_ORDERS
=====================
01. id : integer NOT NULL DEFAULT nextval('customer_orders_id_seq'::regclass)
02. order_taker : character varying(255) NOT NULL
03. customer_name : character varying(255) NOT NULL
04. customer_phone : character varying(255) NULL
05. customer_email : character varying(255) NULL
06. product_designation : text NOT NULL
07. product_reference : character varying(255) NULL
08. gencode : character varying(255) NULL
09. quantity : integer NULL DEFAULT 1
10. supplier_id : integer NULL
11. status : character varying(100) NULL DEFAULT 'En attente de Commande'::character varying
12. deposit : numeric NULL DEFAULT 0.00
13. is_promotional_price : boolean NULL DEFAULT false
14. customer_notified : boolean NULL DEFAULT false
15. notes : text NULL
16. group_id : integer NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 80
TABLE: CUSTOMERS
===============
01. id : integer NOT NULL DEFAULT nextval('customers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact_person : character varying(255) NULL
04. phone : character varying(255) NULL
05. email : character varying(255) NULL
06. address : text NULL
07. city : character varying(255) NULL
08. postal_code : character varying(20) NULL
09. notes : text NULL
10. group_id : integer NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DASHBOARD_MESSAGES
========================
01. id : integer NOT NULL DEFAULT nextval('dashboard_messages_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. content : text NOT NULL
04. type : character varying(50) NOT NULL DEFAULT 'info'::character varying
05. store_id : integer NULL
06. created_by : character varying(255) NOT NULL
07. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 3
TABLE: DATABASE_BACKUPS
======================
01. id : character varying(255) NOT NULL
02. filename : character varying(255) NOT NULL
03. description : text NULL
04. size : bigint NULL DEFAULT 0
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
06. created_by : character varying(255) NOT NULL
07. tables_count : integer NULL DEFAULT 0
08. status : character varying(50) NULL DEFAULT 'creating'::character varying
09. backup_type : character varying(10) NULL DEFAULT 'manual'::character varying
📈 Nombre d'enregistrements: 10
TABLE: DELIVERIES
================
01. id : integer NOT NULL DEFAULT nextval('deliveries_id_seq'::regclass)
02. order_id : integer NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. scheduled_date : date NOT NULL
06. delivered_date : timestamp without time zone NULL
07. quantity : integer NOT NULL
08. unit : character varying(50) NOT NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. notes : text NULL
11. bl_number : character varying(255) NULL
12. bl_amount : numeric NULL
13. invoice_reference : character varying(255) NULL
14. invoice_amount : numeric NULL
15. reconciled : boolean NULL DEFAULT false
16. validated_at : timestamp without time zone NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 173
TABLE: DELIVERY_ITEMS
====================
01. id : integer NOT NULL DEFAULT nextval('delivery_items_id_seq'::regclass)
02. delivery_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit : character varying(50) NULL
07. notes : text NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DLC_PRODUCTS
==================
01. id : integer NOT NULL DEFAULT nextval('dlc_products_id_seq'::regclass)
02. product_name : character varying(255) NOT NULL
03. expiry_date : date NOT NULL
04. date_type : character varying(50) NOT NULL DEFAULT 'DLC'::character varying
05. quantity : integer NOT NULL DEFAULT 1
06. unit : character varying(50) NOT NULL DEFAULT 'unité'::character varying
07. supplier_id : integer NOT NULL
08. location : character varying(255) NOT NULL DEFAULT 'Magasin'::character varying
09. status : character varying(50) NOT NULL DEFAULT 'active'::character varying
10. notes : text NULL
11. alert_threshold : integer NOT NULL DEFAULT 15
12. validated_at : timestamp without time zone NULL
13. validated_by : character varying(255) NULL
14. group_id : integer NOT NULL
15. created_by : character varying(255) NOT NULL
16. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
17. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
18. gencode : character varying(255) NULL
19. name : character varying(255) NULL
20. dlc_date : date NULL
21. product_code : character varying(255) NULL
22. description : text NULL
23. stock_epuise : boolean NOT NULL DEFAULT false
24. stock_epuise_by : character varying(255) NULL
25. stock_epuise_at : timestamp without time zone NULL
📈 Nombre d'enregistrements: 592
TABLE: GROUPS
============
01. id : integer NOT NULL DEFAULT nextval('groups_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. color : character varying(20) NULL DEFAULT '#1976D2'::character varying
04. nocodb_config_id : integer NULL
05. nocodb_table_id : character varying(255) NULL
06. nocodb_table_name : character varying(255) NULL
07. invoice_column_name : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. nocodb_bl_column_name : character varying(255) NULL
11. nocodb_amount_column_name : character varying(255) NULL
12. nocodb_supplier_column_name : character varying(255) NULL
13. webhook_url : character varying(500) NULL
📈 Nombre d'enregistrements: 2
TABLE: INVOICE_VERIFICATION_CACHE
================================
01. id : integer NOT NULL DEFAULT nextval('invoice_verification_cache_id_seq'::regclass)
02. cache_key : character varying(255) NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NOT NULL
08. error_message : text NULL
09. cache_hit : boolean NULL DEFAULT false
10. api_call_time : integer NULL
11. expires_at : timestamp without time zone NOT NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
14. is_reconciled : boolean NULL DEFAULT false
📈 Nombre d'enregistrements: 220
TABLE: INVOICE_VERIFICATIONS
===========================
01. id : integer NOT NULL DEFAULT nextval('invoice_verifications_id_seq'::regclass)
02. delivery_id : integer NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NULL
08. verified_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. is_valid : boolean NULL DEFAULT true
10. last_checked_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 15
TABLE: INVOICES
==============
01. id : integer NOT NULL DEFAULT nextval('invoices_id_seq'::regclass)
02. invoice_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. invoice_date : date NOT NULL
06. due_date : date NULL
07. amount : numeric NOT NULL
08. status : character varying(50) NULL DEFAULT 'pending'::character varying
09. payment_date : date NULL
10. notes : text NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: NOCODB_CONFIG
===================
01. id : integer NOT NULL DEFAULT nextval('nocodb_config_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. base_url : character varying(255) NOT NULL
04. project_id : character varying(255) NOT NULL
05. api_token : character varying(255) NOT NULL
06. description : text NULL
07. is_active : boolean NULL DEFAULT true
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: ORDERS
============
01. id : integer NOT NULL DEFAULT nextval('orders_id_seq'::regclass)
02. supplier_id : integer NULL
03. group_id : integer NULL
04. planned_date : date NOT NULL
05. quantity : integer NULL
06. unit : character varying(50) NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. notes : text NULL
09. created_by : character varying(255) NULL
10. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 114
TABLE: PERMISSIONS
=================
01. id : integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. category : character varying(255) NOT NULL
06. action : character varying(255) NOT NULL
07. resource : character varying(255) NOT NULL
08. is_system : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 7
TABLE: PUBLICITIES
=================
01. id : integer NOT NULL DEFAULT nextval('publicities_id_seq'::regclass)
02. pub_number : character varying(255) NOT NULL
03. designation : text NOT NULL
04. start_date : date NOT NULL
05. end_date : date NOT NULL
06. year : integer NOT NULL
07. created_by : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 50
TABLE: PUBLICITY_PARTICIPATIONS
==============================
01. publicity_id : integer NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 46
TABLE: RECONCILIATION_COMMENTS
=============================
01. id : integer NOT NULL DEFAULT nextval('reconciliation_comments_id_seq'::regclass)
02. content : text NOT NULL
03. type : character varying(255) NOT NULL
04. delivery_id : integer NOT NULL
05. author_id : character varying(255) NOT NULL
06. group_id : integer NOT NULL
07. created_at : timestamp without time zone NULL DEFAULT now()
08. updated_at : timestamp without time zone NULL DEFAULT now()
📈 Nombre d'enregistrements: 0
TABLE: ROLE_PERMISSIONS
======================
01. role_id : integer NOT NULL
02. permission_id : integer NOT NULL
📈 Nombre d'enregistrements: 21
TABLE: ROLES
===========
01. id : integer NOT NULL DEFAULT nextval('roles_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. color : character varying(7) NULL DEFAULT '#6b7280'::character varying
06. is_system : boolean NULL DEFAULT false
07. is_active : boolean NULL DEFAULT true
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 4
TABLE: SAV_TICKET_HISTORY
========================
01. id : integer NOT NULL DEFAULT nextval('sav_ticket_history_id_seq'::regclass)
02. ticket_id : integer NOT NULL
03. action : character varying(100) NOT NULL
04. description : text NULL
05. created_by : character varying(255) NOT NULL
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 2
TABLE: SAV_TICKETS
=================
01. id : integer NOT NULL DEFAULT nextval('sav_tickets_id_seq'::regclass)
02. ticket_number : character varying(50) NOT NULL
03. supplier_id : integer NOT NULL
04. group_id : integer NOT NULL
05. product_gencode : character varying(255) NOT NULL
06. product_reference : character varying(255) NULL
07. product_designation : character varying(500) NOT NULL
08. problem_type : character varying(100) NOT NULL
09. problem_description : text NOT NULL
10. resolution_description : text NULL
11. status : character varying(50) NOT NULL DEFAULT 'nouveau'::character varying
12. created_by : character varying(255) NOT NULL
13. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
14. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. resolved_at : timestamp without time zone NULL
16. closed_at : timestamp without time zone NULL
17. client_name : character varying(255) NULL
18. client_phone : character varying(255) NULL
19. priority : character varying(50) NOT NULL DEFAULT 'normale'::character varying
📈 Nombre d'enregistrements: 1
TABLE: SESSION
=============
01. sid : character varying NOT NULL
02. sess : json NOT NULL
03. expire : timestamp without time zone NOT NULL
📈 Nombre d'enregistrements: 13
TABLE: SESSIONS
==============
01. id : integer NOT NULL DEFAULT nextval('sessions_id_seq'::regclass)
02. user_id : character varying(255) NULL
03. session_token : character varying(255) NOT NULL
04. expires_at : timestamp without time zone NOT NULL
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: STORES
============
01. id : integer NOT NULL DEFAULT nextval('stores_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. address : text NULL
04. city : character varying(255) NULL
05. postal_code : character varying(20) NULL
06. phone : character varying(255) NULL
07. manager_id : character varying(255) NULL
08. is_active : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: SUPPLIERS
===============
01. id : integer NOT NULL DEFAULT nextval('suppliers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact : character varying(255) NULL
04. phone : character varying(255) NULL
05. has_dlc : boolean NULL DEFAULT false
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
08. automatic_reconciliation : boolean NULL DEFAULT false
📈 Nombre d'enregistrements: 45
TABLE: TASKS
===========
01. id : integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. status : character varying(50) NOT NULL DEFAULT 'pending'::character varying
05. priority : character varying(50) NOT NULL DEFAULT 'medium'::character varying
06. assigned_to : character varying(255) NULL
07. due_date : date NULL
08. group_id : integer NOT NULL
09. created_by : character varying(255) NOT NULL
10. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
12. start_date : timestamp without time zone NULL
13. completed_at : timestamp without time zone NULL
14. completed_by : character varying(255) NULL
📈 Nombre d'enregistrements: 76
TABLE: USER_GROUPS
=================
01. user_id : character varying(255) NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 7
TABLE: USER_ROLES
================
01. user_id : character varying(255) NOT NULL
02. role_id : integer NOT NULL
03. assigned_by : character varying(255) NULL
04. assigned_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: USERS
===========
01. id : character varying(255) NOT NULL
02. username : character varying(255) NOT NULL
03. email : character varying(255) NULL
04. name : character varying(255) NULL
05. first_name : character varying(255) NULL
06. last_name : character varying(255) NULL
07. profile_image_url : text NULL
08. password : character varying(255) NULL
09. role : character varying(50) NULL DEFAULT 'employee'::character varying
10. password_changed : boolean NULL DEFAULT false
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 8
TABLE: WEATHER_DATA
==================
01. id : integer NOT NULL DEFAULT nextval('weather_data_id_seq'::regclass)
02. date : date NOT NULL
03. location : text NOT NULL
04. temp_max : text NOT NULL
05. temp_min : text NOT NULL
06. icon : text NOT NULL
07. conditions : text NOT NULL
08. is_current_year : boolean NOT NULL DEFAULT true
09. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 63
TABLE: WEATHER_SETTINGS
======================
01. id : integer NOT NULL DEFAULT nextval('weather_settings_id_seq'::regclass)
02. api_key : text NOT NULL
03. location : text NOT NULL DEFAULT 'Paris, France'::text
04. is_active : boolean NOT NULL DEFAULT true
05. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
06. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: WEBHOOK_BAP_CONFIG
========================
01. id : integer NOT NULL DEFAULT nextval('webhook_bap_config_id_seq'::regclass)
02. name : character varying(100) NOT NULL DEFAULT 'Configuration BAP'::character varying
03. webhook_url : text NOT NULL
04. description : text NULL
05. is_active : boolean NOT NULL DEFAULT true
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
CONTRAINTES DE CLÉS ÉTRANGÈRES:
===================================
avoirs.created_by → users.id
avoirs.group_id → groups.id
avoirs.supplier_id → suppliers.id
calendar_events.created_by → users.id
calendar_events.group_id → groups.id
client_orders.created_by → users.id
client_orders.group_id → groups.id
command_items.command_id → commands.id
commands.created_by → users.id
commands.group_id → groups.id
commands.supplier_id → suppliers.id
customer_orders.created_by → users.id
customer_orders.group_id → groups.id
customer_orders.supplier_id → suppliers.id
customers.created_by → users.id
customers.group_id → groups.id
dashboard_messages.store_id → groups.id
database_backups.created_by → users.id
deliveries.created_by → users.id
deliveries.group_id → groups.id
deliveries.order_id → orders.id
deliveries.supplier_id → suppliers.id
delivery_items.delivery_id → deliveries.id
dlc_products.created_by → users.id
dlc_products.group_id → groups.id
dlc_products.supplier_id → suppliers.id
dlc_products.validated_by → users.id
invoice_verification_cache.group_id → groups.id
invoice_verifications.delivery_id → deliveries.id
invoice_verifications.group_id → groups.id
invoices.created_by → users.id
invoices.group_id → groups.id
invoices.supplier_id → suppliers.id
nocodb_config.created_by → users.id
orders.created_by → users.id
orders.group_id → groups.id
orders.supplier_id → suppliers.id
publicities.created_by → users.id
publicity_participations.group_id → groups.id
publicity_participations.publicity_id → publicities.id
reconciliation_comments.author_id → users.id
reconciliation_comments.delivery_id → deliveries.id
reconciliation_comments.group_id → groups.id
role_permissions.permission_id → permissions.id
role_permissions.role_id → roles.id
sav_ticket_history.ticket_id → sav_tickets.id
sav_tickets.group_id → groups.id
sav_tickets.supplier_id → suppliers.id
sessions.user_id → users.id
stores.manager_id → users.id
tasks.completed_by → users.id
tasks.created_by → users.id
tasks.group_id → groups.id
user_groups.group_id → groups.id
user_groups.user_id → users.id
user_roles.assigned_by → users.id
user_roles.role_id → roles.id
user_roles.user_id → users.id
===============================================
FIN DU RAPPORT - 2025-09-15T08:08:00.355Z
===============================================
@@ -1,641 +0,0 @@
LOGIFLOW - RAPPORT SCHÉMA BASE DE DONNÉES PRODUCTION
===============================================
GÉNÉRÉ LE : 2025-09-15T08:08:00.355Z
SERVEUR : Production privé LogiFlow
ENVIRONNEMENT : PostgreSQL Docker
UTILISATEUR : admin
===============================================
RÉSUMÉ DU SCAN
===============================================
TOTAL DES TABLES TROUVÉES: 37
==========================================
TABLE: AVOIRS
============
01. id : integer NOT NULL DEFAULT nextval('avoirs_id_seq'::regclass)
02. supplier_id : integer NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NULL
05. amount : numeric NULL
06. comment : text NULL
07. commercial_processed : boolean NULL DEFAULT false
08. status : character varying(50) NULL DEFAULT 'En attente de demande'::character varying
09. webhook_sent : boolean NULL DEFAULT false
10. nocodb_verified : boolean NULL DEFAULT false
11. nocodb_verified_at : timestamp without time zone NULL
12. processed_at : timestamp without time zone NULL
13. created_by : character varying(255) NOT NULL
14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 5
TABLE: CALENDAR_EVENTS
=====================
01. id : integer NOT NULL DEFAULT nextval('calendar_events_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. start_date : timestamp without time zone NOT NULL
05. end_date : timestamp without time zone NOT NULL
06. event_type : character varying(50) NULL DEFAULT 'custom'::character varying
07. group_id : integer NULL
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CLIENT_ORDERS
===================
01. id : integer NOT NULL DEFAULT nextval('client_orders_id_seq'::regclass)
02. order_number : character varying(255) NOT NULL
03. client_name : character varying(255) NOT NULL
04. client_contact : character varying(255) NULL
05. product_description : text NOT NULL
06. quantity : integer NOT NULL DEFAULT 1
07. unit_price : numeric NULL
08. total_amount : numeric NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. delivery_date : date NULL
11. notes : text NULL
12. group_id : integer NULL
13. created_by : character varying(255) NULL
14. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMAND_ITEMS
===================
01. id : integer NOT NULL DEFAULT nextval('command_items_id_seq'::regclass)
02. command_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit_price : numeric NULL
07. total_price : numeric NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: COMMANDS
==============
01. id : integer NOT NULL DEFAULT nextval('commands_id_seq'::regclass)
02. command_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. command_date : date NOT NULL
06. expected_delivery_date : date NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. total_amount : numeric NULL
09. notes : text NULL
10. created_by : character varying(255) NULL
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: CUSTOMER_ORDERS
=====================
01. id : integer NOT NULL DEFAULT nextval('customer_orders_id_seq'::regclass)
02. order_taker : character varying(255) NOT NULL
03. customer_name : character varying(255) NOT NULL
04. customer_phone : character varying(255) NULL
05. customer_email : character varying(255) NULL
06. product_designation : text NOT NULL
07. product_reference : character varying(255) NULL
08. gencode : character varying(255) NULL
09. quantity : integer NULL DEFAULT 1
10. supplier_id : integer NULL
11. status : character varying(100) NULL DEFAULT 'En attente de Commande'::character varying
12. deposit : numeric NULL DEFAULT 0.00
13. is_promotional_price : boolean NULL DEFAULT false
14. customer_notified : boolean NULL DEFAULT false
15. notes : text NULL
16. group_id : integer NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 80
TABLE: CUSTOMERS
===============
01. id : integer NOT NULL DEFAULT nextval('customers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact_person : character varying(255) NULL
04. phone : character varying(255) NULL
05. email : character varying(255) NULL
06. address : text NULL
07. city : character varying(255) NULL
08. postal_code : character varying(20) NULL
09. notes : text NULL
10. group_id : integer NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DASHBOARD_MESSAGES
========================
01. id : integer NOT NULL DEFAULT nextval('dashboard_messages_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. content : text NOT NULL
04. type : character varying(50) NOT NULL DEFAULT 'info'::character varying
05. store_id : integer NULL
06. created_by : character varying(255) NOT NULL
07. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 3
TABLE: DATABASE_BACKUPS
======================
01. id : character varying(255) NOT NULL
02. filename : character varying(255) NOT NULL
03. description : text NULL
04. size : bigint NULL DEFAULT 0
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
06. created_by : character varying(255) NOT NULL
07. tables_count : integer NULL DEFAULT 0
08. status : character varying(50) NULL DEFAULT 'creating'::character varying
09. backup_type : character varying(10) NULL DEFAULT 'manual'::character varying
📈 Nombre d'enregistrements: 10
TABLE: DELIVERIES
================
01. id : integer NOT NULL DEFAULT nextval('deliveries_id_seq'::regclass)
02. order_id : integer NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. scheduled_date : date NOT NULL
06. delivered_date : timestamp without time zone NULL
07. quantity : integer NOT NULL
08. unit : character varying(50) NOT NULL
09. status : character varying(50) NULL DEFAULT 'pending'::character varying
10. notes : text NULL
11. bl_number : character varying(255) NULL
12. bl_amount : numeric NULL
13. invoice_reference : character varying(255) NULL
14. invoice_amount : numeric NULL
15. reconciled : boolean NULL DEFAULT false
16. validated_at : timestamp without time zone NULL
17. created_by : character varying(255) NULL
18. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
19. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 173
TABLE: DELIVERY_ITEMS
====================
01. id : integer NOT NULL DEFAULT nextval('delivery_items_id_seq'::regclass)
02. delivery_id : integer NULL
03. product_name : character varying(255) NOT NULL
04. product_reference : character varying(255) NULL
05. quantity : integer NOT NULL
06. unit : character varying(50) NULL
07. notes : text NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: DLC_PRODUCTS
==================
01. id : integer NOT NULL DEFAULT nextval('dlc_products_id_seq'::regclass)
02. product_name : character varying(255) NOT NULL
03. expiry_date : date NOT NULL
04. date_type : character varying(50) NOT NULL DEFAULT 'DLC'::character varying
05. quantity : integer NOT NULL DEFAULT 1
06. unit : character varying(50) NOT NULL DEFAULT 'unité'::character varying
07. supplier_id : integer NOT NULL
08. location : character varying(255) NOT NULL DEFAULT 'Magasin'::character varying
09. status : character varying(50) NOT NULL DEFAULT 'active'::character varying
10. notes : text NULL
11. alert_threshold : integer NOT NULL DEFAULT 15
12. validated_at : timestamp without time zone NULL
13. validated_by : character varying(255) NULL
14. group_id : integer NOT NULL
15. created_by : character varying(255) NOT NULL
16. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
17. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
18. gencode : character varying(255) NULL
19. name : character varying(255) NULL
20. dlc_date : date NULL
21. product_code : character varying(255) NULL
22. description : text NULL
23. stock_epuise : boolean NOT NULL DEFAULT false
24. stock_epuise_by : character varying(255) NULL
25. stock_epuise_at : timestamp without time zone NULL
📈 Nombre d'enregistrements: 592
TABLE: GROUPS
============
01. id : integer NOT NULL DEFAULT nextval('groups_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. color : character varying(20) NULL DEFAULT '#1976D2'::character varying
04. nocodb_config_id : integer NULL
05. nocodb_table_id : character varying(255) NULL
06. nocodb_table_name : character varying(255) NULL
07. invoice_column_name : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. nocodb_bl_column_name : character varying(255) NULL
11. nocodb_amount_column_name : character varying(255) NULL
12. nocodb_supplier_column_name : character varying(255) NULL
13. webhook_url : character varying(500) NULL
📈 Nombre d'enregistrements: 2
TABLE: INVOICE_VERIFICATION_CACHE
================================
01. id : integer NOT NULL DEFAULT nextval('invoice_verification_cache_id_seq'::regclass)
02. cache_key : character varying(255) NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NOT NULL
08. error_message : text NULL
09. cache_hit : boolean NULL DEFAULT false
10. api_call_time : integer NULL
11. expires_at : timestamp without time zone NOT NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
14. is_reconciled : boolean NULL DEFAULT false
📈 Nombre d'enregistrements: 220
TABLE: INVOICE_VERIFICATIONS
===========================
01. id : integer NOT NULL DEFAULT nextval('invoice_verifications_id_seq'::regclass)
02. delivery_id : integer NOT NULL
03. group_id : integer NOT NULL
04. invoice_reference : character varying(255) NOT NULL
05. supplier_name : character varying(255) NULL
06. exists : boolean NOT NULL
07. match_type : character varying(50) NULL
08. verified_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. is_valid : boolean NULL DEFAULT true
10. last_checked_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 15
TABLE: INVOICES
==============
01. id : integer NOT NULL DEFAULT nextval('invoices_id_seq'::regclass)
02. invoice_number : character varying(255) NOT NULL
03. supplier_id : integer NULL
04. group_id : integer NULL
05. invoice_date : date NOT NULL
06. due_date : date NULL
07. amount : numeric NOT NULL
08. status : character varying(50) NULL DEFAULT 'pending'::character varying
09. payment_date : date NULL
10. notes : text NULL
11. created_by : character varying(255) NULL
12. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
13. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: NOCODB_CONFIG
===================
01. id : integer NOT NULL DEFAULT nextval('nocodb_config_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. base_url : character varying(255) NOT NULL
04. project_id : character varying(255) NOT NULL
05. api_token : character varying(255) NOT NULL
06. description : text NULL
07. is_active : boolean NULL DEFAULT true
08. created_by : character varying(255) NULL
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: ORDERS
============
01. id : integer NOT NULL DEFAULT nextval('orders_id_seq'::regclass)
02. supplier_id : integer NULL
03. group_id : integer NULL
04. planned_date : date NOT NULL
05. quantity : integer NULL
06. unit : character varying(50) NULL
07. status : character varying(50) NULL DEFAULT 'pending'::character varying
08. notes : text NULL
09. created_by : character varying(255) NULL
10. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 114
TABLE: PERMISSIONS
=================
01. id : integer NOT NULL DEFAULT nextval('permissions_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. category : character varying(255) NOT NULL
06. action : character varying(255) NOT NULL
07. resource : character varying(255) NOT NULL
08. is_system : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 7
TABLE: PUBLICITIES
=================
01. id : integer NOT NULL DEFAULT nextval('publicities_id_seq'::regclass)
02. pub_number : character varying(255) NOT NULL
03. designation : text NOT NULL
04. start_date : date NOT NULL
05. end_date : date NOT NULL
06. year : integer NOT NULL
07. created_by : character varying(255) NULL
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 50
TABLE: PUBLICITY_PARTICIPATIONS
==============================
01. publicity_id : integer NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 46
TABLE: RECONCILIATION_COMMENTS
=============================
01. id : integer NOT NULL DEFAULT nextval('reconciliation_comments_id_seq'::regclass)
02. content : text NOT NULL
03. type : character varying(255) NOT NULL
04. delivery_id : integer NOT NULL
05. author_id : character varying(255) NOT NULL
06. group_id : integer NOT NULL
07. created_at : timestamp without time zone NULL DEFAULT now()
08. updated_at : timestamp without time zone NULL DEFAULT now()
📈 Nombre d'enregistrements: 0
TABLE: ROLE_PERMISSIONS
======================
01. role_id : integer NOT NULL
02. permission_id : integer NOT NULL
📈 Nombre d'enregistrements: 21
TABLE: ROLES
===========
01. id : integer NOT NULL DEFAULT nextval('roles_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. display_name : character varying(255) NOT NULL
04. description : text NULL
05. color : character varying(7) NULL DEFAULT '#6b7280'::character varying
06. is_system : boolean NULL DEFAULT false
07. is_active : boolean NULL DEFAULT true
08. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
09. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 4
TABLE: SAV_TICKET_HISTORY
========================
01. id : integer NOT NULL DEFAULT nextval('sav_ticket_history_id_seq'::regclass)
02. ticket_id : integer NOT NULL
03. action : character varying(100) NOT NULL
04. description : text NULL
05. created_by : character varying(255) NOT NULL
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 2
TABLE: SAV_TICKETS
=================
01. id : integer NOT NULL DEFAULT nextval('sav_tickets_id_seq'::regclass)
02. ticket_number : character varying(50) NOT NULL
03. supplier_id : integer NOT NULL
04. group_id : integer NOT NULL
05. product_gencode : character varying(255) NOT NULL
06. product_reference : character varying(255) NULL
07. product_designation : character varying(500) NOT NULL
08. problem_type : character varying(100) NOT NULL
09. problem_description : text NOT NULL
10. resolution_description : text NULL
11. status : character varying(50) NOT NULL DEFAULT 'nouveau'::character varying
12. created_by : character varying(255) NOT NULL
13. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
14. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
15. resolved_at : timestamp without time zone NULL
16. closed_at : timestamp without time zone NULL
17. client_name : character varying(255) NULL
18. client_phone : character varying(255) NULL
19. priority : character varying(50) NOT NULL DEFAULT 'normale'::character varying
📈 Nombre d'enregistrements: 1
TABLE: SESSION
=============
01. sid : character varying NOT NULL
02. sess : json NOT NULL
03. expire : timestamp without time zone NOT NULL
📈 Nombre d'enregistrements: 13
TABLE: SESSIONS
==============
01. id : integer NOT NULL DEFAULT nextval('sessions_id_seq'::regclass)
02. user_id : character varying(255) NULL
03. session_token : character varying(255) NOT NULL
04. expires_at : timestamp without time zone NOT NULL
05. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: STORES
============
01. id : integer NOT NULL DEFAULT nextval('stores_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. address : text NULL
04. city : character varying(255) NULL
05. postal_code : character varying(20) NULL
06. phone : character varying(255) NULL
07. manager_id : character varying(255) NULL
08. is_active : boolean NULL DEFAULT true
09. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 0
TABLE: SUPPLIERS
===============
01. id : integer NOT NULL DEFAULT nextval('suppliers_id_seq'::regclass)
02. name : character varying(255) NOT NULL
03. contact : character varying(255) NULL
04. phone : character varying(255) NULL
05. has_dlc : boolean NULL DEFAULT false
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
08. automatic_reconciliation : boolean NULL DEFAULT false
📈 Nombre d'enregistrements: 45
TABLE: TASKS
===========
01. id : integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass)
02. title : character varying(255) NOT NULL
03. description : text NULL
04. status : character varying(50) NOT NULL DEFAULT 'pending'::character varying
05. priority : character varying(50) NOT NULL DEFAULT 'medium'::character varying
06. assigned_to : character varying(255) NULL
07. due_date : date NULL
08. group_id : integer NOT NULL
09. created_by : character varying(255) NOT NULL
10. created_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
11. updated_at : timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
12. start_date : timestamp without time zone NULL
13. completed_at : timestamp without time zone NULL
14. completed_by : character varying(255) NULL
📈 Nombre d'enregistrements: 76
TABLE: USER_GROUPS
=================
01. user_id : character varying(255) NOT NULL
02. group_id : integer NOT NULL
📈 Nombre d'enregistrements: 7
TABLE: USER_ROLES
================
01. user_id : character varying(255) NOT NULL
02. role_id : integer NOT NULL
03. assigned_by : character varying(255) NULL
04. assigned_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: USERS
===========
01. id : character varying(255) NOT NULL
02. username : character varying(255) NOT NULL
03. email : character varying(255) NULL
04. name : character varying(255) NULL
05. first_name : character varying(255) NULL
06. last_name : character varying(255) NULL
07. profile_image_url : text NULL
08. password : character varying(255) NULL
09. role : character varying(50) NULL DEFAULT 'employee'::character varying
10. password_changed : boolean NULL DEFAULT false
11. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
12. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 8
TABLE: WEATHER_DATA
==================
01. id : integer NOT NULL DEFAULT nextval('weather_data_id_seq'::regclass)
02. date : date NOT NULL
03. location : text NOT NULL
04. temp_max : text NOT NULL
05. temp_min : text NOT NULL
06. icon : text NOT NULL
07. conditions : text NOT NULL
08. is_current_year : boolean NOT NULL DEFAULT true
09. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
10. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 63
TABLE: WEATHER_SETTINGS
======================
01. id : integer NOT NULL DEFAULT nextval('weather_settings_id_seq'::regclass)
02. api_key : text NOT NULL
03. location : text NOT NULL DEFAULT 'Paris, France'::text
04. is_active : boolean NOT NULL DEFAULT true
05. created_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
06. updated_at : timestamp with time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
TABLE: WEBHOOK_BAP_CONFIG
========================
01. id : integer NOT NULL DEFAULT nextval('webhook_bap_config_id_seq'::regclass)
02. name : character varying(100) NOT NULL DEFAULT 'Configuration BAP'::character varying
03. webhook_url : text NOT NULL
04. description : text NULL
05. is_active : boolean NOT NULL DEFAULT true
06. created_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
07. updated_at : timestamp without time zone NULL DEFAULT CURRENT_TIMESTAMP
📈 Nombre d'enregistrements: 1
CONTRAINTES DE CLÉS ÉTRANGÈRES:
===================================
avoirs.created_by → users.id
avoirs.group_id → groups.id
avoirs.supplier_id → suppliers.id
calendar_events.created_by → users.id
calendar_events.group_id → groups.id
client_orders.created_by → users.id
client_orders.group_id → groups.id
command_items.command_id → commands.id
commands.created_by → users.id
commands.group_id → groups.id
commands.supplier_id → suppliers.id
customer_orders.created_by → users.id
customer_orders.group_id → groups.id
customer_orders.supplier_id → suppliers.id
customers.created_by → users.id
customers.group_id → groups.id
dashboard_messages.store_id → groups.id
database_backups.created_by → users.id
deliveries.created_by → users.id
deliveries.group_id → groups.id
deliveries.order_id → orders.id
deliveries.supplier_id → suppliers.id
delivery_items.delivery_id → deliveries.id
dlc_products.created_by → users.id
dlc_products.group_id → groups.id
dlc_products.supplier_id → suppliers.id
dlc_products.validated_by → users.id
invoice_verification_cache.group_id → groups.id
invoice_verifications.delivery_id → deliveries.id
invoice_verifications.group_id → groups.id
invoices.created_by → users.id
invoices.group_id → groups.id
invoices.supplier_id → suppliers.id
nocodb_config.created_by → users.id
orders.created_by → users.id
orders.group_id → groups.id
orders.supplier_id → suppliers.id
publicities.created_by → users.id
publicity_participations.group_id → groups.id
publicity_participations.publicity_id → publicities.id
reconciliation_comments.author_id → users.id
reconciliation_comments.delivery_id → deliveries.id
reconciliation_comments.group_id → groups.id
role_permissions.permission_id → permissions.id
role_permissions.role_id → roles.id
sav_ticket_history.ticket_id → sav_tickets.id
sav_tickets.group_id → groups.id
sav_tickets.supplier_id → suppliers.id
sessions.user_id → users.id
stores.manager_id → users.id
tasks.completed_by → users.id
tasks.created_by → users.id
tasks.group_id → groups.id
user_groups.group_id → groups.id
user_groups.user_id → users.id
user_roles.assigned_by → users.id
user_roles.role_id → roles.id
user_roles.user_id → users.id
===============================================
FIN DU RAPPORT - 2025-09-15T08:08:00.355Z
===============================================
@@ -1,207 +0,0 @@
Lines
100
Actions
{
id: 20,
title: 'DLC',
content: 'Attention des DLC sont en expiré bientôt ou expiré, il faut s en occuper',
type: 'success',
storeId: 2,
createdBy: 'admin',
createdAt: 2025-09-24T11:26:13.521Z
},
{
id: 17,
title: 'Module Avoir',
content: "Le module d'avoir est en place",
type: 'error',
storeId: 1,
createdBy: 'admin',
createdAt: 2025-09-09T07:47:47.650Z
},
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] Raw messages from DB: 4 items: [
{
id: 20,
title: 'DLC',
content: 'Attention des DLC sont en expiré bientôt ou expiré, il faut s en occuper',
type: 'success',
storeId: 2,
createdBy: 'admin',
createdAt: 2025-09-24T11:26:13.521Z
},
{
id: 17,
title: 'Module Avoir',
content: "Le module d'avoir est en place",
type: 'error',
storeId: 1,
createdBy: 'admin',
createdAt: 2025-09-09T07:47:47.650Z
},
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 4
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Found
GET /api/announcements 304 in 29ms
🎯 [PRODUCTION] Found announcements: 4
GET /api/announcements 304 in 31ms
GET /api/dlc-products 200 in 31ms
GET /api/groups 200 in 5ms
HEAD /api/health 200 in 1ms
@@ -1,231 +0,0 @@
Registries
Logs
Notifications
Settings
New version available 2.27.9
DismissSee what's new
Community Edition
2.27.6 LTS
Containers>logiflow-logiflow-1>Logs
Container logs
admin
Log viewer settings
Auto-refresh logs
Wrap lines
Display timestamps
Fetch
All logs
Search
Filter...
Lines
100
Actions
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'admin' }
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '2',
userRole: 'admin'
}
Admin filtering with groupIds: [ 2 ]
Fetching all orders
GET /api/publicities 304 in 33ms
Customer Orders returned: 25 items
GET /api/customer-orders 304 in 43ms
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 304 in 59ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 304 in 65ms
GET /api/groups 200 in 5ms
POST /api/logout 302 in 4ms
📄 SPA: Serving index.html for /auth
📄 SPA: Serving index.html for /auth
GET /api/user 401 in 1ms
GET /api/user 401 in 0ms
GET /api/default-credentials-check 304 in 1ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: 'b23ec450a63faf3957a1...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 51ms
GET /api/user 200 in 3ms
GET /api/user 304 in 4ms
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: [ 2 ]
}
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'employee'
}
Non-admin filtering with groupIds: [ 2 ]
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'employee'
}
Non-admin filtering deliveries with groupIds: [ 2 ]
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
GET /api/orders 200 in 54ms
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'employee' }
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
GET /api/stats/monthly 200 in 62ms
Tasks API called with: { groupIds: [ 2 ], userRole: 'employee' }
Customer Orders returned: 25 items
GET /api/customer-orders 200 in 76ms
Tasks returned: 9 items
GET /api/dlc-products/stats 200 in 80ms
GET /api/tasks 200 in 78ms
GET /api/publicities 304 in 84ms
GET /api/user 304 in 40ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 200 in 93ms
GET /api/user 304 in 5ms
GET /api/publicities 304 in 8ms
GET /api/groups 200 in 6ms
GET /api/user 304 in 7ms
GET /api/suppliers 304 in 6ms
GET /api/user 304 in 4ms
🔍 CUSTOMER ORDER PERMISSION DEBUG: {
userRole: 'employee',
userId: '_1753266816257',
userGroups: [ { userId: '_1753266816257', groupId: 2, group: [Object] } ],
requestedGroupId: 1,
requestedGroupIdType: 'number'
}
🔍 CUSTOMER ORDER - User group IDs: [ 2 ]
🔍 CUSTOMER ORDER - Requested group ID: 1
❌ CUSTOMER ORDER - Access denied: User not in requested group
🔍 Available groups: [ 2 ] Requested: 1
POST /api/customer-orders 403 in 7ms
HEAD /api/health 200 in 0ms
HEAD /api/health 200 in 1ms
@@ -1,209 +0,0 @@
Search
Filter...
Lines
100
Actions
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 29 commandes avec relations
Orders returned: 29 items
GET /api/orders 200 in 95ms
❌ PRODUCTION: Delivery #127 (store 2) linked to order #81 (store 1) - STORE MISMATCH DETECTED!
Customer Orders returned: 42 items
🔗 PRODUCTION: getDeliveries() récupéré 59 livraisons avec relations
Deliveries returned: 59 items
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
GET /api/customer-orders 304 in 109ms
GET /api/deliveries 304 in 111ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
GET /api/groups 304 in 58ms
🔍 [PRODUCTION] User search result: Found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 117ms
GET /api/user 304 in 4ms
GET /api/users 304 in 15ms
HEAD /api/health 200 in 0ms
📝 POST /api/tasks - Received data: {
originalBody: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin'
},
processedData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-07',
dueDateType: 'string',
dueDateValue: '2025-09-07'
}
💾 DatabaseStorage.createTask - Input: {
taskData: {
title: 'test',
description: 'test',
priority: 'medium',
status: 'pending',
assignedTo: 'Non assigné',
startDate: '2025-09-02',
dueDate: '2025-09-07',
groupId: 2,
createdBy: 'admin_local'
},
dueDate: '2025-09-07',
dueDateType: 'string',
dueDateISO: '2025-09-07'
}
Error creating task: TypeError: value.toISOString is not a function
at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18)
at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:92:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21
at Array.map (<anonymous>)
at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32)
POST /api/tasks 500 in 7ms
@@ -1,209 +0,0 @@
ctions
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
GET /api/publicities 200 in 191ms
🎯 [PRODUCTION] Found announcements: 0
Customer Orders returned: 10 items
🔗 PRODUCTION: getDeliveries() récupéré 48 livraisons avec relations
Deliveries returned: 48 items
GET /api/announcements 200 in 265ms
GET /api/customer-orders 200 in 180ms
GET /api/deliveries 200 in 187ms
🔗 PRODUCTION: getOrders() récupéré 33 commandes avec relations
Orders returned: 33 items
GET /api/orders 200 in 241ms
🎯 [SERVER] POST /api/announcements endpoint hit
🎯 [SERVER] Request body: {
"title": "test",
"content": "test",
"type": "info",
"storeId": 1,
"createdBy": "admin"
}
🎯 [SERVER] User object: { hasClaims: false, hasId: true, userId: 'admin_local' }
🎯 [SERVER] Extracted userId: admin_local
🎯 [SERVER] User found: { username: 'admin', role: 'admin', id: 'admin_local' }
🎯 [SERVER] User is admin, proceeding with validation
🎯 [SERVER] Announcement data validated: {
title: 'test',
content: 'test',
type: 'info',
storeId: null,
createdBy: 'admin_local'
}
🎯 [PRODUCTION] Creating in PostgreSQL DASHBOARD_MESSAGES table
🎯 [PRODUCTION] Announcement created successfully in DB: {

,
title: 'test',
content: 'test',
type: 'info',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-17T09:19:30.102Z,
author: { id: 'admin_local', firstName: 'Administrateur', lastName: '' },
group: null
}
POST /api/announcements 201 in 19ms
📢 [SERVER] Fetching announcements for user: admin_local environment: production
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🎯 [PRODUCTION] Found announcements: 0
GET /api/announcements 200 in 8ms
HEAD /api/health 200 in 0ms
🎯 [SERVER] POST /api/announcements endpoint hit
🎯 [SERVER] Request body: {
"title": "rzqr",
"content": "etset",
"type": "info",
"storeId": 1,
"createdBy": "admin"
}
🎯 [SERVER] User object: { hasClaims: false, hasId: true, userId: 'admin_local' }
🎯 [SERVER] Extracted userId: admin_local
🎯 [SERVER] User found: { username: 'admin', role: 'admin', id: 'admin_local' }
🎯 [SERVER] User is admin, proceeding with validation
🎯 [SERVER] Announcement data validated: {
title: 'rzqr',
content: 'etset',
type: 'info',
storeId: null,
createdBy: 'admin_local'
}
🎯 [PRODUCTION] Creating in PostgreSQL DASHBOARD_MESSAGES table
🎯 [PRODUCTION] Announcement created successfully in DB: {

,
title: 'rzqr',
content: 'etset',
type: 'info',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-17T09:19:37.509Z,
author: { id: 'admin_local', firstName: 'Administrateur', lastName: '' },
group: null
}
POST /api/announcements 201 in 10ms
📢 [SERVER] Fetching announcements for user: admin_local environment: production
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🎯 [PRODUCTION] Found announcements: 0
GET /api/announcements 200 in 11ms
@@ -1,205 +0,0 @@
ctions
🗓️ [DATE-CALC] Année précédente: 2024-08-17 (Samedi)
GET /api/user 200 in 295ms
GET /api/user 200 in 347ms
GET /api/user 200 in 348ms
GET /api/dlc-products/stats 200 in 328ms
Customer Orders returned: 38 items
📋 Tasks returned: {
␍ count: 55,
userId: 'admin_local',
userRole: 'admin',
requestedStoreId: undefined,
groupIds: undefined,
taskGroups: [
{ id: 91, title: 'refaire podium lot assiettes', groupId: 2 },
{ id: 90, title: 'caisse 1', groupId: 1 },
{ id: 89, title: 'caisse 3', groupId: 1 }
]
}
🌤️ [RESPONSE] Weather data prepared: {
hasCurrentYear: true,
hasPreviousYear: true,
location: 'Frouard, France'
}
GET /api/customer-orders 200 in 367ms
GET /api/tasks 200 in 341ms
GET /api/publicities 200 in 357ms
GET /api/weather/current 200 in 384ms
🔗 PRODUCTION: getDeliveries() récupéré 86 livraisons avec relations
Deliveries returned: 86 items
GET /api/deliveries 200 in 462ms
📊 Statistiques calculées: {
ordersCount: 20,
deliveriesCount: 42,
pendingOrdersCount: 8,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
GET /api/stats/monthly 200 in 477ms
GET /api/groups 200 in 57ms
📢 Stockage mémoire des annonces initialisé
GET /api/announcements 200 in 53ms
GET /api/publicities 200 in 44ms
🎯 [SERVER] POST /api/announcements endpoint hit
🎯 [SERVER] Request body: {
"title": "TEST",
"content": "TEST",
"type": "info"
}
🎯 [SERVER] User object: { hasClaims: false, hasId: true, userId: 'admin_local' }
🎯 [SERVER] Extracted userId: admin_local
🎯 [SERVER] User found: { username: 'admin', role: 'admin', id: 'admin_local' }
🎯 [SERVER] User is admin, proceeding with validation
🎯 [SERVER] Error creating announcement: ZodError: [
{
"code": "invalid_type",
"expected": "string",
"received": "undefined",
"path": [
"createdBy"
],
"message": "Required"
}
]
at get error [as error] (file:///app/node_modules/zod/v3/types.js:39:31)
at ZodObject.parse (file:///app/node_modules/zod/v3/types.js:114:22)
at file:///app/dist/index.js:7601:57
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
issues: [
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: [Array],
message: 'Required'
}
],
addIssue: [Function (anonymous)],
addIssues: [Function (anonymous)],
errors: [
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: [Array],
message: 'Required'
}
]
}
🎯 [SERVER] Validation errors: [
{
code: 'invalid_type',
expected: 'string',
received: 'undefined',
path: [ 'createdBy' ],
message: 'Required'
}
]
POST /api/announcements 400 in 11ms
HEAD /api/health 200 in 1ms
@@ -1,204 +0,0 @@
ctions
GET /api/user 401 in 2ms
GET /api/default-credentials-check 304 in 2ms
🔐 comparePasswords: {
supplied: 'HIDDEN',
stored: 'b23ec450a63faf3957a1...',
hasFormat: true
}
🔐 Password comparison result: true
POST /api/login 200 in 51ms
GET /api/user 200 in 5ms
GET /api/user 304 in 10ms
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: [ 2 ]
}
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'employee'
}
Non-admin filtering with groupIds: [ 2 ]
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'employee'
}
Non-admin filtering deliveries with groupIds: [ 2 ]
📊 Statistiques calculées: {
ordersCount: 8,
deliveriesCount: 21,
pendingOrdersCount: 4,
averageDeliveryTime: 0.17647058823529413,
totalPalettes: 57,
totalPackages: 17
}
🔗 PRODUCTION: getOrders() récupéré 18 commandes avec relations
Orders returned: 18 items
Customer Orders API called with: { groupIds: [ 2 ], userRole: 'employee' }
GET /api/stats/monthly 200 in 76ms
GET /api/orders 200 in 76ms
Customer Orders returned: 25 items
GET /api/customer-orders 200 in 82ms
🔗 PRODUCTION: getDeliveries() récupéré 38 livraisons avec relations
Deliveries returned: 38 items
GET /api/deliveries 200 in 91ms
Tasks API called with: { groupIds: [ 2 ], userRole: 'employee' }
GET /api/publicities 304 in 92ms
GET /api/dlc-products/stats 200 in 93ms
Tasks returned: 9 items
GET /api/tasks 200 in 92ms
GET /api/user 304 in 23ms
GET /api/publicities 304 in 9ms
GET /api/user 304 in 4ms
GET /api/groups 200 in 5ms
GET /api/user 304 in 7ms
GET /api/suppliers 304 in 10ms
GET /api/user 304 in 7ms
🔍 CUSTOMER ORDER PERMISSION DEBUG: {
userRole: 'employee',
userId: '_1753266816257',
userGroups: [ { userId: '_1753266816257', groupId: 2, group: [Object] } ],
requestedGroupId: 2,
requestedGroupIdType: 'number'
}
🔍 CUSTOMER ORDER - User group IDs: [ 2 ]
🔍 CUSTOMER ORDER - Requested group ID: 2
🔍 CUSTOMER ORDER - Converted group ID: 2
✅ CUSTOMER ORDER - Permission granted for user role: employee
Error creating customer order: error: null value in column "order_taker" of relation "customer_orders" violates not-null constraint
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.createCustomerOrder (file:///app/dist/index.js:1823:33)
at async file:///app/dist/index.js:5278:29 {
length: 395,
severity: 'ERROR',
code: '23502',
detail: 'Failing row contains (73, null, test, null, null, null, null, 366092323745, 1, 2, En attente de Commande, 0.00, f, f, null, 2, _1753266816257, 2025-08-14 11:55:42.977226, 2025-08-14 11:55:42.977226).',
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: 'public',
table: 'customer_orders',
column: 'order_taker',
dataType: undefined,
constraint: undefined,
file: 'execMain.c',
line: '1972',
routine: 'ExecConstraints'
}
POST /api/customer-orders 500 in 13ms
HEAD /api/health 200 in 0ms
@@ -1,204 +0,0 @@
ctions
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 74ms
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 86ms
GET /api/user 304 in 4ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/orders 304 in 115ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 147ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
GET /api/deliveries 304 in 187ms
🔍 [PRODUCTION] User search result: Found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 185ms
GET /api/groups 304 in 140ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 7ms
🔍 Avoirs API called with: { groupIds: undefined, userRole: 'admin' }
📋 Avoirs returned: 0 items
GET /api/avoirs 304 in 14ms
🔍 [POST AVOIR] Données reçues: {
"supplierId": 34,
"groupId": 1,
"invoiceReference": "",
"comment": "",
"commercialProcessed": false
}
🔍 [POST AVOIR] User: { id: 'admin_local', role: 'admin' }
POST /api/avoirs 400 in 9ms
@@ -1,204 +0,0 @@
ctions
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
🔗 PRODUCTION: getDeliveries() récupéré 44 livraisons avec relations
Deliveries returned: 44 items
Customer Orders returned: 9 items
GET /api/deliveries 304 in 124ms
GET /api/customer-orders 304 in 116ms
🔗 PRODUCTION: getOrders() récupéré 31 commandes avec relations
Orders returned: 31 items
GET /api/orders 304 in 148ms
GET /api/groups 304 in 95ms
GET /api/publicities 304 in 140ms
🌤️ Fetching previous year weather data from API
Weather API error for previous year: 401
GET /api/weather/current 200 in 886ms
GET /api/user 304 in 5ms
GET /api/user 304 in 4ms
GET /api/backups 304 in 8ms
GET /api/weather/settings 200 in 4ms
HEAD /api/health 200 in 1ms
PUT /api/weather/settings/1 200 in 11ms
GET /api/weather/settings 200 in 4ms
GET /api/user 304 in 12ms
GET /api/publicities 304 in 32ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: [ 1 ]
Fetching all deliveries
📊 Calcul statistiques mensuelles: {
year: 2025,
month: 8,
startDate: '2025-08-01',
endDate: '2025-09-01',
groupIds: undefined
}
🔗 PRODUCTION: getDeliveries() récupéré 44 livraisons avec relations
Deliveries returned: 44 items
GET /api/deliveries 304 in 168ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
userRole: 'admin'
}
Admin filtering with groupIds: undefined
Fetching all orders
Customer Orders API called with: { groupIds: undefined, userRole: 'admin' }
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
Admin filtering with groupIds: [ 1 ]
Fetching all orders
Tasks API called with: { groupIds: undefined, userRole: 'admin' }
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
🔗 PRODUCTION: getOrders() récupéré 49 commandes avec relations
Orders returned: 49 items
GET /api/orders 304 in 336ms
📊 Statistiques calculées: {
ordersCount: 18,
deliveriesCount: 42,
pendingOrdersCount: 6,
averageDeliveryTime: 0.3611111111111111,
totalPalettes: 120,
totalPackages: 36
}
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: undefined,
withBL: undefined,
userRole: 'admin'
}
Admin filtering deliveries with groupIds: undefined
Fetching all deliveries
GET /api/stats/monthly 304 in 364ms
GET /api/dlc-products/stats 304 in 351ms
Tasks returned: 61 items
Customer Orders returned: 36 items
Customer Orders returned: 9 items
GET /api/tasks 304 in 361ms
GET /api/customer-orders 304 in 373ms
GET /api/customer-orders 304 in 331ms
🔗 PRODUCTION: getOrders() récupéré 31 commandes avec relations
Orders returned: 31 items
GET /api/orders 304 in 370ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 456ms
GET /api/publicities 304 in 400ms
HEAD /api/health 200 in 2ms
@@ -1,204 +0,0 @@
dueDate: null,
fromCache: true,
permanent: false
}
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FC25638222',
supplierName: 'Tendance',
invoiceAmount: undefined,
dueDate: null,
fromCache: true,
permanent: false
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: '1_fc25638222',
expires: 2025-11-04T11:22:05.884Z,
hoursRemaining: 6
}
🔍 [CACHE] Résultat cache: {
found: true,
isReconciled: false,
expired: false,
expiresAt: 2025-11-04T11:22:05.884Z,
currentTime: '2025-11-04T05:33:50.014Z'
}
✅ [CACHE] Cache temporaire hit pour: { invoiceReference: 'FC25638222', groupId: 1, exists: true }
✅ [INVOICE] Résultat depuis cache: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FC25638222',
supplierName: 'Tendance',
invoiceAmount: undefined,
dueDate: null,
fromCache: true,
permanent: false
}
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FC25638222',
supplierName: 'Tendance',
invoiceAmount: undefined,
dueDate: null,
fromCache: true,
permanent: false
}
POST /api/deliveries/335/verify-invoice 200 in 432ms
POST /api/deliveries/420/verify-invoice 200 in 462ms
POST /api/deliveries/385/verify-invoice 200 in 424ms
POST /api/deliveries/385/verify-invoice 200 in 407ms
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: 'bl_1_bl00060473_ access deco',
expires: 2025-11-04T10:19:30.357Z,
hoursRemaining: 5
}
💾 Cache hit pour BL: { blNumber: 'BL00060473', groupId: 1 }
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucun BL correspondant trouvé dans NocoDB',
invoiceReference: 'BL00060473',
supplierName: ' Access Deco',
fromCache: true
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: 'bl_1_198355_depot',
expires: 2025-11-04T10:19:30.101Z,
hoursRemaining: 5
}
💾 Cache hit pour BL: { blNumber: '198355', groupId: 1 }
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucun BL correspondant trouvé dans NocoDB',
invoiceReference: '198355',
supplierName: 'Depot',
fromCache: true
}
✅ [DATABASE-CACHE] Cache hit pour: {
cacheKey: 'bl_1_bl00060473_ access deco',
expires: 2025-11-04T10:19:30.357Z,
hoursRemaining: 5
}
💾 Cache hit pour BL: { blNumber: 'BL00060473', groupId: 1 }
✅ Résultat vérification: {
exists: false,
matchType: 'none',
errorMessage: 'Aucun BL correspondant trouvé dans NocoDB',
invoiceReference: 'BL00060473',
supplierName: ' Access Deco',
fromCache: true
}
POST /api/deliveries/333/verify-invoice 200 in 449ms
POST /api/deliveries/335/verify-invoice 200 in 414ms
POST /api/deliveries/333/verify-invoice 200 in 439ms
HEAD /api/health 200 in 1ms
@@ -1,611 +0,0 @@
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:977 🔍 RouterProduction Debug: {environment: 'production', isAuthenticated: false, isLoading: true, hasUser: false, userId: undefined, …}
index-D62VSbre.js:513 🔄 Production auth check starting, refreshTrigger: 0
index-D62VSbre.js:513 🔄 Production auth response: 200
index-D62VSbre.js:513 ✅ Production auth success: {username: 'admin', id: 'admin_local'}
index-D62VSbre.js:513 🔄 Production auth check complete, loading set to false
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:977 🔍 RouterProduction Debug: {environment: 'production', isAuthenticated: true, isLoading: false, hasUser: true, userId: 'admin_local', …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🏪 Layout - Restoring selectedStoreId from localStorage: {saved: '1', restoredId: 1}
index-D62VSbre.js:557 🔧 Layout - Restoring sidebar state: {saved: 'false', isMobile: false}
index-D62VSbre.js:557 Sidebar - User: null
index-D62VSbre.js:557 Sidebar - isLoading: true
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 0, stats: undefined, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔄 Production auth check starting, refreshTrigger: 0
index-D62VSbre.js:513 🔄 Production auth check starting, refreshTrigger: 0
index-D62VSbre.js:513 🔄 Production auth check starting, refreshTrigger: 0
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: null
index-D62VSbre.js:557 Sidebar - isLoading: true
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 0, stats: undefined, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:553 ✅ Auth check successful: {username: 'admin', id: 'admin_local'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 10, stats: undefined, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔄 Production auth response: 200
index-D62VSbre.js:513 ✅ Production auth success: {username: 'admin', id: 'admin_local'}
index-D62VSbre.js:513 🔄 Production auth check complete, loading set to false
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🔍 [ANNOUNCEMENTS] Fetching from: /api/announcements?storeId=1
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 10, stats: undefined, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 70, upcomingPublicities: 10, stats: undefined, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 70, upcomingPublicities: 10, stats: {…}, …}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🚚 Dashboard - Upcoming deliveries result: 0 []
📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 70, upcomingPublicities: 10, stats: {…}, …}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🚚 Dashboard - Upcoming deliveries result: 0 []
📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 70, upcomingPublicities: 10, stats: {…}, …}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🚚 Dashboard - Upcoming deliveries result: 0 []
📊 Dashboard Debug - Raw Data: {allOrders: 100, allDeliveries: 0, customerOrders: 70, upcomingPublicities: 10, stats: {…}, …}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🚚 Dashboard - Delivery filter: {id: 192, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 191, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
🚚 Dashboard - Delivery filter: {id: 190, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
🚚 Dashboard - Delivery filter: {id: 189, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 188, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
🚚 Dashboard - Delivery filter: {id: 187, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 186, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 185, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 184, status: 'planned', isPlanned: true, scheduledDate: '2025-09-11'}
🚚 Dashboard - Delivery filter: {id: 183, status: 'planned', isPlanned: true, scheduledDate: '2025-09-10'}
🚚 Dashboard - Delivery filter: {id: 182, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
🚚 Dashboard - Delivery filter: {id: 181, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 180, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 179, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
🚚 Dashboard - Delivery filter: {id: 178, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
🚚 Dashboard - Delivery filter: {id: 177, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
🚚 Dashboard - Delivery filter: {id: 176, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
🚚 Dashboard - Delivery filter: {id: 175, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
🚚 Dashboard - Delivery filter: {id: 174, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 171, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 170, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 169, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 168, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 166, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
🚚 Dashboard - Delivery filter: {id: 165, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 164, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 163, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 162, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 161, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 160, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-01'}
🚚 Dashboard - Delivery filter: {id: 159, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-01'}
🚚 Dashboard - Delivery filter: {id: 158, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 157, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 156, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 154, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-27'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 152, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 151, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 150, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 149, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 148, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 147, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 145, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 144, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 143, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-27'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 142, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 141, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 140, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 139, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 138, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 137, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 135, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 134, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 133, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 132, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 131, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 130, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 129, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 128, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 127, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 125, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 124, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 123, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 122, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 121, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 118, status: 'planned', isPlanned: true, scheduledDate: '2025-10-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 117, status: 'planned', isPlanned: true, scheduledDate: '2025-09-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 116, status: 'planned', isPlanned: true, scheduledDate: '2025-09-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 115, status: 'planned', isPlanned: true, scheduledDate: '2025-09-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 111, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 104, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 101, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 100, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 98, status: 'planned', isPlanned: true, scheduledDate: '2025-08-12'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 97, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-12'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 96, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 94, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 93, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 91, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 90, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 89, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 88, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 87, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 86, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 84, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 83, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 82, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 81, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 80, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 79, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 78, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 77, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 76, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 75, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 74, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 72, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 71, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 69, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 68, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 67, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 66, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 65, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 63, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 62, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 61, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 60, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 58, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 56, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 55, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 54, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 53, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 52, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 51, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 50, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 49, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 48, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 46, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 45, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 43, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 42, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 41, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 40, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 39, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 38, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 37, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 36, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 35, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 34, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-16'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 33, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-18'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 32, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 31, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 30, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 29, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 28, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 27, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 26, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 25, status: 'planned', isPlanned: true, scheduledDate: '2025-10-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 24, status: 'planned', isPlanned: true, scheduledDate: '2025-10-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 23, status: 'planned', isPlanned: true, scheduledDate: '2025-09-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 22, status: 'planned', isPlanned: true, scheduledDate: '2025-09-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 21, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 18, status: 'planned', isPlanned: true, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 17, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 16, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 15, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 13, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 11, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 10, status: 'planned', isPlanned: true, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 4 (4) [{…}, {…}, {…}, {…}]
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 100, allDeliveries: 147, customerOrders: 70, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔄 Production auth response: 200
index-D62VSbre.js:513 ✅ Production auth success: {username: 'admin', id: 'admin_local'}
index-D62VSbre.js:513 🔄 Production auth check complete, loading set to false
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 ✅ [ANNOUNCEMENTS] Data received: (2) [{…}, {…}]
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔄 Production auth response: 200
index-D62VSbre.js:513 ✅ Production auth success: {username: 'admin', id: 'admin_local'}
index-D62VSbre.js:513 🔄 Production auth check complete, loading set to false
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 0, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 0 []
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 64, allDeliveries: 0, customerOrders: 0, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 192, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 191, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 187, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 186, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 185, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 184, status: 'planned', isPlanned: true, scheduledDate: '2025-09-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 183, status: 'planned', isPlanned: true, scheduledDate: '2025-09-10'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 182, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 181, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 180, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 177, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 176, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 171, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 163, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 162, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 161, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 159, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 158, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 157, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 154, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-27'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 148, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 147, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 145, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 144, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 142, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 141, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 139, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 138, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 137, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 135, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 134, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 129, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 128, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 123, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 118, status: 'planned', isPlanned: true, scheduledDate: '2025-10-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 117, status: 'planned', isPlanned: true, scheduledDate: '2025-09-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 116, status: 'planned', isPlanned: true, scheduledDate: '2025-09-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 115, status: 'planned', isPlanned: true, scheduledDate: '2025-09-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 104, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 101, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 97, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-12'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 90, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 89, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 88, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
🚚 Dashboard - Delivery filter: {id: 87, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 84, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
🚚 Dashboard - Delivery filter: {id: 83, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
🚚 Dashboard - Delivery filter: {id: 82, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 81, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 77, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 76, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 75, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 74, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 72, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
🚚 Dashboard - Delivery filter: {id: 69, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
🚚 Dashboard - Delivery filter: {id: 66, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
🚚 Dashboard - Delivery filter: {id: 62, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
🚚 Dashboard - Delivery filter: {id: 61, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
🚚 Dashboard - Delivery filter: {id: 60, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
🚚 Dashboard - Delivery filter: {id: 58, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 56, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
🚚 Dashboard - Delivery filter: {id: 55, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
🚚 Dashboard - Delivery filter: {id: 52, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
🚚 Dashboard - Delivery filter: {id: 51, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
🚚 Dashboard - Delivery filter: {id: 43, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
🚚 Dashboard - Delivery filter: {id: 41, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
🚚 Dashboard - Delivery filter: {id: 40, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
🚚 Dashboard - Delivery filter: {id: 38, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
🚚 Dashboard - Delivery filter: {id: 37, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
🚚 Dashboard - Delivery filter: {id: 36, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-21'}
🚚 Dashboard - Delivery filter: {id: 35, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-15'}
🚚 Dashboard - Delivery filter: {id: 34, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-16'}
🚚 Dashboard - Delivery filter: {id: 33, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-18'}
🚚 Dashboard - Delivery filter: {id: 32, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
🚚 Dashboard - Delivery filter: {id: 31, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
🚚 Dashboard - Delivery filter: {id: 30, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
🚚 Dashboard - Delivery filter: {id: 29, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
🚚 Dashboard - Delivery filter: {id: 28, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
🚚 Dashboard - Delivery filter: {id: 27, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
🚚 Dashboard - Delivery filter: {id: 13, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
🚚 Dashboard - Delivery filter: {id: 11, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
🚚 Dashboard - Delivery filter: {id: 10, status: 'planned', isPlanned: true, scheduledDate: '2025-08-14'}
🚚 Dashboard - Upcoming deliveries result: 4 (4) [{…}, {…}, {…}, {…}]
📊 Dashboard Debug - Raw Data: {allOrders: 64, allDeliveries: 82, customerOrders: 0, upcomingPublicities: 10, stats: {…}, …}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🏪 Selected store validated successfully: {selectedStoreId: 1, userRole: 'admin', storeName: 'Frouard'}
🏪 Store initialization complete: {user: 'admin', selectedStoreId: 1, storesCount: 2, validatedStore: 'Frouard', autoSelected: false}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
Sidebar - isLoading: false
Sidebar - error: null
🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
🚚 Dashboard - Delivery filter: {id: 192, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 191, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
🚚 Dashboard - Delivery filter: {id: 187, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 186, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 185, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 184, status: 'planned', isPlanned: true, scheduledDate: '2025-09-11'}
🚚 Dashboard - Delivery filter: {id: 183, status: 'planned', isPlanned: true, scheduledDate: '2025-09-10'}
🚚 Dashboard - Delivery filter: {id: 182, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
🚚 Dashboard - Delivery filter: {id: 181, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 180, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
🚚 Dashboard - Delivery filter: {id: 177, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
🚚 Dashboard - Delivery filter: {id: 176, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
🚚 Dashboard - Delivery filter: {id: 171, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
🚚 Dashboard - Delivery filter: {id: 163, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 162, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 161, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
🚚 Dashboard - Delivery filter: {id: 159, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-01'}
🚚 Dashboard - Delivery filter: {id: 158, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-29'}
🚚 Dashboard - Delivery filter: {id: 157, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
🚚 Dashboard - Delivery filter: {id: 154, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-27'}
🚚 Dashboard - Delivery filter: {id: 148, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
🚚 Dashboard - Delivery filter: {id: 147, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
🚚 Dashboard - Delivery filter: {id: 145, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
🚚 Dashboard - Delivery filter: {id: 144, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
🚚 Dashboard - Delivery filter: {id: 142, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
🚚 Dashboard - Delivery filter: {id: 141, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
🚚 Dashboard - Delivery filter: {id: 139, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
🚚 Dashboard - Delivery filter: {id: 138, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
🚚 Dashboard - Delivery filter: {id: 137, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
🚚 Dashboard - Delivery filter: {id: 135, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
🚚 Dashboard - Delivery filter: {id: 134, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
🚚 Dashboard - Delivery filter: {id: 129, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
🚚 Dashboard - Delivery filter: {id: 128, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
🚚 Dashboard - Delivery filter: {id: 123, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
🚚 Dashboard - Delivery filter: {id: 118, status: 'planned', isPlanned: true, scheduledDate: '2025-10-06'}
🚚 Dashboard - Delivery filter: {id: 117, status: 'planned', isPlanned: true, scheduledDate: '2025-09-29'}
🚚 Dashboard - Delivery filter: {id: 116, status: 'planned', isPlanned: true, scheduledDate: '2025-09-22'}
🚚 Dashboard - Delivery filter: {id: 115, status: 'planned', isPlanned: true, scheduledDate: '2025-09-15'}
🚚 Dashboard - Delivery filter: {id: 104, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
🚚 Dashboard - Delivery filter: {id: 101, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
🚚 Dashboard - Delivery filter: {id: 97, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-12'}
🚚 Dashboard - Delivery filter: {id: 90, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
🚚 Dashboard - Delivery filter: {id: 89, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
🚚 Dashboard - Delivery filter: {id: 88, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
🚚 Dashboard - Delivery filter: {id: 87, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 84, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
🚚 Dashboard - Delivery filter: {id: 83, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
🚚 Dashboard - Delivery filter: {id: 82, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 81, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
🚚 Dashboard - Delivery filter: {id: 77, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 76, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 75, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
🚚 Dashboard - Delivery filter: {id: 74, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 72, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 69, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 66, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 62, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 61, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 60, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 58, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 56, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 55, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 52, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 51, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 43, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 41, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 40, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 38, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 37, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 36, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 35, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 34, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-16'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 33, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-18'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 32, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 31, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 30, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 29, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 28, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 27, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 13, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 11, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 10, status: 'planned', isPlanned: true, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 4 (4) [{…}, {…}, {…}, {…}]
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 64, allDeliveries: 82, customerOrders: 11, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 192, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 191, status: 'planned', isPlanned: true, scheduledDate: '2025-09-09'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 187, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 186, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 185, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 184, status: 'planned', isPlanned: true, scheduledDate: '2025-09-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 183, status: 'planned', isPlanned: true, scheduledDate: '2025-09-10'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 182, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 181, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 180, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 177, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-03'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 176, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-04'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 171, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-02'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 163, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 162, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 161, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 159, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 158, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 157, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 154, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-27'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 148, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 147, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 145, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 144, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-26'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 142, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 141, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 139, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 138, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 137, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 135, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 134, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 129, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 128, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 123, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-19'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 118, status: 'planned', isPlanned: true, scheduledDate: '2025-10-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 117, status: 'planned', isPlanned: true, scheduledDate: '2025-09-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 116, status: 'planned', isPlanned: true, scheduledDate: '2025-09-22'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 115, status: 'planned', isPlanned: true, scheduledDate: '2025-09-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 104, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-20'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 101, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 97, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-12'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 90, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-11'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 89, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 88, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-13'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 87, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 84, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 83, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 82, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 81, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 77, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 76, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 75, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-06'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 74, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-07'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 72, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 69, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 66, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-05'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 62, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 61, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 60, status: 'delivered', isPlanned: false, scheduledDate: '2025-08-01'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 58, status: 'delivered', isPlanned: false, scheduledDate: '2025-09-08'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 56, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 55, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 52, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 51, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-31'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 43, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-29'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 41, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 40, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-28'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 38, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 37, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-30'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 36, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-21'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 35, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-15'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 34, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-16'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 33, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-18'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 32, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 31, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 30, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 29, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 28, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-23'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 27, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-24'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 13, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 11, status: 'delivered', isPlanned: false, scheduledDate: '2025-07-25'}
index-D62VSbre.js:557 🚚 Dashboard - Delivery filter: {id: 10, status: 'planned', isPlanned: true, scheduledDate: '2025-08-14'}
index-D62VSbre.js:557 🚚 Dashboard - Upcoming deliveries result: 4 (4) [{…}, {…}, {…}, {…}]
index-D62VSbre.js:557 📊 Dashboard Debug - Raw Data: {allOrders: 64, allDeliveries: 82, customerOrders: 11, upcomingPublicities: 10, stats: {…}, …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 0, first: null}
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 0, first: null}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:977 🔍 RouterProduction Debug: {environment: 'production', isAuthenticated: true, isLoading: false, hasUser: true, userId: 'admin_local', …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 0, first: null}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:977 🔍 RouterProduction Debug: {environment: 'production', isAuthenticated: true, isLoading: false, hasUser: true, userId: 'admin_local', …}
index-D62VSbre.js:513 🔍 Auth Environment Debug: {hostname: 'logiflow.ffnancy.fr', isDev: false, environment: 'production'}
index-D62VSbre.js:557 Sidebar - User: {id: 'admin_local', username: 'admin', email: 'admin@logiflow.com', firstName: 'Administrateur', lastName: '', …}
index-D62VSbre.js:557 Sidebar - isLoading: false
index-D62VSbre.js:557 Sidebar - error: null
index-D62VSbre.js:557 🔧 Sidebar Debug: {isMobile: false, sidebarCollapsed: false, mobileMenuOpen: false, width: 'expanded (256px)', classes: 'sidebar-expanded bg-white border-r border-gray-200…shadow-lg transition-all duration-300 ease-in-out'}
index-D62VSbre.js:977 💰 Fetching avoirs from: /api/avoirs?storeId=1
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 0, first: null}
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 0, first: null}
index-D62VSbre.js:977 💰 Avoirs received: 1 items
index-D62VSbre.js:977 🔍 Render avoir: {id: 7, hasSupplier: true, hasGroup: true, hasCreator: true, createdAt: '2025-09-08T18:09:02.103Z', …}
index-D62VSbre.js:977 ❌ Erreur rendu avoir: TypeError: E.amount.toFixed is not a function
at index-D62VSbre.js:977:82600
at Array.map (<anonymous>)
at QY (index-D62VSbre.js:977:80948)
at ev (index-D62VSbre.js:38:17018)
at dx (index-D62VSbre.js:40:3139)
at z_ (index-D62VSbre.js:40:44833)
at L_ (index-D62VSbre.js:40:39790)
at HI (index-D62VSbre.js:40:39718)
at $f (index-D62VSbre.js:40:39570)
at C1 (index-D62VSbre.js:40:36683) {id: 7, supplierId: 3, groupId: 1, invoiceReference: 'FC-25-00005972', amount: '-47.98', …}
(anonymous) @ index-D62VSbre.js:977
QY @ index-D62VSbre.js:977
ev @ index-D62VSbre.js:38
dx @ index-D62VSbre.js:40
z_ @ index-D62VSbre.js:40
L_ @ index-D62VSbre.js:40
HI @ index-D62VSbre.js:40
$f @ index-D62VSbre.js:40
C1 @ index-D62VSbre.js:40
Ni @ index-D62VSbre.js:38
(anonymous) @ index-D62VSbre.js:40
setTimeout
hR @ index-D62VSbre.js:40
o @ index-D62VSbre.js:40
batch @ index-D62VSbre.js:40
ea @ index-D62VSbre.js:40
setData @ index-D62VSbre.js:40
onSuccess @ index-D62VSbre.js:40
f @ index-D62VSbre.js:40
Promise.then
b @ index-D62VSbre.js:40
start @ index-D62VSbre.js:40
fetch @ index-D62VSbre.js:40
Ec @ index-D62VSbre.js:40
setOptions @ index-D62VSbre.js:40
(anonymous) @ index-D62VSbre.js:40
Em @ index-D62VSbre.js:40
Jo @ index-D62VSbre.js:40
QI @ index-D62VSbre.js:40
Ti @ index-D62VSbre.js:40
C1 @ index-D62VSbre.js:40
Ni @ index-D62VSbre.js:38
(anonymous) @ index-D62VSbre.js:40
setTimeout
hR @ index-D62VSbre.js:40
o @ index-D62VSbre.js:40
batch @ index-D62VSbre.js:40
ea @ index-D62VSbre.js:40
setData @ index-D62VSbre.js:40
onSuccess @ index-D62VSbre.js:40
f @ index-D62VSbre.js:40
Promise.then
b @ index-D62VSbre.js:40
start @ index-D62VSbre.js:40
fetch @ index-D62VSbre.js:40
Ec @ index-D62VSbre.js:40
onSubscribe @ index-D62VSbre.js:40
subscribe @ index-D62VSbre.js:40
(anonymous) @ index-D62VSbre.js:40
n_ @ index-D62VSbre.js:38
Em @ index-D62VSbre.js:40
Jo @ index-D62VSbre.js:40
QI @ index-D62VSbre.js:40
Ti @ index-D62VSbre.js:40
C1 @ index-D62VSbre.js:40
Ni @ index-D62VSbre.js:38
(anonymous) @ index-D62VSbre.js:40
index-D62VSbre.js:977 💰 Debug avoirs reçus: {count: 1, first: {…}}
@@ -1,205 +0,0 @@
ions
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
GET /api/user 304 in 64ms
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 164ms
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 67ms
GET /api/user 304 in 4ms
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 93ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 156ms
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/orders 304 in 194ms
GET /api/announcements 304 in 192ms
GET /api/groups 304 in 92ms
GET /api/user 304 in 4ms
GET /api/suppliers 304 in 7ms
🔍 Avoirs API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 11ms
HEAD /api/health 200 in 1ms
@@ -1,205 +0,0 @@
ns
}
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: undefined }
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Found
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 77ms
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 83ms
GET /api/user 304 in 3ms
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
Customer Orders returned: 11 items
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
GET /api/customer-orders 304 in 113ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 151ms
GET /api/groups 304 in 139ms
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
GET /api/orders 304 in 198ms
🔍 [PRODUCTION] User search result: Found
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
❌ [PRODUCTION] User not found with username: admin_local
GET /api/announcements 304 in 196ms
GET /api/user 304 in 10ms
GET /api/suppliers 304 in 7ms
🔍 Avoirs API called with: { groupIds: undefined, userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 11ms
@@ -1,204 +0,0 @@
ns
errorMessage: null,
invoiceReference: '981644',
supplierName: 'Polyflame',
fromCache: true,
permanent: false
}
POST /api/deliveries/343/verify-invoice 200 in 256ms
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'Numero_BL' }
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'Numero_BL' }
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: '197771',
groupId: 1,
cacheKey: '1_197771',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-11-03T23:21:35.673Z'
}
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: '197771',
groupId: 1,
cacheKey: '1_197771',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-11-03T23:21:35.675Z'
}
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 31803,
invoiceReference: '197771',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_197771'
}
📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29)
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 31803,
invoiceReference: '197771',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_197771'
}
📅 Date d'échéance récupérée et normalisée: 2025-11-29 (original: 2025-11-29)
Error updating delivery: error: column "due_date" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.updateDelivery (file:///app/dist/index.js:2142:28)
at async file:///app/dist/index.js:14714:31 {
length: 174,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: 'Perhaps you meant to reference the column "deliveries.dueDate".',
position: '310',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
PUT /api/deliveries/427 500 in 307ms
Error updating delivery: error: column "due_date" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.updateDelivery (file:///app/dist/index.js:2142:28)
at async file:///app/dist/index.js:14714:31 {
length: 174,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: 'Perhaps you meant to reference the column "deliveries.dueDate".',
position: '310',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
PUT /api/deliveries/427 500 in 330ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
HEAD /api/health 200 in 1ms
@@ -1,205 +0,0 @@
ns
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeH',
configuredId: 'my7zunxprumahmm',
resolvedId: 'my7zunxprumahmm'
}
🔍 Recherche NocoDB: { tableId: 'my7zunxprumahmm', column: 'RefFacture' }
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeF',
configuredId: 'mrr733dfb8wtt9b',
resolvedId: 'mrr733dfb8wtt9b'
}
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'RefFacture' }
✅ [CACHE] Résultat sauvé en cache: {

,
invoiceReference: '25070526',
groupId: 1,
exists: true,
cacheKey: '1_25070526'
}
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: '25070526',
invoiceAmount: 920.5,
supplierName: "Cotillon d'Alasce"
}
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 16638,
invoiceReference: 'F5175811',
groupId: 1,
exists: true,
cacheKey: '1_f5175811'
}
✅ Résultat vérification: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: 'F5175811',
invoiceAmount: 2812.57,
supplierName: 'JJA Atmosphera'
}
POST /api/deliveries/61/verify-invoice 200 in 2015ms
POST /api/deliveries/89/verify-invoice 200 in 1989ms
🔍 [CACHE] Résultat cache: {
found: true,
expired: true,
expiresAt: 2025-08-14T16:04:19.769Z,
currentTime: '2025-08-17T16:31:06.169Z'
}
⏰ [CACHE] Cache expiré pour: { invoiceReference: '25080486', groupId: 1 }
🔍 [INVOICE] Pas de cache, requête API...
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeF',
configuredId: 'mrr733dfb8wtt9b',
resolvedId: 'mrr733dfb8wtt9b'
}
@@ -1,204 +0,0 @@
s
📋 CALLING storage.getPublicities: { filterYear: 2025, groupIds: undefined }
GET /api/user 304 in 139ms
📋 PUBLICITES FETCHED: 29 résultats pour année 2025
🔍 PREMIERS RESULTATS: [
'1. N°2501 - Blanc',
'2. N°2502 - Moins de 1€ 2€ 3€ 4€ 5€',
'3. N°2503 - Imbattables'
]
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
📋 PUBLICITIES RETURNED: { count: 29 }
GET /api/publicities 304 in 235ms
🔍 [PRODUCTION] User search result: Found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Not found
🎯 [PRODUCTION] Found announcements: 2
GET /api/announcements 304 in 136ms
GET /api/user 304 in 4ms
📢 [SERVER] Fetching announcements for user: admin_local environment: production
Orders API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
userRole: 'admin'
}
🔍 Admin orders filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all orders
Deliveries API called with: {
startDate: undefined,
endDate: undefined,
storeId: '1',
withBL: undefined,
userRole: 'admin'
}
🔍 Admin deliveries filtering by store: { storeId: '1', groupIds: [ 1 ], role: 'admin' }
Fetching all deliveries
Customer Orders API called with: { groupIds: [ 1 ], userRole: 'admin' }
📢 [SERVER] User found: { username: 'admin', role: 'admin' }
🎯 [PRODUCTION] Using PostgreSQL DASHBOARD_MESSAGES table
Customer Orders returned: 11 items
GET /api/customer-orders 304 in 90ms
🔗 PRODUCTION: getDeliveries() récupéré 82 livraisons avec relations
Deliveries returned: 82 items
GET /api/deliveries 304 in 170ms
🔍 [PRODUCTION] Raw messages from DB: 2 items: [
{
id: 16,
title: 'Mise à jour Prix',
content: 'Merci de mettre vos prix a jour tous les matins, certain magasin ne le font pas.',
type: 'success',
storeId: null,
createdBy: 'admin',
createdAt: 2025-08-18T10:45:08.585Z
},
{
id: 8,
title: 'Bon de Livraison',
content: 'Lorsque vous rentrez un numéro de bon de livraison, faite le a l identique, même les majuscules. Pour My candy Shop, prendre le numéro de commande.',
type: 'info',
storeId: null,
createdBy: 'admin_local',
createdAt: 2025-08-07T11:04:38.123Z
}
]
🔍 [PRODUCTION] Looking for user with username: admin
🔍 [PRODUCTION] Looking for user with username: admin_local
🔍 [PRODUCTION] User search result: Not found
❌ [PRODUCTION] User not found with username: admin_local
🔍 [PRODUCTION] User search result: Found
🎯 [PRODUCTION] Found announcements: 2
🔗 PRODUCTION: getOrders() récupéré 64 commandes avec relations
Orders returned: 64 items
GET /api/announcements 304 in 216ms
GET /api/orders 304 in 221ms
GET /api/groups 304 in 216ms
GET /api/user 304 in 74ms
GET /api/suppliers 304 in 6ms
🔍 Avoirs API called with: { groupIds: [ 1 ], userRole: 'admin' }
📋 Avoirs returned: 1 items
GET /api/avoirs 304 in 9ms
@@ -1,204 +0,0 @@
tions
Error fetching SAV stats: error: column "priority" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTicketStats (file:///app/dist/index.js:2046:25)
at async file:///app/dist/index.js:6203:21 {
length: 108,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '28',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/stats 500 in 11ms
Error fetching SAV tickets: error: column sav_tickets.priority does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTickets (file:///app/dist/index.js:1974:25)
at async file:///app/dist/index.js:6016:23 {
length: 119,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '350',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/tickets 500 in 14ms
Error fetching SAV stats: error: column "priority" does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTicketStats (file:///app/dist/index.js:2046:25)
at async file:///app/dist/index.js:6203:21 {
length: 108,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '28',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/stats 500 in 13ms
Error fetching SAV tickets: error: column sav_tickets.priority does not exist
at /app/node_modules/pg-pool/index.js:45:11
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/node_modules/drizzle-orm/node-postgres/session.js:83:22
at async DatabaseStorage.getSavTickets (file:///app/dist/index.js:1974:25)
at async file:///app/dist/index.js:6016:23 {
length: 119,
severity: 'ERROR',
code: '42703',
detail: undefined,
hint: undefined,
position: '350',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'parse_relation.c',
line: '3665',
routine: 'errorMissingColumn'
}
GET /api/sav/tickets 500 in 14ms
@@ -1,204 +0,0 @@
tions
}
✅ Résultat vérification avoir: {
exists: true,
matchType: 'invoice_reference',
errorMessage: null,
invoiceReference: 'FC-25-00005972',
supplierName: 'Artyfete',
fromCache: true,
permanent: false
}
POST /api/avoirs/7/verify-invoice 200 in 8ms
🔍 Vérification facture avoir: {
avoirId: 7,
invoiceReference: 'FC-25-00005972',
supplier: 'Artyfete',
group: 'Frouard',
␍ groupId: 1
}
🔍 [INVOICE] Début vérification facture: { invoiceReference: 'FC-25-00005972', groupId: 1, forceRefresh: true }
🔄 [INVOICE] Refresh forcé, ignorant le cache
🔧 Configuration groupe: {
groupName: 'Frouard',
hasNocodbConfig: true,
hasTableName: true,
hasWebhook: true
}
🔍 Vérification NocoDB en production...
🔧 Configuration NocoDB active récupérée: {
id: 1,
name: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
apiToken: 'z4BAwLo6dgoN_E7PKJSHN7PA7kdBePtKOYcsDlwQ',
description: '',
isActive: true,
createdBy: 'admin_local',
createdAt: 2025-07-22T11:12:54.971Z,
updatedAt: 2025-07-25T23:07:17.197Z
}
🔧 Configuration NocoDB trouvée: {
configName: 'Nocodb',
baseUrl: 'https://nocodb.ffnancy.fr',
projectId: 'pcg4uw79ukvycxc',
hasToken: true
}
🔧 Utilisation table ID: {
groupTable: 'CommandeF',
configuredId: 'mrr733dfb8wtt9b',
resolvedId: 'mrr733dfb8wtt9b'
}
🔍 Recherche NocoDB: { tableId: 'mrr733dfb8wtt9b', column: 'RefFacture' }
💾 [CACHE] Tentative sauvegarde: {
invoiceReference: 'FC-25-00005972',
groupId: 1,
cacheKey: '1_fc-25-00005972',
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
expiresAt: '2025-09-09T00:48:35.637Z'
}
✅ [CACHE] Résultat sauvé en cache: {
␍ id: 23216,
invoiceReference: 'FC-25-00005972',
groupId: 1,
exists: true,
isReconciled: false,
cacheType: 'temporaire 6h (trouvé)',
cacheKey: '1_fc-25-00005972'
}
✅ Résultat vérification avoir: {
exists: true,
matchType: 'invoice_reference',
invoiceReference: 'FC-25-00005972',
invoiceAmount: -47.976,
supplierName: 'Artyfete'
}
POST /api/avoirs/7/verify-invoice 200 in 33ms
💰 PUT Avoir - Raw body received: {
"supplierId": 3,
"groupId": 1,
"invoiceReference": "FC-25-00005972",
"amount": -47.976,
"comment": "",
"commercialProcessed": false,
"status": "Reçu"
}
❌ [PUT AVOIR] ERREURS VALIDATION ZOD: [
{
"code": "too_small",
"minimum": 0,
"type": "number",
"inclusive": false,
"exact": false,
"message": "Number must be greater than 0",
"path": [
"amount"
]
}
]
PUT /api/avoirs/7 400 in 7ms
@@ -1,90 +0,0 @@
ublishing post 7e27d1f3-3e85-4d19-b35d-9b4134fce2ce to facebook page Frouard
Error publishing post 54eabfab-437b-4d84-92aa-b24b9da84f8e: Error: Facebook API error: An unknown error has occurred. (code: 1)
at FacebookService.publishStory (file:///app/dist/index.js:1997:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async FacebookService.publishPost (file:///app/dist/index.js:1824:14)
at async SchedulerService.publishPost (file:///app/dist/index.js:2072:24)
at async SchedulerService.processPendingPosts (file:///app/dist/index.js:2034:11)
at async file:///app/dist/index.js:2010:7
at async Timeout._onTimeout (/app/node_modules/node-cron/dist/esm/scheduler/runner.js:70:44)
Publishing post 7e27d1f3-3e85-4d19-b35d-9b4134fce2ce to facebook page Houdemont
Error publishing post 1be182d0-00e3-440f-a98c-dadfd45f0304: Error: Facebook API error: An unknown error has occurred. (code: 1)
at FacebookService.publishStory (file:///app/dist/index.js:1997:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async FacebookService.publishPost (file:///app/dist/index.js:1824:14)
at async SchedulerService.publishPost (file:///app/dist/index.js:2072:24)
at async SchedulerService.processPendingPosts (file:///app/dist/index.js:2034:11)
at async file:///app/dist/index.js:2010:7
at async Timeout._onTimeout (/app/node_modules/node-cron/dist/esm/scheduler/runner.js:70:44)
6:40:50 AM [express] GET /api/scheduled-posts 200 in 48ms :: [{"id":"9128ce3e-88b5-4afe-9834-e79e2da…
6:40:51 AM [express] GET /api/auth/session 304 in 1ms :: {"id":"417b5410-1184-46d7-ac96-e85f731b0c98…
6:40:51 AM [express] GET /api/scheduled-posts 304 in 35ms :: [{"id":"9128ce3e-88b5-4afe-9834-e79e2da…
6:40:51 AM [express] GET /api/pages 304 in 40ms :: [{"id":"1abe2ba5-fd7b-423a-b82d-da953c340db2","us…
6:40:57 AM [express] GET /api/posts/7e27d1f3-3e85-4d19-b35d-9b4134fce2ce 304 in 6ms :: {"post":{"id"…
Publishing post 7e27d1f3-3e85-4d19-b35d-9b4134fce2ce to facebook page Frouard
Error publishing post 54eabfab-437b-4d84-92aa-b24b9da84f8e: Error: Facebook API error: An unknown error has occurred. (code: 1)
at FacebookService.publishStory (file:///app/dist/index.js:1997:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async FacebookService.publishPost (file:///app/dist/index.js:1824:14)
at async SchedulerService.publishPost (file:///app/dist/index.js:2072:24)
at async SchedulerService.processPendingPosts (file:///app/dist/index.js:2034:11)
at async file:///app/dist/index.js:2010:7
at async Timeout._onTimeout (/app/node_modules/node-cron/dist/esm/scheduler/runner.js:70:44)
Publishing post 7e27d1f3-3e85-4d19-b35d-9b4134fce2ce to facebook page Houdemont
Error publishing post 1be182d0-00e3-440f-a98c-dadfd45f0304: Error: Facebook API error: An unknown error has occurred. (code: 1)
at FacebookService.publishStory (file:///app/dist/index.js:1997:13)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async FacebookService.publishPost (file:///app/dist/index.js:1824:14)
at async SchedulerService.publishPost (file:///app/dist/index.js:2072:24)
at async SchedulerService.processPendingPosts (file:///app/dist/index.js:2034:11)
at async file:///app/dist/index.js:2010:7
at async Timeout._onTimeout (/app/node_modules/node-cron/dist/esm/scheduler/runner.js:70:44)
6:41:03 AM [express] GET /api/auth/session 304 in 1ms :: {"id":"417b5410-1184-46d7-ac96-e85f731b0c98…
6:41:03 AM [express] GET /api/scheduled-posts 304 in 42ms :: [{"id":"9128ce3e-88b5-4afe-9834-e79e2da…
6:41:03 AM [express] GET /api/pages 304 in 24ms :: [{"id":"1abe2ba5-fd7b-423a-b82d-da953c340db2","us…
6:41:07 AM [express] GET /api/stats 200 in 22ms :: {"scheduledPosts":2,"scheduledPostsChange":"+100%…
Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Loaded 100 of 343 files, more files were not shown because too many files have changed in this diff. Show more