Overview
Comment:Transformation des ID de comptes en codes vers des ID auto-incrémentés, ouvrant la porte à avoir plusieurs comptes avec le même code
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: be95994256a40c11f9fe8dc2017757aca47ba9ee
User & Date: bohwaz on 2020-01-17 13:11:07
Other Links: branch diff | manifest | tags
Context
2020-01-17
13:22
Ajout foreign key id_exercice sur les comptes check-in: 9ac4c86495 user: bohwaz tags: dev
13:11
Transformation des ID de comptes en codes vers des ID auto-incrémentés, ouvrant la porte à avoir plusieurs comptes avec le même code check-in: be95994256 user: bohwaz tags: dev
2020-01-06
12:15
Fusion avec trunk check-in: 451f4d7e39 user: bohwaz tags: dev
Changes

Modified src/include/data/0.10.0.sql from [d652ec7957] to [07fda4f35f].

1

2
3
4









5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ALTER TABLE compta_journal RENAME TO compta_journal_old;


.read schema.sql










INSERT INTO compta_journal (id, libelle, remarques, numero_piece, date, moyen_paiement, reference_paiement, id_exercice, id_auteur, id_categorie, id_projet)
	SELECT id, libelle, remarques, numero_piece, date, moyen_paiement, numero_cheque, id_exercice, id_auteur, id_categorie, id_projet FROM compta_journal_old;

INSERT INTO compta_journal_ecritures (id_journal, compte, debit, credit, montant)
	SELECT id, compte_credit, 0, CAST(montant * 100 AS INT) FROM compta_journal_old;

INSERT INTO compta_journal_ecritures (id_journal, compte, debit, credit, montant)
	SELECT id, compte_debit, CAST(montant * 100 AS INT), 0 FROM compta_journal_old;

DROP TABLE compta_journal_old;

-- CREATE TABLE IF NOT EXISTS compta_comptes_soldes
-- -- Soldes des comptes
-- (
--     compte TEXT NOT NULL REFERENCES compta_comptes(id) ON DELETE CASCADE,
--     exercice INTEGER NULL REFERENCES compta_exercices(id) ON DELETE CASCADE,
--     solde INTEGER NOT NULL,

--     PRIMARY KEY(compte, exercice)
-- );

-- CREATE TRIGGER IF NOT EXISTS ON compta_journal_ecritures

-- Transfert des rapprochements
UPDATE compta_journal_lignes SET rapprochement = 1 WHERE id_journal IN (SELECT id_operation FROM compta_rapprochement);

-- Suppression de la table rapprochements
DROP TABLE compta_rapprochement;

-- Ajout moyens de paiement
INSERT OR IGNORE INTO compta_moyens_paiement (code, nom) VALUES ('AU', 'Autre');
INSERT OR IGNORE INTO compta_moyens_paiement (code, nom) VALUES ('AC', 'Autres chèques (vacances, cadeau, etc.)');


>



>
>
>
>
>
>
>
>
>
|


|
|

|
|
















|




<
<
<
<
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43




ALTER TABLE compta_journal RENAME TO compta_journal_old;
ALTER TABLE compta_comptes RENAME TO compta_comptes_old;

.read schema.sql

-- Migration comptes de code comme identifiant à ID unique
INSERT INTO compta_comptes (id, code, parent, libelle, position, plan_comptable, id_exercice)
	SELECT NULL, id, 0, libelle, position, plan_comptable, NULL FROM compta_comptes_old;

-- Migration de la hiérarchie
UPDATE compta_comptes AS a SET parent = (SELECT id FROM compta_comptes AS b WHERE code = (SELECT parent FROM compta_comptes_old AS c WHERE id = b.code));

-- Création archives comptes des exercices précédents faite dans upgrade.php !

INSERT INTO compta_mouvements (id, libelle, remarques, numero_piece, date, moyen_paiement, reference_paiement, id_exercice, id_auteur, id_categorie, id_projet)
	SELECT id, libelle, remarques, numero_piece, date, moyen_paiement, numero_cheque, id_exercice, id_auteur, id_categorie, id_projet FROM compta_journal_old;

INSERT INTO compta_mouvements_lignes (id_mouvement, compte, debit, credit, montant)
	SELECT id, (SELECT id FROM compta_comptes WHERE code = compte_credit), 0, CAST(montant * 100 AS INT) FROM compta_journal_old;

INSERT INTO compta_mouvements_lignes (id_mouvement, compte, debit, credit, montant)
	SELECT id, (SELECT id FROM compta_comptes WHERE code = compte_debit), CAST(montant * 100 AS INT), 0 FROM compta_journal_old;

DROP TABLE compta_journal_old;

-- CREATE TABLE IF NOT EXISTS compta_comptes_soldes
-- -- Soldes des comptes
-- (
--     compte TEXT NOT NULL REFERENCES compta_comptes(id) ON DELETE CASCADE,
--     exercice INTEGER NULL REFERENCES compta_exercices(id) ON DELETE CASCADE,
--     solde INTEGER NOT NULL,

--     PRIMARY KEY(compte, exercice)
-- );

-- CREATE TRIGGER IF NOT EXISTS ON compta_journal_ecritures

-- Transfert des rapprochements
UPDATE compta_mouvements_lignes SET rapprochement = 1 WHERE id_mouvement IN (SELECT id_operation FROM compta_rapprochement);

-- Suppression de la table rapprochements
DROP TABLE compta_rapprochement;





Modified src/include/data/schema.sql from [ed9b40a97d] to [2dfcef7a46].

170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

-- Si le contenu est chiffré, la recherche n'affiche pas de contenu
CREATE TRIGGER IF NOT EXISTS wiki_recherche_contenu_chiffre AFTER INSERT ON wiki_revisions WHEN new.chiffrement = 1
    BEGIN
        UPDATE wiki_recherche SET contenu = '' WHERE id = new.id_page;
    END;

/*
CREATE TABLE wiki_suivi
-- Suivi des pages
(
    id_membre INTEGER NOT NULL,
    id_page INTEGER NOT NULL,

    PRIMARY KEY (id_membre, id_page),

    FOREIGN KEY (id_page) REFERENCES wiki_pages (id), -- Clé externe obligatoire
    FOREIGN KEY (id_membre) REFERENCES membres (id) -- Clé externe obligatoire
);
*/

--
-- COMPTA
--

CREATE TABLE IF NOT EXISTS compta_exercices
-- Exercices
(







<
<
<
<
<
<
<
<
<
<
<
<
<
<







170
171
172
173
174
175
176














177
178
179
180
181
182
183

-- Si le contenu est chiffré, la recherche n'affiche pas de contenu
CREATE TRIGGER IF NOT EXISTS wiki_recherche_contenu_chiffre AFTER INSERT ON wiki_revisions WHEN new.chiffrement = 1
    BEGIN
        UPDATE wiki_recherche SET contenu = '' WHERE id = new.id_page;
    END;















--
-- COMPTA
--

CREATE TABLE IF NOT EXISTS compta_exercices
-- Exercices
(
205
206
207
208
209
210
211

212
213
214
215
216
217
218
219


220
221

222
223
224
225
226
227
228
229
230
231
232
233
234
    cloture INTEGER NOT NULL DEFAULT 0
);


CREATE TABLE IF NOT EXISTS compta_comptes
-- Plan comptable
(

    id TEXT NOT NULL PRIMARY KEY, -- peut contenir des lettres, eg. 53A, 53B, etc.
    parent TEXT NOT NULL DEFAULT 0,

    libelle TEXT NOT NULL,

    position INTEGER NOT NULL, -- position actif/passif/charge/produit
    plan_comptable INTEGER NOT NULL DEFAULT 1, -- 1 = fait partie du plan comptable, 0 = a été ajouté par l'utilisateur
    desactive INTEGER NOT NULL DEFAULT 0 -- 1 = compte historique désactivé


);


CREATE INDEX IF NOT EXISTS compta_comptes_parent ON compta_comptes (parent);

CREATE TABLE IF NOT EXISTS compta_comptes_bancaires
-- Comptes bancaires
(
    id TEXT NOT NULL PRIMARY KEY,

    banque TEXT NOT NULL,

    iban TEXT NULL,
    bic TEXT NULL,

    FOREIGN KEY(id) REFERENCES compta_comptes(id) ON DELETE CASCADE







>
|
|




|
|
>
>


>





|







191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
    cloture INTEGER NOT NULL DEFAULT 0
);


CREATE TABLE IF NOT EXISTS compta_comptes
-- Plan comptable
(
    id INTEGER NOT NULL PRIMARY KEY,
    code TEXT NOT NULL, -- peut contenir des lettres, eg. 53A, 53B, etc.
    parent INTEGER NOT NULL DEFAULT 0,

    libelle TEXT NOT NULL,

    position INTEGER NOT NULL, -- position actif/passif/charge/produit
    plan_comptable INTEGER NOT NULL DEFAULT 1, -- 1 = fait partie du plan comptable original, 0 = a été ajouté par l'utilisateur
    id_exercice INTEGER NULL REFERENCES compta_exercices (id)
    -- Quand un exercice est clôturé, on copie les comptes utilisés dans cet exercice, avec id_exercice renseigné
    -- pour garder une archive en cas de modification du plan comptable dans les exercices suivants
);

CREATE UNIQUE INDEX IF NOT EXISTS compta_comptes_code ON compta_comptes (code, id_exercice);
CREATE INDEX IF NOT EXISTS compta_comptes_parent ON compta_comptes (parent);

CREATE TABLE IF NOT EXISTS compta_comptes_bancaires
-- Comptes bancaires
(
    id INTEGER NOT NULL PRIMARY KEY,

    banque TEXT NOT NULL,

    iban TEXT NULL,
    bic TEXT NULL,

    FOREIGN KEY(id) REFERENCES compta_comptes(id) ON DELETE CASCADE
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263

    libelle TEXT NOT NULL,
    remarques TEXT NULL,
    numero_piece TEXT NULL, -- N° de pièce comptable

    date TEXT NOT NULL DEFAULT CURRENT_DATE CHECK (date(date) IS NOT NULL AND date(date) = date),
    moyen_paiement TEXT NULL,
    reference_paiement TEXT NULL,

    validation INTEGER NOT NULL DEFAULT 0, -- 1 = écriture validée, non modifiable

    hash TEXT NULL,
    prev_hash TEXT NULL,

    id_exercice INTEGER NULL DEFAULT NULL, -- En cas de compta simple, l'exercice est permanent (NULL)







<







239
240
241
242
243
244
245

246
247
248
249
250
251
252

    libelle TEXT NOT NULL,
    remarques TEXT NULL,
    numero_piece TEXT NULL, -- N° de pièce comptable

    date TEXT NOT NULL DEFAULT CURRENT_DATE CHECK (date(date) IS NOT NULL AND date(date) = date),
    moyen_paiement TEXT NULL,


    validation INTEGER NOT NULL DEFAULT 0, -- 1 = écriture validée, non modifiable

    hash TEXT NULL,
    prev_hash TEXT NULL,

    id_exercice INTEGER NULL DEFAULT NULL, -- En cas de compta simple, l'exercice est permanent (NULL)
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
);

CREATE INDEX IF NOT EXISTS compta_operations_exercice ON compta_mouvements (id_exercice);
CREATE INDEX IF NOT EXISTS compta_operations_date ON compta_mouvements (date);
CREATE INDEX IF NOT EXISTS compta_operations_auteur ON compta_mouvements (id_auteur);

CREATE TABLE IF NOT EXISTS compta_mouvements_lignes
-- Ecritures
(
    id INTEGER PRIMARY KEY NOT NULL,

    id_mouvement INTEGER NOT NULL REFERENCES compta_mouvements (id) ON DELETE CASCADE,

    compte TEXT NOT NULL REFERENCES compta_comptes(id), -- N° du compte dans le plan comptable
    credit INTEGER NOT NULL,
    debit INTEGER NOT NULL,

    rapprochement INTEGER NOT NULL DEFAULT 0,

    CONSTRAINT ligne_check1 CHECK ((credit * debit) = 0),
    CONSTRAINT ligne_check2 CHECK ((credit + debit) > 0)
);

CREATE INDEX IF NOT EXISTS compta_operations_comptes ON compta_mouvements_lignes (compte);

CREATE TABLE IF NOT EXISTS compta_moyens_paiement
-- Moyens de paiement
(
    code TEXT NOT NULL PRIMARY KEY,
    nom TEXT NOT NULL
);







|





|









|







262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
);

CREATE INDEX IF NOT EXISTS compta_operations_exercice ON compta_mouvements (id_exercice);
CREATE INDEX IF NOT EXISTS compta_operations_date ON compta_mouvements (date);
CREATE INDEX IF NOT EXISTS compta_operations_auteur ON compta_mouvements (id_auteur);

CREATE TABLE IF NOT EXISTS compta_mouvements_lignes
-- Écritures
(
    id INTEGER PRIMARY KEY NOT NULL,

    id_mouvement INTEGER NOT NULL REFERENCES compta_mouvements (id) ON DELETE CASCADE,

    compte INTEGER NOT NULL REFERENCES compta_comptes(id), -- N° du compte dans le plan comptable
    credit INTEGER NOT NULL,
    debit INTEGER NOT NULL,

    rapprochement INTEGER NOT NULL DEFAULT 0,

    CONSTRAINT ligne_check1 CHECK ((credit * debit) = 0),
    CONSTRAINT ligne_check2 CHECK ((credit + debit) > 0)
);

CREATE INDEX IF NOT EXISTS compta_mouvements_lignes_compte ON compta_mouvements_lignes (compte);

CREATE TABLE IF NOT EXISTS compta_moyens_paiement
-- Moyens de paiement
(
    code TEXT NOT NULL PRIMARY KEY,
    nom TEXT NOT NULL
);
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
(
    id INTEGER NOT NULL PRIMARY KEY,
    type INTEGER NOT NULL DEFAULT 1, -- 1 = recette, -1 = dépense, 0 = autre (utilisé uniquement pour l'interface)

    intitule TEXT NOT NULL,
    description TEXT NULL,

    compte TEXT NULL REFERENCES compta_comptes(id) ON DELETE CASCADE -- Compte affecté par cette catégorie
);

CREATE TABLE IF NOT EXISTS plugins
(
    id TEXT NOT NULL PRIMARY KEY,
    officiel INTEGER NOT NULL DEFAULT 0,
    nom TEXT NOT NULL,







|







305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
(
    id INTEGER NOT NULL PRIMARY KEY,
    type INTEGER NOT NULL DEFAULT 1, -- 1 = recette, -1 = dépense, 0 = autre (utilisé uniquement pour l'interface)

    intitule TEXT NOT NULL,
    description TEXT NULL,

    compte INTEGER NULL REFERENCES compta_comptes(id) ON DELETE CASCADE -- Compte affecté par cette catégorie
);

CREATE TABLE IF NOT EXISTS plugins
(
    id TEXT NOT NULL PRIMARY KEY,
    officiel INTEGER NOT NULL DEFAULT 0,
    nom TEXT NOT NULL,

Modified src/www/admin/upgrade.php from [78af2dd31b] to [2d14ddf93e].

266
267
268
269
270
271
272

273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
        $comptes->importPlan();
    }

    if (version_compare($v, '0.10.0', '<'))
    {
        $db->beginSchemaUpdate();
        $db->import(ROOT . '/include/data/0.10.0.sql');

        $db->commitSchemaUpdate();
    }

    $keycheck_after = $db->get('PRAGMA foreign_key_check;');
    $keycheck_after = $keycheck_after ? count($keycheck_after) : 0;

    if ($keycheck_after != $keycheck)
    {
        throw new \LogicException('Erreur de cohérence dans la base de données lors de la mise à jour (clés étrangères)');
    }

    if (version_compare($v, '0.9.5', '<'))
    {
        $db->beginSchemaUpdate());
        // Créer les tables manquantes
        $db->import(ROOT . '/include/data/schema.sql');
        $db->commitSchemaUpdate();
    }

    Utils::clearCaches();








>













|







266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
        $comptes->importPlan();
    }

    if (version_compare($v, '0.10.0', '<'))
    {
        $db->beginSchemaUpdate();
        $db->import(ROOT . '/include/data/0.10.0.sql');
        // FIXME: Création archives comptes des exercices précédents et association des écritures à ces nouveaux comptes
        $db->commitSchemaUpdate();
    }

    $keycheck_after = $db->get('PRAGMA foreign_key_check;');
    $keycheck_after = $keycheck_after ? count($keycheck_after) : 0;

    if ($keycheck_after != $keycheck)
    {
        throw new \LogicException('Erreur de cohérence dans la base de données lors de la mise à jour (clés étrangères)');
    }

    if (version_compare($v, '0.9.5', '<'))
    {
        $db->beginSchemaUpdate();
        // Créer les tables manquantes
        $db->import(ROOT . '/include/data/schema.sql');
        $db->commitSchemaUpdate();
    }

    Utils::clearCaches();