No files matched your search
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 287 KiB |
|
After Width: | Height: | Size: 218 KiB |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 205 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 97 KiB |
@@ -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;
|
||||||
@@ -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';
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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';
|
||||||
@@ -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';
|
||||||