/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ public function createModel($detailed, $action) { // $model = new \Gems_Model_JoinModel('resptrack', 'gems__respondent2track'); $model->addTable('gems__respondent2org', array('gr2t_id_user' => 'gr2o_id_user', 'gr2t_id_organization' => 'gr2o_id_organization')); $model->addTable('gems__tracks', array('gr2t_id_track' => 'gtr_id_track')); $model->addTable('gems__reception_codes', array('gr2t_reception_code' => 'grc_id_reception_code')); $model->addFilter(array('grc_success' => 1)); $model->resetOrder(); $model->set('gr2o_patient_nr', 'label', $this->_('Respondent nr')); $model->set('gr2t_start_date', 'label', $this->_('Start date'), 'dateFormat', 'dd-MM-yyyy'); $model->set('gr2t_end_date', 'label', $this->_('End date'), 'dateFormat', 'dd-MM-yyyy'); $filter = $this->getSearchFilter($action !== 'export'); if (!(isset($filter['gr2t_id_organization']) && $filter['gr2t_id_organization'])) { $model->addFilter(array('gr2t_id_organization' => $this->currentUser->getRespondentOrgFilter())); } if (!(isset($filter['gr2t_id_track']) && $filter['gr2t_id_track'])) { $model->setFilter(array('1=0')); $this->autofilterParameters['onEmpty'] = $this->_('No track selected...'); return $model; } // Add the period filter - if any if ($where = \Gems_Snippets_AutosearchFormSnippet::getPeriodFilter($filter, $this->db)) { $model->addFilter(array($where)); } $trackId = $filter['gr2t_id_track']; $engine = $this->loader->getTracker()->getTrackEngine($trackId); $engine->addFieldsToModel($model, false); return $model; }
/** * Hook that loads the form data from $_POST or the model * * Or from whatever other source you specify here. */ protected function loadFormData() { if (!$this->formData) { parent::loadFormData(); $model = $this->getModel(); $roles = $model->get('ggp_role', 'multiOptions'); $userRoles = $this->currentUser->getAllowedRoles(); // \MUtil_Echo::track($userRoles, $roles); // Make sure we get the roles as they are labeled foreach ($roles as $role => $label) { if (!isset($userRoles[$role])) { unset($roles[$role]); } } if ($this->formData['ggp_role'] && !isset($roles[$this->formData['ggp_role']])) { if ($this->createData) { $this->formData['ggp_role'] = reset($roles); } else { $this->addMessage($this->_('You do not have sufficient privilege to edit this group.')); $this->afterSaveRouteUrl = array($this->request->getActionKey() => 'show'); $this->resetRoute = false; return; } } $model->set('ggp_role', 'multiOptions', $roles); $this->menu->getParameterSource()->offsetSet('ggp_role', $this->formData['ggp_role']); } }
/** * Switch the active organization */ public function changeUiAction() { $request = $this->getRequest(); $orgId = urldecode($request->getParam('org')); $oldOrg = $this->currentUser->getCurrentOrganizationId(); $origUrl = base64_decode($request->getParam('current_uri')); $allowedOrganizations = $this->currentUser->getAllowedOrganizations(); if (isset($allowedOrganizations[$orgId])) { $this->currentUser->setCurrentOrganization($orgId); if ($origUrl) { // Check for organisation id in url, but not when a patient id is stated if (strpos($origUrl, '/' . \MUtil_Model::REQUEST_ID1 . '/') === false) { foreach ($this->currentUser->possibleOrgIds as $key) { $finds[] = '/' . $key . '/' . $oldOrg; $replaces[] = '/' . $key . '/' . $orgId; } $correctUrl = str_replace($finds, $replaces, $origUrl); } else { $correctUrl = $origUrl; } // \MUtil_Echo::track($origUrl, $correctUrl); $this->getResponse()->setRedirect($correctUrl); } else { $this->currentUser->gotoStartPage($this->menu, $request); } return; } throw new \Gems_Exception($this->_('Inaccessible or unknown organization'), 403, null, sprintf($this->_('Access to this page is not allowed for current role: %s.'), $this->currentUser->getRole())); }
/** * Returns true if and only if $value meets the validation requirements * * If $value fails validation, then this method returns false, and * getMessages() will return an array of messages that explain why the * validation failed. * * @param mixed $value * @param mixed $content * @return boolean * @throws \Zend_Validate_Exception If validation of $value is impossible */ public function isValid($value, $context = array()) { $this->_report = $this->_user->reportPasswordWeakness($value); foreach ($this->_report as &$report) { $report = ucfirst($report) . '.'; } // \MUtil_Echo::track($value, $this->_report); return !(bool) $this->_report; }
/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ public function createModel($detailed, $action) { $model = new \Gems_Model_JoinModel('resptrack', 'gems__respondent2track'); $model->addTable('gems__respondent2org', array('gr2t_id_user' => 'gr2o_id_user', 'gr2t_id_organization' => 'gr2o_id_organization')); $model->addTable('gems__tracks', array('gr2t_id_track' => 'gtr_id_track')); $model->addTable('gems__reception_codes', array('gr2t_reception_code' => 'grc_id_reception_code')); $model->addFilter(array('grc_success' => 1)); $model->resetOrder(); $model->set('gr2o_patient_nr', 'label', $this->_('Respondent nr')); $model->set('gr2t_start_date', 'label', $this->_('Start date'), 'dateFormat', 'dd-MM-yyyy'); $model->set('gr2t_end_date', 'label', $this->_('End date'), 'dateFormat', 'dd-MM-yyyy'); $filter = $this->getSearchFilter($action !== 'export'); if (!(isset($filter['gr2t_id_organization']) && $filter['gr2t_id_organization'])) { $model->addFilter(array('gr2t_id_organization' => $this->currentUser->getRespondentOrgFilter())); } if (!(isset($filter['gr2t_id_track']) && $filter['gr2t_id_track'])) { $model->setFilter(array('1=0')); $this->autofilterParameters['onEmpty'] = $this->_('No track selected...'); return $model; } // Add the period filter - if any if ($where = \Gems_Snippets_AutosearchFormSnippet::getPeriodFilter($filter, $this->db)) { $model->addFilter(array($where)); } $select = $this->db->select(); $select->from('gems__rounds', array('gro_id_round', 'gro_id_order', 'gro_round_description', 'gro_icon_file'))->joinInner('gems__surveys', 'gro_id_survey = gsu_id_survey', array('gsu_survey_name'))->where('gro_id_track = ?', $filter['gr2t_id_track'])->order('gro_id_order'); if (isset($filter['gsu_id_primary_group']) && $filter['gsu_id_primary_group']) { $select->where('gsu_id_primary_group = ?', $filter['gsu_id_primary_group']); } $data = $this->db->fetchAll($select); if (!$data) { return $model; } $status = $this->util->getTokenData()->getStatusExpression(); $select = $this->db->select(); $select->from('gems__tokens', array('gto_id_respondent_track', 'gto_id_round', 'gto_id_token', 'status' => $status))->joinInner('gems__reception_codes', 'gto_reception_code = grc_id_reception_code', array())->where('gto_id_track = ?', $filter['gr2t_id_track'])->order('grc_success')->order('gto_id_respondent_track')->order('gto_round_order'); // \MUtil_Echo::track($this->db->fetchAll($select)); $newModel = new \MUtil_Model_SelectModel($select, 'tok'); $newModel->setKeys(array('gto_id_respondent_track')); $transformer = new \MUtil_Model_Transform_CrossTabTransformer(); $transformer->addCrosstabField('gto_id_round', 'status', 'stat_')->addCrosstabField('gto_id_round', 'gto_id_token', 'tok_'); foreach ($data as $row) { $name = 'stat_' . $row['gro_id_round']; $transformer->set($name, 'label', \MUtil_Lazy::call('substr', $row['gsu_survey_name'], 0, 2), 'description', sprintf("%s\n[%s]", $row['gsu_survey_name'], $row['gro_round_description']), 'noSort', true, 'round', $row['gro_round_description'], 'roundIcon', $row['gro_icon_file']); $transformer->set('tok_' . $row['gro_id_round']); } $newModel->addTransformer($transformer); // \MUtil_Echo::track($data); $joinTrans = new \MUtil_Model_Transform_JoinTransformer(); $joinTrans->addModel($newModel, array('gr2t_id_respondent_track' => 'gto_id_respondent_track')); $model->resetOrder(); $model->set('gr2o_patient_nr'); $model->set('gr2t_start_date'); $model->addTransformer($joinTrans); return $model; }
/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ protected function createModel($detailed, $action) { // Make sure the user is loaded $user = $this->getSelectedUser(); if ($user) { if (!($this->currentUser->hasPrivilege('pr.staff.see.all') || $this->currentUser->isAllowedOrganization($user->getBaseOrganizationId()))) { throw new \Gems_Exception($this->_('No access to page'), 403, null, sprintf($this->_('You have no right to access users from the organization %s.'), $user->getBaseOrganization()->getName())); } } return parent::createModel($detailed, $action); }
/** * Should handle execution of the task, taking as much (optional) parameters as needed * * The parameters should be optional and failing to provide them should be handled by * the task */ public function execute() { $batch = $this->getBatch(); $import = $batch->getVariable('import'); if (!(isset($import['trackId']) && $import['trackId'])) { // Do nothing return; } $tracker = $this->loader->getTracker(); $trackEngine = $tracker->getTrackEngine($import['trackId']); $trackEngine->updateRoundCount($this->currentUser->getUserLoginId()); }
public function getHtmlOutput(\Zend_View_Abstract $view) { $html = $this->getHtmlSequence(); $html->h1($this->_('Respondent report')); $table = $html->table(array('class' => 'browser')); $table->th($this->_('Report information'), array('colspan' => 2)); $table->tr()->th($this->_('Generated by'))->td($this->currentUser->getFullName()); $table->tr()->th($this->_('Generated on'))->td(new \Zend_Date()); $table->tr()->th($this->_('Organization'))->td($this->currentOrganization->getName()); $html->br(); return $html; }
/** * Process the respondent and return true when data has changed. * * The event has to handle the actual storage of the changes. * * @param \Gems_Tracker_Respondent $respondent * @param int $userId The current user * @return boolean True when something changed */ public function processChangedRespondent(\Gems_Tracker_Respondent $respondent) { $changes = 0; $tracker = $this->loader->getTracker(); $respTracks = $tracker->getRespondentTracks($respondent->getId(), $respondent->getOrganizationId()); $userId = $this->currentUser->getUserId(); foreach ($respTracks as $respondentTrack) { if ($respondentTrack instanceof \Gems_Tracker_RespondentTrack) { $changes += $respondentTrack->checkTrackTokens($userId); } } // \MUtil_Echo::track('Hi there! ' . $changes); return (bool) $changes; }
/** * Returns a text element for autosearch. Can be overruled. * * The form / html elements to search on. Elements can be grouped by inserting null's between them. * That creates a distinct group of elements * * @param array $data The $form field values (can be usefull, but no need to set them) * @return array Of \Zend_Form_Element's or static tekst to add to the html or null for group breaks. */ protected function getAutoSearchElements(array $data) { $elements = parent::getAutoSearchElements($data); $orgs = $this->currentUser->getRespondentOrganizations(); if (count($orgs) > 1) { $elements[] = $this->_createSelectElement('gap_id_organization', $orgs, $this->_('(all organizations)')); } $locations = $this->loader->getAgenda()->getLocations(); if (count($locations) > 1) { $elements[] = $this->_createSelectElement('gap_id_location', $locations, $this->_('(all locations)')); } $elements[] = null; $this->_addPeriodSelectors($elements, 'gap_admission_time'); return $elements; }
/** * Check the tokens for all surveys */ public function checkAllAction() { $batch = $this->loader->getTracker()->recalculateTokens('surveyCheckAll', $this->currentUser->getUserId()); $title = $this->_('Checking for all surveys for answers .'); $this->_helper->BatchRunner($batch, $title, $this->accesslog); $this->addSnippet('Survey\\CheckAnswersInformation', 'itemDescription', $this->_('This task checks all tokens for all surveys for answers.')); }
/** * Add a staff browse edit page to the menu, * * @param string $label * @param array $other * @return \Gems_Menu_SubMenuItem */ public function addStaffPage($label, array $other = array()) { if ($this->user->hasPrivilege('pr.staff.edit.all')) { $filter = array_keys($this->escort->getUtil()->getDbLookup()->getOrganizations()); } else { $filter = array_keys($this->user->getAllowedOrganizations()); } $page = $this->addPage($label, 'pr.staff', 'staff', 'index', $other); $page->addAutofilterAction(); $createPage = $page->addCreateAction(); $showPage = $page->addShowAction(); $pages[] = $showPage->addEditAction(); $pages[] = $showPage->addAction($this->_('Reset password'), 'pr.staff.edit', 'reset')->setModelParameters(1)->addParameterFilter('gsf_active', 1); $showPage->addAction($this->_('Send Mail'), 'pr.staff.edit', 'mail')->setModelParameters(1)->addParameterFilter('can_mail', 1, 'gsf_active', 1, 'gsf_id_organization', $filter); $pages = $pages + $showPage->addDeReactivateAction('gsf_active', 1, 0); // LOG CONTROLLER $logPage = $showPage->addPage($this->_('Activity overview'), 'pr.staff-log', 'staff-log', 'index')->setModelParameters(1)->addParameterFilter('gsf_id_organization', $filter); $logPage->addAutofilterAction(); $logPage->addShowAction()->setModelParameters(1)->addNamedParameters('log', 'gla_id'); $page->addExportAction(); $page->addImportAction(); if (!$this->user->hasPrivilege('pr.staff.edit.all')) { foreach ($pages as $sub_page) { $sub_page->addParameterFilter('gsf_id_organization', $filter, 'accessible_role', 1); } } return $page; }
/** * Perform automatic job mail */ public function commJob() { $batch = $this->loader->getTaskRunnerBatch('cron'); $batch->minimalStepDurationMs = 3000; // 3 seconds max before sending feedback $batch->autoStart = true; if (!$batch->isLoaded()) { // Check for unprocessed tokens $tracker = $this->loader->getTracker(); $tracker->processCompletedTokens(null, $this->currentUser->getUserId()); $batch->addTask('Mail\\AddAllMailJobsTask'); } $title = $this->_('Executing cron jobs'); $this->_helper->BatchRunner($batch, $title, $this->accesslog); $this->html->br(); }
/** * Overrule this function for any activities you want to take place * after the form has successfully been validated, but before any * buttons are processed. * * @param int $step The current step */ protected function afterFormValidationFor($step) { if (3 == $step) { $import = $this->loadImportData(); $model = $this->getModel(); $saves = array(); foreach ($model->getCol('exportCode') as $name => $exportCode) { if (isset($this->formData[$name]) && $this->formData[$name]) { $saves[] = array('gsu_id_survey' => $this->formData[$name], 'gsu_export_code' => $exportCode); $import['surveyCodes'][$exportCode] = $this->formData[$name]; } } if ($saves) { $sModel = new \MUtil_Model_TableModel('gems__surveys'); \Gems_Model::setChangeFieldsByPrefix($sModel, 'gus', $this->currentUser->getUserId()); $sModel->saveAll($saves); $count = $sModel->getChanged(); if ($count == 0) { $this->addMessage($this->_('No export code changed')); } else { $this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array('surveys')); $this->addMessage(sprintf($this->plural('%d export code changed', '%d export codes changed', $count), $count)); } } } }
/** * The place to check if the data set in the snippet is valid * to generate the snippet. * * When invalid data should result in an error, you can throw it * here but you can also perform the check in the * checkRegistryRequestsAnswers() function from the * {@see \MUtil_Registry_TargetInterface}. * * @return boolean */ public function hasHtmlOutput() { $model = $this->getModel(); $data = $model->loadFirst(); $roles = $this->currentUser->getAllowedRoles(); //\MUtil_Echo::track($data); // Perform access check here, before anything has happened!!! if (isset($data['ggp_role']) && !isset($roles[$data['ggp_role']])) { $this->addMessage($this->_('You do not have sufficient privilege to edit this group.')); $this->afterSaveRouteUrl = array($this->request->getActionKey() => 'show'); $this->resetRoute = false; return false; } $this->menu->getParameterSource()->offsetSet('ggp_role', $data['ggp_role']); return parent::hasHtmlOutput(); }
/** * Hook containing the actual save code. * * Call's afterSave() for user interaction. * * @see afterSave() */ protected function saveData() { $model = $this->getModel(); $userId = $this->currentUser->getUserId(); $tokenData = array(); $copyFields = array('gto_id_round', 'gto_valid_from', 'gto_valid_from_manual', 'gto_valid_until', 'gto_valid_until_manual', 'gto_comment', 'gto_id_relationfield'); foreach ($copyFields as $name) { if (array_key_exists($name, $this->formData)) { if ($model->hasOnSave($name)) { $tokenData[$name] = $model->getOnSave($this->formData[$name], $this->createData, $name, $this->formData); } elseif ('' === $this->formData[$name]) { $tokenData[$name] = null; } else { $tokenData[$name] = $this->formData[$name]; } } else { $tokenData[$name] = null; } } $rounds = $model->get('gto_round_order', 'multiOptions'); $tokenData['gto_id_round'] = '0'; $tokenData['gto_round_order'] = $this->formData['gto_round_order']; $tokenData['gto_round_description'] = $rounds[$this->formData['gto_round_order']]; $surveyId = $this->formData['gto_id_survey']; $this->token = $this->respondentTrack->addSurveyToTrack($surveyId, $tokenData, $userId); $changed = 1; // Communicate with the user $this->afterSave($changed); }
/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ protected function createModel($detailed, $action) { $dbLookup = $this->util->getDbLookup(); $dbTracks = $this->util->getTrackData(); $translated = $this->util->getTranslated(); $empty = $translated->getEmptyDropdownArray(); $unselected = array('' => ''); $model = new \MUtil_Model_TableModel('gems__comm_jobs'); \Gems_Model::setChangeFieldsByPrefix($model, 'gcj'); $model->set('gcj_id_message', 'label', $this->_('Template'), 'multiOptions', $unselected + $dbLookup->getCommTemplates('token')); $model->set('gcj_id_user_as', 'label', $this->_('By staff member'), 'multiOptions', $unselected + $dbLookup->getActiveStaff(), 'default', $this->currentUser->getUserId(), 'description', $this->_('Used for logging and possibly from address.')); $model->set('gcj_active', 'label', $this->_('Active'), 'multiOptions', $translated->getYesNo(), 'elementClass', 'Checkbox', 'required', true, 'description', $this->_('Job is only run when active.')); $fromMethods = $unselected + $this->getBulkMailFromOptions(); $model->set('gcj_from_method', 'label', $this->_('From address used'), 'multiOptions', $fromMethods); if ($detailed) { $model->set('gcj_from_fixed', 'label', $this->_('From other'), 'description', sprintf($this->_("Only when '%s' is '%s'."), $model->get('gcj_from_method', 'label'), end($fromMethods))); } $model->set('gcj_process_method', 'label', $this->_('Processing Method'), 'default', 'O', 'multiOptions', $translated->getBulkMailProcessOptions()); $model->set('gcj_filter_mode', 'label', $this->_('Filter for'), 'multiOptions', $unselected + $this->getBulkMailFilterOptions()); // If you really want to see this information in the overview, uncomment for the shorter labels // $model->set('gcj_filter_days_between', 'label', $this->_('Interval'), 'validators[]', 'Digits'); // $model->set('gcj_filter_max_reminders','label', $this->_('Max'), 'validators[]', 'Digits'); $model->set('gcj_id_track', 'label', $this->_('Track'), 'multiOptions', $empty + $dbTracks->getAllTracks()); $defaultRounds = $empty + $this->db->fetchPairs('SELECT gro_round_description, gro_round_description FROM gems__rounds WHERE gro_round_description IS NOT NULL AND gro_round_description != "" GROUP BY gro_round_description'); $model->set('gcj_round_description', 'label', $this->_('Round'), 'multiOptions', $defaultRounds, 'variableSelect', array('source' => 'gcj_id_track', 'baseQuery' => $this->roundDescriptionQuery, 'ajax' => array('controller' => 'comm-job', 'action' => 'roundselect'), 'firstValue' => $empty, 'defaultValues' => $defaultRounds)); $model->set('gcj_id_survey', 'label', $this->_('Survey'), 'multiOptions', $empty + $dbTracks->getAllSurveys()); if ($detailed) { $model->set('gcj_filter_days_between', 'label', $this->_('Days between reminders'), 'description', $this->_('1 day means the reminder is send the next day'), 'validators[]', 'Digits'); $model->set('gcj_filter_max_reminders', 'label', $this->_('Maximum reminders'), 'description', $this->_('1 means only one reminder will be send'), 'validators[]', 'Digits'); $model->set('gcj_id_organization', 'label', $this->_('Organization'), 'multiOptions', $empty + $dbLookup->getOrganizations()); } return $model; }
/** * Go directly to url */ public function toSurveyAction() { if (!$this->_initToken()) { // Default option $this->_forward('index'); return; } $language = $this->locale->getLanguage(); try { $url = $this->token->getUrl($language, $this->currentUser->getUserId() ? $this->currentUser->getUserId() : $this->token->getRespondentId()); /************************ * Optional user logout * ************************/ if ($this->currentUser->isLogoutOnSurvey()) { $this->currentUser->unsetAsCurrentUser(); } // Redirect at once header('Location: ' . $url); exit; } catch (\Gems_Tracker_Source_SurveyNotFoundException $e) { $this->addMessage(sprintf($this->_('The survey for token %s is no longer active.'), strtoupper($this->tokenId))); // Default option $this->_forward('index'); } }
/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ public function createModel($detailed, $action) { $filter = $this->getSearchFilter($action !== 'export'); // Return empty model when no track sel;ected if (!(isset($filter['gtf_id_track']) && $filter['gtf_id_track'])) { $model = new \Gems_Model_JoinModel('trackfields', 'gems__track_fields'); $model->set('gtf_field_name', 'label', $this->_('Name')); $model->setFilter(array('1=0')); $this->autofilterParameters['onEmpty'] = $this->_('No track selected...'); return $model; } $this->trackId = $filter['gtf_id_track']; $tracker = $this->loader->getTracker(); $this->engine = $tracker->getTrackEngine($this->trackId); $orgs = $this->currentUser->getRespondentOrgFilter(); $this->orgWhere = " AND gr2t_id_organization IN (" . implode(", ", $orgs) . ")"; $sql = "SELECT COUNT(*)\n FROM gems__respondent2track INNER JOIN gems__reception_codes ON gr2t_reception_code = grc_id_reception_code\n WHERE gr2t_id_track = ? AND grc_success = 1" . $this->orgWhere; $this->trackCount = $this->db->fetchOne($sql, $this->trackId); $model = $this->engine->getFieldsMaintenanceModel(); //$model->setFilter($filter); // $model->addColumn(new \Zend_Db_Expr($trackCount), 'trackcount'); // $model->addColumn(new \Zend_Db_Expr("(SELECT COUNT())"), 'fillcount'); $model->set('trackcount', 'label', $this->_('Tracks')); $model->setOnLoad('trackcount', $this->trackCount); $model->set('fillcount', 'label', $this->_('Filled')); $model->setOnLoad('fillcount', array($this, 'fillCount')); $model->set('emptycount', 'label', $this->_('Empty')); $model->setOnLoad('emptycount', array($this, 'emptyCount')); $model->set('valuecount', 'label', $this->_('Unique values')); $model->setOnLoad('valuecount', array($this, 'valueCount')); return $model; }
public function showAction() { $orgId = $this->_getParam(\MUtil_Model::REQUEST_ID2); $patientNr = $this->_getParam(\MUtil_Model::REQUEST_ID1); $respId = $this->util->getDbLookup()->getRespondentId($patientNr, $orgId); $userId = $this->currentUser->getUserId(); // Updated gr20_opened $this->openedRespondent($patientNr, $orgId, $respId); // Check for completed tokens $this->loader->getTracker()->processCompletedTokens($respId, $userId, $orgId); $model = $this->getModel(); $model->applyRequest($this->getRequest(), true); $data = $model->loadFirst(); if (!isset($data['grs_id_user'])) { $this->addMessage(sprintf($this->_('Unknown %s requested'), $this->getTopic())); $this->_reroute(array('action' => 'index')); return; } $params['model'] = $model; $params['baseUrl'] = array(\MUtil_Model::REQUEST_ID1 => $this->_getParam(\MUtil_Model::REQUEST_ID1), \MUtil_Model::REQUEST_ID2 => $this->_getParam(\MUtil_Model::REQUEST_ID2)); $params['buttons'] = $this->createMenuLinks(); $params['onclick'] = $this->findAllowedMenuItem('edit'); if ($params['onclick']) { $params['onclick'] = $params['onclick']->toHRefAttribute($this->getRequest()); } $params['respondentData'] = $data; $this->addSnippets($this->showSnippets, $params); }
/** * If the current user is the system user, present a message and don't allow to edit * * @return boolean */ public function hasHtmlOutput() { if ($this->currentUser->getUserId() == \Gems_User_UserLoader::SYSTEM_USER_ID) { $this->addMessage($this->getNotAllowedMessage()); return false; } return parent::hasHtmlOutput(); }
/** * The place to check if the data set in the snippet is valid * to generate the snippet. * * When invalid data should result in an error, you can throw it * here but you can also perform the check in the * checkRegistryRequestsAnswers() function from the * {@see \MUtil_Registry_TargetInterface}. * * @return boolean */ public function hasHtmlOutput() { if (!($this->user->hasAllowedRole() && $this->user->canSetPassword())) { $this->addMessage($this->getNotAllowedMessage()); return false; } return parent::hasHtmlOutput(); }
/** * Get the filter to use with the model for searching including model sorts, etc.. * * @param boolean $useRequest Use the request as source (when false, the session is used) * @return array or false */ public function getSearchFilter($useRequest = true) { $filter = parent::getSearchFilter($useRequest); if (!(isset($filter['gsf_id_organization']) && $filter['gsf_id_organization'])) { $filter['gsf_id_organization'] = array_keys($this->currentUser->getAllowedOrganizations()); } return $filter; }
/** * Overrule this function for any activities you want to take place * after the form has successfully been validated, but before any * buttons are processed. * * @param int $step The current step */ protected function afterFormValidationFor($step) { parent::afterFormValidationFor($step); if ($this->trackEngine) { if (4 == $step) { $import = $this->loadImportData(); $model = $this->getModel(); $saves = array(); $import['deactivateRounds'] = array(); foreach ($model->getCol('roundId') as $name => $roundId) { $round = $this->trackEngine->getRound($roundId); if (isset($this->formData[$name]) && $this->formData[$name] && $round instanceof Round) { switch ($this->formData[$name]) { case self::ROUND_DEACTIVATE: $import['deactivateRounds'][$roundId] = $round->getFullDescription(); break; case self::ROUND_LEAVE: if (isset($import['roundOrderToLine'][$round->getRoundOrder()])) { $lineNr = $import['roundOrderToLine'][$round->getRoundOrder()]; unset($import['rounds'][$lineNr]); } $import['roundOrders'][$round->getRoundOrder()] = $roundId; break; default: if (isset($import['roundOrderToLine'][$this->formData[$name]])) { $lineNr = $import['roundOrderToLine'][$this->formData[$name]]; $import['rounds'][$lineNr]['gro_id_round'] = $roundId; } $import['roundOrders'][$this->formData[$name]] = $roundId; break; } } } } } elseif (3 == $step) { $import = $this->loadImportData(); $model = $this->getModel(); $saves = array(); foreach ($model->getCol('exportCode') as $name => $exportCode) { if (isset($this->formData[$name]) && $this->formData[$name]) { $saves[] = array('gsu_id_survey' => $this->formData[$name], 'gsu_export_code' => $exportCode); $import['surveyCodes'][$exportCode] = $this->formData[$name]; } } if ($saves) { $sModel = new \MUtil_Model_TableModel('gems__surveys'); \Gems_Model::setChangeFieldsByPrefix($sModel, 'gus', $this->currentUser->getUserId()); $sModel->saveAll($saves); $count = $sModel->getChanged(); if ($count == 0) { $this->addMessage($this->_('No export code changed')); } else { $this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array('surveys')); $this->addMessage(sprintf($this->plural('%d export code changed', '%d export codes changed', $count), $count)); } } } }
/** * The file name to use for final storage, minus the extension * * @param string $controller Name of controller (or other id) * @return string */ public function getLongtermFileName($controller) { $date = new \MUtil_Date(); $name[] = $controller; $name[] = $date->toString('YYYY-MM-ddTHH-mm-ss'); $name[] = preg_replace('/[^a-zA-Z0-9_]/', '', $this->currentUser->getLoginName()); $name[] = $this->getOrganizationCode(); return implode('.', array_filter($name)); }
/** * Synchronize survey status for the surveys in all sources */ public function synchronizeAllAction() { $batch = $this->loader->getTracker()->synchronizeSources(null, $this->currentUser->getUserId()); $batch->minimalStepDurationMs = 3000; $title = $this->_('Synchronize all sources.'); $this->_helper->batchRunner($batch, $title, $this->accesslog); $this->html->actionLink(array('action' => 'index'), $this->_('Cancel'), array('class' => 'btn-danger')); $this->addSynchronizationInformation(); }
/** * Action for checking all assigned rounds for a single track using a batch */ public function recalcFieldsAction() { $id = $this->_getIdParam(); $track = $this->getTrackEngine(); $where = $this->db->quoteInto('gr2t_id_track = ?', $id); $batch = $this->loader->getTracker()->recalcTrackFields('trackRecalcFields' . $id, $this->currentUser->getUserId(), $where); $title = sprintf($this->_("Recalculating fields for track '%s'."), $track->getTrackName(), $this->accesslog); $this->_helper->BatchRunner($batch, $title, $this->accesslog); $this->addRecalcInformation(); }
/** * The password should not contain the name of the user or the login name. * * @param mixed $parameter * @param string $password */ protected function notTheName($parameter, $password) { $on = $parameter != 0; if ($on) { $lpwd = strtolower($password); if (false !== strpos($lpwd, strtolower($this->user->getLoginName())) || null === $password) { $this->_addError($this->translate->_('should not contain your login name')); } } }
/** * Action for checking all assigned rounds for a single track using a batch */ public function checkTrackAction() { $id = $this->_getIdParam(); $track = $this->getTrackEngine(); $where = $this->db->quoteInto('gr2t_id_track = ?', $id); $batch = $this->loader->getTracker()->checkTrackRounds('trackCheckRounds' . $id, $this->currentUser->getUserId(), $where); $title = sprintf($this->_("Checking round assignments for track '%s'."), $track->getTrackName()); $this->_helper->BatchRunner($batch, $title, $this->accesslog); $this->addSnippet('Track\\CheckRoundsInformation'); }
/** * Creates a model for getModel(). Called only for each new $action. * * The parameters allow you to easily adapt the model to the current action. The $detailed * parameter was added, because the most common use of action is a split between detailed * and summarized actions. * * @param boolean $detailed True when the current action is not in $summarizedActions. * @param string $action The current action. * @return \MUtil_Model_ModelAbstract */ protected function createModel($detailed, $action) { // Export all if ('excel' === $action) { $detailed = true; } if ($detailed) { $year = $this->_('Year'); $month = $this->_('Month'); $fields[$year] = new \Zend_Db_Expr("YEAR(gr2o_created)"); $fields[$month] = new \Zend_Db_Expr("MONTH(gr2o_created)"); } $consents = $this->util->getDbLookup()->getUserConsents(); $deleteds = array('' => '') + $this->util->getReceptionCodeLibrary()->getRespondentDeletionCodes(); $sql = "SUM(CASE WHEN grc_success = 1 AND gr2o_consent = '%s' THEN 1 ELSE 0 END)"; foreach ($consents as $consent => $translated) { $fields[$translated] = new \Zend_Db_Expr(sprintf($sql, $consent)); } $fields[$this->_('Total OK')] = new \Zend_Db_Expr("SUM(CASE WHEN grc_success = 1 THEN 1 ELSE 0 END)"); $sql = "SUM(CASE WHEN gr2o_reception_code = '%s' THEN 1 ELSE 0 END)"; foreach ($deleteds as $code => $translated) { $fields[$translated] = new \Zend_Db_Expr(sprintf($sql, $code)); } $fields[$this->_('Dropped')] = new \Zend_Db_Expr("SUM(CASE WHEN grc_success = 0 THEN 1 ELSE 0 END)"); $fields[$this->_('Total')] = new \Zend_Db_Expr("COUNT(*)"); $select = $this->db->select(); $select->from('gems__respondent2org', $fields)->joinInner('gems__reception_codes', 'gr2o_reception_code = grc_id_reception_code', array())->joinInner('gems__organizations', 'gr2o_id_organization = gor_id_organization', array('gor_name', 'gor_id_organization')); $select->group(array('gor_name', 'gor_id_organization')); if ($detailed) { $select->group(array($fields[$year], $fields[$month])); } $model = new \MUtil_Model_SelectModel($select, 'consent-plan'); $model->setKeys(array('gor_id_organization')); $model->resetOrder(); $model->set('gor_name', 'label', $this->_('Organization')); foreach ($fields as $field => $expr) { $model->set($field, 'label', $field, 'tdClass', 'rightAlign', 'thClass', 'rightAlign'); } foreach ($deleteds as $code => $translated) { $model->set($translated, 'tdClass', 'rightAlign smallTime', 'thClass', 'rightAlign smallTime'); } foreach (array($this->_('Total OK'), $this->_('Dropped'), $this->_('Total')) as $name) { $model->set($name, 'itemDisplay', \MUtil_Html::create('strong'), 'tableHeaderDisplay', \MUtil_Html::create('em'), 'tdClass', 'rightAlign selectedColumn', 'thClass', 'rightAlign selectedColumn'); } if ($detailed) { $model->set($month, 'formatFunction', $this->util->getLocalized()->getMonthName); } // Only show organisations the user is allowed to see $allowed = $this->currentUser->getAllowedOrganizations(); $model->setFilter(array('gr2o_id_organization' => array_keys($allowed))); // \MUtil_Model::$verbose = true; return $model; }