$OnClickText = ' onClick="javascript:this.value = \'\';"'; // Надпись на кнопке $SaveButtonText = 'Добавить точку сканирования'; $pScanPointId = 0; } else { $pScanPointId = mmb_validateInt($_POST, 'ScanPointId'); if ($pScanPointId <= 0) { return; } // Если вернулись после ошибки переменные не нужно инициализировать if ($viewsubmode == "ReturnAfterError") { ReverseClearArrays(); $ScanPointName = $_POST['ScanPointName']; } else { $sql = "select sp.scanpoint_id,\n\t sp.scanpoint_name,\n\t\t sp.scanpoint_order\n\t\tfrom ScanPoints sp\n\t\twhere sp.scanpoint_id = {$pScanPointId}"; $ScanPointName = CSql::singleValue($sql, 'scanpoint_name'); } $NextActionName = 'ScanPointChange'; $OnClickText = ''; $SaveButtonText = 'Сохранить изменения точки сканирования'; } // ================ Конец инициализации переменных для добавляемой/редактируемой точки сканирования ================= // Выводим javascrpit ?> <script language="JavaScript" type="text/javascript"> // Функция проверки правильности заполнения формы function ValidateScanPointForm() { document.ScanPointForm.action.value = "<?php echo $NextActionName;
if (CRights::canInviteTeam($UserId, $TeamId)) { print '<input type="button" onClick="javascript: if (confirm(\'Вы уверены, что хотите перевести эту команду в зачет? \')) { InviteTeam(); }" name="InviteTeamButton" value="Пригласить команду" tabindex="' . ++$TabIndex . '">' . "\r\n"; } } print '</td></tr>' . "\n\n"; print '<tr><td class="input">' . "\n"; // ============ Использование GPS print 'GPS <input type="checkbox" name="TeamUseGPS" value="on"' . ($TeamUseGPS == 1 ? ' checked="checked"' : '') . ' tabindex="' . ++$TabIndex . '"' . $DisabledText . ' title="Отметьте, если команда использует для ориентирования GPS"/> ' . "\n"; // ============ Число карт print ' Комплектов карт <input type="text" name="TeamMapsCount" size="2" maxlength="2" value="' . $TeamMapsCount . '" tabindex="' . ++$TabIndex . '"' . $OnClickText . $DisabledText . ' title="Число заказанных на команду комплектов карт"> ' . "\n"; // ============ расчет стоимости // для новых команд мы еще не знаем количество заказанных карт, // а командам вне зачета мы ничего не обещаем и только сообщаем, почем они могут купить карты на старте при их наличии if ($viewmode == "Add" || $TeamOutOfRange) { $sql = "select r.raid_mapprice from Raids r where r.raid_id = {$RaidId}"; $MapPrice = CSql::singleValue($sql, 'raid_mapprice'); print '(стоимость одного комплекта ' . $MapPrice . ' руб.)' . "\n"; } else { if ($TeamUser or $Administrator or $Moderator) { // показываем стоимость карт только при просмотре своей команды или админам/модераторам print 'К оплате на старте: <b>' . CalcualteTeamPayment($TeamId) . '</b> руб. ' . "\n"; } } print '</td></tr>' . "\n\n"; // ============ Нет сломанным унитазам! print '<tr><td class="input">' . "\n"; print '<a href="http://community.livejournal.com/_mmb_/2010/09/24/">Нет сломанным унитазам!</a> - прочитали и поддерживаем <input type="checkbox" name="TeamGreenPeace" value="on"' . ($TeamGreenPeace >= 1 ? ' checked="checked"' : '') . ' tabindex="' . ++$TabIndex . '"' . $DisabledText . ' title="Отметьте, если команда берёт повышенные экологические обязательства"/>' . "\n"; print "</td></tr>\r\n"; // ============ Участники // Их еще нет при создании команды if ($viewmode != "Add") {
} if ($SessionId <= 0) { CMmb::setErrorMessage('Сессия не найдена'); return; } $pUserLinkId = trim($_POST['UserLinkId']); if (!isset($pUserLinkId)) { $pUserLinkId = 0; } if ($pUserLinkId <= 0) { CMmb::setErrorMessage('Ссылка не найдена'); return; } $sql = "select raid_id \n\t from UserLinks \n\t where userlink_id = {$pUserLinkId}\n\t\t "; // echo $sql; $raidId = CSql::singleValue($sql, 'raid_id'); $userId = CSql::userId($SessionId); // Права на редактирование if (!UACanLinkEdit($pUserId, $raidId, $userId)) { return; } // выходим $Sql = "update UserLinks set userlink_hide = 1 where userlink_id = {$pUserLinkId}"; // echo $sql; MySqlQuery($Sql); CMmb::setResult('Впечатление удалено', "ViewUserData", ""); } else { // если никаких действий не требуется // $statustext = "<br/>"; } // print('view = '.$view.' action = '.$action);
print '<tr><td class="input" style="padding-top: 10px;">' . "\n"; // Предупредим команды в зачете о том, что они могут добавлять участников только до закрытия регистрации if ($TeamUser and !$TeamOutOfRange) { print 'Добавление новых участников в команду разрешено до ' . $RegistrationEnd . ".<br/>\n"; print 'После этой даты они могут участвовать в ММБ только в виде самостоятельной команды вне зачета.<br/>' . "\n"; } print '<input type="text" name="NewTeamUserEmail" size="50" value="Email нового участника" tabindex="' . ++$TabIndex . '"' . CMmbUI::placeholder('Email нового участника') . 'title="Укажите e-mail пользователя, которого Вы хотите добавить в команду. Пользователь может запретить добавлять себя в команду в настройках своей учетной записи.">' . "\n"; print "</td></tr>\n"; } // 20/02/2014 Пользовательское соглашение if ($viewmode == "Add" && $AllowEdit == 1) { print '<tr><td class="input" style="padding-top: 10px; font-size: 80%;">' . "\n"; print '<b>Условия участия (выдержка из <a href="' . $RaidRulesLink . '">положения</a>):</b><br/>' . "\n"; // Ищем последнее пользовательское соглашение $sql = "select rf.raidfile_id, rf.raidfile_name\n\t\tfrom RaidFiles rf\n\t\twhere rf.raidfile_hide = 0 and rf.filetype_id = 8\n\t\torder by rf.raid_id DESC, rf.raidfile_id DESC\n\t\tLIMIT 0,1"; $ConfirmFile = trim($MyStoreHttpLink) . trim(CSql::singleValue($sql, 'raidfile_name')); $Fp = fopen($ConfirmFile, "r"); while (!feof($Fp) && !strpos(trim(fgets($Fp, 4096)), 'body')) { } $NowStr = ''; while (!feof($Fp) && !strpos(trim($NowStr), '/body')) { print trim($NowStr) . "\r\n"; $NowStr = fgets($Fp, 4096); } fclose($Fp); print "</td></tr>\r\n"; print '<tr><td class="input">' . "\n"; print "<a href=\"{$RaidRulesLink}\">Полный текст положения</a><br/>\n"; print 'Прочитал и согласен с условиями участия в ММБ <input type="checkbox" name="Confirmation" value="on" tabindex="' . ++$TabIndex . '"' . $DisabledText . ' title="Прочитал и согласен с условиями участия в ММБ"/>' . "\n"; print "</td></tr>\r\n"; }
function RecalcTeamResultFromTeamLevelPoints($raidid, $teamid) { if (empty($teamid) and empty($raidid)) { return; } $teamRaidCondition = !empty($teamid) ? " t.team_id = {$teamid}" : "d.raid_id = {$raidid}"; if (empty($teamid)) { CMmbLogger::enable(0); //CMmbLogger::enable(1); } $tm0 = microtime(true); // Обнуляем данные расчета $sql = " update TeamLevelPoints tlp\n\t\t join Teams t\n\t\t\t on tlp.team_id = t.team_id\n \t\t inner join Distances d\n\t\t\t on t.distance_id = d.distance_id\n\t\t set tlp.teamlevelpoint_penalty = NULL,\n\t\t tlp.teamlevelpoint_duration = NULL,\n\t\t t.team_maxlevelpointorderdone = NULL,\n\t\t t.team_minlevelpointorderwitherror = NULL,\n\t\t t.team_donelevelpoint = NULL,\n\t\t t.team_comment = NULL\n \t\t where {$teamRaidCondition}"; $rs = MySqlQuery($sql); $tm1 = CMmbLogger::addInterval(' 1 ', $tm0); RecalcTeamLevelPointsDuration($raidid, $teamid); $tm2 = CMmbLogger::addInterval(' 2', $tm1); RecalcTeamLevelPointsPenaltyWithDiscount($raidid, $teamid); $tm3 = CMmbLogger::addInterval(' 3', $tm2); RecalcTeamLevelPointsPenaltyWithoutDiscount($raidid, $teamid); $tm4 = CMmbLogger::addInterval(' 4', $tm3); // echo 'RecalcTeamLevelPointsResult '.$raidid.','.$teamid; RecalcTeamLevelPointsResult($raidid, $teamid); $tm5 = CMmbLogger::addInterval(' 5', $tm4); // return; // Находим ключ ММБ, если указана только команда if (empty($raidid)) { $sql = "select d.raid_id\n\t\t\t\tfrom Teams t\n\t\t\t\t\tinner join Distances d\n\t\t\t\t\ton t.distance_id = d.distance_id\n\t\t\t\twhere t.team_id = {$teamid}\n\t\t\t\tLIMIT 0,1"; $raidid = CSql::singleValue($sql, 'raid_id'); } //Ставим ошибки //FindErrors($raidid, $teamid); $tm6 = CMmbLogger::addInterval(' 6', $tm5); // $raidid мог измениться $teamRaidCondition = !empty($teamid) ? "t.team_id = {$teamid}" : "d.raid_id = {$raidid}"; // Результат команды - это результат в максимальной точке // Перевод в секунды нужен для корректной работы MAX $sql = " update Teams t\n\t\t\t\tinner join\n\t\t \t(select tlp.team_id,\n\t\t\t\t\t MAX(COALESCE(lp.levelpoint_order, 0)) as progress,\n\t\t\t\t\t\t\tMAX(t.distance_id) as distance_id,\n\t\t\t\t\t MAX(TIME_TO_SEC(COALESCE(tlp.teamlevelpoint_result, 0))) as secresult\n\t\t\t\t\t from TeamLevelPoints tlp\n\t\t\t\t\t inner join Teams t\n\t\t\t\t\t on tlp.team_id = t.team_id\n\t\t\t\t\t inner join Distances d\n\t\t\t\t\t on t.distance_id = d.distance_id\n\t\t\t\t\t inner join LevelPoints lp\n\t\t\t\t\t on tlp.levelpoint_id = lp.levelpoint_id\n\t\t\t\t\t where {$teamRaidCondition}\n\t\t\t\t\t group by tlp.team_id\n\t\t\t\t\t) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t \t\tinner join\n\t\t\t\t\t(select lp.distance_id,\n\t\t\t\t\t MAX(lp.levelpoint_order) as maxlporder\n\t\t\t\t\tfrom LevelPoints lp\n\t\t\t\t\tgroup by lp.distance_id\n\t\t\t\t\t) b\n\t\t\t \ton a.distance_id = b.distance_id\n \t set team_result = CASE WHEN b.maxlporder = COALESCE(a.progress, 0) THEN SEC_TO_TIME(COALESCE(a.secresult, 0)) ELSE NULL END\n\t\t\t\t, team_maxlevelpointorderdone = COALESCE(a.progress, 0) "; // echo $sql; $rs = MySqlQuery($sql); $tm7 = CMmbLogger::addInterval(' 7', $tm6); // теперь можно посчитать рейтинг RecalcTeamUsersRank($raidid); $tm8 = CMmbLogger::addInterval(' 8', $tm7); // // Находим минимальную точку с ошибкой (COALESCE(tlp.error_id, 0) > 0) // < 0 - это не ошибка - предупреждение $sql = " update Teams t\n\t\t\t\t inner join\n\t \t\t \t(select tlp.team_id,\n\t\t\t\t\t MIN(COALESCE(lp.levelpoint_order, 0)) as error\n\t\t\t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t\t\t\t\tinner join Teams t\n\t\t\t\t\t\t\t on tlp.team_id = t.team_id\n\t\t\t \t\t\t\tinner join Distances d\n\t\t\t \t\t\t\ton t.distance_id = d.distance_id\n\t\t\t \t\t\t\tinner join LevelPoints lp\n\t\t\t \t\t\t\ton tlp.levelpoint_id = lp.levelpoint_id\n\t\t\t\t\t\twhere COALESCE(tlp.error_id, 0) > 0\n\t\t \t\t\tand {$teamRaidCondition}\n\t\t\t\t\t\tgroup by tlp.team_id\n\t\t\t\t\t\t) a\n\t\t \t\t\ton t.team_id = a.team_id\n \tset team_minlevelpointorderwitherror = COALESCE(a.error, 0)"; // echo $sql; $rs = MySqlQuery($sql); $tm9 = CMmbLogger::addInterval(' 9', $tm8); // Находим невзятые КП // расчет закомментирован, так ка Сергей строит список другим способом /* $sql = " update Teams t inner join (select t.team_id, GROUP_CONCAT(lp.levelpoint_name ORDER BY lp.levelpoint_order, ' ') as skippedlevelpoint from Teams t inner join Distances d on t.distance_id = d.distance_id join LevelPoints lp on t.distance_id = lp.distance_id and COALESCE(t.team_maxlevelpointorderdone, 0) >= lp.levelpoint_order left outer join TeamLevelPoints tlp on lp.levelpoint_id = tlp.levelpoint_id and t.team_id = tlp.team_id where tlp.levelpoint_id is NULL and d.distance_hide = 0 and t.team_hide = 0 and $teamRaidCondition group by t.team_id ) a on t.team_id = a.team_id set team_skippedlevelpoint = COALESCE(a.skippedlevelpoint, '')"; // echo $sql; $rs = MySqlQuery($sql);*/ // Обновляем комментарий у команды $sql = " update Teams t\n inner join\n (select tlp.team_id \n\t\t\t\t\t\t,group_concat(COALESCE(teamlevelpoint_comment, '')) as team_comment\n\t\t\t\t from TeamLevelPoints tlp\n\t\t\t\t\t\t\tleft outer join Errors err\n\t\t\t\t\t\t\ton tlp.error_id = err.error_id\n\t\t\t\t\t\t inner join Teams t\n\t\t\t\t\t\t on t.team_id = tlp.team_id\n\t\t\t\t\t\t inner join Distances d\n\t\t\t \t\t\ton t.distance_id = d.distance_id\n where COALESCE(tlp.teamlevelpoint_comment, '') <> ''\n and {$teamRaidCondition}\n group by tlp.team_id\n ) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t set t.team_comment = a.team_comment"; // echo $sql; $rs = MySqlQuery($sql); $tm10 = CMmbLogger::addInterval(' 10', $tm9); //Теперь в это поле добавляем ошибки tlp.error_id > 0 $sql = " update Teams t\n inner join\n (select tlp.team_id \n\t\t\t\t\t\t,group_concat(COALESCE(error_name, '')) as team_error\n\t\t\t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t\t\t\t\tleft outer join Errors err\n\t\t\t\t\t\t\t\ton tlp.error_id = err.error_id\n\t\t\t\t\t\t\t inner join Teams t\n\t\t\t\t\t\t\t on t.team_id = tlp.team_id\n\t\t\t\t\t\t\t inner join Distances d\n\t\t\t\t\t\t\t on t.distance_id = d.distance_id\n\t\t\t\t\t\twhere COALESCE(tlp.error_id, 0) > 0\n\t\t and {$teamRaidCondition}\n\t\t\t\t\t\tgroup by tlp.team_id\n ) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t set t.team_comment = CASE WHEN a.team_error <> '' THEN CONCAT('Ошибки: ', a.team_error, '; ', COALESCE(t.team_comment, '')) ELSE t.team_comment END"; // echo $sql; $rs = MySqlQuery($sql); $tm11 = CMmbLogger::addInterval(' 11', $tm10); //Теперь в это поле добавляем предупреждения tlp.error_id < 0 $sql = " update Teams t\n inner join\n (select tlp.team_id \n\t\t\t\t\t\t,group_concat(COALESCE(error_name, '')) as team_error\n\t\t\t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t\t\t\t\tleft outer join Errors err\n\t\t\t\t\t\t\t\ton tlp.error_id = err.error_id\n\t\t\t\t\t\t\t inner join Teams t\n\t\t\t\t\t\t\t on t.team_id = tlp.team_id\n\t\t\t\t\t\t\t inner join Distances d\n\t\t\t\t\t\t\t on t.distance_id = d.distance_id\n\t\t\t\t\t\twhere COALESCE(tlp.error_id, 0) < 0\n\t\t and {$teamRaidCondition}\n\t\t\t\t\t\tgroup by tlp.team_id\n ) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t set t.team_comment = CASE WHEN a.team_error <> '' THEN CONCAT('Предупреждения: ', a.team_error, '; ', COALESCE(t.team_comment, '')) ELSE t.team_comment END"; // echo $sql; $rs = MySqlQuery($sql); $tm12 = CMmbLogger::addInterval(' 12', $tm11); //Теперь в это поле добавляем предупреждения tlp.error_id < 0 $sql = " update Teams t\n inner join\n (select tlp.team_id \n\t\t\t\t\t\t,group_concat(COALESCE(error_name, '')) as team_error\n\t\t\t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t\t\t\t\tleft outer join Errors err\n\t\t\t\t\t\t\t\ton tlp.error_id = err.error_id\n\t\t\t\t\t\t\t inner join Teams t\n\t\t\t\t\t\t\t on t.team_id = tlp.team_id\n\t\t\t\t\t\t\t inner join Distances d\n\t\t\t\t\t\t\t on t.distance_id = d.distance_id\n\t\t\t\t\t\twhere COALESCE(tlp.error_id, 0) < 0\n\t\t and {$teamRaidCondition}\n\t\t\t\t\t\tgroup by tlp.team_id\n ) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t set t.team_comment = CASE WHEN a.team_error <> '' THEN CONCAT('Предупреждения: ', a.team_error, '; ', COALESCE(t.team_comment, '')) ELSE t.team_comment END"; // echo $sql; $rs = MySqlQuery($sql); $tm13 = CMmbLogger::addInterval(' 13', $tm12); //считаем (только для интерфейса список вщзятых КП $sql = " update Teams t\n inner join\n (select tlp.team_id \n\t\t\t,group_concat(DATE_FORMAT(COALESCE(tlp.teamlevelpoint_datetime, ''),'%H:%i') order by teamlevelpoint_datetime separator ', ') as team_donelevelpoint\n\t\t\t\t\t\tfrom TeamLevelPoints tlp\n\t\t\t\t\t\t\t inner join Teams t\n\t\t\t\t\t\t\t on t.team_id = tlp.team_id\n\t\t\t\t\t\t\t inner join Distances d\n\t\t\t\t\t\t\t on t.distance_id = d.distance_id\n\t\t\t\t\t\twhere COALESCE(tlp.teamlevelpoint_datetime, 0) > 0\n\t\t and {$teamRaidCondition}\n\t\t\t\t\t\tgroup by tlp.team_id\n ) a\n\t\t \t\ton t.team_id = a.team_id\n\t\t set t.team_donelevelpoint = a.team_donelevelpoint "; // echo $sql; $rs = MySqlQuery($sql); $tm14 = CMmbLogger::addInterval(' 14', $tm13); // теперь можно посчитать рейтинг RecalcUsersRank($raidid); $tm14 = CMmbLogger::addInterval(' 15', $tm13); $msg = CMmbLogger::getText(); //CMmb::setShortResult($msg, ''); CMmb::setMessage($msg); }
function ShowDistanceHeader($RaidId, $DistanceId, $DistanceName, $DistanceData, $lottery_count, $colspan) { $DistanceTeams = "t.distance_id = {$DistanceId} AND t.team_hide = 0"; $sql = "SELECT COUNT(team_id) AS inrangecount FROM Teams t WHERE {$DistanceTeams} AND t.team_outofrange = 0"; $teamInRangeCount = CSql::singleValue($sql, 'inrangecount'); $sql = "SELECT COUNT(team_id) AS outofrangecount FROM Teams t WHERE {$DistanceTeams} AND t.team_outofrange = 1"; $teamOutOfRangeCount = CSql::singleValue($sql, 'outofrangecount'); $sql = "SELECT COALESCE(SUM(COALESCE(team_mapscount, 0)), 0) AS inrangecount FROM Teams t WHERE {$DistanceTeams} AND t.team_outofrange = 0"; $mapsInRangeCount = CSql::singleValue($sql, 'inrangecount'); $sql = "SELECT COALESCE(SUM(COALESCE(team_mapscount, 0)), 0) AS outofrangecount FROM Teams t WHERE {$DistanceTeams} AND t.team_outofrange = 1"; $mapsOutOfRangeCount = CSql::singleValue($sql, 'outofrangecount'); $sql = "SELECT COUNT(tu.teamuser_id) AS inrangecount FROM Teams t INNER JOIN TeamUsers tu ON t.team_id = tu.team_id WHERE {$DistanceTeams} AND tu.teamuser_hide = 0 AND t.team_outofrange = 0"; $teamUserInRangeCount = CSql::singleValue($sql, 'inrangecount'); $sql = "SELECT COUNT(tu.teamuser_id) AS outofrangecount FROM Teams t INNER JOIN TeamUsers tu ON t.team_id = tu.team_id WHERE {$DistanceTeams} AND tu.teamuser_hide = 0 AND t.team_outofrange = 1"; $teamUserOutOfRangeCount = CSql::singleValue($sql, 'outofrangecount'); $distanceDescription = $DistanceName; if ($DistanceData) { $distanceDescription .= ', ' . $DistanceData; } print "<tr class=yellow>\n <td colspan=2>Дистанция {$distanceDescription}</td>\n"; // для марш-бросков без приглашений оставляем старый вариант вывода if ($RaidId < 28) { print " <td colspan={$colspan}>Команд <span title=\"в зачете\">{$teamInRangeCount}</span>/<span title=\"вне зачета\">{$teamOutOfRangeCount}</span>," . " карт <span title=\"у команд в зачете\">{$mapsInRangeCount}</span>/<span title=\"у команд вне зачета\">{$mapsOutOfRangeCount}</span>," . " участников <span title=\"в командах в зачете\">{$teamUserInRangeCount}</span>/<span title=\"в командах вне зачета\">{$teamUserOutOfRangeCount}</span></td>\n</tr>\n"; return; } // получаем количество команд с приглашениями каждого типа $invited = array(); for ($inv_type = 1; $inv_type <= 3; $inv_type++) { $sql = "SELECT COUNT(*) AS invited_count FROM\n\t\t\t(SELECT DISTINCT t.team_id FROM Teams t\n\t\t\t\tINNER JOIN Invitations inv ON inv.invitation_id = t.invitation_id\n\t\t\t\tINNER JOIN TeamUsers tu ON tu.team_id = t.team_id AND tu.teamuser_hide = 0\n\t\t\t\tINNER JOIN InvitationDeliveries invd ON invd.invitationdelivery_id = inv.invitationdelivery_id\n\t\t\t\tWHERE {$DistanceTeams} AND invd.invitationdelivery_type = {$inv_type}) AS TeamsInvited"; $invited[$inv_type] = CSql::singleValue($sql, 'invited_count'); } // отдельно считаем количество команд, приглашенных по рейтингу своими участниками $sql = "SELECT COUNT(*) AS invited_count FROM\n\t\t(SELECT DISTINCT t.team_id FROM Teams t\n\t\t\tINNER JOIN Invitations inv ON inv.invitation_id = t.invitation_id\n\t\t\tINNER JOIN TeamUsers tu ON tu.team_id = t.team_id AND tu.teamuser_hide = 0\n\t\t\tINNER JOIN InvitationDeliveries invd ON invd.invitationdelivery_id = inv.invitationdelivery_id\n\t\t\tWHERE {$DistanceTeams} AND invd.invitationdelivery_type = 1 AND tu.user_id = inv.user_id) AS TeamsInvited"; $invited_self = CSql::singleValue($sql, 'invited_count'); // выводим статистику print " <td colspan={$colspan}>Участвует команд <span title=\"всего команд с приглашениями\">{$teamInRangeCount}</span> " . "(<span title=\"пригласившие сами себя\">{$invited_self}</span>" . "/<span title=\"приглашенные другими участниками\">" . ($invited[1] - $invited_self) . "</span>" . "/<span title=\"выгравшие в лотерею\">" . $invited[2] . "</span>" . "/<span title=\"с приглашениями, выданными вручную\">" . $invited[3] . "</span>), "; print "ожидают приглашения <span title=\"всего команд без приглашений\">{$teamOutOfRangeCount}</span>, "; print "участников <span title=\"в приглашенных командах\">{$teamUserInRangeCount}</span>/<span title=\"в командах, ожидающих приглашение\">{$teamUserOutOfRangeCount}</span>, "; print "карт <span title=\"в приглашенных командах\">{$mapsInRangeCount}</span>/<span title=\"в командах, ожидающих приглашение\">{$mapsOutOfRangeCount}</span></td>\n</tr>\n"; }
$Result = MySqlQuery($Sql); while ($Row = mysql_fetch_assoc($Result)) { $data["Levels"][] = $Row; } mysql_free_result($Result); // TeamLevelDismiss: $Sql = "select teamleveldismiss_id, tld.levelpoint_id, \n\t\t\t\t\tteamleveldismiss_date, teamuser_id\n\t\t\tfrom TeamLevelDismiss tld\n\t\t\t inner join LevelPoints lp on tld.levelpoint_id = lp.levelpoint_id\n\t\t\t inner join Distances d on lp.distance_id = d.distance_id\n\t\t\twhere d.distance_hide = 0 and d.raid_id = {$RaidId}"; $Result = MySqlQuery($Sql); while ($Row = mysql_fetch_assoc($Result)) { $data["TeamLevelDismiss"][] = $Row; } mysql_free_result($Result); } // Конец проверки, что можно экспортировать данные по этапам $sql = "select raid_fileprefix\n\t from Raids\n\t where raid_id = {$RaidId}"; $Prefix = trim(CSql::singleValue($sql, 'raid_fileprefix')); $JsonFileName = 'TeamLevelPoints.json'; $fullJSONfileName = $MyStoreFileLink . $Prefix . $JsonFileName; $zipfileName = $MyStoreFileLink . $Prefix . 'mmbdata.zip'; $output = fopen($fullJSONfileName, 'w'); fwrite($output, '{"TeamLevelPoints":['); // TeamLevelPoints: $Sql = "select teamlevelpoint_id, tlp.team_id, tlp.levelpoint_id, \n\t\t\t\t\tteamlevelpoint_datetime, teamlevelpoint_comment,\n\t\t\t\t\tteamlevelpoint_penalty,\n\t\t\t\t\terror_id, teamlevelpoint_duration,\n\t\t\t\t\tteamlevelpoint_result\n\t\t\tfrom TeamLevelPoints tlp\n\t\t \t inner join Teams t on tlp.team_id = t.team_id\n\t\t\t inner join Distances d on t.distance_id = d.distance_id\n\t\t\twhere t.team_hide = 0 and d.distance_hide = 0 and d.raid_id = {$RaidId}"; $Result = MySqlQuery($Sql); while ($Row = mysql_fetch_assoc($Result)) { fwrite($output, json_encode($Row) . ","); } fwrite($output, ']}'); mysql_free_result($Result); fclose($output); $JsonMainDataFileName = 'maindata.json';
{ document.TlpForm.TeamLevelPointId.value = teamlevelpointid; document.TlpForm.action.value = 'TlpInfo'; document.TlpForm.submit(); } // </script> <?php print '<br/>' . "\n"; // ============ Общее время команды $sql = "select TIME_FORMAT(t.team_result, '%H:%i') as team_result from Teams t where t.team_id = {$TeamId}"; $TeamResult = CSql::singleValue($sql, 'team_result'); $TeamPlace = GetTeamPlace($TeamId); $TeamPlaceResult = ""; if ($TeamResult == "00:00") { $TeamResult = "-"; } if ($TeamPlace > 0) { $TeamPlaceResult = " Место <b>{$TeamPlace}</b>"; } print "<b>Результаты.</b> Общее время с учетом штрафов и бонусов: <b title=\"Обновляется после сохранения результатов\">{$TeamResult}</b>{$TeamPlaceResult}\n"; print "<br/>\n"; if ($AllowEditResult == 1) { print "<br/>\n"; // Выводим начало формы с точкой print '<form name="TlpForm" action="' . $MyPHPScript . '" method="post" onSubmit="' . $OnSubmitResultFunction . '">' . "\n"; print '<input type="hidden" name="action" value="">' . "\n";
and t.team_hide = 0 and tu.teamuser_hide = 0 and t.team_outofrange = 0 "; $teamUserInRangeCount = CSql::singleValue($sql, 'inrangecount'); $sql = " select count(tu.teamuser_id) as outofrangecount from Teams t inner join TeamUsers tu on t.team_id = tu.team_id where t.distance_id = $whereDistanceId and t.team_hide = 0 and tu.teamuser_hide = 0 and t.team_outofrange = 1 "; $teamUserOutOfRangeCount = CSql::singleValue($sql, 'outofrangecount'); print('<tr><td width="100">'.$Row['distance_name'].'</td> <td width="300">'.$Row['distance_data']."</td>\r\n"); // Если идёт регистрацию время окончания выделяем жирным $bStyle = $RaidStage == 1 ? 'style="font-weight: bold;"': ''; print("<td $bStyle>Регистрация до: $RaidRegisterEndDt</td>\r\n"); print("<td>команд: $teamInRangeCount/$teamOutOfRangeCount, карт: $mapsInRangeCount/$mapsOutOfRangeCount, участников: $teamUserInRangeCount/$teamUserOutOfRangeCount</td>\r\n"); if (!empty($RaidCloseDt)) { print("<td>Протокол закрыт: $RaidCloseDt</td>\r\n"); }
$LevelPointMaxYear = $Row['levelpoint_smaxyear']; $LevelPointMaxDate = $Row['levelpoint_smaxdate']; $LevelPointMaxTime = $Row['levelpoint_smaxtime']; $ScanPointId = $Row['scanpoint_id']; // $LevelId = $Row['level_id']; } $NextActionName = 'LevelPointChange'; $OnClickText = ''; $SaveButtonText = 'Сохранить изменения точки'; } // ================ Конец инициализации переменных для добавляемой/редактируемой точки ================= // В форме правки выводится только день и время, год считаем по дате регистарции ММБ и не выводим if (empty($LevelPointMinYear) or (int) $LevelPointMinYear == 0 or empty($LevelPointMaxYear) or (int) $LevelPointMaxYear == 0) { $RaidYear = 0; $sql = "select YEAR(r.raid_registrationenddate) as raidyear\n\t\t\tfrom Raids r\n\t\t inner join Distances d\n\t\t\t on d.raid_id = r.raid_id\n\t\t\twhere d.distance_id = {$DistanceId}"; $RaidYear = CSql::singleValue($sql, 'raidyear'); if (empty($LevelPointMinYear) or (int) $LevelPointMinYear == 0) { $LevelPointMinYear = $RaidYear; } if (empty($LevelPointMaxYear) or (int) $LevelPointMaxYear == 0) { $LevelPointMaxYear = $RaidYear; } } // Выводим javascrpit ?> <script language="JavaScript" type="text/javascript"> // Функция проверки правильности заполнения формы function ValidateLevelPointForm() { document.LevelPointForm.action.value = "<?php
$pTlpYear = $_POST['TlpYear']; $pTlpDate = $_POST['TlpDate']; $pTlpTime = $_POST['TlpTime']; $pTlpComment = $_POST['TlpComment']; $pErrorId = $_POST['ErrorId']; $TlpYDTs = CSql::timeString($pTlpYear, $pTlpDate, $pTlpTime, false); // Если день и время пустые, то и год пустой считаем if ((int) $pTlpDate == 0 and (int) $pTlpTime == 0) { $TlpYDTs = "'0000-00-00 00:00:00'"; } if ($pTeamId <= 0 or $pLevelPointId <= 0) { teamEditError('Не определён ключ команды или ключ точки для результата.'); return; } $sql = " select count(*) as countresult\n\t from TeamLevelPoints\n\t where team_id = {$pTeamId}\n\t\t and levelpoint_id = {$pLevelPointId}\n\t\t\tand teamlevelpoint_id <> {$pTeamLevelPointId}"; if (CSql::singleValue($sql, 'countresult') > 0) { CMmb::setErrorSm('Результаты по точке уже есть.', 'ReturnAfterErrorTlp'); return; } $sql = "update TeamLevelPoints set levelpoint_id = {$pLevelPointId}\n\t ,team_id = {$pTeamId}\n\t ,error_id = {$pErrorId}\n\t ,teamlevelpoint_comment = '{$pTlpComment}'\n\t ,teamlevelpoint_datetime = {$TlpYDTs}\n\t where teamlevelpoint_id = {$pTeamLevelPointId}"; //echo $sql; MySqlQuery($sql); RecalcTeamResultFromTeamLevelPoints(0, $pTeamId); // RecalcTeamResultFromTeamLevelPoints(25, 0); /* $statustext = CheckLevelPoints($DistanceId); if (!empty($error)) { $alert = 1; } */
CMmb::setError('Марш-бросок не найден.', $view, ''); return; } $pInvitationsCount = mmb_validateInt($_POST, 'RankInvitationsCount'); if ($pInvitationsCount <= 0) { CMmb::setError('Не указано число приглашений.', $view, ''); return; } $pInvitationsEndDate = trim($_POST['InvitationsEndDate']); if (empty($pInvitationsEndDate)) { CMmb::setError('Не указана дата окончания действия приглашений.', $view, ''); return; } // проверки на дату $sql = "select count(*) enddtcheck\n \t\t\tfrom Raids r\n\t \t\twhere r.raid_id = {$RaidId}\n\t \t\t\tand r.raid_registrationenddate >= '{$pInvitationsEndDate}'\n\t \t\t\tand NOW() < '{$pInvitationsEndDate}'\n\t \t"; $endDtCheck = CSql::singleValue($sql, 'enddtcheck', false); if (!$endDtCheck) { CMmb::setErrorSm('Дата окончания действия приглашений не прошла проверку.'); return; } // пересчитываем рейтинг на всякий случай RecalcUsersRank($RaidId); // проверяем if (!CRights::canDeliveryInvitation($UserId, $RaidId, 1)) { CMmb::setError('Невозможно провести выдачу по рейтингу.', $view, ''); return; } if ($pInvitationsCount > CSql::availableInvitationsCount($RaidId)) { CMmb::setError('Заявок указано больше, чем доступно.', $view, ''); return; }
public static function canAddToDevelopers($userId, $raidId, $puserId) { $Super = CSql::userAdmin($userId) || CSql::userModerator($userId, $raidId); if (!$Super) { return false; } // проверяем, что не участник $sql = "select count(*) as teamuser\n \t\t\tfrom TeamUsers tu \n \t\t\t inner join Teams t\n \t\t\t on t.team_id = tu.team_id\n \t\t\t inner join Distances d\n \t\t\t on t.distance_id = d.distance_id\n\t \t\twhere tu.user_id = {$puserId}\n\t \t\t and t.team_hide = 0\n\t \t\t and d.raid_id = {$raidId}\n\t \t\t and tu.teamuser_hide = 0\n\t \t\t \n\t \t\t"; $teamuser = CSql::singleValue($sql, 'teamuser', false); if ($teamuser) { return false; } // проверяем, что не волонтёр уже $sql = "select count(*) as raiddeveloper\n \t\t\tfrom RaidDevelopers rd \n\t \t\twhere rd.user_id = {$puserId}\n\t \t\t and rd.raiddeveloper_hide = 0\n\t \t\t and rd.raid_id = {$raidId}\n\t \t\t"; $raiddeveloper = CSql::singleValue($sql, 'raiddeveloper', false); if ($raiddeveloper) { return false; } return true; }
mysql_free_result($result); } function GetTeamPlace($teamId) { return isset($this->teamPlaces[$teamId]) ? $this->teamPlaces[$teamId] : 0; } function GetUserDistance($userId, $distanceId) { return isset($this->userDistance[$userId]) && isset($this->userDistance[$userId][$distanceId]) ? $this->userDistance[$userId][$distanceId] : null; } } $TabIndex = 0; /*print('<form name="RankUsersForm" action="'.$MyPHPScript.'" method="post">'."\r\n"); print('<input type="hidden" name="action" value="">'."\r\n");*/ $sql = " select MAX(r.raid_id) as maxraidid\n\t from Raids r \n\t "; $maxRaidId = CSql::singleValue($sql, 'maxraidid'); $raidStage = CSql::raidStage($maxRaidId); $ShowAllRaids = 0; if ($raidStage > 6) { $ShowAllRaids = mmb_validate($_GET, 'rating', '') == 'all'; $js = "window.location.search = '?rating' + (this.checked ? '=all' : ''); "; print 'Отображать все марш-броски (долгая загрузка) <input type="checkbox" autocomplete="off" name="ShowAllRaids" ' . ($ShowAllRaids ? 'checked="checked"' : '') . ' tabindex="' . ++$TabIndex . '" title="Отображать все марш-броски" onchange="' . $js . '" />' . "\r\n"; } //print('</form>'."\r\n"); print '<br/><br/>' . "\r\n"; print '<div style="margin-top: 15px; max-width: 1500px;" align="left">Рейтинг по версии slazav: по всем ММБ суммируется отношение времени лидера к времени участника. <br/>Для марш-бросков с несколькими дистанциями это отношение дополнительно умножается на отношение длины текущей дистанции к максимальной из длин дистанций. Рейтинг участника марш-броска не рассчитывается в следующих случаях: 1) команда вне зачёта; 2) команда не финишировала; 3) участник сошёл с дистанции. Для марш-бросков до 2012 года сход участников не отражён в данных - можно сообщать о неточностях на общий адрес или в сообщество (ЖЖ) <br/>R6 считается с уценкой каждого предыдущего ММБ на 0.9: последний марш-бросок берётся с весом 1, следующий 0.9, затем 0.9*0.9 и так далее.
if ($RaidId <= 0) { CMmb::setErrorMessage('Не найден ММБ.'); return; } if ($SessionId <= 0) { CMmb::setErrorMessage('Не найдена сессия.'); return; } // Проверка возможности редактировать результаты if (!CanEditResults($Administrator, $Moderator, $TeamUser, $OldMmb, $RaidStage, $TeamOutOfRange)) { CMmb::setErrorMessage('Изменение результатов команды запрещено'); return; } // Смотрим, есть ли точка сход в TeamLevelDismiss $sql = "select teamleveldismiss_id from TeamLevelDismiss where teamuser_id = {$HideTeamUserId}"; $DismissId = CSql::singleValue($sql, 'teamleveldismiss_id'); if ($LevelPointId) { if ($DismissId) { // Точка уже есть и пользователь сошёл - обновляем точку $sql = "update TeamLevelDismiss set levelpoint_id = {$LevelPointId} where teamleveldismiss_id = {$DismissId}"; $rs = MySqlQuery($sql); } else { // Точки нет, а пользователь сошёл - создаём точку $sql = "insert into TeamLevelDismiss (teamuser_id, levelpoint_id, device_id) \n\t\t\t values ({$HideTeamUserId}, {$LevelPointId}, 1) "; $rs = MySqlQuery($sql); } } else { if ($DismissId) { // Точка есть, а пользователь не сошёл - удаляем точку $sql = "delete from TeamLevelDismiss where teamleveldismiss_id = {$DismissId}"; $rs = MySqlQuery($sql);
if ($pUserId <= 0 or $UserId <= 0 or !CRights::canDeliveryInvitation($UserId, $RaidId, 1)) { CMmb::setErrorMessage('Не хватает прав или нет доступных приглашений'); return; } // вставляем запись о розадче // Нахождим дату окончания регистрации $sql = "select ADDTIME(r.raid_registrationenddate, '23:59:59') as invenddt\n from Raids r\n where r.raid_id = {$RaidId}\n and r.raid_registrationenddate is not null\n "; $invEndDt = CSql::singleValue($sql, 'invenddt', false); if (empty($invEndDt)) { CMmb::setErrorSm('Не определена дата окончания действия приглашения.'); return; } // смотрим максимальную дату приглашений по рейтингу // если нашли, то ставим её, а не дату окончания ММБ $sql = "select MAX(inv.invitation_enddt) as maxinvdt\n from InvitationDeliveries invd\n inner join Invitations inv\n on invd.invitationdelivery_id = inv.invitationdelivery_id\n where invd.raid_id = {$RaidId}\n and inv.invitation_enddt > NOW()\n and invd.invitationdelivery_type = 1 \n "; $maxinvdt = CSql::singleValue($sql, 'maxinvdt', false); if (!empty($maxinvdt)) { $invEndDt = $maxinvdt; } $sql = "insert into InvitationDeliveries (raid_id, invitationdelivery_type, invitationdelivery_dt, user_id, invitationdelivery_amount)\n VALUES ({$RaidId}, 3, NOW(), {$UserId}, 1)"; //echo $sql; $newInvDeliveryId = MySqlQuery($sql); //echo "newInvDeliveryId= $newInvDeliveryId "; if ($newInvDeliveryId <= 0) { CMmb::setErrorSm('Ошибка записи раздачи приглашения.'); return; } if ($pUserId <= 0 or $UserId <= 0 or !CRights::canDeliveryInvitation($UserId, $RaidId, 1)) { CMmb::setErrorMessage('Не хватает прав или нет доступных приглашений'); return; }