/**
  * Get information on the field translations
  *
  * @return array of fields sourceName => targetName
  * @throws \MUtil_Model_ModelException
  */
 public function getFieldsTranslations()
 {
     if (!$this->_targetModel instanceof \MUtil_Model_ModelAbstract) {
         throw new \MUtil_Model_ModelTranslateException(sprintf('Called %s without a set target model.', __FUNCTION__));
     }
     $this->_targetModel->set('gto_id_token', 'label', $this->_('Token'), 'import_descr', $this->loader->getTracker()->getTokenLibrary()->getFormat(), 'required', true, 'order', 2);
     return array('token' => 'gto_id_token') + parent::getFieldsTranslations();
 }
 /**
  * Get the error message for when no token exists
  *
  * @return string
  */
 public function getNoTokenError(array $row, $key)
 {
     $messages = array();
     if (!(isset($row[$this->patientNrField]) && $row[$this->patientNrField])) {
         $messages[] = sprintf($this->_('Missing respondent number in %s field.'), $this->patientNrField);
     }
     if (!(isset($row[$this->orgIdField]) && $row[$this->orgIdField])) {
         $messages[] = sprintf($this->_('Missing organization number in %s field.'), $this->orgIdField);
     }
     if (!$this->getSurveyId()) {
         $messages[] = $this->_('Missing survey definition.');
     }
     if ($messages) {
         return implode(' ', $messages);
     }
     if (!$this->_skipUnknownPatients) {
         $respondent = $this->loader->getRespondent($row[$this->patientNrField], $row[$this->orgIdField]);
         $organization = $respondent->getOrganization();
         if (!$organization->exists()) {
             return sprintf($this->_('Organization %s (specified for respondent %s) does not exist.'), $respondent->getOrganizationId(), $respondent->getPatientNumber());
         }
         if (!$respondent->exists) {
             return sprintf($this->_('Respondent %s does not exist in organization %s.'), $respondent->getPatientNumber(), $organization->getName());
         }
         $tracker = $this->loader->getTracker();
         $trackId = $this->getTrackId();
         if ($trackId) {
             $trackEngine = $tracker->getTrackEngine($trackId);
             if (!$trackEngine->getTrackName()) {
                 return sprintf($this->_('Track id %d does not exist'), $trackId);
             }
             $select = $this->db->select();
             $select->from('gems__respondent2track')->joinInner('gems__reception_codes', 'gr2t_reception_code = grc_id_reception_code', array())->where('gr2t_id_user = ?', $respondent->getId())->where('gr2t_id_organization = ?', $respondent->getOrganizationId())->where('grc_success = 1');
             if (!$this->db->fetchOne($select)) {
                 return sprintf($this->_('Respondent %s does not have a valid %s track.'), $respondent->getPatientNumber(), $trackEngine->getTrackName());
             }
         }
         $survey = $tracker->getSurvey($this->getSurveyId());
         $tokenSelect = $tracker->getTokenSelect();
         $tokenSelect->andReceptionCodes()->forRespondent($respondent->getId(), $respondent->getOrganizationId())->forSurveyId($this->getSurveyId());
         if ($tokenSelect->fetchOne()) {
             $tokenSelect->onlySucces();
             if (!$tokenSelect->fetchOne()) {
                 return sprintf($this->_('Respondent %s has only deleted %s surveys.'), $respondent->getPatientNumber(), $survey->getName());
             }
         } else {
             return sprintf($this->_('Respondent %s has no %s surveys.'), $respondent->getPatientNumber(), $survey->getName());
         }
     }
     return parent::getNoTokenError($row, $key);
 }