init
[garradin.git] / www / admin / upgrade.php
1 <?php
2 namespace Garradin;
3
4 const UPGRADE_PROCESS = true;
5
6 require_once __DIR__ . '/../../include/init.php';
7
8 $config = Config::getInstance();
9
10 $v = $config->getVersion();
11
12 if (version_compare($v, garradin_version(), '>='))
13 {
14 throw new UserException("Pas de mise à jour à faire.");
15 }
16
17 $db = DB::getInstance();
18 $redirect = true;
19
20 echo '<!DOCTYPE html>
21 <html>
22 <head>
23 <meta charset="utf-8" />
24 <meta name="viewport" content="width=device-width, initial-scale=1.0, target-densitydpi=device-dpi" />
25 <link rel="stylesheet" type="text/css" href="static/admin.css" media="all" />
26 <script type="text/javascript" src="static/loader.js"></script>
27 <title>Mise à jour</title>
28 </head>
29 <body>
30 <div class="header"><h1>Mise à jour de Garradin '.$config->getVersion().' vers la version '.garradin_version().'...</h1></div>
31 <div class="page">
32 <div id="loader" class="loader" style="margin: 2em 0; height: 50px;"></div>
33 <script>
34 animatedLoader(document.getElementById("loader"), 5);
35 </script>';
36
37 flush();
38
39 // versions pré-0.3.0
40 if (!$v)
41 {
42 $db->exec('ALTER TABLE membres ADD COLUMN lettre_infos INTEGER DEFAULT 0;');
43 $v = '0.3.0';
44 }
45
46 if (version_compare($v, '0.4.0', '<'))
47 {
48 $config->set('monnaie', '€');
49 $config->set('pays', 'FR');
50 $config->save();
51
52 $db->exec(file_get_contents(ROOT . '/include/data/0.4.0.sql'));
53
54 // Mise en place compta
55 $comptes = new Compta_Comptes;
56 $comptes->importPlan();
57
58 $comptes = new Compta_Categories;
59 $comptes->importCategories();
60 }
61
62 if (version_compare($v, '0.4.3', '<'))
63 {
64 $db->exec(file_get_contents(ROOT . '/include/data/0.4.3.sql'));
65 }
66
67 if (version_compare($v, '0.4.5', '<'))
68 {
69 // Mise à jour plan comptable
70 $comptes = new Compta_Comptes;
71 $comptes->importPlan();
72
73 // Création page wiki connexion
74 $wiki = new Wiki;
75 $page = Wiki::transformTitleToURI('Bienvenue');
76 $config->set('accueil_connexion', $page);
77
78 if (!$wiki->getByUri($page))
79 {
80 $id_page = $wiki->create([
81 'titre' => 'Bienvenue',
82 'uri' => $page,
83 ]);
84
85 $wiki->editRevision($id_page, 0, [
86 'id_auteur' => null,
87 'contenu' => "Bienvenue dans l'administration de ".$config->get('nom_asso')." !\n\n"
88 . "Utilisez le menu à gauche pour accéder aux différentes rubriques.",
89 ]);
90 }
91
92 $config->set('accueil_connexion', $page);
93 $config->save();
94 }
95
96 if (version_compare($v, '0.5.0', '<'))
97 {
98 // Récupération de l'ancienne config
99 $champs_modifiables_membre = $db->querySingle('SELECT valeur FROM config WHERE cle = "champs_modifiables_membre";');
100 $champs_modifiables_membre = !empty($champs_modifiables_membre) ? explode(',', $champs_modifiables_membre) : [];
101
102 $champs_obligatoires = $db->querySingle('SELECT valeur FROM config WHERE cle = "champs_obligatoires";');
103 $champs_obligatoires = !empty($champs_obligatoires) ? explode(',', $champs_obligatoires) : [];
104
105 // Import des champs membres par défaut
106 $champs = Champs_Membres::importInstall();
107
108 // Application de l'ancienne config aux nouveaux champs membres
109 foreach ($champs_obligatoires as $name)
110 {
111 if ($champs->get($name) !== null)
112 $champs->set($name, 'mandatory', true);
113 }
114
115 foreach ($champs_modifiables_membre as $name)
116 {
117 if ($champs->get($name) !== null)
118 $champs->set($name, 'editable', true);
119 }
120
121 $champs->save();
122
123 $config->set('champs_membres', $champs);
124 $config->save();
125
126 // Suppression de l'ancienne config
127 $db->exec('DELETE FROM config WHERE cle IN ("champs_obligatoires", "champs_modifiables_membre");');
128 }
129
130 if (version_compare($v, '0.6.0-rc1', '<'))
131 {
132 $categories = new Membres_Categories;
133 $list = $categories->listComplete();
134
135 $db->exec('PRAGMA foreign_keys = OFF; BEGIN;');
136
137 // Mise à jour base de données
138 $db->exec(file_get_contents(ROOT . '/include/data/0.6.0.sql'));
139
140 $id_cat_cotisation = $db->querySingle('SELECT id FROM compta_categories WHERE compte = 756 LIMIT 1;');
141
142 // Conversion des cotisations de catégories en cotisations indépendantes
143 foreach ($list as $cat)
144 {
145 $db->simpleInsert('cotisations', [
146 'id_categorie_compta' => null,
147 'intitule' => $cat['nom'],
148 'montant' => (float) $cat['montant_cotisation'],
149 // Convertir un nombre de mois en nombre de jours
150 'duree' => round($cat['duree_cotisation'] * 30.44),
151 'description' => 'Créé automatiquement depuis les catégories de membres (version 0.5.x)',
152 ]);
153
154 $args = [
155 'id_cotisation' => (int)$db->lastInsertRowId(),
156 'id_categorie' => (int)$cat['id'],
157 ];
158
159 // import des dates de cotisation existantes comme paiements
160 $db->simpleExec('INSERT INTO cotisations_membres
161 (id_membre, id_cotisation, date)
162 SELECT id, :id_cotisation, date(date_cotisation) FROM membres
163 WHERE date_cotisation IS NOT NULL AND date_cotisation != \'\' AND id_categorie = :id_categorie;',
164 $args);
165
166 // Mais on ne crée pas d'écriture comptable, car elles existent probablement déjà
167 }
168
169 // Déplacement des squelettes dans le répertoire public
170 if (!file_exists(ROOT . '/www/squelettes'))
171 {
172 mkdir(ROOT . '/www/squelettes');
173 }
174
175 if (file_exists(ROOT . '/squelettes'))
176 {
177 $dir = dir(ROOT . '/squelettes');
178
179 while ($file = $dir->read())
180 {
181 if ($file == '.' || $file == '..')
182 continue;
183
184 rename(ROOT . '/squelettes/' . $file, ROOT . '/www/squelettes/' . $file);
185 }
186
187 $dir->close();
188
189 @rmdir(ROOT . '/squelettes');
190 }
191
192 $db->exec('END; PRAGMA foreign_keys = ON;');
193
194 // Mise à jour de la table membres, suppression du champ date_cotisation notamment
195 $config->get('champs_membres')->save();
196
197 // Possibilité de choisir l'identité et l'identifiant d'un membre
198 $config->set('champ_identite', 'nom');
199 $config->set('champ_identifiant', 'email');
200 $config->save();
201 }
202
203 utils::clearCaches();
204
205 $config->setVersion(garradin_version());
206
207 echo '<h2>Mise à jour terminée.</h2>
208 <p><a href="'.WWW_URL.'admin/">Retour</a></p>';
209
210 if ($redirect)
211 {
212 echo '
213 <script type="text/javascript">
214 window.setTimeout(function () {
215 window.location.href = "'.WWW_URL.'admin/";
216 stopAnimatedLoader();
217 }, 1000);
218 </script>';
219 }
220
221 echo '
222 </body>';
223
224 ?>