get_manager(); if ($oldversion < 2020112900) { // Define table local_treestudyplan_gradeinc to be created. $table = new xmldb_table('local_treestudyplan_gradeinc'); // Adding fields to table local_treestudyplan_gradeinc. $table->add_field('id', XMLDB_TYPE_INTEGER, '18', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('grade_item_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('include', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0'); // Adding keys to table local_treestudyplan_gradeinc. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); $table->add_key('grade_item_id-id', XMLDB_KEY_FOREIGN, ['grade_item_id'], 'grade_item', ['id']); // Conditionally launch create table for local_treestudyplan_gradeinc. if (!$dbman->table_exists($table)) { $dbman->create_table($table); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2020112900, 'local', 'treestudyplan'); } if ($oldversion < 2020120301) { // Define field studyitem_id to be added to local_treestudyplan_gradeinc. $table = new xmldb_table('local_treestudyplan_gradeinc'); $field = new xmldb_field('studyitem_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null, 'include'); // Conditionally launch add field studyitem_id. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } $key = new xmldb_key('studyitem_id-id', XMLDB_KEY_FOREIGN, ['studyitem_id'], 'local_treestudyplan_item', ['id']); // Launch add key studyitem_id-id. $dbman->add_key($table, $key); // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2020120301, 'local', 'treestudyplan'); } if ($oldversion < 2020120500) { // Define table local_treestudyplan_gradecfg to be created. $table = new xmldb_table('local_treestudyplan_gradecfg'); // Adding fields to table local_treestudyplan_gradecfg. $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('scale_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('grade_points', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('min_completed', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('min_excellent', XMLDB_TYPE_INTEGER, '20', null, null, null, null); // Adding keys to table local_treestudyplan_gradecfg. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); $table->add_key('scale_id-id', XMLDB_KEY_FOREIGN, ['scale_id'], 'scale', ['id']); // Conditionally launch create table for local_treestudyplan_gradecfg. if (!$dbman->table_exists($table)) { $dbman->create_table($table); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2020120500, 'local', 'treestudyplan'); } if ($oldversion < 2021082300) { // Define field aggregation to be added to local_treestudyplan. $table = new xmldb_table('local_treestudyplan'); $field = new xmldb_field('aggregation', XMLDB_TYPE_CHAR, '30', null, XMLDB_NOTNULL, null, 'tristate', 'enddate'); // Conditionally launch add field aggregation. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Define field aggregation_config to be added to local_treestudyplan. $field = new xmldb_field('aggregation_config', XMLDB_TYPE_TEXT, null, null, null, null, null, 'aggregation'); // Conditionally launch add field aggregation_config. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2021082300, 'local', 'treestudyplan'); } if ($oldversion < 2021082600) { // Define field min_progress to be dropped from local_treestudyplan_gradecfg. $table = new xmldb_table('local_treestudyplan_gradecfg'); $field = new xmldb_field('min_excellent'); // Conditionally launch drop field min_progress. if ($dbman->field_exists($table, $field)) { $dbman->drop_field($table, $field); } $field = new xmldb_field('min_progress', XMLDB_TYPE_INTEGER, '20', null, null, null, null, 'min_completed'); // Conditionally launch add field min_progress. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2021082600, 'local', 'treestudyplan'); } if ($oldversion < 2021082601) { $table = new xmldb_table('local_treestudyplan_gradecfg'); // Changing type of field min_completed on table local_treestudyplan_gradecfg to number. $field = new xmldb_field('min_completed', XMLDB_TYPE_NUMBER, '20', null, null, null, null, 'grade_points'); // Launch change of type for field min_completed. $dbman->change_field_type($table, $field); // Changing type of field min_progress on table local_treestudyplan_gradecfg to number. $field = new xmldb_field('min_progress', XMLDB_TYPE_NUMBER, '20', null, null, null, null, 'min_completed'); // Launch change of type for field min_progress. $dbman->change_field_type($table, $field); // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2021082601, 'local', 'treestudyplan'); } if ($oldversion < 2021082700) { $table = new xmldb_table('local_treestudyplan_gradecfg'); // Changing precision of field min_completed on table local_treestudyplan_gradecfg to (20, 2). $field = new xmldb_field('min_completed', XMLDB_TYPE_NUMBER, '20, 1', null, null, null, null, 'grade_points'); // Launch change of precision for field min_completed. $dbman->change_field_precision($table, $field); // Changing precision of field min_progress on table local_treestudyplan_gradecfg to (20, 2). $field = new xmldb_field('min_progress', XMLDB_TYPE_NUMBER, '20, 1', null, null, null, null, 'min_completed'); // Launch change of precision for field min_progress. $dbman->change_field_precision($table, $field); // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2021082700, 'local', 'treestudyplan'); } if ($oldversion < 2021082701) { // Define field required to be added to local_treestudyplan_gradeinc. $table = new xmldb_table('local_treestudyplan_gradeinc'); $field = new xmldb_field('required', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'studyitem_id'); // Conditionally launch add field required. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2021082701, 'local', 'treestudyplan'); } if ($oldversion < 2023051700) { // Define field context_id to be added to local_treestudyplan. $table = new xmldb_table('local_treestudyplan'); $field = new xmldb_field('context_id', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'aggregation_config'); // Conditionally launch add field context_id. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2023051700, 'local', 'treestudyplan'); } if ($oldversion < 2023062603) { // Define field csync_flag to be added to local_treestudyplan. $table = new xmldb_table('local_treestudyplan'); $field = new xmldb_field('csync_flag', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '1', 'context_id'); // Conditionally launch add field csync_flag. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2023062603, 'local', 'treestudyplan'); } if ($oldversion < 2023063002) { // Define table local_treestudyplan_teachers to be created. $table = new xmldb_table('local_treestudyplan_teachers'); // Adding fields to table local_treestudyplan_teachers. $table->add_field('id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('teacher_id', XMLDB_TYPE_INTEGER, '10', null, null, null, null); $table->add_field('studyplan_id', XMLDB_TYPE_INTEGER, '10', null, null, null, null); $table->add_field('update_time', XMLDB_TYPE_INTEGER, '10', null, null, null, null); // Adding keys to table local_treestudyplan_teachers. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); // Conditionally launch create table for local_treestudyplan_teachers. if (!$dbman->table_exists($table)) { $dbman->create_table($table); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2023063002, 'local', 'treestudyplan'); } if ($oldversion < 2023071900) { /****** * Prepare the studyline table to hold links to pages insted of study plans * And drop the foreign key constraint for the studyplan_id-id relation */ // Define field page_id to be added to local_treestudyplan_line. $table = new xmldb_table('local_treestudyplan_line'); $field = new xmldb_field('page_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null, 'studyplan_id'); // Conditionally launch add field page_id. if (!$dbman->field_exists($table, $field)) { $dbman->add_field($table, $field); } // Define key studyplan_id-id (foreign) to be dropped form local_treestudyplan_line. $table = new xmldb_table('local_treestudyplan_line'); $key = new xmldb_key('studyplan_id-id', XMLDB_KEY_FOREIGN, ['studyplan_id'], 'local_treestudyplan', ['id']); // Launch drop key studyplan_id-id. $dbman->drop_key($table, $key); /****** * Create the page table and copy data from treestudyplan there * Also re-link the studylines to the newly created page instead of the studyplan */ // Define table local_treestudyplan_page to be created. $table = new xmldb_table('local_treestudyplan_page'); // Adding fields to table local_treestudyplan_page. $table->add_field('id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('studyplan_id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, null, '0'); $table->add_field('periods', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, '0'); $table->add_field('fullname', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('shortname', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('description', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('startdate', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('enddate', XMLDB_TYPE_TEXT, null, null, null, null, null); // Adding keys to table local_treestudyplan_page. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); // Conditionally launch create table for local_treestudyplan_page. if (!$dbman->table_exists($table)) { $dbman->create_table($table); // Create a page 0 with it's data copied $plans = $DB->get_recordset("local_treestudyplan"); foreach($plans as $p){ $o = [ "studyplan_id" => $p->id, "periods" => $p->slots, "fullname" => $p->name, "shortname" => $p->shortname, "description" => $p->description, "startdate" => $p->startdate, "enddate" => $p->enddate, ]; $pageid = $DB->insert_record("local_treestudyplan_page",$o); // Now find all studyline references to the studyplan // And update their record to reference the page instead of the plan $lines = $DB->get_recordset("local_treestudyplan_line",["studyplan_id" => $p->id]); foreach($lines as $l){ $lo = [ "id" => $l->id, "page_id"=> $pageid, ]; $DB->update_record("local_treestudyplan_line",$lo); } $lines->close(); } $plans->close(); } /** * Finalize studyline table to drop studyplan_id field and have page id be a non-nullable and foreign key */ // Changing nullability of field page_id on table local_treestudyplan_line to not null. $table = new xmldb_table('local_treestudyplan_line'); $field = new xmldb_field('page_id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, null, null, 'studyplan_id'); // Launch change of nullability for field page_id. $dbman->change_field_notnull($table, $field); // Define field studyplan_id to be dropped from local_treestudyplan_line. $table = new xmldb_table('local_treestudyplan_line'); $field = new xmldb_field('studyplan_id'); // Conditionally launch drop field studyplan_id. if ($dbman->field_exists($table, $field)) { $dbman->drop_field($table, $field); } // Define key page_id-id (foreign) to be added to local_treestudyplan_line. $table = new xmldb_table('local_treestudyplan_line'); $key = new xmldb_key('page_id-id', XMLDB_KEY_FOREIGN, ['page_id'], 'local_treestudyplan_page', ['id']); // Launch add key page_id-id. $dbman->add_key($table, $key); /*** * Create Period table and make a period record for all studyplan periods */ // Define table local_treestudyplan_period to be created. $table = new xmldb_table('local_treestudyplan_period'); // Adding fields to table local_treestudyplan_period. $table->add_field('id', XMLDB_TYPE_INTEGER, '20', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); $table->add_field('page_id', XMLDB_TYPE_INTEGER, '20', null, null, null, null); $table->add_field('period', XMLDB_TYPE_INTEGER, '10', null, null, null, null); $table->add_field('startdate', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('enddate', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('shortname', XMLDB_TYPE_TEXT, null, null, null, null, null); $table->add_field('fullname', XMLDB_TYPE_TEXT, null, null, null, null, null); // Adding keys to table local_treestudyplan_period. $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); $table->add_key('page_id-id', XMLDB_KEY_FOREIGN, ['page_id'], 'local_treestudyplan_page', ['id']); // Conditionally launch create table for local_treestudyplan_period. if (!$dbman->table_exists($table)) { $dbman->create_table($table); // Create a period page for all slots in the study $recordset = $DB->get_recordset("local_treestudyplan_page"); foreach($recordset as $r){ // Make a best guess for the periods based on the specified period for the plan and the $pcount = $r->periods; $ystart = strtotime($r->startdate)+0; $yend = strtotime($r->enddate)+0; if($yend < $ystart){ // If no end time is given, assume a year duration for period calculations $ydelta = (365*24*60*60)/$pcount; } $ydelta = $yend - $ystart; $ptime = $ydelta / $pcount; for($i=0; $i < $pcount; $i++){ $pnum = $i+1; $pstart = $ystart + ($i*$ptime); $pend = $pstart + $ptime; $o = [ "page_id" => $r->id, "period" => $pnum, "fullname" => "Period {$pnum}", "shortname" => "P{$pnum}", "startdate" => date("Y-m-d",$pstart), "enddate" => date("Y-m-d",$pend) ]; $DB->insert_record("local_treestudyplan_period",$o); } } $recordset->close(); } // Treestudyplan savepoint reached. upgrade_plugin_savepoint(true, 2023071900, 'local', 'treestudyplan'); } return true; }