mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
Improve NocoDB configuration handling for production deployments
Update client and server logic to gracefully handle missing NocoDB configurations, providing more informative error messages and ensuring optional NocoDB fields are handled correctly. Replit-Commit-Author: Agent Replit-Commit-Session-Id: c52a701b-4841-4d00-b8cf-5a41c12abdf3 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/c52a701b-4841-4d00-b8cf-5a41c12abdf3/3uCfEKb
This commit is contained in:
1 parent
e6b09fc9d3
commit
5a16936591
6 files changed
+219
-25
No files matched your search
@@ -259,11 +259,11 @@ export default function BLReconciliation() {
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
} catch (error: any) {
|
||||
console.error('Erreur vérification:', error);
|
||||
toast({
|
||||
title: "Erreur de vérification",
|
||||
description: "Impossible de vérifier la référence",
|
||||
description: error.response?.data?.message || error.message || "Configuration NocoDB manquante ou incorrecte",
|
||||
variant: "destructive"
|
||||
});
|
||||
} finally {
|
||||
@@ -315,11 +315,11 @@ export default function BLReconciliation() {
|
||||
variant: "destructive"
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
} catch (error: any) {
|
||||
console.error('Erreur recherche BL:', error);
|
||||
toast({
|
||||
title: "Erreur de recherche",
|
||||
description: "Impossible de rechercher par BL",
|
||||
description: error.response?.data?.message || error.message || "Configuration NocoDB manquante ou incorrecte",
|
||||
variant: "destructive"
|
||||
});
|
||||
} finally {
|
||||
|
||||
@@ -33,8 +33,8 @@ class NocodbVerificationService {
|
||||
if (!group) return null;
|
||||
|
||||
return {
|
||||
nocodbConfigId: group.nocodbConfigId,
|
||||
nocodbTableName: group.nocodbTableName,
|
||||
nocodbConfigId: group.nocodbConfigId || undefined,
|
||||
nocodbTableName: group.nocodbTableName || undefined,
|
||||
invoiceColumnName: group.invoiceColumnName || 'invoice_reference',
|
||||
nocodbBlColumnName: group.nocodbBlColumnName || 'bl_number',
|
||||
nocodbAmountColumnName: group.nocodbAmountColumnName || 'amount',
|
||||
|
||||
+20
-13
@@ -1073,19 +1073,26 @@ export class DatabaseStorage implements IStorage {
|
||||
}
|
||||
|
||||
async getNocodbConfig(id: number): Promise<NocodbConfig | undefined> {
|
||||
const configs = await db.select({
|
||||
id: nocodbConfig.id,
|
||||
name: nocodbConfig.name,
|
||||
baseUrl: nocodbConfig.baseUrl,
|
||||
projectId: nocodbConfig.projectId,
|
||||
apiToken: nocodbConfig.apiToken,
|
||||
description: nocodbConfig.description,
|
||||
isActive: nocodbConfig.isActive,
|
||||
createdBy: nocodbConfig.createdBy,
|
||||
createdAt: nocodbConfig.createdAt,
|
||||
updatedAt: nocodbConfig.updatedAt,
|
||||
}).from(nocodbConfig).where(eq(nocodbConfig.id, id));
|
||||
return configs[0];
|
||||
try {
|
||||
const configs = await db.select({
|
||||
id: nocodbConfig.id,
|
||||
name: nocodbConfig.name,
|
||||
baseUrl: nocodbConfig.baseUrl,
|
||||
projectId: nocodbConfig.projectId,
|
||||
apiToken: nocodbConfig.apiToken,
|
||||
description: nocodbConfig.description,
|
||||
isActive: nocodbConfig.isActive,
|
||||
createdBy: nocodbConfig.createdBy,
|
||||
createdAt: nocodbConfig.createdAt,
|
||||
updatedAt: nocodbConfig.updatedAt,
|
||||
}).from(nocodbConfig).where(eq(nocodbConfig.id, id));
|
||||
|
||||
console.log(`🔍 Production NocoDB Config Query - ID: ${id}, Found: ${configs.length > 0}`);
|
||||
return configs[0];
|
||||
} catch (error) {
|
||||
console.error(`❌ Erreur récupération config NocoDB ${id}:`, error);
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
async createNocodbConfig(config: InsertNocodbConfig): Promise<NocodbConfig> {
|
||||
|
||||
+6
-6
@@ -143,16 +143,16 @@ export const publicityParticipations = pgTable("publicity_participations", {
|
||||
|
||||
|
||||
|
||||
// NocoDB configuration globale (une seule instance NocoDB partagée)
|
||||
// NocoDB configuration globale - Structure correspondant à la production
|
||||
export const nocodbConfig = pgTable("nocodb_config", {
|
||||
id: serial("id").primaryKey(),
|
||||
name: varchar("name").notNull(), // Nom de la configuration
|
||||
baseUrl: varchar("base_url").notNull(), // URL de l'instance NocoDB
|
||||
projectId: varchar("project_id").notNull(), // NocoDB Project ID
|
||||
apiToken: varchar("api_token").notNull(), // Personal API Token
|
||||
name: varchar("name", { length: 255 }).notNull(), // Nom de la configuration
|
||||
baseUrl: varchar("base_url", { length: 255 }).notNull(), // URL de l'instance NocoDB
|
||||
projectId: varchar("project_id", { length: 255 }).notNull(), // NocoDB Project ID
|
||||
apiToken: varchar("api_token", { length: 255 }).notNull(), // Personal API Token
|
||||
description: text("description"), // Description de la configuration
|
||||
isActive: boolean("is_active").default(true), // Configuration active ou non
|
||||
createdBy: varchar("created_by").notNull(),
|
||||
createdBy: varchar("created_by", { length: 255 }), // Créateur (nullable en production)
|
||||
createdAt: timestamp("created_at").defaultNow(),
|
||||
updatedAt: timestamp("updated_at").defaultNow(),
|
||||
});
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
# Guide Complet - Configuration NocoDB Production
|
||||
|
||||
## ❌ PROBLÈME IDENTIFIÉ
|
||||
|
||||
Votre serveur de production n'a **aucune configuration NocoDB** dans la base de données. C'est pourquoi vous ne voyez rien.
|
||||
|
||||
## ✅ SOLUTION : Configuration Complète
|
||||
|
||||
### Étape 1 : Ajout Configuration NocoDB
|
||||
|
||||
Connectez-vous à votre base PostgreSQL de production et exécutez :
|
||||
|
||||
```sql
|
||||
-- 1. Vérifier si la table existe
|
||||
\d nocodb_config
|
||||
|
||||
-- 2. Insérer votre configuration NocoDB
|
||||
INSERT INTO nocodb_config (
|
||||
name,
|
||||
base_url,
|
||||
project_id,
|
||||
api_token,
|
||||
description,
|
||||
is_active
|
||||
) VALUES (
|
||||
'Production Principal',
|
||||
'https://app.nocodb.com', -- ou votre URL NocoDB
|
||||
'VOTRE_PROJECT_ID', -- À remplacer
|
||||
'VOTRE_API_TOKEN', -- À remplacer
|
||||
'Configuration principale pour vérification automatique factures',
|
||||
true
|
||||
);
|
||||
|
||||
-- 3. Vérifier l'insertion
|
||||
SELECT * FROM nocodb_config;
|
||||
```
|
||||
|
||||
### Étape 2 : Configuration des Magasins
|
||||
|
||||
```sql
|
||||
-- Lister vos magasins existants
|
||||
SELECT id, name FROM groups;
|
||||
|
||||
-- Configurer chaque magasin (exemple pour ID 1)
|
||||
UPDATE groups SET
|
||||
nocodb_config_id = 1, -- ID de la config créée
|
||||
nocodb_table_name = 'VOTRE_TABLE_FACTURES', -- Nom réel de votre table NocoDB
|
||||
invoice_column_name = 'reference_facture', -- Colonne référence
|
||||
nocodb_bl_column_name = 'numero_bl', -- Colonne BL
|
||||
nocodb_amount_column_name = 'montant', -- Colonne montant
|
||||
nocodb_supplier_column_name = 'fournisseur' -- Colonne fournisseur
|
||||
WHERE id = 1; -- Remplacer par l'ID réel
|
||||
|
||||
-- Répéter pour chaque magasin avec ses propres paramètres
|
||||
```
|
||||
|
||||
### Étape 3 : Obtenir les Informations NocoDB
|
||||
|
||||
1. **Project ID** : Dans NocoDB, aller dans Project Settings
|
||||
2. **API Token** : Account Settings > Tokens > Create new token
|
||||
3. **Table Names** : Noter les noms exacts de vos tables
|
||||
4. **Column Names** : Noter les noms exacts de vos colonnes
|
||||
|
||||
### Étape 4 : Test de Configuration
|
||||
|
||||
Une fois configuré, redémarrez votre serveur et vous devriez voir :
|
||||
- Boutons loupe et coche dans le rapprochement
|
||||
- Logs de débogage dans la console serveur
|
||||
- Notifications de succès/erreur
|
||||
|
||||
### Étape 5 : Vérification
|
||||
|
||||
```sql
|
||||
-- Voir toutes les configurations
|
||||
SELECT
|
||||
g.id,
|
||||
g.name as magasin,
|
||||
g.nocodb_config_id,
|
||||
g.nocodb_table_name,
|
||||
g.invoice_column_name,
|
||||
nc.base_url,
|
||||
nc.is_active
|
||||
FROM groups g
|
||||
LEFT JOIN nocodb_config nc ON g.nocodb_config_id = nc.id;
|
||||
```
|
||||
|
||||
## 🔧 Structure Attendue de vos Tables NocoDB
|
||||
|
||||
Chaque table de factures doit contenir au minimum :
|
||||
- **Référence Facture** (ex: FAC-2024-001)
|
||||
- **Numéro BL** (ex: BL123456)
|
||||
- **Montant** (ex: 150.75)
|
||||
- **Fournisseur** (ex: "Fournisseur ABC")
|
||||
|
||||
## 🚨 Points Critiques
|
||||
|
||||
1. **API Token** : Doit avoir accès lecture à vos tables
|
||||
2. **Noms Exacts** : Table/colonne names doivent être exacts (sensible à la casse)
|
||||
3. **Données Test** : Ayez quelques factures test dans NocoDB
|
||||
4. **Connexion** : Vérifiez que votre serveur peut accéder à NocoDB
|
||||
|
||||
## 📞 Support
|
||||
|
||||
Si ça ne marche toujours pas après configuration :
|
||||
1. Vérifiez les logs serveur Node.js
|
||||
2. Testez l'API NocoDB manuellement avec curl
|
||||
3. Confirmez que les noms de colonnes sont corrects
|
||||
@@ -0,0 +1,80 @@
|
||||
# Configuration NocoDB pour Production
|
||||
|
||||
## 1. Configuration de la base de données
|
||||
|
||||
Votre table `nocodb_config` existe déjà. Vous devez y ajouter une configuration :
|
||||
|
||||
```sql
|
||||
-- Insertion d'une configuration NocoDB de base
|
||||
INSERT INTO nocodb_config (
|
||||
name,
|
||||
base_url,
|
||||
project_id,
|
||||
api_token,
|
||||
description,
|
||||
is_active,
|
||||
created_by,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
'Configuration Principale',
|
||||
'https://votre-nocodb.domain.com',
|
||||
'votre-project-id',
|
||||
'votre-api-token-personnel',
|
||||
'Configuration principale pour vérification factures',
|
||||
true,
|
||||
'admin',
|
||||
CURRENT_TIMESTAMP,
|
||||
CURRENT_TIMESTAMP
|
||||
);
|
||||
```
|
||||
|
||||
## 2. Configuration des groupes (magasins)
|
||||
|
||||
Mettez à jour vos magasins avec les configurations NocoDB :
|
||||
|
||||
```sql
|
||||
-- Exemple pour Magasin A
|
||||
UPDATE groups SET
|
||||
nocodb_config_id = 1, -- ID de la config NocoDB créée ci-dessus
|
||||
nocodb_table_name = 'nom_table_factures_magasin_a', -- Nom de votre table NocoDB
|
||||
invoice_column_name = 'reference_facture', -- Colonne référence facture
|
||||
nocodb_bl_column_name = 'numero_bl', -- Colonne numéro BL
|
||||
nocodb_amount_column_name = 'montant', -- Colonne montant
|
||||
nocodb_supplier_column_name = 'fournisseur' -- Colonne fournisseur
|
||||
WHERE id = 1; -- Remplacer par l'ID de votre magasin
|
||||
|
||||
-- Répéter pour chaque magasin avec ses propres noms de table/colonnes
|
||||
```
|
||||
|
||||
## 3. API Token NocoDB
|
||||
|
||||
Pour obtenir votre API Token :
|
||||
1. Allez dans NocoDB > Account Settings > Tokens
|
||||
2. Créez un nouveau Personal API Token
|
||||
3. Copiez le token dans la configuration ci-dessus
|
||||
|
||||
## 4. Structure de votre table NocoDB
|
||||
|
||||
Assurez-vous que vos tables NocoDB contiennent ces colonnes :
|
||||
- Référence facture (ex: `reference_facture`)
|
||||
- Numéro BL (ex: `numero_bl`)
|
||||
- Montant (ex: `montant`)
|
||||
- Fournisseur (ex: `fournisseur`)
|
||||
|
||||
## 5. Test de la configuration
|
||||
|
||||
Une fois configuré, le système :
|
||||
- ✅ Affichera des boutons de vérification dans le rapprochement BL/Factures
|
||||
- ✅ Vérifiera automatiquement les références factures existantes
|
||||
- ✅ Auto-remplira les champs manquants en recherchant par BL
|
||||
- ✅ Affichera des coches vertes pour les factures vérifiées
|
||||
|
||||
## 6. Débogage
|
||||
|
||||
Les logs de production afficheront :
|
||||
```
|
||||
🔍 Vérification facture: {groupId: 1, invoiceReference: "FAC123", supplierName: "Fournisseur A"}
|
||||
🌐 Requête NocoDB: https://votre-nocodb.domain.com/api/v1/db/data/project-id/table-name?where=...
|
||||
✅ Réponse NocoDB: {count: 1}
|
||||
```
|
||||
Reference in new issue
Block a user