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/{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/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