public function execute($context) { // проверяем валидность ключа if ($context['groupKey']['is_registration_available']) { LocalRedirect('/g/' . $context['groupKey']['access_key'] . '/'); } $seanceValid = false; $groupKeyValid = true; // проверяем наличие ключа сеанса в куке if (isset($_COOKIE['gk' . $context['groupKey']['group_keyID'] . '_seance_key'])) { $seance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByKey($_COOKIE['gk' . $context['groupKey']['group_keyID'] . '_seance_key']); if ($seance && $seance['state'] != \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_COMPLETE) { $seanceValid = true; } } if (!$seanceValid) { // проверяем возможность регистрации по ключу $existCnt = $this->registry->getDbHelper('TestsHelper')->getGroupKeyRespondentsCount($context['project']['projectID'], $context['groupKey']['group_keyID']); if ($context['groupKey']['fact_count'] && $existCnt >= $context['groupKey']['fact_count']) { $groupKeyValid = false; $this->component->IncludeComponentTemplate('linear/limit', '/bitrix/components/ecoplay/group.key.enter/templates/.default'); } elseif ($context['groupKey']['status'] != \Ecoplay\Helper\Db\TestsHelper::GROUP_KEY_STATUS_ACTIVE) { $groupKeyValid = false; $this->component->IncludeComponentTemplate('linear/disabled', '/bitrix/components/ecoplay/group.key.enter/templates/.default'); } else { // ключ валидный, места есть - создаем участника, респондента, сеанс и кладем его в куку $memberKey = $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'); $name = 'Авторегистрация ' . date('H:i d.m.Y') . ' по ключу #' . $context['groupKey']['group_keyID'] . ' ' . $context['groupKey']['name']; $langID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($name, '', '', '', $context['project']['projectID'], $memberKey, $langID, 1, 'new', '', $context['groupKey']['group_keyID'], 1); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $respondentKey = $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'); $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => $context['groupKey']['sessionID'], 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE, 'private_access_key' => $respondentKey, 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $seance = $this->registry->getModel('Blanks')->createSeance($respondentKey); setcookie('gk' . $context['groupKey']['group_keyID'] . '_seance_key', $seance['seance_key'], strtotime('+1 years')); } } if ($groupKeyValid) { $this->component->arParams['MODE'] = 'key'; $factory = new \Ecoplay\Controller\Factory($context['project'], $this->registry, $_SERVER["DOCUMENT_ROOT"] . '/'); $controller = $factory->getBlankViewerController($this->component); $controller->execute(array('seance' => $seance, 'project' => $context['project'], 'APPLICATION' => $context['APPLICATION'], 'anonym' => true)); } }
public function execute($context) { // проверка прав доступа к разделу if (!$this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'members', $context['project']['projectID'])) { $this->registry->getModel('Auth')->restrict(); } $context['APPLICATION']->AddHeadScript('/js/forms.js'); $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js'); $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css'); if (isset($_POST['type'])) { if ($_POST['type'] == 'exist') { if (isset($_POST['member_id'])) { // проверяем, может уже есть респондент с таким участником $existRespondent = $this->registry->getDbHelper('MembersHelper')->findRespondentByMemberIDAndSessionID($context['project']['projectID'], $_POST['member_id'], $_POST['session_id']); if (!$existRespondent) { // добавляем респондента $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => intval($_POST['member_id']), 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } } } else { // пробуем добавить участника $validations = array('name' => 'anything', 'surname' => 'anything', 'email' => 'email', 'position' => 'anything', 'department' => 'anything', 'language' => 'identifier'); $required = array('name', 'email', 'language'); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); if ($validator->validate($_POST)) { // проверяем чтобы не было уже участника с таким email if (!$this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID'])) { $memberID = $this->registry->getDbHelper('MembersHelper')->addMember(trim($_POST["name"]), trim($_POST["surname"]), trim($_POST["position"]), trim($_POST["email"]), $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'), intval($_POST["language"]), 1, 'new', trim($_POST['department'])); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); // добавляем респондента $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $this->component->arResult['statusError'] = 'Участник с таким email (' . $_POST['email'] . ') уже существует'; } } } } if ($_FILES["filepath"] && !$_FILES['filepath']['error']) { $sessionID = (int) $_POST["fgroup"]; if ($sessionID) { $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionById($sessionID); } // обрабатываем загруженный файл $csvImporter = new \Ecoplay\Import\Csv($_FILES["filepath"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"] . "/temp/csv/"); $data = $csvImporter->parse(); $sessionIndex = $csvImporter->getColumnIndex('Группа'); if (!((!$sessionIndex || !$data[0][$sessionIndex]) && (!$sessionID || !$session))) { // определяем группу if ($sessionIndex && $data[0][$sessionIndex]) { // ищем группу $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $data[0][$sessionIndex]); if ($session) { $sessionID = $session['sessionID']; } else { $session = array('name' => $data[0][$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID']); $sessionID = $this->registry->getDbHelper('ProjectsHelper')->addSession($session); $session['sessionID'] = $sessionID; } } $inserted = $skipped = 0; $validations = array(0 => 'anything', 1 => 'anything', 2 => 'email', 3 => 'anything', 4 => 'anything'); $required = array(2); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); $projectLangID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $languageIndex = $csvImporter->getColumnIndex('Язык'); $languagesIDs = array(); $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages'])); foreach ($availableLanguages as $language) { $languagesIDs[$language['abbr']] = $language['langID']; } foreach ($data as $row) { if ($sessionIndex && $row[$sessionIndex] && $row[$sessionIndex] != $session['name']) { // ищем группу $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $row[$sessionIndex]); if ($session) { $sessionID = $session['sessionID']; } else { $session = array('name' => $row[$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID']); $sessionID = $this->registry->getDbHelper('ProjectsHelper')->addSession($session); $session['sessionID'] = $sessionID; } } // валидируем исходные данные if (!$validator->validate($row)) { $skipped++; } elseif (!$row[0] && !$row[1]) { // должно быть хотябы или имя, или фамилия $skipped++; } else { // ищем такого участника уже в базе $member = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($row[2], $context['project']['projectID']); if (!$member) { // добавляем участника // определяем язык по структуре $staff = $this->registry->getDbHelper('MembersHelper')->findStaffByProjectIDAndEmail($context['project']['projectID'], $row[2]); $langID = $languageIndex && $row[$languageIndex] && array_key_exists($row[$languageIndex], $languagesIDs) ? $languagesIDs[$row[$languageIndex]] : $projectLangID; $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($row[0], $row[1], $row[3], $row[2], $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key', false), $langID, 1, 'new', $row[4]); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID, 'staff' => $staff), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $memberID = $member['projects_memberID']; } if ($this->registry->getDbHelper('MembersHelper')->findRespondentByProjectIDAndSessionIDAndMemberID($context['project']['projectID'], $sessionID, $memberID)) { // такой оцениваемый уже есть $skipped++; } else { $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('projectID' => $context['project']['projectID'], 'sessionID' => $sessionID, 'project_memberID' => $memberID, 'active' => 1, 'status' => 'new', 'stat1_assessID' => 0, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key', false), 'stat1_roleID' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); $inserted++; } } } $this->component->arResult['statusSuccess'] = 'Импортировано: ' . $inserted . ', проигнорировано: ' . $skipped; } } $statuses = $this->registry->getDbHelper('MembersHelper')->getLinearRespondentsStatusesNames(); $this->component->arResult['statuses'] = $statuses; $sorts = array('respondentID' => 'respondentID', 'name' => 'name', 'surname' => 'surname', 'email' => 'email', 'position' => 'position', 'status' => 'status', 'private_lk_access_key' => 'private_lk_access_key'); if (isset($_GET['sort']) && array_key_exists($_GET['sort'], $sorts)) { $sort = $_GET['sort']; } else { $sort = 'respondentID'; } $order = isset($_GET['order']) && in_array($_GET['order'], array('asc', 'desc')) ? $_GET['order'] : 'asc'; $filterQueryString = DataFilter::getFilterQueryString($_GET); $this->component->arResult['filterQueryString'] = $filterQueryString; // настройки фильтров для данных $filters = array(0 => array('title' => 'Имя', 'name' => 'name', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`name`'), 1 => array('title' => 'Фамилия', 'name' => 'surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`surname`'), 2 => array('title' => 'ID', 'name' => 'id', 'type' => 'text', 'data_type' => 'number', 'field' => 'r.`respondentID`'), 3 => array('title' => 'Текст', 'name' => 'text', 'type' => 'text', 'data_type' => 'string', 'field' => array('m.`search_text`')), 4 => array('title' => 'Статус ', 'name' => 'status', 'type' => 'select', 'data_type' => 'string', 'field' => 'r.`status`', 'values' => array(0 => 'Любой') + $statuses)); $filterData = array('FILTERS' => $filters, 'BASE_URL' => '/projects/' . $context['project']['projectID'] . '/groups/' . (isset($_GET['TYPE']) && $_GET['TYPE'] ? $_GET['TYPE'] . '/' : '') . 'respondents/', 'SORT' => $sort, 'ORDER' => $order); // проверяем, введен ли фильтр $filterValue = DataFilter::getFilterValue($filters, $_GET, $this->registry->getDbConnect()); if ($filterValue['valid']) { $filterData = array_merge($filterData, $filterValue); } // компонент отображения фильтра $context['APPLICATION']->IncludeComponent('ecoplay:data.filter', '', $filterData); // выполняем с респондентами действия if (isset($_POST['respondents_ids'])) { if (isset($_POST['all']) && $_POST['all']) { $selectedIDs = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondentsIDs($context['project']['projectID'], $filterValue['filter_strings']); } else { $selectedIDs = $_POST['respondents_ids']; } if (isset($_POST['mode'])) { if ($_POST['mode'] == 'send_notifications') { $editedRespondents = $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('need_remind' => 1)); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } elseif ($_POST['mode'] == 'reset') { /*$editedRespondents = $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array( 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE, )); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); }*/ $seances = $this->registry->getDbHelper('SeancesHelper')->findSeanceByProjectAndRespondentsIDs($context['project']['projectID'], $selectedIDs); foreach ($seances as $seance) { // деактивируем текущий сеанс $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('active' => 0, 'private_access_key' => '')); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $seance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_DELETE, $seance); $this->registry->getDbHelper('MembersHelper')->editRespondent($seance['respondentID'], array('status' => 'active')); // создаем новый сеанс $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0); $seanceKey = $BlankDataSource->addSeanceAndCookies($seance['private_access_key']); $newSeance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByKey($seanceKey); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $newSeance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } } elseif ($_POST['mode'] == 'return') { if ($context['project']['allow_edit_seance_answers']) { $seances = $this->registry->getDbHelper('SeancesHelper')->findSeanceByProjectAndRespondentsIDs($context['project']['projectID'], $selectedIDs); foreach ($seances as $seance) { if ($seance['state'] == \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_COMPLETE) { $respondent = $this->registry->getDbHelper('MembersHelper')->findRespondentById($seance['respondentID']); $this->registry->getDbHelper('MembersHelper')->editRespondent($seance['respondentID'], array('status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE)); // обновляем сеанс $lastScreen = $this->registry->getDbHelper('BlanksHelper')->getBlankPrevScreen($seance['blankID'], $seance['last_screenID']); $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('state' => \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_PROGRESS, 'last_screenID' => $lastScreen ? $lastScreen['screenID'] : 0)); } } } } else { $newStatus = false; switch ($_POST['mode']) { case 'to_new': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW; break; case 'to_active': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE; break; case 'to_complete': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_COMPLETE; break; case 'to_archive': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ARCHIVE; break; } if ($newStatus) { $editedRespondents = $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('status' => $newStatus)); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } } } } $arResult['selectedIDs'] = $selectedIDs; // получаем респондентов проекта $cnt = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondentsCount($context['project']['projectID'], $filterValue['filter_strings']); $onPage = 100; $pagesCnt = ceil($cnt / $onPage); $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1; $respondents = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondents($context['project']['projectID'], $page, $onPage, $sorts[$sort], $order, $filterValue['filter_strings']); $this->component->arResult['respondents'] = $respondents; $this->component->arResult['sort'] = $sort; $this->component->arResult['order'] = $order; $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0; $navResult = new \CDBResult(); $navResult->NavPageCount = ceil($cnt / $onPage); $navResult->NavPageNomer = $page; $navResult->NavNum = 1; $navResult->NavPageSize = $onPage; $navResult->NavRecordCount = $cnt; $navResult->nPageWindow = 11; $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/groups/' . (isset($_GET['TYPE']) && $_GET['TYPE'] ? $_GET['TYPE'] . '/' : '') . 'respondents/', 'NAV_QUERY_STRING' => 'sort=' . $sort . '&order=' . $order . ($filterQueryString ? '&' . $filterQueryString : '') . (isset($_GET['checkAll']) ? '&checkAll=1' : ''))); $this->component->arResult['sessions'] = $this->registry->getDbHelper('ProjectsHelper')->getSessionsByProjectID($context['project']['projectID']); $languagesIDs = json_decode($context['project']['~languages']); $languagesSrc = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs($languagesIDs); $languages = array(); foreach ($languagesSrc as $language) { $languages[$language['langID']] = $language['name']; } $this->component->arResult['languages'] = $languages; $this->component->arResult['project'] = $context['project']; $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Респонденты'); $viewHelper = new \Ecoplay\View\Helper(); $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('title' => 'Респонденты')))); $this->component->IncludeComponentTemplate("template_linear"); }
public function execute($context) { if (!$context['project']['allow_subordinates_controlling'] || !$this->registry->getDbHelper('MembersHelper')->isHaveSubordinates($context['member']['email'], $context['project']['projectID'])) { LocalRedirect('/enter/' . $context['member']['private_lk_access_key'] . '/'); } $assess = $this->registry->getDbHelper('MembersHelper')->findAssessById($_GET['ASSESS_ID']); if (!$assess || !$assess['active'] || $assess['projectID'] != $context['project']['projectID']) { LocalRedirect('/enter/' . $context['member']['private_lk_access_key'] . '/'); } $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages'])); $this->component->arResult['languages'] = $availableLanguages; // обработка языка if (isset($_POST['language']) && array_key_exists(intval($_POST['language']), $availableLanguages)) { $langID = intval($_POST['language']); $this->registry->getDbHelper('MembersHelper')->editMember($context['member']['projects_memberID'], array('langID' => $langID)); } else { $langID = $context['member']['langID']; } $this->component->arResult['langID'] = $langID; // Шапка ЛК $translator = new \Ecoplay\Model\Translation($this->registry->getDbConnect(), $availableLanguages[$langID]['abbr'], $_SERVER["DOCUMENT_ROOT"] . '/lang/'); $this->component->arResult['translator'] = $translator; $projectViewSettings = $context['project']['param_lk'] ? (array) json_decode($context['project']['~param_lk']) : array(); $this->component->arResult['projectViewSettings'] = $projectViewSettings; $memberAssess = $this->registry->getDbHelper('MembersHelper')->findFirstAssessByMemberID($context['project']['projectID'], $context['member']['projects_memberID']); $addonCss = false; if ($memberAssess) { $addonCss = $this->registry->getDbHelper('ProjectsHelper')->findCSSBySessionsIDs(array($memberAssess['sessionID'])); } if (!$addonCss && $context['project']['myCSS_path']) { $addonCss = $context['project']['myCSS_path']; } $context['APPLICATION']->IncludeComponent("ecoplay:front.header", '', array('TRANSLATOR' => $translator, 'MODE' => 'subordinate', 'MEMEBER_KEY' => $context['member']['private_lk_access_key'], 'NAME' => $translator->translateObject($context['member']['name'], 'member_name', $context['member']['projects_memberID'], $langID) . ' ' . $translator->translateObject($context['member']['surname'], 'member_surname', $context['member']['projects_memberID'], $langID), 'SETTINGS' => $projectViewSettings, 'ADDON_CSS' => $addonCss)); // ищем участников по структуре $subordinatesMembers = $this->registry->getDbHelper('MembersHelper')->getSubordinatesMembers($context['member']['email'], $context['project']['projectID']); if (!array_key_exists($assess['project_memberID'], $subordinatesMembers)) { LocalRedirect('/enter/' . $context['member']['private_lk_access_key'] . '/'); } $this->component->arResult['assess'] = $assess; $this->component->arResult['assessMember'] = $subordinatesMembers[$assess['project_memberID']]; // выбор языка $this->component->includeComponentTemplate('languages'); $this->component->arResult['TEXT'] = $translator->translateObject($context['project']['~lk_subordinate_text'], 'project_lk_subordinate_text', $context['project']['projectID'], $langID); // определяем роли, по которым можем управлять $rolesIDs = array(); $rolesSrc = $this->registry->getDbHelper('ProjectsHelper')->getProjectRoles($context['project']['projectID']); $roles = array(); $deniedRoles = array('self', 'direct_head', 'functional_head'); foreach ($rolesSrc as $role) { if (!in_array($role['fixed_role'], $deniedRoles)) { $rolesIDs[] = $role['roleID']; } $roles[$role['roleID']] = $role['name']; } $this->component->arResult['roles'] = $roles; $this->component->arResult['controlledRoles'] = $rolesIDs; // проверяем, можно ли управлять респондентами $canControllRespondents = $assess['status'] == \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_RESPONDENTS_SELECTED ? true : false; $this->component->arResult['canControllRespondents'] = $canControllRespondents; if ($canControllRespondents) { // удаляем if (isset($_POST['del_id'])) { $respondent = $this->registry->getDbHelper('MembersHelper')->findRespondentById($_POST['del_id']); if ($respondent && $respondent['active'] && $respondent['stat1_assessID'] == $assess['assessID'] && in_array($respondent['stat1_roleID'], $rolesIDs)) { $this->registry->getDbHelper('MembersHelper')->deleteRespondent($_POST['del_id']); } } // добавляем if (isset($_POST['respondent_id'])) { $projectLangID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $respondentStaff = $this->registry->getDbHelper('MembersHelper')->findStaffByID($_POST['respondent_id']); if ($respondentStaff && $respondentStaff['active'] && $respondentStaff['projectID'] == $context['project']['projectID'] && isset($_POST['role']) && in_array($_POST['role'], $rolesIDs)) { // ищем соответствующего участника $respondentMember = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($respondentStaff['email'], $context['project']['projectID']); if (!$respondentMember) { $respondentMember = array('active' => 1, 'projectID' => $context['project']['projectID'], 'email' => $respondentStaff['email']); $name = $respondentStaff['name'] . ($respondentStaff['name2'] ? ' ' . $respondentStaff['name2'] : ''); $respondentMember['projects_memberID'] = $this->registry->getDbHelper('MembersHelper')->addMember($name, $respondentStaff['surname'], $respondentStaff['position'], $respondentStaff['email'], $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'), $respondentStaff['langID'] ? $respondentStaff['langID'] : $projectLangID, 1, 'new', $respondentStaff['department_text']); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $respondentMember['projects_memberID']), true); } if ($respondentMember && $respondentMember['active'] && $respondentMember['projectID'] == $context['project']['projectID']) { $existRespondent = $this->registry->getDbHelper('MembersHelper')->findRespondentByAssessIDAndMemberID($context['project']['projectID'], $assess['sessionID'], $assess['assessID'], $respondentMember['projects_memberID']); if (!$existRespondent) { $roleID = $_POST['role']; $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('projectID' => $context['project']['projectID'], 'sessionID' => $assess['sessionID'], 'project_memberID' => $respondentMember['projects_memberID'], 'active' => 1, 'status' => 'new', 'stat1_assessID' => $assess['assessID'], 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => $roleID, 'deny_deletion' => 0)); } } } } // подтверждение if (isset($_POST['view'])) { $this->registry->getDbHelper('MembersHelper')->editAssess($assess['assessID'], array('viewed_by_direct_head' => 1)); LocalRedirect('/enter/' . $context['member']['private_lk_access_key'] . '/subordinates/'); } } $grouppedRespondents = array(); $subordinateRespondents = $this->registry->getDbHelper('MembersHelper')->getSubordinatesRespondents($context['project']['projectID'], array($assess['assessID'])); foreach ($subordinateRespondents as $respondent) { if (!array_key_exists($respondent['stat1_roleID'], $grouppedRespondents)) { $grouppedRespondents[$respondent['stat1_roleID']] = array(); } $grouppedRespondents[$respondent['stat1_roleID']][] = $respondent; } $this->component->arResult['respondents'] = $grouppedRespondents; $this->component->IncludeComponentTemplate(); $context['APPLICATION']->IncludeComponent("ecoplay:front.footer", '', array('TRANSLATOR' => $translator, 'SETTINGS' => $projectViewSettings)); }
public function execute($context) { $context['APPLICATION']->AddHeadScript('/js/forms.js'); $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js'); $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css'); if (isset($_POST['type'])) { if ($_POST['type'] == 'edit') { // находим участника $member = $this->registry->getDbHelper('MembersHelper')->findById($_POST['memberID']); if ($member['email'] != $_POST['email'] && $_POST['email']) { $sameEmailMember = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID']); $email = $sameEmailMember ? $member['email'] : $_POST['email']; } else { $email = $member['email']; } $this->registry->getDbHelper('MembersHelper')->updateMember($member['projects_memberID'], $_POST['name'], $_POST['surname'], $_POST['position'], $email, $_POST['language'], $_POST['department']); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $member['projects_memberID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $member); } elseif ($_POST['type'] == 'exist') { if (isset($_POST['member_id'])) { // проверяем, может этот участник уже привязан к ключу $linkExist = $this->registry->getDbHelper('LinearProjectsHelper')->isMemberLinkedToGroupKey($context['project']['projectID'], $context['groupKey']['group_keyID'], intval($_POST['member_id'])); if (!$linkExist) { // добавляем привязку $itemID = $this->registry->getDbHelper('LinearProjectsHelper')->addGroupKeyMember(array('projectID' => $context['project']['projectID'], 'group_keyID' => $context['groupKey']['group_keyID'], 'memberID' => intval($_POST['member_id']))); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'group_key_member', $itemID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } } } else { // пробуем добавить участника $validations = array('name' => 'anything', 'surname' => 'anything', 'email' => 'email', 'position' => 'anything', 'department' => 'anything', 'language' => 'identifier'); $required = array('name', 'email', 'language'); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); if ($validator->validate($_POST)) { // проверяем чтобы не было уже участника с таким email if (!$this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID'])) { $memberID = $this->registry->getDbHelper('MembersHelper')->addMember(trim($_POST["name"]), trim($_POST["surname"]), trim($_POST["position"]), trim($_POST["email"]), $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'), intval($_POST["language"]), 1, 'new', trim($_POST['department'])); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); // добавляем привязку $itemID = $this->registry->getDbHelper('LinearProjectsHelper')->addGroupKeyMember(array('projectID' => $context['project']['projectID'], 'group_keyID' => $context['groupKey']['group_keyID'], 'memberID' => $memberID)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'group_key_member', $itemID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $this->component->arResult['statusError'] = 'Участник с таким email (' . $_POST['email'] . ') уже существует'; } } } } $selectedIDs = array(); if (isset($_POST['items_ids'])) { if (isset($_POST['all']) && $_POST['all']) { $selectedIDs = $this->registry->getDbHelper('LinearProjectsHelper')->getGroupKeyMembersIDsByProjectIDAndKeyID($context['project']['projectID'], $context['groupKey']['group_keyID']); } else { $selectedIDs = $_POST['items_ids']; } if (isset($_POST['mode'])) { if ($_POST['mode'] == 'delete') { $deletedItems = $this->registry->getDbHelper('LinearProjectsHelper')->getGroupKeyMembersByIDs($selectedIDs); $this->registry->getDbHelper('LinearProjectsHelper')->deleteGroupKeyMembersByIDs($selectedIDs); foreach ($deletedItems as $item) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'group_key_member', $item['itemID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_DELETE, $item); } } elseif ($_POST['mode'] == 'email') { $emailedItems = $this->registry->getDbHelper('LinearProjectsHelper')->getGroupKeyMembersByIDs($selectedIDs); $this->registry->getDbHelper('LinearProjectsHelper')->editGroupKeyMembers($selectedIDs, array('send_email' => 1)); foreach ($emailedItems as $item) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'group_key_member', $item['itemID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $item); } } } } $arResult['selectedIDs'] = $selectedIDs; if ($_FILES["filepath"] && !$_FILES['filepath']['error']) { // обрабатываем загруженный файл $csvImporter = new \Ecoplay\Import\Csv($_FILES["filepath"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"] . "/temp/csv/"); $data = $csvImporter->parse(); $inserted = $skipped = 0; $validations = array(0 => 'anything', 1 => 'anything', 2 => 'email', 3 => 'anything', 4 => 'anything'); $required = array(2); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); $projectLangID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $languageIndex = $csvImporter->getColumnIndex('Язык'); $languagesIDs = array(); $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages'])); foreach ($availableLanguages as $language) { $languagesIDs[$language['abbr']] = $language['langID']; } foreach ($data as $row) { // валидируем исходные данные if (!$validator->validate($row)) { $skipped++; } elseif (!$row[0] && !$row[1]) { // должно быть хотябы или имя, или фамилия $skipped++; } else { // ищем такого участника уже в базе $member = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($row[2], $context['project']['projectID']); if (!$member) { // добавляем участника // определяем язык по структуре $staff = $this->registry->getDbHelper('MembersHelper')->findStaffByProjectIDAndEmail($context['project']['projectID'], $row[2]); $langID = $languageIndex && $row[$languageIndex] && array_key_exists($row[$languageIndex], $languagesIDs) ? $languagesIDs[$row[$languageIndex]] : $projectLangID; $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($row[0], $row[1], $row[3], $row[2], $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key', false), $langID, 1, 'new', $row[4]); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $memberID = $member['projects_memberID']; } if ($this->registry->getDbHelper('LinearProjectsHelper')->isMemberLinkedToGroupKey($context['project']['projectID'], $context['groupKey']['group_keyID'], $memberID)) { // такой оцениваемый уже есть $skipped++; } else { // добавляем привязку $itemID = $this->registry->getDbHelper('LinearProjectsHelper')->addGroupKeyMember(array('projectID' => $context['project']['projectID'], 'group_keyID' => $context['groupKey']['group_keyID'], 'memberID' => intval($memberID))); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'group_key_member', $itemID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); $inserted++; } } } $this->component->arResult['statusSuccess'] = 'Импортировано: ' . $inserted . ', проигнорировано: ' . $skipped; } $cnt = $this->registry->getDbHelper('TestsHelper')->getGroupKeyLinkedMembersCount($context['project']['projectID'], $context['groupKey']['group_keyID']); $onPage = 100; $pagesCnt = ceil($cnt / $onPage); $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1; $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0; $members = $this->registry->getDbHelper('TestsHelper')->getGroupKeyLinkedMembers($context['project']['projectID'], $context['groupKey']['group_keyID'], $page, $onPage); $this->component->arResult['members'] = $members; $this->component->arResult['groupKey'] = $context['groupKey']; $languagesIDs = json_decode($context['project']['~languages']); $languagesSrc = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs($languagesIDs); $languages = array(); foreach ($languagesSrc as $language) { $languages[$language['langID']] = $language['name']; } $this->component->arResult['languages'] = $languages; $this->component->IncludeComponentTemplate('linear/table'); $navResult = new \CDBResult(); $navResult->NavPageCount = ceil($cnt / $onPage); $navResult->NavPageNomer = $page; $navResult->NavNum = 1; $navResult->NavPageSize = $onPage; $navResult->NavRecordCount = $cnt; $navResult->nPageWindow = 11; $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/settings/groupkeys/' . $context['groupKey']['group_keyID'] . '/members/', 'NAV_QUERY_STRING' => isset($_GET['checkAll']) ? 'checkAll=1' : '')); $viewHelper = new \Ecoplay\View\Helper(); $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Респонденты группового ключа'); $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('link' => '/projects/' . $context['project']['projectID'] . '/settings/groupkeys/', 'title' => ' Групповые ключи'), 4 => array('title' => $context['groupKey']['name']), 5 => array('title' => 'Список Респондентов')))); $this->component->IncludeComponentTemplate('linear/template'); }
public function execute($context) { // проверка прав доступа к разделу if (!$this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'members', $context['project']['projectID'])) { $this->registry->getModel('Auth')->restrict(); } $context['APPLICATION']->AddHeadScript('/js/forms.js'); $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js'); $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css'); $availableSessionsIDs = $this->registry->getModel('Auth')->getAvailableSessions($_SESSION['accesses'], $context['project']['projectID'], $context['project']['project_type']); $viewHelper = new \Ecoplay\View\Helper(); if (count($availableSessionsIDs)) { // нормогруппы для генераторов отчетов $projectSettings = json_decode($context['project']['~param_roles'], true); $haveValuation = false; if (array_key_exists('rgenerators', $projectSettings) && $projectSettings['rgenerators']) { $generatorsSrc = $this->registry->getDbHelper('ReportsHelper')->getGeneratorsCollectionByIds($projectSettings['rgenerators']); foreach ($generatorsSrc as $generator) { if ($generator['use_valuation_group']) { $haveValuation = true; break; } } } if ($haveValuation) { // определяем тип админа (экопси или нет) $isEcopsy = false; $groups = $this->registry->getDbHelper('UsersHelper')->getUserGroups($context['USER']->GetID()); if (count($groups) > 1) { $isEcopsy = true; } else { $clientID = $this->registry->getDbHelper('UsersHelper')->getUserClient($context['USER']->GetID()); if ($clientID == \Ecoplay\Helper\Db\ClientsHelper::ECOPSY_CLIENT_ID) { $isEcopsy = true; } } $this->component->arResult['valuationGroups'] = $this->registry->getDbHelper('TestsHelper')->getProjectValuationGroups($context['project']['projectID'], $isEcopsy); } $this->component->arResult['haveValuation'] = $haveValuation; if (isset($_POST['type'])) { if ($_POST['type'] == 'edit') { // находим респондента $respondent = $this->registry->getDbHelper('MembersHelper')->findRespondentById($_POST['respondentID']); if ($respondent) { // обновляем участника $member = $this->registry->getDbHelper('MembersHelper')->findById($respondent['project_memberID']); if ($member['email'] != $_POST['email'] && $_POST['email']) { $sameEmailMember = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID']); $email = $sameEmailMember ? $member['email'] : $_POST['email']; } else { $email = $member['email']; } $this->registry->getDbHelper('MembersHelper')->updateMember($respondent['project_memberID'], $_POST['name'], $_POST['surname'], $_POST['position'], $email, $_POST['language'], $_POST['department']); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $respondent['project_memberID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $member); if ($respondent['sessionID'] != $_POST['session_id']) { $seance = $this->registry->getDbHelper('TestsSeancesHelper')->findSeanceByProjectIDAndRespondentID($context['project']['projectID'], $respondent['respondentID']); if (!$seance) { $this->registry->getDbHelper('MembersHelper')->editRespondent($respondent['respondentID'], array('sessionID' => $_POST['session_id'])); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } } echo 'Редактирование<br/>'; } elseif ($_POST['type'] == 'exist') { if (isset($_POST['member_id'])) { // проверяем, может уже есть респондент с таким участником //$existRespondent = $this->registry->getDbHelper('MembersHelper')->findRespondentByMemberID($context['project']['projectID'], $_POST['member_id']); //if (!$existRespondent) { // добавляем респондента $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => intval($_POST['member_id']), 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } //} } else { // пробуем добавить участника $validations = array('name' => 'anything', 'surname' => 'anything', 'email' => 'email', 'position' => 'anything', 'department' => 'anything', 'language' => 'identifier'); $required = array('name', 'email', 'language'); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); if ($validator->validate($_POST)) { // проверяем чтобы не было уже участника с таким email if (!$this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID'])) { $memberID = $this->registry->getDbHelper('MembersHelper')->addMember(trim($_POST["name"]), trim($_POST["surname"]), trim($_POST["position"]), trim($_POST["email"]), $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'), intval($_POST["language"]), 1, 'new', trim($_POST['department'])); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); // добавляем респондента $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $this->component->arResult['statusError'] = 'Участник с таким email (' . $_POST['email'] . ') уже существует'; } } } } if ($_FILES["filepath"] && !$_FILES['filepath']['error']) { $sessionID = (int) $_POST["fgroup"]; if ($sessionID) { $session = $this->registry->getDbHelper('TestsHelper')->findSessionByID($sessionID); } // обрабатываем загруженный файл $csvImporter = new \Ecoplay\Import\Csv($_FILES["filepath"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"] . "/temp/csv/"); $data = $csvImporter->parse(); $sessionIndex = $csvImporter->getColumnIndex('Группа'); if (!((!$sessionIndex || !$data[0][$sessionIndex]) && (!$sessionID || !$session))) { // определяем группу if ($sessionIndex && $data[0][$sessionIndex]) { // ищем группу $session = $this->registry->getDbHelper('TestsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $data[0][$sessionIndex]); if ($session) { $sessionID = $session['sessionID']; } else { /*$session = array( 'name' => $data[0][$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID'], ); $sessionID = $this->registry->getDbHelper('TestsHelper')->addSession($session); $session['sessionID'] = $sessionID;*/ $sessionID = 0; } } $inserted = $skipped = 0; $validations = array(0 => 'anything', 1 => 'anything', 2 => 'email', 3 => 'anything', 4 => 'anything'); $required = array(2); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); $projectLangID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $languageIndex = $csvImporter->getColumnIndex('Язык'); $languagesIDs = array(); $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages'])); foreach ($availableLanguages as $language) { $languagesIDs[$language['abbr']] = $language['langID']; } $rowIndex = 0; $skippedRows = array(); foreach ($data as $row) { $rowIndex++; if ($sessionIndex && $row[$sessionIndex] && (!$sessionID || $row[$sessionIndex] != $session['name'])) { // ищем группу $session = $this->registry->getDbHelper('TestsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $row[$sessionIndex]); if ($session) { $sessionID = $session['sessionID']; } else { /*$session = array( 'name' => $row[$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID'], ); $sessionID = $this->registry->getDbHelper('TestsHelper')->addSession($session); $session['sessionID'] = $sessionID;*/ $sessionID = 0; } } if (!$sessionID) { $skipped++; $skippedRows[] = $rowIndex; continue; } // валидируем исходные данные if (!$validator->validate($row)) { $skipped++; $skippedRows[] = $rowIndex; } elseif (!$row[0] && !$row[1]) { // должно быть хотябы или имя, или фамилия $skipped++; $skippedRows[] = $rowIndex; } else { // ищем такого участника уже в базе $member = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($row[2], $context['project']['projectID']); if (!$member) { // добавляем участника // определяем язык по структуре $staff = $this->registry->getDbHelper('MembersHelper')->findStaffByProjectIDAndEmail($context['project']['projectID'], $row[2]); $langID = $languageIndex && $row[$languageIndex] && array_key_exists($row[$languageIndex], $languagesIDs) ? $languagesIDs[$row[$languageIndex]] : $projectLangID; $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($row[1], $row[0], $row[3], $row[2], $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key', false), $langID, 1, 'new', $row[4]); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } else { $memberID = $member['projects_memberID']; } if ($this->registry->getDbHelper('MembersHelper')->findRespondentByProjectIDAndSessionIDAndMemberID($context['project']['projectID'], $sessionID, $memberID)) { // такой оцениваемый уже есть $skipped++; $skippedRows[] = $rowIndex; } else { $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('projectID' => $context['project']['projectID'], 'sessionID' => $sessionID, 'project_memberID' => $memberID, 'active' => 1, 'status' => 'new', 'stat1_assessID' => 0, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key', false), 'stat1_roleID' => 0)); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); $inserted++; } } } $this->component->arResult['statusSuccess'] = 'Импортировано: ' . $inserted . ', проигнорировано: ' . $skipped . ($skipped ? ' (строки ' . implode(', ', $skippedRows) . ')' : ''); } } $statuses = $this->registry->getDbHelper('MembersHelper')->getTestingRespondentsStatusesNames(); $this->component->arResult['statuses'] = $statuses; $sorts = array('respondentID' => 'respondentID', 'name' => 'name', 'surname' => 'surname', 'email' => 'email', 'position' => 'position', 'session' => 'sessionID', 'status' => 'status', 'private_lk_access_key' => 'private_lk_access_key', 'last_email' => 'last_email', 'last_action' => 'last_entrance'); if (isset($_GET['sort']) && array_key_exists($_GET['sort'], $sorts)) { $sort = $_GET['sort']; } else { $sort = 'respondentID'; } $order = isset($_GET['order']) && in_array($_GET['order'], array('asc', 'desc')) ? $_GET['order'] : 'asc'; $filterQueryString = DataFilter::getFilterQueryString($_GET); $this->component->arResult['filterQueryString'] = $filterQueryString; $sessions = $this->registry->getDbHelper('TestsHelper')->getSessionsByProjectID($context['project']['projectID']); $userSessions = array(); foreach ($sessions as $session) { if (in_array($session['sessionID'], $availableSessionsIDs)) { $userSessions[$session['sessionID']] = $session['name']; } } $this->component->arResult['userSessions'] = $userSessions; // настройки фильтров для данных $filters = array(0 => array('title' => 'Имя', 'name' => 'name', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`name`'), 1 => array('title' => 'Фамилия', 'name' => 'surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`surname`'), 2 => array('title' => 'ID', 'name' => 'id', 'type' => 'text', 'data_type' => 'number', 'field' => 'r.`respondentID`'), 3 => array('title' => 'Текст', 'name' => 'text', 'type' => 'text', 'data_type' => 'string', 'field' => array('m.`search_text`')), 4 => array('title' => 'Статус ', 'name' => 'status', 'type' => 'select', 'data_type' => 'string', 'field' => 'r.`status`', 'values' => array(0 => 'Любой') + $statuses), 5 => array('title' => 'Группа ', 'name' => 'session_id', 'type' => 'select', 'data_type' => 'number', 'field' => 'r.`sessionID`', 'values' => array(0 => 'Любая') + $userSessions), 6 => array('title' => 'В архиве ', 'name' => 'is_archive', 'type' => 'select', 'data_type' => 'number', 'field' => 'r.`is_archive`', 'values' => array(-1 => '-', 0 => 'Нет', 1 => 'Да'), 'explicit' => 1)); $filterData = array('FILTERS' => $filters, 'BASE_URL' => '/projects/' . $context['project']['projectID'] . '/groups/respondents/', 'SORT' => $sort, 'ORDER' => $order); // проверяем, введен ли фильтр $filterValue = DataFilter::getFilterValue($filters, $_GET, $this->registry->getDbConnect()); if ($filterValue['valid']) { $filterData = array_merge($filterData, $filterValue); } // компонент отображения фильтра $context['APPLICATION']->IncludeComponent('ecoplay:data.filter', '', $filterData); // выполняем с респондентами действия if (isset($_POST['respondents_ids'])) { if (isset($_POST['all']) && $_POST['all']) { $selectedIDs = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsIDsByProjectIDAndSessionsIDs($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']); } else { $selectedIDs = $_POST['respondents_ids']; } if (isset($_POST['mode'])) { if ($_POST['mode'] == 'delete') { $deletedRespondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->deleteRespondentsByIDs($selectedIDs); foreach ($deletedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_DELETE, $respondent); } } elseif ($_POST['mode'] == 'zip') { $editedRespondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('is_archive' => 1)); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } elseif ($_POST['mode'] == 'unzip') { $editedRespondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('is_archive' => 0)); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } elseif ($_POST['mode'] == 'mail_resend') { $editedRespondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByIDs($selectedIDs); $membersIds = array(0); foreach ($editedRespondents as $respondent) { $membersIds[intval($respondent["project_memberID"])] = intval($respondent["project_memberID"]); } $selectedMemebers = $this->registry->getDbHelper('MembersHelper')->getMembersByIDs($membersIds); $languagesIDs = json_decode($context['project']['~languages']); foreach ($selectedMemebers as $selectedMemeber) { if ($selectedMemeber["email"] != "") { $smtpMail = \Ecoplay\Model\SmtpMail::getInstance($this->registry->getDbConnect(), SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD); $smtpMail->sendFromTemplate($context['project']['projectID'], 'MailEvent_Testing_MailResend', $languagesIDs[0], array("RESPONDENT" => $selectedMemeber["name"] . " " . $selectedMemeber["surname"], "RESPONDENT_LK_LINK" => 'http://' . SITE_HOST . '/enter/' . $selectedMemeber['private_lk_access_key'] . "/", 'EMAIL_TO' => $selectedMemeber["email"], 'EMAIL_FROM' => EMAIL_FROM), 'member', $selectedMemeber['projects_memberID']); } } } elseif ($_POST['mode'] == 'reports') { $valid = false; $params = array(); if ($haveValuation) { if ($_POST['valuation_group']) { // валидируем выбранную нормогруппу $valuationGroup = $this->registry->getDbHelper('TestsHelper')->findValuationGroupByID(intval($_POST['valuation_group'])); if ($valuationGroup) { $params['valuationGroupID'] = $valuationGroup['vgroupID']; $valid = true; } } } else { $valid = true; } if ($valid) { // Создаем задачу на генерацию отчетов $taskID = $this->registry->getDbHelper('TasksHelper')->addTask(array('name' => '', 'type' => \Ecoplay\Helper\Db\TasksHelper::TASK_TYPE_REPORT, 'params' => json_encode(array_merge($params, array('projectID' => $context['project']['projectID'], 'respondentsIDs' => $selectedIDs))), 'userID' => $context['USER']->GetID(), 'status' => \Ecoplay\Helper\Db\TasksHelper::TASK_STATUS_NEW, 'dt_created' => date('d-m-Y H:i:s'))); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'task', $taskID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); } } else { $newStatus = false; switch ($_POST['mode']) { case 'to_new': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW; break; case 'to_waiting': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_WAITING; break; case 'to_active': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE; break; case 'to_complete': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_COMPLETE; break; /*case 'to_report': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_REPORT; break; case 'to_archive': $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ARCHIVE; break;*/ } if ($newStatus) { $editedRespondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByIDs($selectedIDs); $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('status' => $newStatus)); foreach ($editedRespondents as $respondent) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent); } } } } } $arResult['selectedIDs'] = $selectedIDs; // получаем респондентов проекта $cnt = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsCountByProjectIDAndSessionsIDs($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']); $onPage = 100; $pagesCnt = ceil($cnt / $onPage); $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1; $respondents = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsByProjectIDAndSessionsIDsPaged($context['project']['projectID'], $availableSessionsIDs, $page, $onPage, $sorts[$sort], $order, $filterValue['filter_strings']); $this->component->arResult['respondents'] = $respondents; $this->component->arResult['sort'] = $sort; $this->component->arResult['order'] = $order; $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0; // инфа для редактирования $respondentsJson = array(); $respondentsIDs = array(); foreach ($respondents as $respondent) { $respondentsJson[$respondent['respondentID']] = array('name' => $respondent['name'], 'surname' => $respondent['surname'], 'email' => $respondent['email'], 'position' => $respondent['position'], 'department' => $respondent['department'], 'langID' => $respondent['langID'], 'sessionID' => $respondent['sessionID']); $respondentsIDs[] = $respondent['respondentID']; } $jsonRespondents = json_encode($respondentsJson); $jsonRespondents = str_replace("'", "\\'", $jsonRespondents); $jsonRespondents = str_replace("\\", "\\\\", $jsonRespondents); $this->component->arResult['json_respondents'] = $jsonRespondents; // отчеты респондентов $reports = array(); if (count($respondentsIDs)) { $reportsSrc = $this->registry->getDbHelper('ReportsHelper')->getReportsByProjectIDAndRespondentsIDs($context['project']['projectID'], $respondentsIDs); foreach ($reportsSrc as $report) { if (!array_key_exists($report['stat1_respondentID'], $reports)) { $reports[$report['stat1_respondentID']] = array('reportID' => $report['generated_reportID'], 'cnt' => 1); } else { $reports[$report['stat1_respondentID']]['cnt']++; if ($report['generated_reportID'] > $reports[$report['stat1_respondentID']]['reportID']) { $reports[$report['stat1_respondentID']]['reportID'] = $report['generated_reportID']; } } } } $this->component->arResult['reports'] = $reports; // инфа для построения прогресса $this->component->arResult['progress_settings'] = $this->registry->getModel('Tests')->getProjectProgressSettings($context['project']['projectID']); // статистика по статусам $get = $_GET; if (array_key_exists('status_fvalue', $get)) { unset($get['status_fvalue']); } $filterValue = DataFilter::getFilterValue($filters, $get, $this->registry->getDbConnect()); $statusesStatSrc = $this->registry->getDbHelper('TestsSeancesHelper')->getRespondentsStatusesStat($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']); $statusesStat = array(); $allStatusesCnt = 0; foreach ($statuses as $status => $name) { $statusesStat[$status] = 0; } foreach ($statusesStatSrc as $stat) { //foreach ($respondents as $respondent) { $statusesStat[$stat['status']] += $stat['cnt']; $allStatusesCnt += $stat['cnt']; } $this->component->arResult['statuses_stat'] = $statusesStat; $this->component->arResult['all_statuses_cnt'] = $allStatusesCnt; $this->component->IncludeComponentTemplate("testing_statuses_filter"); $navResult = new \CDBResult(); $navResult->NavPageCount = ceil($cnt / $onPage); $navResult->NavPageNomer = $page; $navResult->NavNum = 1; $navResult->NavPageSize = $onPage; $navResult->NavRecordCount = $cnt; $navResult->nPageWindow = 11; $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/groups/respondents/', 'NAV_QUERY_STRING' => 'sort=' . $sort . '&order=' . $order . ($filterQueryString ? '&' . $filterQueryString : '') . (isset($_GET['checkAll']) ? '&checkAll=1' : ''))); $this->component->arResult['sessions'] = $sessions; $packagesIDs = array(); foreach ($sessions as $session) { if (!in_array($session['packageID'], $packagesIDs)) { $packagesIDs[] = $session['packageID']; } } $this->component->arResult['packages'] = $this->registry->getDbHelper('TestsHelper')->getPackagesByIDs($packagesIDs); $languagesIDs = json_decode($context['project']['~languages']); $languagesSrc = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs($languagesIDs); $languages = array(); foreach ($languagesSrc as $language) { $languages[$language['langID']] = $language['name']; } $this->component->arResult['languages'] = $languages; } else { $this->component->arResult['respondents'] = null; } $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Тестируемые'); $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('title' => 'Тестируемые')))); $this->component->arResult['canReports'] = $this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'reports', $context['project']['projectID']); $this->component->IncludeComponentTemplate("template_testing"); }
public function execute($context) { $langID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']); $lang = $this->registry->getDbHelper('TranslationHelper')->findLanguageByID($langID); $translator = new \Ecoplay\Model\Translation($this->registry->getDbConnect(), $lang['abbr'], $_SERVER["DOCUMENT_ROOT"] . '/lang/', $this->registry); $this->component->arResult['translator'] = $translator; $projectViewSettings = $context['project']['param_lk'] ? (array) json_decode($context['project']['~param_lk']) : array(); $this->component->arResult['projectViewSettings'] = $projectViewSettings; // кол-во респондентов, зрарегистрированных по этому ключу $existCnt = $this->registry->getDbHelper('TestsHelper')->getGroupKeyRespondentsCount($context['project']['projectID'], $context['groupKey']['group_keyID']); if ($context['groupKey']['fact_count'] && $existCnt >= $context['groupKey']['fact_count']) { $this->component->IncludeComponentTemplate('testing/limit'); } elseif ($context['groupKey']['status'] != \Ecoplay\Helper\Db\TestsHelper::GROUP_KEY_STATUS_ACTIVE) { $this->component->IncludeComponentTemplate('testing/disabled'); } else { /*$context['APPLICATION']->IncludeComponent("ecoplay:front.header", '', array( 'TRANSLATOR' => $translator, 'MODE' => 'blank', 'MEMEBER_KEY' => false, 'SETTINGS' => $projectViewSettings, 'ADDON_CSS' => false, 'TEXT' => '', ));*/ $added = false; // флаг добавления респондента // проверяем, возможно есть авторегистраци if (!$context['groupKey']['is_registration_available']) { $memberKey = $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'); $name = 'Авторегистрация ' . date('H:i d.m.Y') . ' по ключу #' . $context['groupKey']['group_keyID']; $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($name, '', '', '', $context['project']['projectID'], $memberKey, $langID, 1, 'new', '', $context['groupKey']['group_keyID']); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => $context['groupKey']['sessionID'], 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $added = true; LocalRedirect('/enter/' . $memberKey . '/'); } else { if (isset($_POST['send'])) { $validations = array('name' => 'anything', 'surname' => 'anything', 'email' => 'email', 'position' => 'anything'); $required = array('name'); $validator = new \Ecoplay\Form\Validator($validations, $required, array()); if ($validator->validate($_POST)) { // добавляем участника и респондента $memberKey = $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'); $memberID = $this->registry->getDbHelper('MembersHelper')->addMember(trim($_POST["name"]), trim($_POST["surname"]), trim($_POST["position"]), trim($_POST["email"]), $context['project']['projectID'], $memberKey, $langID, 1, 'new', '', $context['groupKey']['group_keyID']); $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true); $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => $context['groupKey']['sessionID'], 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0)); $added = true; //$this->component->arResult['access_key'] = $memberKey; //$this->component->IncludeComponentTemplate('testing/success'); LocalRedirect('/enter/' . $memberKey . '/'); } } } if (!$added) { $this->component->IncludeComponentTemplate('testing/template'); } } /*$context['APPLICATION']->IncludeComponent("ecoplay:front.footer", '', array( 'TRANSLATOR' => $translator, 'SETTINGS' => $projectViewSettings, ));*/ }
public function execute($context) { try { $this->registry->getDbConnect()->StartTransaction(); $this->component->arResult['project'] = $context['project']; // определяем сессию, в которой заполняется анкета $this->detectSession($context); $this->member = $this->registry->getDbHelper('MembersHelper')->findMemberByRespondentID($context['seance']['respondentID']); $groupKey = $this->member['stat2_group_keyID'] ? $this->registry->getDbHelper('TestsHelper')->findGroupKeyByID($this->member['stat2_group_keyID']) : false; $this->registry->getModel('Stat')->addHit($context['seance']['sessionID'], $this->member['projects_memberID']); if ($groupKey && (!isset($context['anonym']) || !$context['anonym']) && !$groupKey['is_registration_available']) { LocalRedirect('/a/' . $groupKey['access_key'] . '/'); $this->registry->getDbConnect()->Commit(); } if (isset($_GET['first']) && $context['project']['allow_edit_seance_answers_at_complete']) { if (!$groupKey || $groupKey['is_registration_available']) { $this->registry->getDbHelper('SeancesHelper')->editSeance($context['seance']['seanceID'], array('last_screenID' => 0)); $this->registry->getDbConnect()->Commit(); LocalRedirect('/s/' . $context['seance']['seance_key'] . '/'); } } // сохраняем ответы на вопросы if ($this->component->arParams['MODE'] == 'key' && $_POST["action"] == "save_answers") { // возможно просто пытаемся вернуться на предыдущую страницу if (isset($_POST['back']) && $_POST['back']) { if ($_SESSION['form_token'] == @$_POST['token'] && ($context['project']['allow_edit_seance_answers'] || $context['project']['allow_edit_seance_answers_at_complete'])) { // пробуем ответить на вопросы со страницы $this->saveAnswers($context, true); $this->backToPrevScreen($context); } } else { $this->saveAnswers($context); } } $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages'])); $this->component->arResult['languages'] = $availableLanguages; $groupLink = false; $this->hiddenQuestionsData = array(); // скрытые вопросы, которые могут быть отображены при определенных ответах на другие вопросы с той же страницы $this->getQuestions($context, $availableLanguages); $translator = new \Ecoplay\Model\Translation($this->registry->getDbConnect(), $availableLanguages[$this->langID]['abbr'], $_SERVER["DOCUMENT_ROOT"] . '/lang/', $this->registry); $this->component->arResult['translator'] = $translator; $projectViewSettings = $context['project']['param_lk'] ? (array) json_decode($context['project']['~param_lk']) : array(); $this->component->arResult['projectViewSettings'] = $projectViewSettings; // проверяем статус группового ключа $memberName = $this->member['name'] . ' ' . $this->member['surname']; $this->component->arResult["disable_breadcrumbs"] = false; if ($this->member['stat2_group_keyID']) { if ($groupKey['status'] == \Ecoplay\Helper\Db\TestsHelper::GROUP_KEY_STATUS_DISABLED) { $context['APPLICATION']->IncludeComponent("ecoplay:front.header", '', array('TRANSLATOR' => $translator, 'MODE' => 'blank', 'MEMEBER_KEY' => null, 'SETTINGS' => $projectViewSettings, 'ADDON_CSS' => isset($this->session['myCSS_path']) ? $this->session['myCSS_path'] : ($context['project']['myCSS_path'] ? $context['project']['myCSS_path'] : ''), 'TEXT' => '')); $this->component->IncludeComponentTemplate('linear/disabled', '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); $context['APPLICATION']->IncludeComponent("ecoplay:front.footer", '', array('TRANSLATOR' => $translator, 'SETTINGS' => $projectViewSettings)); $this->registry->getDbConnect()->Commit(); die; } // для перехода по ключу всегда скрываем крошки $this->component->arResult["disable_breadcrumbs"] = true; /*if (!$groupKey['is_registration_available']) { $memberName = 'Опрос'; }*/ } // получаем инфу о вопросах $this->component->arResult["groupLink"] = $groupLink; $this->component->arResult["memberName"] = $memberName; $context['APPLICATION']->IncludeComponent("ecoplay:front.header", '', array('TRANSLATOR' => $translator, 'MODE' => 'blank', 'MEMEBER_KEY' => $this->member['private_lk_access_key'], 'SETTINGS' => array_merge($projectViewSettings, array('name' => $memberName)), 'ADDON_CSS' => isset($this->session['myCSS_path']) ? $this->session['myCSS_path'] : ($context['project']['myCSS_path'] ? $context['project']['myCSS_path'] : ''), 'TEXT' => '')); if (!$this->finished) { // вывод бланка $this->component->arResult["BlankDataSource"] =& $this->BlankDataSource; $this->component->arResult["pagination_info"] = $this->paginationInfo; $this->component->arResult["blank_view_type"] = $this->component->arParams['MODE']; $this->component->arResult['have_hidden'] = count($this->hiddenQuestionsData['controllIDs']) ? true : false; $this->component->IncludeComponentTemplate("linear/before", '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); # 1. ГРУППИРУЕМ вопросы на блоки $this->groupQuestions($context); if ($this->haveRealBlock) { $this->component->IncludeComponentTemplate("block_script", '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); } # 2. ВЫВОДИМ вопросы $this->showQuestions($context, 0, $availableLanguages); // токен для формы, чтобы точно знать что обрабатываем $token = md5(uniqid(rand(), true)); $_SESSION['form_token'] = $token; $this->component->arResult['token'] = $token; // buttons at the end $this->component->IncludeComponentTemplate('linear/after', '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); } else { // завершение сеанса $this->registry->getModel('Blanks')->finishLinearSeance($context['seance']); // кидаем событие завершения бланка, возможно кто-то слушает $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); $eventListener->executeEvent('PollLinear_BlankCompleted', array('respondentID' => $context['seance']['respondentID']), true); $this->component->IncludeComponentTemplate("linear/success", '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); } $context['APPLICATION']->IncludeComponent("ecoplay:front.footer", '', array('TRANSLATOR' => $translator, 'SETTINGS' => $projectViewSettings)); $this->registry->getDbConnect()->Commit(); } catch (\Exception $e) { $this->component->arResult['error'] = $e->getMessage(); $this->component->IncludeComponentTemplate("error", '/bitrix/components/ecoplay/behavior.blank.viewer/templates/.default'); } }
public function execute($context) { $context['APPLICATION']->AddHeadScript('/js/forms.js'); $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js'); $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css'); $this->component->arResult['canSelectRespondents'] = $context['project']['allow_assess_to_select_respondents']; $this->component->arResult['canSelectAssess'] = $context['project']['allow_respondent_to_select_assess']; // проверка прав доступа к разделу if (!$this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'members', $context['project']['projectID'])) { $this->registry->getModel('Auth')->restrict(); } $this->component->arResult['canImport'] = $this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'imports', $context['project']['projectID']); $availableSessionsIDs = $this->registry->getModel('Auth')->getAvailableSessions($_SESSION['accesses'], $context['project']['projectID']); $viewHelper = new \Ecoplay\View\Helper(); if (count($availableSessionsIDs)) { $userSessions = $this->registry->getDbHelper('ProjectsHelper')->getUserAvailableSessionsByProjectID($context['project']['projectID'], $availableSessionsIDs); $this->component->arResult['jsessions'] = json_encode($userSessions); $this->component->arResult['sessions'] = $userSessions; $selectedIDs = array(); $statuses = $this->registry->getDbHelper('MembersHelper')->getAssessStatusesNames(); $sorts = array('assessID' => 'assessID', 'name' => 'name', 'surname' => 'surname', 'email' => 'email', 'position' => 'position', 'private_lk_access_key' => 'private_lk_access_key', 'respondents' => 'respondents', 'report' => 'report', 'sessionID' => 'sessionID', 'status' => 'status'); if (isset($_GET['sort']) && array_key_exists($_GET['sort'], $sorts)) { $sort = $_GET['sort']; } else { $sort = 'assessID'; } $order = isset($_GET['order']) && in_array($_GET['order'], array('asc', 'desc')) ? $_GET['order'] : 'asc'; $filterQueryString = DataFilter::getFilterQueryString($_GET); $this->component->arResult['filterQueryString'] = $filterQueryString; $reportsStates = array(\Ecoplay\Helper\Db\MembersHelper::ASSESS_REPORT_STATE_EMPTY => 'Нет данных', \Ecoplay\Helper\Db\MembersHelper::ASSESS_REPORT_STATE_NOT_READY => 'Отчёт строить нельзя', \Ecoplay\Helper\Db\MembersHelper::ASSESS_REPORT_STATE_MINIMAL => 'Не полностью заполнено, но можно строить отчёт', \Ecoplay\Helper\Db\MembersHelper::ASSESS_REPORT_STATE_FULL => 'Заполнено на 100%'); $this->component->arResult['reportsStates'] = $reportsStates; // настройки фильтров для данных $filters = array(0 => array('title' => 'Имя', 'name' => 'name', 'type' => 'text', 'data_type' => 'string', 'field' => 'pm.`name`'), 1 => array('title' => 'Фамилия', 'name' => 'surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'pm.`surname`'), 2 => array('title' => 'ID', 'name' => 'id', 'type' => 'text', 'data_type' => 'number', 'field' => 'a.`assessID`'), 3 => array('title' => 'Текст', 'name' => 'text', 'type' => 'text', 'data_type' => 'string', 'field' => array('pm.`search_text`')), 4 => array('title' => 'Группа ', 'name' => 'session_id', 'type' => 'select', 'data_type' => 'number', 'field' => 'a.`sessionID`', 'values' => array(0 => 'Любая') + $userSessions), 5 => array('title' => 'Респондентов', 'name' => 'respondents', 'type' => 'range', 'data_type' => 'number', 'field' => '`respondents`'), 6 => array('title' => 'Статус ', 'name' => 'status', 'type' => 'select', 'data_type' => 'string', 'field' => 'a.`status`', 'values' => array(0 => 'Любой') + $statuses), 7 => array('title' => 'Утверждено ', 'name' => 'direct_viewed', 'type' => 'select', 'data_type' => 'number', 'field' => 'a.`viewed_by_direct_head`', 'values' => array(-1 => '-', 0 => 'Нет', 1 => 'Да'), 'explicit' => 1), 8 => array('title' => 'Отчеты ', 'name' => 'report_state', 'type' => 'select', 'data_type' => 'string', 'field' => 'a.`report_state`', 'values' => array(0 => 'Не учитывать') + $reportsStates)); $filterData = array('FILTERS' => $filters, 'BASE_URL' => '/projects/' . $context['project']['projectID'] . '/groups/assess/', 'SORT' => $sort, 'ORDER' => $order); // проверяем, введен ли фильтр $filterValue = DataFilter::getFilterValue($filters, $_GET, $this->registry->getDbConnect()); if ($filterValue['valid']) { $filterData = array_merge($filterData, $filterValue); } // компонент отображения фильтра $context['APPLICATION']->IncludeComponent('ecoplay:data.filter', '', $filterData); $cnt = $this->registry->getDbHelper('MembersHelper')->getAssessCountByProjectIDAndSessionsIds($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']); $onPage = 100; $pagesCnt = ceil($cnt / $onPage); $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1; // обрабатываем статусы опрашиваемых if (isset($_POST['assess_ids'])) { if (isset($_POST['all']) && $_POST['all']) { $selectedIDs = $this->registry->getDbHelper('MembersHelper')->getAssessIdsByProjectIDAndSessionsIds($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']); } else { $selectedIDs = $_POST['assess_ids']; } $assesses = $this->registry->getDbHelper('MembersHelper')->getAssessByIDs($selectedIDs); $newStatus = ''; $needLog = true; if (isset($_POST['mode']) && $_POST['mode'] == 'report') { // переводим в отчеты $assessData = array('status' => \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_COMPLETE); if ($context['project']['auto_send_report_email']) { $assessData['last_report_email'] = '0000-00-00 00:00:00'; } else { $assessData['last_report_email'] = date('d-m-Y H:i:s'); } $this->registry->getDbHelper('MembersHelper')->editSeveralAssess($selectedIDs, $assessData); //$this->registry->getDbHelper('MembersHelper')->changeAssessesStatus($selectedIDs, Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_COMPLETE); $newStatus = \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_COMPLETE; $this->component->arResult['statusSuccess'] = 'Оцениваемые переведены в статус отчета'; } elseif (isset($_POST['mode']) && $_POST['mode'] == 'activate') { // проверяем, чтобы у сессий оцениваемых был задан бланк! $sessions = $this->registry->getDbHelper('MembersHelper')->getAssessSessions($selectedIDs); $emptySession = false; foreach ($sessions as $session) { if (!$session['blankID']) { $emptySession = $session['name']; break; } } if (!$emptySession) { $this->registry->getDbHelper('MembersHelper')->changeAssessesStatus($selectedIDs, \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_ASSESS); $this->component->arResult['statusSuccess'] = 'Оцениваемые переведены в статус опроса'; $newStatus = \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_ASSESS; } else { $this->component->arResult['statusError'] = 'Для группы "' . $emptySession . '" не задан бланк!'; } } elseif (isset($_POST['mode']) && $_POST['mode'] == 'select_respondents' && $context['project']['allow_assess_to_select_respondents']) { $this->registry->getDbHelper('MembersHelper')->changeAssessesStatus($selectedIDs, \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_RESPONDENTS); $newStatus = \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_RESPONDENTS; $this->component->arResult['statusSuccess'] = 'Оцениваемые переведены в статус выбора респондента'; } elseif (isset($_POST['mode']) && $_POST['mode'] == 'select_assess' && $context['project']['allow_respondent_to_select_assess']) { $this->registry->getDbHelper('MembersHelper')->changeAssessesStatus($selectedIDs, \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_ASSESS); $newStatus = \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_ASSESS; $this->component->arResult['statusSuccess'] = 'Оцениваемые переведены в статус выбора оцениваемых'; } elseif (isset($_POST['mode']) && $_POST['mode'] == 'new') { $this->registry->getDbHelper('MembersHelper')->changeAssessesStatus($selectedIDs, \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_NEW); $newStatus = \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_NEW; $this->component->arResult['statusSuccess'] = 'Оцениваемые переведены в статус "Новый"'; } elseif (isset($_POST['mode']) && $_POST['mode'] == 'email') { // рассылка напоминалок респондентам if ($context['project']['freeze_email']) { $this->component->arResult['statusError'] = 'Невозможно отправить напоминания, так как проект заблокирован на рассылку почты'; } else { $emailedAssessIDs = array(); $fillingEmailedAssessIDs = array(); foreach ($assesses as $assess) { if ($assess['status'] == \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_ASSESS) { $fillingEmailedAssessIDs[] = $assess['assessID']; } elseif ($assess['status'] == \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_RESPONDENTS) { if ($assess['last_select_respondents_email'] != '0000-00-00 00:00:00') { $emailedAssessIDs[] = $assess['assessID']; } } elseif ($assess['status'] == \Ecoplay\Helper\Db\MembersHelper::ASSESS_STATUS_SELECT_ASSESS) { if ($assess['last_select_assess_email'] != '0000-00-00 00:00:00') { $emailedAssessIDs[] = $assess['assessID']; } } } if (count($emailedAssessIDs)) { $this->registry->getDbHelper('MembersHelper')->editSeveralAssess($emailedAssessIDs, array('need_remind' => 1)); $this->registry->getModel('ActionsLogger')->logMultiSimple($context['USER']->GetID(), 'assess', $emailedAssessIDs, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_NOTIFY); } if (count($fillingEmailedAssessIDs)) { $emailedRespondents = $this->registry->getDbHelper('MembersHelper')->getRespondentsForAssessNotification($context['project']['projectID'], $fillingEmailedAssessIDs); if ($emailedRespondents) { $emailedRespondentsIDs = array(); foreach ($emailedRespondents as $respondent) { $emailedRespondentsIDs[] = $respondent['respondentID']; } $this->registry->getDbHelper('MembersHelper')->editRespondents($emailedRespondentsIDs, array('need_remind' => 1)); $this->registry->getModel('ActionsLogger')->logMultiSimple($context['USER']->GetID(), 'respondent', $emailedRespondentsIDs, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_NOTIFY); } } $this->component->arResult['statusSuccess'] = 'Оцениваемые поставлены в очередь для email - напоминания'; } } elseif (isset($_POST['mode']) && $_POST['mode'] == 'report_email') { // выслать уведомления о получении отчетов $this->registry->getDbHelper('MembersHelper')->editSeveralAssess($selectedIDs, array('last_report_email' => '0000-00-00 00:00:00')); $this->component->arResult['statusSuccess'] = 'Оцениваемым будут высланы уведомления о получении отчета'; } elseif (isset($_POST['mode']) && $_POST['mode'] == 'report_zip') { // задача на архив отчетов // Создаем задачу $taskID = $this->registry->getDbHelper('TasksHelper')->addTask(array('name' => '', 'type' => \Ecoplay\Helper\Db\TasksHelper::TASK_TYPE_REPORT_ZIP, 'params' => json_encode(array('projectID' => $context['project']['projectID'], 'assessIDs' => $selectedIDs)), 'userID' => $context['USER']->GetID(), 'status' => \Ecoplay\Helper\Db\TasksHelper::TASK_STATUS_NEW, 'dt_created' => date('d-m-Y H:i:s'))); $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'task', $taskID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null); $this->component->arResult['statusSuccess'] = 'Генерация архива отчетов поставлена в очередь. Он будет доступен <a href="/projects/' . $context['project']['projectID'] . '/reportsArchives/">тут</a>'; } $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/'); if (isset($this->component->arResult['statusSuccess']) && $this->component->arResult['statusSuccess']) { foreach ($assesses as $assess) { if ($newStatus) { $eventListener->executeEvent('Poll360_AssessStatusChanged', array('assessID' => $assess['assessID'], 'status_old' => $assess['status'], 'status_new' => $newStatus)); } if ($needLog) { $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'assess', $assess['assessID'], LogsHelper::ACTION_TYPE_CHANGE, $assess); } } } } $this->component->arResult['selectedIDs'] = $selectedIDs; $assess = $this->registry->getDbHelper('MembersHelper')->getAssessByProjectIDAndSessionsIdsPaged($context['project']['projectID'], $availableSessionsIDs, $page, $onPage, $sorts[$sort], $order, $filterValue['filter_strings']); $this->component->arResult['assess'] = $assess; $this->component->arResult['statuses'] = $statuses; // кол-во email нотификаций для оцениваемого $emailsCnt = array(); $editsAbility = array(); if (count($assess)) { $assessIDs = array(); foreach ($assess as $oneAssess) { $assessIDs[] = $oneAssess['assessID']; } $emailsCnt = $this->registry->getDbHelper('MembersHelper')->getRespondentsForAssessNotificationCnt($context['project']['projectID'], $assessIDs); // чек, можно ли оцениваемому сменить группу $editsAbility = $this->registry->getDbHelper('MembersHelper')->getAssessEditsAbiliy($context['project']['projectID'], $assessIDs); } $this->component->arResult['emailsCnt'] = $emailsCnt; $this->component->arResult['editsAbility'] = $editsAbility; if (isset($_GET['checkAll'])) { $selectedIDs = array(); foreach ($assess as $oneAssess) { $selectedIDs[] = $oneAssess['assessID']; } $this->component->arResult['selectedIDs'] = $selectedIDs; } $this->component->arResult['sort'] = $sort; $this->component->arResult['order'] = $order; $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0; $roles = $this->registry->getDbHelper('ProjectsHelper')->getProjectRoles($context['project']['projectID']); $this->component->arResult['roles'] = $roles; // выводим таблицу с данными $this->component->IncludeComponentTemplate('table'); $navResult = new \CDBResult(); $navResult->NavPageCount = ceil($cnt / $onPage); $navResult->NavPageNomer = $page; $navResult->NavNum = 1; $navResult->NavPageSize = $onPage; $navResult->NavRecordCount = $cnt; $navResult->nPageWindow = 11; $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/groups/assess/', 'NAV_QUERY_STRING' => 'sort=' . $sort . '&order=' . $order . ($filterQueryString ? '&' . $filterQueryString : '') . (isset($_GET['checkAll']) ? '&checkAll=1' : ''))); $sessions = $this->registry->getDbHelper('ProjectsHelper')->getSessionsByIDs(array_keys($userSessions)); $sessionRoles = array(); foreach ($sessions as $session) { if ($session['param_roles']) { $sessionParams = (array) json_decode($session['~param_roles']); foreach ($sessionParams as $roleID => $param) { if (!array_key_exists($roleID, $sessionRoles)) { $sessionRoles[$roleID] = $param; } else { if ($param->min < $sessionRoles[$roleID]->min) { $sessionRoles[$roleID]->min = $param->min; } if ($param->max > $sessionRoles[$roleID]->max) { $sessionRoles[$roleID]->max = $param->max; } } } } } $this->component->arResult['sessionsRoles'] = $sessionRoles; } else { $this->component->arResult['assess'] = null; } $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Оцениваемые'); $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('link' => '/projects/' . $context['project']['projectID'] . '/settings/groups/', 'title' => 'Группы оцениваемых'), 4 => array('title' => 'Оцениваемые')))); $this->component->arResult['canReports'] = $this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'reports', $context['project']['projectID']); $this->component->IncludeComponentTemplate(); }