Overview
Comment:Suppression des catégories comptables, intégration dans le plan comptable
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 34c1d2732dc4f9311670af2efc6237d3347a5541
User & Date: bohwaz on 2020-04-21 02:49:20
Other Links: branch diff | manifest | tags
Context
2020-04-21
02:55
Template: ajout d'un type select avec optgroups au widget input check-in: 62abb2d901 user: bohwaz tags: dev
02:49
Suppression des catégories comptables, intégration dans le plan comptable check-in: 34c1d2732d user: bohwaz tags: dev
00:58
Renommer le namespace Compta -> Accounting check-in: 1eec72f23b user: bohwaz tags: dev
Changes

Modified src/include/data/1.0.0_migration.sql from [214a92ada1] to [e92c373f0b].

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
44
45


46
47

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

-- N'est pas utilisé
DELETE FROM config WHERE cle = 'categorie_dons' OR cle = 'categorie_cotisations';

.read 1.0.0_schema.sql

-- FIXME: insertion en comptes analytiques des projets et associations dans transactions
-- FIXME: création plan comptable






-- Migration comptes de code comme identifiant à ID unique
INSERT INTO compta_comptes (id, code, parent, libelle, position, plan_comptable, id_exercice)

	SELECT NULL, id, NULL, 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 !



















-- Recopie des mouvements
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;



-- Création des lignes associées aux mouvements
INSERT INTO compta_mouvements_lignes (id_mouvement, compte, debit, credit)

	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)

	SELECT id, (SELECT id FROM compta_comptes WHERE code = compte_debit), CAST(montant * 100 AS INT), 0 FROM compta_journal_old;

-- Recopie des catégories avec les nouveaux ID de comptes
INSERT INTO compta_categories
	SELECT id, type, intitule, description, (SELECT id FROM compta_comptes WHERE code = compte) FROM compta_categories_old;




-- Recopie des opérations, mais le nom a changé pour "mouvements"
INSERT INTO membres_mouvements
	SELECT * FROM membres_operations_old;



-- Recopie des exercices, mais la date de fin ne peut être nulle
INSERT INTO compta_exercices

	SELECT id, libelle, debut, CASE WHEN fin IS NULL THEN date(debut, '+1 year') ELSE fin END, cloture FROM compta_exercices_old;

-- Recopie des catégories, on supprime la colonne id_cotisation_obligatoire
INSERT INTO membres_categories
	SELECT id, nom, droit_wiki, droit_membres, droit_compta, droit_inscription, droit_connexion, droit_config, cacher FROM membres_categories_old;

DROP TABLE compta_journal_old;
DROP TABLE membres_operations_old;
DROP TABLE compta_categories_old;
DROP TABLE compta_comptes_old;
DROP TABLE compta_exercices_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;

-- Suppression inutilisées
DROP TABLE compta_projets;
DROP TABLE compta_comptes_bancaires;
DROP TABLE compta_moyens_paiements;









<

>
>
>
>
>

<
>
|


|

<
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

<
>
|
>
>


<
>
|

<
>
|

<
<
<
>
>
>





>
>

<
>
|











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

|










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
44
45
46
47
48

49
50
51
52
53
54

55
56
57

58
59
60



61
62
63
64
65
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
95
96

-- N'est pas utilisé
DELETE FROM config WHERE cle = 'categorie_dons' OR cle = 'categorie_cotisations';

.read 1.0.0_schema.sql

-- FIXME: insertion en comptes analytiques des projets et associations dans transactions


INSERT INTO acc_plans (id, country, code, label) VALUES (1, 'FR', 'PCG1999', 'Plan comptable associatif (France, 1999-2019)');

--.read plan_comptable_1999.sql
--.read plan_comptable_2020.sql

-- Migration comptes de code comme identifiant à ID unique

INSERT INTO acc_accounts (id, id_plan, code, parent, label, position, user, id_exercice)
	SELECT NULL, 1, id, NULL, libelle, position, plan_comptable, NULL FROM compta_comptes_old;

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


-- Migrations projets vers comptes analytiques
INSERT INTO acc_accounts (id_plan, code, parent, label, position, user, type)
	VALUES (1, '99', (SELECT id FROM acc_accounts WHERE code = '9'), 'Projets', 0, 0, 4);

INSERT INTO acc_accounts (id_plan, code, parent, label, position, user, type)
	SELECT 1, '99' || substr('0000' || id, -4), (SELECT id FROM acc_accounts WHERE code = '99'), libelle, 0, 1, 3 FROM compta_projets;

-- Migration comptes bancaires
UPDATE acc_accounts SET type = 1 WHERE code IN (SELECT id FROM compta_comptes_bancaires);

-- Caisse
UPDATE acc_accounts SET type = 2 WHERE code = '530';

-- Chèques et carte à encaisser
UPDATE acc_accounts SET type = 3 WHERE code = '5112' OR code = '5113';

-- Bénévolat en nature
UPDATE acc_accounts SET type = 5 WHERE code = '870';

-- Recopie des mouvements

INSERT INTO acc_transactions (id, label, notes, reference, date, id_year, id_category, id_analytical)
	SELECT id, libelle, remarques, numero_piece, date, id_exercice, id_categorie,
	CASE WHEN id_projet IS NOT NULL THEN (SELECT id FROM acc_accounts WHERE code = '99' || substr('0000' || id_projet, -4)) ELSE NULL END
	FROM compta_journal_old;

-- Création des lignes associées aux mouvements

INSERT INTO acc_transactions_lines (id_transaction, id_account, debit, credit, payment_reference)
	SELECT id, (SELECT id FROM acc_accounts WHERE code = compte_credit), 0, CAST(montant * 100 AS INT), numero_cheque FROM compta_journal_old;


INSERT INTO acc_transactions_lines (id_transaction, id_account, debit, credit)
	SELECT id, (SELECT id FROM acc_accounts WHERE code = compte_debit), CAST(montant * 100 AS INT), 0, numero_cheque FROM compta_journal_old;




-- Recopie des descriptions de catégories dans la table des comptes
UPDATE acc_accounts a SET (a.type, a.description) = (SELECT CASE WHEN c.type = -1 THEN 6 ELSE 7 END, c.description FROM compta_categories_old c WHERE c.id = a.code)
	WHERE EXISTS (SELECT rowid FROM compta_categories_old c WHERE c.id = a.code);

-- Recopie des opérations, mais le nom a changé pour "mouvements"
INSERT INTO membres_mouvements
	SELECT * FROM membres_operations_old;

-- FIXME: ajout d'entrées dans le le log utilisateur à partir de id_auteur

-- Recopie des exercices, mais la date de fin ne peut être nulle

INSERT INTO acc_years (id, label, start_date, end_date, closed, id_plan)
	SELECT id, libelle, debut, CASE WHEN fin IS NULL THEN date(debut, '+1 year') ELSE fin END, cloture, 1 FROM compta_exercices_old;

-- Recopie des catégories, on supprime la colonne id_cotisation_obligatoire
INSERT INTO membres_categories
	SELECT id, nom, droit_wiki, droit_membres, droit_compta, droit_inscription, droit_connexion, droit_config, cacher FROM membres_categories_old;

DROP TABLE compta_journal_old;
DROP TABLE membres_operations_old;
DROP TABLE compta_categories_old;
DROP TABLE compta_comptes_old;
DROP TABLE compta_exercices_old;













-- Transfert des rapprochements
UPDATE acc_transactions_lines SET reconcilied = 1 WHERE id_transaction IN (SELECT id_operation FROM compta_rapprochement);

-- Suppression de la table rapprochements
DROP TABLE compta_rapprochement;

-- Suppression inutilisées
DROP TABLE compta_projets;
DROP TABLE compta_comptes_bancaires;
DROP TABLE compta_moyens_paiements;


Modified src/include/data/1.0.0_schema.sql from [fcd675e17c] to [7a8e00355d].

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
...
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
...
210
211
212
213
214
215
216

217
218
219

220
221
222
223
224















225
226
227
228
229
230
231
...
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
...
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
CREATE TABLE IF NOT EXISTS cotisations_tarifs
(
    id INTEGER PRIMARY KEY NOT NULL,
    label TEXT NOT NULL,
    description TEXT NULL,
    amount INTEGER NULL,
    formula TEXT NULL,
    id_category INTEGER NULL REFERENCES acc_categories (id) ON DELETE SET NULL, -- NULL si le type n'est pas associé automatiquement à la compta
);

CREATE TABLE IF NOT EXISTS cotisations_membres
-- Enregistrement des cotisations et activités
(
    id INTEGER NOT NULL PRIMARY KEY,
    id_membre INTEGER NOT NULL REFERENCES membres (id) ON DELETE CASCADE,
................................................................................
        UPDATE wiki_recherche SET contenu = '' WHERE id = new.id_page;
    END;

--
-- COMPTA
--

CREATE TABLE IF NOT EXISTS acc_years
-- Exercices
(
    id INTEGER NOT NULL PRIMARY KEY,

    label TEXT NOT NULL,

    start_date TEXT NOT NULL CHECK (date(debut) IS NOT NULL AND date(debut) = debut),
    end_date TEXT NOT NULL CHECK (date(fin) IS NOT NULL AND date(fin) = fin),

    closed INTEGER NOT NULL DEFAULT 0,

    id_plan INTEGER NOT NULL REFERENCES acc_plans (id)
);

CREATE TABLE IF NOT EXISTS acc_plans
-- Plans comptables : il peut y en avoir plusieurs
(
    id INTEGER NOT NULL PRIMARY KEY,
    country TEXT NOT NULL,
    code TEXT NULL, -- NULL = plan comptable créé par l'utilisateur
    label TEXT NOT NULL
................................................................................
    id INTEGER NOT NULL PRIMARY KEY,
    id_plan INTEGER NOT NULL REFERENCES compta_plans,

    code TEXT NOT NULL, -- peut contenir des lettres, eg. 53A, 53B, etc.
    parent INTEGER NULL REFERENCES compta_comptes(id),

    label TEXT NOT NULL,


    position INTEGER NOT NULL, -- position actif/passif/charge/produit
    type INTEGER NOT NULL DEFAULT 0, -- compte spécial : banque, caisse, en attente d'encaissement

    user INTEGER NOT NULL DEFAULT 1 -- 1 = fait partie du plan comptable original, 0 = a été ajouté par l'utilisateur
);

CREATE UNIQUE INDEX IF NOT EXISTS acc_accounts_codes ON acc_accounts (code, id_plan);
CREATE INDEX IF NOT EXISTS acc_accounts_parent ON acc_accounts (parent);
















CREATE TABLE IF NOT EXISTS acc_transactions
-- Opérations comptables
(
    id INTEGER PRIMARY KEY NOT NULL,

    label TEXT NOT NULL,
................................................................................

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

    hash TEXT NULL,
    prev_hash TEXT NULL,

    id_year INTEGER NOT NULL REFERENCES acc_years(id),
    id_category INTEGER NULL REFERENCES acc_categories(id) ON DELETE SET NULL, -- Numéro de catégorie (en mode simple)
    id_analytical INTEGER NULL REFERENCES acc_accounts(id) ON DELETE SET NULL
);

CREATE INDEX IF NOT EXISTS acc_transactions_year ON acc_transactions (id_year);
CREATE INDEX IF NOT EXISTS acc_transactions_date ON acc_transactions (date);

CREATE TABLE IF NOT EXISTS acc_transactions_lines
................................................................................

    CONSTRAINT line_check1 CHECK ((credit * debit) = 0),
    CONSTRAINT line_check2 CHECK ((credit + debit) > 0)
);

CREATE INDEX IF NOT EXISTS acc_transactions_lines_account ON acc_transactions_lines (id_account);

CREATE TABLE IF NOT EXISTS acc_categories
-- Catégories pour simplifier le plan comptable
(
    id INTEGER NOT NULL PRIMARY KEY,
    type INTEGER NOT NULL DEFAULT 1, -- 1 = recette, -1 = dépense, 0 = autre (utilisé uniquement pour l'interface)

    label TEXT NOT NULL,
    description TEXT NULL,

    id_account INTEGER NULL REFERENCES acc_accounts(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,
    description TEXT NULL,
    auteur TEXT NULL,







|







 







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







 







>


|
>





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







<







 







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







50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
...
176
177
178
179
180
181
182















183
184
185
186
187
188
189
...
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
225
226
227
228
229
230
231
232
233
...
238
239
240
241
242
243
244

245
246
247
248
249
250
251
...
264
265
266
267
268
269
270












271
272
273
274
275
276
277
CREATE TABLE IF NOT EXISTS cotisations_tarifs
(
    id INTEGER PRIMARY KEY NOT NULL,
    label TEXT NOT NULL,
    description TEXT NULL,
    amount INTEGER NULL,
    formula TEXT NULL,
    id_account INTEGER NULL REFERENCES acc_accounts (id) ON DELETE SET NULL, -- NULL si le type n'est pas associé automatiquement à la compta
);

CREATE TABLE IF NOT EXISTS cotisations_membres
-- Enregistrement des cotisations et activités
(
    id INTEGER NOT NULL PRIMARY KEY,
    id_membre INTEGER NOT NULL REFERENCES membres (id) ON DELETE CASCADE,
................................................................................
        UPDATE wiki_recherche SET contenu = '' WHERE id = new.id_page;
    END;

--
-- COMPTA
--
















CREATE TABLE IF NOT EXISTS acc_plans
-- Plans comptables : il peut y en avoir plusieurs
(
    id INTEGER NOT NULL PRIMARY KEY,
    country TEXT NOT NULL,
    code TEXT NULL, -- NULL = plan comptable créé par l'utilisateur
    label TEXT NOT NULL
................................................................................
    id INTEGER NOT NULL PRIMARY KEY,
    id_plan INTEGER NOT NULL REFERENCES compta_plans,

    code TEXT NOT NULL, -- peut contenir des lettres, eg. 53A, 53B, etc.
    parent INTEGER NULL REFERENCES compta_comptes(id),

    label TEXT NOT NULL,
    description TEXT NULL,

    position INTEGER NOT NULL, -- position actif/passif/charge/produit
    type INTEGER NOT NULL DEFAULT 0, -- Type de compte spécial : banque, caisse, en attente d'encaissement
    bookmark INTEGER NOT NULL DEFAULT 0, -- Signet (ex-catégories): 1 = recette, -1 = dépense
    user INTEGER NOT NULL DEFAULT 1 -- 1 = fait partie du plan comptable original, 0 = a été ajouté par l'utilisateur
);

CREATE UNIQUE INDEX IF NOT EXISTS acc_accounts_codes ON acc_accounts (code, id_plan);
CREATE INDEX IF NOT EXISTS acc_accounts_parent ON acc_accounts (parent);

CREATE TABLE IF NOT EXISTS acc_years
-- Exercices
(
    id INTEGER NOT NULL PRIMARY KEY,

    label TEXT NOT NULL,

    start_date TEXT NOT NULL CHECK (date(debut) IS NOT NULL AND date(debut) = debut),
    end_date TEXT NOT NULL CHECK (date(fin) IS NOT NULL AND date(fin) = fin),

    closed INTEGER NOT NULL DEFAULT 0,

    id_plan INTEGER NOT NULL REFERENCES acc_plans (id)
);

CREATE TABLE IF NOT EXISTS acc_transactions
-- Opérations comptables
(
    id INTEGER PRIMARY KEY NOT NULL,

    label TEXT NOT NULL,
................................................................................

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

    hash TEXT NULL,
    prev_hash TEXT NULL,

    id_year INTEGER NOT NULL REFERENCES acc_years(id),

    id_analytical INTEGER NULL REFERENCES acc_accounts(id) ON DELETE SET NULL
);

CREATE INDEX IF NOT EXISTS acc_transactions_year ON acc_transactions (id_year);
CREATE INDEX IF NOT EXISTS acc_transactions_date ON acc_transactions (date);

CREATE TABLE IF NOT EXISTS acc_transactions_lines
................................................................................

    CONSTRAINT line_check1 CHECK ((credit * debit) = 0),
    CONSTRAINT line_check2 CHECK ((credit + debit) > 0)
);

CREATE INDEX IF NOT EXISTS acc_transactions_lines_account ON acc_transactions_lines (id_account);













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

Modified src/include/lib/Garradin/Entities/Accounting/Account.php from [e2f1cd5aae] to [6f2a3dd0eb].

27
28
29
30
31
32
33



34
35
36
37
38
39
40
41
42
43
44
45
46
47

48
49
50
51
52
53
54

55

56
57
58
59
60
61
62
	 * Outstanding transaction accounts (like cheque or card payments)
	 */
	const TYPE_OUTSTANDING = 3;

	const TYPE_ANALYTICAL = 4;
	const TYPE_VOLUNTEERING = 5;




	protected $id;
	protected $id_plan;
	protected $code;
	protected $parent;
	protected $label;
	protected $position;
	protected $type;
	protected $user;

	protected $_types = [
		'id_plan'  => 'int',
		'code'     => 'string',
		'parent'   => '?int',
		'label'    => 'string',

		'type' => 'int',
		'special'  => 'int',
		'user'     => 'int',
	];

	protected $_validation_rules = [
		'id'       => 'required|integer',

		'libelle'  => 'required|string',

		'parent'   => 'required|nullable|integer|in_table:acc_accounts,id',
		'id_plan'  => 'required|integer|in_table:acc_plans,id',
		'type' => 'required|integer',
		'special'  => 'required|integer',
		'user'     => 'integer|min:0|max:1',
	];
}







>
>
>










|
|
|
|
>
|
|
|



|
>
|
>
|
<
|
|
|


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

63
64
65
66
67
	 * Outstanding transaction accounts (like cheque or card payments)
	 */
	const TYPE_OUTSTANDING = 3;

	const TYPE_ANALYTICAL = 4;
	const TYPE_VOLUNTEERING = 5;

	const TYPE_EXPENSE = 6;
	const TYPE_REVENUE = 7;

	protected $id;
	protected $id_plan;
	protected $code;
	protected $parent;
	protected $label;
	protected $position;
	protected $type;
	protected $user;

	protected $_types = [
		'id_plan'     => 'int',
		'code'        => 'string',
		'parent'      => '?int',
		'label'       => 'string',
		'description' => '?string',
		'position'    => 'int',
		'type'        => 'int',
		'user'        => 'int',
	];

	protected $_validation_rules = [
		'id_plan'     => 'required|integer|in_table:acc_plans,id',
		'code'        => 'required|string|alpha_num',
		'label'       => 'required|string|max:200',
		'description' => 'string|max:2000',
		'parent'      => 'required|nullable|integer|in_table:acc_accounts,id',

		'position'    => 'required|integer',
		'type'        => 'required|integer',
		'user'        => 'integer|min:0|max:1',
	];
}

Modified src/include/lib/Garradin/Entities/Accounting/Transaction.php from [d3c16f8d2f] to [76582d1811].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
..
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

	protected $validated;

	protected $hash;
	protected $prev_hash;

	protected $id_year;
	protected $id_category;
	protected $id_analytical;

	protected $_types = [
		'label'             => 'string',
		'notes'             => '?string',
		'reference'         => '?string',
		'date'              => 'date',
		'validated'         => 'bool',
		'hash'              => '?string',
		'prev_hash'         => '?string',
		'id_year'           => 'int',
		'id_category'       => '?int',
		'id_analytical'     => '?int',
	];

	protected $_validated_rules = [
		'label'             => 'required|string|max:200',
		'notes'             => 'string|max:20000',
		'reference'         => 'string|max:200',
		'date'              => 'required|date',
		'validated'         => 'bool',
		'id_year'           => 'integer|in_table:acc_years,id',
		'id_category'       => 'integer|in_table:acc_categories,id',
		'id_analytical'     => 'integer|in_table:acc_accounts,id'
	];

	protected $lines;

	public function getLines()
	{
................................................................................

	public function checkHash()
	{
		return hash_equals($this->getHash(), $this->hash);
	}
*/

	public function add(Ligne $ligne)
	{
		$this->lines[] = $ligne;
	}

	public function simple($montant, $compte)
	{
		$categorie = new Categorie($this->id_category);

		if ($categorie->type == Categorie::DEPENSE)
		{
			$from = $categorie->compte;
			$to = $compte;
		}
		else
		{
			$from = $compte;
			$to = $categorie->compte;
		}

		return $this->transfer($montant, $from, $to);
	}

	public function transfer(int $amount, int $from, int $to)
	{
		$ligne1 = new Ligne;
		$ligne1->compte = $from;
		$ligne1->debit = $amount;







<











<










<







 







|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35
36
37

38
39
40
41
42
43
44
45
46
47

48
49
50
51
52
53
54
..
95
96
97
98
99
100
101
102
103
104


















105
106
107
108
109
110
111

	protected $validated;

	protected $hash;
	protected $prev_hash;

	protected $id_year;

	protected $id_analytical;

	protected $_types = [
		'label'             => 'string',
		'notes'             => '?string',
		'reference'         => '?string',
		'date'              => 'date',
		'validated'         => 'bool',
		'hash'              => '?string',
		'prev_hash'         => '?string',
		'id_year'           => 'int',

		'id_analytical'     => '?int',
	];

	protected $_validated_rules = [
		'label'             => 'required|string|max:200',
		'notes'             => 'string|max:20000',
		'reference'         => 'string|max:200',
		'date'              => 'required|date',
		'validated'         => 'bool',
		'id_year'           => 'integer|in_table:acc_years,id',

		'id_analytical'     => 'integer|in_table:acc_accounts,id'
	];

	protected $lines;

	public function getLines()
	{
................................................................................

	public function checkHash()
	{
		return hash_equals($this->getHash(), $this->hash);
	}
*/

	public function add(Ligne $line)
	{
		$this->lines[] = $line;


















	}

	public function transfer(int $amount, int $from, int $to)
	{
		$ligne1 = new Ligne;
		$ligne1->compte = $from;
		$ligne1->debit = $amount;

Modified src/include/lib/Garradin/Entities/Accounting/Year.php from [7098bad56e] to [2715ee53bc].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

namespace Garradin\Entities\Accounting;

use Garradin\Entity;
use Garradin\DB;
use Garradin\Utils;
use Garradin\UserException;

class Year extends Entity
{
    const TABLE = 'acc_years';

    protected $id;






<







1
2
3
4
5
6

7
8
9
10
11
12
13
<?php

namespace Garradin\Entities\Accounting;

use Garradin\Entity;
use Garradin\DB;

use Garradin\UserException;

class Year extends Entity
{
    const TABLE = 'acc_years';

    protected $id;