==== Sequential numbers ====
In order to create a sequential (study-)number for each new respondent, you need to create you own respondent controller.\\
Please see the [[devzone:howto:start|howto]] page first, on how to do that.\\
In the code below, you will see three functions in this controller:
* beforeSave, which will check the respondent number just before saving it
* createModel, which uses the parent model and creates the new respondent number using an extra variable for organization id as default value (*).
* getRespNr, which uses the organization ID, gets the latest respondent number for that organization and returns the next respondent number
.
class RespondentController extends Gems_Default_RespondentAction
{
/*
* default value for respnr needed before validation of form
*/
public function createModel($detailed, $action) {
$model = parent::createModel($detailed, $action);
$orgcode = $this->loader->getOrganization()->getCode();
$model->set('gr2o_patient_nr', 'default', $this->getRespnr($orgcode));
return $model;
}
/*
* get new studynr if needed and display appropriate message
*/
public function beforeSave(array &$data, $isNew, Zend_Form $form = null)
{
If ($isNew) {
//MUtil_Echo::track($data);
$orgcode = $this->loader->getOrganization($data['gr2o_id_organization'])->getCode();
$respNr = $this->getRespNr($orgcode);
if ($data['gr2o_patient_nr'] !== $respNr) {
$this->addMessage(sprintf($this->_('Studynumber changed from %1$s to %2$s!'), $data['gr2o_patient_nr'], $respNr));
}else{
$this->addMessage(sprintf($this->_('Studynumber %s assigned!'), $respNr));
}
$data['gr2o_patient_nr'] = $respNr;
}
return true;
}
/*
* This function will get the next studynumber for the current organization
* use gor_code that can be set in the organization interface
*
*/
protected function getRespNr($orgcode)
{
$orgcodelength = strlen($orgcode);
$sql = "SELECT CAST(substr(`gr2o_patient_nr`,$orgcodelength+1) AS UNSIGNED) AS mynr, `gr2o_patient_nr`
FROM `gems__respondent2org`
WHERE `gr2o_patient_nr` LIKE '$orgcode%'
ORDER BY mynr DESC LIMIT 1;";
/*
* This can result in different organisations having identical respnrs if you use orgcodes like A, AB, AC or N, N1, N3, etc !
* It depends on your situation if this is a feature or an unwanted option.
* If unwanted you should change this code to fit your needs.
* Please note that this is not a problem for Gemstracker as it keeps track of the patient and organization ids.
*/
$value = $this->db->fetchRow($sql);
$nr = $value['mynr'];
$nr++;
$respnr = $orgcode.sprintf('%04d', $nr);
//MUtil_Echo::track($respnr);
return $respnr;
}
}
(*) In a simalar way you can set defaults for other fields in the createModel function:\\
$model->set('gr2o_consent', 'default', 'Yes');
or\\
$model->set('grs_gender', 'default', 'M');