jmontoyaa 8 лет назад
Родитель
Сommit
77e726cb3d
47 измененных файлов с 4541 добавлено и 0 удалено
  1. 612 0
      app/Migrations/Schema/V110/Version110.php
  2. 181 0
      app/Migrations/Schema/V110/Version20150423093100.php
  3. 77 0
      app/Migrations/Schema/V110/Version20150504182600.php
  4. 64 0
      app/Migrations/Schema/V110/Version20150505132304.php
  5. 77 0
      app/Migrations/Schema/V110/Version20150505142900.php
  6. 242 0
      app/Migrations/Schema/V110/Version20150507152600.php
  7. 43 0
      app/Migrations/Schema/V110/Version20150511133949.php
  8. 29 0
      app/Migrations/Schema/V110/Version20150519153200.php
  9. 31 0
      app/Migrations/Schema/V110/Version20150521113600.php
  10. 49 0
      app/Migrations/Schema/V110/Version20150522112023.php
  11. 821 0
      app/Migrations/Schema/V110/Version20150522222222.php
  12. 55 0
      app/Migrations/Schema/V110/Version20150527101600.php
  13. 33 0
      app/Migrations/Schema/V110/Version20150527114220.php
  14. 31 0
      app/Migrations/Schema/V110/Version20150527120703.php
  15. 76 0
      app/Migrations/Schema/V110/Version20150528103216.php
  16. 67 0
      app/Migrations/Schema/V110/Version20150529164400.php
  17. 70 0
      app/Migrations/Schema/V110/Version20150603142550.php
  18. 32 0
      app/Migrations/Schema/V110/Version20150603151200.php
  19. 101 0
      app/Migrations/Schema/V110/Version20150603181728.php
  20. 29 0
      app/Migrations/Schema/V110/Version20150604145047.php
  21. 70 0
      app/Migrations/Schema/V110/Version20150608104600.php
  22. 35 0
      app/Migrations/Schema/V110/Version20150609113500.php
  23. 29 0
      app/Migrations/Schema/V110/Version20150610143426.php
  24. 34 0
      app/Migrations/Schema/V110/Version20150615171900.php
  25. 35 0
      app/Migrations/Schema/V110/Version20150616093200.php
  26. 35 0
      app/Migrations/Schema/V110/Version20150624164100.php
  27. 35 0
      app/Migrations/Schema/V110/Version20150625155000.php
  28. 36 0
      app/Migrations/Schema/V110/Version20150706135000.php
  29. 29 0
      app/Migrations/Schema/V110/Version20150709083710.php
  30. 35 0
      app/Migrations/Schema/V110/Version20150713132630.php
  31. 111 0
      app/Migrations/Schema/V110/Version20150803163400.php
  32. 37 0
      app/Migrations/Schema/V110/Version20150803171220.php
  33. 40 0
      app/Migrations/Schema/V110/Version20150805161000.php
  34. 29 0
      app/Migrations/Schema/V110/Version20150810132615.php
  35. 75 0
      app/Migrations/Schema/V110/Version20150812230500.php
  36. 166 0
      app/Migrations/Schema/V110/Version20150813143000.php
  37. 71 0
      app/Migrations/Schema/V110/Version20150813200000.php
  38. 45 0
      app/Migrations/Schema/V110/Version20150819095300.php
  39. 178 0
      app/Migrations/Schema/V110/Version20150821150000.php
  40. 67 0
      app/Migrations/Schema/V110/Version20150825141100.php
  41. 41 0
      app/Migrations/Schema/V110/Version20151101082200.php
  42. 312 0
      app/Migrations/Schema/V110/Version20151101082300.php
  43. 34 0
      app/Migrations/Schema/V110/Version20151119082400.php
  44. 32 0
      app/Migrations/Schema/V110/Version20151214164000.php
  45. 129 0
      app/Migrations/Schema/V110/Version20151214170800.php
  46. 52 0
      app/Migrations/Schema/V110/Version20151221150100.php
  47. 29 0
      app/Migrations/Schema/V110/Version20160707131900.php

+ 612 - 0
app/Migrations/Schema/V110/Version110.php

@@ -0,0 +1,612 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use \Doctrine\DBAL\Types\Type;
+
+/**
+ * Class Version110
+ *
+ * Migrate file to updated to Chamilo 1.10
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version110 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function preUp(Schema $schema)
+    {
+        $this->addSql("ALTER TABLE session_rel_course ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE session_rel_course_rel_user ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE session_rel_user ENGINE=InnoDB");
+        $this->addSql("UPDATE session SET session.id_coach = 1 WHERE id_coach NOT IN ( SELECT user_id FROM user)");
+    }
+
+    /**
+     * @param Schema $schema
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    public function up(Schema $schema)
+    {
+        // Use $schema->createTable
+        $this->addSql('set sql_mode=""');
+
+        $this->addSql("CREATE TABLE IF NOT EXISTS course_field_options (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, field_id INT NOT NULL, option_value TEXT, option_display_text VARCHAR(64), option_order INT, tms DATETIME)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS session_field_options (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, field_id INT NOT NULL, option_value TEXT, option_display_text VARCHAR(64), option_order INT, tms DATETIME)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS hook_observer( id int UNSIGNED NOT NULL AUTO_INCREMENT, class_name varchar(255) UNIQUE, path varchar(255) NOT NULL, plugin_name varchar(255) NULL, PRIMARY KEY PK_hook_management_hook_observer(id))");
+        $this->addSql("CREATE TABLE IF NOT EXISTS hook_event( id int UNSIGNED NOT NULL AUTO_INCREMENT, class_name varchar(255) UNIQUE, description varchar(255), PRIMARY KEY PK_hook_management_hook_event(id))");
+        $this->addSql("CREATE TABLE IF NOT EXISTS hook_call( id int UNSIGNED NOT NULL AUTO_INCREMENT, hook_event_id int UNSIGNED NOT NULL, hook_observer_id int UNSIGNED NOT NULL, type tinyint NOT NULL, hook_order int UNSIGNED NOT NULL, enabled tinyint NOT NULL, PRIMARY KEY PK_hook_management_hook_call(id))");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_rel_document (iid INT NOT NULL PRIMARY KEY, id INT NULL, work_id INT NOT NULL, document_id INT NOT NULL, c_id INT NOT NULL)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_rel_user (iid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, id INT NULL, work_id INT NOT NULL, user_id INT NOT NULL, c_id INT NOT NULL)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_student_publication_comment (iid INT NOT NULL PRIMARY KEY, id INT NULL, work_id INT NOT NULL, c_id INT NOT NULL, comment text, file VARCHAR(255), user_id int NOT NULL, sent_at datetime NOT NULL)");
+        $this->addSql("CREATE TABLE IF NOT EXISTS c_attendance_calendar_rel_group (iid int NOT NULL auto_increment PRIMARY KEY, id INT, c_id INT NOT NULL, group_id INT NOT NULL, calendar_id INT NOT NULL)");
+
+        $this->addSql("ALTER TABLE session MODIFY COLUMN date_start date default NULL, MODIFY COLUMN date_end date default NULL");
+        $this->addSql("ALTER TABLE skill_rel_user MODIFY COLUMN acquired_skill_at datetime default NULL");
+        $this->addSql("ALTER TABLE track_e_access MODIFY COLUMN access_date datetime DEFAULT NULL");
+        $this->addSql("ALTER TABLE track_e_lastaccess MODIFY COLUMN access_date datetime DEFAULT NULL");
+
+        $table = $schema->getTable('skill_rel_user');
+
+        if (!$table->hasColumn('course_id')) {
+            $this->addSql("ALTER TABLE skill_rel_user ADD COLUMN course_id INT NOT NULL DEFAULT 0 AFTER id");
+        }
+
+        if (!$table->hasColumn('session_id')) {
+            $this->addSql("ALTER TABLE skill_rel_user ADD COLUMN session_id INT NOT NULL DEFAULT 0 AFTER course_id");
+        }
+
+        $this->addSql("ALTER TABLE skill_rel_user ADD INDEX idx_select_cs (course_id, session_id)");
+
+        // Delete info of session_rel_user if session does not exists;
+        $this->addSql("DELETE FROM session_rel_user WHERE id_session NOT IN (SELECT id FROM session)");
+
+        // Delete info of usergroup_rel_user if usergroup does not exists;
+        $this->addSql("DELETE FROM usergroup_rel_user WHERE usergroup_id NOT IN (SELECT id FROM usergroup)");
+
+        $session = $schema->getTable('session');
+        $session->getColumn('id')->setType(Type::getType(Type::INTEGER))->setUnsigned(false);
+        if (!$session->hasColumn('description')) {
+            $session->addColumn(
+                'description',
+                'text'
+            );
+        }
+
+        if (!$session->hasColumn('show_description')) {
+            $session->addColumn(
+                'show_description',
+                'smallint',
+                array('default' => 0, 'unsigned' => true)
+            );
+        }
+
+        $sessionTable = $schema->getTable('session');
+        if (!$sessionTable->hasColumn('duration')) {
+            $this->addSql("ALTER TABLE session ADD COLUMN duration int");
+        }
+
+        $sessionRelUser = $schema->getTable('session_rel_user');
+        if (!$sessionRelUser->hasColumn('duration')) {
+            $this->addSql("ALTER TABLE session_rel_user ADD COLUMN duration int");
+        }
+
+        $this->addSql("ALTER TABLE skill ADD COLUMN criteria text");
+        $this->addSql("ALTER TABLE gradebook_category ADD COLUMN generate_certificates TINYINT NOT NULL DEFAULT 0");
+        $this->addSql("ALTER TABLE track_e_access ADD COLUMN c_id int NOT NULL");
+
+        $this->addSql("ALTER TABLE track_e_lastaccess ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_exercices ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_downloads ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_hotpotatoes ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_links ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_course_access ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_online ADD COLUMN c_id int NOT NULL");
+        $this->addSql("ALTER TABLE track_e_attempt ADD COLUMN c_id int NOT NULL");
+        $table = $schema->getTable('track_e_default');
+        if (!$table->hasColumn('session_id')) {
+            $this->addSql("ALTER TABLE track_e_default ADD COLUMN session_id int NOT NULL");
+        }
+
+        if (!$table->hasColumn('c_id')) {
+            $this->addSql("ALTER TABLE track_e_default ADD COLUMN c_id int NOT NULL");
+        }
+
+        $this->addSql("ALTER TABLE track_e_access ADD COLUMN user_ip varchar(39) NOT NULL default ''");
+        $this->addSql("ALTER TABLE track_e_exercices ADD COLUMN user_ip varchar(39) NOT NULL default ''");
+        $this->addSql("ALTER TABLE track_e_course_access ADD COLUMN user_ip varchar(39) NOT NULL default ''");
+        $this->addSql("ALTER TABLE track_e_online CHANGE COLUMN login_ip user_ip varchar(39) NOT NULL DEFAULT ''");
+        $this->addSql("ALTER TABLE track_e_login CHANGE COLUMN login_ip user_ip varchar(39) NOT NULL DEFAULT ''");
+
+		$this->addSql("ALTER TABLE user MODIFY COLUMN user_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN user_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE user ADD COLUMN id INT DEFAULT NULL");
+        $this->addSql("UPDATE user SET id = user_id");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN id INT NOT NULL PRIMARY KEY AUTO_INCREMENT AFTER user_id");
+
+        $this->addSql("ALTER TABLE user MODIFY COLUMN chatcall_date datetime default NULL");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN chatcall_text varchar(50) default NULL");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN chatcall_user_id int unsigned default 0");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN expiration_date datetime default NULL");
+        $this->addSql("ALTER TABLE user MODIFY COLUMN registration_date datetime NOT NULL");
+
+        $this->addSql("ALTER TABLE course ADD COLUMN add_teachers_to_sessions_courses tinyint NOT NULL default 0");
+        $this->addSql("ALTER TABLE course DROP COLUMN target_course_code");
+        $this->addSql("ALTER TABLE session MODIFY COLUMN name char(100) NOT NULL DEFAULT ''");
+        $this->addSql("ALTER TABLE course_rel_user ADD COLUMN c_id int default NULL");
+        $this->addSql("ALTER TABLE course_field_values ADD COLUMN c_id int default NULL");
+
+        $this->addSql("ALTER TABLE session_rel_course_rel_user ADD COLUMN c_id int default NULL");
+        $this->addSql("ALTER TABLE session_rel_course_rel_user CHANGE id_session session_id int");
+        $this->addSql("ALTER TABLE session_rel_course_rel_user CHANGE id_user user_id int");
+
+        $this->addSql("ALTER TABLE access_url_rel_course ADD COLUMN c_id int");
+
+        $this->addSql("ALTER TABLE session_rel_course ADD COLUMN position int NOT NULL default 0");
+        $this->addSql("ALTER TABLE session_rel_course ADD COLUMN category varchar(255) default ''");
+        $this->addSql("ALTER TABLE session_rel_course ADD COLUMN c_id int unsigned");
+        $this->addSql("ALTER TABLE session_rel_course CHANGE id_session session_id int");
+        $this->addSql('DELETE FROM session_rel_course WHERE session_id NOT IN (SELECT id FROM session)');
+
+        $this->addSql("DELETE FROM course_rel_user WHERE course_code NOT IN (SELECT code FROM course)");
+        $this->addSql("UPDATE course_rel_user SET c_id = (SELECT id FROM course WHERE code = course_code)");
+
+        // Add iid
+        $tables = [
+            'c_announcement',
+            'c_announcement_attachment',
+            'c_attendance',
+            'c_attendance_calendar',
+            //'c_attendance_calendar_rel_group',
+            'c_attendance_result',
+            //'c_attendance_sheet',
+            'c_attendance_sheet_log',
+            //'c_blog',
+            'c_blog_attachment',
+            //'c_blog_comment',
+            //'c_blog_post',
+            //'c_blog_rating',
+            //'c_blog_rel_user',
+            //'c_blog_task',
+            //'c_blog_task_rel_user',
+            'c_calendar_event',
+            'c_calendar_event_attachment',
+            //'c_calendar_event_repeat',
+            //'c_calendar_event_repeat_not',
+            'c_chat_connected',
+            'c_course_description',
+            'c_course_setting',
+            'c_document',
+            //'c_dropbox_category',
+            //'c_dropbox_feedback',
+            'c_dropbox_file',
+            //'c_dropbox_person',
+            //'c_dropbox_post',
+            'c_forum_attachment',
+            //'c_forum_category',
+            //'c_forum_forum',
+            'c_forum_mailcue',
+            'c_forum_notification',
+            //'c_forum_post',
+            //'c_forum_thread',
+            'c_forum_thread_qualify',
+            'c_forum_thread_qualify_log',
+            //'c_glossary',
+            'c_group_category',
+            'c_group_info',
+            'c_group_rel_tutor',
+            'c_group_rel_user',
+            'c_item_property',
+            'c_link',
+            'c_link_category',
+            'c_lp',
+            'c_lp_item',
+            'c_lp_item_view',
+            'c_lp_iv_interaction',
+            'c_lp_iv_objective',
+            'c_lp_view',
+            //'c_notebook',
+            //'c_online_connected',
+            'c_online_link',
+            'c_permission_group',
+            'c_permission_task',
+            'c_permission_user',
+            'c_quiz',
+            //'c_quiz_answer',
+            'c_quiz_question',
+            'c_quiz_question_category',
+            'c_quiz_question_option',
+            //'c_quiz_question_rel_category',
+            //'c_quiz_rel_question',
+            'c_resource',
+            //'c_role',
+            'c_role_group',
+            'c_role_permissions',
+            //'c_role_user',
+            'c_student_publication',
+            'c_student_publication_assignment',
+            //'c_student_publication_comment',
+            //'c_student_publication_rel_document',
+            //'c_student_publication_rel_user',
+            //'c_survey',
+            //'c_survey_answer',
+            'c_survey_group',
+            //'c_survey_invitation',
+            //'c_survey_question',
+            //'c_survey_question_option',
+            'c_thematic',
+            'c_thematic_advance',
+            'c_thematic_plan',
+            'c_tool',
+            //'c_tool_intro',
+            'c_userinfo_content',
+            'c_userinfo_def',
+            'c_wiki',
+            //'c_wiki_conf',
+            'c_wiki_discuss',
+            'c_wiki_mailcue'
+        ];
+
+        foreach ($tables as $table) {
+            if ($schema->hasTable($table)) {
+                $this->addSql("ALTER TABLE $table MODIFY COLUMN id INT NOT NULL");
+                $this->addSql("ALTER TABLE $table MODIFY COLUMN c_id INT NOT NULL");
+                $this->addSql("ALTER TABLE $table DROP PRIMARY KEY");
+                $this->addSql("ALTER TABLE $table MODIFY COLUMN id INT NULL");
+                $this->addSql("ALTER TABLE $table ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+            }
+        }
+
+        if ($schema->hasTable('c_attendance_calendar_rel_group')) {
+            $this->addSql("ALTER TABLE c_attendance_calendar_rel_group MODIFY COLUMN id INT NOT NULL");
+            $this->addSql("ALTER TABLE c_attendance_calendar_rel_group DROP PRIMARY KEY");
+            $this->addSql("ALTER TABLE c_attendance_calendar_rel_group MODIFY COLUMN id INT NULL DEFAULT NULL");
+            $this->addSql("ALTER TABLE c_attendance_calendar_rel_group ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+        }
+
+        $this->addSql("ALTER TABLE c_attendance_sheet MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_attendance_sheet DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_attendance_sheet ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog MODIFY COLUMN blog_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_blog MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog MODIFY COLUMN blog_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog ADD COLUMN iid int  NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_comment MODIFY COLUMN comment_id int NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_comment MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_comment DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_comment MODIFY COLUMN comment_id int DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_comment ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_post MODIFY COLUMN post_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_post MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_post DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_post MODIFY COLUMN post_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_post ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_rating MODIFY COLUMN rating_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_rating MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_rating DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_rating MODIFY COLUMN rating_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_rating ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_rel_user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_rel_user MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_rel_user MODIFY COLUMN blog_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_rel_user MODIFY COLUMN user_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_rel_user ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_task MODIFY COLUMN task_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_task MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_blog_task DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_task MODIFY COLUMN task_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_task ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_blog_task_rel_user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_blog_task_rel_user MODIFY COLUMN blog_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_task_rel_user MODIFY COLUMN user_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_task_rel_user MODIFY COLUMN task_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_blog_task_rel_user ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_calendar_event_repeat DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat MODIFY COLUMN cal_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_calendar_event_repeat_not DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat_not MODIFY COLUMN cal_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat_not MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_calendar_event_repeat_not ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_dropbox_category MODIFY COLUMN cat_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_category DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_dropbox_category MODIFY COLUMN cat_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_category MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_category ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_dropbox_feedback MODIFY COLUMN feedback_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_feedback DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_dropbox_feedback MODIFY COLUMN feedback_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_feedback MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_feedback ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_dropbox_person DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_dropbox_person MODIFY COLUMN file_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_person MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_person ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_dropbox_post DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_dropbox_post MODIFY COLUMN file_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_post MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_dropbox_post ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_forum_category MODIFY COLUMN cat_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_category DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_forum_category MODIFY COLUMN cat_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_forum_category MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_category ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_forum_forum MODIFY COLUMN forum_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_forum DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_forum_forum MODIFY COLUMN forum_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_forum_forum MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_forum ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_forum_post MODIFY COLUMN post_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_post DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_forum_post MODIFY COLUMN post_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_forum_post MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_post ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_forum_thread MODIFY COLUMN thread_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_thread DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_forum_thread MODIFY COLUMN forum_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_forum_thread MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_forum_thread MODIFY COLUMN thread_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_forum_thread ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_forum_thread ADD COLUMN thread_peer_qualify tinyint default 0");
+
+        $this->addSql("ALTER TABLE c_glossary MODIFY COLUMN glossary_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_glossary MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_glossary DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_glossary MODIFY COLUMN glossary_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_glossary ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_notebook MODIFY COLUMN notebook_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_notebook MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_notebook DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_notebook MODIFY COLUMN notebook_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_notebook ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_online_connected MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_online_connected DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_online_connected ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        // For some reason c_tool_intro.id is a varchar in 1.9.x
+        $this->addSql("ALTER TABLE c_tool_intro MODIFY COLUMN id VARCHAR(50) NOT NULL");
+        $this->addSql("ALTER TABLE c_tool_intro MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_tool_intro MODIFY COLUMN session_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_tool_intro DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_tool_intro MODIFY COLUMN session_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_tool_intro ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_quiz_answer MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_quiz_answer MODIFY COLUMN id_auto int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_quiz_answer DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_quiz_answer MODIFY COLUMN id_auto int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_quiz_answer ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_quiz_question_rel_category MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_quiz_question_rel_category MODIFY COLUMN question_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_quiz_question_rel_category DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_quiz_question_rel_category MODIFY COLUMN question_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_quiz_question_rel_category ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE session_rel_user MODIFY COLUMN id_session int");
+        $this->addSql("ALTER TABLE session_rel_user MODIFY COLUMN id_user int");
+        $this->addSql("ALTER TABLE session_rel_user MODIFY COLUMN relation_type int unsigned DEFAULT 0");
+        $this->addSql("ALTER TABLE session_rel_user DROP PRIMARY KEY");
+
+        $this->addSql("ALTER TABLE session_rel_user CHANGE id_session session_id int");
+        $this->addSql("ALTER TABLE session_rel_user CHANGE id_user user_id int");
+        $this->addSql("DELETE FROM session_rel_user WHERE user_id NOT IN (SELECT user_id FROM user)");
+        $this->addSql("ALTER TABLE session_rel_user ADD COLUMN id int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_item_property CHANGE id_session session_id int");
+        $this->addSql("ALTER TABLE course_rel_user CHANGE tutor_id is_tutor int");
+
+        $this->addSql("ALTER TABLE c_quiz_rel_question MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_quiz_rel_question DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_quiz_rel_question MODIFY COLUMN question_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_quiz_rel_question MODIFY COLUMN exercice_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_quiz_rel_question ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_role MODIFY COLUMN role_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_role MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_role DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_role MODIFY COLUMN role_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_role ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_role_user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_role_user MODIFY COLUMN role_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_role_user MODIFY COLUMN user_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_role_user MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_role_user ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_survey MODIFY COLUMN survey_id int NOT NULL");
+        $this->addSql("ALTER TABLE c_survey MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_survey DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_survey MODIFY COLUMN survey_id int NULL");
+        $this->addSql("ALTER TABLE c_survey ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_survey_answer MODIFY COLUMN answer_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_answer MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_answer DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_survey_answer MODIFY COLUMN answer_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_survey_answer ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_survey_invitation MODIFY COLUMN survey_invitation_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_invitation MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_invitation DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_survey_invitation MODIFY COLUMN survey_invitation_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_survey_invitation ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_survey_question MODIFY COLUMN question_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_question MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_question DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_survey_question MODIFY COLUMN question_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_survey_question ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_survey_question_option MODIFY COLUMN question_option_id int unsigned NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_question_option MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_survey_question_option DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_survey_question_option MODIFY COLUMN question_option_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_survey_question_option ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        $this->addSql("ALTER TABLE c_wiki_conf DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE c_wiki_conf MODIFY COLUMN page_id int unsigned DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_wiki_conf MODIFY COLUMN c_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_wiki_conf ADD COLUMN iid int NOT NULL PRIMARY KEY AUTO_INCREMENT");
+
+        // Course
+        $this->addSql("ALTER TABLE c_survey ADD COLUMN visible_results INT UNSIGNED DEFAULT 0");
+        $this->addSql("ALTER TABLE c_survey_invitation ADD COLUMN group_id INT NOT NULL");
+        $this->addSql("ALTER TABLE c_lp_item ADD COLUMN prerequisite_min_score float");
+        $this->addSql("ALTER TABLE c_lp_item ADD COLUMN prerequisite_max_score float");
+        $this->addSql("ALTER TABLE c_group_info ADD COLUMN status tinyint DEFAULT 1");
+        $this->addSql("ALTER TABLE c_student_publication ADD COLUMN document_id int DEFAULT 0");
+        $this->addSql("ALTER TABLE c_lp_item MODIFY COLUMN description VARCHAR(511) DEFAULT ''");
+        $this->addSql("ALTER TABLE course_category MODIFY COLUMN auth_course_child VARCHAR(40) DEFAULT 'TRUE' ");
+        $this->addSql("ALTER TABLE course_category MODIFY COLUMN auth_cat_child VARCHAR(40) DEFAULT 'TRUE'");
+        $this->addSql("ALTER TABLE c_quiz_answer MODIFY COLUMN hotspot_type varchar(40) default NULL");
+        $this->addSql("ALTER TABLE c_tool MODIFY COLUMN target varchar(20) NOT NULL default '_self' ");
+        $this->addSql("ALTER TABLE c_link MODIFY COLUMN on_homepage char(10) NOT NULL default '0' ");
+        $this->addSql("ALTER TABLE c_blog_rating MODIFY COLUMN rating_type char(40) NOT NULL default 'post' ");
+        $this->addSql("ALTER TABLE c_survey MODIFY COLUMN anonymous char(10) NOT NULL default '0'");
+        $this->addSql("ALTER TABLE c_course_setting MODIFY COLUMN value varchar(255) default ''");
+
+        $this->addSql("UPDATE course_field SET field_type = 13 WHERE field_variable = 'special_course'");
+        $this->addSql("UPDATE user SET registration_date = NULL WHERE registration_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE user SET expiration_date = NULL WHERE expiration_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE track_e_default SET default_date = NULL WHERE default_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE track_e_lastaccess SET access_date = NULL WHERE access_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE track_e_downloads SET down_date = NULL WHERE down_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE track_e_access SET access_date = NULL WHERE access_date = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE track_e_access SET c_id = (SELECT id FROM course WHERE code = access_cours_code)");
+        $this->addSql("UPDATE track_e_default SET c_id = (SELECT id FROM course WHERE code = default_cours_code)");
+        $this->addSql("UPDATE track_e_lastaccess SET c_id = (SELECT id FROM course WHERE code = access_cours_code)");
+        $this->addSql("UPDATE track_e_exercices SET c_id = (SELECT id FROM course WHERE code = exe_cours_id)");
+        $this->addSql("UPDATE track_e_downloads SET c_id = (SELECT id FROM course WHERE code = down_cours_id)");
+        $this->addSql("UPDATE track_e_hotpotatoes SET c_id = (SELECT id FROM course WHERE code = exe_cours_id)");
+        $this->addSql("UPDATE track_e_links SET c_id = (SELECT id FROM course WHERE code = links_cours_id)");
+        $this->addSql("UPDATE track_e_course_access SET c_id = (SELECT id FROM course WHERE code = course_code)");
+        $this->addSql("UPDATE track_e_online SET c_id = (SELECT id FROM course WHERE code = course)");
+        $this->addSql("UPDATE track_e_attempt SET c_id = (SELECT id FROM course WHERE code = course_code)");
+        $this->addSql("UPDATE course_field_values SET c_id = (SELECT id FROM course WHERE code = course_code)");
+        $this->addSql("UPDATE session_rel_course_rel_user SET c_id = (SELECT id FROM course WHERE code = course_code)");
+        $this->addSql('DELETE FROM session_rel_course WHERE course_code NOT IN (SELECT code FROM course)');
+        $this->addSql("UPDATE session_rel_course SET c_id = (SELECT id FROM course WHERE code = course_code)");
+
+        $this->addSql("DELETE FROM access_url_rel_course WHERE course_code NOT IN (SELECT code FROM course)");
+        $this->addSql("UPDATE access_url_rel_course SET c_id = (SELECT id FROM course WHERE code = course_code)");
+
+        $this->addSql("ALTER TABLE settings_current DROP INDEX unique_setting");
+        $this->addSql("ALTER TABLE settings_options DROP INDEX unique_setting_option");
+
+        $this->addSql("DELETE FROM settings_current WHERE variable = 'wcag_anysurfer_public_pages'");
+
+        $this->addSql("DELETE FROM settings_current WHERE variable = 'wcag_anysurfer_public_pages'");
+        $this->addSql("DELETE FROM settings_options WHERE variable = 'wcag_anysurfer_public_pages'");
+        $this->addSql("DELETE FROM settings_current WHERE variable = 'advanced_filemanager'");
+        $this->addSql("DELETE FROM settings_options WHERE variable = 'advanced_filemanager'");
+
+        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('institution_address', NULL, 'textfield', 'Platform', '', 'InstitutionAddressTitle', 'InstitutionAddressComment', NULL, NULL, 1)");
+        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('prevent_session_admins_to_manage_all_users', NULL, 'radio', 'Session', 'false', 'PreventSessionAdminsToManageAllUsersTitle', 'PreventSessionAdminsToManageAllUsersComment', NULL, NULL, 1)");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('prevent_session_admins_to_manage_all_users', 'true', 'Yes'), ('prevent_session_admins_to_manage_all_users', 'false', 'No')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'none', 'None')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'exercise', 'Exercise')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'lp', 'Learning path')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('show_glossary_in_extra_tools', 'exercise_and_lp', 'ExerciseAndLearningPath')");
+        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('documents_default_visibility_defined_in_course', NULL,'radio','Tools','false','DocumentsDefaultVisibilityDefinedInCourseTitle','DocumentsDefaultVisibilityDefinedInCourseComment',NULL, NULL, 1)");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('documents_default_visibility_defined_in_course', 'true', 'Yes')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('documents_default_visibility_defined_in_course', 'false', 'No')");
+        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('enabled_mathjax', NULL, 'radio', 'Editor', 'false', 'EnableMathJaxTitle', 'EnableMathJaxComment', NULL, NULL, 0)");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('enabled_mathjax', 'true', 'Yes')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('enabled_mathjax', 'false', 'No')");
+
+        $this->addSql("INSERT INTO language (original_name, english_name, isocode, dokeos_folder, available) VALUES ('Føroyskt', 'faroese', 'fo', 'faroese', 0), ('Tagalog', 'tagalog', 'tl', 'tagalog',1), ('Tibetan', 'tibetan', 'bo', 'tibetan', 0), ('isiXhosa', 'xhosa', 'xh', 'xhosa', 0)");
+        $this->addSql("DELETE FROM settings_options WHERE variable = 'show_glossary_in_extra_tools'");
+
+        $this->addSql("ALTER TABLE c_student_publication MODIFY COLUMN date_of_qualification DATETIME NULL DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_student_publication MODIFY COLUMN sent_date DATETIME NULL DEFAULT NULL");
+        $this->addSql("UPDATE c_student_publication SET date_of_qualification = NULL WHERE date_of_qualification = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE c_student_publication SET sent_date = NULL WHERE sent_date = '0000-00-00 00:00:00'");
+
+        $this->addSql("ALTER TABLE c_student_publication_assignment MODIFY COLUMN expires_on DATETIME NULL DEFAULT NULL");
+        $this->addSql("ALTER TABLE c_student_publication_assignment MODIFY COLUMN ends_on DATETIME NULL DEFAULT NULL");
+        $this->addSql("UPDATE c_student_publication_assignment SET expires_on = NULL WHERE expires_on = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE c_student_publication_assignment SET ends_on = NULL WHERE ends_on = '0000-00-00 00:00:00'");
+
+        $this->addSql("UPDATE settings_current SET type = 'checkbox' WHERE variable = 'registration' AND category = 'User'");
+
+        $this->addSql("UPDATE settings_current SET selected_value = 'UTF-8' WHERE variable = 'platform_charset'");
+
+        $this->addSql("ALTER TABLE course_rel_user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE course_rel_user ADD COLUMN id INT NOT NULL PRIMARY KEY AUTO_INCREMENT");
+        $this->addSql("ALTER TABLE course_rel_user MODIFY COLUMN user_id INT NULL");
+
+        $this->addSql("ALTER TABLE user MODIFY COLUMN user_id INT NULL");
+
+        $this->addSql("ALTER TABLE access_url_rel_course DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE access_url_rel_course ADD COLUMN id INT NOT NULL PRIMARY KEY AUTO_INCREMENT");
+        $this->addSql("ALTER TABLE access_url_rel_course DROP COLUMN course_code");
+        $this->addSql("ALTER TABLE access_url_rel_course ADD INDEX idx_select_c (c_id)");
+        $this->addSql("ALTER TABLE access_url_rel_course ADD INDEX idx_select_u (access_url_id)");
+
+        $this->addSql("ALTER TABLE access_url ADD COLUMN url_type TINYINT(1) NULL");
+
+        $this->addSql("ALTER TABLE course_rel_user ADD INDEX idx_select_c (c_id)");
+
+        $this->addSql("ALTER TABLE track_e_uploads ADD COLUMN c_id INT NOT NULL");
+        $this->addSql("UPDATE track_e_uploads SET c_id = (SELECT id FROM course WHERE code = upload_cours_id)");
+
+        //postUp
+        $this->addSql("ALTER TABLE track_e_access DROP COLUMN access_cours_code");
+        $this->addSql("ALTER TABLE track_e_default DROP COLUMN default_cours_code");
+        $this->addSql("ALTER TABLE track_e_lastaccess DROP COLUMN access_cours_code");
+        $this->addSql("ALTER TABLE track_e_exercices DROP COLUMN exe_cours_id");
+        $this->addSql("ALTER TABLE track_e_downloads DROP COLUMN down_cours_id");
+        $this->addSql("ALTER TABLE track_e_hotpotatoes DROP COLUMN exe_cours_id");
+        $this->addSql("ALTER TABLE track_e_links DROP COLUMN links_cours_id");
+        $this->addSql("ALTER TABLE track_e_course_access DROP COLUMN course_code");
+        $this->addSql("ALTER TABLE track_e_online DROP COLUMN course");
+        $this->addSql("ALTER TABLE track_e_attempt DROP COLUMN course_code");
+
+        $this->addSql("ALTER TABLE course_rel_user DROP COLUMN group_id");
+        $this->addSql("ALTER TABLE course_rel_user DROP COLUMN role");
+
+        $this->addSql("DROP TABLE track_c_countries");
+        $this->addSql("DROP TABLE track_c_browsers");
+        $this->addSql("DROP TABLE track_c_os");
+        $this->addSql("DROP TABLE track_c_providers");
+        $this->addSql("DROP TABLE track_c_referers");
+    }
+
+    /**
+     * We don't allow downgrades yet
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 181 - 0
app/Migrations/Schema/V110/Version20150423093100.php

@@ -0,0 +1,181 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Class Version20150423093100
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150423093100 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    public function up(Schema $schema)
+    {
+        // Sequence changes
+        if (!$schema->hasTable('sequence_rule')) {
+            $sequenceRule = $schema->createTable('sequence_rule');
+            $sequenceRule->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceRule->addColumn('text', Type::TEXT);
+            $sequenceRule->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_condition')) {
+            $sequenceCondition = $schema->createTable('sequence_condition');
+            $sequenceCondition->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceCondition->addColumn('description', Type::TEXT);
+            $sequenceCondition->addColumn('mat_op', Type::INTEGER);
+            $sequenceCondition->addColumn('param', Type::FLOAT);
+            $sequenceCondition->addColumn('act_true', Type::INTEGER);
+            $sequenceCondition->addColumn('act_false', Type::INTEGER);
+            $sequenceCondition->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_rule_condition')) {
+            $sequenceRuleCondition = $schema->createTable('sequence_rule_condition');
+            $sequenceRuleCondition->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceRuleCondition->addColumn('sequence_rule_id', Type::INTEGER)->setNotnull(false);
+            $sequenceRuleCondition->addColumn('sequence_condition_id', Type::INTEGER)->setNotnull(false);
+            $sequenceRuleCondition->setPrimaryKey(['id']);
+            $sequenceRuleCondition->addIndex(['sequence_rule_id']);
+            $sequenceRuleCondition->addIndex(['sequence_condition_id']);
+            $sequenceRuleCondition->addForeignKeyConstraint('sequence_condition', ['sequence_condition_id'], ['id']);
+            $sequenceRuleCondition->addForeignKeyConstraint('sequence_rule', ['sequence_rule_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence_method')) {
+            $sequenceMethod = $schema->createTable('sequence_method');
+            $sequenceMethod->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceMethod->addColumn('description', Type::TEXT);
+            $sequenceMethod->addColumn('formula', Type::TEXT);
+            $sequenceMethod->addColumn('assign', Type::INTEGER);
+            $sequenceMethod->addColumn('met_type', Type::INTEGER);
+            $sequenceMethod->addColumn('act_false', Type::INTEGER);
+            $sequenceMethod->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_rule_method')) {
+            $sequenceRuleMethod = $schema->createTable('sequence_rule_method');
+            $sequenceRuleMethod->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceRuleMethod->addColumn('sequence_rule_id', Type::INTEGER)->setNotnull(false);
+            $sequenceRuleMethod->addColumn('sequence_method_id', Type::INTEGER)->setNotnull(false);
+            $sequenceRuleMethod->addColumn('method_order', Type::INTEGER);
+            $sequenceRuleMethod->setPrimaryKey(['id']);
+            $sequenceRuleMethod->addIndex(['sequence_rule_id']);
+            $sequenceRuleMethod->addIndex(['sequence_method_id']);
+            $sequenceRuleMethod->addForeignKeyConstraint('sequence_method', ['sequence_method_id'], ['id']);
+            $sequenceRuleMethod->addForeignKeyConstraint('sequence_rule', ['sequence_rule_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence_variable')) {
+            $sequenceVariable = $schema->createTable('sequence_variable');
+            $sequenceVariable->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceVariable->addColumn('name', Type::STRING)->setLength(255)->setNotnull(false);
+            $sequenceVariable->addColumn('description', Type::TEXT)->setNotnull(false);
+            $sequenceVariable->addColumn('default_val', Type::STRING)->setLength(255)->setNotnull(false);
+            $sequenceVariable->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_formula')) {
+            $sequenceFormula = $schema->createTable('sequence_formula');
+            $sequenceFormula->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceFormula->addColumn('sequence_method_id', Type::INTEGER)->setNotnull(false);
+            $sequenceFormula->addColumn('sequence_variable_id', Type::INTEGER)->setNotnull(false);
+            $sequenceFormula->setPrimaryKey(['id']);
+            $sequenceFormula->addIndex(['sequence_method_id']);
+            $sequenceFormula->addIndex(['sequence_variable_id']);
+            $sequenceFormula->addForeignKeyConstraint('sequence_variable', ['sequence_variable_id'], ['id']);
+            $sequenceFormula->addForeignKeyConstraint('sequence_method', ['sequence_method_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence_valid')) {
+            $sequenceValid = $schema->createTable('sequence_valid');
+            $sequenceValid->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceValid->addColumn('sequence_variable_id', Type::INTEGER)->setNotnull(false);
+            $sequenceValid->addColumn('sequence_condition_id', Type::INTEGER)->setNotnull(false);
+            $sequenceValid->setPrimaryKey(['id']);
+            $sequenceValid->addIndex(['sequence_variable_id']);
+            $sequenceValid->addIndex(['sequence_condition_id']);
+            $sequenceValid->addForeignKeyConstraint('sequence_condition', ['sequence_condition_id'], ['id']);
+            $sequenceValid->addForeignKeyConstraint('sequence_variable', ['sequence_variable_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence_type_entity')) {
+            $sequenceTypeEntity = $schema->createTable('sequence_type_entity');
+            $sequenceTypeEntity->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceTypeEntity->addColumn('name', Type::STRING)->setLength(255);
+            $sequenceTypeEntity->addColumn('description', Type::TEXT);
+            $sequenceTypeEntity->addColumn('ent_table', Type::STRING)->setLength(255);
+            $sequenceTypeEntity->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_row_entity')) {
+            $sequenceRowEntity = $schema->createTable('sequence_row_entity');
+            $sequenceRowEntity->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceRowEntity->addColumn('sequence_type_entity_id', Type::INTEGER)->setNotnull(false);
+            $sequenceRowEntity->addColumn('c_id', Type::INTEGER);
+            $sequenceRowEntity->addColumn('session_id', Type::INTEGER);
+            $sequenceRowEntity->addColumn('row_id', Type::INTEGER);
+            $sequenceRowEntity->addColumn('name', Type::STRING)->setLength(255);
+            $sequenceRowEntity->setPrimaryKey(['id']);
+            $sequenceRowEntity->addIndex(['sequence_type_entity_id']);
+            $sequenceRowEntity->addForeignKeyConstraint('sequence_type_entity', ['sequence_type_entity_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence')) {
+            $sequence = $schema->createTable('sequence');
+            $sequence->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequence->addColumn('name', Type::STRING)->setLength(255);
+            $sequence->addColumn('graph', Type::TEXT)->setNotnull(false);
+            $sequence->addColumn('created_at', Type::DATETIME);
+            $sequence->addColumn('updated_at', Type::DATETIME);
+            $sequence->setPrimaryKey(['id']);
+        }
+
+        if (!$schema->hasTable('sequence_value')) {
+            $sequenceValue = $schema->createTable('sequence_value');
+            $sequenceValue->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceValue->addColumn('sequence_row_entity_id', Type::INTEGER)->setNotnull(false);
+            $sequenceValue->addColumn('user_id', Type::INTEGER);
+            $sequenceValue->addColumn('advance', Type::FLOAT);
+            $sequenceValue->addColumn('complete_items', Type::INTEGER);
+            $sequenceValue->addColumn('total_items', Type::INTEGER);
+            $sequenceValue->addColumn('success', Type::BOOLEAN);
+            $sequenceValue->addColumn('success_date', Type::DATETIME)->setNotnull(false);
+            $sequenceValue->addColumn('available', Type::BOOLEAN);
+            $sequenceValue->addColumn('available_start_date', Type::DATETIME)->setNotnull(false);
+            $sequenceValue->addColumn('available_end_date', Type::DATETIME)->setNotnull(false);
+            $sequenceValue->setPrimaryKey(['id']);
+            $sequenceValue->addIndex(['sequence_row_entity_id']);
+            $sequenceValue->addForeignKeyConstraint('sequence_row_entity', ['sequence_row_entity_id'], ['id']);
+        }
+
+        if (!$schema->hasTable('sequence_resource')) {
+            $sequenceResource = $schema->createTable('sequence_resource');
+            $sequenceResource->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+            $sequenceResource->addColumn('sequence_id', Type::INTEGER)->setNotnull(false);
+            $sequenceResource->addColumn('type', Type::INTEGER);
+            $sequenceResource->addColumn('resource_id', Type::INTEGER);
+            $sequenceResource->setPrimaryKey(['id']);
+            $sequenceResource->addIndex(['sequence_id']);
+            $sequenceResource->addForeignKeyConstraint('sequence', ['sequence_id'], ['id']);
+        }
+    }
+
+    /**
+     * We don't allow downgrades yet
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 77 - 0
app/Migrations/Schema/V110/Version20150504182600.php

@@ -0,0 +1,77 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150504182600
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150504182600 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    public function up(Schema $schema)
+    {
+        // Set parent language to Spanish for all close-by languages. Same for Italian,
+        // French, Portuguese and Chinese
+        $connection = $this->connection;
+        $sql = "SELECT id, english_name
+                FROM language
+                WHERE english_name IN ('spanish', 'italian', 'portuguese', 'simpl_chinese', 'french')";
+        $result = $connection->executeQuery($sql);
+        $dataList = $result->fetchAll();
+        $languages = array();
+
+        if (!empty($dataList)) {
+            foreach ($dataList as $data) {
+                $languages[$data['english_name']] = $data['id'];
+            }
+        }
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'quechua_cusco'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'galician'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'esperanto'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'catalan'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'asturian'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['spanish'] . " WHERE english_name = 'friulian'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['french'] . " WHERE english_name = 'occitan'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['portuguese'] . " WHERE english_name = 'brazilian'
+        ");
+        $this->addSql("
+            UPDATE language SET parent_id = " . $languages['simpl_chinese'] . " WHERE english_name = 'trad_chinese'
+        ");
+    }
+
+    /**
+     * We don't allow downgrades yet
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("
+            UPDATE language SET parent_id = 0 WHERE english_name IN ('trad_chinese', 'brazilian', 'occitan', 'friulian', 'asturian', 'catalan', 'esperanto', 'galician', 'quechua_cusco')
+        ");
+    }
+}

+ 64 - 0
app/Migrations/Schema/V110/Version20150505132304.php

@@ -0,0 +1,64 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Extra fields changes
+ */
+class Version20150505132304 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // Force table creation in order to do updates/insert later.
+        $this->connection->executeQuery('CREATE TABLE IF NOT EXISTS extra_field (id INT AUTO_INCREMENT NOT NULL, extra_field_type INT NOT NULL, field_type INT NOT NULL, variable VARCHAR(64) NOT NULL, display_text VARCHAR(255) DEFAULT NULL, default_value LONGTEXT, field_order INT DEFAULT NULL, visible TINYINT(1) DEFAULT NULL, changeable TINYINT(1) DEFAULT NULL, filter TINYINT(1) DEFAULT NULL, created_at DATETIME NOT NULL, PRIMARY KEY(id))');
+        $this->connection->executeQuery('CREATE TABLE IF NOT EXISTS extra_field_values (id INT AUTO_INCREMENT NOT NULL, value VARCHAR(255) DEFAULT NULL, field_id INT NOT NULL, item_id INT NOT NULL, comment LONGTEXT, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id))');
+        $this->connection->executeQuery('CREATE TABLE IF NOT EXISTS extra_field_options (id INT AUTO_INCREMENT NOT NULL, field_id INT DEFAULT NULL, option_value LONGTEXT, display_text VARCHAR(64) DEFAULT NULL, option_order INT DEFAULT NULL, priority VARCHAR(255) DEFAULT NULL, priority_message VARCHAR(255) DEFAULT NULL, INDEX IDX_A572E3AE443707B0 (field_id), PRIMARY KEY(id))');
+
+        if (!$schema->hasTable('extra_field_options')) {
+            $this->connection->executeQuery(
+                'ALTER TABLE extra_field_options ADD CONSTRAINT FK_A572E3AE443707B0 FOREIGN KEY (field_id) REFERENCES extra_field (id)'
+            );
+        }
+
+        $this->addSql('CREATE TABLE IF NOT EXISTS extra_field_option_rel_field_option (id INT AUTO_INCREMENT NOT NULL, field_id INT DEFAULT NULL, field_option_id INT DEFAULT NULL, related_field_option_id INT DEFAULT NULL, role_id INT DEFAULT NULL, UNIQUE INDEX idx (field_id, role_id, field_option_id, related_field_option_id), PRIMARY KEY(id))');
+
+        /*
+        $this->addSql('DROP TABLE course_field');
+        $this->addSql('DROP TABLE course_field_options');
+        $this->addSql('DROP TABLE course_field_values');
+        $this->addSql('DROP TABLE session_field');
+        $this->addSql('DROP TABLE session_field_options');
+        $this->addSql('DROP TABLE session_field_values');
+        $this->addSql('DROP TABLE user_field');
+        $this->addSql('DROP TABLE user_field_options');
+        $this->addSql('DROP TABLE user_field_values');
+        */
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function postUp(Schema $schema)
+    {
+
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE extra_field_options DROP FOREIGN KEY FK_A572E3AE443707B0');
+        $this->addSql('DROP TABLE extra_field_option_rel_field_option');
+        $this->addSql('DROP TABLE extra_field_options');
+        $this->addSql('DROP TABLE extra_field');
+        $this->addSql('DROP TABLE extra_field_values');
+    }
+}

+ 77 - 0
app/Migrations/Schema/V110/Version20150505142900.php

@@ -0,0 +1,77 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Class Version20150505142900
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150505142900 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    public function up(Schema $schema)
+    {
+        // Create table for video chat
+        if (!$schema->hasTable('chat_video')) {
+            $chatVideoTable = $schema->createTable('chat_video');
+            $chatVideoTable->addColumn(
+                'id',
+                Type::INTEGER,
+                ['autoincrement' => true, 'notnull' => true]
+            );
+            $chatVideoTable->addColumn(
+                'from_user',
+                Type::INTEGER,
+                ['notnull' => true]
+            );
+            $chatVideoTable->addColumn(
+                'to_user',
+                Type::INTEGER,
+                ['notnull' => true]
+            );
+            $chatVideoTable->addColumn(
+                'room_name',
+                Type::STRING,
+                ['length' => 255, 'notnull' => true]
+            );
+            $chatVideoTable->addColumn(
+                'datetime',
+                Type::DATETIME,
+                ['notnull' => true]
+            );
+            $chatVideoTable->setPrimaryKey(['id']);
+            $chatVideoTable->addIndex(
+                ['from_user'],
+                'idx_chat_video_from_user'
+            );
+            $chatVideoTable->addIndex(['to_user'], 'idx_chat_video_to_user');
+            $chatVideoTable->addIndex(
+                ['from_user', 'to_user'],
+                'idx_chat_video_users'
+            );
+            $chatVideoTable->addIndex(
+                ['room_name'],
+                'idx_chat_video_room_name'
+            );
+        }
+    }
+
+    /**
+     * We don't allow downgrades yet
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $schema->dropTable('chat_video');
+    }
+}

+ 242 - 0
app/Migrations/Schema/V110/Version20150507152600.php

@@ -0,0 +1,242 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150507152600
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150507152600 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     *
+     * @throws \Doctrine\DBAL\Schema\SchemaException
+     */
+    public function up(Schema $schema)
+    {
+        // Move some settings from configuration.php to the database
+        // Current settings categories are:
+        // Platform, Course, Session, Languages, User, Tools, Editor, Security,
+        // Tuning, Gradebook, Timezones, Tracking, Search, stylesheets (lowercase),
+        // LDAP, CAS, Shibboleth, Facebook
+
+        // Setting $_configuration['hide_home_top_when_connected'] = true;
+        $value = $this->getConfigurationValue('hide_home_top_when_connected');
+
+        $this->addSettingCurrent(
+            'hide_home_top_when_connected',
+            '',
+            'radio',
+            'Platform',
+            ($value ? 'true' : 'false'),
+            'HideHomeTopContentWhenLoggedInText',
+            'HideHomeTopContentWhenLoggedInComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No'],
+            ]
+        );
+
+        // Hide the global announcements for non-connected users
+        //$_configuration['hide_global_announcements_when_not_connected'] = true;
+        $value = $this->getConfigurationValue('hide_global_announcements_when_not_connected');
+        $this->addSettingCurrent(
+            'hide_global_announcements_when_not_connected',
+            '',
+            'radio',
+            'Platform',
+            ($value?'true':'false'),
+            'HideGlobalAnnouncementsWhenNotLoggedInText',
+            'HideGlobalAnnouncementsWhenNotLoggedInComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No'],
+            ]
+        );
+
+        // Use this course as template for all new courses (define course real ID as value)
+        //$_configuration['course_creation_use_template'] = 14;
+        $value = $this->getConfigurationValue('course_creation_use_template');
+        $this->addSettingCurrent(
+            'course_creation_use_template',
+            '',
+            'textfield',
+            'Course',
+            ($value?$value:''),
+            'CourseCreationUsesTemplateText',
+            'CourseCreationUsesTemplateComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No'],
+            ]
+        );
+
+        // Add password strength checker
+        //$_configuration['allow_strength_pass_checker'] = true;
+        $value = $this->getConfigurationValue('allow_strength_pass_checker');
+        $this->addSettingCurrent(
+            'allow_strength_pass_checker',
+            '',
+            'radio',
+            'Security',
+            ($value?'true':'false'),
+            'EnablePasswordStrengthCheckerText',
+            'EnablePasswordStrengthCheckerComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No'],
+            ]
+        );
+
+        // Enable captcha
+        // $_configuration['allow_captcha'] = true;
+        $value = $this->getConfigurationValue('allow_captcha');
+        $this->addSettingCurrent(
+            'allow_captcha',
+            '',
+            'radio',
+            'Security',
+            ($value?'true':'false'),
+            'EnableCaptchaText',
+            'EnableCaptchaComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+        // Prevent account from logging in for a certain amount of time
+        // if captcha is wrong for the specified number of times
+        //$_configuration['captcha_number_mistakes_to_block_account'] = 5;
+        $value = $this->getConfigurationValue('captcha_number_mistakes_to_block_account');
+        $this->addSettingCurrent(
+            'captcha_number_mistakes_to_block_account',
+            '',
+            'textfield',
+            'Security',
+            ($value?$value:5),
+            'CaptchaNumberOfMistakesBeforeBlockingAccountText',
+            'CaptchaNumberOfMistakesBeforeBlockingAccountComment',
+            null,
+            '',
+            1,
+            true,
+            false
+        );
+        // Prevent account from logging in for the specified number of minutes
+        //$_configuration['captcha_time_to_block'] = 5;//minutes
+        $value = $this->getConfigurationValue('captcha_time_to_block');
+        $this->addSettingCurrent(
+            'captcha_time_to_block',
+            '',
+            'textfield',
+            'Security',
+            ($value?$value:5),
+            'CaptchaTimeAccountIsLockedText',
+            'CaptchaTimeAccountIsLockedComment',
+            null,
+            '',
+            1,
+            true,
+            false
+        );
+
+        // Allow DRH role to access all content and users from the sessions he follows
+        //$_configuration['drh_can_access_all_session_content'] = true;
+        $value = $this->getConfigurationValue('drh_can_access_all_session_content');
+        $this->addSettingCurrent(
+            'drh_can_access_all_session_content',
+            '',
+            'radio',
+            'Session',
+            ($value?'true':'false'),
+            'DRHAccessToAllSessionContentText',
+            'DRHAccessToAllSessionContentComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Display group's forum in general forum tool
+        //$_configuration['display_groups_forum_in_general_tool'] = true;
+        $value = $this->getConfigurationValue('display_groups_forum_in_general_tool');
+        $this->addSettingCurrent(
+            'display_groups_forum_in_general_tool',
+            '',
+            'radio',
+            'Tools',
+            ($value?'true':'false'),
+            'ShowGroupForaInGeneralToolText',
+            'ShowGroupForaInGeneralToolComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Allow course tutors in sessions to add existing students to their session
+        //$_configuration['allow_tutors_to_assign_students_to_session'] = 'false';
+        $value = $this->getConfigurationValue('allow_tutors_to_assign_students_to_session');
+        $this->addSettingCurrent(
+            'allow_tutors_to_assign_students_to_session',
+            '',
+            'radio',
+            'Session',
+            ($value?'true':'false'),
+            'TutorsCanAssignStudentsToSessionsText',
+            'TutorsCanAssignStudentsToSessionsComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+    }
+
+    /**
+     * We don't allow downgrades yet
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("
+            DELETE FROM settings_options WHERE variable IN ('hide_home_top_when_connected', 'hide_global_announcements_when_not_connected', 'course_creation_use_template', 'allow_strength_pass_checker', 'allow_captcha', 'captcha_number_mistakes_to_block_account', 'captcha_time_to_block', 'drh_can_access_all_session_content', 'display_groups_forum_in_general_tool', 'allow_tutors_to_assign_students_to_session')
+        ");
+        $this->addSql("
+            DELETE FROM settings_current WHERE variable IN ('hide_home_top_when_connected', 'hide_global_announcements_when_not_connected', 'course_creation_use_template', 'allow_strength_pass_checker', 'allow_captcha', 'captcha_number_mistakes_to_block_account', 'captcha_time_to_block', 'drh_can_access_all_session_content', 'display_groups_forum_in_general_tool', 'allow_tutors_to_assign_students_to_session')
+        ");
+    }
+}

+ 43 - 0
app/Migrations/Schema/V110/Version20150511133949.php

@@ -0,0 +1,43 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Username changes
+ */
+class Version20150511133949 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE user ADD salt VARCHAR(255) NOT NULL');
+        $this->addSql('ALTER TABLE user ADD username_canonical VARCHAR(100) NOT NULL');
+        //$this->addSql('CREATE UNIQUE INDEX UNIQ_8D93D64992FC23A8 ON user (username_canonical)');
+        $this->addSql('ALTER TABLE user CHANGE password password VARCHAR(255) NOT NULL');
+
+        $this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url_changeable) VALUES ('allow_teachers_to_create_sessions', NULL,'radio','Session','false','AllowTeachersToCreateSessionsTitle','AllowTeachersToCreateSessionsComment', NULL, NULL, 0)");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('allow_teachers_to_create_sessions', 'true', 'Yes')");
+        $this->addSql("INSERT INTO settings_options (variable, value, display_text) VALUES ('allow_teachers_to_create_sessions', 'false', 'No')");
+
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE user DROP salt');
+        $this->addSql('DROP INDEX UNIQ_8D93D64992FC23A8 ON user');
+        $this->addSql('ALTER TABLE user DROP username_canonical');
+        $this->addSql('ALTER TABLE user CHANGE password password VARCHAR(50) NOT NULL COLLATE utf8_unicode_ci');
+
+        $this->addSql('DELETE FROM settings_current WHERE variable = "allow_teachers_to_create_sessions" ');
+        $this->addSql('DELETE FROM settings_options WHERE variable = "allow_teachers_to_create_sessions" ');
+    }
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20150519153200.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Username changes
+ */
+class Version20150519153200 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE session_rel_user ADD COLUMN registered_at DATETIME NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE session_rel_user DROP COLUMN registered_at');
+    }
+}

+ 31 - 0
app/Migrations/Schema/V110/Version20150521113600.php

@@ -0,0 +1,31 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Username changes
+ */
+class Version20150521113600 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_forum_thread MODIFY thread_replies int UNSIGNED NOT NULL DEFAULT 0');
+        $this->addSql('ALTER TABLE c_forum_thread MODIFY thread_views int UNSIGNED NOT NULL DEFAULT 0');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_forum_thread MODIFY thread_replies int NULL');
+        $this->addSql('ALTER TABLE c_forum_thread MODIFY thread_views int NULL');
+    }
+}

+ 49 - 0
app/Migrations/Schema/V110/Version20150522112023.php

@@ -0,0 +1,49 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Usergroup changes
+ */
+class Version20150522112023 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // Set 0 if there's no group category.
+        $this->addSql('UPDATE c_group_info SET category_id = 0 WHERE category_id = 2');
+
+        $this->addSql('ALTER TABLE usergroup ADD group_type INT NOT NULL, ADD created_at DATETIME NOT NULL, ADD updated_at DATETIME NOT NULL');
+        $this->addSql('ALTER TABLE usergroup ADD picture VARCHAR(255) DEFAULT NULL, ADD url VARCHAR(255) DEFAULT NULL, ADD visibility VARCHAR(255) NOT NULL, ADD allow_members_leave_group INT NOT NULL, CHANGE description description LONGTEXT');
+        $this->addSql('CREATE TABLE usergroup_rel_usergroup (id INT AUTO_INCREMENT NOT NULL, group_id INT NOT NULL, subgroup_id INT NOT NULL, relation_type INT NOT NULL, PRIMARY KEY(id))');
+        $this->addSql('ALTER TABLE usergroup_rel_user ADD relation_type INT');
+
+        if (!$schema->hasTable('access_url_rel_usergroup')) {
+            $this->addSql(
+                'CREATE TABLE access_url_rel_usergroup (id INT AUTO_INCREMENT NOT NULL, access_url_id INT NOT NULL, usergroup_id INT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB'
+            );
+            $sql = 'SELECT * FROM usergroup';
+            $result = $this->connection->query($sql);
+            $results = $result->fetchAll();
+            foreach ($results as $result) {
+                $groupId = $result['id'];
+                $sql = "INSERT INTO access_url_rel_usergroup (access_url_id, usergroup_id) VALUES ('1', '$groupId')";
+                $this->addSql($sql);
+            }
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP TABLE access_url_rel_usergroup');
+    }
+}

+ 821 - 0
app/Migrations/Schema/V110/Version20150522222222.php

@@ -0,0 +1,821 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150522222222
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150522222222 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        // The first ALTER queries here requires a check because the field might already exist
+        $connection = $this->connection;
+        $fieldExists = false;
+        $sql = "SELECT *
+                FROM user
+                LIMIT 1";
+        $result = $connection->executeQuery($sql);
+        $dataList = $result->fetchAll();
+        if (!empty($dataList)) {
+            foreach ($dataList as $data) {
+                if (isset($data['last_login'])) {
+                    $fieldExists = true;
+                }
+            }
+        }
+        if (!$fieldExists) {
+            $this->addSql('ALTER TABLE user ADD COLUMN last_login datetime DEFAULT NULL');
+        }
+        // calendar events comments
+        $fieldExists = false;
+        $sql = "SELECT *
+                FROM c_calendar_event
+                LIMIT 1";
+        $result = $connection->executeQuery($sql);
+        $dataList = $result->fetchAll();
+        if (!empty($dataList)) {
+            foreach ($dataList as $data) {
+                if (isset($data['comment'])) {
+                    $fieldExists = true;
+                }
+            }
+        }
+        if (!$fieldExists) {
+            $this->addSql("ALTER TABLE c_calendar_event ADD COLUMN comment TEXT");
+        }
+
+        // Move some settings from configuration.php to the database
+        // Current settings categories are:
+        // Platform, Course, Session, Languages, User, Tools, Editor, Security,
+        // Tuning, Gradebook, Timezones, Tracking, Search, stylesheets (lowercase),
+        // LDAP, CAS, Shibboleth, Facebook
+
+        // Allow select the return link in the LP view
+        $value = $this->getConfigurationValue('allow_lp_return_link');
+        $this->addSettingCurrent(
+            'allow_lp_return_link',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'true'),
+            'AllowLearningPathReturnLinkTitle',
+            'AllowLearningPathReturnLinkComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If true the export link is blocked.
+        $value = $this->getConfigurationValue('hide_scorm_export_link');
+        $this->addSettingCurrent(
+            'hide_scorm_export_link',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'false'),
+            'HideScormExportLinkTitle',
+            'HideScormExportLinkComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If true the copy link is blocked.
+        //$_configuration['hide_scorm_copy_link'] = false;
+        $value = $this->getConfigurationValue('hide_scorm_copy_link');
+        $this->addSettingCurrent(
+            'hide_scorm_copy_link',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'false'),
+            'HideScormCopyLinkTitle',
+            'HideScormCopyLinkComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If true the pdf export link is blocked.
+        //$_configuration['hide_scorm_pdf_link'] = false;
+        $value = $this->getConfigurationValue('hide_scorm_pdf_link');
+        $this->addSettingCurrent(
+            'hide_scorm_pdf_link',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'false'),
+            'HideScormPdfLinkTitle',
+            'HideScormPdfLinkComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Default session days before coach access
+        //$_configuration['session_days_before_coach_access'] = 0;
+        $value = $this->getConfigurationValue('session_days_before_coach_access');
+        $this->addSettingCurrent(
+            'session_days_before_coach_access',
+            '',
+            'textfield',
+            'Session',
+            ($value?$value:'0'),
+            'SessionDaysBeforeCoachAccessTitle',
+            'SessionDaysBeforeCoachAccessComment',
+            null,
+            '',
+            1,
+            true,
+            false
+        );
+
+
+        // Default session days after coach access
+        //$_configuration['session_days_after_coach_access'] = 0;
+        $value = $this->getConfigurationValue('session_days_after_coach_access');
+        $this->addSettingCurrent(
+            'session_days_after_coach_access',
+            '',
+            'textfield',
+            'Session',
+            ($value?$value:'0'),
+            'SessionDaysAfterCoachAccessTitle',
+            'SessionDaysAfterCoachAccessComment',
+            null,
+            '',
+            1,
+            true,
+            false
+        );
+
+        // PDF Logo header in app/Resources/public/css/themes/xxx/images/pdf_logo_header.png
+        //$_configuration['pdf_logo_header'] = false;
+        $value = $this->getConfigurationValue('pdf_logo_header');
+        $this->addSettingCurrent(
+            'pdf_logo_header',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'false'),
+            'PdfLogoHeaderTitle',
+            'PdfLogoHeaderComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Order inscription user list by official_code
+        //$_configuration['order_user_list_by_official_code'] = false;
+        $value = $this->getConfigurationValue('order_user_list_by_official_code');
+        $this->addSettingCurrent(
+            'order_user_list_by_official_code',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'false'),
+            'OrderUserListByOfficialCodeTitle',
+            'OrderUserListByOfficialCodeComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Default course setting "email_alert_manager_on_new_quiz"
+        //$_configuration['email_alert_manager_on_new_quiz'] = 1;
+        $value = $this->getConfigurationValue('email_alert_manager_on_new_quiz');
+        $this->addSettingCurrent(
+            'email_alert_manager_on_new_quiz',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'true'),
+            'AlertManagerOnNewQuizTitle',
+            'AlertManagerOnNewQuizComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Show official code in exercise report list.
+        //$_configuration['show_official_code_exercise_result_list'] = false;
+        $value = $this->getConfigurationValue('show_official_code_exercise_result_list');
+        $this->addSettingCurrent(
+            'show_official_code_exercise_result_list',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'ShowOfficialCodeInExerciseResultListTitle',
+            'ShowOfficialCodeInExerciseResultListComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+
+        // Hide private courses from course catalog
+        //$_configuration['course_catalog_hide_private'] = false;
+        $value = $this->getConfigurationValue('course_catalog_hide_private');
+        $this->addSettingCurrent(
+            'course_catalog_hide_private',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'false'),
+            'HidePrivateCoursesFromCourseCatalogTitle',
+            'HidePrivateCoursesFromCourseCatalogComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Display sessions catalog
+        // 0 = show only courses; 1 = show only sessions; 2 = show courses and sessions
+        //$_configuration['catalog_show_courses_sessions'] = 0;
+        $value = $this->getConfigurationValue('catalog_show_courses_sessions');
+        $this->addSettingCurrent(
+            'catalog_show_courses_sessions',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'0'),
+            'CoursesCatalogueShowSessionsTitle',
+            'CoursesCatalogueShowSessionsComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => '0', 'text' => 'CatalogueShowOnlyCourses'], 1 => ['value' => '1', 'text' => 'CatalogueShowOnlySessions'], 2 => ['value' => '2', 'text' => 'CatalogueShowCoursesAndSessions']]
+        );
+
+        // Auto detect language custom pages.
+        // $_configuration['auto_detect_language_custom_pages'] = true;
+        $value = $this->getConfigurationValue('auto_detect_language_custom_pages');
+        $this->addSettingCurrent(
+            'auto_detect_language_custom_pages',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'true'),
+            'AutoDetectLanguageCustomPagesTitle',
+            'AutoDetectLanguageCustomPagesComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Show reduce LP report
+        //$_configuration['lp_show_reduced_report'] = false;
+        $value = $this->getConfigurationValue('lp_show_reduced_report');
+        $this->addSettingCurrent(
+            'lp_show_reduced_report',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'LearningPathShowReducedReportTitle',
+            'LearningPathShowReducedReportComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        //Allow session-to-session copy
+        //$_configuration['allow_session_course_copy_for_teachers'] = true;
+        $value = $this->getConfigurationValue('allow_session_course_copy_for_teachers');
+        $this->addSettingCurrent(
+            'allow_session_course_copy_for_teachers',
+            '',
+            'radio',
+            'Session',
+            ($value?$value:'false'),
+            'AllowSessionCourseCopyForTeachersTitle',
+            'AllowSessionCourseCopyForTeachersComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Hide the logout button
+        //$_configuration['hide_logout_button'] = true;
+        $value = $this->getConfigurationValue('hide_logout_button');
+        $this->addSettingCurrent(
+            'hide_logout_button',
+            '',
+            'radio',
+            'Security',
+            ($value?$value:'false'),
+            'HideLogoutButtonTitle',
+            'HideLogoutButtonComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Prevent redirecting admin to admin page
+        //$_configuration['redirect_admin_to_courses_list'] = true;
+        $value = $this->getConfigurationValue('redirect_admin_to_courses_list');
+        $this->addSettingCurrent(
+            'redirect_admin_to_courses_list',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'false'),
+            'RedirectAdminToCoursesListTitle',
+            'RedirectAdminToCoursesListComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Shows the custom course icon instead of the classic green board icon
+        //$_configuration['course_images_in_courses_list'] = false;
+        $value = $this->getConfigurationValue('course_images_in_courses_list');
+        $this->addSettingCurrent(
+            'course_images_in_courses_list',
+            '',
+            'radio',
+            'Course',
+            ($value?$value:'false'),
+            'CourseImagesInCoursesListTitle',
+            'CourseImagesInCoursesListComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Which student publication will be taken when connected to the gradebook: first|last
+        //$_configuration['student_publication_to_take_in_gradebook'] = 'first';
+        $value = $this->getConfigurationValue('student_publication_to_take_in_gradebook');
+        $this->addSettingCurrent(
+            'student_publication_to_take_in_gradebook',
+            '',
+            'radio',
+            'Gradebook',
+            ($value?$value:'first'),
+            'StudentPublicationSelectionForGradebookTitle',
+            'StudentPublicationSelectionForGradebookComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'first', 'text' => 'First'], 1 => ['value' => 'last', 'text' => 'Last']]
+        );
+
+        // Show a filter by official code
+        //$_configuration['certificate_filter_by_official_code'] = false;
+        $value = $this->getConfigurationValue('certificate_filter_by_official_code');
+        $this->addSettingCurrent(
+            'certificate_filter_by_official_code',
+            '',
+            'radio',
+            'Gradebook',
+            ($value?$value:'false'),
+            'FilterCertificateByOfficialCodeTitle',
+            'FilterCertificateByOfficialCodeComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Max quantity of fkceditor allowed in the exercise result page otherwise
+        // Textareas are used.
+        //$_configuration['exercise_max_ckeditors_in_page'] = 0;
+        $value = $this->getConfigurationValue('exercise_max_ckeditors_in_page');
+        $this->addSettingCurrent(
+            'exercise_max_ckeditors_in_page',
+            '',
+            'textfield',
+            'Tools',
+            ($value?$value:'0'),
+            'MaxCKeditorsOnExerciseResultsPageTitle',
+            'MaxCKeditorsOnExerciseResultsPageComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            array()
+        );
+
+        // Default upload option
+        //$_configuration['document_if_file_exists_option'] = 'rename'; // overwrite
+        $value = $this->getConfigurationValue('document_if_file_exists_option');
+        $this->addSettingCurrent(
+            'document_if_file_exists_option',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'rename'),
+            'DocumentDefaultOptionIfFileExistsTitle',
+            'DocumentDefaultOptionIfFileExistsComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'rename', 'text' => 'Rename'], 1 => ['value' => 'overwrite', 'text' => 'Overwrite']]
+        );
+        // Enable add_gradebook_certificates.php cron task
+        //$_configuration['add_gradebook_certificates_cron_task_enabled'] = true;
+        $value = $this->getConfigurationValue('add_gradebook_certificates_cron_task_enabled');
+        $this->addSettingCurrent(
+            'add_gradebook_certificates_cron_task_enabled',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'GradebookCronTaskGenerationTitle',
+            'GradebookCronTaskGenerationComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Which OpenBadges backpack send the badges
+        //$_configuration['openbadges_backpack'] = 'https://backpack.openbadges.org/';
+        $value = $this->getConfigurationValue('openbadges_backpack');
+        $this->addSettingCurrent(
+            'openbadges_backpack',
+            '',
+            'textfield',
+            'Gradebook',
+            ($value?$value:'https://backpack.openbadges.org/'),
+            'OpenBadgesBackpackUrlTitle',
+            'OpenBadgesBackpackUrlComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            []
+        );
+
+        // Shows a warning message explaining that the site uses cookies
+        //$_configuration['cookie_warning'] = false;
+        $value = $this->getConfigurationValue('cookie_warning');
+        $this->addSettingCurrent(
+            'cookie_warning',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'CookieWarningTitle',
+            'CookieWarningComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If there are any tool available and the user is not registered hide the group
+        //$_configuration['hide_course_group_if_no_tools_available'] = false;
+        $value = $this->getConfigurationValue('hide_course_group_if_no_tools_available');
+        $this->addSettingCurrent(
+            'hide_course_group_if_no_tools_available',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'HideCourseGroupIfNoToolAvailableTitle',
+            'HideCourseGroupIfNoToolAvailableComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Allow student to enroll into a session without an approval needing
+        //$_configuration['catalog_allow_session_auto_subscription'] = false;
+        $value = $this->getConfigurationValue('catalog_allow_session_auto_subscription');
+        $this->addSettingCurrent(
+            'catalog_allow_session_auto_subscription',
+            '',
+            'radio',
+            'Session',
+            ($value?$value:'false'),
+            'CatalogueAllowSessionAutoSubscriptionTitle',
+            'CatalogueAllowSessionAutoSubscriptionComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Decode UTF-8 from Web Services (option passed to SOAP)
+        //$_configuration['registration.soap.php.decode_utf8'] = false;
+        $value = $this->getConfigurationValue('registration.soap.php.decode_utf8');
+        $this->addSettingCurrent(
+            'registration.soap.php.decode_utf8',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'false'),
+            'SoapRegistrationDecodeUtf8Title',
+            'SoapRegistrationDecodeUtf8Comment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Show delete option in attendance
+        //$_configuration['allow_delete_attendance'] = false;
+        $value = $this->getConfigurationValue('allow_delete_attendance');
+        $this->addSettingCurrent(
+            'allow_delete_attendance',
+            '',
+            'radio',
+            'Tools',
+            ($value?$value:'false'),
+            'AttendanceDeletionEnableTitle',
+            'AttendanceDeletionEnableComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Enable Gravatar profile image if no local image has been given
+        //$_configuration['gravatar_enabled'] = true;
+        $value = $this->getConfigurationValue('gravatar_enabled');
+        $this->addSettingCurrent(
+            'gravatar_enabled',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'false'),
+            'GravatarPicturesTitle',
+            'GravatarPicturesComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If Gravatar is enabled, tells which type of picture we want (default is "mm").
+        // Options: mm | identicon | monsterid | wavatar
+        //$_configuration['gravatar_type'] = 'mm';
+        $value = $this->getConfigurationValue('gravatar_type');
+        $this->addSettingCurrent(
+            'gravatar_type',
+            '',
+            'radio',
+            'Platform',
+            ($value?$value:'mm'),
+            'GravatarPicturesTypeTitle',
+            'GravatarPicturesTypeComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'mm', 'text' => 'mystery-man'],
+                1 => ['value' => 'identicon', 'text' => 'identicon'],
+                2 => ['value' => 'monsterid', 'text' => 'monsterid'],
+                3 => ['value' => 'wavatar', 'text' => 'wavatar']
+            ]
+        );
+
+        // Limit for the Session Admin role. The administration page show only
+        // User block -> Add user
+        // Course Sessions block -> Training session list
+        //$_configuration['limit_session_admin_role'] = false;
+        $value = $this->getConfigurationValue('limit_session_admin_role');
+        $this->addSettingCurrent(
+            'limit_session_admin_role',
+            '',
+            'radio',
+            'Session',
+            ($value?$value:'false'),
+            'SessionAdminPermissionsLimitTitle',
+            'SessionAdminPermissionsLimitComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Show session description
+        //$_configuration['show_session_description'] = false;
+        $value = $this->getConfigurationValue('show_session_description');
+        $this->addSettingCurrent(
+            'show_session_description',
+            '',
+            'radio',
+            'Session',
+            ($value?$value:'false'),
+            'ShowSessionDescriptionTitle',
+            'ShowSessionDescriptionComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Hide only for students the link to export certificates to PDF
+        //$_configuration['hide_certificate_export_link_students'] = false;
+        $value = $this->getConfigurationValue('hide_certificate_export_link_students');
+        $this->addSettingCurrent(
+            'hide_certificate_export_link_students',
+            '',
+            'radio',
+            'Gradebook',
+            ($value?$value:'false'),
+            'CertificateHideExportLinkStudentTitle',
+            'CertificateHideExportLinkStudentComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Hide for all user roles the link to export certificates to PDF
+        //$_configuration['hide_certificate_export_link'] = false;
+        $value = $this->getConfigurationValue('hide_certificate_export_link');
+        $this->addSettingCurrent(
+            'hide_certificate_export_link',
+            '',
+            'radio',
+            'Gradebook',
+            ($value?$value:'false'),
+            'CertificateHideExportLinkTitle',
+            'CertificateHideExportLinkComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Hide session course coach in dropbox sent to user list
+        //$_configuration['dropbox_hide_course_coach'] = false;
+        $value = $this->getConfigurationValue('dropbox_hide_course_coach');
+        $this->addSettingCurrent(
+            'dropbox_hide_course_coach',
+            '',
+            'radio',
+            'Tools',
+            ($value ? $value : 'false'),
+            'DropboxHideCourseCoachTitle',
+            'DropboxHideCourseCoachComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        $value = $this->getConfigurationValue('dropbox_hide_general_coach');
+        $this->addSettingCurrent(
+            'dropbox_hide_general_coach',
+            '',
+            'radio',
+            'Tools',
+            ($value ? $value : 'false'),
+            'DropboxHideGeneralCoachTitle',
+            'DropboxHideGeneralCoachComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // If SSO is used, the redirection to the master server is forced.
+        //$_configuration['force_sso_redirect'] = false;
+        $value = $this->getConfigurationValue('force_sso_redirect');
+        $this->addSettingCurrent(
+            'sso_force_redirect',
+            '',
+            'radio',
+            'Security',
+            ($value?$value:'false'),
+            'SSOForceRedirectTitle',
+            'SSOForceRedirectComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+
+        // Session course ordering in the the session view.
+        // false = alphabetic order (default)
+        // true = based in the session course list
+        //$_configuration['session_course_ordering'] = false;
+        $value = $this->getConfigurationValue('session_course_ordering');
+        $this->addSettingCurrent(
+            'session_course_ordering',
+            '',
+            'radio',
+            'Session',
+            ($value?$value:'false'),
+            'SessionCourseOrderingTitle',
+            'SessionCourseOrderingComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [0 => ['value' => 'true', 'text' => 'Yes'], 1 => ['value' => 'false', 'text' => 'No']]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM settings_options WHERE variable IN ('session_course_ordering', 'sso_force_redirect', 'dropbox_hide_course_coach', 'hide_certificate_export_link', 'hide_certificate_export_link_students', 'show_session_description', 'limit_session_admin_role', 'gravatar_type', 'gravatar_enabled', 'allow_delete_attendance', 'registration.soap.php.decode_utf8', 'catalog_allow_session_auto_subscription', 'hide_course_group_if_no_tools_available', 'cookie_warning', 'openbadges_backpack', 'add_gradebook_certificates_cron_task_enabled', 'document_if_file_exists_option', 'exercise_max_ckeditors_in_page', 'certificate_filter_by_official_code', 'student_publication_to_take_in_gradebook', 'course_images_in_courses_list', 'redirect_admin_to_courses_list', 'hide_logout_button', 'allow_session_course_copy_for_teachers', 'lp_show_reduced_report', 'auto_detect_language_custom_pages', 'catalog_show_courses_sessions', 'course_catalog_hide_private', 'show_official_code_exercise_result_list', 'allow_lp_return_link', 'hide_scorm_export_link', 'hide_scorm_copy_link', 'hide_scorm_pdf_link', 'session_days_before_coach_access', 'session_days_after_coach_access', 'pdf_logo_header', 'order_user_list_by_official_code', 'email_alert_manager_on_new_quiz')");
+        $this->addSql("DELETE FROM settings_current WHERE variable IN ('session_course_ordering', 'sso_force_redirect', 'dropbox_hide_course_coach', 'hide_certificate_export_link', 'hide_certificate_export_link_students', 'show_session_description', 'limit_session_admin_role', 'gravatar_type', 'gravatar_enabled', 'allow_delete_attendance', 'registration.soap.php.decode_utf8', 'catalog_allow_session_auto_subscription', 'hide_course_group_if_no_tools_available', 'cookie_warning', 'openbadges_backpack', 'add_gradebook_certificates_cron_task_enabled', 'document_if_file_exists_option', 'exercise_max_ckeditors_in_page', 'certificate_filter_by_official_code', 'student_publication_to_take_in_gradebook', 'course_images_in_courses_list', 'redirect_admin_to_courses_list', 'hide_logout_button', 'allow_session_course_copy_for_teachers', 'lp_show_reduced_report', 'auto_detect_language_custom_pages', 'catalog_show_courses_sessions', 'course_catalog_hide_private', 'show_official_code_exercise_result_list', 'allow_lp_return_link', 'hide_scorm_export_link', 'hide_scorm_copy_link', 'hide_scorm_pdf_link', 'session_days_before_coach_access', 'session_days_after_coach_access', 'pdf_logo_header', 'order_user_list_by_official_code', 'email_alert_manager_on_new_quiz')");
+
+        $this->addSql('ALTER TABLE user DROP COLUMN last_login');
+    }
+}

+ 55 - 0
app/Migrations/Schema/V110/Version20150527101600.php

@@ -0,0 +1,55 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150527120703
+ * LP autolunch -> autolaunch
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150527101600 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'gamification_mode',
+            '',
+            'radio',
+            'Platform',
+            0,
+            'GamificationModeTitle',
+            'GamificationModeComment',
+            null,
+            '',
+            1,
+            true,
+            false,
+            [
+                [
+                    'value' => 1,
+                    'text' => 'Yes'
+                ],
+                [
+                    'value' => 0,
+                    'text' => 'No'
+                ]
+            ]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM settings_options WHERE variable = 'gamification_mode'");
+        $this->addSql("DELETE FROM settings_current WHERE variable = 'gamification_mode'");
+    }
+}

+ 33 - 0
app/Migrations/Schema/V110/Version20150527114220.php

@@ -0,0 +1,33 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150527114220
+ * Lp category
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150527114220 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('CREATE TABLE c_lp_category (iid INT AUTO_INCREMENT NOT NULL, c_id INT NOT NULL, name VARCHAR(255) NOT NULL, position INT NOT NULL, PRIMARY KEY(iid)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+        $this->addSql('ALTER TABLE c_lp ADD category_id INT NOT NULL DEFAULT 0');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('DROP TABLE c_lp_category');
+        $this->addSql('ALTER TABLE c_lp DROP category_id');
+    }
+}

+ 31 - 0
app/Migrations/Schema/V110/Version20150527120703.php

@@ -0,0 +1,31 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150527120703
+ * LP autolunch -> autolaunch
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150527120703 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_lp CHANGE COLUMN autolunch autolaunch INT NOT NULL DEFAULT 0');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_lp CHANGE COLUMN autolaunch autolunch INT NOT NULL');
+    }
+}

+ 76 - 0
app/Migrations/Schema/V110/Version20150528103216.php

@@ -0,0 +1,76 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150528103216 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+  	    $this->addSql('ALTER TABLE session ADD COLUMN access_start_date datetime');
+        $this->addSql('ALTER TABLE session ADD COLUMN access_end_date datetime');
+        $this->addSql('ALTER TABLE session ADD COLUMN coach_access_start_date datetime');
+        $this->addSql('ALTER TABLE session ADD COLUMN coach_access_end_date datetime');
+        $this->addSql('ALTER TABLE session ADD COLUMN display_start_date datetime');
+        $this->addSql('ALTER TABLE session ADD COLUMN display_end_date datetime');
+
+
+        $this->addSql('UPDATE session SET access_start_date = date_start');
+        $this->addSql("UPDATE session SET access_end_date = CONVERT(CONCAT(date_end, ' 23:59:59'), DATETIME)");
+
+        $this->addSql('UPDATE session SET coach_access_start_date = CONVERT(DATE_SUB(date_start, INTERVAL nb_days_access_before_beginning DAY), DATETIME) ');
+        $this->addSql('UPDATE session SET coach_access_start_date = NULL WHERE nb_days_access_before_beginning = 0');
+
+        $this->addSql('UPDATE session SET coach_access_end_date = CONVERT(DATE_ADD(date_end, INTERVAL nb_days_access_after_end DAY), DATETIME) ');
+        $this->addSql('UPDATE session SET coach_access_end_date = NULL WHERE nb_days_access_after_end = 0');
+
+        $this->addSql('UPDATE session SET display_start_date = access_start_date');
+        $this->addSql('UPDATE session SET display_end_date = access_end_date');
+
+        // Set dates to NULL
+
+        $this->addSql('UPDATE session SET access_start_date = NULL WHERE access_start_date = "0000-00-00 00:00:00"');
+        $this->addSql('UPDATE session SET access_end_date = NULL WHERE access_end_date = "0000-00-00 00:00:00"');
+
+        $this->addSql('UPDATE session SET coach_access_start_date = NULL WHERE coach_access_start_date = "0000-00-00 00:00:00"');
+        $this->addSql('UPDATE session SET coach_access_end_date = NULL WHERE coach_access_end_date = "0000-00-00 00:00:00"');
+
+        $this->addSql('UPDATE session SET display_start_date = NULL WHERE display_start_date = "0000-00-00 00:00:00"');
+        $this->addSql('UPDATE session SET display_end_date = NULL WHERE display_end_date = "0000-00-00 00:00:00"');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE session CREATE date_start date NOT NULL');
+        $this->addSql('ALTER TABLE session CREATE date_end date NOT NULL');
+        $this->addSql('ALTER TABLE session CREATE nb_days_access_before_beginning TINYINT');
+        $this->addSql('ALTER TABLE session CREATE nb_days_access_after_end TINYINT');
+
+        $this->addSql('UPDATE session SET date_start = access_start_date');
+        $this->addSql('UPDATE session SET date_end = access_end_date');
+
+        $this->addSql('UPDATE session SET nb_days_access_before_beginning = DATEDIFF(access_start_date, coach_access_start_date) WHERE access_start_date != coach_access_start_date AND coach_access_start_date IS NOT NULL');
+        $this->addSql('UPDATE session SET nb_days_access_after_end = DATEDIFF(coach_access_end_date, coach_access_end_date) WHERE access_end_date != coach_access_end_date AND coach_access_end_date IS NOT NULL');
+        $this->addSql('UPDATE session SET nb_days_access_before_beginning = 0 WHERE access_start_date = coach_access_start_date OR coach_access_start_date IS NULL');
+        $this->addSql('UPDATE session SET nb_days_access_after_end = 0 WHERE access_end_date = coach_access_end_date OR coach_access_end_date IS NULL');
+
+        $this->addSql('ALTER TABLE session DROP access_start_date');
+        $this->addSql('ALTER TABLE session DROP access_end_date');
+        $this->addSql('ALTER TABLE session DROP coach_access_start_date');
+        $this->addSql('ALTER TABLE session DROP coach_access_end_date');
+        $this->addSql('ALTER TABLE session DROP display_start_date');
+        $this->addSql('ALTER TABLE session DROP display_end_date');
+    }
+}

+ 67 - 0
app/Migrations/Schema/V110/Version20150529164400.php

@@ -0,0 +1,67 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type as TableColumnType;
+
+/**
+ * Session date changes
+ */
+class Version20150529164400 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        if (!$schema->hasTable('gradebook_score_log')) {
+            $gradebookScoreLog = $schema->createTable('gradebook_score_log');
+            $gradebookScoreLog->addColumn(
+                'id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'autoincrement' => true, 'notnull' => true]
+            );
+            $gradebookScoreLog->addColumn(
+                'category_id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'notnull' => true]
+            );
+            $gradebookScoreLog->addColumn(
+                'user_id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'notnull' => true]
+            );
+            $gradebookScoreLog->addColumn(
+                'score',
+                TableColumnType::FLOAT,
+                ['notnull' => true, 'scale' => 0, 'precision' => 10]
+            );
+            $gradebookScoreLog->addColumn(
+                'registered_at',
+                TableColumnType::DATETIME,
+                ['notnull' => true]
+            );
+            $gradebookScoreLog->setPrimaryKey(['id']);
+            $gradebookScoreLog->addIndex(
+                ['user_id'],
+                'idx_gradebook_score_log_user'
+            );
+            $gradebookScoreLog->addIndex(
+                ['user_id', 'category_id'],
+                'idx_gradebook_score_log_user_category'
+            );
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $schema->dropTable('gradebook_score_log');
+    }
+
+}

+ 70 - 0
app/Migrations/Schema/V110/Version20150603142550.php

@@ -0,0 +1,70 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Add branch
+ */
+class Version20150603142550 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function preUp(Schema $schema)
+    {
+        $this->addSql("ALTER TABLE c_calendar_event ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE c_thematic_advance ENGINE=InnoDB");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('CREATE TABLE room (id INT AUTO_INCREMENT NOT NULL, branch_id INT DEFAULT NULL, title VARCHAR(255) DEFAULT NULL, description LONGTEXT, geolocation VARCHAR(255) DEFAULT NULL, ip VARCHAR(39) DEFAULT NULL, ip_mask VARCHAR(6) DEFAULT NULL, INDEX IDX_729F519BDCD6CC49 (branch_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+        $this->addSql('CREATE TABLE branch_transaction_status (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+        $this->addSql('CREATE TABLE branch_transaction (id BIGINT AUTO_INCREMENT NOT NULL, status_id INT DEFAULT NULL, branch_id INT DEFAULT NULL, transaction_id BIGINT NOT NULL, action VARCHAR(20) DEFAULT NULL, item_id VARCHAR(255) DEFAULT NULL, origin VARCHAR(255) DEFAULT NULL, dest_id VARCHAR(255) DEFAULT NULL, external_info VARCHAR(255) DEFAULT NULL, time_insert DATETIME NOT NULL, time_update DATETIME NOT NULL, failed_attempts INT NOT NULL, INDEX IDX_FEFBA12B6BF700BD (status_id), INDEX IDX_FEFBA12BDCD6CC49 (branch_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+        $this->addSql('CREATE TABLE branch_sync (id INT AUTO_INCREMENT NOT NULL, parent_id INT DEFAULT NULL, access_url_id INT NOT NULL, unique_id VARCHAR(50) NOT NULL, branch_name VARCHAR(250) NOT NULL, description LONGTEXT, branch_ip VARCHAR(40) DEFAULT NULL, latitude NUMERIC(10, 0) DEFAULT NULL, longitude NUMERIC(10, 0) DEFAULT NULL, dwn_speed INT DEFAULT NULL, up_speed INT DEFAULT NULL, delay INT DEFAULT NULL, admin_mail VARCHAR(250) DEFAULT NULL, admin_name VARCHAR(250) DEFAULT NULL, admin_phone VARCHAR(250) DEFAULT NULL, last_sync_trans_id BIGINT DEFAULT NULL, last_sync_trans_date DATETIME DEFAULT NULL, last_sync_type VARCHAR(20) DEFAULT NULL, ssl_pub_key VARCHAR(250) DEFAULT NULL, branch_type VARCHAR(250) DEFAULT NULL, lft INT DEFAULT NULL, rgt INT DEFAULT NULL, lvl INT DEFAULT NULL, root INT DEFAULT NULL, UNIQUE INDEX UNIQ_F62F45EDE3C68343 (unique_id), INDEX IDX_F62F45ED727ACA70 (parent_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB');
+        $this->addSql('ALTER TABLE room ADD CONSTRAINT FK_729F519BDCD6CC49 FOREIGN KEY (branch_id) REFERENCES branch_sync (id)');
+        $this->addSql('ALTER TABLE branch_transaction ADD CONSTRAINT FK_FEFBA12B6BF700BD FOREIGN KEY (status_id) REFERENCES branch_transaction_status (id)');
+        $this->addSql('ALTER TABLE branch_transaction ADD CONSTRAINT FK_FEFBA12BDCD6CC49 FOREIGN KEY (branch_id) REFERENCES branch_sync (id)');
+        $this->addSql('ALTER TABLE branch_sync ADD CONSTRAINT FK_F62F45ED727ACA70 FOREIGN KEY (parent_id) REFERENCES branch_sync (id) ON DELETE SET NULL');
+        $this->addSql('ALTER TABLE course ADD room_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE course ADD CONSTRAINT FK_169E6FB954177093 FOREIGN KEY (room_id) REFERENCES room (id)');
+        $this->addSql('CREATE INDEX IDX_169E6FB954177093 ON course (room_id)');
+        $this->addSql('ALTER TABLE c_calendar_event ADD room_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_calendar_event ADD CONSTRAINT FK_A062258154177093 FOREIGN KEY (room_id) REFERENCES room (id)');
+        $this->addSql('CREATE INDEX IDX_A062258154177093 ON c_calendar_event (room_id)');
+        $this->addSql('ALTER TABLE c_thematic_advance ADD room_id INT DEFAULT NULL');
+        $this->addSql('ALTER TABLE c_thematic_advance ADD CONSTRAINT FK_62798E9754177093 FOREIGN KEY (room_id) REFERENCES room (id)');
+        $this->addSql('CREATE INDEX IDX_62798E9754177093 ON c_thematic_advance (room_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE course DROP FOREIGN KEY FK_169E6FB954177093');
+        $this->addSql('ALTER TABLE c_calendar_event DROP FOREIGN KEY FK_A062258154177093');
+        $this->addSql('ALTER TABLE c_thematic_advance DROP FOREIGN KEY FK_62798E9754177093');
+        $this->addSql('ALTER TABLE branch_transaction DROP FOREIGN KEY FK_FEFBA12B6BF700BD');
+        $this->addSql('ALTER TABLE room DROP FOREIGN KEY FK_729F519BDCD6CC49');
+        $this->addSql('ALTER TABLE branch_transaction DROP FOREIGN KEY FK_FEFBA12BDCD6CC49');
+        $this->addSql('ALTER TABLE branch_sync DROP FOREIGN KEY FK_F62F45ED727ACA70');
+        $this->addSql('DROP TABLE room');
+        $this->addSql('DROP TABLE branch_transaction_status');
+        $this->addSql('DROP TABLE branch_transaction');
+        $this->addSql('DROP TABLE branch_sync');
+        $this->addSql('DROP INDEX IDX_A062258154177093 ON c_calendar_event');
+        $this->addSql('ALTER TABLE c_calendar_event DROP room_id');
+        $this->addSql('DROP INDEX IDX_62798E9754177093 ON c_thematic_advance');
+        $this->addSql('ALTER TABLE c_thematic_advance DROP room_id');
+        $this->addSql('DROP INDEX IDX_169E6FB954177093 ON course');
+        $this->addSql('ALTER TABLE course DROP room_id');
+    }
+}

+ 32 - 0
app/Migrations/Schema/V110/Version20150603151200.php

@@ -0,0 +1,32 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150603151200 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_forum_forum ADD lp_id INTEGER UNSIGNED NOT NULL');
+        $this->addSql('ALTER TABLE c_forum_thread ADD lp_item_id INTEGER UNSIGNED NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_forum_forum DROP lp_id');
+        $this->addSql('ALTER TABLE c_forum_thread DROP lp_item_id');
+    }
+
+}

+ 101 - 0
app/Migrations/Schema/V110/Version20150603181728.php

@@ -0,0 +1,101 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Lp changes
+ */
+class Version20150603181728 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function preUp(Schema $schema)
+    {
+        $this->addSql("ALTER TABLE course ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE c_group_info ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE session ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE user ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE c_item_property ENGINE=InnoDB");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $table = $schema->getTable('c_lp');
+        if (!$table->hasColumn('max_attempts')) {
+            $this->addSql('ALTER TABLE c_lp ADD max_attempts INT NOT NULL');
+
+        }
+
+        if (!$table->hasColumn('subscribe_users')) {
+            $this->addSql('ALTER TABLE c_lp ADD subscribe_users INT NOT NULL DEFAULT 0');
+        }
+
+        $this->addSql('
+            ALTER TABLE c_item_property
+            MODIFY c_id INT DEFAULT NULL,
+            MODIFY lastedit_user_id INT NOT NULL,
+            MODIFY to_group_id INT NULL,
+            MODIFY insert_user_id INT DEFAULT NULL,
+            MODIFY start_visible DATETIME DEFAULT NULL,
+            MODIFY end_visible DATETIME DEFAULT NULL,
+            MODIFY session_id INT DEFAULT NULL,
+            MODIFY to_user_id INT NULL
+        ');
+        $this->addSql("UPDATE c_item_property SET session_id = NULL WHERE session_id NOT IN (SELECT id FROM session)");
+        $this->addSql("UPDATE c_item_property SET to_group_id = NULL WHERE to_group_id NOT IN (SELECT iid FROM c_group_info)");
+        $this->addSql("UPDATE c_item_property SET to_user_id = NULL WHERE to_user_id NOT IN (SELECT user_id FROM user)");
+        $this->addSql("UPDATE c_item_property SET start_visible = NULL WHERE start_visible = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE c_item_property SET end_visible = NULL WHERE end_visible = '0000-00-00 00:00:00'");
+        $this->addSql("UPDATE c_item_property SET to_user_id = NULL WHERE to_user_id NOT IN (SELECT id FROM user)");
+        $this->addSql("UPDATE c_item_property SET insert_user_id = NULL WHERE insert_user_id NOT IN (SELECT id FROM user)");
+        $this->addSql("UPDATE c_item_property SET session_id = NULL WHERE session_id NOT IN (SELECT id FROM session)");
+
+        // Remove inconsistencies about non-existing courses
+        $this->addSql("DELETE FROM c_item_property WHERE c_id NOT IN (SELECT user_id FROM user)");
+        // Remove inconsistencies about non-existing users
+        $this->addSql("DELETE FROM course_rel_user WHERE user_id NOT IN (SELECT user_id FROM user)");
+
+        $this->addSql("DELETE FROM c_item_property WHERE c_id NOT IN (SELECT id FROM course)");
+        $this->addSql("DELETE FROM c_item_property WHERE to_group_id NOT IN (SELECT id FROM c_group_info)");
+
+        $this->addSql('UPDATE c_item_property cip SET cip.to_group_id = (SELECT cgi.iid FROM c_group_info cgi WHERE cgi.c_id = cip.c_id AND cgi.id = cip.to_group_id)');
+
+        $this->addSql('ALTER TABLE c_item_property ADD CONSTRAINT FK_1D84C18191D79BD3 FOREIGN KEY (c_id) REFERENCES course(id)');
+        $this->addSql('ALTER TABLE c_item_property ADD CONSTRAINT FK_1D84C181330D47E9 FOREIGN KEY (to_group_id) REFERENCES c_group_info (iid)');
+        $this->addSql('ALTER TABLE c_item_property ADD CONSTRAINT FK_1D84C18129F6EE60 FOREIGN KEY (to_user_id) REFERENCES user (id)');
+        $this->addSql('ALTER TABLE c_item_property ADD CONSTRAINT FK_1D84C1819C859CC3 FOREIGN KEY (insert_user_id) REFERENCES user (id)');
+        $this->addSql('ALTER TABLE c_item_property ADD CONSTRAINT FK_1D84C181613FECDF FOREIGN KEY (session_id) REFERENCES session (id)');
+        $this->addSql('CREATE INDEX IDX_1D84C18191D79BD3 ON c_item_property (c_id)');
+        $this->addSql('CREATE INDEX IDX_1D84C181330D47E9 ON c_item_property (to_group_id)');
+        $this->addSql('CREATE INDEX IDX_1D84C18129F6EE60 ON c_item_property (to_user_id)');
+        $this->addSql('CREATE INDEX IDX_1D84C1819C859CC3 ON c_item_property (insert_user_id)');
+        $this->addSql('CREATE INDEX IDX_1D84C181613FECDF ON c_item_property (session_id)');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_lp DROP max_attempts, DROP subscribe_users');
+        $this->addSql('ALTER TABLE c_item_property DROP FOREIGN KEY FK_1D84C18191D79BD3');
+        $this->addSql('ALTER TABLE c_item_property DROP FOREIGN KEY FK_1D84C181330D47E9');
+        $this->addSql('ALTER TABLE c_item_property DROP FOREIGN KEY FK_1D84C18129F6EE60');
+        $this->addSql('ALTER TABLE c_item_property DROP FOREIGN KEY FK_1D84C1819C859CC3');
+        $this->addSql('ALTER TABLE c_item_property DROP FOREIGN KEY FK_1D84C181613FECDF');
+        $this->addSql('DROP INDEX IDX_1D84C18191D79BD3 ON c_item_property');
+        $this->addSql('DROP INDEX IDX_1D84C181330D47E9 ON c_item_property');
+        $this->addSql('DROP INDEX IDX_1D84C18129F6EE60 ON c_item_property');
+        $this->addSql('DROP INDEX IDX_1D84C1819C859CC3 ON c_item_property');
+        $this->addSql('DROP INDEX IDX_1D84C181613FECDF ON c_item_property');
+        $this->addSql('ALTER TABLE c_item_property CHANGE c_id c_id INT NOT NULL, CHANGE insert_user_id insert_user_id INT NOT NULL, CHANGE session_id session_id INT NOT NULL, CHANGE start_visible start_visible DATETIME NOT NULL, CHANGE end_visible end_visible DATETIME NOT NULL');
+    }
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20150604145047.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * track_e_default changes
+ */
+class Version20150604145047 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE track_e_default CHANGE default_event_type default_event_type VARCHAR(255) NOT NULL, CHANGE default_value_type default_value_type VARCHAR(255) NOT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE track_e_default CHANGE default_event_type default_event_type VARCHAR(20) NOT NULL COLLATE utf8_unicode_ci, CHANGE default_value_type default_value_type VARCHAR(20) NOT NULL COLLATE utf8_unicode_ci');
+    }
+}

+ 70 - 0
app/Migrations/Schema/V110/Version20150608104600.php

@@ -0,0 +1,70 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type as TableColumnType;
+
+/**
+ * Session date changes
+ */
+class Version20150608104600 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        if (!$schema->hasTable('extra_field_rel_tag')) {
+            $extraFieldRelTag = $schema->createTable('extra_field_rel_tag');
+            $extraFieldRelTag->addColumn(
+                'id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'autoincrement' => true, 'notnull' => true]
+            );
+            $extraFieldRelTag->addColumn(
+                'field_id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'notnull' => true]
+            );
+            $extraFieldRelTag->addColumn(
+                'item_id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'notnull' => true]
+            );
+            $extraFieldRelTag->addColumn(
+                'tag_id',
+                TableColumnType::INTEGER,
+                ['unsigned' => true, 'notnull' => true]
+            );
+            $extraFieldRelTag->setPrimaryKey(['id']);
+            $extraFieldRelTag->addIndex(
+                ['field_id'],
+                'idx_frt_field'
+            );
+            $extraFieldRelTag->addIndex(
+                ['item_id'],
+                'idx_frt_item'
+            );
+            $extraFieldRelTag->addIndex(
+                ['tag_id'],
+                'idx_frt_tag'
+            );
+            $extraFieldRelTag->addIndex(
+                ['field_id', 'item_id', 'tag_id'],
+                'idx_frt_field_item_tag'
+            );
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $schema->dropTable('extra_field_rel_tag');
+    }
+
+}

+ 35 - 0
app/Migrations/Schema/V110/Version20150609113500.php

@@ -0,0 +1,35 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150609113500 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("INSERT INTO extra_field
+            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
+            VALUES (2, 10, 'tags', 'Tags', 1, 1, NOW())");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM extra_field
+            WHERE variable = 'tags' AND
+                extra_field_type = 2 AND
+                field_type = 10");
+    }
+
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20150610143426.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Tool changes
+ */
+class Version20150610143426 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_tool ADD description LONGTEXT, ADD custom_icon VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_tool DROP description, DROP custom_icon');
+    }
+}

+ 34 - 0
app/Migrations/Schema/V110/Version20150615171900.php

@@ -0,0 +1,34 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Version20150615171900 class
+ * Change in CCourseDescription entity
+ *
+ * @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
+ */
+class Version20150615171900 extends AbstractMigrationChamilo
+{
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_course_description CHANGE description_type description_type INTEGER NOT NULL DEFAULT 1');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_course_description CHANGE description_type description_type BOOLEAN NOT NULL');
+    }
+
+}

+ 35 - 0
app/Migrations/Schema/V110/Version20150616093200.php

@@ -0,0 +1,35 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150616093200 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("INSERT INTO extra_field (
+            extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
+            VALUES (2, 19, 'video_url', 'VideoUrl', 1, 1, NOW())");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM extra_field
+            WHERE variable = 'video_url' AND
+                extra_field_type = 2 AND
+                field_type = 19");
+    }
+
+}

+ 35 - 0
app/Migrations/Schema/V110/Version20150624164100.php

@@ -0,0 +1,35 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150624164100 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("INSERT INTO extra_field
+            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
+            VALUES (3, 16, 'image', 'Image', 1, 1, NOW())");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM extra_field
+            WHERE variable = 'image' AND
+                extra_field_type = 3 AND
+                field_type = 16");
+    }
+
+}

+ 35 - 0
app/Migrations/Schema/V110/Version20150625155000.php

@@ -0,0 +1,35 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Session date changes
+ */
+class Version20150625155000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("INSERT INTO extra_field
+            (extra_field_type, field_type, variable, display_text, visible, changeable, created_at)
+            VALUES (1, 1, 'captcha_blocked_until_date', 'Account locked until', 0, 0, NOW())");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql("DELETE FROM extra_field
+            WHERE variable = 'captcha_blocked_until_date' AND
+                extra_field_type = 1 AND
+                field_type = 1");
+    }
+
+}

+ 36 - 0
app/Migrations/Schema/V110/Version20150706135000.php

@@ -0,0 +1,36 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * GradebookCategory changes
+ */
+class Version20150706135000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $gradebookCategory = $schema->getTable('gradebook_category');
+
+        $isRequirement = $gradebookCategory->addColumn(
+            'is_requirement',
+            \Doctrine\DBAL\Types\Type::BOOLEAN
+        );
+        $isRequirement->setNotnull(true)->setDefault(false);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $gradebookCategory = $schema->getTable('gradebook_category');
+        $gradebookCategory->dropColumn('is_requirement');
+    }
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20150709083710.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Agenda
+ */
+class Version20150709083710 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_calendar_event ADD color VARCHAR(100) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_calendar_event DROP color');
+    }
+}

+ 35 - 0
app/Migrations/Schema/V110/Version20150713132630.php

@@ -0,0 +1,35 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150713132630
+ *
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150713132630 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        if ($schema->hasTable('c_student_publication')) {
+            $this->addSql('ALTER TABLE c_student_publication ADD url_correction VARCHAR(255) DEFAULT NULL');
+            $this->addSql('ALTER TABLE c_student_publication ADD title_correction VARCHAR(255) DEFAULT NULL');
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE c_student_publication DROP url_correction');
+        $this->addSql('ALTER TABLE c_student_publication DROP title_correction');
+    }
+}

+ 111 - 0
app/Migrations/Schema/V110/Version20150803163400.php

@@ -0,0 +1,111 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150803163400
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150803163400 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'cron_remind_course_expiration_activate',
+            null,
+            'radio',
+            'Crons',
+            'false',
+            'CronRemindCourseExpirationActivateTitle',
+            'CronRemindCourseExpirationActivateComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+
+        $this->addSettingCurrent(
+            'cron_remind_course_expiration_frequency',
+            null,
+            'textfield',
+            'Crons',
+            '2',
+            'CronRemindCourseExpirationFrecuenqyTitle',
+            'CronRemindCourseExpirationFrecuenqyComment',
+            null,
+            null,
+            1,
+            true,
+            false
+        );
+
+        $this->addSettingCurrent(
+            'cron_course_finished_activate',
+            null,
+            'radio',
+            'Crons',
+            'false',
+            'CronCourseFinishedActivateTitle',
+            'CronCourseFinishedActivateComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'cron_remind_course_expiration_activate',
+                        'cron_course_finished_activate'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings = $entityManage->createQueryBuilder();
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'cron_remind_course_expiration_activate',
+                        'cron_remind_course_expiration_frequency',
+                        'cron_course_finished_activate'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+
+}

+ 37 - 0
app/Migrations/Schema/V110/Version20150803171220.php

@@ -0,0 +1,37 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150803171220
+ *
+ * @package Application\Migrations\Schema\V110
+ */
+class Version20150803171220 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('UPDATE user SET username_canonical = username');
+        $this->addSql('ALTER TABLE user ADD confirmation_token VARCHAR(255) NULL');
+        $this->addSql('ALTER TABLE user ADD password_requested_at DATETIME DEFAULT NULL');
+        $this->addSql('RENAME TABLE track_e_exercices TO track_e_exercises');
+        // This drops the old table
+        // $schema->renameTable('track_e_exercices', 'track_e_exercises');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE user DROP confirmation_token');
+        $this->addSql('ALTER TABLE user DROP password_requested_at');
+    }
+}

+ 40 - 0
app/Migrations/Schema/V110/Version20150805161000.php

@@ -0,0 +1,40 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150713132630
+ *
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150805161000 extends AbstractMigrationChamilo
+{
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $sessionTable = $schema->getTable('session');
+
+        $sessionTable->addColumn(
+            'send_subscription_notification',
+            \Doctrine\DBAL\Types\Type::BOOLEAN,
+            ['default' => false]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $sessionTable = $schema->getTable('session');
+        $sessionTable->dropColumn('send_subscription_notification');
+    }
+
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20150810132615.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Calendar color
+ */
+class Version20150810132615 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE personal_agenda ADD color VARCHAR(255) DEFAULT NULL');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE personal_agenda DROP color');
+    }
+}

+ 75 - 0
app/Migrations/Schema/V110/Version20150812230500.php

@@ -0,0 +1,75 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150812230500
+ *
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150812230500 extends AbstractMigrationChamilo
+{
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'allow_coach_feedback_exercises',
+            null,
+            'radio',
+            'Session',
+            'false',
+            'AllowCoachFeedbackExercisesTitle',
+            'AllowCoachFeedbackExercisesComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                ['value' => 'true', 'text' => 'Yes'],
+                ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'allow_coach_feedback_exercises'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings = $entityManage->createQueryBuilder();
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'allow_coach_feedback_exercises'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+
+}

+ 166 - 0
app/Migrations/Schema/V110/Version20150813143000.php

@@ -0,0 +1,166 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Calendar color
+ */
+class Version20150813143000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'prevent_multiple_simultaneous_login',
+            null,
+            'radio',
+            'Security',
+            'false',
+            'PreventMultipleSimultaneousLoginTitle',
+            'PreventMultipleSimultaneousLoginComment',
+            null,
+            null,
+            1,
+            false,
+            true,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'gradebook_detailed_admin_view',
+            null,
+            'radio',
+            'Gradebook',
+            'false',
+            'ShowAdditionalColumnsInStudentResultsPageTitle',
+            'ShowAdditionalColumnsInStudentResultsPageComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'course_catalog_published',
+            null,
+            'radio',
+            'Course',
+            'false',
+            'CourseCatalogIsPublicTitle',
+            'CourseCatalogIsPublicComment',
+            null,
+            null,
+            1,
+            false,
+            true,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'user_reset_password',
+            null,
+            'radio',
+            'Security',
+            'false',
+            'ResetPasswordTokenTitle',
+            'ResetPasswordTokenComment',
+            null,
+            null,
+            1,
+            false,
+            true,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'user_reset_password_token_limit',
+            null,
+            'textfield',
+            'Security',
+            '3600',
+            'ResetPasswordTokenLimitTitle',
+            'ResetPasswordTokenLimitComment',
+            null,
+            null,
+            1,
+            false,
+            true
+        );
+        $this->addSettingCurrent(
+            'my_courses_view_by_session',
+            null,
+            'radio',
+            'Session',
+            'false',
+            'ViewMyCoursesListBySessionTitle',
+            'ViewMyCoursesListBySessionComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+        $deleteSettings = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'prevent_multiple_simultaneous_login',
+                        'gradebook_detailed_admin_view',
+                        'course_catalog_published',
+                        'user_reset_password',
+                        'user_reset_password_token_limit',
+                        'my_courses_view_by_session'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'prevent_multiple_simultaneous_login',
+                        'gradebook_detailed_admin_view',
+                        'course_catalog_published',
+                        'user_reset_password',
+                        'my_courses_view_by_session'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+}

+ 71 - 0
app/Migrations/Schema/V110/Version20150813200000.php

@@ -0,0 +1,71 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Calendar color
+ */
+class Version20150813200000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+        $deleteSettings = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'math_mimetex'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'math_mimetex'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'math_mimetex',
+            null,
+            'radio',
+            'Editor',
+            'false',
+            'MathMimetexTitle',
+            'MathMimetexComment',
+            null,
+            null,
+            1,
+            false,
+            true,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+}

+ 45 - 0
app/Migrations/Schema/V110/Version20150819095300.php

@@ -0,0 +1,45 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150819095300
+ *
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150819095300 extends AbstractMigrationChamilo
+{
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $skillTable = $schema->getTable('skill');
+
+        $skillTable->addColumn(
+            'status',
+            \Doctrine\DBAL\Types\Type::INTEGER,
+            ['default' => 1]
+        );
+        $skillTable->addColumn(
+            'updated_at',
+            \Doctrine\DBAL\Types\Type::DATETIME
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $skillTable = $schema->getTable('skill');
+        $skillTable->dropColumn('status');
+        $skillTable->dropColumn('updated_at');
+    }
+
+}

+ 178 - 0
app/Migrations/Schema/V110/Version20150821150000.php

@@ -0,0 +1,178 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Class Version20150821150000
+ *
+ * @package Application\Migrations\Schema\V11010
+ */
+class Version20150821150000 extends AbstractMigrationChamilo
+{
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+        $deleteSettings = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'display_mini_month_calendar'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'display_mini_month_calendar'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'display_upcoming_events'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'display_upcoming_events'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'number_of_upcoming_events'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    [
+                        'allow_reservation'
+                    ]
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    [
+                        'allow_reservation'
+                    ]
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'display_mini_month_calendar',
+            null,
+            'radio',
+            'Tools',
+            'true',
+            'DisplayMiniMonthCalendarTitle',
+            'DisplayMiniMonthCalendarComment',
+            null,
+            null,
+            1,
+            false,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'display_upcoming_events',
+            null,
+            'radio',
+            'Tools',
+            'true',
+            'DisplayUpcomingEventsTitle',
+            'DisplayUpcomingEventsComment',
+            null,
+            null,
+            1,
+            false,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+        $this->addSettingCurrent(
+            'number_of_upcoming_events',
+            null,
+            'textfield',
+            'Tools',
+            '1',
+            'NumberOfUpcomingEventsTitle',
+            'NumberOfUpcomingEventsComment',
+            null,
+            null,
+            1,
+            false,
+            false
+        );
+        $this->addSettingCurrent(
+            'allow_reservation',
+            null,
+            'radio',
+            'Tools',
+            'false',
+            'AllowReservationTitle',
+            'AllowReservationComment',
+            null,
+            null,
+            1,
+            true,
+            false,
+            [
+                0 => ['value' => 'true', 'text' => 'Yes'],
+                1 => ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+
+}

+ 67 - 0
app/Migrations/Schema/V110/Version20150825141100.php

@@ -0,0 +1,67 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Calendar color
+ */
+class Version20150825141100 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSettingCurrent(
+            'show_full_skill_name_on_skill_wheel',
+            null,
+            'radio',
+            'Platform',
+            'false',
+            'ShowFullSkillNameOnSkillWheelTitle',
+            'ShowFullSkillNameOnSkillWheelComment',
+            null,
+            null,
+            1,
+            false,
+            true,
+            [
+                ['value' => 'true', 'text' => 'Yes'],
+                ['value' => 'false', 'text' => 'No']
+            ]
+        );
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entityManage = $this->getEntityManager();
+
+        $deleteOptions = $entityManage->createQueryBuilder();
+        $deleteSettings = $entityManage->createQueryBuilder();
+
+        $deleteOptions->delete('ChamiloCoreBundle:SettingsOptions', 'o')
+            ->andWhere(
+                $deleteOptions->expr()->in(
+                    'o.variable',
+                    ['show_full_skill_name_on_skill_wheel']
+                )
+            );
+        $deleteOptions->getQuery()->execute();
+
+        $deleteSettings->delete('ChamiloCoreBundle:SettingsCurrent', 's')
+            ->andWhere(
+                $deleteSettings->expr()->in(
+                    's.variable',
+                    ['show_full_skill_name_on_skill_wheel']
+                )
+            );
+        $deleteSettings->getQuery()->execute();
+    }
+}

+ 41 - 0
app/Migrations/Schema/V110/Version20151101082200.php

@@ -0,0 +1,41 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Calendar color
+ */
+class Version20151101082200 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("ALTER TABLE access_url ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE access_url_rel_course ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE course_rel_user ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE session_category ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE settings_current ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE settings_options ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE usergroup ENGINE=InnoDB");
+        $this->addSql("ALTER TABLE usergroup_rel_user ENGINE=InnoDB");
+
+        $this->addSql("ALTER TABLE session_rel_course DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE session_rel_course_rel_user DROP PRIMARY KEY");
+        $this->addSql("ALTER TABLE session MODIFY session_category_id INT NULL");
+
+        $this->addSql("UPDATE session SET session_category_id = NULL WHERE session_category_id NOT IN (SELECT id FROM session_category)");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 312 - 0
app/Migrations/Schema/V110/Version20151101082300.php

@@ -0,0 +1,312 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Calendar color
+ */
+class Version20151101082300 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $accessUrl = $schema->getTable('access_url');
+        $accessUrl->getColumn('id')->setUnsigned(false);
+
+        $this->connection->executeQuery('UPDATE access_url_rel_course SET access_url_id = NULL WHERE access_url_id NOT IN (SELECT id FROM access_url)');
+
+        $accessUrlRelCourse = $schema->getTable('access_url_rel_course');
+        $accessUrlRelCourse->getColumn('access_url_id')->setUnsigned(false);
+        $accessUrlRelCourse->addForeignKeyConstraint('access_url', ['access_url_id'], ['id']);
+        $accessUrlRelCourse->addForeignKeyConstraint('course', ['c_id'], ['id']);
+
+        $schema->renameTable('class', 'class_item');
+
+        $classUser = $schema->getTable('class_user');
+        $classUser->getColumn('class_id')->setUnsigned(false);
+        $classUser->getColumn('user_id')->setUnsigned(false);
+
+        $course = $schema->getTable('course');
+        $course->getColumn('course_type_id')->setUnsigned(false);
+        $course->addForeignKeyConstraint('room', ['room_id'], ['id']);
+
+        $courseRelClass = $schema->getTable('course_rel_class');
+        $courseRelClass->getColumn('class_id')->setUnsigned(false)->setType(Type::getType(Type::INTEGER));
+
+        $courseRelUser = $schema->getTable('course_rel_user');
+        $courseRelUser->addForeignKeyConstraint('course', ['c_id'], ['id']);
+        $courseRelUser->addForeignKeyConstraint('user', ['user_id'], ['id']);
+
+        $courseType = $schema->getTable('course_type');
+        $courseType->getColumn('id')->setUnsigned(false);
+
+        $schema->getTable('c_announcement')->addIndex(['c_id']);
+        $schema->getTable('c_announcement_attachment')->addIndex(['c_id']);
+        $schema->getTable('c_attendance')->addIndex(['c_id']);
+        $schema->getTable('c_attendance_calendar')->addIndex(['c_id']);
+
+        $cAttendanceCalendarRelGroup = $schema->getTable('c_attendance_calendar_rel_group');
+        $cAttendanceCalendarRelGroup->addIndex(['c_id']);
+        $cAttendanceCalendarRelGroup->addIndex(['group_id']);
+
+        $schema->getTable('c_attendance_result')->addIndex(['c_id']);
+
+        $cAttendanceSheet = $schema->getTable('c_attendance_sheet');
+        $cAttendanceSheet->addIndex(['c_id']);
+        $cAttendanceSheet->addIndex(['user_id']);
+
+        $schema->getTable('c_attendance_sheet_log')->addIndex(['c_id']);
+        $schema->getTable('c_blog')->addIndex(['c_id']);
+        $schema->getTable('c_blog_attachment')->addIndex(['c_id']);
+        $schema->getTable('c_blog_comment')->addIndex(['c_id']);
+        $schema->getTable('c_blog_post')->addIndex(['c_id']);
+        $schema->getTable('c_blog_rating')->addIndex(['c_id']);
+
+        $cBlogRelUser = $schema->getTable('c_blog_rel_user');
+        $cBlogRelUser->getColumn('blog_id')->setUnsigned(false);
+        $cBlogRelUser->getColumn('user_id')->setUnsigned(false);
+        $cBlogRelUser->addIndex(['c_id']);
+
+        $schema->getTable('c_blog_task')->addIndex(['c_id']);
+
+        $cBlogTaskRelUser = $schema->getTable('c_blog_task_rel_user');
+        $cBlogTaskRelUser->getColumn('blog_id')->setUnsigned(false);
+        $cBlogTaskRelUser->getColumn('user_id')->setUnsigned(false);
+        $cBlogTaskRelUser->getColumn('task_id')->setUnsigned(false);
+        $cBlogTaskRelUser->addIndex(['c_id']);
+        $cBlogTaskRelUser->addIndex(['user_id']);
+        $cBlogTaskRelUser->addIndex(['task_id']);
+
+        $cCalendarEvent = $schema->getTable('c_calendar_event');
+        $cCalendarEvent->addIndex(['c_id']);
+
+        $schema->getTable('c_calendar_event_attachment')->addIndex(['c_id']);
+        $schema->getTable('c_calendar_event_repeat')->addIndex(['c_id']);
+        $schema->getTable('c_calendar_event_repeat_not')->addIndex(['c_id']);
+
+        $cChatConnected = $schema->getTable('c_chat_connected');
+        $cChatConnected->addIndex(['c_id']);
+        $cChatConnected->addIndex(['user_id']);
+
+        $schema->getTable('c_course_setting')->addIndex(['c_id']);
+        $schema->getTable('c_document')->addIndex(['c_id']);
+        $schema->getTable('c_dropbox_category')->addIndex(['c_id']);
+        $schema->getTable('c_dropbox_feedback')->addIndex(['c_id']);
+        $schema->getTable('c_dropbox_file')->addIndex(['c_id']);
+
+        $cDropboxPerson = $schema->getTable('c_dropbox_person');
+        $cDropboxPerson->addIndex(['c_id']);
+        $cDropboxPerson->addIndex(['user_id']);
+
+        $cDropboxPost = $schema->getTable('c_dropbox_post');
+        $cDropboxPost->addIndex(['c_id']);
+        $cDropboxPost->addIndex(['dest_user_id']);
+
+        $schema->getTable('c_forum_attachment')->addIndex(['c_id']);
+        $schema->getTable('c_forum_category')->addIndex(['c_id']);
+        $schema->getTable('c_forum_forum')->addIndex(['c_id']);
+
+        $cForumMailcue = $schema->getTable('c_forum_mailcue');
+        $cForumMailcue->addIndex(['c_id']);
+        $cForumMailcue->addIndex(['thread_id']);
+        $cForumMailcue->addIndex(['user_id']);
+        $cForumMailcue->addIndex(['post_id']);
+
+        $cForumNotification = $schema->getTable('c_forum_notification');
+        $cForumNotification->addIndex(['c_id']);
+        $cForumNotification->addIndex(['thread_id']);
+        $cForumNotification->addIndex(['post_id']);
+
+        $schema->getTable('c_forum_post')->addIndex(['c_id']);
+        $schema->getTable('c_forum_thread')->addIndex(['c_id']);
+        $schema->getTable('c_forum_thread_qualify')->addIndex(['c_id']);
+        $schema->getTable('c_forum_thread_qualify_log')->addIndex(['c_id']);
+        $schema->getTable('c_glossary')->addIndex(['c_id']);
+        $schema->getTable('c_group_category')->addIndex(['c_id']);
+        $schema->getTable('c_group_info')->addIndex(['c_id']);
+        $schema->getTable('c_group_rel_tutor')->addIndex(['c_id']);
+
+        $schema->getTable('c_group_rel_user')->addIndex(['c_id']);
+        $schema->getTable('c_link')->addIndex(['c_id']);
+        $schema->getTable('c_link_category')->addIndex(['c_id']);
+        $schema->getTable('c_lp')->addIndex(['c_id']);
+        $schema->getTable('c_lp_category')->addIndex(['c_id']);
+        $schema->getTable('c_lp_item')->addIndex(['c_id']);
+        $schema->getTable('c_lp_item_view')->addIndex(['c_id']);
+        $schema->getTable('c_lp_iv_interaction')->addIndex(['c_id']);
+        $schema->getTable('c_lp_iv_objective')->addIndex(['c_id']);
+        $schema->getTable('c_lp_view')->addIndex(['c_id']);
+        $schema->getTable('c_notebook')->addIndex(['c_id']);
+        $schema->getTable('c_online_connected')->addIndex(['c_id']);
+        $schema->getTable('c_online_link')->addIndex(['c_id']);
+        $schema->getTable('c_permission_group')->addIndex(['c_id']);
+        $schema->getTable('c_permission_task')->addIndex(['c_id']);
+        $schema->getTable('c_permission_user')->addIndex(['c_id']);
+        $schema->getTable('c_quiz')->addIndex(['c_id']);
+        $schema->getTable('c_quiz_answer')->addIndex(['c_id']);
+        $schema->getTable('c_quiz_question')->addIndex(['c_id']);
+        $schema->getTable('c_quiz_question_category')->addIndex(['c_id']);
+        $schema->getTable('c_quiz_question_option')->addIndex(['c_id']);
+        $schema->getTable('c_quiz_question_rel_category')->addIndex(['c_id']);
+
+        $cQuizRelQuestion = $schema->getTable('c_quiz_rel_question');
+        $cQuizRelQuestion->addIndex(['c_id']);
+        $cQuizRelQuestion->addIndex(['question_id']);
+        $cQuizRelQuestion->addIndex(['exercice_id']);
+
+        $schema->getTable('c_resource')->addIndex(['c_id']);
+
+        $schema->getTable('c_role')->addIndex(['c_id']);
+
+        $cRoleGroup = $schema->getTable('c_role_group');
+        $cRoleGroup->addIndex(['c_id']);
+        $cRoleGroup->addIndex(['group_id']);
+
+        $cRolePermissions = $schema->getTable('c_role_permissions');
+        $cRolePermissions->addIndex(['c_id']);
+        $cRolePermissions->addIndex(['role_id']);
+
+        $cRoleUser = $schema->getTable('c_role_user');
+        $cRoleUser->addIndex(['c_id']);
+        $cRoleUser->addIndex(['user_id']);
+
+        $schema->getTable('c_student_publication')->addIndex(['c_id']);
+        $schema->getTable('c_student_publication_assignment')->addIndex(['c_id']);
+
+        $cStudentPublicationComment = $schema->getTable('c_student_publication_comment');
+        $cStudentPublicationComment->addIndex(['c_id']);
+        $cStudentPublicationComment->addIndex(['user_id']);
+        $cStudentPublicationComment->addIndex(['work_id']);
+
+        $cStudentPublicationComment = $schema->getTable('c_student_publication_rel_document');
+        $cStudentPublicationComment->addIndex(['c_id']);
+        $cStudentPublicationComment->addIndex(['work_id']);
+        $cStudentPublicationComment->addIndex(['document_id']);
+
+        $cStudentPublicationComment = $schema->getTable('c_student_publication_rel_user');
+        $cStudentPublicationComment->addIndex(['c_id']);
+        $cStudentPublicationComment->addIndex(['work_id']);
+        $cStudentPublicationComment->addIndex(['user_id']);
+
+        $schema->getTable('c_survey')->addIndex(['c_id']);
+        $schema->getTable('c_survey_answer')->addIndex(['c_id']);
+        $schema->getTable('c_survey_group')->addIndex(['c_id']);
+        $schema->getTable('c_survey_invitation')->addIndex(['c_id']);
+        $schema->getTable('c_survey_question')->addIndex(['c_id']);
+        $schema->getTable('c_survey_question_option')->addIndex(['c_id']);
+        $schema->getTable('c_thematic')->addIndex(['c_id']);
+        $schema->getTable('c_thematic_advance')->addIndex(['c_id']);
+        $schema->getTable('c_thematic_plan')->addIndex(['c_id']);
+        $schema->getTable('c_tool')->addIndex(['c_id']);
+        $schema->getTable('c_tool_intro')->addIndex(['c_id']);
+        $schema->getTable('c_userinfo_content')->addIndex(['c_id']);
+        $schema->getTable('c_userinfo_def')->addIndex(['c_id']);
+        $schema->getTable('c_wiki')->addIndex(['c_id']);
+        $schema->getTable('c_wiki_conf')->addIndex(['c_id']);
+        $schema->getTable('c_wiki_discuss')->addIndex(['c_id']);
+
+        $cWikiMailcue = $schema->getTable('c_wiki_mailcue');
+        $cWikiMailcue->addIndex(['c_id']);
+        $cWikiMailcue->addIndex(['user_id']);
+
+        $schema->getTable('extra_field_values')->addForeignKeyConstraint('extra_field', ['field_id'], ['id']);
+
+        $session = $schema->getTable('session');
+        $session->getColumn('id_coach')->setUnsigned(false);
+        $session->addIndex(['session_category_id']);
+        $session->addIndex(['id_coach']);
+        $session->addForeignKeyConstraint('session_category', ['session_category_id'], ['id']);
+        $session->addForeignKeyConstraint('user', ['id_coach'], ['id']);
+
+        $this->connection->executeQuery('UPDATE session_category SET access_url_id = 1 WHERE access_url_id NOT IN (SELECT id FROM access_url)');
+
+        $sessionCategory = $schema->getTable('session_category');
+        $sessionCategory->addIndex(['access_url_id']);
+        $sessionCategory->addForeignKeyConstraint('access_url', ['access_url_id'], ['id']);
+
+        $sessionRelCourse = $schema->getTable('session_rel_course');
+        $sessionRelCourse->dropColumn('course_code');
+        $sessionRelCourse->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+        $sessionRelCourse->getColumn('c_id')->setUnsigned(false);
+        $sessionRelCourse->setPrimaryKey(['id']);
+        $sessionRelCourse->addIndex(['c_id']);
+        $sessionRelCourse->addIndex(['session_id']);
+        $sessionRelCourse->addForeignKeyConstraint('course', ['c_id'], ['id']);
+        $sessionRelCourse->addForeignKeyConstraint('session', ['session_id'], ['id']);
+
+        $this->connection->executeQuery('DELETE FROM session_rel_course_rel_user WHERE c_id NOT IN (SELECT id FROM course)');
+        $this->connection->executeQuery('DELETE FROM session_rel_course_rel_user WHERE session_id NOT IN (SELECT id FROM session)');
+        $this->connection->executeQuery('DELETE FROM session_rel_course_rel_user WHERE user_id NOT IN (SELECT id FROM user)');
+
+        $sessionRelCourseRelUser = $schema->getTable('session_rel_course_rel_user');
+        $sessionRelCourseRelUser->dropColumn('course_code');
+        $sessionRelCourseRelUser->addColumn('id', Type::INTEGER)->setAutoincrement(true);
+        $sessionRelCourseRelUser->getColumn('c_id')->setUnsigned(false);
+        $sessionRelCourseRelUser->setPrimaryKey(['id']);
+        $sessionRelCourseRelUser->addIndex(['c_id']);
+        $sessionRelCourseRelUser->addIndex(['session_id']);
+        $sessionRelCourseRelUser->addForeignKeyConstraint('course', ['c_id'], ['id']);
+        $sessionRelCourseRelUser->addForeignKeyConstraint('session', ['session_id'], ['id']);
+        $sessionRelCourseRelUser->addForeignKeyConstraint('user', ['user_id'], ['id']);
+
+        $this->connection->executeQuery('DELETE FROM session_rel_user WHERE user_id NOT IN (SELECT id FROM user)');
+        $this->connection->executeQuery('DELETE FROM session_rel_user WHERE session_id NOT IN (SELECT id FROM session)');
+
+        $sessionRelUser = $schema->getTable('session_rel_user');
+        $sessionRelUser->addColumn('moved_to', Type::INTEGER)->setNotnull(false);
+        $sessionRelUser->addColumn('moved_status', Type::INTEGER)->setNotnull(false);
+        $sessionRelUser->addColumn('moved_at', Type::DATETIME)->setNotnull(false);
+        $sessionRelUser->addIndex(['session_id']);
+        $sessionRelUser->addIndex(['user_id']);
+        $sessionRelUser->addIndex(['user_id', 'moved_to']);
+        $sessionRelUser->addForeignKeyConstraint('user', ['user_id'], ['id']);
+        $sessionRelUser->addForeignKeyConstraint('session', ['session_id'], ['id']);
+
+        $settingsCurrent = $schema->getTable('settings_current');
+        $settingsCurrent->addUniqueIndex(['variable', 'subkey', 'access_url']);
+
+        $settingsCurrent = $schema->getTable('settings_options');
+        $settingsCurrent->dropIndex('id');
+        $settingsCurrent->addUniqueIndex(['variable', 'value']);
+
+        $schema->getTable('track_e_access')->addIndex(['c_id']);
+        $schema->getTable('track_e_attempt')->addIndex(['c_id']);
+        $schema->getTable('track_e_course_access')->addIndex(['c_id']);
+
+        $trackEDefault = $schema->getTable('track_e_default');
+        $trackEDefault->addIndex(['c_id']);
+        $trackEDefault->addIndex(['session_id']);
+
+        $schema->getTable('track_e_downloads')->addIndex(['c_id']);
+        $schema->getTable('track_e_exercises')->addIndex(['c_id']);
+        $schema->getTable('track_e_hotpotatoes')->addIndex(['c_id']);
+        $schema->getTable('track_e_lastaccess')->addIndex(['c_id']);
+        $schema->getTable('track_e_links')->addIndex(['c_id']);
+        $schema->getTable('track_e_online')->addIndex(['c_id']);
+        $schema->getTable('track_e_uploads')->addIndex(['c_id']);
+        $schema->getTable('user')->addUniqueIndex(['username_canonical']);
+
+        $this->connection->executeQuery('DELETE FROM usergroup_rel_user WHERE user_id NOT IN (SELECT id FROM user)');
+        $this->connection->executeQuery('DELETE FROM usergroup_rel_user WHERE usergroup_id NOT IN (SELECT id FROM usergroup)');
+
+        $usergroupRelUSer = $schema->getTable('usergroup_rel_user');
+        $usergroupRelUSer->addIndex(['user_id']);
+        $usergroupRelUSer->addIndex(['usergroup_id']);
+        $usergroupRelUSer->addForeignKeyConstraint('usergroup', ['usergroup_id'], ['id']);
+        $usergroupRelUSer->addForeignKeyConstraint('user', ['user_id'], ['id']);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 34 - 0
app/Migrations/Schema/V110/Version20151119082400.php

@@ -0,0 +1,34 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Add new indexes
+ */
+class Version20151119082400 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $user = $schema->getTable('user');
+        $user->addIndex(['user_id']);
+
+        $userRelTag = $schema->getTable('user_rel_tag');
+        $userRelTag->addIndex(['user_id']);
+        $userRelTag->addIndex(['tag_id']);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 32 - 0
app/Migrations/Schema/V110/Version20151214164000.php

@@ -0,0 +1,32 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Add indexes
+ */
+class Version20151214164000 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $extraFieldValueTable = $schema->getTable('extra_field_values');
+        $extraFieldValueTable->addIndex(['field_id', 'item_id']);
+
+        $extraFieldTable = $schema->getTable('extra_field');
+        $extraFieldTable->addIndex(['extra_field_type']);
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 129 - 0
app/Migrations/Schema/V110/Version20151214170800.php

@@ -0,0 +1,129 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+use Doctrine\DBAL\Types\Type;
+
+/**
+ * Fix track_e_hotspot table and migrate hotspot/values
+ * In the wake of an issue with the hotspot code not being possible to update without moving from AS2 to AS3 (Flash), we
+ * have decided to rewrite the hotspot tool in JS.
+ * Little did we know that we would find out that the coordinates system in use by the Flash version of hotspot was in
+ * fact a projection into a square form of 360x360, not depending on the original size of the image, and that a square
+ * was defined by its center's coordinates and its width, with an initial not-null margin on the left and top borders.
+ * The migration below fixes those parallax issues.
+ */
+class Version20151214170800 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("ALTER TABLE track_e_hotspot ADD c_id INT NULL");
+        $this->addSql("ALTER TABLE track_e_hotspot MODIFY COLUMN hotspot_coordinate LONGTEXT NOT NULL");
+        $this->addSql("UPDATE track_e_hotspot SET c_id = (SELECT id FROM course WHERE code = hotspot_course_code)");
+
+        $answers = $this->connection->fetchAll("
+            SELECT a.iid, a.c_id, a.question_id, a.hotspot_coordinates, a.hotspot_type, q.picture, c.directory
+            FROM c_quiz_answer a
+            INNER JOIN c_quiz_question q
+                ON a.question_id = q.id
+            INNER JOIN course c
+                ON (a.c_id = c.id AND q.c_id = c.id)
+            WHERE a.hotspot_type IN ('square', 'circle', 'poly', 'delineation', 'oar')
+        ");
+
+        foreach ($answers as $answer) {
+            // Recover the real image size to recalculate coordinates
+            $imagePath = api_get_path(SYS_PATH) . "courses/{$answer['directory']}/document/images/{$answer['picture']}";
+            $imageSize = getimagesize($imagePath);
+            $widthRatio = $imageSize[0] / 360;
+            $heightRatio = $imageSize[1] / 360;
+            $oldCoords = $answer['hotspot_coordinates'];
+            $oldPairedString = explode('|', $oldCoords);
+            $newPairedString = [];
+
+            switch ($answer['hotspot_type']) {
+                case 'square':
+                    $oldCenter = explode(';', $oldPairedString[0]);
+
+                    $oldCenterX = intval($oldCenter[0]);
+                    $oldCenterY = intval($oldCenter[1]);
+                    $oldWidth = intval($oldPairedString[1]);
+                    $oldHeight = intval($oldPairedString[2]);
+
+                    $newX = floor(($oldCenterX - $oldWidth / 2) * $widthRatio) + ceil($widthRatio);
+                    $newY = floor(($oldCenterY - $oldHeight / 2) * $heightRatio) + ceil($heightRatio);
+                    $newWidth = ceil($oldWidth * $widthRatio) + ceil(1 * $heightRatio);
+                    $newHeight = ceil($oldHeight * $heightRatio) + floor(1 * $heightRatio);
+
+                    $newPairedString[] = implode(';', [$newX, $newY]);
+                    $newPairedString[] = $newWidth;
+                    $newPairedString[] = $newHeight;
+                    break;
+
+                case 'circle':
+                    $oldCenter = explode(';', $oldPairedString[0]);
+
+                    $oldCenterX = intval($oldCenter[0]);
+                    $oldCenterY = intval($oldCenter[1]);
+                    $oldRadiusX = intval($oldPairedString[1]) / 2;
+                    $oldRadiusY = intval($oldPairedString[2]) / 2;
+
+                    $newCenterX = floor($oldCenterX * $widthRatio) + ceil($widthRatio);
+                    $newCenterY = floor($oldCenterY * $heightRatio) + ceil($heightRatio);
+                    $newRadiusX = floor($oldRadiusX * $widthRatio);
+                    $newRadiusY = floor($oldRadiusY * $heightRatio);
+
+                    $newPairedString[] = implode(';', [$newCenterX, $newCenterY]);
+                    $newPairedString[] = $newRadiusX;
+                    $newPairedString[] = $newRadiusY;
+                    break;
+
+                case 'poly':
+                    //no break;
+                case 'delineation':
+                    //no break
+                case 'oar':
+                    $paired = [];
+
+                    foreach ($oldPairedString as $pairString) {
+                        $pair = explode(';', $pairString);
+                        $x = isset($pair[0]) ? intval($pair[0]) : 0;
+                        $y = isset($pair[1]) ? intval($pair[1]) : 0;
+
+                        $paired[] = [$x, $y];
+                    }
+
+                    foreach ($paired as $pair) {
+                        $x = floor($pair[0] * $widthRatio) + ceil($widthRatio);
+                        $y = ceil($pair[1] * $heightRatio);
+
+                        $newPairedString[] = implode(';', [$x, $y]);
+                    }
+                    break;
+            }
+
+            $stmt = $this->connection->prepare("
+                UPDATE c_quiz_answer
+                SET hotspot_coordinates = :coordinates
+                WHERE iid = :iid AND c_id = :cid
+            ");
+            $stmt->bindValue('coordinates', implode('|', $newPairedString), Type::TEXT);
+            $stmt->bindValue('iid', $answer['iid'], Type::INTEGER);
+            $stmt->bindValue('cid', $answer['c_id'], Type::INTEGER);
+            $stmt->execute();
+        }
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 52 - 0
app/Migrations/Schema/V110/Version20151221150100.php

@@ -0,0 +1,52 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Fix c_quiz_answer's correct field for id_auto
+ */
+class Version20151221150100 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql("
+            UPDATE track_e_attempt a
+            INNER JOIN c_quiz_answer qa
+            ON a.question_id = qa.question_id
+            INNER JOIN c_quiz_question q
+            ON qa.question_id = q.id
+            SET a.answer = qa.id_auto
+            WHERE
+                a.answer = qa.id AND
+                q.c_id = a.c_id AND
+                q.type IN (" . MATCHING . ", " . DRAGGABLE . ", " . MATCHING_DRAGGABLE . ")
+        ");
+
+        $this->addSql("
+            UPDATE c_quiz_answer a
+            INNER JOIN c_quiz_answer b
+            ON a.question_id = b.question_id
+            INNER JOIN c_quiz_question q
+            ON b.question_id = q.id
+            SET a.correct = b.id_auto
+            WHERE
+                a.correct = b.id AND
+                q.c_id = a.c_id AND
+                q.type IN (" . MATCHING . ", " . DRAGGABLE . ", " . MATCHING_DRAGGABLE . ")
+        ");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}

+ 29 - 0
app/Migrations/Schema/V110/Version20160707131900.php

@@ -0,0 +1,29 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Application\Migrations\Schema\V110;
+
+use Application\Migrations\AbstractMigrationChamilo;
+use Doctrine\DBAL\Schema\Schema;
+
+/**
+ * Fix c_quiz_answer's correct field for id_auto
+ */
+class Version20160707131900 extends AbstractMigrationChamilo
+{
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql(" 
+            ALTER TABLE c_quiz_answer ADD INDEX idx_cqa_q (question_id)");
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+    }
+}