AJAX installation is 'basicly finished' :) Plus I threw in a small christmas present...
[mailer.git] / inc / extensions / ext-user.php
1 <?php
2 /************************************************************************
3  * Mailer v0.2.1-FINAL                                Start: 04/29/2004 *
4  * ===================                          Last change: 10/29/2004 *
5  *                                                                      *
6  * -------------------------------------------------------------------- *
7  * File              : ext-user.php                                     *
8  * -------------------------------------------------------------------- *
9  * Short description : Swapped out user management                      *
10  * -------------------------------------------------------------------- *
11  * Kurzbeschreibung  : Ausgelagertes Mitglieder-Management              *
12  * -------------------------------------------------------------------- *
13  * $Revision::                                                        $ *
14  * $Date::                                                            $ *
15  * $Tag:: 0.2.1-FINAL                                                 $ *
16  * $Author::                                                          $ *
17  * -------------------------------------------------------------------- *
18  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
19  * Copyright (c) 2009 - 2012 by Mailer Developer Team                   *
20  * For more information visit: http://mxchange.org                      *
21  *                                                                      *
22  * This program is free software; you can redistribute it and/or modify *
23  * it under the terms of the GNU General Public License as published by *
24  * the Free Software Foundation; either version 2 of the License, or    *
25  * (at your option) any later version.                                  *
26  *                                                                      *
27  * This program is distributed in the hope that it will be useful,      *
28  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
29  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
30  * GNU General Public License for more details.                         *
31  *                                                                      *
32  * You should have received a copy of the GNU General Public License    *
33  * along with this program; if not, write to the Free Software          *
34  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               *
35  * MA  02110-1301  USA                                                  *
36  ************************************************************************/
37
38 // Some security stuff...
39 if (!defined('__SECURITY')) {
40         die();
41 } // END - if
42
43 // Version number
44 setThisExtensionVersion('0.6.0');
45
46 // Version history array (add more with , '0.0.1' and so on)
47 setExtensionVersionHistory(array('0.0.0', '0.1.0', '0.1.1', '0.1.2', '0.1.3', '0.1.4', '0.1.5', '0.1.6', '0.1.7', '0.1.8', '0.1.9', '0.2.0', '0.2.1', '0.2.2', '0.2.3', '0.2.4', '0.2.5', '0.2.6', '0.2.7', '0.2.8', '0.2.9', '0.3.0', '0.3.1', '0.3.2', '0.3.3', '0.3.4', '0.3.5', '0.3.6', '0.3.7', '0.3.8', '0.3.9', '0.4.0', '0.4.1', '0.4.2', '0.4.3', '0.4.4', '0.4.5', '0.4.6', '0.4.7', '0.4.8', '0.4.9', '0.5.0', '0.5.1', '0.5.2', '0.5.3', '0.5.4', '0.5.5', '0.5.6', '0.5.7', '0.5.8', '0.5.9', '0.6.0'));
48
49 // Keep this extension always active!
50 setExtensionAlwaysActive('Y');
51
52 switch (getExtensionMode()) {
53         case 'register': // Do stuff when installation is running
54                 addDropTableSql('user_cats');
55                 addCreateTableSql('user_cats', "
56 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
57 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
58 `cat_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
59 PRIMARY KEY (`id`),
60 INDEX (`userid`),
61 INDEX (`cat_id`)",
62                         'User->category connection data');
63
64                 addDropTableSql('user_data');
65                 addCreateTableSql('user_data', "
66 `userid` BIGINT(20) NOT NULL AUTO_INCREMENT,
67 `surname` VARCHAR(255) NOT NULL DEFAULT '',
68 `family` VARCHAR(255) NOT NULL DEFAULT '',
69 `street_nr` VARCHAR(255) NOT NULL DEFAULT '',
70 `country` VARCHAR(4) NOT NULL DEFAULT '',
71 `zip` VARCHAR(6) NOT NULL DEFAULT '',
72 `city` VARCHAR(255) NOT NULL DEFAULT '',
73 `email` VARCHAR(255) NOT NULL DEFAULT '',
74 `birth_day` CHAR(2) NOT NULL DEFAULT '01',
75 `birth_month` CHAR(2) NOT NULL DEFAULT '01',
76 `birth_year` VARCHAR(4) NOT NULL DEFAULT '1970',
77 `password` VARCHAR(255) NOT NULL DEFAULT '',
78 `max_mails` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
79 `receive_mails` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
80 `refid` BIGINT(20) NULL DEFAULT NULL,
81 `status` ENUM('UNCONFIRMED','CONFIRMED','LOCKED') NOT NULL DEFAULT 'UNCONFIRMED',
82 `user_hash` VARCHAR(255) NULL DEFAULT NULL,
83 `REMOTE_ADDR` VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
84 `last_online` VARCHAR(10) NOT NULL DEFAULT 0,
85 `last_module` VARCHAR(255) NULL DEFAULT NULL,
86 `ref_clicks` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
87 `total_logins` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
88 `gender` ENUM('M','F') NOT NULL DEFAULT 'M',
89 `used_points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
90 `emails_sent` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
91 `joined` VARCHAR(10) NOT NULL DEFAULT 0,
92 `last_update` VARCHAR(10) NOT NULL DEFAULT 0,
93 `last_profile_sent` VARCHAR(10) NOT NULL DEFAULT 0,
94 `notified` ENUM('Y','N') NOT NULL DEFAULT 'N',
95 `ref_payout` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
96 `last_login` VARCHAR(10) NOT NULL DEFAULT 0,
97 `login_failures` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
98 `last_failure` TIMESTAMP NULL DEFAULT NULL,
99 PRIMARY KEY (`userid`),
100 UNIQUE INDEX (`user_hash`),
101 INDEX (`refid`),
102 INDEX `status_mails` (`status`, `max_mails`)",
103                         'Main user data');
104
105                 addDropTableSql('user_points');
106                 addCreateTableSql('user_points', "
107 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
108 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
109 `ref_depth` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
110 `points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
111 `locked_points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
112 PRIMARY KEY (`id`),
113 INDEX (`userid`)",
114                         'User points (no used points)');
115
116                 addDropTableSql('user_links');
117                 addCreateTableSql('user_links', "
118 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
119 `stats_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
120 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
121 `link_type` VARCHAR(255) NOT NULL DEFAULT 'NORMAL',
122 PRIMARY KEY (`id`),
123 INDEX (`userid`),
124 INDEX (`stats_id`)",
125                         'Unconfirmed mails per user');
126
127                 addDropTableSql('user_stats');
128                 addCreateTableSql('user_stats', "
129 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
130 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
131 `cat_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
132 `payment_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
133 `subject` VARCHAR(255) NOT NULL DEFAULT '',
134 `url` TINYTEXT NOT NULL,
135 `max_rec` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
136 `clicks` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
137 `timestamp_ordered` VARCHAR(10) NOT NULL DEFAULT '',
138 `pool_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
139 `timestamp_sstart` VARCHAR(10) NOT NULL DEFAULT '',
140 `timestamp_send` VARCHAR(10) NOT NULL DEFAULT '',
141 `is_stats` ENUM('Y','N') NOT NULL DEFAULT 'N',
142 PRIMARY KEY (`id`),
143 INDEX (`userid`),
144 INDEX (`cat_id`),
145 INDEX (`payment_id`),
146 INDEX (`pool_id`)",
147                         'Mail statistics per user order');
148
149                 addDropTableSql('user_stats_data');
150                 addCreateTableSql('user_stats_data', "
151 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
152 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
153 `stats_type` VARCHAR(255) NOT NULL DEFAULT 'unknown',
154 `stats_data` VARCHAR(255) NOT NULL DEFAULT '',
155 `inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
156 PRIMARY KEY (`id`),
157 INDEX (`userid`),
158 INDEX (`stats_type`)",
159                         'Member statistics data');
160
161                 // Admin menu
162                 addAdminMenuSql('user', NULL, 'Mitglieder-Management', 'Mitglieder freischalten, sperren, Accounts editieren, Neuanmeldungen verwalten, {OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben und abziehen und und und...', 3);
163                 addAdminMenuSql('user', 'del_user', 'Mitglied l&ouml;schen', 'L&ouml;schen Sie hier Mitglied, die gegen die AGBs mehrmals verstossen haben. Bitte seien Sie nett zu Ihren Mitgliedern und l&ouml;schen Sie nicht gleich.', 1);
164                 addAdminMenuSql('user', 'lock_user', 'Mitglied sperren / entsperren', 'Sperren Sie Mitglied, die zu viele unbest&auml;tigte Mails haben oder gegen Ihre AGBs verstossen haben &uuml;ber diesen Men&uuml;punkt.', 3);
165                 addAdminMenuSql('user', 'list_user', 'Mitglieder auflisten', 'Listen Sie alle Mitglied oder eingeschr&auml;nkt nach Suchkritieren Ihre Userdatenbank auf. Sie k&ouml;nen per Klick auf die Usernummer sich Details zum Mitglied ansehen.', 4);
166                 addAdminMenuSql('user', 'add_points', '{OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben', 'Buchen Sie einem Mitglied direkt {OPEN_CONFIG}POINTS{CLOSE_CONFIG} auf. Sie k&ouml;nnen dazu auch einen Kommentar mitsenden.', 5);
167                 addAdminMenuSql('user', 'edit_user', 'Account editieren', 'Daten eines Mitglieder-Accountes &auml;ndern.', 6);
168                 addAdminMenuSql('user', 'list_refs', 'Referrals anzeigen', 'Mit diesem Men&uuml;punkt k&ouml;nnen Sie die generierten Referrals eines Mitgliedes auflisten.', 7);
169                 addAdminMenuSql('user', 'list_links', 'Unbest&auml;tigte Mails', 'Mit diesem Men&uuml;punkt k&ouml;nnen Sie die vom Mitglied nicht best&auml;tigten Mails anzeigen.', 8);
170                 addAdminMenuSql('user', 'list_user_cats', 'Kategorien anzeigen', 'Listet die ausgew&auml;hlten Kategorien eines Mitgliedes auf.', 9);
171                 break;
172
173         case 'remove': // Do stuff when removing extension
174                 // SQL commands to run
175                 addDropTableSql('user_del');
176                 addDropTableSql('user_cats');
177                 addDropTableSql('user_data');
178                 addDropTableSql('user_points');
179                 addDropTableSql('user_links');
180                 addDropTableSql('user_refs');
181                 addDropTableSql('user_stats');
182                 addDropTableSql('user_stats_data');
183                 addDropTableSql('user_subids');
184                 addDropTableSql('subid_log');
185                 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_admin_menu` WHERE `what` = 'config_user' OR `action`='user'");
186                 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_member_menu` WHERE `what` IN ('subids')");
187
188                 // Register new filters for gathering points
189                 unregisterFilter(__FILE__, __LINE__, 'get_total_points', 'USER_POINTS', TRUE, isExtensionDryRun());
190                 unregisterFilter(__FILE__, __LINE__, 'get_own_points', 'USER_POINTS', TRUE, isExtensionDryRun());
191                 unregisterFilter(__FILE__, __LINE__, 'get_locked_points', 'LOCKED_USER_POINTS', TRUE, isExtensionDryRun());
192                 unregisterFilter(__FILE__, __LINE__, 'get_all_point_columns', 'GET_ALL_USER_POINTS_COLUMN_NAMES', TRUE, isExtensionDryRun());
193                 unregisterFilter(__FILE__, __LINE__, 'user_exclusion_sql', 'TESTER_USER_EXCLUSION_SQL', TRUE, isExtensionDryRun());
194                 unregisterFilter(__FILE__, __LINE__, 'user_inclusion_sql', 'TESTER_USER_INCLUSION_SQL', TRUE, isExtensionDryRun());
195                 unregisterFilter(__FILE__, __LINE__, 'pre_user_registration', 'TESTER_USER_REGISTRATION_ADD_SQL_COLUMNS', TRUE, isExtensionDryRun());
196                 unregisterFilter(__FILE__, __LINE__, 'convert_user_data_columns', 'ADD_USER_DATA_CONVERT_SQL_COLUMNS', TRUE, isExtensionDryRun());
197                 unregisterFilter(__FILE__, __LINE__, 'post_refid_validation', 'HANDLE_USER_SUBID', TRUE, isExtensionDryRun());
198                 unregisterFilter(__FILE__, __LINE__, 'pre_user_registration', 'SUBID_USER_REGISTRATION_ADD_SQL_COLUMNS', TRUE, isExtensionDryRun());
199                 unregisterFilter(__FILE__, __LINE__, 'update_referral_data', 'GENERIC_UPDATE_USER_REFERRAL', TRUE, isExtensionDryRun());
200                 unregisterFilter(__FILE__, __LINE__, 'update_referral_data', 'UPDATE_USER_SUBID', TRUE, isExtensionDryRun());
201                 unregisterFilter(__FILE__, __LINE__, 'member_admin_actions', 'ADD_USER_SUBID_MEMBER_ACTION', TRUE, isExtensionDryRun());
202                 unregisterFilter(__FILE__, __LINE__, 'member_reflink_extra_content', 'MEMBER_REFLINK_USER_SUBIDS_CONTENT', TRUE, isExtensionDryRun());
203                 break;
204
205         case 'activate': // Do stuff when admin activates this extension
206                 // SQL commands to run
207                 addExtensionSql('');
208                 break;
209
210         case 'deactivate': // Do stuff when admin deactivates this extension
211                 // SQL commands to run
212                 addExtensionSql('');
213                 break;
214
215         case 'update': // Update an extension
216                 switch (getCurrentExtensionVersion()) {
217                         case '0.1.0': // SQL queries for v0.1
218                                 addConfigAddSql('user_limit', 'INT(7) UNSIGNED NOT NULL DEFAULT 20');
219
220                                 // Update notes (these will be set as task text!)
221                                 setExtensionUpdateNotes("Seitenweises Anzeigen der User-Liste ist nun m&ouml;glich.");
222                                 break;
223
224                         case '0.1.1': // SQL queries for v0.1.1
225                                 // Update notes (these will be set as task text!)
226                                 setExtensionUpdateNotes("Ung&uuml;ltiges Update.");
227                                 break;
228
229                         case '0.1.2': // SQL queries for v0.1.2
230                                 addExtensionAddTableColumnSql('user_data', 'mails_confirmed', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
231
232                                 // Update notes (these will be set as task text!)
233                                 setExtensionUpdateNotes("Dem Mitglied wird nun angezeigt, wie viele Mails er best&auml;tigt hat. Alle vor dieser Version best. Mails werden leider nicht mehr ber&uuml;cksichtigt! Bitte teilen Sie dies Ihren Mitgliedern mit.");
234                                 break;
235
236                         case '0.1.3': // SQL queries for v0.1.3
237                                 // Update notes (these will be set as task text!)
238                                 setExtensionUpdateNotes("Den Pfad <span class=\"bad\">Sie sind hier</span> im Men&uuml;punkt <u>Online-Liste</u> erweitert.");
239                                 break;
240
241                         case '0.1.4': // SQL queries for v0.1.4
242                                 addExtensionAddTableColumnSql('user_data', 'emails_received', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
243
244                                 // Update notes (these will be set as task text!)
245                                 setExtensionUpdateNotes("Anzahl empfangener Mails wird angezeigt. <big>Diese Anzeige kann fehlerhaft sein, wenn Sie bereits Mitglieder in Ihrem {?mt_word?} haben sollen!</big>");
246                                 break;
247
248                         case '0.1.5': // SQL queries for v0.1.5
249                                 // Update notes (these will be set as task text!)
250                                 setExtensionUpdateNotes("Fehler beseitigt, wenn error_reporting=E_ALL gesetzt ist.");
251                                 break;
252
253                         case '0.1.6': // SQL queries for v0.1.6
254                                 // Update notes (these will be set as task text!)
255                                 setExtensionUpdateNotes("Fehler beseitigt, wenn error_reporting=E_ALL gesetzt ist.");
256                                 break;
257
258                         case '0.1.7': // SQL queries for v0.1.7
259                                 // Update notes (these will be set as task text!)
260                                 setExtensionUpdateNotes("Erweiterung bleibt wegen integrierten Schalters immer aktiv.");
261                                 break;
262
263                         case '0.1.8': // SQL queries for v0.1.8
264                                 // Update notes (these will be set as task text!)
265                                 setExtensionUpdateNotes("Seit <strong>Patch 340</strong> &uuml;berfl&uuml;ssige HTML-Tags entfernt.");
266                                 break;
267
268                         case '0.1.9': // SQL queries for v0.1.9
269                                 // Update notes (these will be set as task text!)
270                                 setExtensionUpdateNotes("Link zum Mitgliedsprofil in Funktion <u>generateUserProfileLink()</u> ausgelagert.");
271                                 break;
272
273                         case '0.2.0': // SQL queries for v0.2.0
274                                 // Update notes (these will be set as task text!)
275                                 setExtensionUpdateNotes("User-Liste ausgelagert in Templates und &uuml;berbreite Zeile in 2er-Zeile umgewandelt.");
276                                 break;
277
278                         case '0.2.1': // SQL queries for v0.2.1
279                                 addConfigAddSql('user_alpha', 'TINYINT(3) UNSIGNED NOT NULL DEFAULT 10');
280                                 addAdminMenuSql('setup','config_user','Mitgliederliste','Anzahl Mitglieder pro Seite, Anzahl Buchstaben pro Zeile usw.', 8);
281
282                                 // Update notes (these will be set as task text!)
283                                 setExtensionUpdateNotes("User-Liste ist konfigurierbar: Anzahl Mitglieder pro Seite und Anzahl Buchstaben pro Zeile; Template-Fehler beseitigt.");
284                                 break;
285
286                         case '0.2.2': // SQL queries for v0.2.2
287                                 addExtensionChangeTableColumnSql('user_data', 'gender', 'gender', "ENUM('M','F','C') NOT NULL DEFAULT 'M'");
288
289                                 // Update notes (these will be set as task text!)
290                                 setExtensionUpdateNotes("Anrede &quot;Firma&quot; hinzugef&uuml;gt.");
291                                 break;
292
293                         case '0.2.3': // SQL queries for v0.2.3
294                                 // Update notes (these will be set as task text!)
295                                 setExtensionUpdateNotes("Datumsformat festgelegt auf ausf&uuml;hrlich.");
296                                 break;
297
298                         case '0.2.4': // SQL queries for v0.2.4
299                                 // Update notes (these will be set as task text!)
300                                 setExtensionUpdateNotes("W&ouml;rter <strong>{?mt_word?}</strong>, <strong>{?mt_word2?}</strong> und <strong>{?mt_word3?}</strong> sind austauschbar.");
301                                 break;
302
303                         case '0.2.5': // SQL queries for v0.2.5
304                                 // Update notes (these will be set as task text!)
305                                 setExtensionUpdateNotes("SQL-Anweisungen abgesichert.");
306                                 break;
307
308                         case '0.2.6': // SQL queries for v0.2.6
309                                 // Update notes (these will be set as task text!)
310                                 setExtensionUpdateNotes("Abspeichern von Einstellungen repariert.");
311                                 break;
312
313                         case '0.2.7': // SQL queries for v0.2.7
314                                 // Update notes (these will be set as task text!)
315                                 setExtensionUpdateNotes("Sicherheitsupdate f&uuml;r die Include-Befehle.");
316                                 break;
317
318                         case '0.2.8': // SQL queries for v0.2.8
319                                 // Update notes (these will be set as task text!)
320                                 setExtensionUpdateNotes("if-Anweisungen auf Funktion <strong>empty()</strong> umgestellt.");
321                                 break;
322
323                         case '0.2.9': // SQL queries for v0.2.9
324                                 addAdminMenuSql('user','user_contct','Mitglied kontaktieren','Kontaktieren Sie hier Ihre Mitglieder ganz direkt &uuml;ber ein Webformular. Sie brauchen somit kein EMail-Programm mehr starten!', 8);
325
326                                 // Update notes (these will be set as task text!)
327                                 setExtensionUpdateNotes("Admin-Kontaktformular hinzugef&uuml;gt.");
328                                 break;
329
330                         case '0.3.0': // SQL queries for v0.3.0
331                                 // Update notes (these will be set as task text!)
332                                 setExtensionUpdateNotes("Hash-Erstellung von <strong>md5()</strong> auf bessere Funktion <strong>generateHash()</strong> umgestellt.<br />Diverse Fixes f&uuml;r <span class=\"bad\">0.2.1-Beta1</span> Release.");
333                                 break;
334
335                         case '0.3.1': // SQL queries for v0.3.1
336                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title` = 'Mitglieder-Management' WHERE `action`='user' AND (`what`='' OR `what` IS NULL) LIMIT 1");
337
338                                 // Update notes (these will be set as task text!)
339                                 setExtensionUpdateNotes("Verwaltung auf Management umgestellt");
340                                 break;
341
342                         case '0.3.2': // SQL queries for v0.3.2
343                                 // Update notes (these will be set as task text!)
344                                 setExtensionUpdateNotes("PHP-Hinweis in Userauflistung gefixt (trat bei fehlender Erweiterung <span class=\"data\">ext-nickname</span> auf) und Darstellungsfehler von <strong>0.00000</strong> unbest&auml;tigten Mails gefixt.");
345                                 break;
346
347                         case '0.3.3': // SQL queries for v0.3.3
348                                 // Update notes (these will be set as task text!)
349                                 setExtensionUpdateNotes("Mitglieder sind nun per Formular kontaktierbar (es wird eine EMail versendet), gesperrte und best&auml;tigte Mitglieder-Accounts sind seperat oder gemeinsam auflistbar (seperat nur mit der Erweiterung <span class=\"bad\">task</span>!)");
350                                 break;
351
352                         case '0.3.4': // SQL queries for v0.3.4
353                                 addConfigAddSql('select_user_zero_refid', "ENUM('Y','N') NOT NULL DEFAULT 'Y'");
354                                 addConfigAddSql('user_min_confirmed', 'SMALLINT(5) UNSIGNED NOT NULL DEFAULT 10');
355                                 addExtensionAddTableColumnSql('user_data', 'rand_confirmed', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
356
357                                 // Update notes (these will be set as task text!)
358                                 setExtensionUpdateNotes("Mitglieder werden per Zufall als Referral-Id ausgew&auml;hlt, die eine Mindestanzahl an best&auml;tigten Mails haben, wenn die Ref-Id 0 ist.");
359                                 break;
360
361                         case '0.3.5': // SQL queries for v0.3.5
362                                 addExtensionAddTableColumnSql('user_data', 'lock_reason', 'TINYTEXT');
363                                 addExtensionAddTableColumnSql('user_data', 'lock_timestamp', 'TIMESTAMP NULL DEFAULT NULL');
364                                 addConfigAddSql('user_delete_purge', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT ' . (getOneDay() * 30));
365                                 addAdminMenuSql('user', 'list_user_del', 'L&ouml;schungen auflisten', 'Listet die L&ouml;schungen von Usern auf.', 9);
366                                 addDropTableSql('user_del');
367                                 addCreateTableSql('user_del', "
368 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
369 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
370 `email` VARCHAR(255) NOT NULL DEFAULT '',
371 `surname` VARCHAR(255) NOT NULL DEFAULT '',
372 `family` VARCHAR(255) NOT NULL DEFAULT '',
373 `joined` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
374 `last_online` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
375 `del_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
376 `del_reason` TINYTEXT NOT NULL,
377 PRIMARY KEY (`id`),
378 INDEX (`userid`)",
379                                         'List of deleted users');
380
381                                 // Update notes (these will be set as task text!)
382                                 setExtensionUpdateNotes("Der Sperrgrund wird nun mit abgespeichert und beim L&ouml;schen des Users mit ausgesendet.");
383                                 break;
384
385                         case '0.3.6': // SQL queries for v0.3.6
386                                 addExtensionDropTableIndexSql('user_cats', 'userid');
387                                 addExtensionAddTableUniqueSql('user_cats', 'userid_catid', '(`userid`, `cat_id`)');
388
389                                 // Update notes (these will be set as task text!)
390                                 setExtensionUpdateNotes("Der Sperrgrund wird nun mit abgespeichert und beim L&ouml;schen des Users mit ausgesendet.");
391                                 break;
392
393                         case '0.3.7': // SQL queries for v0.3.7
394                                 addExtensionChangeTableColumnSql('user_points', 'id', 'id', 'BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT');
395                                 addExtensionChangeTableColumnSql('user_points', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
396                                 addExtensionChangeTableColumnSql('user_data', 'userid', 'userid', 'BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT');
397                                 addExtensionChangeTableColumnSql('user_del', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
398                                 addExtensionChangeTableColumnSql('user_links', 'stats_id', 'stats_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
399                                 addExtensionChangeTableColumnSql('user_links', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
400                                 addExtensionChangeTableColumnSql('user_points', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
401                                 addExtensionChangeTableColumnSql('user_points', 'ref_depth', 'ref_depth', 'TINYINT(3) UNSIGNED NULL DEFAULT NULL');
402                                 addExtensionChangeTableColumnSql('user_stats', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
403                                 addExtensionChangeTableColumnSql('user_stats', 'cat_id', 'cat_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
404                                 addExtensionChangeTableColumnSql('user_stats', 'payment_id', 'payment_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
405                                 addExtensionChangeTableColumnSql('user_stats', 'pool_id', 'pool_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
406                                 addExtensionChangeTableColumnSql('user_stats_data', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
407
408                                 // Cleanup SQLs
409                                 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_cats` WHERE `userid` IS NULL OR `cat_id` IS NULL');
410                                 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_del` WHERE `userid` IS NULL');
411                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_links` SET `stats_id`=NULL WHERE `stats_id`=0');
412                                 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_links` WHERE `userid` IS NULL');
413                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_points` SET `ref_depth`=NULL WHERE `ref_depth`=0');
414                                 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_points` WHERE `userid` IS NULL');
415                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `cat_id`=NULL WHERE `cat_id`=0');
416                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `payment_id`=NULL WHERE `payment_id`=0');
417                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `pool_id`=NULL WHERE `pool_id`=0');
418                                 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_stats` WHERE `userid` IS NULL');
419
420                                 // Update notes (these will be set as task text!)
421                                 setExtensionUpdateNotes("NULL ist wichtiger als 0 und UNSIGNED auch.");
422                                 break;
423
424                         case '0.3.8': // SQL queries for v0.3.8
425                                 addExtensionChangeTableColumnSql('user_data', 'last_failure', 'last_failure', 'TIMESTAMP NULL DEFAULT NULL');
426
427                                 // Update notes (these will be set as task text!)
428                                 setExtensionUpdateNotes("Ausgangswert ist nicht mehr 0000-00-00 00:00:00, sondern einfach NULL.");
429                                 break;
430
431                         case '0.3.9': // SQL queries for v0.3.9
432                                 // Update notes (these will be set as task text!)
433                                 setExtensionUpdateNotes("Update verschoben nach ext-order (da es Werbeguthaben ist und nichts mit dem Mitglied selbst zu tun hat).");
434                                 break;
435
436                         case '0.4.0': // SQL queries for v0.4.0
437                                 // Register new filters for gathering points
438                                 registerFilter(__FILE__, __LINE__, 'get_total_points', 'USER_POINTS', FALSE, TRUE, isExtensionDryRun());
439                                 registerFilter(__FILE__, __LINE__, 'get_own_points', 'USER_POINTS', FALSE, TRUE, isExtensionDryRun());
440
441                                 // Update notes (these will be set as task text!)
442                                 setExtensionUpdateNotes("Filter registriert, die das eigene {?POINTS?}-Guthaben des Mitgliedes zur&uuml;ckliefern.");
443                                 break;
444
445                         case '0.4.1': // SQL queries for v0.4.1
446                                 // Add special fix include to fix filters
447                                 addIncludeToPool('extension', 'inc/fix_user_points.php');
448
449                                 // Update notes (these will be set as task text!)
450                                 setExtensionUpdateNotes("Das Mitgliederguthaben musste repariert werden, da f&uuml;r Referral-Ebene 0, noch NULL geschrieben wurde.");
451                                 break;
452
453                         case '0.4.2': // SQL queries for v0.4.2
454                                 // Add special fix include to fix filters
455                                 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_admin_menu` WHERE `what`='chk_regs' LIMIT 1");
456
457                                 // Update notes (these will be set as task text!)
458                                 setExtensionUpdateNotes("&Uuml;berfl&uuml;ssiges Men&uuml; <strong>chk_regs</strong> entfernt, dies kann mit <strong>list_user</strong> &uuml;bernommen werden.");
459                                 break;
460
461                         case '0.4.3': // SQL queries for v0.4.3
462                                 // Add special fix include to fix filters
463                                 addExtensionChangeTableColumnSql('user_data', 'refid', 'refid', 'BIGINT(20) NULL DEFAULT NULL');
464
465                                 // Update notes (these will be set as task text!)
466                                 setExtensionUpdateNotes("&Uuml;berfl&uuml;ssiges Men&uuml; <strong>chk_regs</strong> entfernt, dies kann mit <strong>list_user</strong> &uuml;bernommen werden.");
467                                 break;
468
469                         case '0.4.4': // SQL queries for v0.4.4
470                                 addDropTableSql('user_refs');
471                                 addCreateTableSql('user_refs', "
472 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
473 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
474 `level` smallINT(6) UNSIGNED NOT NULL DEFAULT 0,
475 `refid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
476 PRIMARY KEY (`id`),
477 UNIQUE `user_refid` (`userid`, `level`, `refid`),
478 INDEX (`level`),
479 INDEX (`refid`)",
480                                         'User referrals');
481
482                                 // Load ext-refback's special include to regenerate the referral table
483                                 addIncludeToPool('extension', 'inc/fix_refsystem.php');
484
485                                 // Update notes (these will be set as task text!)
486                                 setExtensionUpdateNotes("Neues Tabellenlayout und verschoben von ext-refback.");
487                                 break;
488
489                         case '0.4.5': // SQL queries for v0.4.5
490                                 addExtensionChangeTableColumnSql('user_links', 'link_type', 'link_type', "VARCHAR(255) NOT NULL DEFAULT 'NORMAL'");
491
492                                 // Update notes (these will be set as task text!)
493                                 setExtensionUpdateNotes("Die Spalte <strong>link_type</strong> ist nun kein ENUM mehr, um weitere Mailtypen zu erlauben.");
494                                 break;
495
496                         case '0.4.6': // SQL queries for v0.4.6
497                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='{OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben' WHERE `what` = 'add_points' LIMIT 1");
498                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='{OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen' WHERE `what` = 'sub_points' LIMIT 1");
499                                 addAdminMenuSql('user','sub_points','{OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen','Allen oder einem Mitglied {OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen.', 8);
500
501                                 // This update depends on ext-menu update
502                                 addExtensionDependency('menu');
503
504                                 // Update notes (these will be set as task text!)
505                                 setExtensionUpdateNotes("Abzug von {?POINTS?} sollte nun dabei sein und Hinzuf&uuml;gen gefixt (war zu kurze Spalte).");
506                                 break;
507
508                         case '0.4.7': // SQL queries for v0.4.7
509                                 addExtensionChangeTableColumnSql('user_data', 'lock_timestamp', 'lock_timestamp', 'TIMESTAMP NULL DEFAULT NULL');
510                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_user_data` SET `lock_timestamp`=NULL WHERE `lock_timestamp`='0000-00-00 00:00:00'");
511
512                                 // Update notes (these will be set as task text!)
513                                 setExtensionUpdateNotes("0000-00-00  00:00:00 ist kein Standardwert mehr, NULL ist dies.");
514                                 break;
515
516                         case '0.4.8': // SQL queries for v0.4.8
517                                 // Update notes (these will be set as task text!)
518                                 setExtensionUpdateNotes("Dieses Update ist nicht mehr g&uuml;ltig.");
519                                 break;
520
521                         case '0.4.9': // SQL queries for v0.4.9
522                                 addExtensionChangeTableColumnSql('user_data', 'last_module', 'last_what', 'VARCHAR(255) NULL DEFAULT NULL');
523
524                                 // Register filter locked points
525                                 registerFilter(__FILE__, __LINE__, 'get_locked_points', 'LOCKED_USER_POINTS', FALSE, TRUE, isExtensionDryRun());
526
527                                 // Register filter for all column names
528                                 registerFilter(__FILE__, __LINE__, 'get_all_point_columns', 'GET_ALL_USER_POINTS_COLUMN_NAMES', FALSE, TRUE, isExtensionDryRun());
529
530                                 // Update notes (these will be set as task text!)
531                                 setExtensionUpdateNotes("Die Spalte <strong>last_module</strong> ist nach <strong>last_what</strong> umbenannt und hat nun NULL als Ausgangswert und Filter f&uuml;r gesperrtes Guthaben hinzugef&uuml;gt.");
532                                 break;
533
534                         case '0.5.0': // SQL queries for v0.5.0
535                                 // Prefix for all test accounts
536                                 addConfigAddSql('tester_user_maximum', 'INT(5) UNSIGNED ZEROFILL NOT NULL DEFAULT 00999');
537                                 addConfigAddSql('tester_user_gender', "ENUM('M','F') NOT NULL DEFAULT 'M'");
538                                 addConfigAddSql('tester_user_surname_prefix', "VARCHAR(255) NOT NULL DEFAULT 'tester_'");
539                                 addConfigAddSql('tester_user_family', "VARCHAR(255) NOT NULL DEFAULT 'Testbenutzer'");
540                                 addConfigAddSql('tester_user_street_nr', "VARCHAR(255) NOT NULL DEFAULT 'Teststra&szlig;e 123'");
541                                 addConfigAddSql('tester_user_zip', 'INT(6) UNSIGNED NOT NULL DEFAULT 12345');
542                                 addConfigAddSql('tester_user_city', "VARCHAR(255) NOT NULL DEFAULT 'Teststadt'");
543                                 addConfigAddSql('tester_user_email', "VARCHAR(255) NOT NULL DEFAULT '{OPEN_CONFIG}WEBMASTER{CLOSE_CONFIG}'");
544                                 addConfigAddSql('tester_user_default_refid', 'BIGINT(20) NULL DEFAULT NULL');
545                                 addConfigAddSql('tester_user_password', "VARCHAR(255) NOT NULL DEFAULT ''");
546                                 addConfigAddSql('tester_user_check_cat', "ENUM('Y','N') NOT NULL DEFAULT 'Y'");
547
548                                 // Admin menu
549                                 addAdminMenuSql('user', 'add_tester_user', 'Testbenutzer anlegen', 'Es k&ouml;nnen hier bis zu 100 Testbenutzer angelegt werden. Diese haben als Vornamen immer den Pr&auml;fix <span class="data">{?tester_user_surname_prefix?}</span> und werden bei Null anfangend bis 99 hochgez&auml;lt.', 1);
550                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='Mitglieder auflisten' WHERE `what`='list_user' LIMIT 1");
551
552                                 // Change 'zip' to INT(6)
553                                 addExtensionChangeTableColumnSql('user_data', 'zip', 'zip', 'INT(6) NOT NULL DEFAULT 0');
554
555                                 // Register filter for WHERE/AND exclusion/inclusion statements
556                                 registerFilter(__FILE__, __LINE__, 'user_exclusion_sql', 'TESTER_USER_EXCLUSION_SQL', FALSE, TRUE, isExtensionDryRun());
557                                 registerFilter(__FILE__, __LINE__, 'user_inclusion_sql', 'TESTER_USER_INCLUSION_SQL', FALSE, TRUE, isExtensionDryRun());
558
559                                 // Update notes (these will be set as task text!)
560                                 setExtensionUpdateNotes("Es k&ouml;nnen nun Test-Benutzer angelegt werden. Noch m&uuml;ssen diese &uuml;berall ausgeschlossen werden, damit die Mediadaten nicht unn&ouml;tig verf&auml;lscht werden.");
561                                 break;
562
563                         case '0.5.1': // SQL queries for v0.5.1
564                                 // Register a filter
565                                 registerFilter(__FILE__, __LINE__, 'pre_user_registration', 'TESTER_USER_REGISTRATION_ADD_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
566
567                                 // Update notes (these will be set as task text!)
568                                 setExtensionUpdateNotes("Filter zum Hinzuf&uuml;gen von SQL-Spalten f&uuml;r die Mitgliederanmeldung hinzugef&uuml;gt.");
569                                 break;
570
571                         case '0.5.2': // SQL queries for v0.5.2
572                                 // Register a filter
573                                 registerFilter(__FILE__, __LINE__, 'convert_user_data_columns', 'ADD_USER_DATA_CONVERT_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
574
575                                 // Update notes (these will be set as task text!)
576                                 setExtensionUpdateNotes("Filter zum Hinzuf&uuml;gen von SQL-Spalten f&uuml;r die Mitgliederanmeldung hinzugef&uuml;gt.");
577                                 break;
578
579                         case '0.5.3': // SQL queries for v0.5.3
580                                 // Register filter
581                                 registerFilter(__FILE__, __LINE__, 'post_refid_validation', 'HANDLE_USER_SUBID', FALSE, TRUE, isExtensionDryRun());
582                                 registerFilter(__FILE__, __LINE__, 'pre_user_registration', 'SUBID_USER_REGISTRATION_ADD_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
583
584                                 // Admin menu
585                                 addAdminMenuSql('user', 'list_user_subid', 'Sub-Ids', 'Listet alle pro vom Mitglied eingegebenen Sub-Ids und ermittelten Referral-URLs auf.', 7);
586
587                                 // Member menu
588                                 addMemberMenuSql('extras', 'subids', 'Sub-Id Tracking', 4);
589
590                                 // Add table for subids
591                                 addDropTableSql('user_subids');
592                                 addCreateTableSql('user_subids', "
593 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
594 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
595 `subid` VARCHAR(255) NOT NULL DEFAULT '',
596 `subid_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
597 PRIMARY KEY (`id`),
598 UNIQUE `user_subid` (`userid`, `subid`),
599 INDEX (`subid`)",
600                                         'User sub ids');
601
602                                 // Add table for subid logging
603                                 addDropTableSql('subid_log');
604                                 addCreateTableSql('subid_log', "
605 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
606 `refid` BIGINT(20) UNSIGNED NULL DEFAULT NULL,
607 `subid` VARCHAR(255) NOT NULL DEFAULT '',
608 `referral_url` TINYTEXT NOT NULL,
609 `remote_address` VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
610 `entry_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
611 PRIMARY KEY (`id`),
612 INDEX (`refid`),
613 INDEX (`subid`)",
614                                         'Sub id logging');
615
616                                 // For saving used subid in user_data table
617                                 addExtensionAddTableColumnSql('user_data', 'subid', 'VARCHAR(255) NULL DEFAULT NULL');
618                                 addExtensionAddTableIndexSql('user_data', 'subid', '(`subid`)');
619
620                                 // Configuration entry for purging old subid logs (7 days default)
621                                 addConfigAddSql('user_subid_purge', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT ' . (getOneDay() * 7));
622
623                                 // Update notes (these will be set as task text!)
624                                 setExtensionUpdateNotes("Filter, Datenbanktabelle und Men&uuml;punkte f&uuml;r SubId-Tracking hinzugef&uuml;gt.");
625                                 break;
626
627                         case '0.5.4': // SQL queries for v0.5.4
628                                 // Register filter
629                                 registerFilter(__FILE__, __LINE__, 'update_referral_data', 'GENERIC_UPDATE_USER_REFERRAL', FALSE, TRUE, isExtensionDryRun());
630                                 registerFilter(__FILE__, __LINE__, 'update_referral_data', 'UPDATE_USER_SUBID', FALSE, TRUE, isExtensionDryRun());
631
632                                 // Add user agent
633                                 addExtensionAddTableColumnSql('subid_log', 'user_agent', 'TINYTEXT NOT NULL AFTER `remote_address`');
634
635                                 // Update notes (these will be set as task text!)
636                                 setExtensionUpdateNotes("Weitere Filter f&uuml;r Referral-Counter und Sub-Id hinzugef&uuml;gt.");
637                                 break;
638
639                         case '0.5.5': // SQL queries for v0.5.5
640                                 // Register filter
641                                 registerFilter(__FILE__, __LINE__, 'member_admin_actions', 'ADD_USER_SUBID_MEMBER_ACTION', FALSE, TRUE, isExtensionDryRun());
642
643                                 // Update notes (these will be set as task text!)
644                                 setExtensionUpdateNotes("Weiteren Filter f&uuml;r Mitglieder-Aktionen im Adminbereich hinzugef&uuml;gt.");
645                                 break;
646
647                         case '0.5.6': // SQL queries for v0.5.6
648                                 // Register filter
649                                 registerFilter(__FILE__, __LINE__, 'member_reflink_extra_content', 'MEMBER_REFLINK_USER_SUBIDS_CONTENT', FALSE, TRUE, isExtensionDryRun());
650
651                                 // Update notes (these will be set as task text!)
652                                 setExtensionUpdateNotes("Weiteren Filter f&uuml;r Mitglieder-Aktionen im Adminbereich hinzugef&uuml;gt.");
653                                 break;
654
655                         case '0.5.7': // SQL queries for v0.5.7
656                                 // Admin menu
657                                 addAdminMenuSql('user', 'list_user_amounts', 'Guthaben anzeigen', 'Listet alle Mitglieder und deren Guthaben inklusive Abzug auf.', 8);
658
659                                 // Update notes (these will be set as task text!)
660                                 setExtensionUpdateNotes("Men&uuml; zum Auflisten des Guthabens hinzugef&uuml;gt. Diese Daten sollen noch sp&auml;ter weiter verarbeitet werden. Zum Beispiel soll dann schnell feststellbar sein, welche Verdienstgruppe das meiste und wenigste {?POINTS?}-Volumen besitzt.");
661                                 break;
662
663                         case '0.5.8': // SQL queries for v0.5.8
664                                 addConfigAddSql('ap_subids', "ENUM('Y', 'N') NOT NULL DEFAULT 'Y'");
665                                 addConfigAddSql('ap_subids_since', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT ' . (getOneDay() * 7));
666
667                                 // Admin menu
668                                 addAdminMenuSql('setup', 'config_user_subid', 'Sub-Id Tracking', '&Auml;ndern Sie hier alle Einstellungen zu den Sub-Ids.', 10);
669
670                                 // Update notes (these will be set as task text!)
671                                 setExtensionUpdateNotes("Bereinigung von Sub-Ids und deren Einstellungen hinzugef&uuml;gt.");
672                                 break;
673
674                         case '0.5.9': // SQL queries for v0.5.9
675                                 addExtensionChangeTableColumnSql('subid_log', 'refid', 'refid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
676                                 addExtensionChangeTableColumnSql('user_stats', 'cat_id', 'cat_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
677                                 addExtensionChangeTableColumnSql('user_stats', 'payment_id', 'payment_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
678                                 addExtensionChangeTableColumnSql('user_stats', 'pool_id', 'pool_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
679                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_subid_log` SET `refid`=NULL WHERE `refid`=0');
680                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `cat_id`=NULL WHERE `cat_id`=0');
681                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `payment_id`=NULL WHERE `payment_id`=0');
682                                 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `pool_id`=NULL WHERE `pool_id`=0');
683
684                                 // Update notes (these will be set as task text!)
685                                 setExtensionUpdateNotes("Besser NULL anstelle 0.");
686                                 break;
687
688                         case '0.6.0': // SQL queries for v0.6.0
689                                 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `what`='list_user_cats' WHERE `action`='user' AND `what`='list_cats' LIMIT 1");
690
691                                 // Update notes (these will be set as task text!)
692                                 setExtensionUpdateNotes("Men&uuml;punkt umbenannt um Platz f&uuml;r Konflikt mit <strong>what-config_cats.php</strong> zu schaffen.");
693                                 break;
694                 } // END - switch
695                 break;
696
697         case 'modify': // When the extension got modified
698                 break;
699
700         case 'test': // For testing purposes
701                 break;
702
703         case 'init': // Do stuff when extension is initialized
704                 break;
705
706         default: // Unknown extension mode
707                 logDebugMessage(__FILE__, __LINE__, sprintf("Unknown extension mode %s in extension %s detected.", getExtensionMode(), getCurrentExtensionName()));
708                 break;
709 } // END - switch
710
711 // [EOF]
712 ?>