88eb2109347dfd1d35fbaf9ecf9b742a2f4ae400
[garradin.git] / include / class.compta_comptes_bancaires.php
1 <?php
2
3 namespace Garradin;
4
5 class Compta_Comptes_Bancaires extends Compta_Comptes
6 {
7 const NUMERO_PARENT_COMPTES = 512;
8
9 public function add($data)
10 {
11 $db = DB::getInstance();
12
13 $data['parent'] = self::NUMERO_PARENT_COMPTES;
14 $data['id'] = null;
15
16 $this->_checkBankFields($data);
17
18 $new_id = parent::add($data);
19
20 $db->simpleInsert('compta_comptes_bancaires', [
21 'id' => $new_id,
22 'banque' => $data['banque'],
23 'iban' => $data['iban'],
24 'bic' => $data['bic'],
25 ]);
26
27 return $new_id;
28 }
29
30 public function edit($id, $data)
31 {
32 $db = DB::getInstance();
33
34 if (!$db->simpleQuerySingle('SELECT 1 FROM compta_comptes_bancaires WHERE id = ?;', false, $id))
35 {
36 throw new UserException('Ce compte n\'est pas un compte bancaire.');
37 }
38
39 $this->_checkBankFields($data);
40 $result = parent::edit($id, $data);
41
42 if (!$result)
43 {
44 return $result;
45 }
46
47 $db->simpleUpdate('compta_comptes_bancaires', [
48 'banque' => $data['banque'],
49 'iban' => $data['iban'],
50 'bic' => $data['bic'],
51 ], 'id = \''.$db->escapeString(trim($id)).'\'');
52
53 return true;
54 }
55
56 /**
57 * Supprime un compte bancaire
58 * La suppression sera refusée si le compte est utilisé dans l'exercice en cours
59 * ou dans une catégorie.
60 * Le compte bancaire sera supprimé et le compte au plan comptable seulement désactivé
61 * si le compte est utilisé dans un exercice précédent.
62 *
63 * La désactivation d'un compte fait qu'il n'est plus utilisable dans l'exercice courant
64 * ou les exercices suivants, mais il est possible de le réactiver.
65 * @param string $id Numéro du compte
66 * @return boolean TRUE si la suppression ou désactivation a été effectuée, une exception ou FALSE sinon
67 */
68 public function delete($id)
69 {
70 $db = DB::getInstance();
71 if (!$db->simpleQuerySingle('SELECT 1 FROM compta_comptes_bancaires WHERE id = ?;', false, trim($id)))
72 {
73 throw new UserException('Ce compte n\'est pas un compte bancaire.');
74 }
75
76 // Ne pas supprimer/désactiver un compte qui est utilisé dans l'exercice courant
77 if ($db->simpleQuerySingle('SELECT 1 FROM compta_journal
78 LEFT JOIN compta_flux ON compta_journal.id = compta_flux.id_journal
79 WHERE id_exercice = (SELECT id FROM compta_exercices WHERE cloture = 0 LIMIT 1)
80 AND compte = ? LIMIT 1;', false, $id))
81 {
82 throw new UserException('Ce compte ne peut être supprimé car des écritures y sont liées sur l\'exercice courant. '
83 . 'Il faut supprimer ou ré-attribuer ces écritures avant de pouvoir supprimer le compte.');
84 }
85
86 // Il n'est pas possible de supprimer ou désactiver un compte qui est lié à des catégories
87 if ($db->simpleQuerySingle('SELECT 1 FROM compta_categories WHERE compte = ? LIMIT 1;', false, $id))
88 {
89 throw new UserException('Ce compte ne peut être supprimé car des catégories y sont liées. '
90 . 'Merci de supprimer ou modifier les catégories liées avant de le supprimer.');
91 }
92
93 $db->simpleExec('DELETE FROM compta_comptes_bancaires WHERE id = ?;', trim($id));
94
95 try {
96 $return = parent::delete($id);
97 }
98 catch (UserException $e) {
99 // Impossible de supprimer car des opérations y sont encore liées
100 // sur les exercices précédents, alors on le désactive
101 $return = parent::disable($id);
102 }
103
104 return $return;
105 }
106
107 public function get($id)
108 {
109 $db = DB::getInstance();
110 return $db->simpleQuerySingle('SELECT * FROM compta_comptes AS c
111 INNER JOIN compta_comptes_bancaires AS cc
112 ON c.id = cc.id
113 WHERE c.id = ?;', true, $id);
114 }
115
116 public function getList($parent = false)
117 {
118 $db = DB::getInstance();
119 return $db->simpleStatementFetchAssocKey('SELECT c.id AS id, * FROM compta_comptes AS c
120 INNER JOIN compta_comptes_bancaires AS cc ON c.id = cc.id
121 WHERE c.parent = '.self::NUMERO_PARENT_COMPTES.' ORDER BY c.id;');
122 }
123
124 protected function _checkBankFields(&$data)
125 {
126 if (empty($data['banque']) || !trim($data['banque']))
127 {
128 throw new UserException('Le nom de la banque ne peut rester vide.');
129 }
130
131 if (empty($data['bic']))
132 {
133 $data['bic'] = '';
134 }
135 else
136 {
137 $data['bic'] = trim(strtoupper($data['bic']));
138 $data['bic'] = preg_replace('![^\dA-Z]!', '', $data['bic']);
139
140 if (!utils::checkBIC($data['bic']))
141 {
142 throw new UserException('Code BIC/SWIFT invalide.');
143 }
144 }
145
146 if (empty($data['iban']))
147 {
148 $data['iban'] = '';
149 }
150 else
151 {
152 $data['iban'] = trim(strtoupper($data['iban']));
153 $data['iban'] = preg_replace('![^\dA-Z]!', '', $data['iban']);
154
155 if (!utils::checkIBAN($data['iban']))
156 {
157 throw new UserException('Code IBAN invalide.');
158 }
159 }
160
161 return true;
162 }
163 }
164
165 ?>