diff --git a/attached_assets/{04A78920-A3B5-41B4-A22D-995051FB8DD4}_1757342109935.png b/attached_assets/{04A78920-A3B5-41B4-A22D-995051FB8DD4}_1757342109935.png new file mode 100644 index 0000000..1111d5b Binary files /dev/null and b/attached_assets/{04A78920-A3B5-41B4-A22D-995051FB8DD4}_1757342109935.png differ diff --git a/attached_assets/{1669D9BE-31D9-4519-B8A0-D652BFB9F445}_1757341683519.png b/attached_assets/{1669D9BE-31D9-4519-B8A0-D652BFB9F445}_1757341683519.png new file mode 100644 index 0000000..5c23fb6 Binary files /dev/null and b/attached_assets/{1669D9BE-31D9-4519-B8A0-D652BFB9F445}_1757341683519.png differ diff --git a/attached_assets/{926451E7-CE51-4BB6-8530-D774279D74AD}_1757342239538.png b/attached_assets/{926451E7-CE51-4BB6-8530-D774279D74AD}_1757342239538.png new file mode 100644 index 0000000..53fa23d Binary files /dev/null and b/attached_assets/{926451E7-CE51-4BB6-8530-D774279D74AD}_1757342239538.png differ diff --git a/attached_assets/{95778F6E-A507-468E-A4F1-6FA3F8A77ECB}_1757341993547.png b/attached_assets/{95778F6E-A507-468E-A4F1-6FA3F8A77ECB}_1757341993547.png new file mode 100644 index 0000000..4472500 Binary files /dev/null and b/attached_assets/{95778F6E-A507-468E-A4F1-6FA3F8A77ECB}_1757341993547.png differ diff --git a/attached_assets/{B115554A-00BF-4826-A2B2-F204BAF490AB}_1757342373618.png b/attached_assets/{B115554A-00BF-4826-A2B2-F204BAF490AB}_1757342373618.png new file mode 100644 index 0000000..0672393 Binary files /dev/null and b/attached_assets/{B115554A-00BF-4826-A2B2-F204BAF490AB}_1757342373618.png differ diff --git a/attached_assets/{B5245B7D-A6D6-44B1-8342-2EBF172EDCE5}_1757341919102.png b/attached_assets/{B5245B7D-A6D6-44B1-8342-2EBF172EDCE5}_1757341919102.png new file mode 100644 index 0000000..68fcdda Binary files /dev/null and b/attached_assets/{B5245B7D-A6D6-44B1-8342-2EBF172EDCE5}_1757341919102.png differ diff --git a/attached_assets/{D506F8C6-F30D-4820-B5EA-AC95B3DC7701}_1757341724452.png b/attached_assets/{D506F8C6-F30D-4820-B5EA-AC95B3DC7701}_1757341724452.png new file mode 100644 index 0000000..73aa504 Binary files /dev/null and b/attached_assets/{D506F8C6-F30D-4820-B5EA-AC95B3DC7701}_1757341724452.png differ diff --git a/sql/create_avoirs_production.sql b/sql/create_avoirs_production.sql new file mode 100644 index 0000000..970c796 --- /dev/null +++ b/sql/create_avoirs_production.sql @@ -0,0 +1,113 @@ +-- 🔧 CRÉATION COMPLÈTE PRODUCTION - Table avoirs +-- Script de crĂ©ation dĂ©finitive pour serveur de production + +-- 1. VĂ©rifier d'abord les tables existantes nĂ©cessaires +DO $$ +BEGIN + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'suppliers') THEN + RAISE EXCEPTION 'Table suppliers non trouvĂ©e. CrĂ©ez-la d''abord.'; + END IF; + + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'groups') THEN + RAISE EXCEPTION 'Table groups non trouvĂ©e. CrĂ©ez-la d''abord.'; + END IF; + + IF NOT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'users') THEN + RAISE EXCEPTION 'Table users non trouvĂ©e. CrĂ©ez-la d''abord.'; + END IF; + + RAISE NOTICE 'Toutes les tables dĂ©pendantes sont prĂ©sentes.'; +END $$; + +-- 2. Supprimer la table si elle existe (ATTENTION: supprime les donnĂ©es) +DROP TABLE IF EXISTS avoirs CASCADE; + +-- 3. CrĂ©er la table avec la structure exacte +CREATE TABLE avoirs ( + id SERIAL PRIMARY KEY, + supplier_id INTEGER NOT NULL, + group_id INTEGER NOT NULL, + invoice_reference VARCHAR(255), + amount DECIMAL(10,2), + comment TEXT, + commercial_processed BOOLEAN DEFAULT FALSE, + status VARCHAR(50) DEFAULT 'En attente de demande', + webhook_sent BOOLEAN DEFAULT FALSE, + nocodb_verified BOOLEAN DEFAULT FALSE, + nocodb_verified_at TIMESTAMP WITH TIME ZONE, + processed_at TIMESTAMP WITH TIME ZONE, + created_by VARCHAR(255) NOT NULL, + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); + +-- 4. Ajouter les contraintes seulement si les tables existent +ALTER TABLE avoirs +ADD CONSTRAINT fk_avoirs_supplier_id +FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE CASCADE; + +ALTER TABLE avoirs +ADD CONSTRAINT fk_avoirs_group_id +FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE; + +ALTER TABLE avoirs +ADD CONSTRAINT fk_avoirs_created_by +FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE; + +-- 5. Ajouter la contrainte de statut +ALTER TABLE avoirs +ADD CONSTRAINT chk_avoirs_status +CHECK (status IN ('En attente de demande', 'DemandĂ©', 'Reçu')); + +-- 6. CrĂ©er les index pour les performances +CREATE INDEX idx_avoirs_supplier_id ON avoirs(supplier_id); +CREATE INDEX idx_avoirs_group_id ON avoirs(group_id); +CREATE INDEX idx_avoirs_created_by ON avoirs(created_by); +CREATE INDEX idx_avoirs_status ON avoirs(status); +CREATE INDEX idx_avoirs_created_at ON avoirs(created_at DESC); + +-- 7. CrĂ©er le trigger pour updated_at +CREATE OR REPLACE FUNCTION update_avoirs_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = CURRENT_TIMESTAMP; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER update_avoirs_updated_at_trigger + BEFORE UPDATE ON avoirs + FOR EACH ROW + EXECUTE FUNCTION update_avoirs_updated_at(); + +-- 8. Test final avec une insertion +INSERT INTO avoirs ( + supplier_id, + group_id, + invoice_reference, + amount, + comment, + commercial_processed, + created_by +) +SELECT + (SELECT id FROM suppliers LIMIT 1), + (SELECT id FROM groups LIMIT 1), + 'TEST-PRODUCTION', + 100.00, + 'Test de crĂ©ation table production', + false, + (SELECT id FROM users LIMIT 1) +WHERE EXISTS (SELECT 1 FROM suppliers) + AND EXISTS (SELECT 1 FROM groups) + AND EXISTS (SELECT 1 FROM users); + +-- 9. VĂ©rifier la crĂ©ation +SELECT + 'SUCCESS: Table avoirs créée avec ' || COUNT(*) || ' enregistrement(s)' as result +FROM avoirs; + +-- 10. Nettoyer le test +DELETE FROM avoirs WHERE invoice_reference = 'TEST-PRODUCTION'; + +SELECT 'Table avoirs prĂȘte pour production!' as final_status; \ No newline at end of file diff --git a/sql/create_test_data_simple.sql b/sql/create_test_data_simple.sql new file mode 100644 index 0000000..77a056f --- /dev/null +++ b/sql/create_test_data_simple.sql @@ -0,0 +1,41 @@ +-- 🔧 CRÉATION DONNÉES DE TEST SIMPLIFIÉES +-- Sans colonnes optionnelles, juste les colonnes essentielles + +-- 1. CrĂ©er un fournisseur de test (sans contact_email) +INSERT INTO suppliers (name) VALUES ('Fournisseur Test') +ON CONFLICT DO NOTHING +RETURNING id; + +-- 2. CrĂ©er un groupe de test +INSERT INTO groups (name) VALUES ('Magasin Test') +ON CONFLICT DO NOTHING +RETURNING id; + +-- 3. VĂ©rifier qu'on a au moins un utilisateur +SELECT 'Utilisateurs disponibles:', COUNT(*) FROM users; +SELECT 'Premier utilisateur:', id FROM users LIMIT 1; + +-- 4. Test d'insertion avoir avec les donnĂ©es créées +INSERT INTO avoirs ( + supplier_id, + group_id, + invoice_reference, + amount, + comment, + commercial_processed, + created_by +) VALUES ( + (SELECT id FROM suppliers WHERE name = 'Fournisseur Test' LIMIT 1), + (SELECT id FROM groups WHERE name = 'Magasin Test' LIMIT 1), + 'TEST-FINAL-' || EXTRACT(EPOCH FROM NOW()), + 75.50, + 'Test insertion production', + false, + (SELECT id FROM users LIMIT 1)::varchar +) RETURNING id, supplier_id, group_id, created_by, created_at; + +-- 5. VĂ©rification finale +SELECT COUNT(*) as total_avoirs FROM avoirs; + +-- 6. Nettoyer le test si vous voulez +-- DELETE FROM avoirs WHERE comment = 'Test insertion production'; \ No newline at end of file diff --git a/sql/debug_simple.sql b/sql/debug_simple.sql new file mode 100644 index 0000000..ef0a610 --- /dev/null +++ b/sql/debug_simple.sql @@ -0,0 +1,26 @@ +-- 🔍 DIAGNOSTIC SIMPLE - Une requĂȘte Ă  la fois +-- Copiez chaque ligne sĂ©parĂ©ment pour voir les rĂ©sultats prĂ©cis + +-- ÉTAPE 1: La table existe-t-elle ? +SELECT EXISTS ( + SELECT FROM information_schema.tables + WHERE table_schema = 'public' + AND table_name = 'avoirs' +) AS table_avoirs_exists; + +-- ÉTAPE 2: Quelles sont les colonnes ? +SELECT column_name, data_type, is_nullable +FROM information_schema.columns +WHERE table_name = 'avoirs' +AND table_schema = 'public' +ORDER BY ordinal_position; + +-- ÉTAPE 3: Les tables liĂ©es existent-elles ? +SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'suppliers') AS suppliers_exists, + EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'groups') AS groups_exists, + EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'users') AS users_exists; + +-- ÉTAPE 4: Test basique d'insertion +SELECT COUNT(*) FROM suppliers; +SELECT COUNT(*) FROM groups; +SELECT COUNT(*) FROM users LIMIT 1; \ No newline at end of file diff --git a/sql/diagnostic_references.sql b/sql/diagnostic_references.sql new file mode 100644 index 0000000..249a237 --- /dev/null +++ b/sql/diagnostic_references.sql @@ -0,0 +1,46 @@ +-- 🔍 DIAGNOSTIC DES RÉFÉRENCES - Trouvons le vrai problĂšme +-- ExĂ©cutez chaque section sĂ©parĂ©ment + +-- SECTION 1: VĂ©rifier les tables dĂ©pendantes +SELECT 'suppliers' as table_name, COUNT(*) as record_count FROM suppliers +UNION ALL +SELECT 'groups' as table_name, COUNT(*) FROM groups +UNION ALL +SELECT 'users' as table_name, COUNT(*) FROM users; + +-- SECTION 2: Voir les premiers IDs disponibles +SELECT 'supplier_ids' as type, string_agg(id::text, ', ') as available_ids +FROM (SELECT id FROM suppliers LIMIT 5) s +UNION ALL +SELECT 'group_ids' as type, string_agg(id::text, ', ') +FROM (SELECT id FROM groups LIMIT 5) g +UNION ALL +SELECT 'user_ids' as type, string_agg(id::text, ', ') +FROM (SELECT id FROM users LIMIT 5) u; + +-- SECTION 3: VĂ©rifier les types de colonnes +SELECT table_name, column_name, data_type +FROM information_schema.columns +WHERE table_name IN ('suppliers', 'groups', 'users', 'avoirs') +AND column_name IN ('id', 'created_by') +ORDER BY table_name, column_name; + +-- SECTION 4: Test d'insertion avec de vraies donnĂ©es +-- ATTENTION: Remplacez les valeurs par les vrais IDs trouvĂ©s ci-dessus +INSERT INTO avoirs ( + supplier_id, + group_id, + invoice_reference, + amount, + comment, + commercial_processed, + created_by +) VALUES ( + (SELECT id FROM suppliers LIMIT 1), -- Premier supplier existant + (SELECT id FROM groups LIMIT 1), -- Premier group existant + 'TEST-REF-' || EXTRACT(EPOCH FROM NOW()), + 29.99, + 'Test avec vraies donnĂ©es', + false, + (SELECT id FROM users LIMIT 1)::varchar -- Premier user existant +) RETURNING id, created_at; \ No newline at end of file diff --git a/sql/diagnostic_simple_production.sql b/sql/diagnostic_simple_production.sql new file mode 100644 index 0000000..4548539 --- /dev/null +++ b/sql/diagnostic_simple_production.sql @@ -0,0 +1,20 @@ +-- 🔍 DIAGNOSTIC SIMPLE - Une requĂȘte Ă  la fois +-- Copiez chaque ligne et exĂ©cutez sĂ©parĂ©ment + +-- 1. Combien d'enregistrements dans chaque table ? +SELECT COUNT(*) FROM suppliers; + +-- 2. +SELECT COUNT(*) FROM groups; + +-- 3. +SELECT COUNT(*) FROM users; + +-- 4. Si suppliers > 0, affichez les premiers +SELECT id, name FROM suppliers LIMIT 3; + +-- 5. Si groups > 0, affichez les premiers +SELECT id, name FROM groups LIMIT 3; + +-- 6. Si users > 0, affichez les premiers +SELECT id, username FROM users LIMIT 3; \ No newline at end of file diff --git a/sql/fix_references.sql b/sql/fix_references.sql new file mode 100644 index 0000000..bdc9fc2 --- /dev/null +++ b/sql/fix_references.sql @@ -0,0 +1,39 @@ +-- 🔧 CORRECTION DES RÉFÉRENCES - Si les tables sont vides +-- Utilisez ce script SI les tables suppliers/groups/users sont vides + +-- 1. CrĂ©er des donnĂ©es de test minimales pour suppliers +INSERT INTO suppliers (name, contact_email) VALUES +('Fournisseur Test', 'test@supplier.com') +ON CONFLICT DO NOTHING; + +-- 2. CrĂ©er des donnĂ©es de test minimales pour groups +INSERT INTO groups (name, description) VALUES +('Magasin Test', 'Magasin de test pour avoirs') +ON CONFLICT DO NOTHING; + +-- 3. VĂ©rifier/crĂ©er un utilisateur admin +INSERT INTO users (id, username, email, role) VALUES +('admin', 'admin', 'admin@test.com', 'admin') +ON CONFLICT (id) DO NOTHING; + +-- 4. Maintenant tester l'insertion avoir +INSERT INTO avoirs ( + supplier_id, + group_id, + invoice_reference, + amount, + comment, + commercial_processed, + created_by +) VALUES ( + (SELECT id FROM suppliers WHERE name = 'Fournisseur Test'), + (SELECT id FROM groups WHERE name = 'Magasin Test'), + 'TEST-FINAL-001', + 99.99, + 'Test avec donnĂ©es créées', + false, + 'admin' +) RETURNING id, supplier_id, group_id, created_by; + +-- 5. Nettoyer le test +DELETE FROM avoirs WHERE invoice_reference = 'TEST-FINAL-001'; \ No newline at end of file diff --git a/sql/test_server_connection.sql b/sql/test_server_connection.sql new file mode 100644 index 0000000..3e40985 --- /dev/null +++ b/sql/test_server_connection.sql @@ -0,0 +1,32 @@ +-- 🔍 TEST DE DIAGNOSTIC COMPLET +-- VĂ©rifiez que tout fonctionne cĂŽtĂ© base de donnĂ©es + +-- 1. La table existe-t-elle vraiment ? +SELECT COUNT(*) as table_count +FROM information_schema.tables +WHERE table_name = 'avoirs' AND table_schema = 'public'; + +-- 2. Test d'insertion manuelle pour voir si ça marche +INSERT INTO avoirs ( + supplier_id, + group_id, + invoice_reference, + amount, + comment, + commercial_processed, + created_by +) VALUES ( + 1, -- Remplacez par un ID supplier existant + 1, -- Remplacez par un ID group existant + 'TEST-MANUEL-' || EXTRACT(EPOCH FROM NOW()), + 25.99, + 'Test diagnostic manuel', + false, + 'admin' -- Remplacez par un user_id existant +) RETURNING id, created_at; + +-- 3. VĂ©rifiez le rĂ©sultat +SELECT COUNT(*) as total_avoirs FROM avoirs; + +-- 4. Supprimez le test +DELETE FROM avoirs WHERE comment = 'Test diagnostic manuel'; \ No newline at end of file