Completed
Push — master ( 0adf57...cd9ffe )
by Julito
10:56
created

Version20   F

Complexity

Total Complexity 66

Size/Duplication

Total Lines 933
Duplicated Lines 0 %

Importance

Changes 5
Bugs 1 Features 0
Metric Value
eloc 650
c 5
b 1
f 0
dl 0
loc 933
rs 3.07
wmc 66

2 Methods

Rating   Name   Duplication   Size   Complexity  
A down() 0 2 1
F up() 0 920 65

How to fix   Complexity   

Complex Class

Complex classes like Version20 often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Version20, and based on these observations, apply Extract Interface, too.

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
5
6
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
7
use Doctrine\DBAL\Schema\Schema;
8
use Doctrine\DBAL\Types\Type;
9
10
/**
11
 * Class Version20
12
 * Migrate file to updated to Chamilo 2.0.
13
 */
14
class Version20 extends AbstractMigrationChamilo
15
{
16
    /**
17
     * @param Schema $schema
18
     */
19
    public function up(Schema $schema)
20
    {
21
        // Use $schema->createTable
22
        $this->addSql('set sql_mode=""');
23
        $this->addSql('ALTER TABLE access_url_rel_user MODIFY COLUMN access_url_id INT NOT NULL');
24
        $this->addSql('ALTER TABLE access_url_rel_user MODIFY COLUMN user_id INT NOT NULL');
25
26
        $this->addSql('ALTER TABLE access_url_rel_user DROP PRIMARY KEY');
27
        $this->addSql('ALTER TABLE access_url_rel_session DROP PRIMARY KEY');
28
29
        $this->addSql('CREATE TABLE IF NOT EXISTS page__page (id INT AUTO_INCREMENT NOT NULL, site_id INT DEFAULT NULL, parent_id INT DEFAULT NULL, target_id INT DEFAULT NULL, route_name VARCHAR(255) NOT NULL, page_alias VARCHAR(255) DEFAULT NULL, type VARCHAR(255) DEFAULT NULL, position INT NOT NULL, enabled TINYINT(1) NOT NULL, decorate TINYINT(1) NOT NULL, edited TINYINT(1) NOT NULL, name VARCHAR(255) NOT NULL, slug LONGTEXT DEFAULT NULL, url LONGTEXT DEFAULT NULL, custom_url LONGTEXT DEFAULT NULL, request_method VARCHAR(255) DEFAULT NULL, title VARCHAR(255) DEFAULT NULL, meta_keyword VARCHAR(255) DEFAULT NULL, meta_description VARCHAR(255) DEFAULT NULL, javascript LONGTEXT DEFAULT NULL, stylesheet LONGTEXT DEFAULT NULL, raw_headers LONGTEXT DEFAULT NULL, template VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_2FAE39EDF6BD1646 (site_id), INDEX IDX_2FAE39ED727ACA70 (parent_id), INDEX IDX_2FAE39ED158E0B66 (target_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
30
        $this->addSql('CREATE TABLE IF NOT EXISTS page__site (id INT AUTO_INCREMENT NOT NULL, enabled TINYINT(1) NOT NULL, name VARCHAR(255) NOT NULL, relative_path VARCHAR(255) DEFAULT NULL, host VARCHAR(255) NOT NULL, enabled_from DATETIME DEFAULT NULL, enabled_to DATETIME DEFAULT NULL, is_default TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, locale VARCHAR(7) DEFAULT NULL, title VARCHAR(64) DEFAULT NULL, meta_keywords VARCHAR(255) DEFAULT NULL, meta_description VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
31
        $this->addSql('CREATE TABLE IF NOT EXISTS page__snapshot (id INT AUTO_INCREMENT NOT NULL, site_id INT DEFAULT NULL, page_id INT DEFAULT NULL, route_name VARCHAR(255) NOT NULL, page_alias VARCHAR(255) DEFAULT NULL, type VARCHAR(255) DEFAULT NULL, position INT NOT NULL, enabled TINYINT(1) NOT NULL, decorate TINYINT(1) NOT NULL, name VARCHAR(255) NOT NULL, url LONGTEXT DEFAULT NULL, parent_id INT DEFAULT NULL, target_id INT DEFAULT NULL, content LONGTEXT DEFAULT NULL COMMENT "(DC2Type:json)", publication_date_start DATETIME DEFAULT NULL, publication_date_end DATETIME DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_3963EF9AF6BD1646 (site_id), INDEX IDX_3963EF9AC4663E4 (page_id), INDEX idx_snapshot_dates_enabled (publication_date_start, publication_date_end, enabled), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
32
        $this->addSql('CREATE TABLE IF NOT EXISTS page__bloc (id INT AUTO_INCREMENT NOT NULL, parent_id INT DEFAULT NULL, page_id INT DEFAULT NULL, name VARCHAR(255) DEFAULT NULL, type VARCHAR(64) NOT NULL, settings LONGTEXT NOT NULL COMMENT "(DC2Type:json)", enabled TINYINT(1) DEFAULT NULL, position INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_FCDC1A97727ACA70 (parent_id), INDEX IDX_FCDC1A97C4663E4 (page_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
33
        $this->addSql('CREATE TABLE IF NOT EXISTS timeline__timeline (id INT AUTO_INCREMENT NOT NULL, action_id INT DEFAULT NULL, subject_id INT DEFAULT NULL, context VARCHAR(255) NOT NULL, type VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, INDEX IDX_FFBC6AD59D32F035 (action_id), INDEX IDX_FFBC6AD523EDC87 (subject_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
34
        $this->addSql('CREATE TABLE IF NOT EXISTS timeline__component (id INT AUTO_INCREMENT NOT NULL, model VARCHAR(255) NOT NULL, identifier LONGTEXT NOT NULL COMMENT "(DC2Type:array)", hash VARCHAR(190) NOT NULL, UNIQUE INDEX UNIQ_1B2F01CDD1B862B8 (hash), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
35
        $this->addSql('CREATE TABLE IF NOT EXISTS timeline__action (id INT AUTO_INCREMENT NOT NULL, verb VARCHAR(255) NOT NULL, status_current VARCHAR(255) NOT NULL, status_wanted VARCHAR(255) NOT NULL, duplicate_key VARCHAR(255) DEFAULT NULL, duplicate_priority INT DEFAULT NULL, created_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
36
        $this->addSql('CREATE TABLE IF NOT EXISTS timeline__action_component (id INT AUTO_INCREMENT NOT NULL, action_id INT DEFAULT NULL, component_id INT DEFAULT NULL, type VARCHAR(255) NOT NULL, text VARCHAR(255) DEFAULT NULL, INDEX IDX_6ACD1B169D32F035 (action_id), INDEX IDX_6ACD1B16E2ABAFFF (component_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
37
38
        $this->addSql('CREATE TABLE IF NOT EXISTS faq_question_translation (id INT AUTO_INCREMENT NOT NULL, translatable_id INT DEFAULT NULL, headline VARCHAR(255) NOT NULL, body LONGTEXT DEFAULT NULL, slug VARCHAR(50) NOT NULL, locale VARCHAR(190) NOT NULL, INDEX IDX_C2D1A2C2AC5D3 (translatable_id), UNIQUE INDEX faq_question_translation_unique_translation (translatable_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
39
        $this->addSql('CREATE TABLE IF NOT EXISTS faq_category_translation (id INT AUTO_INCREMENT NOT NULL, translatable_id INT DEFAULT NULL, headline VARCHAR(255) NOT NULL, body LONGTEXT DEFAULT NULL, slug VARCHAR(50) NOT NULL, locale VARCHAR(190) NOT NULL, INDEX IDX_5493B0FC2C2AC5D3 (translatable_id), UNIQUE INDEX faq_category_translation_unique_translation (translatable_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
40
        $this->addSql('CREATE TABLE IF NOT EXISTS faq_category (id INT AUTO_INCREMENT NOT NULL, rank INT NOT NULL, is_active TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX is_active_idx (is_active), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
41
        $this->addSql('CREATE TABLE IF NOT EXISTS faq_question (id INT AUTO_INCREMENT NOT NULL, category_id INT DEFAULT NULL, rank INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, only_auth_users TINYINT(1) NOT NULL, is_active TINYINT(1) NOT NULL, INDEX IDX_4A55B05912469DE2 (category_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
42
        $this->addSql('CREATE TABLE IF NOT EXISTS contact_category_translation (id INT AUTO_INCREMENT NOT NULL, translatable_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, locale VARCHAR(190) NOT NULL, INDEX IDX_3E770F302C2AC5D3 (translatable_id), UNIQUE INDEX contact_category_translation_unique_translation (translatable_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
43
        $this->addSql('CREATE TABLE IF NOT EXISTS contact_category (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
44
        $this->addSql('ALTER TABLE page__bloc ADD CONSTRAINT FK_FCDC1A97727ACA70 FOREIGN KEY (parent_id) REFERENCES page__bloc (id) ON DELETE CASCADE;');
45
        $this->addSql('ALTER TABLE page__bloc ADD CONSTRAINT FK_FCDC1A97C4663E4 FOREIGN KEY (page_id) REFERENCES page__page (id) ON DELETE CASCADE;');
46
        $this->addSql('ALTER TABLE timeline__timeline ADD CONSTRAINT FK_FFBC6AD59D32F035 FOREIGN KEY (action_id) REFERENCES timeline__action (id);');
47
        $this->addSql('ALTER TABLE timeline__timeline ADD CONSTRAINT FK_FFBC6AD523EDC87 FOREIGN KEY (subject_id) REFERENCES timeline__component (id) ON DELETE CASCADE;');
48
49
        $this->addSql('CREATE INDEX context_idx ON timeline__timeline (context)');
50
        $this->addSql('CREATE INDEX type_idx ON timeline__timeline (type)');
51
52
        $this->addSql('ALTER TABLE timeline__action_component ADD CONSTRAINT FK_6ACD1B169D32F035 FOREIGN KEY (action_id) REFERENCES timeline__action (id) ON DELETE CASCADE;');
53
        $this->addSql('ALTER TABLE timeline__action_component ADD CONSTRAINT FK_6ACD1B16E2ABAFFF FOREIGN KEY (component_id) REFERENCES timeline__component (id) ON DELETE CASCADE;');
54
55
        $this->addSql('ALTER TABLE faq_question_translation ADD CONSTRAINT FK_C2D1A2C2AC5D3 FOREIGN KEY (translatable_id) REFERENCES faq_question (id) ON DELETE CASCADE;');
56
        $this->addSql('ALTER TABLE faq_category_translation ADD CONSTRAINT FK_5493B0FC2C2AC5D3 FOREIGN KEY (translatable_id) REFERENCES faq_category (id) ON DELETE CASCADE;');
57
        $this->addSql('ALTER TABLE faq_question ADD CONSTRAINT FK_4A55B05912469DE2 FOREIGN KEY (category_id) REFERENCES faq_category (id);');
58
        $this->addSql('ALTER TABLE contact_category_translation ADD CONSTRAINT FK_3E770F302C2AC5D3 FOREIGN KEY (translatable_id) REFERENCES contact_category (id) ON DELETE CASCADE;');
59
        $this->addSql('ALTER TABLE page__page ADD CONSTRAINT FK_2FAE39EDF6BD1646 FOREIGN KEY (site_id) REFERENCES page__site (id) ON DELETE CASCADE;');
60
        $this->addSql('ALTER TABLE page__page ADD CONSTRAINT FK_2FAE39ED727ACA70 FOREIGN KEY (parent_id) REFERENCES page__page (id) ON DELETE CASCADE;');
61
        $this->addSql('ALTER TABLE page__page ADD CONSTRAINT FK_2FAE39ED158E0B66 FOREIGN KEY (target_id) REFERENCES page__page (id) ON DELETE CASCADE;');
62
        $this->addSql('ALTER TABLE page__snapshot ADD CONSTRAINT FK_3963EF9AF6BD1646 FOREIGN KEY (site_id) REFERENCES page__site (id) ON DELETE CASCADE;');
63
        $this->addSql('ALTER TABLE page__snapshot ADD CONSTRAINT FK_3963EF9AC4663E4 FOREIGN KEY (page_id) REFERENCES page__page (id) ON DELETE CASCADE;');
64
65
        $this->addSql('ALTER TABLE fos_group ADD name VARCHAR(180) NOT NULL, ADD roles LONGTEXT NOT NULL COMMENT "(DC2Type:array)";');
66
        $this->addSql('CREATE UNIQUE INDEX UNIQ_4B019DDB5E237E06 ON fos_group (name);');
67
68
        $this->addSql('ALTER TABLE gradebook_evaluation ADD c_id INT DEFAULT NULL');
69
        $this->addSql("UPDATE gradebook_evaluation SET c_id = (SELECT id FROM course WHERE code = course_code)");
70
        $this->addSql('ALTER TABLE gradebook_evaluation DROP course_code');
71
        $this->addSql('ALTER TABLE gradebook_evaluation ADD CONSTRAINT FK_DDDED80491D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
72
        $this->addSql('CREATE INDEX IDX_DDDED80491D79BD3 ON gradebook_evaluation (c_id)');
73
        //$this->addSql('ALTER TABLE gradebook_evaluation RENAME INDEX fk_ddded80491d79bd3 TO IDX_DDDED80491D79BD3;');
74
75
        $this->addSql('ALTER TABLE gradebook_category ADD c_id INT DEFAULT NULL');
76
        $this->addSql('UPDATE gradebook_category SET c_id = (SELECT id FROM course WHERE code = course_code)');
77
        $this->addSql('ALTER TABLE gradebook_category DROP course_code');
78
79
        $this->addSql('ALTER TABLE gradebook_category ADD CONSTRAINT FK_96A4C70591D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
80
        $this->addSql('CREATE INDEX IDX_96A4C70591D79BD3 ON gradebook_category (c_id);');
81
82
        $this->addSql('ALTER TABLE gradebook_link ADD c_id INT DEFAULT NULL');
83
        $this->addSql('UPDATE gradebook_link SET c_id = (SELECT id FROM course WHERE code = course_code)');
84
        $this->addSql('ALTER TABLE gradebook_link DROP course_code');
85
        $this->addSql('ALTER TABLE gradebook_link ADD CONSTRAINT FK_4F0F595F91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
86
        $this->addSql('CREATE INDEX IDX_4F0F595F91D79BD3 ON gradebook_link (c_id);');
87
88
        $this->addSql('ALTER TABLE access_url_rel_user ADD id INT AUTO_INCREMENT NOT NULL, CHANGE access_url_id access_url_id INT DEFAULT NULL, CHANGE user_id user_id INT DEFAULT NULL, ADD PRIMARY KEY (id);');
89
        $this->addSql('ALTER TABLE access_url ADD limit_courses INT DEFAULT NULL, ADD limit_active_courses INT DEFAULT NULL, ADD limit_sessions INT DEFAULT NULL, ADD limit_users INT DEFAULT NULL, ADD limit_teachers INT DEFAULT NULL, ADD limit_disk_space INT DEFAULT NULL, ADD email VARCHAR(255) DEFAULT NULL;');
90
91
        $this->addSql('ALTER TABLE course_request CHANGE user_id user_id INT DEFAULT NULL;');
92
        $this->addSql('ALTER TABLE course_request ADD CONSTRAINT FK_33548A73A76ED395 FOREIGN KEY (user_id) REFERENCES user (id);');
93
        $this->addSql('CREATE INDEX IDX_33548A73A76ED395 ON course_request (user_id);');
94
95
        $this->addSql('ALTER TABLE search_engine_ref ADD c_id INT DEFAULT NULL');
96
        $this->addSql('UPDATE search_engine_ref SET c_id = (SELECT id FROM course WHERE code = course_code)');
97
        $this->addSql('ALTER TABLE search_engine_ref DROP course_code');
98
99
        $this->addSql('ALTER TABLE search_engine_ref ADD CONSTRAINT FK_473F037891D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
100
        $this->addSql('CREATE INDEX IDX_473F037891D79BD3 ON search_engine_ref (c_id);');
101
102
        $this->addSql('ALTER TABLE hook_observer CHANGE class_name class_name VARCHAR(190) DEFAULT NULL');
103
104
        $connection = $this->getEntityManager()->getConnection();
105
        $sql = 'SELECT * FROM course_category';
106
        $result = $connection->executeQuery($sql);
107
        $all = $result->fetchAll();
108
109
        $categories = array_column($all, 'parent_id', 'id');
110
        $categoryCodeList = array_column($all, 'id', 'code');
111
112
        foreach ($categories as $categoryId => $parentId) {
113
            if (empty($parentId)) {
114
                continue;
115
            }
116
            $newParentId = $categoryCodeList[$parentId];
117
            if (!empty($newParentId)) {
118
                $this->addSql("UPDATE course_category SET parent_id = $newParentId WHERE id = $categoryId");
119
            }
120
        }
121
122
        $this->addSql('ALTER TABLE course_category CHANGE parent_id parent_id INT DEFAULT NULL;');
123
        $this->addSql('ALTER TABLE course_category ADD CONSTRAINT FK_AFF87497727ACA70 FOREIGN KEY (parent_id) REFERENCES course_category (id);');
124
        $this->addSql('ALTER TABLE settings_current ADD CONSTRAINT FK_62F79C3B9436187B FOREIGN KEY (access_url) REFERENCES access_url (id);');
125
        $this->addSql('ALTER TABLE settings_current CHANGE variable variable VARCHAR(190) DEFAULT NULL, CHANGE subkey subkey VARCHAR(190) DEFAULT NULL;');
126
        $this->addSql('ALTER TABLE settings_options CHANGE variable variable VARCHAR(190) DEFAULT NULL, CHANGE value value VARCHAR(190) DEFAULT NULL');
127
        $this->addSql('ALTER TABLE hook_event CHANGE class_name class_name VARCHAR(190) DEFAULT NULL;');
128
129
        $this->addSql('ALTER TABLE access_url_rel_session ADD id INT AUTO_INCREMENT NOT NULL, CHANGE access_url_id access_url_id INT DEFAULT NULL, CHANGE session_id session_id INT DEFAULT NULL, ADD PRIMARY KEY (id);');
130
        $this->addSql('ALTER TABLE access_url_rel_session ADD CONSTRAINT FK_6CBA5F5D613FECDF FOREIGN KEY (session_id) REFERENCES session (id);');
131
        $this->addSql('ALTER TABLE access_url_rel_session ADD CONSTRAINT FK_6CBA5F5D73444FD5 FOREIGN KEY (access_url_id) REFERENCES access_url (id);');
132
        $this->addSql('CREATE INDEX IDX_6CBA5F5D613FECDF ON access_url_rel_session (session_id);');
133
        $this->addSql('CREATE INDEX IDX_6CBA5F5D73444FD5 ON access_url_rel_session (access_url_id);');
134
135
        $this->addSql('ALTER TABLE c_tool ADD CONSTRAINT FK_8456658091D79BD3 FOREIGN KEY (c_id) REFERENCES course (id)');
136
137
        $this->addSql('UPDATE c_tool SET name = "blog" WHERE name = "blog_management" ');
138
        $this->addSql('UPDATE c_tool SET name = "agenda" WHERE name = "calendar_event" ');
139
        $this->addSql('UPDATE c_tool SET name = "maintenance" WHERE name = "course_maintenance" ');
140
        $this->addSql('UPDATE c_tool SET name = "assignment" WHERE name = "student_publication" ');
141
        $this->addSql('UPDATE c_tool SET name = "settings" WHERE name = "course_setting" ');
142
143
        $this->addSql('UPDATE session_category SET date_start = NULL WHERE date_start = "0000-00-00"');
144
        $this->addSql('UPDATE session_category SET date_end = NULL WHERE date_end = "0000-00-00"');
145
146
        $this->addSql('DELETE FROM message WHERE user_sender_id IS NULL OR user_sender_id = 0');
147
148
        $this->addSql('ALTER TABLE message CHANGE user_receiver_id user_receiver_id INT DEFAULT NULL');
149
        $this->addSql('UPDATE message SET user_receiver_id = NULL WHERE user_receiver_id = 0');
150
151
        $this->addSql('DELETE FROM message WHERE user_sender_id NOT IN (SELECT id FROM user)');
152
        $this->addSql('DELETE FROM message WHERE user_receiver_id IS NOT NULL AND user_receiver_id NOT IN (SELECT id FROM user)');
153
154
        $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FF6C43E79 FOREIGN KEY (user_sender_id) REFERENCES user (id)');
155
        $this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307F64482423 FOREIGN KEY (user_receiver_id) REFERENCES user (id)');
156
157
        $table = $schema->getTable('c_document');
158
        if (!$table->hasIndex('idx_cdoc_path')) {
159
            $this->addSql('CREATE INDEX idx_cdoc_path ON c_document (path)');
160
        }
161
        if (!$table->hasIndex('idx_cdoc_size')) {
162
            $this->addSql('CREATE INDEX idx_cdoc_size ON c_document (size)');
163
        }
164
        if (!$table->hasIndex('idx_cdoc_id')) {
165
            $this->addSql('CREATE INDEX idx_cdoc_id ON c_document (id)');
166
        }
167
        if (!$table->hasIndex('idx_cdoc_type')) {
168
            $this->addSql('CREATE INDEX idx_cdoc_type ON c_document (filetype)');
169
        }
170
        if (!$table->hasIndex('idx_cdoc_sid')) {
171
            $this->addSql('CREATE INDEX idx_cdoc_sid ON c_document (session_id)');
172
        }
173
174
        $table = $schema->getTable('c_item_property');
175
        if (!$table->hasIndex('idx_cip_lasteditu')) {
176
            $this->addSql('CREATE INDEX idx_cip_lasteditu ON c_item_property (lastedit_user_id)');
177
        }
178
        if (!$table->hasIndex('idx_item_property_visibility')) {
179
            $this->addSql('CREATE INDEX idx_item_property_visibility ON c_item_property (visibility)');
180
        }
181
182
        $table = $schema->getTable('extra_field_values');
183
        if (!$table->hasIndex('idx_efv_item')) {
184
            $this->addSql('CREATE INDEX idx_efv_item ON extra_field_values (item_id)');
185
        }
186
187
        $table = $schema->getTable('gradebook_link');
188
        if (!$table->hasIndex('idx_gl_cat')) {
189
            $this->addSql('CREATE INDEX idx_gl_cat ON gradebook_link (category_id)');
190
        }
191
192
        $table = $schema->getTable('gradebook_category');
193
        if (!$table->hasIndex('idx_gb_cat_parent')) {
194
            $this->addSql('CREATE INDEX idx_gb_cat_parent ON gradebook_category (parent_id)');
195
        }
196
197
        $table = $schema->getTable('access_url_rel_session');
198
        if (!$table->hasIndex('idx_accessurs_sid')) {
199
            $this->addSql('CREATE INDEX idx_accessurs_sid ON access_url_rel_session (session_id)');
200
        }
201
202
        $table = $schema->getTable('gradebook_result');
203
        if (!$table->hasIndex('idx_gb_uid_eid')) {
204
            $this->addSql('CREATE INDEX idx_gb_uid_eid ON gradebook_result (user_id, evaluation_id)');
205
        }
206
207
        $table = $schema->getTable('gradebook_evaluation');
208
        if (!$table->hasIndex('idx_ge_cat')) {
209
            $this->addSql('CREATE INDEX idx_ge_cat ON gradebook_evaluation (category_id)');
210
        }
211
212
        $table = $schema->getTable('track_e_default');
213
        if (!$table->hasIndex('idx_message_user_receiver_status')) {
214
            $this->addSql('CREATE INDEX idx_default_user_id ON track_e_default (default_user_id)');
215
        }
216
217
        $table = $schema->getTable('message');
218
        if (!$table->hasIndex('idx_message_user_receiver_status')) {
219
            $this->addSql('CREATE INDEX idx_message_user_receiver_status ON message (user_receiver_id, msg_status)');
220
        }
221
222
        if (!$table->hasIndex('idx_message_status')) {
223
            $this->addSql('CREATE INDEX idx_message_status ON message (msg_status)');
224
        }
225
226
        if (!$table->hasIndex('idx_message_receiver_status_send_date')) {
227
            $this->addSql('CREATE INDEX idx_message_receiver_status_send_date ON message (user_receiver_id, msg_status, send_date)');
228
        }
229
230
        $table = $schema->getTable('track_e_course_access');
231
        if (!$table->hasIndex('user_course_session_date')) {
232
            $this->addSql(
233
                'CREATE INDEX user_course_session_date ON track_e_course_access (user_id, c_id, session_id, login_course_date)'
234
            );
235
        }
236
237
        $table = $schema->getTable('c_quiz_answer');
238
        if (!$table->hasIndex('c_id_auto')) {
239
            $this->addSql('CREATE INDEX c_id_auto ON c_quiz_answer (c_id, id_auto)');
240
        }
241
242
        $table = $schema->getTable('c_forum_post');
243
        if (!$table->hasIndex('c_id_visible_post_date')) {
244
            $this->addSql('CREATE INDEX c_id_visible_post_date ON c_forum_post (c_id, visible, post_date)');
245
        }
246
247
        $table = $schema->getTable('track_e_access');
248
        if (!$table->hasIndex('user_course_session_date')) {
249
            $this->addSql('CREATE INDEX user_course_session_date ON track_e_access (access_user_id, c_id, access_session_id, access_date)');
250
        }
251
252
        // Update iso
253
        $sql = "UPDATE course SET course_language = (SELECT isocode FROM language WHERE english_name = course_language);";
254
        $this->addSql($sql);
255
256
        $sql = "UPDATE sys_announcement SET lang = (SELECT isocode FROM language WHERE english_name = lang);";
257
        $this->addSql($sql);
258
        //$this->addSql('ALTER TABLE c_tool_intro CHANGE id tool VARCHAR(255) NOT NULL');
259
260
        $this->addSql('ALTER TABLE user ADD date_of_birth DATETIME DEFAULT NULL, ADD website VARCHAR(64) DEFAULT NULL, ADD biography VARCHAR(1000) DEFAULT NULL, ADD gender VARCHAR(1) DEFAULT NULL, ADD locale VARCHAR(8) DEFAULT NULL, ADD timezone VARCHAR(64) DEFAULT NULL, ADD facebook_uid VARCHAR(255) DEFAULT NULL, ADD facebook_name VARCHAR(255) DEFAULT NULL, ADD facebook_data LONGTEXT DEFAULT NULL COMMENT "(DC2Type:json)", ADD twitter_uid VARCHAR(255) DEFAULT NULL, ADD twitter_name VARCHAR(255) DEFAULT NULL, ADD twitter_data LONGTEXT DEFAULT NULL COMMENT "(DC2Type:json)", ADD gplus_uid VARCHAR(255) DEFAULT NULL, ADD gplus_name VARCHAR(255) DEFAULT NULL, ADD gplus_data LONGTEXT DEFAULT NULL COMMENT "(DC2Type:json)", ADD token VARCHAR(255) DEFAULT NULL, ADD two_step_code VARCHAR(255) DEFAULT NULL, CHANGE username_canonical username_canonical VARCHAR(180) NOT NULL, CHANGE lastname lastname VARCHAR(64) DEFAULT NULL, CHANGE firstname firstname VARCHAR(64) DEFAULT NULL, CHANGE phone phone VARCHAR(64) DEFAULT NULL, CHANGE salt salt VARCHAR(255) DEFAULT NULL, CHANGE created_at created_at DATETIME NOT NULL, CHANGE updated_at updated_at DATETIME NOT NULL, CHANGE confirmation_token confirmation_token VARCHAR(180) DEFAULT NULL;');
261
        $this->addSql('ALTER TABLE c_item_property CHANGE lastedit_user_id lastedit_user_id INT DEFAULT NULL');
262
263
        // Fixes missing options show_glossary_in_extra_tools
264
        $this->addSql("DELETE FROM settings_options WHERE variable = 'show_glossary_in_extra_tools'");
265
        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'none', 'None')");
266
        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'exercise', 'Exercise')");
267
        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'lp', 'LearningPath')");
268
        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'exercise_and_lp', 'ExerciseAndLearningPath')");
269
270
        $survey = $schema->getTable('c_survey');
271
272
        if (!$survey->hasColumn('is_mandatory')) {
273
            $survey->addColumn('is_mandatory', Type::BOOLEAN)->setDefault(false);
274
        }
275
276
        $this->addSql('ALTER TABLE c_student_publication ADD filesize INT DEFAULT NULL');
277
        $this->addSql('UPDATE user SET created_at = registration_date WHERE CAST(created_at AS CHAR(20)) = "0000-00-00 00:00:00"');
278
        $this->addSql('UPDATE user SET updated_at = registration_date WHERE CAST(updated_at AS CHAR(20)) = "0000-00-00 00:00:00"');
279
280
        $this->addSql('ALTER TABLE c_survey_invitation CHANGE reminder_date reminder_date DATETIME DEFAULT NULL');
281
        $this->addSql('UPDATE c_survey_invitation SET reminder_date = NULL WHERE CAST(reminder_date AS CHAR(20)) = "0000-00-00 00:00:00"');
282
283
        $table = $schema->hasTable('message_feedback');
284
        if ($table === false) {
285
            $this->addSql(
286
                'CREATE TABLE message_feedback (id BIGINT AUTO_INCREMENT NOT NULL, message_id BIGINT NOT NULL, user_id INT NOT NULL, liked TINYINT(1) DEFAULT 0 NOT NULL, disliked TINYINT(1) DEFAULT 0 NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_DB0F8049537A1329 (message_id), INDEX IDX_DB0F8049A76ED395 (user_id), INDEX idx_message_feedback_uid_mid (message_id, user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;'
287
            );
288
            $this->addSql(
289
                'ALTER TABLE message_feedback ADD CONSTRAINT FK_DB0F8049537A1329 FOREIGN KEY (message_id) REFERENCES message (id) ON DELETE CASCADE'
290
            );
291
            $this->addSql(
292
                'ALTER TABLE message_feedback ADD CONSTRAINT FK_DB0F8049A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE;'
293
            );
294
        }
295
296
        $table = $schema->hasTable('gradebook_result_attempt');
297
        if ($table === false) {
298
            $this->addSql(
299
                'CREATE TABLE gradebook_result_attempt (id INT AUTO_INCREMENT NOT NULL, comment LONGTEXT DEFAULT NULL, score DOUBLE PRECISION DEFAULT NULL, result_id INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;'
300
            );
301
        }
302
303
        $table = $schema->hasTable('track_e_access_complete');
304
        if ($table === false) {
305
            $this->addSql(
306
                'CREATE TABLE track_e_access_complete (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, date_reg DATETIME NOT NULL, tool VARCHAR(255) NOT NULL, tool_id INT NOT NULL, tool_id_detail INT NOT NULL, action VARCHAR(255) NOT NULL, action_details VARCHAR(255) NOT NULL, current_id INT NOT NULL, ip_user VARCHAR(255) NOT NULL, user_agent VARCHAR(255) NOT NULL, session_id INT NOT NULL, c_id INT NOT NULL, ch_sid VARCHAR(255) NOT NULL, login_as INT NOT NULL, info LONGTEXT NOT NULL, url LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;'
307
            );
308
        }
309
310
        /*$table = $schema->getTable('course_rel_class');
311
        if (!$table->hasColumn('c_id')) {
312
            $this->addSql("ALTER TABLE course_rel_class ADD c_id int NOT NULL");
313
        }
314
315
        if ($table->hasColumn('course_code')) {
316
            $this->addSql("
317
                UPDATE course_rel_class cc
318
                SET cc.c_id = (SELECT id FROM course WHERE code = cc.course_code)
319
            ");
320
321
            $this->addSql("ALTER TABLE course_rel_class DROP course_code");
322
            $this->addSql("ALTER TABLE course_rel_class DROP PRIMARY KEY");
323
            $this->addSql("ALTER TABLE course_rel_class MODIFY COLUMN class_id INT DEFAULT NULL");
324
            $this->addSql("ALTER TABLE course_rel_class ADD PRIMARY KEY (class_id, c_id)");
325
            $this->addSql("ALTER TABLE course_rel_class ADD FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE RESTRICT");
326
        }*/
327
328
        $tables = [
329
            'shared_survey',
330
            'specific_field_values',
331
            'templates',
332
        ];
333
334
        foreach ($tables as $table) {
335
            $tableObj = $schema->getTable($table);
336
            /*if (!$tableObj->hasColumn('c_id')) {
337
                $this->addSql("ALTER TABLE $table ADD c_id int NOT NULL");
338
339
                if ($tableObj->hasColumn('course_code')) {
340
                    $this->addSql("
341
                      UPDATE $table t
342
                      SET t.c_id = (SELECT id FROM course WHERE code = t.course_code)
343
                    ");
344
                    $this->addSql("ALTER TABLE $table DROP course_code");
345
                }
346
            }*/
347
            /*$this->addSql("
348
                ALTER TABLE $table ADD FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE RESTRICT
349
            ");*/
350
        }
351
        /*
352
                $this->addSql("ALTER TABLE personal_agenda DROP course");
353
354
                $this->addSql("
355
                    ALTER TABLE specific_field_values
356
                    ADD c_id int(11) NOT NULL,
357
                    ADD FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE RESTRICT;
358
                ");
359
360
                $this->addSql("
361
                    ALTER TABLE track_e_hotspot
362
                    CHANGE c_id c_id int(11) NOT NULL AFTER hotspot_course_code,
363
                    ADD FOREIGN KEY (c_id) REFERENCES course (id) ON DELETE RESTRICT;
364
                ");
365
                $this->addSql("
366
                    UPDATE track_e_hotspot teh
367
                    SET teh.c_id = (SELECT id FROM course WHERE code = teh.hotspot_course_code)
368
                    WHERE teh.hotspot_course_code != NULL OR hotspot_course_code != ''
369
                ");
370
                $this->addSql("ALTER TABLE personal_agenda DROP hotspot_course_code");*/
371
372
        // Update settings variable name
373
        $settings = [
374
            'Institution' => 'institution',
375
            'SiteName' => 'site_name',
376
            'InstitutionUrl' => 'institution_url',
377
            'registration' => 'required_profile_fields',
378
            'profile' => 'changeable_options',
379
            'timezone_value' => 'timezone',
380
            'stylesheets' => 'theme',
381
            'platformLanguage' => 'platform_language',
382
            'languagePriority1' => 'language_priority_1',
383
            'languagePriority2' => 'language_priority_2',
384
            'languagePriority3' => 'language_priority_3',
385
            'languagePriority4' => 'language_priority_4',
386
            'gradebook_score_display_coloring' => 'my_display_coloring',
387
            'document_if_file_exists_option' => 'if_file_exists_option',
388
            'ProfilingFilterAddingUsers' => 'profiling_filter_adding_users',
389
            'course_create_active_tools' => 'active_tools_on_create',
390
            'EmailAdministrator' => 'administrator_email',
391
            'administratorSurname' => 'administrator_surname',
392
            'administratorName' => 'administrator_name',
393
            'administratorTelephone' => 'administrator_phone',
394
            'registration.soap.php.decode_utf8' => 'decode_utf8',
395
            'show_toolshortcuts' => 'show_tool_shortcuts',
396
        ];
397
398
        foreach ($settings as $oldSetting => $newSetting) {
399
            $sql = "UPDATE settings_current SET variable = '$newSetting'
400
                    WHERE variable = '$oldSetting'";
401
            $this->addSql($sql);
402
        }
403
404
        // Update settings category
405
        $settings = [
406
            'cookie_warning' => 'platform',
407
            'donotlistcampus' => 'platform',
408
            'administrator_email' => 'admin',
409
            'administrator_surname' => 'admin',
410
            'administrator_name' => 'admin',
411
            'administrator_phone' => 'admin',
412
            'exercise_max_ckeditors_in_page' => 'exercise',
413
            'allow_hr_skills_management' => 'skill',
414
            'accessibility_font_resize' => 'display',
415
            'account_valid_duration' => 'profile',
416
            'allow_global_chat' => 'chat',
417
            'allow_lostpassword' => 'registration',
418
            'allow_registration' => 'registration',
419
            'allow_registration_as_teacher' => 'registration',
420
            'allow_skills_tool' => 'skill',
421
            'allow_students_to_browse_courses' => 'display',
422
            'allow_terms_conditions' => 'registration',
423
            'allow_users_to_create_courses' => 'course',
424
            'auto_detect_language_custom_pages' => 'language',
425
            'course_validation' => 'course',
426
            'course_validation_terms_and_conditions_url' => 'course',
427
            'display_categories_on_homepage' => 'display',
428
            'display_coursecode_in_courselist' => 'course',
429
            'display_teacher_in_courselist' => 'course',
430
            'drh_autosubscribe' => 'registration',
431
            'drh_page_after_login' => 'registration',
432
            'enable_help_link' => 'display',
433
            'example_material_course_creation' => 'course',
434
            'login_is_email' => 'profile',
435
            'noreply_email_address' => 'mail',
436
            'page_after_login' => 'registration',
437
            'pdf_export_watermark_by_course' => 'document',
438
            'pdf_export_watermark_enable' => 'document',
439
            'pdf_export_watermark_text' => 'document',
440
            'platform_unsubscribe_allowed' => 'registration',
441
            'send_email_to_admin_when_create_course' => 'course',
442
            'show_admin_toolbar' => 'display',
443
            'show_administrator_data' => 'display',
444
            'show_back_link_on_top_of_tree' => 'display',
445
            'show_closed_courses' => 'display',
446
            'show_email_addresses' => 'display',
447
            'show_empty_course_categories' => 'display',
448
            'show_full_skill_name_on_skill_wheel' => 'skill',
449
            'show_hot_courses' => 'display',
450
            'show_link_bug_notification' => 'display',
451
            'show_number_of_courses' => 'display',
452
            'show_teacher_data' => 'display',
453
            'showonline' => 'display',
454
            'student_autosubscribe' => 'registration',
455
            'student_page_after_login' => 'registration',
456
            'student_view_enabled' => 'course',
457
            'teacher_autosubscribe' => 'registration',
458
            'teacher_page_after_login' => 'registration',
459
            'time_limit_whosonline' => 'display',
460
            'user_selected_theme' => 'profile',
461
            'hide_global_announcements_when_not_connected' => 'announcement',
462
            'hide_home_top_when_connected' => 'display',
463
            'hide_logout_button' => 'display',
464
            'institution_address' => 'platform',
465
            'redirect_admin_to_courses_list' => 'admin',
466
            'decode_utf8' => 'webservice',
467
            'use_custom_pages' => 'platform',
468
            'allow_group_categories' => 'group',
469
            'allow_user_headings' => 'display',
470
            'default_document_quotum' => 'document',
471
            'default_forum_view' => 'forum',
472
            'default_group_quotum' => 'document',
473
            'enable_quiz_scenario' => 'exercise',
474
            'exercise_max_score' => 'exercise',
475
            'exercise_min_score' => 'exercise',
476
            'pdf_logo_header' => 'platform',
477
            'show_glossary_in_documents' => 'document',
478
            'show_glossary_in_extra_tools' => 'glossary',
479
            //'show_toolshortcuts' => '',
480
            'survey_email_sender_noreply' => 'survey',
481
            'allow_coach_feedback_exercises' => 'exercise',
482
            'sessionadmin_autosubscribe' => 'registration',
483
            'sessionadmin_page_after_login' => 'registration',
484
            'show_tutor_data' => 'display',
485
            'chamilo_database_version' => 'platform',
486
            'add_gradebook_certificates_cron_task_enabled' => 'gradebook',
487
            'icons_mode_svg' => 'display',
488
            'server_type' => 'platform',
489
            'show_official_code_whoisonline' => 'profile',
490
            'show_terms_if_profile_completed' => 'ticket',
491
            'enable_record_audio' => 'course',
492
            'add_users_by_coach' => 'session',
493
            'allow_captcha' => 'security',
494
            'allow_coach_to_edit_course_session' => 'session',
495
            'allow_delete_attendance' => 'attendance',
496
            'allow_download_documents_by_api_key' => 'webservice',
497
            'allow_email_editor' => 'editor',
498
            'allow_message_tool' => 'message',
499
            'allow_send_message_to_all_platform_users' => 'message',
500
            'allow_personal_agenda' => 'agenda',
501
            'allow_show_linkedin_url' => 'profile',
502
            'allow_show_skype_account' => 'profile',
503
            'allow_social_tool' => 'social',
504
            'allow_students_to_create_groups_in_social' => 'social',
505
            'allow_use_sub_language' => 'language',
506
            'allow_user_course_subscription_by_course_admin' => 'course',
507
            'allow_users_to_change_email_with_no_password' => 'profile',
508
            'display_groups_forum_in_general_tool' => 'forum',
509
            'documents_default_visibility_defined_in_course' => 'document',
510
            'dropbox_allow_group' => 'dropbox',
511
            'dropbox_allow_just_upload' => 'dropbox',
512
            'dropbox_allow_mailing' => 'dropbox',
513
            'dropbox_allow_overwrite' => 'dropbox',
514
            'dropbox_allow_student_to_student' => 'dropbox',
515
            'dropbox_hide_course_coach' => 'dropbox',
516
            'dropbox_hide_general_coach' => 'dropbox',
517
            'dropbox_max_filesize' => 'dropbox',
518
            'email_alert_manager_on_new_quiz' => 'exercise',
519
            'enable_webcam_clip' => 'document',
520
            'enabled_support_pixlr' => 'editor',
521
            'enabled_support_svg' => 'editor',
522
            'enabled_text2audio' => 'document',
523
            'extend_rights_for_coach' => 'session',
524
            'extend_rights_for_coach_on_survey' => 'survey',
525
            'hide_course_group_if_no_tools_available' => 'group',
526
            'hide_dltt_markup' => 'language',
527
            'if_file_exists_option' => 'document',
528
            'language_priority_1' => 'language',
529
            'language_priority_2' => 'language',
530
            'language_priority_3' => 'language',
531
            'language_priority_4' => 'language',
532
            'lp_show_reduced_report' => 'course',
533
            'message_max_upload_filesize' => 'message',
534
            'messaging_allow_send_push_notification' => 'webservice',
535
            'messaging_gdc_api_key' => 'webservice',
536
            'messaging_gdc_project_number' => 'webservice',
537
            'permanently_remove_deleted_files' => 'document',
538
            'permissions_for_new_directories' => 'document',
539
            'permissions_for_new_files' => 'document',
540
            'platform_language' => 'language',
541
            'registered' => 'platform',
542
            'show_chat_folder' => 'chat',
543
            'show_default_folders' => 'document',
544
            'show_different_course_language' => 'language',
545
            'show_documents_preview' => 'document',
546
            'show_link_ticket_notification' => 'display',
547
            'show_official_code_exercise_result_list' => 'exercise',
548
            'show_users_folders' => 'document',
549
            'split_users_upload_directory' => 'profile',
550
            'students_download_folders' => 'document',
551
            'students_export2pdf' => 'document',
552
            'tool_visible_by_default_at_creation' => 'document',
553
            'upload_extensions_blacklist' => 'document',
554
            'upload_extensions_list_type' => 'document',
555
            'upload_extensions_replace_by' => 'document',
556
            'upload_extensions_skip' => 'document',
557
            'upload_extensions_whitelist' => 'document',
558
            'use_users_timezone' => 'profile',
559
            'users_copy_files' => 'document',
560
            'timezone' => 'platform',
561
            'enable_profile_user_address_geolocalization' => 'profile',
562
            'theme' => 'platform',
563
        ];
564
565
        foreach ($settings as $variable => $category) {
566
            $sql = "UPDATE settings_current SET category = '$category'
567
                    WHERE variable = '$variable'";
568
            $this->addSql($sql);
569
        }
570
571
        // Update settings value
572
        $settings = [
573
            'upload_extensions_whitelist' => 'htm;html;jpg;jpeg;gif;png;swf;avi;mpg;mpeg;mov;flv;doc;docx;xls;xlsx;ppt;pptx;odt;odp;ods;pdf;webm;oga;ogg;ogv;h264',
574
        ];
575
576
        foreach ($settings as $variable => $value) {
577
            $sql = "UPDATE settings_current SET selected_value = '$value'
578
                    WHERE variable = '$variable'";
579
            $this->addSql($sql);
580
        }
581
582
        // Delete settings
583
        $settings = [
584
            'use_session_mode',
585
            'show_toolshortcuts',
586
            'show_tabs',
587
            'display_mini_month_calendar',
588
            'number_of_upcoming_events',
589
            'facebook_description',
590
            'ldap_description',
591
            'openid_authentication',
592
            'platform_charset',
593
            'shibboleth_description',
594
            'sso_authentication',
595
            'sso_authentication_domain',
596
            'sso_authentication_auth_uri',
597
            'sso_authentication_unauth_uri',
598
            'sso_authentication_protocol',
599
            'sso_force_redirect',
600
            'activate_email_template',
601
        ];
602
603
        foreach ($settings as $setting) {
604
            $sql = "DELETE FROM settings_current WHERE variable = '$setting'";
605
            $this->addSql($sql);
606
        }
607
608
        $this->addSql('UPDATE settings_current SET category = LOWER(category)');
609
        $this->addSql("ALTER TABLE c_quiz_question_category CHANGE description description LONGTEXT DEFAULT NULL;");
610
        $this->addSql("ALTER TABLE c_survey_invitation ADD answered_at DATETIME DEFAULT NULL;");
611
612
        $this->addSql('CREATE TABLE IF NOT EXISTS scheduled_announcements (id INT AUTO_INCREMENT NOT NULL, subject VARCHAR(255) NOT NULL, message LONGTEXT NOT NULL, date DATETIME DEFAULT NULL, sent TINYINT(1) NOT NULL, session_id INT NOT NULL, c_id INT DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
613
        $this->addSql('ALTER TABLE gradebook_certificate ADD downloaded_at DATETIME DEFAULT NULL;');
614
        $this->addSql('UPDATE gradebook_certificate gc SET downloaded_at = (select value from extra_field e inner join extra_field_values v on v.field_id = e.id where variable = "downloaded_at" and extra_field_type = 11 and item_id = gc.id)');
615
616
        $table = $schema->getTable('c_quiz');
617
        if ($table->hasColumn('show_previous_button') === false) {
618
            $this->addSql(
619
                'ALTER TABLE c_quiz ADD COLUMN show_previous_button TINYINT(1) DEFAULT 1;'
620
            );
621
        }
622
623
        if ($table->hasColumn('notifications') === false) {
624
            $this->addSql(
625
                'ALTER TABLE c_quiz ADD COLUMN notifications VARCHAR(255) NULL DEFAULT NULL;'
626
            );
627
        }
628
629
        if ($table->hasColumn('page_result_configuration') === false) {
630
            $this->addSql(
631
                "ALTER TABLE c_quiz ADD page_result_configuration LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)'"
632
            );
633
        }
634
635
        $this->addSql('ALTER TABLE c_quiz MODIFY COLUMN save_correct_answers INT NULL DEFAULT NULL');
636
637
        $table = $schema->getTable('c_lp_item_view');
638
        if ($table->hasIndex('idx_c_lp_item_view_cid_id_view_count') == false) {
639
            $this->addSql(
640
                'CREATE INDEX idx_c_lp_item_view_cid_id_view_count ON c_lp_item_view (c_id, id, view_count)'
641
            );
642
        }
643
644
        $table = $schema->getTable('session');
645
        if (!$table->hasColumn('position')) {
646
            $this->addSql('ALTER TABLE session ADD COLUMN position INT DEFAULT 0 NOT NULL');
647
        } else {
648
            $this->addSql('ALTER TABLE session CHANGE position position INT DEFAULT 0 NOT NULL');
649
        }
650
651
        $this->addSql("UPDATE settings_current SET selected_value = 'true' WHERE variable = 'decode_utf8'");
652
        $this->addSql('ALTER TABLE extra_field_values CHANGE value value LONGTEXT DEFAULT NULL;');
653
        $this->addSql('ALTER TABLE message CHANGE msg_status msg_status SMALLINT NOT NULL;');
654
655
        // Portfolio
656
        if (!$schema->hasTable('portfolio')) {
657
            $this->addSql('CREATE TABLE portfolio_category (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, title LONGTEXT DEFAULT NULL, description LONGTEXT DEFAULT NULL, is_visible TINYINT(1) DEFAULT "1" NOT NULL, INDEX user (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
658
            $this->addSql('CREATE TABLE portfolio (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, c_id INT DEFAULT NULL, session_id INT DEFAULT NULL, category_id INT DEFAULT NULL, title LONGTEXT NOT NULL, content LONGTEXT NOT NULL, creation_date DATETIME NOT NULL, update_date DATETIME NOT NULL, is_visible TINYINT(1) DEFAULT "1" NOT NULL, INDEX user (user_id), INDEX course (c_id), INDEX session (session_id), INDEX category (category_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
659
            $this->addSql('ALTER TABLE portfolio_category ADD CONSTRAINT FK_7AC64359A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
660
            $this->addSql('ALTER TABLE portfolio ADD CONSTRAINT FK_A9ED1062A76ED395 FOREIGN KEY (user_id) REFERENCES user (id);');
661
            $this->addSql('ALTER TABLE portfolio ADD CONSTRAINT FK_A9ED106291D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
662
            $this->addSql('ALTER TABLE portfolio ADD CONSTRAINT FK_A9ED1062613FECDF FOREIGN KEY (session_id) REFERENCES session (id);');
663
            $this->addSql('ALTER TABLE portfolio ADD CONSTRAINT FK_A9ED106212469DE2 FOREIGN KEY (category_id) REFERENCES portfolio_category (id);');
664
        } else {
665
            $this->addSql('ALTER TABLE portfolio_category CHANGE title title LONGTEXT DEFAULT NULL');
666
        }
667
668
        // Skills
669
        if (!$schema->hasTable('skill_rel_item_rel_user')) {
670
            $this->addSql('CREATE TABLE skill_rel_item_rel_user (id INT AUTO_INCREMENT NOT NULL, skill_rel_item_id INT NOT NULL, user_id INT NOT NULL, result_id INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, created_by INT NOT NULL, updated_by INT NOT NULL, INDEX IDX_D1133E0DFD4B12DC (skill_rel_item_id), INDEX IDX_D1133E0DA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
671
            $this->addSql('CREATE TABLE skill_rel_item (id INT AUTO_INCREMENT NOT NULL, skill_id INT DEFAULT NULL, item_type INT NOT NULL, item_id INT NOT NULL, obtain_conditions VARCHAR(255) DEFAULT NULL, requires_validation TINYINT(1) NOT NULL, is_real TINYINT(1) NOT NULL, c_id INT DEFAULT NULL, session_id INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, created_by INT NOT NULL, updated_by INT NOT NULL, INDEX IDX_EB5B2A0D5585C142 (skill_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
672
            $this->addSql('CREATE TABLE skill_rel_course (id INT AUTO_INCREMENT NOT NULL, skill_id INT DEFAULT NULL, c_id INT NOT NULL, session_id INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_E7CEC7FA5585C142 (skill_id), INDEX IDX_E7CEC7FA91D79BD3 (c_id), INDEX IDX_E7CEC7FA613FECDF (session_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
673
            $this->addSql('ALTER TABLE skill_rel_item_rel_user ADD CONSTRAINT FK_D1133E0DFD4B12DC FOREIGN KEY (skill_rel_item_id) REFERENCES skill_rel_item (id);');
674
            $this->addSql('ALTER TABLE skill_rel_item_rel_user ADD CONSTRAINT FK_D1133E0DA76ED395 FOREIGN KEY (user_id) REFERENCES user (id);');
675
            $this->addSql('ALTER TABLE skill_rel_item ADD CONSTRAINT FK_EB5B2A0D5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id);');
676
            $this->addSql('ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id);');
677
            $this->addSql('ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
678
            $this->addSql('ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA613FECDF FOREIGN KEY (session_id) REFERENCES session (id);');
679
        }
680
681
        $table = $schema->getTable('skill_rel_user');
682
        if (!$table->hasColumn('validation_status')) {
683
            $this->addSql('ALTER TABLE skill_rel_user ADD validation_status INT NOT NULL');
684
        }
685
686
        $this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D649C05FB297 ON user (confirmation_token)');
687
688
        $this->addSql('CREATE TABLE IF NOT EXISTS ext_translations (id INT AUTO_INCREMENT NOT NULL, locale VARCHAR(8) NOT NULL, object_class VARCHAR(190) NOT NULL, field VARCHAR(32) NOT NULL, foreign_key VARCHAR(64) NOT NULL, content LONGTEXT DEFAULT NULL, INDEX translations_lookup_idx (locale, object_class, foreign_key), UNIQUE INDEX lookup_unique_idx (locale, object_class, field, foreign_key), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
689
        $this->addSql('CREATE TABLE IF NOT EXISTS ext_log_entries (id INT AUTO_INCREMENT NOT NULL, action VARCHAR(8) NOT NULL, logged_at DATETIME NOT NULL, object_id VARCHAR(64) DEFAULT NULL, object_class VARCHAR(255) NOT NULL, version INT NOT NULL, data LONGTEXT DEFAULT NULL COMMENT "(DC2Type:array)", username VARCHAR(255) DEFAULT NULL, INDEX log_class_lookup_idx (object_class), INDEX log_date_lookup_idx (logged_at), INDEX log_user_lookup_idx (username), INDEX log_version_lookup_idx (object_id, object_class, version), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
690
        $this->addSql('CREATE TABLE IF NOT EXISTS tool (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, image VARCHAR(255) DEFAULT NULL, description LONGTEXT DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
691
        $this->addSql('CREATE TABLE IF NOT EXISTS tool_resource_right (id INT AUTO_INCREMENT NOT NULL, tool_id INT DEFAULT NULL, role VARCHAR(255) NOT NULL, mask INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
692
693
        $this->addSql('CREATE TABLE classification__tag (id INT AUTO_INCREMENT NOT NULL, context VARCHAR(255) DEFAULT NULL, name VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, slug VARCHAR(190) NOT NULL, UNIQUE INDEX UNIQ_CA57A1C7989D9B62 (slug), INDEX IDX_CA57A1C7E25D857E (context), UNIQUE INDEX tag_context (slug, context), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
694
        $this->addSql('CREATE TABLE classification__context (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
695
        $this->addSql('CREATE TABLE classification__category (id INT AUTO_INCREMENT NOT NULL, parent_id INT DEFAULT NULL, context VARCHAR(255) DEFAULT NULL, media_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, slug VARCHAR(255) NOT NULL, description VARCHAR(255) DEFAULT NULL, position INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_43629B36727ACA70 (parent_id), INDEX IDX_43629B36E25D857E (context), INDEX IDX_43629B36EA9FDD75 (media_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
696
        $this->addSql('CREATE TABLE classification__collection (id INT AUTO_INCREMENT NOT NULL, context VARCHAR(255) DEFAULT NULL, media_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, description VARCHAR(255) DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, slug VARCHAR(190) NOT NULL, UNIQUE INDEX UNIQ_A406B56A989D9B62 (slug), INDEX IDX_A406B56AE25D857E (context), INDEX IDX_A406B56AEA9FDD75 (media_id), UNIQUE INDEX tag_collection (slug, context), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
697
        $this->addSql('CREATE TABLE media__gallery_media (id INT AUTO_INCREMENT NOT NULL, gallery_id INT DEFAULT NULL, media_id INT DEFAULT NULL, position INT NOT NULL, enabled TINYINT(1) NOT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, INDEX IDX_80D4C5414E7AF8F (gallery_id), INDEX IDX_80D4C541EA9FDD75 (media_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
698
        $this->addSql('CREATE TABLE media__gallery (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, context VARCHAR(64) NOT NULL, default_format VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
699
        $this->addSql('CREATE TABLE media__media (id INT AUTO_INCREMENT NOT NULL, category_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, enabled TINYINT(1) NOT NULL, provider_name VARCHAR(255) NOT NULL, provider_status INT NOT NULL, provider_reference VARCHAR(255) NOT NULL, provider_metadata LONGTEXT DEFAULT NULL COMMENT "(DC2Type:json)", width INT DEFAULT NULL, height INT DEFAULT NULL, length NUMERIC(10, 0) DEFAULT NULL, content_type VARCHAR(255) DEFAULT NULL, content_size INT DEFAULT NULL, copyright VARCHAR(255) DEFAULT NULL, author_name VARCHAR(255) DEFAULT NULL, context VARCHAR(64) DEFAULT NULL, cdn_is_flushable TINYINT(1) DEFAULT NULL, cdn_flush_identifier VARCHAR(64) DEFAULT NULL, cdn_flush_at DATETIME DEFAULT NULL, cdn_status INT DEFAULT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, INDEX IDX_5C6DD74E12469DE2 (category_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
700
        $this->addSql('CREATE TABLE resource_link (id INT AUTO_INCREMENT NOT NULL, resource_node_id INT DEFAULT NULL, session_id INT DEFAULT NULL, user_id INT DEFAULT NULL, c_id INT DEFAULT NULL, group_id INT DEFAULT NULL, usergroup_id INT DEFAULT NULL, visibility INT NOT NULL, start_visibility_at DATETIME DEFAULT NULL, end_visibility_at DATETIME DEFAULT NULL, INDEX IDX_398C394B1BAD783F (resource_node_id), INDEX IDX_398C394B613FECDF (session_id), INDEX IDX_398C394BA76ED395 (user_id), INDEX IDX_398C394B91D79BD3 (c_id), INDEX IDX_398C394BFE54D947 (group_id), INDEX IDX_398C394BD2112630 (usergroup_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
701
        $this->addSql('CREATE TABLE resource_right (id INT AUTO_INCREMENT NOT NULL, resource_link_id INT DEFAULT NULL, role VARCHAR(255) NOT NULL, mask INT NOT NULL, INDEX IDX_9F710F26F004E599 (resource_link_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
702
        $this->addSql('CREATE TABLE resource_node (id INT AUTO_INCREMENT NOT NULL, resource_type_id INT NOT NULL, resource_file_id INT DEFAULT NULL, creator_id INT NOT NULL, parent_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, description LONGTEXT DEFAULT NULL, level INT DEFAULT NULL, path VARCHAR(3000) DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_8A5F48FF98EC6B7B (resource_type_id), UNIQUE INDEX UNIQ_8A5F48FFCE6B9E84 (resource_file_id), INDEX IDX_8A5F48FF61220EA6 (creator_id), INDEX IDX_8A5F48FF727ACA70 (parent_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
703
        $this->addSql('CREATE TABLE resource_type (id INT AUTO_INCREMENT NOT NULL, tool_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_83FEF7938F7B22CC (tool_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
704
        $this->addSql('CREATE TABLE resource_file (id INT AUTO_INCREMENT NOT NULL, media_id INT DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_83BF96AAEA9FDD75 (media_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT = DYNAMIC;');
705
        $this->addSql('ALTER TABLE classification__tag ADD CONSTRAINT FK_CA57A1C7E25D857E FOREIGN KEY (context) REFERENCES classification__context (id);');
706
        $this->addSql('ALTER TABLE classification__category ADD CONSTRAINT FK_43629B36727ACA70 FOREIGN KEY (parent_id) REFERENCES classification__category (id) ON DELETE CASCADE;');
707
        $this->addSql('ALTER TABLE classification__category ADD CONSTRAINT FK_43629B36E25D857E FOREIGN KEY (context) REFERENCES classification__context (id);');
708
        $this->addSql('ALTER TABLE classification__category ADD CONSTRAINT FK_43629B36EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id) ON DELETE SET NULL;');
709
        $this->addSql('ALTER TABLE classification__collection ADD CONSTRAINT FK_A406B56AE25D857E FOREIGN KEY (context) REFERENCES classification__context (id);');
710
        $this->addSql('ALTER TABLE classification__collection ADD CONSTRAINT FK_A406B56AEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id) ON DELETE SET NULL;');
711
        $this->addSql('ALTER TABLE media__gallery_media ADD CONSTRAINT FK_80D4C5414E7AF8F FOREIGN KEY (gallery_id) REFERENCES media__gallery (id) ON DELETE CASCADE;');
712
        $this->addSql('ALTER TABLE media__gallery_media ADD CONSTRAINT FK_80D4C541EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id) ON DELETE CASCADE;');
713
        $this->addSql('ALTER TABLE media__media ADD CONSTRAINT FK_5C6DD74E12469DE2 FOREIGN KEY (category_id) REFERENCES classification__category (id) ON DELETE SET NULL;');
714
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394B1BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id);');
715
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394B613FECDF FOREIGN KEY (session_id) REFERENCES session (id);');
716
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394BA76ED395 FOREIGN KEY (user_id) REFERENCES user (id);');
717
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394B91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
718
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394BFE54D947 FOREIGN KEY (group_id) REFERENCES c_group_info (iid);');
719
        $this->addSql('ALTER TABLE resource_link ADD CONSTRAINT FK_398C394BD2112630 FOREIGN KEY (usergroup_id) REFERENCES usergroup (id);');
720
        $this->addSql('ALTER TABLE resource_right ADD CONSTRAINT FK_9F710F26F004E599 FOREIGN KEY (resource_link_id) REFERENCES resource_link (id);');
721
        $this->addSql('ALTER TABLE resource_node ADD CONSTRAINT FK_8A5F48FF98EC6B7B FOREIGN KEY (resource_type_id) REFERENCES resource_type (id);');
722
        $this->addSql('ALTER TABLE resource_node ADD CONSTRAINT FK_8A5F48FFCE6B9E84 FOREIGN KEY (resource_file_id) REFERENCES resource_file (id);');
723
        $this->addSql('ALTER TABLE resource_node ADD CONSTRAINT FK_8A5F48FF61220EA6 FOREIGN KEY (creator_id) REFERENCES user (id) ON DELETE CASCADE;');
724
        $this->addSql('ALTER TABLE resource_node ADD CONSTRAINT FK_8A5F48FF727ACA70 FOREIGN KEY (parent_id) REFERENCES resource_node (id) ON DELETE CASCADE;');
725
        $this->addSql('ALTER TABLE resource_type ADD CONSTRAINT FK_83FEF7938F7B22CC FOREIGN KEY (tool_id) REFERENCES tool (id);');
726
        $this->addSql('ALTER TABLE resource_file ADD CONSTRAINT FK_83BF96AAEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id);');
727
        $this->addSql('ALTER TABLE tool_resource_right ADD CONSTRAINT FK_E5C562598F7B22CC FOREIGN KEY (tool_id) REFERENCES tool (id);');
728
        $this->addSql('ALTER TABLE c_document ADD resource_node_id INT DEFAULT NULL');
729
        $this->addSql('ALTER TABLE c_document ADD CONSTRAINT FK_C9FA0CBD1BAD783F FOREIGN KEY (resource_node_id) REFERENCES resource_node (id);');
730
        $this->addSql('CREATE UNIQUE INDEX UNIQ_C9FA0CBD1BAD783F ON c_document (resource_node_id);');
731
732
        $this->addSql('CREATE TABLE IF NOT EXISTS notification__message (id INT AUTO_INCREMENT NOT NULL, type VARCHAR(255) NOT NULL, body LONGTEXT NOT NULL COMMENT "(DC2Type:json)", state INT NOT NULL, restart_count INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME DEFAULT NULL, started_at DATETIME DEFAULT NULL, completed_at DATETIME DEFAULT NULL, INDEX notification_message_state_idx (state), INDEX notification_message_created_at_idx (created_at), INDEX idx_state (state), INDEX idx_created_at (created_at), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
733
        $this->addSql('CREATE TABLE sylius_settings (id INT AUTO_INCREMENT NOT NULL, schema_alias VARCHAR(190) NOT NULL, namespace VARCHAR(190) DEFAULT NULL, parameters LONGTEXT NOT NULL COMMENT "(DC2Type:json_array)", UNIQUE INDEX UNIQ_1AFEFB2A894A31AD33E16B56 (schema_alias, namespace), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;');
734
735
        // From configuration.dist.php 1.11.x
736
        $this->addSql('ALTER TABLE c_dropbox_file CHANGE filename filename VARCHAR(190) NOT NULL');
737
        $this->addSql('ALTER TABLE course_category CHANGE name name LONGTEXT NOT NULL;');
738
        $this->addSql('ALTER TABLE c_course_description CHANGE title title LONGTEXT DEFAULT NULL');
739
        $this->addSql('ALTER TABLE c_thematic CHANGE title title LONGTEXT NOT NULL');
740
        $this->addSql('ALTER TABLE c_quiz CHANGE title title LONGTEXT NOT NULL');
741
        $this->addSql('ALTER TABLE c_lp_category CHANGE name name LONGTEXT NOT NULL');
742
        $this->addSql('ALTER TABLE c_glossary CHANGE name name LONGTEXT NOT NULL');
743
        $this->addSql('ALTER TABLE c_tool CHANGE name name LONGTEXT NOT NULL');
744
        $this->addSql('ALTER TABLE portfolio CHANGE title title LONGTEXT NOT NULL');
745
746
        $table = $schema->getTable('gradebook_category');
747
        if (!$table->hasColumn('gradebooks_to_validate_in_dependence')) {
748
            $this->addSql('ALTER TABLE gradebook_category ADD gradebooks_to_validate_in_dependence INT DEFAULT NULL');
749
        }
750
        if (!$table->hasColumn('depends')) {
751
            $this->addSql('ALTER TABLE gradebook_category ADD depends LONGTEXT DEFAULT NULL');
752
        }
753
        if (!$table->hasColumn('minimum_to_validate')) {
754
            $this->addSql('ALTER TABLE gradebook_category ADD minimum_to_validate INT DEFAULT NULL');
755
        }
756
757
        $table = $schema->getTable('course_category');
758
        if (!$table->hasColumn('image')) {
759
            $this->addSql('ALTER TABLE course_category ADD image VARCHAR(255) DEFAULT NULL');
760
        }
761
        if (!$table->hasColumn('description')) {
762
            $this->addSql('ALTER TABLE course_category ADD description LONGTEXT DEFAULT NULL');
763
        }
764
765
        $this->addSql('ALTER TABLE block CHANGE path path VARCHAR(190) NOT NULL');
766
767
        $table = $schema->getTable('sys_announcement');
768
769
        if ($table->hasColumn('visible_drh')) {
770
            $this->addSql('ALTER TABLE sys_announcement CHANGE visible_drh visible_drh TINYINT(1) NOT NULL');
771
        } else {
772
            $this->addSql('ALTER TABLE sys_announcement ADD COLUMN visible_drh TINYINT(1) NOT NULL');
773
        }
774
775
        if ($table->hasColumn('visible_session_admin')) {
776
            $this->addSql(
777
                'ALTER TABLE sys_announcement CHANGE visible_session_admin visible_session_admin TINYINT(1) NOT NULL'
778
            );
779
        } else {
780
            $this->addSql(
781
                'ALTER TABLE sys_announcement ADD COLUMN visible_session_admin TINYINT(1) NOT NULL'
782
            );
783
        }
784
785
        if ($table->hasColumn('visible_boss')) {
786
            $this->addSql('ALTER TABLE sys_announcement CHANGE visible_boss visible_boss TINYINT(1) NOT NULL');
787
        } else {
788
            $this->addSql('ALTER TABLE sys_announcement ADD COLUMN visible_boss TINYINT(1) NOT NULL');
789
        }
790
791
        $table = $schema->getTable('c_group_info');
792
        if (!$table->hasColumn('document_access')) {
793
            $this->addSql('ALTER TABLE c_group_info ADD document_access INT DEFAULT 0 NOT NULL;');
794
        }
795
796
        $table = $schema->getTable('c_group_category');
797
        if (!$table->hasColumn('document_access')) {
798
            $this->addSql('ALTER TABLE c_group_category ADD document_access INT DEFAULT 0 NOT NULL;');
799
        }
800
801
        $table = $schema->getTable('c_quiz');
802
        if (!$table->hasColumn('autolaunch')) {
803
            $this->addSql('ALTER TABLE c_quiz ADD autolaunch TINYINT(1) DEFAULT 0');
804
        }
805
806
        $table = $schema->getTable('usergroup');
807
        if (!$table->hasColumn('author_id')) {
808
            $this->addSql('ALTER TABLE usergroup ADD author_id INT DEFAULT NULL');
809
        }
810
811
        $this->addSql('ALTER TABLE c_group_info ADD CONSTRAINT FK_CE06532491D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);');
812
813
        $this->addSql('ALTER TABLE course_category CHANGE auth_course_child auth_course_child VARCHAR(40) DEFAULT NULL');
814
        $this->addSql('ALTER TABLE extra_field ADD description LONGTEXT DEFAULT NULL');
815
816
        // WIP: Document - resource
817
        $this->addSql('ALTER TABLE c_document CHANGE c_id c_id INT DEFAULT NULL');
818
        $this->addSql('ALTER TABLE c_document ADD CONSTRAINT FK_C9FA0CBD91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id)');
819
820
        $this->addSql('ALTER TABLE c_document CHANGE session_id session_id INT DEFAULT NULL;');
821
        $this->addSql('UPDATE c_document SET session_id = null WHERE session_id = 0');
822
        $this->addSql('ALTER TABLE c_document ADD CONSTRAINT FK_C9FA0CBD613FECDF FOREIGN KEY (session_id) REFERENCES session (id)');
823
        $this->addSql('CREATE INDEX IDX_C9FA0CBD613FECDF ON c_document (session_id)');
824
825
        $this->addSql('ALTER TABLE access_url_rel_course_category CHANGE access_url_id access_url_id INT DEFAULT NULL, CHANGE course_category_id course_category_id INT DEFAULT NULL');
826
        $this->addSql('ALTER TABLE access_url_rel_course_category ADD CONSTRAINT FK_3545C2A673444FD5 FOREIGN KEY (access_url_id) REFERENCES access_url (id)');
827
        $this->addSql('ALTER TABLE access_url_rel_course_category ADD CONSTRAINT FK_3545C2A66628AD36 FOREIGN KEY (course_category_id) REFERENCES course_category (id)');
828
        $this->addSql('CREATE INDEX IDX_3545C2A673444FD5 ON access_url_rel_course_category (access_url_id)');
829
        $this->addSql('CREATE INDEX IDX_3545C2A66628AD36 ON access_url_rel_course_category (course_category_id)');
830
831
        $this->addSql('ALTER TABLE gradebook_category CHANGE user_id user_id INT DEFAULT NULL');
832
        $this->addSql('DELETE FROM gradebook_category WHERE user_id IS NOT NULL AND user_id NOT IN (SELECT id FROM user)');
833
        $this->addSql('ALTER TABLE gradebook_category ADD CONSTRAINT FK_96A4C705A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
834
        $this->addSql('CREATE INDEX IDX_96A4C705A76ED395 ON gradebook_category (user_id)');
835
836
        $this->addSql('ALTER TABLE access_url_rel_usergroup CHANGE access_url_id access_url_id INT DEFAULT NULL');
837
        $this->addSql('ALTER TABLE access_url_rel_usergroup ADD CONSTRAINT FK_AD488DD573444FD5 FOREIGN KEY (access_url_id) REFERENCES access_url (id)');
838
        $this->addSql('CREATE INDEX IDX_AD488DD573444FD5 ON access_url_rel_usergroup (access_url_id)');
839
840
        $this->addSql('DELETE FROM track_e_exercises WHERE exe_user_id = 0 OR exe_user_id IS NULL');
841
        $this->addSql('ALTER TABLE track_e_exercises CHANGE exe_user_id exe_user_id INT NOT NULL');
842
843
        $this->addSql('UPDATE track_e_exercises SET session_id = 0 WHERE session_id IS NULL');
844
        $this->addSql('ALTER TABLE track_e_exercises CHANGE session_id session_id INT NOT NULL');
845
        $this->addSql('ALTER TABLE settings_current CHANGE access_url access_url INT DEFAULT NULL');
846
847
        // Update template
848
        $this->addSql('DELETE FROM templates WHERE course_code NOT IN (SELECT code FROM course)');
849
        $this->addSql('ALTER TABLE templates ADD c_id INT DEFAULT NULL');
850
        $this->addSql('CREATE INDEX IDX_6F287D8E91D79BD3 ON templates (c_id)');
851
        $this->addSql('ALTER TABLE templates ADD CONSTRAINT FK_6F287D8E91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id)');
852
        $this->addSql('UPDATE templates SET c_id = (SELECT id FROM course WHERE code = course_code)');
853
854
        $this->addSql('DELETE FROM gradebook_result_log WHERE id_result IS NULL');
855
        $this->addSql('ALTER TABLE gradebook_result_log CHANGE id_result result_id INT NOT NULL');
856
857
        $this->addSql('ALTER TABLE c_group_info CHANGE category_id category_id INT DEFAULT NULL');
858
859
        $this->addSql('ALTER TABLE c_quiz_question_category ADD session_id INT DEFAULT NULL');
860
        $this->addSql('CREATE INDEX IDX_1414369D613FECDF ON c_quiz_question_category (session_id)');
861
        $this->addSql('ALTER TABLE c_quiz_question_category ADD CONSTRAINT FK_1414369D613FECDF FOREIGN KEY (session_id) REFERENCES session (id)');
862
863
        $this->addSql('ALTER TABLE track_e_attempt CHANGE c_id c_id INT DEFAULT NULL');
864
        $this->addSql('ALTER TABLE track_e_attempt ADD CONSTRAINT FK_F8C342C391D79BD3 FOREIGN KEY (c_id) REFERENCES course (id)');
865
866
        $this->addSql('ALTER TABLE track_e_hotspot ADD CONSTRAINT FK_A89CC3B691D79BD3 FOREIGN KEY (c_id) REFERENCES course (id)');
867
        $this->addSql('CREATE INDEX IDX_A89CC3B691D79BD3 ON track_e_hotspot (c_id)');
868
869
        $this->addSql('ALTER TABLE track_e_hotpotatoes CHANGE exe_result score SMALLINT NOT NULL');
870
        $this->addSql('ALTER TABLE track_e_hotpotatoes CHANGE exe_weighting max_score SMALLINT NOT NULL');
871
        $this->addSql('ALTER TABLE track_e_exercises CHANGE exe_weighting max_score DOUBLE PRECISION NOT NULL');
872
        $this->addSql('ALTER TABLE track_e_exercises CHANGE exe_result score DOUBLE PRECISION NOT NULL');
873
        $this->addSql('ALTER TABLE c_lp CHANGE author author LONGTEXT NOT NULL');
874
875
        $table = $schema->getTable('user_course_category');
876
        if (!$table->hasColumn('collapsed')) {
877
            $this->addSql('ALTER TABLE user_course_category ADD collapsed TINYINT(1) DEFAULT NULL');
878
        }
879
880
        // Drop unused columns
881
        $dropColumnsAndIndex = [
882
            'track_e_uploads' => ['columns' => ['upload_cours_id'], 'index' => ['upload_cours_id']],
883
            'track_e_hotspot' => ['columns' => ['hotspot_course_code'], 'index' => ['hotspot_course_code']],
884
            'templates' => ['columns' => ['course_code'], 'index' => []],
885
        ];
886
887
        foreach ($dropColumnsAndIndex as $tableName => $data) {
888
            if ($schema->hasTable($tableName)) {
889
                $indexList = $data['index'];
890
                foreach ($indexList as $index) {
891
                    if ($table->hasIndex($index)) {
892
                        $table->dropIndex($index);
893
                    }
894
                }
895
896
                $columns = $data['columns'];
897
                $table = $schema->getTable($tableName);
898
                foreach ($columns as $column) {
899
                    if ($table->hasColumn($column)) {
900
                        $table->dropColumn($column);
901
                    }
902
                }
903
            }
904
        }
905
906
        // Drop tables
907
        $dropTables = [
908
            'event_email_template',
909
            'event_sent',
910
            'user_rel_event_type',
911
            'openid_association',
912
            'track_stored_values',
913
            'track_stored_values_stack',
914
        ];
915
        foreach ($dropTables as $table) {
916
            if ($schema->hasTable($table)) {
917
                $schema->dropTable($table);
918
            }
919
        }
920
921
        $result = $connection
922
            ->executeQuery("SELECT COUNT(1) FROM settings_current WHERE variable = 'exercise_invisible_in_session' AND category = 'Session'");
923
        $count = $result->fetch()[0];
924
925
        if (empty($count)) {
926
            $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('exercise_invisible_in_session',NULL,'radio','Session','false','ExerciseInvisibleInSessionTitle','ExerciseInvisibleInSessionComment','',NULL, 1)");
927
            $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('exercise_invisible_in_session','true','Yes')");
928
            $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('exercise_invisible_in_session','false','No')");
929
        }
930
931
        $result = $connection
932
            ->executeQuery("SELECT COUNT(1) FROM settings_current WHERE variable = 'configure_exercise_visibility_in_course' AND category = 'Session'");
933
        $count = $result->fetch()[0];
934
935
        if (empty($count)) {
936
            $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('configure_exercise_visibility_in_course',NULL,'radio','Session','false','ConfigureExerciseVisibilityInCourseTitle','ConfigureExerciseVisibilityInCourseComment','',NULL, 1)");
937
            $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('configure_exercise_visibility_in_course','true','Yes')");
938
            $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('configure_exercise_visibility_in_course','false','No')");
939
        }
940
    }
941
942
    /**
943
     * @param Schema $schema
944
     */
945
    public function down(Schema $schema)
946
    {
947
    }
948
}
949