/**
  * 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)
 {
     $rcLib = $this->util->getReceptionCodeLibrary();
     $yesNo = $this->util->getTranslated()->getYesNo();
     $model = new \MUtil_Model_TableModel('gems__reception_codes');
     $model->copyKeys();
     // The user can edit the keys.
     $model->set('grc_id_reception_code', 'label', $this->_('Code'), 'size', '10');
     $model->set('grc_description', 'label', $this->_('Description'), 'size', '30');
     $model->set('grc_success', 'label', $this->_('Is success code'), 'multiOptions', $yesNo, 'elementClass', 'CheckBox', 'description', $this->_('This reception code is a success code.'));
     $model->set('grc_active', 'label', $this->_('Active'), 'multiOptions', $yesNo, 'elementClass', 'CheckBox', 'description', $this->_('Only active codes can be selected.'));
     if ($detailed) {
         $model->set('desc1', 'elementClass', 'Html', 'label', ' ', 'value', \MUtil_Html::create('h4', $this->_('Can be assigned to')));
     }
     $model->set('grc_for_respondents', 'label', $this->_('Respondents'), 'multiOptions', $yesNo, 'elementClass', 'CheckBox', 'description', $this->_('This reception code can be assigned to a respondent.'));
     $model->set('grc_for_tracks', 'label', $this->_('Tracks'), 'multiOptions', $yesNo, 'elementClass', 'CheckBox', 'description', $this->_('This reception code can be assigned to a track.'));
     $model->set('grc_for_surveys', 'label', $this->_('Tokens'), 'multiOptions', $rcLib->getSurveyApplicationValues(), 'description', $this->_('This reception code can be assigned to a token.'));
     if ($detailed) {
         $model->set('desc2', 'elementClass', 'Html', 'label', ' ', 'value', \MUtil_Html::create('h4', $this->_('Additional actions')));
     }
     $model->set('grc_redo_survey', 'label', $this->_('Redo survey'), 'multiOptions', $rcLib->getRedoValues(), 'description', $this->_('Redo a survey on this reception code.'));
     $model->set('grc_overwrite_answers', 'label', $this->_('Overwrite existing consents'), 'multiOptions', $yesNo, 'elementClass', 'CheckBox', 'description', $this->_('Remove the consent from already answered surveys.'));
     if ($detailed) {
         $model->set('grc_id_reception_code', 'validator', $model->createUniqueValidator('grc_id_reception_code'));
         $model->set('grc_description', 'validator', $model->createUniqueValidator('grc_description'));
     }
     if ($this->project->multiLocale) {
         $model->set('grc_description', 'description', 'ENGLISH please! Use translation file to translate.');
     }
     \Gems_Model::setChangeFieldsByPrefix($model, 'grc');
     return $model;
 }
 /**
  * Construct a track model
  */
 public function __construct()
 {
     parent::__construct('gems__tracks');
     $this->addColumn("CASE WHEN gtr_track_class = 'SingleSurveyEngine' THEN 'deleted' ELSE '' END", 'row_class');
     \Gems_Model::setChangeFieldsByPrefix($this, 'gtr');
     $this->set('gtr_date_start', 'default', new \Zend_Date());
 }
 /**
  * Constructor
  *
  * @param array|mixed $styles
  */
 public function __construct($styles = array())
 {
     parent::__construct('organization', 'gems__organizations', 'gor');
     $this->_styles = $styles;
     $this->setDeleteValues('gor_active', 0, 'gor_add_respondents', 0);
     $this->addColumn("CASE WHEN gor_active = 1 THEN '' ELSE 'deleted' END", 'row_class');
     \Gems_Model::setChangeFieldsByPrefix($this, 'gor');
 }
 /**
  * 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($surveyId = null, $questionId = null, $order = null)
 {
     $batch = $this->getBatch();
     $survey = $this->loader->getTracker()->getSurvey($surveyId);
     // Now save the questions
     $answerModel = $survey->getAnswerModel('en');
     $questionModel = new \MUtil_Model_TableModel('gems__survey_questions');
     \Gems_Model::setChangeFieldsByPrefix($questionModel, 'gsq');
     $label = $answerModel->get($questionId, 'label');
     /*
             if ($label instanceof \MUtil_Html_HtmlInterface) {
                 $label = $label->render($this->view);
             }
             // */
     $question['gsq_id_survey'] = $surveyId;
     $question['gsq_name'] = $questionId;
     $question['gsq_name_parent'] = $answerModel->get($questionId, 'parent_question');
     $question['gsq_order'] = $order;
     $question['gsq_type'] = $answerModel->getWithDefault($questionId, 'type', \MUtil_Model::TYPE_STRING);
     $question['gsq_class'] = $answerModel->get($questionId, 'thClass');
     $question['gsq_group'] = $answerModel->get($questionId, 'group');
     $question['gsq_label'] = $label;
     $question['gsq_description'] = $answerModel->get($questionId, 'description');
     // \MUtil_Echo::track($question);
     try {
         $questionModel->save($question);
     } catch (\Exception $e) {
         $batch->addMessage(sprintf($this->_('Save failed for survey %s, question %s: %s'), $survey->getName(), $questionId, $e->getMessage()));
     }
     $batch->addToCounter('checkedQuestions');
     if ($questionModel->getChanged()) {
         $batch->addToCounter('changedQuestions');
     }
     $batch->setMessage('questionschanged', sprintf($this->_('%d of %d questions changed.'), $batch->getCounter('changedQuestions'), $batch->getCounter('checkedQuestions')));
     $options = $answerModel->get($questionId, 'multiOptions');
     if ($options) {
         $optionModel = new \MUtil_Model_TableModel('gems__survey_question_options');
         \Gems_Model::setChangeFieldsByPrefix($optionModel, 'gsqo');
         $option['gsqo_id_survey'] = $surveyId;
         $option['gsqo_name'] = $questionId;
         $i = 0;
         // \MUtil_Echo::track($options);
         foreach ($options as $key => $label) {
             $option['gsqo_order'] = $i;
             $option['gsqo_key'] = $key;
             $option['gsqo_label'] = $label;
             try {
                 $optionModel->save($option);
             } catch (\Exception $e) {
                 $batch->addMessage(sprintf($this->_('Save failed for survey %s, question %s, option "%s" => "%s": %s'), $survey->getName(), $questionId, $key, $label, $e->getMessage()));
             }
             $i++;
         }
         $batch->addToCounter('checkedOptions', count($options));
         $batch->addToCounter('changedOptions', $optionModel->getChanged());
         $batch->setMessage('optionschanged', sprintf($this->_('%d of %d options changed.'), $batch->getCounter('changedOptions'), $batch->getCounter('checkedOptions')));
     }
 }
 /**
  * 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_order', 'label', $this->_('Order'), 'description', $this->_('Execution order of the communication jobs, lower numbers are executed first.'));
     if ($detailed) {
         $model->set('gcj_id_order', 'validator', $model->createUniqueValidator('gcj_id_order'));
         if ($action == 'create') {
             // Set the default round order
             $newOrder = $this->db->fetchOne("SELECT MAX(gcj_id_order) FROM gems__comm_jobs");
             if ($newOrder) {
                 $model->set('gcj_id_order', 'default', $newOrder + 10);
             }
         }
     }
     $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) {
         // Show other field only when last $fromMethod is select
         end($fromMethods);
         // Move array pointer to the end
         $lastKey = key($fromMethods);
         $switches = array($lastKey => array('gcj_from_fixed' => array('elementClass' => 'Text', 'label' => $this->_('From other'))));
         $model->addDependency(array('ValueSwitchDependency', $switches), 'gcj_from_method');
         $model->set('gcj_from_fixed', 'label', '', 'elementClass', 'Hidden');
     }
     $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 ($detailed) {
         // Only show reminder fields when needed
         $switches = array('R' => array('gcj_filter_days_between' => array('elementClass' => 'Text', 'label' => $this->_('Days between reminders')), 'gcj_filter_max_reminders' => array('elementClass' => 'Text', 'label' => $this->_('Maximum reminders'))));
         $model->addDependency(array('ValueSwitchDependency', $switches), 'gcj_filter_mode');
         $model->set('gcj_filter_days_between', 'label', '', 'elementClass', 'Hidden', 'description', $this->_('1 day means the reminder is send the next day'), 'validators[]', 'Digits');
         $model->set('gcj_filter_max_reminders', 'label', '', 'elementClass', 'Hidden', 'description', $this->_('1 means only one reminder will be send'), 'validators[]', 'Digits');
     }
     // 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(true));
     if ($detailed) {
         $model->set('gcj_id_organization', 'label', $this->_('Organization'), 'multiOptions', $empty + $dbLookup->getOrganizations());
     }
     return $model;
 }
 /**
  *
  * @param string $modelName Hopefully unique model name
  * @param string $modelField The name of the field used to store the sub model
  */
 public function __construct($modelName = 'fields_maintenance', $modelField = 'sub')
 {
     parent::__construct($modelName, $modelField);
     $modelF = new \MUtil_Model_TableModel('gems__respondent2track2field');
     \Gems_Model::setChangeFieldsByPrefix($modelF, 'gr2t2f');
     $this->addUnionModel($modelF, null, FieldMaintenanceModel::FIELDS_NAME);
     $modelA = new \MUtil_Model_TableModel('gems__respondent2track2appointment');
     \Gems_Model::setChangeFieldsByPrefix($modelA, 'gr2t2a');
     $mapBase = $modelA->getItemsOrdered();
     $map = array_combine($mapBase, str_replace('gr2t2a_', 'gr2t2f_', $mapBase));
     $map['gr2t2a_id_app_field'] = 'gr2t2f_id_field';
     $map['gr2t2a_id_appointment'] = 'gr2t2f_value';
     $this->addUnionModel($modelA, $map, FieldMaintenanceModel::APPOINTMENTS_NAME);
 }
    /**
     * 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)
    {
        $translated = $this->util->getTranslated();
        $model = new \MUtil_Model_TableModel('gems__agenda_activities');
        \Gems_Model::setChangeFieldsByPrefix($model, 'gaa');
        $model->setDeleteValues('gaa_active', 0);
        $model->set('gaa_name', 'label', $this->_('Activity'), 'description', $this->_('An activity is a high level description about an appointment:
e.g. consult, check-up, diet, operation, physiotherapy or other.'), 'required', true);
        $model->setIfExists('gaa_id_organization', 'label', $this->_('Organization'), 'description', $this->_('Optional, an import match with an organization has priority over those without.'), 'multiOptions', $translated->getEmptyDropdownArray() + $this->util->getDbLookup()->getOrganizations());
        $model->setIfExists('gaa_name_for_resp', 'label', $this->_('Respondent explanation'), 'description', $this->_('Alternative description to use with respondents.'));
        $model->setIfExists('gaa_match_to', 'label', $this->_('Import matches'), 'description', $this->_("Split multiple import matches using '|'."));
        $model->setIfExists('gaa_code', 'label', $this->_('Activity code'), 'size', 10, 'description', $this->_('Optional code name to link the activity to program code.'));
        $model->setIfExists('gaa_active', 'label', $this->_('Active'), 'description', $this->_('Inactive means assignable only through automatich processes.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
        $model->setIfExists('gaa_filter', 'label', $this->_('Filter'), 'description', $this->_('When checked appointments with these activities are not imported.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
        $model->addColumn("CASE WHEN gaa_active = 1 THEN '' ELSE 'deleted' END", 'row_class');
        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)
    {
        $translated = $this->util->getTranslated();
        $model = new \MUtil_Model_TableModel('gems__agenda_procedures');
        \Gems_Model::setChangeFieldsByPrefix($model, 'gapr');
        $model->setDeleteValues('gapr_active', 0);
        $model->set('gapr_name', 'label', $this->_('Activity'), 'description', $this->_('A procedure describes an appointments effects on a respondent:
e.g. an excercise, an explanantion, a massage, mindfullness, a (specific) operation, etc...'), 'required', true);
        $model->setIfExists('gapr_id_organization', 'label', $this->_('Organization'), 'description', $this->_('Optional, an import match with an organization has priority over those without.'), 'multiOptions', $translated->getEmptyDropdownArray() + $this->util->getDbLookup()->getOrganizations());
        $model->setIfExists('gapr_name_for_resp', 'label', $this->_('Respondent explanation'), 'description', $this->_('Alternative description to use with respondents.'));
        $model->setIfExists('gapr_match_to', 'label', $this->_('Import matches'), 'description', $this->_("Split multiple import matches using '|'."));
        $model->setIfExists('gapr_code', 'label', $this->_('Procedure code'), 'size', 10, 'description', $this->_('Optional code name to link the procedure to program code.'));
        $model->setIfExists('gapr_active', 'label', $this->_('Active'), 'description', $this->_('Inactive means assignable only through automatich processes.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
        $model->setIfExists('gapr_filter', 'label', $this->_('Filter'), 'description', $this->_('When checked appointments with these procedures are not imported.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
        $model->addColumn("CASE WHEN gapr_active = 1 THEN '' ELSE 'deleted' END", 'row_class');
        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)
 {
     $dblookup = $this->util->getDbLookup();
     $translated = $this->util->getTranslated();
     $model = new \MUtil_Model_TableModel('gems__agenda_staff');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gas');
     $model->setDeleteValues('gas_active', 0);
     $model->set('gas_name', 'label', $this->_('Name'), 'required', true);
     $model->set('gas_function', 'label', $this->_('Function'));
     $model->setIfExists('gas_id_organization', 'label', $this->_('Organization'), 'multiOptions', $dblookup->getOrganizations(), 'required', true);
     $model->setIfExists('gas_id_user', 'label', $this->_('GemsTracker user'), 'description', $this->_('Optional: link this health care provider to a GemsTracker Staff user.'), 'multiOptions', $translated->getEmptyDropdownArray() + $dblookup->getStaff());
     $model->setIfExists('gas_match_to', 'label', $this->_('Import matches'), 'description', $this->_("Split multiple import matches using '|'."));
     $model->setIfExists('gas_active', 'label', $this->_('Active'), 'description', $this->_('Inactive means assignable only through automatich processes.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
     $model->setIfExists('gas_filter', 'label', $this->_('Filter'), 'description', $this->_('When checked appointments with this staff member are not imported.'), 'elementClass', 'Checkbox', 'multiOptions', $translated->getYesNo());
     $model->addColumn("CASE WHEN gas_active = 1 THEN '' ELSE 'deleted' END", 'row_class');
     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
  */
 public function createModel($detailed, $action)
 {
     $model = new \MUtil_Model_TableModel('gems__groups');
     // Add id for excel export
     if ($action == 'export') {
         $model->set('ggp_id_group', 'label', 'id');
     }
     $model->set('ggp_name', 'label', $this->_('Name'), 'size', 15, 'minlength', 4, 'validator', $model->createUniqueValidator('ggp_name'));
     $model->set('ggp_description', 'label', $this->_('Description'), 'size', 40);
     $model->set('ggp_role', 'label', $this->_('Role'), 'multiOptions', $this->util->getDbLookup()->getRoles());
     $yesNo = $this->util->getTranslated()->getYesNo();
     $model->set('ggp_group_active', 'label', $this->_('Active'), 'multiOptions', $yesNo, 'elementClass', 'Checkbox');
     $model->set('ggp_staff_members', 'label', $this->_('Staff'), 'multiOptions', $yesNo, 'elementClass', 'Checkbox');
     $model->set('ggp_respondent_members', 'label', $this->_('Respondents'), 'multiOptions', $yesNo, 'elementClass', 'Checkbox');
     $model->set('ggp_allowed_ip_ranges', 'label', $this->_('Allowed IP Ranges'), 'description', $this->_('Separate with | example: 10.0.0.0-10.0.0.255 (subnet masks are not supported)'), 'size', 50, 'validator', new \Gems_Validate_IPRanges(), 'maxlength', 500);
     \Gems_Model::setChangeFieldsByPrefix($model, 'ggp');
     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
  */
 public function createModel($detailed, $action)
 {
     $model = new \MUtil_Model_TableModel('gems__mail_servers');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gms');
     // Key can be changed by users
     $model->copyKeys();
     $model->set('gms_from', 'label', $this->_('From address [part]'), 'size', 30, 'description', $this->_("E.g.: '%', '%.org' or '*****@*****.**' or '*****@*****.**'."));
     $model->set('gms_server', 'label', $this->_('Server'), 'size', 30);
     $model->set('gms_ssl', 'label', $this->_('Encryption'), 'required', false, 'multiOptions', array(\Gems_Mail::MAIL_NO_ENCRYPT => $this->_('None'), \Gems_Mail::MAIL_SSL => $this->_('SSL'), \Gems_Mail::MAIL_TLS => $this->_('TLS')));
     $model->set('gms_port', 'label', $this->_('Port'), 'required', true, 'description', $this->_('Normal values: 25 for TLS and no encryption, 465 for SSL'), 'validator', 'Digits');
     $model->set('gms_user', 'label', $this->_('User ID'), 'size', 20);
     if ($detailed) {
         $model->set('gms_password', 'label', $this->_('Password'), 'elementClass', 'Password', 'repeatLabel', $this->_('Repeat password'), 'description', $this->_('Enter only when changing'));
         $type = new \Gems_Model_Type_EncryptedField($this->project, true);
         $type->apply($model, 'gms_password', 'gms_encryption');
     }
     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
  */
 public function createModel($detailed, $action)
 {
     $model = new \MUtil_Model_TableModel('gems__consents');
     $model->copyKeys();
     // The user can edit the keys.
     $model->set('gco_description', 'label', $this->_('Description'), 'size', '10');
     $model->set('gco_order', 'label', $this->_('Order'), 'size', '10', 'description', $this->_('Determines order of presentation in interface.'), 'validator', 'Digits');
     $model->set('gco_code', 'label', $this->_('Consent code'), 'multiOptions', $this->util->getConsentTypes(), 'description', $this->_('Internal code, not visible to users, copied with the token information to the source.'));
     if ($detailed) {
         $model->set('gco_description', 'validator', $model->createUniqueValidator('gco_description'));
         $model->set('gco_order', 'validator', $model->createUniqueValidator('gco_order'));
     }
     if ($this->project->multiLocale) {
         $model->set('gco_description', 'description', 'ENGLISH please! Use translation file to translate.');
     }
     \Gems_Model::setChangeFieldsByPrefix($model, 'gco');
     return $model;
 }
 /**
  * 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));
             }
         }
     }
 }
 /**
  * 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;
 }
 /**
  *
  * @param string $modelName Hopefully unique model name
  * @param string $modelField The name of the field used to store the sub model
  */
 public function __construct($modelName = 'fields_maintenance', $modelField = 'sub')
 {
     parent::__construct($modelName, $modelField);
     $model = new \MUtil_Model_TableModel('gems__track_fields');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gtf');
     $this->addUnionModel($model, null, self::FIELDS_NAME);
     $model = new \MUtil_Model_TableModel('gems__track_appointments');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gtap');
     $map = $model->getItemsOrdered();
     $map = array_combine($map, str_replace('gtap_', 'gtf_', $map));
     $map['gtap_id_app_field'] = 'gtf_id_field';
     $this->addUnionModel($model, $map, self::APPOINTMENTS_NAME);
     $model->addColumn(new \Zend_Db_Expr("'appointment'"), 'gtf_field_type');
     $model->addColumn(new \Zend_Db_Expr("NULL"), 'gtf_field_values');
     $model->addColumn(new \Zend_Db_Expr("NULL"), 'gtf_calculate_using');
     $this->setKeys(array(\Gems_Model::FIELD_ID => 'gtf_id_field', \MUtil_Model::REQUEST_ID => 'gtf_id_track'));
     $this->setClearableKeys(array(\Gems_Model::FIELD_ID => 'gtf_id_field'));
     $this->setSort(array('gtf_id_order' => SORT_ASC));
 }
 /**
  * Return a password reset key
  *
  * @param \Gems_User_User $user The user to create a key for.
  * @return string
  */
 public function getPasswordResetKey(\Gems_User_User $user)
 {
     $model = new \MUtil_Model_TableModel('gems__staff');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gsf', $user->getUserId());
     $data['gsf_id_user'] = $user->getUserId();
     $row = $model->loadFirst($data + array('DATE_ADD(gsf_reset_req, INTERVAL ' . $this->hoursResetKeyIsValid . ' HOUR) >= CURRENT_TIMESTAMP'));
     if ($row && $row['gup_reset_key']) {
         // Keep using the key.
         $data['gsf_reset_key'] = $row['gsf_reset_key'];
     } else {
         $data['gsf_reset_key'] = $this->hashPassword(time() . $user->getEmailAddress());
     }
     $data['gsf_reset_req'] = new \MUtil_Db_Expr_CurrentTimestamp();
     // Loop for case when hash is not unique
     while (true) {
         try {
             $model->save($data);
             // Old staff keys can by recognized because they start with 'os'
             return 'os' . $data['gsf_reset_key'];
         } catch (\Zend_Db_Exception $zde) {
             $data['gsf_reset_key'] = $this->hashPassword(time() . $user->getEmailAddress());
         }
     }
 }
 /**
  * Set the password, if allowed for this user type.
  *
  * @param \Gems_User_User $user The user whose password to change
  * @param string $password
  * @return \Gems_User_UserDefinitionInterface (continuation pattern)
  */
 public function setPassword(\Gems_User_User $user, $password)
 {
     $data['gup_id_user'] = $user->getUserLoginId();
     $data['gup_reset_key'] = null;
     $data['gup_reset_requested'] = null;
     $data['gup_reset_required'] = 0;
     if (null === $password) {
         // Passwords may be emptied.
         $data['gup_password'] = null;
     } else {
         $data['gup_password'] = $this->hashPassword($password);
     }
     $data['gup_last_pwd_change'] = new \Zend_Db_Expr('CURRENT_TIMESTAMP');
     $model = new \MUtil_Model_TableModel('gems__user_passwords');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gup', $user->getUserId());
     $model->save($data);
     return $this;
 }
 /**
  * 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 \MUtil_Model_TableModel('gems__roles');
     $model->set('grl_name', 'label', $this->_('Name'), 'size', 15, 'minlength', 4);
     $model->set('grl_description', 'label', $this->_('Description'), 'size', 40);
     $model->set('grl_parents', 'label', $this->_('Parents'));
     $tpa = new \MUtil_Model_Type_ConcatenatedRow(',', ', ');
     $tpa->apply($model, 'grl_parents');
     $model->setOnLoad('grl_parents', array(\Gems_Roles::getInstance(), 'translateToRoleNames'));
     $model->set('grl_privileges', 'label', $this->_('Privileges'));
     $tpr = new \MUtil_Model_Type_ConcatenatedRow(',', '<br/>');
     $tpr->apply($model, 'grl_privileges');
     if ($detailed) {
         $model->set('grl_name', 'validators[unique]', $model->createUniqueValidator('grl_name'), 'validators[nomaster]', new \MUtil_Validate_IsNot('master', $this->_('The name "master" is reserved')));
         $model->set('grl_privileges', 'formatFunction', array($this, 'formatPrivileges'));
         if ('show' === $action) {
             $model->addColumn('grl_parents', 'inherited');
             $tpa->apply($model, 'inherited');
             $model->set('inherited', 'label', $this->_('Inherited privileges'), 'formatFunction', array($this, 'formatInherited'));
             $model->setOnLoad('inherited', array(\Gems_Roles::getInstance(), 'translateToRoleNames'));
             // Concatenated field, we can not use onload so handle transaltion to rolenames in the formatFunction
             $model->addColumn("CONCAT(COALESCE(grl_parents, ''), '\t', COALESCE(grl_privileges, ''))", 'not_allowed');
             $model->set('not_allowed', 'label', $this->_('Not allowed'), 'formatFunction', array($this, 'formatNotAllowed'));
         }
     } else {
         $model->set('grl_privileges', 'formatFunction', array($this, 'formatLongLine'));
     }
     \Gems_Model::setChangeFieldsByPrefix($model, 'grl');
     return $model;
 }
 /**
  * Find a procedure code for the name and organization.
  *
  * @param string $name The name to match against
  * @param int $organizationId Organization id
  * @param boolean $create Create a match when it does not exist
  * @return int or null
  */
 public function matchProcedure($name, $organizationId, $create = true)
 {
     $cacheId = __CLASS__ . '_' . __FUNCTION__;
     $matches = $this->cache->load($cacheId);
     if (!$matches) {
         $matches = array();
         $select = $this->db->select();
         $select->from('gems__agenda_procedures', array('gapr_id_procedure', 'gapr_match_to', 'gapr_id_organization', 'gapr_filter'));
         $result = $this->db->fetchAll($select);
         foreach ($result as $row) {
             if (null === $row['gapr_id_organization']) {
                 $key = 'null';
             } else {
                 $key = $row['gapr_id_organization'];
             }
             foreach (explode('|', $row['gapr_match_to']) as $match) {
                 $matches[$match][$key] = $row['gapr_filter'] ? false : $row['gapr_id_procedure'];
             }
         }
         $this->cache->save($matches, $cacheId, array('procedures'));
     }
     if (isset($matches[$name])) {
         if (isset($matches[$name][$organizationId])) {
             return $matches[$name][$organizationId];
         }
         if (isset($matches[$name]['null'])) {
             return $matches[$name]['null'];
         }
     }
     if (!$create) {
         return null;
     }
     $model = new \MUtil_Model_TableModel('gems__agenda_procedures');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gapr');
     $values = array('gapr_name' => $name, 'gapr_id_organization' => $organizationId, 'gapr_match_to' => $name, 'gapr_active' => 1, 'gapr_filter' => 0);
     $result = $model->save($values);
     $this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array('procedure', 'procedures'));
     return $result['gapr_id_procedure'];
 }
 /**
  * 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)
 {
     $tracker = $this->loader->getTracker();
     $model = new \MUtil_Model_TableModel('gems__sources');
     $model->set('gso_source_name', 'label', $this->_('Name'), 'description', $this->_('E.g. the name of the project - for single source projects.'), 'size', 15, 'minlength', 4, 'validator', $model->createUniqueValidator('gso_source_name'));
     $model->set('gso_ls_url', 'label', $this->_('Source Url'), 'default', 'http://', 'description', $this->_('For creating token-survey url.'), 'size', 50, 'validators[unique]', $model->createUniqueValidator('gso_ls_url'), 'validators[url]', new \MUtil_Validate_Url());
     $sourceClasses = $tracker->getSourceClasses();
     end($sourceClasses);
     $model->set('gso_ls_class', 'label', $this->_('Adaptor class'), 'default', key($sourceClasses), 'multiOptions', $sourceClasses);
     $model->set('gso_ls_adapter', 'label', $this->_('Database Server'), 'default', substr(get_class($this->db), strlen('Zend_Db_Adapter_')), 'description', $this->_('The database server used by the source.'), 'multiOptions', $tracker->getSourceDatabaseClasses());
     $model->set('gso_ls_table_prefix', 'label', $this->_('Table prefix'), 'default', 'ls__', 'description', $this->_('Do not forget the underscores.'), 'size', 15);
     if ($detailed) {
         $in_gems = $this->_('Leave empty for the Gems database.');
         $model->set('gso_ls_dbhost', 'label', $this->_('Database host'), 'description', $in_gems, 'size', 15);
         $model->set('gso_ls_database', 'label', $this->_('Database'), 'description', $in_gems, 'size', 15);
         $model->set('gso_ls_username', 'label', $this->_('Database Username'), 'description', $in_gems, 'size', 15);
         $model->set('gso_ls_password', 'label', $this->_('Database Password'), 'elementClass', 'Password', 'repeatLabel', $this->_('Repeat password'), 'required', false, 'size', 15);
         if ('create' == $action) {
             $model->set('gso_ls_password', 'description', $in_gems, 'renderPassword', true);
         } else {
             $model->set('gso_ls_password', 'description', $this->_('Enter only when changing'), 'renderPassword', false);
         }
         $type = new \Gems_Model_Type_EncryptedField($this->project, true);
         $type->apply($model, 'gso_ls_password', 'gso_encryption');
         $model->set('gso_ls_charset', 'label', $this->_('Charset'), 'description', $in_gems, 'size', 15);
         $model->set('gso_active', 'label', $this->_('Active'), 'default', 0, 'multiOptions', $this->util->getTranslated()->getYesNo());
     }
     $model->set('gso_status', 'label', $this->_('Status'), 'default', 'Not checked', 'elementClass', 'Exhibitor');
     $model->set('gso_last_synch', 'label', $this->_('Last synchronisation'), 'elementClass', 'Exhibitor');
     \Gems_Model::setChangeFieldsByPrefix($model, 'gso');
     return $model;
 }
 /**
  * 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));
             }
         }
     }
 }
 /**
  *
  * @param string $table_name  Does not test for existence
  * @param string $fieldPrefix Prefix to use for change fields (date/userid), if $saveable empty sets it to true
  * @param mixed  $saveable    Will changes to this table be saved, true or a combination of SAVE_MODE constants
  * @return \Gems_Model_JoinModel
  */
 public function setTableSaveable($table_name, $fieldPrefix = null, $saveable = null)
 {
     parent::setTableSaveable($table_name, $this->_checkSaveable($saveable, $fieldPrefix));
     if ($fieldPrefix) {
         \Gems_Model::setChangeFieldsByPrefix($this, $fieldPrefix);
     }
     return $this;
 }
 /**
  * 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)
 {
     $model = new \MUtil_Model_TableModel('gems__locations');
     $yesNo = $this->util->getTranslated()->getYesNo();
     \Gems_Model::setChangeFieldsByPrefix($model, 'glo');
     $model->setDeleteValues('glo_active', 0);
     $model->set('glo_name', 'label', $this->_('Location'), 'required', true);
     $model->set('glo_organizations', 'label', $this->_('Organizations'), 'description', $this->_('Checked organizations see this organizations respondents.'), 'elementClass', 'MultiCheckbox', 'multiOptions', $this->util->getDbLookup()->getOrganizations(), 'noSort', true);
     $tp = new \MUtil_Model_Type_ConcatenatedRow(':', ', ');
     $tp->apply($model, 'glo_organizations');
     $model->setIfExists('glo_match_to', 'label', $this->_('Import matches'), 'description', $this->_("Split multiple import matches using '|'."));
     $model->setIfExists('glo_code', 'label', $this->_('Location code'), 'size', 10, 'description', $this->_('Optional code name to link the location to program code.'));
     $model->setIfExists('glo_url', 'label', $this->_('Location url'), 'description', $this->_('Complete url for location: http://www.domain.etc'), 'validator', 'Url');
     $model->setIfExists('glo_url_route', 'label', $this->_('Location route url'), 'description', $this->_('Complete url for route to location: http://www.domain.etc'), 'validator', 'Url');
     $model->setIfExists('glo_address_1', 'label', $this->_('Street'));
     $model->setIfExists('glo_address_2', 'label', ' ');
     $model->setIfExists('glo_zipcode', 'label', $this->_('Zipcode'), 'size', 7, 'description', $this->_('E.g.: 0000 AA'), 'filter', new \Gems_Filter_DutchZipcode());
     $model->setIfExists('glo_city', 'label', $this->_('City'));
     $model->setIfExists('glo_region', 'label', $this->_('Region'));
     $model->setIfExists('glo_iso_country', 'label', $this->_('Country'), 'multiOptions', $this->util->getLocalized()->getCountries());
     $model->setIfExists('glo_phone_1', 'label', $this->_('Phone'));
     $model->setIfExists('glo_phone_2', 'label', $this->_('Phone 2'));
     $model->setIfExists('glo_phone_3', 'label', $this->_('Phone 3'));
     $model->setIfExists('glo_phone_4', 'label', $this->_('Phone 4'));
     $model->setIfExists('glo_active', 'label', $this->_('Active'), 'description', $this->_('Inactive means assignable only through automatich processes.'), 'elementClass', 'Checkbox', 'multiOptions', $yesNo);
     $model->setIfExists('glo_filter', 'label', $this->_('Filter'), 'description', $this->_('When checked appointments with these locations are not imported.'), 'elementClass', 'Checkbox', 'multiOptions', $yesNo);
     $model->addColumn("CASE WHEN glo_active = 1 THEN '' ELSE 'deleted' END", 'row_class');
     return $model;
 }