init
[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 WHERE id_exercice = (SELECT id FROM compta_exercices WHERE cloture = 0 LIMIT 1)
79 AND (compte_debit = ? OR compte_debit = ?) LIMIT 1;', false, $id, $id))
80 {
81 throw new UserException('Ce compte ne peut être supprimé car des écritures y sont liées sur l\'exercice courant. '
82 . 'Il faut supprimer ou ré-attribuer ces écritures avant de pouvoir supprimer le compte.');
83 }
84
85 // Il n'est pas possible de supprimer ou désactiver un compte qui est lié à des catégories
86 if ($db->simpleQuerySingle('SELECT 1 FROM compta_categories WHERE compte = ? LIMIT 1;', false, $id))
87 {
88 throw new UserException('Ce compte ne peut être supprimé car des catégories y sont liées. '
89 . 'Merci de supprimer ou modifier les catégories liées avant de le supprimer.');
90 }
91
92 $db->simpleExec('DELETE FROM compta_comptes_bancaires WHERE id = ?;', trim($id));
93
94 try {
95 $return = parent::delete($id);
96 }
97 catch (UserException $e) {
98 // Impossible de supprimer car des opérations y sont encore liées
99 // sur les exercices précédents, alors on le désactive
100 $return = parent::disable($id);
101 }
102
103 return $return;
104 }
105
106 public function get($id)
107 {
108 $db = DB::getInstance();
109 return $db->simpleQuerySingle('SELECT * FROM compta_comptes AS c
110 INNER JOIN compta_comptes_bancaires AS cc
111 ON c.id = cc.id
112 WHERE c.id = ?;', true, $id);
113 }
114
115 public function getList($parent = false)
116 {
117 $db = DB::getInstance();
118 return $db->simpleStatementFetchAssocKey('SELECT c.id AS id, * FROM compta_comptes AS c
119 INNER JOIN compta_comptes_bancaires AS cc ON c.id = cc.id
120 WHERE c.parent = '.self::NUMERO_PARENT_COMPTES.' ORDER BY c.id;');
121 }
122
123 protected function _checkBankFields(&$data)
124 {
125 if (empty($data['banque']) || !trim($data['banque']))
126 {
127 throw new UserException('Le nom de la banque ne peut rester vide.');
128 }
129
130 if (empty($data['bic']))
131 {
132 $data['bic'] = '';
133 }
134 else
135 {
136 $data['bic'] = trim(strtoupper($data['bic']));
137 $data['bic'] = preg_replace('![^\dA-Z]!', '', $data['bic']);
138
139 if (!utils::checkBIC($data['bic']))
140 {
141 throw new UserException('Code BIC/SWIFT invalide.');
142 }
143 }
144
145 if (empty($data['iban']))
146 {
147 $data['iban'] = '';
148 }
149 else
150 {
151 $data['iban'] = trim(strtoupper($data['iban']));
152 $data['iban'] = preg_replace('![^\dA-Z]!', '', $data['iban']);
153
154 if (!utils::checkIBAN($data['iban']))
155 {
156 throw new UserException('Code IBAN invalide.');
157 }
158 }
159
160 return true;
161 }
162 }
163
164 ?>