Overview
Comment:Encore des soucis de foreign keys: il faut permettre de mettre id_auteur à NULL pour pouvoir supprimer des membres qui ont fait des rapprochements.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 795737be8ae98e5edd244f891796a75ce2cbb865
User & Date: bohwaz on 2016-05-31 05:38:10
Other Links: manifest | tags
References
2020-12-08
23:25 Wiki page "Changelog/0.9" artifact: b9c916b4d1 user: bohwaz
Context
2016-05-31
05:40
Quand on supprime une cotisation on veut aussi supprimer les rappels liés. check-in: 2404bb932f user: bohwaz tags: trunk
05:38
Encore des soucis de foreign keys: il faut permettre de mettre id_auteur à NULL pour pouvoir supprimer des membres qui ont fait des rapprochements. check-in: 795737be8a user: bohwaz tags: trunk
05:21
Ne pas permettre de faire des ID de compte en minuscule check-in: 2ff14ece2a user: bohwaz tags: trunk
Changes

Modified src/include/data/0.7.2.sql from [7a12e6fced] to [010e7b0250].

1
2
3
4
5
6
















# Colonne manquante
ALTER TABLE rappels_envoyes ADD COLUMN id_rappel INTEGER NULL REFERENCES rappels (id);

# Un bug a permis d'insérer des comptes avec des lettres minuscules, créant des problèmes
# corrigeons donc les comptes pour les mettre en majuscules.
UPDATE compta_comptes SET id = UPPER(id);






















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Colonne manquante
ALTER TABLE rappels_envoyes ADD COLUMN id_rappel INTEGER NULL REFERENCES rappels (id);

# Un bug a permis d'insérer des comptes avec des lettres minuscules, créant des problèmes
# corrigeons donc les comptes pour les mettre en majuscules.
UPDATE compta_comptes SET id = UPPER(id);

# Le champ id_auteur était à NOT NULL, il faut corriger ça pour pouvoir avoir un rapprochement anonyme
# une fois que le membre a été supprimé
CREATE TABLE compta_rapprochement2
-- Rapprochement entre compta et relevés de comptes
(
    id_operation INTEGER NOT NULL PRIMARY KEY REFERENCES compta_journal (id),
    date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    id_auteur INTEGER NULL REFERENCES membres (id)
);

INSERT INTO compta_rapprochement2 (SELECT operation, date, auteur FROM compta_rapprochement);

DROP TABLE compta_rapprochement;

ALTER TABLE compta_rapprochement2 RENAME TO compta_rapprochement;

Modified src/include/data/schema.sql from [255336d2fc] to [5ab5416f01].

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
    FOREIGN KEY (id) REFERENCES wiki_pages(id)
);

CREATE TABLE wiki_revisions
-- Révisions du contenu des pages
(
    id_page INTEGER NOT NULL,
    revision INTEGER,

    id_auteur INTEGER,

    contenu TEXT,
    modification TEXT, -- Description des modifications effectuées
    chiffrement INTEGER DEFAULT 0, -- 1 si le contenu est chiffré, 0 sinon
    date TEXT DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY(id_page, revision),







|

|







124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
    FOREIGN KEY (id) REFERENCES wiki_pages(id)
);

CREATE TABLE wiki_revisions
-- Révisions du contenu des pages
(
    id_page INTEGER NOT NULL,
    revision INTEGER NULL,

    id_auteur INTEGER NULL,

    contenu TEXT,
    modification TEXT, -- Description des modifications effectuées
    chiffrement INTEGER DEFAULT 0, -- 1 si le contenu est chiffré, 0 sinon
    date TEXT DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY(id_page, revision),
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
    callback TEXT NOT NULL,
    PRIMARY KEY (signal, plugin)
);

CREATE TABLE compta_rapprochement
-- Rapprochement entre compta et relevés de comptes
(
    operation INTEGER NOT NULL PRIMARY KEY REFERENCES compta_journal (id),
    date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    auteur INTEGER NOT NULL REFERENCES membres (id)
);

CREATE TABLE fichiers
-- Données sur les fichiers
(
    id INTEGER NOT NULL PRIMARY KEY,
    nom TEXT NOT NULL, -- nom de fichier (par exemple image1234.jpeg)







|

|







313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
    callback TEXT NOT NULL,
    PRIMARY KEY (signal, plugin)
);

CREATE TABLE compta_rapprochement
-- Rapprochement entre compta et relevés de comptes
(
    id_operation INTEGER NOT NULL PRIMARY KEY REFERENCES compta_journal (id),
    date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
    id_auteur INTEGER NULL REFERENCES membres (id)
);

CREATE TABLE fichiers
-- Données sur les fichiers
(
    id INTEGER NOT NULL PRIMARY KEY,
    nom TEXT NOT NULL, -- nom de fichier (par exemple image1234.jpeg)

Modified src/include/lib/Garradin/Compta/Journal.php from [40cb96972d] to [8da9330c29].

149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
        if (!$this->_checkOpenExercice($db->simpleQuerySingle('SELECT id_exercice FROM compta_journal WHERE id = ?;', false, $id)))
        {
            throw new UserException('Cette opération fait partie d\'un exercice qui a été clôturé.');
        }

        $db->exec('BEGIN;');
        $db->simpleExec('DELETE FROM membres_operations WHERE id_operation = ?;', (int)$id);
        $db->simpleExec('DELETE FROM compta_rapprochement WHERE operation = ?;', (int)$id);
        $db->simpleExec('DELETE FROM compta_journal WHERE id = ?;', (int)$id);
        $db->exec('END;');

        return true;
    }

    public function get($id)







|







149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
        if (!$this->_checkOpenExercice($db->simpleQuerySingle('SELECT id_exercice FROM compta_journal WHERE id = ?;', false, $id)))
        {
            throw new UserException('Cette opération fait partie d\'un exercice qui a été clôturé.');
        }

        $db->exec('BEGIN;');
        $db->simpleExec('DELETE FROM membres_operations WHERE id_operation = ?;', (int)$id);
        $db->simpleExec('DELETE FROM compta_rapprochement WHERE id_operation = ?;', (int)$id);
        $db->simpleExec('DELETE FROM compta_journal WHERE id = ?;', (int)$id);
        $db->exec('END;');

        return true;
    }

    public function get($id)

Modified src/include/lib/Garradin/Compta/Rapprochement.php from [69ffb638fe] to [883bfc5b12].

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        ]);

        $query = '
            SELECT j.*, strftime(\'%s\', j.date) AS date,
                (CASE WHEN j.compte_debit = :compte THEN j.montant ELSE -(j.montant) END) AS solde,
                r.date AS date_rapprochement
            FROM compta_journal AS j
                LEFT JOIN compta_rapprochement AS r ON r.operation = j.id
            WHERE (compte_debit = :compte OR compte_credit = :compte) AND id_exercice = :exercice
                AND j.date >= :debut AND j.date <= :fin
            ORDER BY date ASC;';

        $result = $db->simpleStatementFetch($query, DB::ASSOC, [
            'compte'    =>  $compte,
            'debut'     =>  $debut,







|







27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        ]);

        $query = '
            SELECT j.*, strftime(\'%s\', j.date) AS date,
                (CASE WHEN j.compte_debit = :compte THEN j.montant ELSE -(j.montant) END) AS solde,
                r.date AS date_rapprochement
            FROM compta_journal AS j
                LEFT JOIN compta_rapprochement AS r ON r.id_operation = j.id
            WHERE (compte_debit = :compte OR compte_credit = :compte) AND id_exercice = :exercice
                AND j.date >= :debut AND j.date <= :fin
            ORDER BY date ASC;';

        $result = $db->simpleStatementFetch($query, DB::ASSOC, [
            'compte'    =>  $compte,
            'debut'     =>  $debut,
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
            $cases = [];
        }

        $db = DB::getInstance();
        $db->exec('BEGIN;');

        // Synchro des trucs cochés
        $st = $db->prepare('INSERT OR REPLACE INTO compta_rapprochement (operation, auteur) 
            VALUES (:operation, :auteur);');
        $st->bindValue(':auteur', (int)$auteur, \SQLITE3_INTEGER);

        foreach ($journal as $row)
        {
            if (!array_key_exists($row['id'], $cases))
                continue;

            $st->bindValue(':operation', (int)$row['id'], \SQLITE3_INTEGER);
            $st->execute();
        }

        // Synchro des trucs NON cochés
        $st = $db->prepare('DELETE FROM compta_rapprochement WHERE operation = :id;');

        foreach ($journal as $row)
        {
            if (array_key_exists($row['id'], $cases))
                continue;

            $st->bindValue(':id', (int)$row['id'], \SQLITE3_INTEGER);







|













|







66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
            $cases = [];
        }

        $db = DB::getInstance();
        $db->exec('BEGIN;');

        // Synchro des trucs cochés
        $st = $db->prepare('INSERT OR REPLACE INTO compta_rapprochement (id_operation, id_auteur) 
            VALUES (:operation, :auteur);');
        $st->bindValue(':auteur', (int)$auteur, \SQLITE3_INTEGER);

        foreach ($journal as $row)
        {
            if (!array_key_exists($row['id'], $cases))
                continue;

            $st->bindValue(':operation', (int)$row['id'], \SQLITE3_INTEGER);
            $st->execute();
        }

        // Synchro des trucs NON cochés
        $st = $db->prepare('DELETE FROM compta_rapprochement WHERE id_operation = :id;');

        foreach ($journal as $row)
        {
            if (array_key_exists($row['id'], $cases))
                continue;

            $st->bindValue(':id', (int)$row['id'], \SQLITE3_INTEGER);

Modified src/include/lib/Garradin/Membres.php from [b912871f30] to [e460b08c95].

451
452
453
454
455
456
457
458
459
460
461
462
463
464
465

            // Si on ne vérifie pas toutes les tables qui sont liées ici à un ID de membre
            // la requête de modification provoquera une erreur de contrainte de foreign key
            // ce qui est normal. Donc : il n'est pas possible de changer l'ID d'un membre qui
            // a participé au wiki, à la compta, etc.
            if ($db->simpleQuerySingle('SELECT 1 FROM wiki_revisions WHERE id_auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM compta_journal WHERE id_auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM compta_rapprochement WHERE auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM membres_operations WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM cotisations_membres WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM rappels_envoyes WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM fichiers_membres WHERE id = ?;', false, (int)$id))
            # FIXME || $db->simpleQuerySingle('SELECT 1 FROM wiki_suivi WHERE id_membre = ?;', false, (int)$id))
            {
                throw new UserException('Le numéro n\'est pas modifiable pour ce membre car des contenus sont liés à ce numéro de membre (wiki, compta, etc.).');







|







451
452
453
454
455
456
457
458
459
460
461
462
463
464
465

            // Si on ne vérifie pas toutes les tables qui sont liées ici à un ID de membre
            // la requête de modification provoquera une erreur de contrainte de foreign key
            // ce qui est normal. Donc : il n'est pas possible de changer l'ID d'un membre qui
            // a participé au wiki, à la compta, etc.
            if ($db->simpleQuerySingle('SELECT 1 FROM wiki_revisions WHERE id_auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM compta_journal WHERE id_auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM compta_rapprochement WHERE id_auteur = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM membres_operations WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM cotisations_membres WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM rappels_envoyes WHERE id_membre = ?;', false, (int)$id)
                || $db->simpleQuerySingle('SELECT 1 FROM fichiers_membres WHERE id = ?;', false, (int)$id))
            # FIXME || $db->simpleQuerySingle('SELECT 1 FROM wiki_suivi WHERE id_membre = ?;', false, (int)$id))
            {
                throw new UserException('Le numéro n\'est pas modifiable pour ce membre car des contenus sont liés à ce numéro de membre (wiki, compta, etc.).');
703
704
705
706
707
708
709

710
711
712
713
714
715
716
        $membres = implode(',', $membres);

        $db = DB::getInstance();
        
        // Mise à jour des références, membre qui n'existe plus
        $db->exec('UPDATE wiki_revisions SET id_auteur = NULL WHERE id_auteur IN ('.$membres.');');
        $db->exec('UPDATE compta_journal SET id_auteur = NULL WHERE id_auteur IN ('.$membres.');');


        // Suppression des données liées au membre
        $db->exec('DELETE FROM rappels_envoyes WHERE id_membre IN ('.$membres.');');
        $db->exec('DELETE FROM membres_operations WHERE id_membre IN ('.$membres.');');
        $db->exec('DELETE FROM cotisations_membres WHERE id_membre IN ('.$membres.');');

        //$db->exec('DELETE FROM wiki_suivi WHERE id_membre IN ('.$membres.');');







>







703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
        $membres = implode(',', $membres);

        $db = DB::getInstance();
        
        // Mise à jour des références, membre qui n'existe plus
        $db->exec('UPDATE wiki_revisions SET id_auteur = NULL WHERE id_auteur IN ('.$membres.');');
        $db->exec('UPDATE compta_journal SET id_auteur = NULL WHERE id_auteur IN ('.$membres.');');
        $db->exec('UPDATE compta_rapprochement SET id_auteur = NULL WHERE id_auteur IN ('.$membres.');');

        // Suppression des données liées au membre
        $db->exec('DELETE FROM rappels_envoyes WHERE id_membre IN ('.$membres.');');
        $db->exec('DELETE FROM membres_operations WHERE id_membre IN ('.$membres.');');
        $db->exec('DELETE FROM cotisations_membres WHERE id_membre IN ('.$membres.');');

        //$db->exec('DELETE FROM wiki_suivi WHERE id_membre IN ('.$membres.');');