/**
  * 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($trackId = null, $fieldKey = null)
 {
     $batch = $this->getBatch();
     $engine = $this->loader->getTracker()->getTrackEngine($trackId);
     $fields = $engine->getFieldsDefinition();
     $model = $fields->getMaintenanceModel();
     $filter = FieldsDefinition::splitKey($fieldKey);
     $filter['gtf_id_track'] = $trackId;
     $data = $model->loadFirst($filter);
     // \MUtil_Echo::track($fieldKey, $data);
     if ($data) {
         unset($data['sub'], $data['gtf_id_field'], $data['gtf_id_track'], $data['gtf_filter_id'], $data['gtf_changed'], $data['gtf_changed_by'], $data['gtf_created'], $data['gtf_created_by'], $data['calculation'], $data['htmlUse'], $data['htmlCalc']);
         if (isset($data['gtf_calculate_using']) && $data['gtf_calculate_using']) {
             $calcs = explode(FieldAbstract::FIELD_SEP, $data['gtf_calculate_using']);
             foreach ($calcs as &$key) {
                 $key = $this->translateFieldCode($fields, $key);
             }
             $data['gtf_calculate_using'] = implode(FieldAbstract::FIELD_SEP, $calcs);
         }
         $count = $batch->addToCounter('fields_exported');
         if ($count == 1) {
             $this->exportTypeHeader('fields');
         }
         // The number and order of fields can change per field and installation
         $this->exportFieldHeaders($data);
         $this->exportFieldData($data);
         $this->exportFlush();
         $batch->setMessage('fields_export', sprintf($this->plural('%d field exported', '%d fields exported', $count), $count));
     }
 }
 /**
  * Overrule to implement snippet specific filtering and sorting.
  *
  * @param \MUtil_Model_ModelAbstract $model
  */
 protected function processFilterAndSort(\MUtil_Model_ModelAbstract $model)
 {
     parent::processFilterAndSort($model);
     $appId = $this->request->getParam(\Gems_Model::APPOINTMENT_ID);
     if ($appId) {
         $appKeyPrefix = $this->db->quote(FieldsDefinition::makeKey(FieldMaintenanceModel::APPOINTMENTS_NAME, ''));
         $appSource = $this->db->quote(\Gems_Tracker_Engine_StepEngineAbstract::APPOINTMENT_TABLE);
         $or[] = $this->db->quoteInto("gro_valid_after_source = {$appSource} AND\n                        (gto_id_respondent_track, gro_valid_after_field) IN\n                            (SELECT gr2t2a_id_respondent_track, CONCAT({$appKeyPrefix}, gr2t2a_id_app_field)\n                                FROM gems__respondent2track2appointment\n                                WHERE gr2t2a_id_appointment = ?)", $appId);
         $or[] = $this->db->quoteInto("gro_valid_for_source = {$appSource} AND\n                        (gto_id_respondent_track, gro_valid_for_field) IN\n                            (SELECT gr2t2a_id_respondent_track, CONCAT({$appKeyPrefix}, gr2t2a_id_app_field)\n                                FROM gems__respondent2track2appointment\n                                WHERE gr2t2a_id_appointment = ?)", $appId);
     }
     $model->addFilter(array('(' . implode(') OR (', $or) . ')'));
 }
 /**
  * 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
  *
  * @param array $trackData Nested array of trackdata
  */
 public function execute($lineNr = null, $fieldData = null)
 {
     $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']);
     $fieldModel = $trackEngine->getFieldsMaintenanceModel(true, 'create');
     $fieldData['gtf_id_track'] = $import['trackId'];
     $fieldData = $fieldModel->save($fieldData);
     // Store the field reference
     $import['fieldCodes']['{f' . $fieldData['gtf_id_order'] . '}'] = FieldsDefinition::makeKey($fieldData['sub'], $fieldData['gtf_id_field']);
     if (isset($fieldData['gtf_calculate_using']) && $fieldData['gtf_calculate_using']) {
         $batch->addTask('Tracker\\Import\\UpdateFieldCalculationTask', $lineNr, $fieldData['gtf_id_field'], $fieldModel->getModelNameForRow($fieldData), $fieldData['gtf_calculate_using']);
     }
 }
 /**
  * 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($trackId = null, $roundId = null)
 {
     $batch = $this->getBatch();
     $select = $this->db->select();
     $select->from('gems__rounds', array('gro_id_order', 'gro_id_relationfield', 'gro_round_description', 'gro_icon_file', 'gro_changed_event', 'gro_display_event', 'gro_valid_after_source', 'gro_valid_after_field', 'gro_valid_after_unit', 'gro_valid_after_length', 'gro_valid_for_source', 'gro_valid_for_field', 'gro_valid_for_unit', 'gro_valid_for_length', 'gro_organizations', 'gro_code'))->joinInner('gems__surveys', 'gro_id_survey = gsu_id_survey', array('survey_export_code' => 'gsu_export_code'))->joinLeft('gems__rounds AS va', 'gems__rounds.gro_valid_after_id = va.gro_id_round', array('valid_after' => 'va.gro_id_order'))->joinLeft('gems__rounds AS vf', 'gems__rounds.gro_valid_for_id = vf.gro_id_round', array('valid_for' => 'vf.gro_id_order'))->where('gems__rounds.gro_id_round = ?', $roundId);
     // \MUtil_Echo::track($select->__toString(), $roundId);
     $data = $this->db->fetchRow($select);
     // \MUtil_Echo::track($data);
     if ($data) {
         $fields = $this->loader->getTracker()->getTrackEngine($trackId)->getFieldsDefinition();
         $tests = array(\Gems_Tracker_Engine_StepEngineAbstract::APPOINTMENT_TABLE, \Gems_Tracker_Engine_StepEngineAbstract::RESPONDENT_TRACK_TABLE);
         if (isset($data['gro_id_relationfield']) && $data['gro_id_relationfield']) {
             // -1 means the respondent itself, also gro_id_relationfield stores a "bare"
             // field id, not one with a table prefix
             if ($data['gro_id_relationfield'] >= 0) {
                 $data['gro_id_relationfield'] = $this->translateFieldCode($fields, FieldsDefinition::makeKey(FieldMaintenanceModel::FIELDS_NAME, $data['gro_id_relationfield']));
             }
         }
         if (isset($data['gro_valid_after_source'], $data['gro_valid_after_field']) && in_array($data['gro_valid_after_source'], $tests)) {
             // Translate field to {order}
             $data['gro_valid_after_field'] = $this->translateFieldCode($fields, $data['gro_valid_after_field']);
         }
         if (isset($data['gro_valid_for_source'], $data['gro_valid_for_field']) && in_array($data['gro_valid_for_source'], $tests)) {
             // Translate field to {order}
             $data['gro_valid_for_field'] = $this->translateFieldCode($fields, $data['gro_valid_for_field']);
         }
         $count = $batch->addToCounter('rounds_exported');
         if ($count == 1) {
             $this->exportTypeHeader('rounds');
             $this->exportFieldHeaders($data);
         }
         $this->exportFieldData($data);
         $this->exportFlush();
         $batch->setMessage('rounds_export', sprintf($this->plural('%d round exported', '%d rounds exported', $count), $count));
     }
 }
 /**
  * Returns an array of all field id's for all tracks that have a code id
  *
  * @return array id => code
  */
 public function getAllCodeFields()
 {
     static $fields = false;
     // Using static so it will be refreshed once per request
     if ($fields === false) {
         $fields = array();
         $model = $this->createTrackClass('Model_FieldMaintenanceModel');
         $rows = $model->load(array('gtf_field_code IS NOT NULL'), array('gtf_field_code' => SORT_ASC));
         if ($rows) {
             foreach ($rows as $row) {
                 $key = FieldsDefinition::makeKey($row['sub'], $row['gtf_id_field']);
                 $fields[$key] = $row['gtf_field_code'];
             }
         }
     }
     return $fields;
 }
 /**
  * The field id as it is recognized be the track engine
  *
  * @return string
  */
 public function getFieldId()
 {
     if (isset($this->_data['gtap_id_app_field']) && $this->_data['gtap_id_app_field']) {
         return FieldsDefinition::makeKey(FieldMaintenanceModel::APPOINTMENTS_NAME, $this->_data['gtap_id_app_field']);
     }
 }
 /**
  * Get the calculate from options
  *
  * @param int $trackId
  * @return array
  */
 protected function getOptions($trackId = null)
 {
     if (null === $trackId) {
         $trackId = $this->_trackId;
     }
     $appFields = $this->db->fetchPairs("\n            SELECT gtap_id_app_field, gtap_field_name\n                FROM gems__track_appointments\n                WHERE gtap_id_track = ?\n                ORDER BY gtap_id_order", $trackId);
     $options = array();
     if ($appFields) {
         foreach ($appFields as $id => $label) {
             $key = FieldsDefinition::makeKey(FieldMaintenanceModel::APPOINTMENTS_NAME, $id);
             $options[$key] = $label;
         }
     }
     return $options;
 }
 /**
  * Translate a field code to the field order number
  *
  * @param FieldsDefinition $fields
  * @param string $fieldId
  * @return string {order} or original value
  */
 protected function translateFieldCode(FieldsDefinition $fields, $fieldId)
 {
     $field = $fields->getField($fieldId);
     if ($field instanceof FieldInterface) {
         return '{f' . $field->getOrder() . '}';
     }
     return $fieldId;
 }