diff --git a/PRODUCTION-SCHEMA-UPDATE.sql b/PRODUCTION-SCHEMA-UPDATE.sql new file mode 100644 index 0000000..9874ccd --- /dev/null +++ b/PRODUCTION-SCHEMA-UPDATE.sql @@ -0,0 +1,39 @@ +-- ============================================= +-- PRODUCTION SCHEMA UPDATE - Groups NocoDB Configuration +-- Date: 2025-08-12 +-- Description: Synchronise le schéma production avec les nouveaux champs NocoDB +-- ============================================= + +-- Retirer le champ nocodbTableId qui n'est plus nécessaire +ALTER TABLE groups DROP COLUMN IF EXISTS "nocodb_table_id"; + +-- Ajouter les nouveaux champs de configuration NocoDB par magasin +ALTER TABLE groups ADD COLUMN IF NOT EXISTS "nocodb_bl_column_name" VARCHAR; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS "nocodb_amount_column_name" VARCHAR; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS "nocodb_supplier_column_name" VARCHAR; +ALTER TABLE groups ADD COLUMN IF NOT EXISTS "webhook_url" VARCHAR(500); + +-- Modifier la colonne color pour avoir une valeur par défaut (si elle n'en a pas déjà une) +ALTER TABLE groups ALTER COLUMN color SET DEFAULT '#1976D2'; + +-- Ajout de commentaires pour documentation +COMMENT ON COLUMN groups.color IS 'Couleur hex du groupe, par défaut #1976D2'; +COMMENT ON COLUMN groups.nocodb_table_name IS 'Nom de la table NocoDB spécifique au magasin'; +COMMENT ON COLUMN groups.invoice_column_name IS 'Nom de la colonne facture dans la table NocoDB du magasin'; +COMMENT ON COLUMN groups.nocodb_bl_column_name IS 'Nom de la colonne BL dans la table NocoDB du magasin'; +COMMENT ON COLUMN groups.nocodb_amount_column_name IS 'Nom de la colonne montant dans la table NocoDB du magasin'; +COMMENT ON COLUMN groups.nocodb_supplier_column_name IS 'Nom de la colonne fournisseur dans la table NocoDB du magasin'; +COMMENT ON COLUMN groups.webhook_url IS 'URL webhook pour notifications spécifiques au magasin'; + +-- Vérification du schéma final +SELECT + column_name, + data_type, + is_nullable, + column_default, + col_description(pg_class.oid, ordinal_position) as column_comment +FROM information_schema.columns +JOIN pg_class ON pg_class.relname = table_name +WHERE table_name = 'groups' + AND table_schema = 'public' +ORDER BY ordinal_position; \ No newline at end of file diff --git a/client/src/pages/Groups.tsx b/client/src/pages/Groups.tsx index a0f8839..c99de45 100644 --- a/client/src/pages/Groups.tsx +++ b/client/src/pages/Groups.tsx @@ -46,9 +46,12 @@ export default function Groups() { name: "", color: "#1976D2", nocodbConfigId: "", - nocodbTableId: "", nocodbTableName: "", - invoiceColumnName: "Ref Facture", + invoiceColumnName: "", + nocodbBlColumnName: "", + nocodbAmountColumnName: "", + nocodbSupplierColumnName: "", + webhookUrl: "", }); const { data: groups = [], isLoading } = useQuery({ @@ -243,9 +246,12 @@ export default function Groups() { name: "", color: "#1976D2", nocodbConfigId: "", - nocodbTableId: "", nocodbTableName: "", - invoiceColumnName: "Ref Facture", + invoiceColumnName: "", + nocodbBlColumnName: "", + nocodbAmountColumnName: "", + nocodbSupplierColumnName: "", + webhookUrl: "", }); setShowCreateModal(true); }; @@ -254,11 +260,14 @@ export default function Groups() { setSelectedGroup(group); setFormData({ name: group.name, - color: group.color, + color: group.color || "#1976D2", nocodbConfigId: group.nocodbConfigId?.toString() || "", - nocodbTableId: group.nocodbTableId || "", nocodbTableName: group.nocodbTableName || "", - invoiceColumnName: group.invoiceColumnName || "Ref Facture", + invoiceColumnName: group.invoiceColumnName || "", + nocodbBlColumnName: group.nocodbBlColumnName || "", + nocodbAmountColumnName: group.nocodbAmountColumnName || "", + nocodbSupplierColumnName: group.nocodbSupplierColumnName || "", + webhookUrl: group.webhookUrl || "", }); setShowEditModal(true); }; @@ -562,34 +571,107 @@ export default function Groups() { {formData.nocodbConfigId && ( <>
- - handleChange('nocodbTableId', e.target.value)} - placeholder="m_xxxxxxxxxxxx (ID de la table NocoDB)" - /> -
- -
- + handleChange('nocodbTableName', e.target.value)} - placeholder="Nom de la table (pour affichage)" + placeholder="ex: Factures_Paris_2025" + required /> +

+ Nom exact de la table dans votre base NocoDB +

-
- - handleChange('invoiceColumnName', e.target.value)} - placeholder="Ref Facture" - /> +
+

Mapping des colonnes

+

+ Configurez les noms exacts des colonnes dans votre table NocoDB +

+ +
+
+ + handleChange('invoiceColumnName', e.target.value)} + placeholder="ex: Ref_Facture" + required + /> +
+ +
+ + handleChange('nocodbBlColumnName', e.target.value)} + placeholder="ex: Num_BL" + /> +
+ +
+ + handleChange('nocodbAmountColumnName', e.target.value)} + placeholder="ex: Montant_HT" + /> +
+ +
+ + handleChange('nocodbSupplierColumnName', e.target.value)} + placeholder="ex: Fournisseur" + /> +
+
+ +
+

Notifications

+
+ + handleChange('webhookUrl', e.target.value)} + placeholder="https://votre-site.com/webhook" + type="url" + /> +

+ URL pour recevoir les notifications d'événements +

+
+
+ + {(formData.nocodbTableName && formData.invoiceColumnName) && ( +
+ +

+ Vérifie que la table et les colonnes existent +

+
+ )} )}
@@ -606,9 +688,12 @@ export default function Groups() { name: "", color: "#1976D2", nocodbConfigId: "", - nocodbTableId: "", nocodbTableName: "", - invoiceColumnName: "Ref Facture", + invoiceColumnName: "", + nocodbBlColumnName: "", + nocodbAmountColumnName: "", + nocodbSupplierColumnName: "", + webhookUrl: "", }); }} > diff --git a/shared/schema.ts b/shared/schema.ts index 9953127..6c4ab89 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -47,12 +47,16 @@ export const users = pgTable("users", { export const groups = pgTable("groups", { id: serial("id").primaryKey(), name: varchar("name").notNull(), - color: varchar("color").notNull(), // hex color code + color: varchar("color").default("#1976D2"), // hex color code // Configuration NocoDB pour vérification automatique des factures - nocodbConfigId: integer("nocodb_config_id"), // Référence vers la configuration NocoDB - nocodbTableId: varchar("nocodb_table_id"), // ID de la table dans NocoDB - nocodbTableName: varchar("nocodb_table_name"), // Nom de la table dans NocoDB - invoiceColumnName: varchar("invoice_column_name").default("Ref Facture"), // Nom de la colonne contenant les références de facture + nocodbConfigId: integer("nocodb_config_id"), // Référence vers la configuration NocoDB globale + nocodbTableName: varchar("nocodb_table_name"), // Nom de la table spécifique au magasin + // Mapping des colonnes par magasin dans leur table NocoDB + invoiceColumnName: varchar("invoice_column_name"), // Nom de la colonne facture dans leur table + nocodbBlColumnName: varchar("nocodb_bl_column_name"), // Nom de la colonne BL dans leur table + nocodbAmountColumnName: varchar("nocodb_amount_column_name"), // Nom de la colonne montant dans leur table + nocodbSupplierColumnName: varchar("nocodb_supplier_column_name"), // Nom de la colonne fournisseur dans leur table + webhookUrl: varchar("webhook_url", { length: 500 }), // URL de webhook pour notifications par magasin createdAt: timestamp("created_at").defaultNow(), updatedAt: timestamp("updated_at").defaultNow(), });