start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_lesson", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { //echo $buffer; $result .= "+"; $buffer = utf8_encode(rtrim($buffer)); $data = explode("\t", $buffer); if (count($data) != 10) throw new \Exception('Wrong size of elements '); $dataobject = (object)array('teacher' => $data[0], 'day' => $data[1], 'period' => $data[2], 'subject' => $data[3], 'room' => $data[4], 'lessonid'=> $data[5], 'flag' => $data[6], 'class' => $data[7], 'week' => $data[8], 'unknown' => $data[9]); $DB->insert_record("timetable_lesson", $dataobject); } $transaction->allow_commit(); set_config('filehash_lesson', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return ($result); } private function update_substitution($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_substitution'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result =""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_substitution", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $data = str_getcsv($buffer, ','); $dataobject = (object)array( 'id' => $data[0], 'date' => $data[1], 'period' => $data[2], 'absence' => $data[3], 'lesson' => $data[4], 'teachera' => $data[5], 'teacherb' => $data[6], 'subjecta' => utf8_encode($data[7]), 'statistica' => $data[8], 'subjectb' => utf8_encode($data[9]), 'statisticb' => $data[10], 'rooma' => $data[11], 'roomb' => $data[12], 'statisticflag' => $data[13], 'classa' => utf8_encode($data[14]), 'reason' => utf8_encode($data[15]), 'text' => utf8_encode($data[16]), 'type' => $data[17], 'classb' => utf8_encode($data[18]), 'substitutiontype' => $data[19], 'changetime' => $data[20], 'unknown' => $data[21]); //echo var_dump($dataobject); foreach (get_object_vars($dataobject) as $key => $value) { if ($value=='') unset($dataobject->{$key}); } $DB->insert_record_raw("timetable_substitution", $dataobject,false, false, true); } $transaction->allow_commit(); set_config('filehash_substitution', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_teacher($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_teacher'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_teacher", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $buffer = utf8_encode(rtrim($buffer)); $data = explode("\t", $buffer); if (!(array_key_exists(3,$data))) { $data[3] = ''; } else { $result .= "firstname exists: $data[3]\n"; } //if (count($data) < 3) throw new Exception('Wrong size of elements'); $dataobject = (object)array('teacher' => $data[0], 'surname' => $data[1], 'firstname' => $data[3]); $DB->insert_record("timetable_teacher", $dataobject); } $transaction->allow_commit(); set_config('filehash_teacher', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_room($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_room'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_room", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $buffer = utf8_encode(rtrim($buffer)); $data = explode("\t", $buffer); if (count($data) < 2) throw new \Exception('Wrong size of elements'); $dataobject = (object)array('room' => $data[0], 'description' => $data[1]); $DB->insert_record("timetable_room", $dataobject); } $transaction->allow_commit(); set_config('filehash_room', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_class($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_class'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_class", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $buffer = utf8_encode(rtrim($buffer)); $data = explode("\t", $buffer); if (!(array_key_exists(1,$data))) $data[1] = $data[0]; if (count($data) < 2) throw new \Exception('Wrong size of elements'); $dataobject = (object)array('class' => $data[0], 'description' => $data[1]); $DB->insert_record("timetable_class", $dataobject); } $transaction->allow_commit(); set_config('filehash_class', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_absence($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_abs'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_absence", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $data = str_getcsv($buffer, ','); $dataobject = (object)array('id' => $data[0], 'type' => $data[1], 'name' => utf8_encode($data[2]), 'startdate' => $data[3], 'enddate' => $data[4], 'startperiod' => $data[5], 'endperiod' => $data[6], 'reason' => utf8_encode($data[7]), 'text' => utf8_encode($data[8])); foreach (get_object_vars($dataobject) as $key => $value) { if ($value=='') unset($dataobject->{$key}); } $DB->insert_record("timetable_absence", $dataobject); } $transaction->allow_commit(); set_config('filehash_abs', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_absence_reason($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_absreas'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_absence_reason", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $data = str_getcsv($buffer, ','); $dataobject = (object)array('reason' => utf8_encode($data[0]), 'description' => utf8_encode($data[1]), 'flag' => $data[2], 'statistic' => $data[3]); foreach (get_object_vars($dataobject) as $key => $value) { if ($value=='') unset($dataobject->{$key}); } $DB->insert_record("timetable_absence_reason", $dataobject); } $transaction->allow_commit(); set_config('filehash_absreas', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } private function update_time($content) { global $DB,$CFG; $filehash = get_config('timetable', 'filehash_times'); $hash = md5($content); if ($hash == $filehash) return('Data not changed'); $result = ""; try { $transaction = $DB->start_delegated_transaction(); $result .= "before delete\n"; $DB->delete_records_select("timetable_time", "id>0"); $result .= "after delete\n"; foreach (preg_split('/$\R?^/m',$content) as $buffer) { $buffer = utf8_encode(rtrim($buffer)); $data = explode("\t", $buffer); $dataobject = (object)array('day' => $data[0], 'period' => $data[1], 'maxperiod' => $data[2], 'starttime' => $data[3], 'endtime' => $data[4]); $DB->insert_record("timetable_time", $dataobject); } $transaction->allow_commit(); set_config('filehash_times', $hash, 'timetable'); } catch(Exception $e) { $transaction->rollback($e); } return $result; } /** * Execute the task. */ public function update($files) { global $DB,$CFG; $results = array(); foreach ($files as $file) { $content = base64_decode($file['content']); $result = array(); $result['name'] = $file['name']; switch ($file['name']) { case 'lesson': $result['result'] = $this->update_lesson($content); break; case 'substitution': $result['result'] = $this->update_substitution($content); break; case 'teacher': $result['result'] = $this->update_teacher($content); break; case 'class': $result['result'] = $this->update_class($content); break; case 'room': $result['result'] = $this->update_room($content); break; case 'time': $result['result'] = $this->update_time($content); break; case 'absence': $result['result'] = $this->update_absence($content); break; case 'absence_reason': $result['result'] = $this->update_absence_reason($content); break; default: $result['result'] = "no handler"; } $results[] = $result; } return $results; } }