diff options
author | Michael Tänzer <neo@nhng.de> | 2010-05-11 19:50:58 +0200 |
---|---|---|
committer | Michael Tänzer <neo@nhng.de> | 2010-05-11 19:50:58 +0200 |
commit | 6cf8a11300773de09f7f5659733312eaa2412772 (patch) | |
tree | 850256102ec0381601580eaad71193fcba5e7e94 /manager | |
parent | 0a804fde894f00bf82488cc1c1f8ed1ab270946c (diff) | |
parent | 9b603df9b0f7caac80a19f4331f63773c0e3e0a3 (diff) | |
download | cacert-mgr-6cf8a11300773de09f7f5659733312eaa2412772.tar.gz cacert-mgr-6cf8a11300773de09f7f5659733312eaa2412772.tar.xz cacert-mgr-6cf8a11300773de09f7f5659733312eaa2412772.zip |
Merge branch 'AddPoints'
Diffstat (limited to 'manager')
4 files changed, 260 insertions, 0 deletions
diff --git a/manager/application/controllers/AddPointsController.php b/manager/application/controllers/AddPointsController.php new file mode 100644 index 0000000..7003e41 --- /dev/null +++ b/manager/application/controllers/AddPointsController.php @@ -0,0 +1,173 @@ +<?php +/** + * @author Michael Tänzer + */ + +class AddPointsController extends Zend_Controller_Action +{ + const MAX_POINTS_PER_ASSURANCE = 35; + const MAX_ASSURANCE_POINTS = 100; + + protected $db; + + public function init() + { + $config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', + APPLICATION_ENV); + + $this->db = Zend_Db::factory($config->ca_mgr->db->auth->pdo, + $config->ca_mgr->db->auth); + } + + public function indexAction() + { + $this->view->assurance_form = $this->getAssuranceForm(); + $this->render('index'); + } + + public function assuranceAction() + { + // Validate form + if (!$this->getRequest()->isPost()) { + return $this->_forward('index'); + } + + $form = $this->getAssuranceForm(); + if (!$form->isValid($_POST)) { + $this->view->assurance_form = $form; + return $this->render('index'); + } + + // Form is valid -> get values for processing + $values = $form->getValues(); + + + // Check identity of the user + $session = Zend_Registry::get('session'); + if ($session->authdata['authed'] !== true) { + throw new Exception(__METHOD__ . ': you need to log in to use this feature'); + } + $query = 'select `id` from `users` where `id` = :user'; + $query_params['user'] = $session->authdata['authed_id']; + $result = $this->db->query($query, $query_params); + if ($result->rowCount() !== 1) { + throw new Exception(__METHOD__ . ': user ID not found in the data base'); + } + $row = $result->fetch(); + $user['id'] = $row['id']; + + + // Get current points of the user + $query = 'select sum(`points`) as `total` from `notary` where `to` = :user'; + $query_params['user'] = $user['id']; + $row = $this->db->query($query, $query_params)->fetch(); + if ($row['total'] === NULL) $row['total'] = 0; + $user['points'] = $row['total']; + + + // Do the actual assurances + $assurance = array(); // Make sure the array is empty + $assurance['to'] = $user['id']; + $assurance['location'] = $values['location']; + $assurance['date'] = $values['date']; + $assurance['when'] = new Zend_Db_Expr('now()'); + $this->view->assurancesDone = array(); + + $quantity = $values['quantity']; + do { + // split up into multiple assurances + if ($quantity > self::MAX_POINTS_PER_ASSURANCE) { + $assurance['awarded'] = self::MAX_POINTS_PER_ASSURANCE; + $quantity -= self::MAX_POINTS_PER_ASSURANCE; + } else { + $assurance['awarded'] = $quantity; + $quantity = 0; + } + + // Get the assurer for this assurance + $assurance['from'] = $this->getNewAssurer($user['id']); + + // only assign points whithin the limit + if ($user['points'] + $assurance['awarded'] > self::MAX_ASSURANCE_POINTS){ + $assurance['points'] = self::MAX_ASSURANCE_POINTS - $user['points']; + } else { + $assurance['points'] = $assurance['awarded']; + } + + $this->db->insert('notary', $assurance); + + $user['points'] += $assurance['points']; + $this->view->assurancesDone[] = $assurance['points']; + } while ($quantity > 0); + + + // Fix the assurer flag + $query = 'UPDATE `users` SET `assurer` = 1 WHERE `users`.`id` = :user AND '. + + 'EXISTS(SELECT * FROM `cats_passed` AS `cp`, `cats_variant` AS `cv` '. + 'WHERE `cp`.`variant_id` = `cv`.`id` AND `cv`.`type_id` = 1 AND '. + '`cp`.`user_id` = :user) AND '. + + '(SELECT SUM(`points`) FROM `notary` WHERE `to` = :user AND '. + '`expire` < now()) >= 100'; + $query_params['user'] = $user['id']; + $this->db->query($query, $query_params); + + return; + } + + /** + * Get the first assurer who didn't already assure the user + * + * @param int $user_id The ID of the user who should get assured + * @return int The ID of the selected assurer + */ + protected function getNewAssurer($user_id) + { + $query = 'select min(`id`) as `assurer` from `users` ' . + 'where `email` like \'john.doe-___@example.com\' and ' . + '`id` not in (select `from` from `notary` where `to` = :user)'; + $query_params['user'] = $user_id; + $row = $this->db->query($query, $query_params)->fetch(); + + if ($row['assurer'] === NULL) { + throw new Exception(__METHOD__ . ': no more assurers that haven\'t '. + 'already assured this account'); + } + + return $row['assurer']; + } + + protected function getAssuranceForm() + { + $form = new Zend_Form(); + $form->setAction('/add-points/assurance')->setMethod('post'); + + $quantity = new Zend_Form_Element_Text('quantity'); + $quantity->setRequired(true) + ->setLabel(I18n::_('Number of Points')) + ->addFilter(new Zend_Filter_Int()) + ->addValidator(new Zend_Validate_Between(0, 100)); + $form->addElement($quantity); + + $location = new Zend_Form_Element_Text('location'); + $location->setRequired(true) + ->setLabel(I18n::_('Location')) + ->setValue(I18n::_('CACert Test Manager')) + ->addValidator(new Zend_Validate_StringLength(1,255)); + $form->addElement($location); + + $date = new Zend_Form_Element_Text('date'); + $date->setRequired(true) + ->setLabel(I18n::_('Date of Assurance')) + ->setValue(date('Y-m-d H:i:s')) + ->addValidator(new Zend_Validate_StringLength(1,255)); + $form->addElement($date); + + $submit = new Zend_Form_Element_Submit('submit'); + $submit->setLabel(I18n::_('Assure Me')); + $form->addElement($submit); + + return $form; + } +} diff --git a/manager/application/views/scripts/add-points/assurance.phtml b/manager/application/views/scripts/add-points/assurance.phtml new file mode 100644 index 0000000..db45e0a --- /dev/null +++ b/manager/application/views/scripts/add-points/assurance.phtml @@ -0,0 +1,20 @@ +<?php +/** + * @author Michael Tänzer + */ +?> + +<h1><?php print I18n::_('Points added successfully')?></h1> + +<p><?php print I18n::_('The following assurances were added to your account:')?></p> + +<table> + <thead> + <tr><th>#</th><th><?php print I18n::_('Number of points')?></th></tr> + </thead> + <tbody> + <?php foreach ($this->assurancesDone as $i => $points) { + printf('<tr><td> %1$d </td><td> %2$d </td></tr>', $i, $points); + }?> + </tbody> +</table> diff --git a/manager/application/views/scripts/add-points/index.phtml b/manager/application/views/scripts/add-points/index.phtml new file mode 100644 index 0000000..b627b78 --- /dev/null +++ b/manager/application/views/scripts/add-points/index.phtml @@ -0,0 +1,14 @@ +<?php +/** + * @author Michael Tänzer + */ +?> + +<h1><?php print I18n::_('Add Assurance Points to your Account') ?></h1> + +<h2><?php print I18n::_('Get Points by Automated Assurance') ?></h2> +<p><?php print I18n::_('Assign the points by doing an automated assurance '. + 'which looks just like a normal assurance done by a real person.') ?></p> +<p><?php print I18n::_('If you enter more than 35 points they will be split '. + 'into multiple assurances. You can do zero point assurances.') ?></p> +<?php print $this->assurance_form ?> diff --git a/manager/library/actions/ActionAddPoints.php b/manager/library/actions/ActionAddPoints.php new file mode 100644 index 0000000..ef71b2f --- /dev/null +++ b/manager/library/actions/ActionAddPoints.php @@ -0,0 +1,53 @@ +<?php + +require_once (FWACTIONS_PATH . '/FWAction.php'); + +class AddPoints extends FWAction { + /** + * get a list of required permissions that are needed to access this action + * @return array + */ + public static function getRequiredPermissions() { + return array(); + } + + /** + * get a role that is required for accessing that action + * @return string + */ + public static function getRequiredRole() { + return 'User'; + } + + /** + * sort order for top navigation + * @return integer + */ + public static function getTopNavPrio() { + return 50; + } + + /** + * controller to invoke + * @return string + */ + public static function getController() { + return 'add-points'; + } + + /** + * action to invoke + * @return string + */ + public static function getAction() { + return 'index'; + } + + /** + * get text for menu, caller is responsible for translating + * @return string + */ + public static function getMenuText() { + return 'Add Points'; + } +} |