/**
  * 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;
 }