/** * 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())); }
/** * 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; }
/** * 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; }
/** * 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; }
/** * Stores the fields that can be used for sorting or filtering in the * sort / filter objects attached to this model. * * @param array $parameters * @param boolean $includeNumericFilters When true numeric filter keys (0, 1, 2...) are added to the filter as well * @return array The $parameters minus the sort & textsearch keys */ public function applyParameters(array $parameters, $includeNumericFilters = false) { if ($parameters) { // Allow use when passed only an ID value if (isset($parameters[\MUtil_Model::REQUEST_ID]) && !isset($parameters[\MUtil_Model::REQUEST_ID1], $parameters[\MUtil_Model::REQUEST_ID2])) { $id = $parameters[\MUtil_Model::REQUEST_ID]; $keys = $this->getKeys(); $field = array_shift($keys); $parameters[$field] = $id; if ($field2 = array_shift($keys)) { $parameters[$field2] = $this->getCurrentOrganization(); \MUtil_Echo::r('Still using old HiddenModel parameters.', 'DEPRECIATION WARNING'); \MUtil_Echo::r($parameters); } unset($parameters[\MUtil_Model::REQUEST_ID]); } if (isset($parameters[\MUtil_Model::REQUEST_ID2]) && !array_key_exists($parameters[\MUtil_Model::REQUEST_ID2], $this->currentUser->getAllowedOrganizations())) { $this->initTranslateable(); 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())); } return parent::applyParameters($parameters, $includeNumericFilters); } return array(); }
/** * Loads and checks the request parameters * * @throws \Gems_Exception */ protected function loadParams() { $patientNr = $this->_getParam(\MUtil_Model::REQUEST_ID1); $this->appointmentId = $this->_getParam(\Gems_Model::APPOINTMENT_ID); if ($this->appointmentId) { $select = $this->db->select(); $select->from('gems__appointments', array('gap_id_user', 'gap_id_organization'))->joinInner('gems__respondent2org', 'gap_id_user = gr2o_id_user AND gap_id_organization = gr2o_id_organization', array('gr2o_patient_nr'))->where('gap_id_appointment = ?', $this->appointmentId); $data = $this->db->fetchRow($select); if ($data) { $this->organizationId = $data['gap_id_organization']; $this->respondentId = $data['gap_id_user']; $patientNr = $data['gr2o_patient_nr']; } } else { $this->organizationId = $this->_getParam(\MUtil_Model::REQUEST_ID2); if ($patientNr && $this->organizationId) { $this->respondentId = $this->util->getDbLookup()->getRespondentId($patientNr, $this->organizationId); } } if (!$this->respondentId) { throw new \Gems_Exception($this->_('Requested agenda data not available!')); } else { $orgs = $this->currentUser->getAllowedOrganizations(); if (!isset($orgs[$this->organizationId])) { $org = $this->loader->getOrganization($this->organizationId); if ($org->exists()) { throw new \Gems_Exception(sprintf($this->_('You have no access to %s appointments!'), $org->getName())); } else { throw new \Gems_Exception($this->_('Organization does not exist.')); } } } $source = $this->menu->getParameterSource(); if ($this->appointmentId) { $source->setAppointmentId($this->appointmentId); } if ($patientNr && $this->organizationId) { $source->setPatient($patientNr, $this->organizationId); } }
/** * Exports a single respondent * * @param string $respondentId */ protected function _exportRespondent($respondentId) { $respondentModel = $this->loader->getModels()->getRespondentModel(false); //Insert orgId when set if (is_array($respondentId) && isset($respondentId['gr2o_id_organization'])) { $filter['gr2o_id_organization'] = $respondentId['gr2o_id_organization']; $respondentId = $respondentId['gr2o_patient_nr']; } else { // Or accept to find in current organization // $filter['gr2o_id_organization'] = $this->currentUser->getCurrentOrganizationId(); // Or use any allowed organization? $filter['gr2o_id_organization'] = array_keys($this->currentUser->getAllowedOrganizations()); } $filter['gr2o_patient_nr'] = $respondentId; $respondentModel->setFilter($filter); $respondentData = $respondentModel->loadFirst(); $this->html->snippet($this->_respondentSnippet, 'model', $respondentModel, 'data', $respondentData, 'respondentId', $respondentId); $tracker = $this->loader->getTracker(); $tracks = $tracker->getRespondentTracks($respondentData['gr2o_id_user'], $respondentData['gr2o_id_organization']); foreach ($tracks as $trackId => $track) { $this->_exportTrack($track); } }
/** * Get the model to export * @param array $filter Filter for the model * @param array $data Data from the form options * @return \MUtil_Model_ModelAbstract */ public function getModel($filter = array(), $data = array()) { if ($filter !== $this->filter || !$this->model) { $this->filter = $filter; $surveyId = $filter['gto_id_survey']; $language = $this->locale->getLanguage(); $survey = $this->loader->getTracker()->getSurvey($surveyId); $model = $survey->getAnswerModel($language); $questions = $survey->getQuestionList($language); foreach ($questions as $questionName => $label) { if ($parent = $model->get($questionName, 'parent_question')) { if ($model->get($parent, 'type') === \MUtil_Model::TYPE_NOVALUE) { $model->remove($parent, 'label'); $model->set($questionName, 'label', $label); } } } $prefixes = array(); $prefixes['A'] = array_keys($questions); $source = $survey->getSource(); $attributes = $source->getAttributes(); foreach ($attributes as $attribute) { $model->set($attribute, 'label', $attribute); } if (!$model->checkJoinExists('gems__respondent2track.gr2t_id_respondent_track', 'gems__tokens.gto_id_respondent_track')) { $model->addTable('gems__respondent2track', array('gems__respondent2track.gr2t_id_respondent_track' => 'gems__tokens.gto_id_respondent_track'), 'gr2t'); } if (!$model->checkJoinExists('gems__tracks.gtr_id_track', 'gems__tokens.gto_id_track')) { $model->addTable('gems__tracks', array('gems__tracks.gtr_id_track' => 'gems__tokens.gto_id_track'), 'gtr'); } $model->set('respondentid', 'label', $this->_('Respondent ID'), 'type', \MUtil_Model::TYPE_NUMERIC); $model->set('organizationid', 'label', $this->_('Organization'), 'type', \MUtil_Model::TYPE_NUMERIC, 'multiOptions', $this->currentUser->getAllowedOrganizations()); // Add Consent $model->set('consentcode', 'label', $this->_('Consent'), 'type', \MUtil_Model::TYPE_STRING); $model->set('resptrackid', 'label', $this->_('Respondent track ID'), 'type', \MUtil_Model::TYPE_NUMERIC); $model->set('gto_round_description', 'label', $this->_('Round description')); $model->set('gtr_track_name', 'label', $this->_('Track name')); $model->set('gr2t_track_info', 'label', $this->_('Track description')); $model->set('submitdate', 'label', $this->_('Submit date')); $model->set('startdate', 'label', $this->_('Start date')); $model->set('datestamp', 'label', $this->_('Datestamp')); $model->set('gto_valid_from', 'label', $this->_('Valid from')); $model->set('gto_valid_until', 'label', $this->_('Valid until')); $model->set('startlanguage', 'label', $this->_('Start language')); $model->set('lastpage', 'label', $this->_('Last page')); $model->set('gto_id_token', 'label', $this->_('Token')); $prefixes['D'] = array_diff($model->getItemNames(), $prefixes['A']); if (isset($data['tid_fields']) && $data['tid_fields'] == 1) { $trackId = $filter['gto_id_track']; $engine = $this->loader->getTracker()->getTrackEngine($trackId); $engine->addFieldsToModel($model, false, 'gto_id_respondent_track'); $prefixes['TF'] = array_diff($model->getItemNames(), $prefixes['A'], $prefixes['D']); } if (isset($data['column_identifiers']) && $data['column_identifiers'] == 1) { foreach ($prefixes as $prefix => $prefixCategory) { foreach ($prefixCategory as $columnName) { if ($label = $model->get($columnName, 'label')) { $model->set($columnName, 'label', '(' . $prefix . ') ' . $label); } } } } $this->model = $model; } return $this->model; }
/** * Get the model to export * @param array $filter Filter for the model * @param array $data Data from the form options * @return \MUtil_Model_ModelAbstract */ public function getModel($filter = array(), $data = array()) { if ($filter !== $this->filter || !$this->model) { $this->filter = $filter; $surveyId = $filter['gto_id_survey']; $language = $this->locale->getLanguage(); $survey = $this->loader->getTracker()->getSurvey($surveyId); $model = $survey->getAnswerModel($language); $source = $survey->getSource(); $questions = $source->getFullQuestionList($language, $surveyId, $survey->getSourceSurveyId()); foreach ($questions as $questionName => $label) { if ($parent = $model->get($questionName, 'parent_question')) { if ($model->get($parent, 'type') === \MUtil_Model::TYPE_NOVALUE) { if (isset($data['prefix_child']) && $data['prefix_child'] == 1) { $cleanLabel = strip_tags($label); $model->set($questionName, 'label', $cleanLabel); } if (isset($data['show_parent']) && $data['show_parent'] == 1) { $model->remove($parent, 'label'); } } } if ($question = $model->get($questionName, 'survey_question') && $model->get($questionName, 'label') == null) { $model->set($questionName, 'label', $questionName); } } // Set labels in the main model for the submodel fields if ($model->getMeta('nested', false)) { $nestedNames = $model->getMeta('nestedNames'); foreach ($nestedNames as $nestedName) { $nestedModel = $model->get($nestedName, 'model'); $nestedLabels = $nestedModel->getcolNames('label'); foreach ($nestedLabels as $colName) { $label = $nestedModel->get($colName, 'label'); $model->set($colName, 'label', $label); } $model->remove($nestedName, 'label'); } } $prefixes = array(); $prefixes['A'] = array_keys($questions); $attributes = $source->getAttributes(); foreach ($attributes as $attribute) { $model->set($attribute, 'label', $attribute); } if (!$model->checkJoinExists('gems__respondent2org.gr2o_id_user', 'gems__tokens.gto_id_respondent')) { $model->addTable('gems__respondent2org', array('gems__respondent2org.gr2o_id_user' => 'gems__tokens.gto_id_respondent', 'gems__respondent2org.gr2o_id_organization' => 'gems__tokens.gto_id_organization'), 'gr2o'); } if (!$model->checkJoinExists('gems__respondent2track.gr2t_id_respondent_track', 'gems__tokens.gto_id_respondent_track')) { $model->addTable('gems__respondent2track', array('gems__respondent2track.gr2t_id_respondent_track' => 'gems__tokens.gto_id_respondent_track'), 'gr2t'); } if (!$model->checkJoinExists('gems__tracks.gtr_id_track', 'gems__tokens.gto_id_track')) { $model->addTable('gems__tracks', array('gems__tracks.gtr_id_track' => 'gems__tokens.gto_id_track'), 'gtr'); } if (!$model->checkJoinExists('gems__consents.gco_description', 'gems__respondent2org.gr2o_consent')) { $model->addTable('gems__consents', array('gems__consents.gco_description' => 'gems__respondent2org.gr2o_consent'), 'gco'); } $model->set('respondentid', 'label', $this->_('Respondent ID'), 'type', \MUtil_Model::TYPE_NUMERIC); $model->set('organizationid', 'label', $this->_('Organization'), 'type', \MUtil_Model::TYPE_NUMERIC, 'multiOptions', $this->currentUser->getAllowedOrganizations()); // Add Consent $model->set('consentcode', 'label', $this->_('Consent'), 'type', \MUtil_Model::TYPE_STRING); $model->set('resptrackid', 'label', $this->_('Respondent track ID'), 'type', \MUtil_Model::TYPE_NUMERIC); $model->set('gto_round_description', 'label', $this->_('Round description')); $model->set('gtr_track_name', 'label', $this->_('Track name')); $model->set('gr2t_track_info', 'label', $this->_('Track description')); $model->set('submitdate', 'label', $this->_('Submit date')); $model->set('startdate', 'label', $this->_('Start date')); $model->set('datestamp', 'label', $this->_('Datestamp')); $model->set('gto_valid_from', 'label', $this->_('Valid from')); $model->set('gto_valid_until', 'label', $this->_('Valid until')); $model->set('startlanguage', 'label', $this->_('Start language')); $model->set('lastpage', 'label', $this->_('Last page')); $model->set('gto_id_token', 'label', $this->_('Token')); $prefixes['D'] = array_diff($model->getItemNames(), $prefixes['A']); if (isset($data['gto_id_track']) && $data['gto_id_track'] && isset($data['add_track_fields']) && $data['add_track_fields'] == 1) { $trackId = $filter['gto_id_track']; $engine = $this->loader->getTracker()->getTrackEngine($trackId); $engine->addFieldsToModel($model, false, 'gto_id_respondent_track'); // Add relation fields $model->set('gto_id_relation', 'label', $this->_('Relation ID'), 'type', \MUtil_Model::TYPE_NUMERIC); $model->set('gtf_field_name', 'label', $this->_('Relation'), 'type', \MUtil_Model::TYPE_STRING); $prefixes['TF'] = array_diff($model->getItemNames(), $prefixes['A'], $prefixes['D']); } if (isset($data['column_identifiers']) && $data['column_identifiers'] == 1) { foreach ($prefixes as $prefix => $prefixCategory) { foreach ($prefixCategory as $columnName) { if ($label = $model->get($columnName, 'label')) { $model->set($columnName, 'label', '(' . $prefix . ') ' . $label); } } } } $this->model = $model; // Exclude external fields from sorting foreach ($this->model->getItemsUsed() as $item) { if (!$this->model->get($item, 'table', 'column_expression')) { $this->model->set($item, 'noSort', true); } } } return $this->model; }