$value) { if (in_array($category, config('ZERMELO_CATEGORY_IGNORE'))) continue; $categorieen_leerling++; $leerlingen += count($value); } $docenten = count($udmz['Docent']); $groepen = 0; $categorieen_groep = 0; foreach ($udmz['Groep'] as $category => $value) { if (in_array($category, config('ZERMELO_CATEGORY_IGNORE'))) continue; $categorieen_groep++; foreach ($value as $id => $row) { if (in_array($id, config('ZERMELO_GROUP_IGNORE'))) continue; $groepen++; } } $lessen = count($udmz['Les']); /* logit('Categorieen leerling: '.$categorieen_leerling); logit('Leerlingen: '.$leerlingen); logit('Docenten: '.$docenten); logit('Categorieen groep: '.$categorieen_groep); logit('Groepen: '.$groepen); logit('Lessen: '.$lessen); */ $total = $categorieen_leerling + $leerlingen + $categorieen_groep + $groepen + $docenten + $lessen; $done = 0; lock_renew_helper(2, $done/$total); foreach ($udmz['Leerling'] as $category => $list) { if (in_array($category, config('ZERMELO_CATEGORY_IGNORE'))) continue; incdone($done, $total, 2); if (!($category_id = add_entity($category, CATEGORIE))) return; foreach ($list as $id => $row) { incdone($done, $total, 2); if (!checkset($row, "Leerling.$category", array('LASTNAME', 'FIRSTNAME', 'BETWEENNAME', 'BASICCLASS'))) return; if (!($leerling_id = add_entity($id, LEERLING))) return; insert_name($leerling_id, $row['FIRSTNAME'], $row['BETWEENNAME'], $row['LASTNAME']); if (!($lesgroep_id = add_entity($row['BASICCLASS'], STAMKLAS))) return; $stamz[$row['BASICCLASS']] = $category; add_basis_grp2ppl($lesgroep_id, $leerling_id, $file_id); add_basis_grp2ppl($category_id, $leerling_id, $file_id); } } lock_renew_helper(2, $done/$total); foreach ($udmz['Docent'] as $id => $row) { incdone($done, $total, 2); if (!checkset($row, 'Docent', array ('Voornaam', 'Tussenvoegsel', 'Achternaam', 'e-mail'))) return; if (!($docent_id = add_entity($id, DOCENT))) return; if ($row['Achternaam'] != '' && $row['Voornaam'] != '') insert_name($docent_id, substr($row['Voornaam'], 0, 1).'.', $row['Tussenvoegsel'], $row['Achternaam'], $row['e-mail']); } lock_renew_helper(2, $done/$total); foreach ($udmz['Groep'] as $category => $list) { if (in_array($category, config('ZERMELO_CATEGORY_IGNORE'))) continue; incdone($done, $total, 2); if (!($category_id = add_entity($category, CATEGORIE))) return; foreach ($list as $id => $row) { if (in_array($id, config('ZERMELO_GROUP_IGNORE'))) continue; incdone($done, $total, 2); if (isset($stamz[$id])) { if ($stamz[$id] != $category) logit('stamklas in andere categorie?!?!?'); else continue; // doe niks, want stamklassen hebben we al } if (!checkset($row, "Groep.$category", array('SET'))) return; if (!($lesgroep_id = add_entity($category.'.'.$id, LESGROEP))) return; if ($row['SET'] == '') continue; // geen leerlingen in deze groep foreach (explode(',', $row['SET']) as $leerlingnummer) { if (!($leerling_id = add_entity($leerlingnummer, LEERLING))) return; add_basis_grp2ppl($lesgroep_id, $leerling_id, $file_id); } } } lock_renew_helper(2, $done/$total); mdb2_exec(<< $row) { incdone($done, $total, 2); if (!checkset($row, 'Les', array('Dag', 'Uur', 'Vak', 'Grp', 'Doc', 'Lok'))) return; if (!($zermelo_id = add_zermelo_id($id))) return; insert_les(',', $zermelo_id, $row['Dag'], $row['Uur'], $row['Vak'], $row['Grp'], $row['Doc'], $row['Lok'], $file_id); } // als we hier zijn, dan is alles goed gegaan mdb2_exec("UPDATE files SET file_status = 1 WHERE file_id = $file_id"); lock_renew_helper(3, $done/$total); } function import_wijzigingen($file_id, $week, $tmp_name) { global $wijz; unset($GLOBALS['wijz']); $wijz = array(); lock_renew_helper(1); // als de roostermakers roosterwijzigingen wissen, dan zou de wijzigingenfile kleiner moeten worden // zermelo doet overwrite zonder truncate, na het wissen van roosterwijzigingen kunnen secties dubbel // voorkomen. Dat negeren we, want we hebben alleen de eerste sectie nodig read_all_sections($sections, $tmp_name, true); if ($sections === false) fatal_error('read error on '.$tmp_name.', unable to perform update'); // a previous update may have gone wrong, cleanup just in case mdb2_exec("DELETE FROM files2lessen WHERE file_id = $file_id"); //logit('no_sections='.count($sections)); //foreach ($sections as $section => $lines) { // logit('section name '.$section.', '.count($lines).' lines'); //} $total = count($sections['PREAMBULE']); $done = 0; lock_renew_helper(2, 0); foreach ($sections['PREAMBULE'] as $atoms) { incdone($done, $total, 2); $old = explode(',', $atoms[1]); $new = explode(',', $atoms[2]); $max = count($atoms) - 1; if ($max < 5) { logit('te weinig records in roosterwijziging'); continue; } if ($max > 6) { logit('(te?) veel records in roosterwijziging'); } if ($atoms[$max - 1] != 'WEEKNUMMERS') { logit("onverwachte data in op een-na-laatste record van wijzigingen, verwacht WEEKNUMMERS: "); print_r($atoms); continue; } /* if ($atoms[$max] != $week) { logit("onverwachte data in laatste record van wijzigingen, verwacht $week"); return; } */ if ($atoms[1] == '0' && $atoms[2] == '0') { // dit is een wijziging van niks naar niks WTF?!?!? continue; } if ($max == 6) { $notitie = $atoms[4]; //logit("notitie van roostermakers: ".$atoms[4]); } else $notitie = NULL; if ($atoms[2] == '0') { // lesuitval if (!($zermelo_id = add_zermelo_id($old[0]))) return; insert_les('/', $zermelo_id, '', '', '', '', '', '', $file_id, $notitie); } else { // echte wijziging? if (count($new) != 9 || ($atoms[1] != 0 && count($old) != 9)) { print_r($old); print_r($new); logit('rare leswijziging, deze negeren we'); continue; } if (!($zermelo_id = add_zermelo_id($new[0]))) return; insert_les('/', $zermelo_id, $new[7], $new[5], $new[4], $new[1], $new[2], $new[3], $file_id, $notitie); } } // als we hier zijn, dan is alles goed gegaan mdb2_exec("UPDATE files SET file_status = 1 WHERE file_id = $file_id"); lock_renew_helper(3, $done/$total); } switch ($_FILES['uploadedfile']['error']) { case UPLOAD_ERR_INI_SIZE: fatal_error('ge-uploade file te groot volgens php.ini'); case UPLOAD_ERR_FORM_SIZE: fatal_error('ge-uploade file te groot volgens policy van roosterphp'); case UPLOAD_ERR_PARTIAL: fatal_error('upload mislukt, file slechts gedeeltelijk aangekomen'); case UPLOAD_ERR_NO_FILE: fatal_error('er is geen file geupload, omdat er geen geselecteerd was'); case UPLOAD_ERR_NO_TMP_DIR: fatal_error('kan de file nergens kwijt, Rik moet vragen aan Gert'); case UPLOAD_ERR_CANT_WRITE: fatal_error('schijf vol?, Rik moet vragen aan Gert'); case UPLOAD_ERR_OK: break; default: fatal_error('onmogelijke error'); } $filename = $_FILES['uploadedfile']['name']; function shutdown_function() { lock_release(); if (connection_aborted()) { fatal_error('user cancel'); } } register_shutdown_function('shutdown_function'); if (!lock_acquire('{ "state": 1, "perc": 0 }', $_POST['randid'])) fatal_error('er is al een update bezig, even geduld AUB'); // cache contents of table entities $res =& mdb2_query('SELECT entity_name, entity_id, entity_type FROM entities'); $entities = $res->fetchAll(MDB2_FETCHMODE_ORDERED, true); $res->free(); // cache een lijst leerlingen van wie we de naam al weten $res =& mdb2_query('SELECT entity_id, name FROM names'); $names = $res->fetchAll(MDB2_FETCHMODE_ORDERED, true); $res->free(); // cache een lijst met zermelo_id's $res =& mdb2_query('SELECT zermelo_id_orig, zermelo_id FROM zermelo_ids'); $zermelo_ids = $res->fetchAll(MDB2_FETCHMODE_ORDERED, true); $res->free(); $stamz = array(); function move_upload($bw, $md5, $week) { $new_filename = config('DATADIR').$bw.'-'.$week.'-'.$md5.'.'.(($bw == 'basis')?'udmz':'txt'); //logit('we slaan de upload op als '.$new_filename); if (!move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $new_filename)) { logit('unable to store uploaded file for future reference'); } return $new_filename; } if ($_POST['type'] == 'wijz' && preg_match('/^roosterwijzigingen_wk(\d+).txt$/', $filename, $matches)) { $week = $matches[1]; //logit('ontvangen roosterwijzigingen van week '.$week); $week_id = mdb2_single_val("SELECT week_id FROM weken WHERE week = %i", $week); if (!$week_id) fatal_error('wijzingingen geupload van een week die geen lesweek is?!?!'); $basis_id = mdb2_single_val("SELECT basis_id FROM roosters WHERE week_id = $week_id AND wijz_id = 0 ORDER BY rooster_id DESC LIMIT 1"); if (!$basis_id) fatal_error('geen basisrooster beschikbaar in deze week, dus er kunnen geen wijzingen op'); $md5 = calc_md5($_FILES['uploadedfile']['tmp_name']); $file_id = get_file_id($md5, 2, 1); if (!$file_id) { $file_id = get_file_id($md5, 2, 0); if ($file_id) logit('deze wijzigingen kennen we al, maar import is eerder mis gegaan'); else { mdb2_exec("INSERT INTO files ( file_name, file_md5, file_time, file_type, file_status ) VALUES ( '%q', '$md5', %i, 2, 0 )", $filename, time()); $file_id = get_file_id($md5, 2, 0); } $new_filename = move_upload('wijz', $md5, $week); import_wijzigingen($file_id, $week, $new_filename); $status = mdb2_single_val("SELECT file_status FROM files WHERE file_id = $file_id"); if (!$status) fatal_error('de import is fout gegaan, we kunnen deze wijzigingen niet publiceren :(, mail snelr@ovc.nl'); //logit('import succesvol, nu nog koppelen aan weken'); } else { //logit('file was al succesvol geimporteerd'); } $wijz_id = mdb2_single_val("SELECT MAX(wijz_id) FROM roosters WHERE week_id = $week_id AND basis_id = $basis_id"); if (!$wijz_id) $wijz_id = 0; if (!mdb2_single_val("SELECT rooster_id FROM roosters WHERE basis_id = $basis_id AND file_id = $file_id AND wijz_id = $wijz_id")) { $wijz_id++; mdb2_exec("INSERT INTO roosters ( week_id, file_id, basis_id, wijz_id, timestamp ) VALUES ( $week_id, $file_id, $basis_id, $wijz_id, %i )", time()); } else fatal_error('deze wijzigigen hebben we al op deze week bij het meest recente basisrooster dat geldt voor deze week'); } else if ($_POST['type'] == 'basis' && preg_match('/^Schooljaar (\d{4})-(\d{4})_(\d+).udmz$/', $filename, $matches)) { $year_start = $matches[1]; $year_end = $matches[2]; $version = $matches[3]; //logit('ontv basis '.$year_start.'/'.$year_end.' versie '.$version); if (mdb2_single_val("SELECT rooster_id FROM roosters WHERE week_id = %i", $_POST['week_id']) && isset($_POST['overwrite']) && $_POST['overwrite'] != 'true') fatal_error("er staat al een basisrooster in deze week, vink de checkbox aan als je wilt overschrijven"); $md5 = calc_md5($_FILES['uploadedfile']['tmp_name']); $file_id = get_file_id($md5, 1, 1); $week = mdb2_single_val("SELECT week FROM weken WHERE week_id = %i", $_POST['week_id']); if (!$file_id) { $file_id = get_file_id($md5, 1, 0); if ($file_id) logit('dit basisrooster kennen we al, maar de import is eerder mis gegaan'); else { mdb2_exec("INSERT INTO files ( file_name, file_md5, file_time, file_type, file_status, file_version ) VALUES ( '%q', '$md5', %i, 1, 0, $version )", $filename, time()); $file_id = get_file_id($md5, 1, 0); } $new_filename = move_upload('basis', $md5, $week); import_basisrooster($file_id, $new_filename); $status = mdb2_single_val("SELECT file_status FROM files WHERE file_id = $file_id"); if (!$status) fatal_error('de import is fout gegaan, we kunnen dit rooster niet publiceren :(, mail snelr@ovc.nl'); //logit('import succesvol, nu nog koppelen aan weken'); } else { //logit('file was al succesvol geimporteerd'); } $basis_id = mdb2_single_val("SELECT MAX(basis_id) FROM roosters"); if (!$basis_id) $basis_id = 0; // fixme, controleer of deze upload invloed heeft op de roosters // als er op geen enkel rooster invloed heeft (dit is het huidige basisrooster voor alle weken waarop deze upload van toepassing is en in geen enkele week // zijn wijzigingen ingelezen) dan moet er geen update worden geregistreerd $basis_id++; mdb2_exec("INSERT INTO roosters ( week_id, file_id, basis_id, wijz_id, timestamp ) VALUES ( %i, $file_id, $basis_id, 0, %i )", $_POST['week_id'], time()); } else fatal_error('filename niet herkend, we verwachten een file van de vorm Schooljaar 2013-2014_234.udmz (basisrooster) of roosterwijzigingen_wk39.txt (wijzigingen)'); logit("alles is goed gegaan"); // lock automatically released in shutdown function ?>