diff --git a/common.inc.php b/common.inc.php index 5524c6c..9d6434f 100644 --- a/common.inc.php +++ b/common.inc.php @@ -623,6 +623,33 @@ function countRaceStats(array $zaznamy, bool $is_sdil_dopr_on): array return $stats; } +function gen_modify_flag_v2b($val_last,$val_new) +{ // varianta s ignorovanim zmeny terminu a zmeny v zavode pokud je zaroven vytvoren zavod + // povolene vysledne hodnoty 0,1,2,4,5 + // + // puvodni + // 0 1 2 4 5 + // n 0 | 0 | 1 | 2 | 4 | 5 + // o 1 | 1 | 1 | 2 | 5 | 5 + // v 4 | 4 | 5 | 2 | 4 | 5 + // e 5 | 5 | 5 | 2 | 5 | 5 + + global $g_modify_flag; + + if ($val_last == $val_new || $val_new == 0) // beze zmeny, nebo stejna zmena + $v1 = $val_last; + else if (($val_last & $g_modify_flag [1]['id'] ) != 0) // byl vytvoren (top level flag) + $v1 = $g_modify_flag [1]['id'] ; + else + { + if (($val_last & $g_modify_flag [0]['id'] ) != 0 || ($val_last & $g_modify_flag [2]['id'] ) != 0) + $v1 = $g_modify_flag [0]['id'] + $g_modify_flag [2]['id']; + else + $v1 = $val_new; + } + return $v1; +} + function RenderRaceStats( array $stats, bool $is_spol_dopr_on, diff --git a/connectors.php b/connectors.php index 69f2456..c0ffd9a 100644 --- a/connectors.php +++ b/connectors.php @@ -27,10 +27,11 @@ class RaceInfo { public $etap; public $poznamka; public $vicedenni; - public $oddil; - public $modify_flag; - public $kategorie; - public $startovne; + public $oddil; + public $modify_flag; + public $kategorie; + public $startovne; + public $cancelled; // Constructor to initialize the object with key-value pairs public function __construct($data) { @@ -56,11 +57,12 @@ public function __construct($data) { $this->poznamka = $data['poznamka'] ?? null; $this->vicedenni = $data['vicedenni'] ?? null; $this->oddil = $data['oddil'] ?? null; - $this->modify_flag = $data['modify_flag'] ?? null; - $this->kategorie = $data['kategorie'] ?? null; - $this->startovne = $data['startovne'] ?? null; - } -} + $this->modify_flag = $data['modify_flag'] ?? null; + $this->kategorie = $data['kategorie'] ?? null; + $this->startovne = $data['startovne'] ?? null; + $this->cancelled = $data['cancelled'] ?? null; + } +} class RacePayement { public int $raceId; @@ -271,12 +273,13 @@ public function getRaceInfo($raceId) : RaceInfo { 'koeficient2' => $raceData['EntryKoef3'], 'etap' => $raceData['Stages'], // 'poznamka' => $poznamka, - 'vicedenni' => ($raceData['Stages']>1?1:0), - 'oddil' => $oddily, - 'modify_flag' => 0, - 'kategorie' => implode(';', array_keys ( $classFees ) ), - 'startovne' => $classFees - ]); + 'vicedenni' => ($raceData['Stages']>1?1:0), + 'oddil' => $oddily, + 'modify_flag' => 0, + 'kategorie' => implode(';', array_keys ( $classFees ) ), + 'startovne' => $classFees, + 'cancelled' => (!empty($raceData['Cancelled']) || !empty($raceData['Canceled']) || !empty($raceData['cancelled']) || !empty($raceData['canceled'])) ? 1 : 0 + ]); } else { return null; // Return null if race not found or error } diff --git a/race_edit.php b/race_edit.php index 4fe2f4d..48f83b3 100644 --- a/race_edit.php +++ b/race_edit.php @@ -102,6 +102,7 @@ function checkDates() DrawPageTitle('Editace parametrů závodu'); $id = (IsSet($id) && is_numeric($id)) ? (int)$id : 0; +$refresh_parent = (IsSet($refresh_parent) && (int)$refresh_parent == 0) ? 0 : 1; $ext_id = (IsSet($ext_id)) ? $ext_id : ''; $ext_id_info = ''; @@ -136,7 +137,7 @@ function checkDates() { // vicedenni ?> -
+ @@ -154,7 +155,7 @@ function checkDates() else { // jednodenni ?> - +
@@ -184,7 +185,7 @@ function toggleButtonState() { '); - echo('
'); + echo('
'); echo(''); } else { echo(''); diff --git a/race_edit_exc.php b/race_edit_exc.php index 4714392..7417cce 100644 --- a/race_edit_exc.php +++ b/race_edit_exc.php @@ -18,34 +18,9 @@ $id = (IsSet($id) && is_numeric($id)) ? (int)$id : 0; $rtype = (IsSet($rtype)&& is_numeric($rtype)) ? (int)$rtype : 0; +$refresh_parent = (IsSet($refresh_parent) && (int)$refresh_parent == 0) ? 0 : 1; $datum = String2DateDMY($datum); -function gen_modify_flag_v2b($val_last,$val_new) -{ // varianta s ignorovanim zmeny terminu a zmeny v zavode pokud je zaroven vytvoren zavod - // povolene vysledne hodnoty 0,1,2,4,5 - // - // puvodni - // 0 1 2 4 5 - // n 0 | 0 | 1 | 2 | 4 | 5 - // o 1 | 1 | 1 | 2 | 5 | 5 - // v 4 | 4 | 5 | 2 | 4 | 5 - // e 5 | 5 | 5 | 2 | 5 | 5 - - global $g_modify_flag; - - if ($val_last == $val_new || $val_new == 0) // beze zmeny, nebo stejna zmena - $v1 = $val_last; - else if (($val_last & $g_modify_flag [1]['id'] ) != 0) // byl vytvoren (top level flag) - $v1 = $g_modify_flag [1]['id'] ; - else - { - if (($val_last & $g_modify_flag [0]['id'] ) != 0 || ($val_last & $g_modify_flag [2]['id'] ) != 0) - $v1 = $g_modify_flag [0]['id'] + $g_modify_flag [2]['id']; - else - $v1 = $val_new; - } - return $v1; -} if( $rtype == 1) { // vicedenni @@ -137,7 +112,11 @@ function gen_modify_flag_v2b($val_last,$val_new) } ?> diff --git a/race_imports.php b/race_imports.php index fb62572..322bd76 100644 --- a/race_imports.php +++ b/race_imports.php @@ -27,7 +27,7 @@ require_once ("./header.inc.php"); // header obsahuje uvod html a konci require_once ("./common.inc.php"); -DrawPageTitle('Import závodu ze systému Oris'); +DrawPageTitle('Import závodu ze systému '.$connector->getSystemName()); DrawPageSubTitle('V rozmezí od '.$from.' do '.$to); ?> diff --git a/race_imports_update.php b/race_imports_update.php new file mode 100644 index 0000000..f747d7c --- /dev/null +++ b/race_imports_update.php @@ -0,0 +1,116 @@ +'); + exit; +} + +db_Connect(); + +require_once ("./header.inc.php"); // header obsahuje uvod html a konci +require_once ("./common.inc.php"); +require_once ('./url.inc.php'); +require_once ("./ct_renderer_races.inc.php"); + +DrawPageTitle('Aktualizace závodů ze systému '.$connector->getSystemName()); +DrawPageSubTitle('Budoucí závody uložené v přihláškovém systému'); + +$curr_date = GetCurrentDate(); +$query = "SELECT id, datum, datum2, nazev, oddil, typ0, typ, vicedenni, odkaz, misto, cancelled, kapacita, kategorie, ext_id, prihlasenych FROM ".TBL_RACE + ." WHERE ((datum >= '".$curr_date."') OR (datum2 >= '".$curr_date."'))" + ." ORDER BY datum, datum2, id"; +@$vysledek = query_db($query); +$zavody = ($vysledek !== FALSE) ? mysqli_fetch_all($vysledek, MYSQLI_ASSOC) : []; +?> + + +
'.$ext_id_info.'
+ + + + + + +
+
+Žádné budoucí závody nebyly nalezeny.

'); +} +else { +?> + +addColumns([new DefaultHeaderRenderer('',ALIGN_CENTER), + new CallbackRenderer ( function ( RowData $row, array $options ) : string { + $has_ext_id = !empty($row->rec['ext_id']); + $checkbox_attrs = $has_ext_id ? ' checked' : ' disabled'; + return ''; + })]); + + $tbl_renderer->addColumns('datum','nazev','misto','oddil'); + $tbl_renderer->addColumns('ext_id'); + $tbl_renderer->addColumns('typ0','typ','odkaz', ['kategorie', new FormatFieldRenderer ('kategorie', function ($kategorie) { + return (strlen($kategorie) > 0) ? 'A' :'N'; + })]); + if ($g_enable_race_capacity) + $tbl_renderer->addColumns('ucast'); + + echo $tbl_renderer->render( new html_table_mc(), $zavody, [] ); +?> +
+ + + +


+Zpět
+


+
+
+ + + +
+ + diff --git a/race_imports_update_exc.php b/race_imports_update_exc.php new file mode 100644 index 0000000..3b45d5d --- /dev/null +++ b/race_imports_update_exc.php @@ -0,0 +1,307 @@ +datum; + $vicedenni = ($raceInfo->vicedenni == 1) ? 1 : 0; + $datum2 = $vicedenni ? (int)$raceInfo->datum2 : 0; + $etap = $vicedenni ? max((int)$raceInfo->etap, 1) : 1; + // adjust the time according manual entry ( 00:00:00 ) + $prihlasky1 = !empty($raceInfo->prihlasky) ? ((int)$raceInfo->prihlasky - (int)$raceInfo->prihlasky % 86400 - 86400) : 0; + $prihlasky2 = !empty($raceInfo->prihlasky1) ? ((int)$raceInfo->prihlasky1 - (int)$raceInfo->prihlasky1 % 86400 - 86400) : 0; + $prihlasky3 = !empty($raceInfo->prihlasky2) ? ((int)$raceInfo->prihlasky2 - (int)$raceInfo->prihlasky2 % 86400 - 86400) : 0; + $prihlasky4 = (int)$raceRow['prihlasky4']; + $prihlasky5 = (int)$raceRow['prihlasky5']; + + $prihlasky = 0; + if ($prihlasky1 != 0) $prihlasky++; + if ($prihlasky2 != 0) $prihlasky++; + if ($prihlasky3 != 0) $prihlasky++; + if ($prihlasky4 != 0) $prihlasky++; + if ($prihlasky5 != 0) $prihlasky++; + + $modify_flag = ($prihlasky != $raceRow['prihlasky'] + || $prihlasky1 != $raceRow['prihlasky1'] + || $prihlasky2 != $raceRow['prihlasky2'] + || $prihlasky3 != $raceRow['prihlasky3'] + || $prihlasky4 != $raceRow['prihlasky4'] + || $prihlasky5 != $raceRow['prihlasky5']) ? $GLOBALS['g_modify_flag'][0]['id'] : 0; + + if ($datum != $raceRow['datum'] || $datum2 != $raceRow['datum2']) + $modify_flag += $GLOBALS['g_modify_flag'][2]['id']; + + $modify_flag = gen_modify_flag_v2b($raceRow['modify_flag'], $modify_flag); + + $odkaz = (string)$raceInfo->odkaz; + if ($odkaz != '') + $odkaz = cononize_url($odkaz, 1); + $typ = mapRaceTypeToDbEnum($raceInfo->typ, $raceTypes); + + $update = []; + $update['ext_id'] = (string)$raceInfo->ext_id; + $update['datum'] = $datum; + $update['datum2'] = $datum2; + $update['nazev'] = (string)$raceInfo->nazev; + $update['misto'] = (string)$raceInfo->misto; + $update['typ0'] = 'Z'; + $update['typ'] = $typ; + $update['zebricek'] = (int)$raceInfo->zebricek2; + $update['ranking'] = (string)$raceInfo->ranking; + $update['odkaz'] = $odkaz; + $update['prihlasky'] = $prihlasky; + $update['prihlasky1'] = $prihlasky1; + $update['prihlasky2'] = $prihlasky2; + $update['prihlasky3'] = $prihlasky3; + $update['prihlasky4'] = $prihlasky4; + $update['prihlasky5'] = $prihlasky5; + $update['etap'] = $etap; + $update['oddil'] = (string)$raceInfo->oddil; + $update['kategorie'] = (string)$raceInfo->kategorie; + $update['vicedenni'] = $vicedenni; + $update['cancelled'] = ($raceInfo->cancelled === null) ? (int)$raceRow['cancelled'] : (int)$raceInfo->cancelled; + $update['modify_flag'] = $modify_flag; + + return $update; +} + +function getChangedUpdates(array $raceRow, array $update): array +{ + + $changed = []; + + foreach ($update as $column => $value) { + if ((string)$raceRow[$column] !== (string)$value) { + $changed[$column] = $value; + } + } + + return $changed; +} + +function getChangedLabels(array $changedUpdates): array +{ + $labels = [ + 'ext_id' => 'ORIS ID', + 'datum' => 'datum', + 'datum2' => 'datum do', + 'nazev' => 'název', + 'misto' => 'místo', + 'typ0' => 'typ akce', + 'typ' => 'sport', + 'zebricek' => 'žebříček', + 'ranking' => 'ranking', + 'odkaz' => 'odkaz', + 'prihlasky' => 'počet termínů přihlášek', + 'prihlasky1' => '1. termín přihlášek', + 'prihlasky2' => '2. termín přihlášek', + 'prihlasky3' => '3. termín přihlášek', + 'prihlasky4' => '4. termín přihlášek', + 'prihlasky5' => '5. termín přihlášek', + 'etap' => 'počet etap', + 'oddil' => 'pořádající oddíl', + 'kategorie' => 'kategorie', + 'vicedenni' => 'vícedenní', + 'cancelled' => 'zrušení', + 'modify_flag' => 'příznak změny' + ]; + $changedLabels = []; + + foreach (array_keys($changedUpdates) as $column) { + $changedLabels[] = $labels[$column] ?? $column; + } + + return $changedLabels; +} + +function fetchRaceRow(int $raceId) +{ + $sql = "SELECT id, ext_id, datum, datum2, nazev, misto, typ0, typ, zebricek, ranking, odkaz, prihlasky, prihlasky1, prihlasky2, prihlasky3, prihlasky4, prihlasky5, etap, oddil, kategorie, vicedenni, cancelled, modify_flag" + ." FROM ".TBL_RACE." WHERE id=? LIMIT 1"; + $stmt = db_prepare($sql); + if ($stmt === false) + return false; + + $rows = db_select($stmt, 'i', [$raceId]); + return !empty($rows) ? $rows[0] : false; +} + +function executeRaceUpdate(int $raceId, array $changedUpdates): bool +{ + if (empty($changedUpdates)) + return true; + + $assignments = []; + $types = ''; + $params = []; + + foreach ($changedUpdates as $column => $value) { + $assignments[] = $column.'=?'; + $types .= is_int($value) ? 'i' : 's'; + $params[] = $value; + } + + $types .= 'i'; + $params[] = $raceId; + + $sql = "UPDATE ".TBL_RACE." SET ".implode(', ', $assignments)." WHERE id=?"; + $stmt = db_prepare($sql); + if ($stmt === false) + return false; + + $result = db_exec($stmt, $types, $params); + return ($result !== false); +} + +$connector = ConnectorFactory::create(); + +if ($connector === null ) +{ + echo('Chyba v nastavení, nenalezen žádny connector, kontaktuje administrátora.
'); + exit; +} + +db_Connect(); + +$race_ids = []; +if (isset($_POST['race_ids']) && is_array($_POST['race_ids'])) { + foreach ($_POST['race_ids'] as $race_id) { + $race_id = (int)$race_id; + if ($race_id > 0) { + $race_ids[$race_id] = $race_id; + } + } +} + +require_once ("./header.inc.php"); + +DrawPageTitle('Aktualizace závodů ze systému '.$connector->getSystemName()); + +?> + + + + + + + +
+
+set_header_col($col++,'ORIS ID',ALIGN_CENTER,0); +$data_tbl->set_header_col($col++,'Datum',ALIGN_CENTER,0); +$data_tbl->set_header_col($col++,'Název',ALIGN_LEFT); +$data_tbl->set_header_col_with_help($col++,'Poř.',ALIGN_CENTER,"Pořadatel"); +$data_tbl->set_header_col($col++,'Stav',ALIGN_LEFT); +$data_tbl->set_header_col($col++,'Poznámka',ALIGN_LEFT); +$data_tbl->set_header_col($col++,'Možnosti',ALIGN_CENTER); + +echo $data_tbl->get_css()."\n"; +echo $data_tbl->get_header()."\n"; +echo $data_tbl->get_header_row()."\n"; + +$updated_count = 0; +$unchanged_count = 0; +$error_count = 0; + +if (empty($race_ids)) { + $error_count++; + echo $data_tbl->get_new_row_arr([ '-', '-', '-', '-', 'Chyba', 'Nebyl vybrán žádný závod.', ''])."\n"; +} +else { + foreach ($race_ids as $race_id) { + $raceRow = fetchRaceRow($race_id); + + if ($raceRow === false) { + $error_count++; + echo $data_tbl->get_new_row_arr([ '-', '-', '-', '-', 'Chyba', 'Závod nebyl v databázi nalezen.', ''])."\n"; + continue; + } + + if (empty($raceRow['ext_id'])) { + $error_count++; + echo $data_tbl->get_new_row_arr([ '-', Date2String($raceRow['datum']), $raceRow['nazev'], $raceRow['oddil'], 'Chyba', 'Závod nemá uložené ORIS ID.'])."\n"; + continue; + } + + $raceInfo = $connector->getRaceInfo($raceRow['ext_id']); + if ($raceInfo === null) { + $error_count++; + echo $data_tbl->get_new_row_arr ([$raceRow['ext_id'], Date2String($raceRow['datum']), $raceRow['nazev'], $raceRow['oddil'], 'Chyba', 'Nepodařilo se načíst data z ORISu.'])."\n"; + continue; + } + + $update = createRaceUpdateMap($raceInfo, $raceRow, $g_racetype); + $changedUpdates = getChangedUpdates($raceRow, $update); + + if (empty($changedUpdates)) { + $unchanged_count++; + echo $data_tbl->get_new_row_arr([ $raceRow['ext_id'], Date2String($raceRow['datum']), $raceRow['nazev'], $raceRow['oddil'], 'Beze změny', 'Data už odpovídají ORISu.', + 'Edit'])."\n"; + continue; + } + + if (!executeRaceUpdate((int)$raceRow['id'], $changedUpdates)) { + $error_count++; + echo $data_tbl->get_new_row_arr([$raceRow['ext_id'], Date2String($raceRow['datum']), $raceRow['nazev'], $raceRow['oddil'], 'Chyba', 'Nepodařilo se uložit změny do databáze.', + 'Edit'])."\n"; + + continue; + } + + $updated_count++; + echo $data_tbl->get_new_row_arr([ $raceRow['ext_id'], Date2String($raceRow['datum']), $raceRow['nazev'], $raceRow['oddil'], 'Aktualizováno', implode(', ', getChangedLabels($changedUpdates)), + 'Edit'])."\n"; + } +} + +echo $data_tbl->get_footer()."\n"; + +?> +
+Aktualizováno:
+Beze změny:
+Chyba:
+


+Zpět na výběr závodů
+


+
+
+ + + +
+ + diff --git a/rg_ad_races_edit.inc.php b/rg_ad_races_edit.inc.php index f08388d..6c5afa5 100644 --- a/rg_ad_races_edit.inc.php +++ b/rg_ad_races_edit.inc.php @@ -68,7 +68,7 @@ function toggleButtonState() { if ($g_enable_race_capacity) $tbl_renderer->addColumns('ucast'); $tbl_renderer->addColumns(['moznosti', new FormatFieldRenderer ( 'id', function ( $id ) : string { - return "Edit / Kategorie / Smazat"; + return "Edit / Kategorie / Smazat"; })]); if (!$g_is_release) { // pri debug zobrazit @@ -112,6 +112,9 @@ function toggleButtonState() { echo('Rychlé načtení závodu ze zdroje ' . $connector->getSystemName() . ' '); echo(""); echo(' '); + echo('

'); + echo('Aktualizace závodů ze systému ' . $connector->getSystemName() . ' '); + echo(''); echo("

\n"); }