Skip to content
Snippets Groups Projects
class.forms.php 174 KiB
Newer Older
  • Learn to ignore specific revisions
  •         }
            $glue = $Q->isOred() ? ' || ' : ' && ';
            $expression = implode($glue, $expr);
            if (count($expr) > 1)
                $expression = '('.$expression.')';
            if ($Q->isNegated)
                $expression = '!'.$expression;
            return $expression;
        }
    }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
    class AssignmentForm extends Form {
    
        static $id = 'assign';
        var $_assignee = null;
    
        var $_assignees = null;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
        function getFields() {
    
            if ($this->fields)
                return $this->fields;
    
            $fields = array(
                'assignee' => new AssigneeField(array(
    
                        'id'=>1, 'label' => __('Assignee'),
                        'flags' => hexdec(0X450F3), 'required' => true,
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'validator-error' => __('Assignee selection required'),
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'configuration' => array(
                            'criteria' => array(
                                'available' => true,
                                ),
                           ),
    
                'refer' => new BooleanField(array(
                        'id'=>2, 'label'=>'', 'required'=>false,
                        'default'=>false,
                        'configuration'=>array(
                            'desc' => 'Maintain referral access to current assignees')
                        )
                    ),
    
    Peter Rotich's avatar
    Peter Rotich committed
                'comments' => new TextareaField(array(
    
                        'id' => 3, 'label'=> '', 'required'=>false, 'default'=>'',
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'configuration' => array(
                            'html' => true,
    
                            'size' => 'small',
    
    Peter Rotich's avatar
    Peter Rotich committed
                            'placeholder' => __('Optional reason for the assignment'),
                            ),
                        )
                    ),
                );
    
    
            if (isset($this->_assignees))
    
                $fields['assignee']->setChoices($this->_assignees);
    
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            $this->setFields($fields);
    
            return $this->fields;
        }
    
    
        function getField($name) {
    
            if (($fields = $this->getFields())
                    && isset($fields[$name]))
                return $fields[$name];
        }
    
    
        function isValid($include=false) {
    
            if (!parent::isValid($include) || !($f=$this->getField('assignee')))
    
    Peter Rotich's avatar
    Peter Rotich committed
                return false;
    
            // Do additional assignment validation
            if (!($assignee = $this->getAssignee())) {
    
                $f->addError(__('Unknown assignee'));
    
    Peter Rotich's avatar
    Peter Rotich committed
            } elseif ($assignee instanceof Staff) {
                // Make sure the agent is available
                if (!$assignee->isAvailable())
    
                    $f->addError(__('Agent is unavailable for assignment'));
            } elseif ($assignee instanceof Team) {
                // Make sure the team is active and has members
                if (!$assignee->isActive())
                    $f->addError(__('Team is disabled'));
                elseif (!$assignee->getNumMembers())
                    $f->addError(__('Team does not have members'));
    
    Peter Rotich's avatar
    Peter Rotich committed
            }
    
            return !$this->errors();
        }
    
    
        function render($options=array()) {
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            switch(strtolower($options['template'])) {
            case 'simple':
                $inc = STAFFINC_DIR . 'templates/dynamic-form-simple.tmpl.php';
                break;
            default:
                throw new Exception(sprintf(__('%s: Unknown template style %s'),
                            'FormUtils', $options['template']));
            }
    
            $form = $this;
            include $inc;
        }
    
    
        function setAssignees($assignees) {
            $this->_assignees = $assignees;
            $this->_fields = array();
        }
    
        function getAssignees() {
            return $this->_assignees;
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getAssignee() {
    
    
    Peter Rotich's avatar
    Peter Rotich committed
            if (!isset($this->_assignee))
                $this->_assignee = $this->getField('assignee')->getClean();
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            return $this->_assignee;
        }
    
    
        function getComments() {
            return $this->getField('comments')->getClean();
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
    
        function refer() {
            return $this->getField('refer')->getClean();
        }
    
    Peter Rotich's avatar
    Peter Rotich committed
    }
    
    class ClaimForm extends AssignmentForm {
    
        var $_fields;
    
        function setFields($fields) {
            $this->_fields = $fields;
            parent::setFields($fields);
        }
    
        function getFields() {
    
            if ($this->_fields)
                return $this->_fields;
    
    Peter Rotich's avatar
    Peter Rotich committed
            $fields = parent::getFields();
    
    Peter Rotich's avatar
    Peter Rotich committed
            // Disable && hide assignee field selection
            if (isset($fields['assignee'])) {
                $visibility = new VisibilityConstraint(
                        new Q(array()), VisibilityConstraint::HIDDEN);
    
    Peter Rotich's avatar
    Peter Rotich committed
                $fields['assignee']->set('visibility', $visibility);
            }
    
            // Change coments placeholder to reflect claim
            if (isset($fields['comments'])) {
                $fields['comments']->configure('placeholder',
                        __('Optional reason for the claim'));
            }
    
    
            $this->setFields($fields);
    
            return $this->fields;
    
    class ReleaseForm extends Form {
        static $id = 'unassign';
    
        function getFields() {
            if ($this->fields)
                return $this->fields;
    
            $fields = array(
                'comments' => new TextareaField(array(
                        'id' => 1, 'label'=> '', 'required'=>false, 'default'=>'',
                        'configuration' => array(
                            'html' => true,
                            'size' => 'small',
                            'placeholder' => __('Optional reason for releasing assignment'),
                            ),
                        )
                    ),
                );
    
    
            $this->setFields($fields);
    
            return $this->fields;
        }
    
        function getField($name) {
            if (($fields = $this->getFields())
                    && isset($fields[$name]))
                return $fields[$name];
        }
    
        function isValid($include=false) {
            if (!parent::isValid($include))
                return false;
    
            return !$this->errors();
        }
    
        function getComments() {
            return $this->getField('comments')->getClean();
        }
    }
    
    
    class MarkAsForm extends Form {
        static $id = 'markAs';
    
        function getFields() {
            if ($this->fields)
                return $this->fields;
    
            $fields = array(
                'comments' => new TextareaField(array(
                        'id' => 1, 'label'=> '', 'required'=>false, 'default'=>'',
                        'configuration' => array(
                            'html' => true,
                            'size' => 'small',
                            'placeholder' => __('Optional reason for marking ticket as (un)answered'),
                            ),
                        )
                    ),
                );
    
    
            $this->setFields($fields);
    
            return $this->fields;
        }
    
        function getField($name) {
            if (($fields = $this->getFields())
                    && isset($fields[$name]))
                return $fields[$name];
        }
    
        function isValid($include=false) {
            if (!parent::isValid($include))
                return false;
    
            return !$this->errors();
        }
    
        function getComments() {
            return $this->getField('comments')->getClean();
        }
    }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
    class ReferralForm extends Form {
    
        static $id = 'refer';
        var $_target = null;
        var $_choices = null;
        var $_prompt = '';
    
        function getFields() {
    
            if ($this->fields)
                return $this->fields;
    
            $fields = array(
    
                'target' => new ChoiceField(array(
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'id'=>1,
                        'label' => __('Referee'),
                        'flags' => hexdec(0X450F3),
                        'required' => true,
                        'validator-error' => __('Selection required'),
    
                        'choices' => array(
                        'agent' => __('Agent'),
                        'team'  => __('Team'),
                                    'dept'  => __('Department'),
                                   ),
                                )
                    ),
                'agent' => new ChoiceField(array(
                        'id'=>2,
                        'label' => '',
                        'flags' => hexdec(0X450F3),
                        'required' => true,
                        'configuration'=>array('prompt'=>__('Select Agent')),
                                'validator-error' => __('Agent selection required'),
                        'visibility' => new VisibilityConstraint(
                            new Q(array('target__eq'=>'agent')),
                            VisibilityConstraint::HIDDEN
                          ),
                                )
                    ),
                'team' => new ChoiceField(array(
                        'id'=>3,
                        'label' => '',
                        'flags' => hexdec(0X450F3),
                        'required' => true,
                        'validator-error' => __('Team selection required'),
                        'configuration'=>array('prompt'=>__('Select Team')),
                                'visibility' => new VisibilityConstraint(
                                        new Q(array('target__eq'=>'team')),
                                        VisibilityConstraint::HIDDEN
                                  ),
                                )
                    ),
    
                'dept' => new DepartmentField(array(
    
                        'id'=>4,
                        'label' => '',
                        'flags' => hexdec(0X450F3),
                        'required' => true,
                        'validator-error' => __('Dept. selection required'),
                        'configuration'=>array('prompt'=>__('Select Department')),
                                'visibility' => new VisibilityConstraint(
                                        new Q(array('target__eq'=>'dept')),
                                        VisibilityConstraint::HIDDEN
                                  ),
                                )
    
    Peter Rotich's avatar
    Peter Rotich committed
                    ),
                'comments' => new TextareaField(array(
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'label'=> '',
                        'required'=>false,
                        'default'=>'',
                        'configuration' => array(
                            'html' => true,
                            'size' => 'small',
                            'placeholder' => __('Optional reason for the referral'),
                            ),
                        )
                    ),
                );
    
            $this->setFields($fields);
    
            return $this->fields;
        }
    
        function getField($name) {
    
            if (($fields = $this->getFields())
                    && isset($fields[$name]))
                return $fields[$name];
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function isValid($include=false) {
    
            if (!parent::isValid($include) || !($f=$this->getField('target')))
                return false;
    
            // Do additional assignment validation
    
            $referee = $this->getReferee();
    
    Peter Rotich's avatar
    Peter Rotich committed
            switch (true) {
    
            case $referee instanceof Staff:
    
    Peter Rotich's avatar
    Peter Rotich committed
                // Make sure the agent is available
    
                if (!$referee->isAvailable())
    
    Peter Rotich's avatar
    Peter Rotich committed
                    $f->addError(__('Agent is unavailable for assignment'));
            break;
    
            case $referee instanceof Team:
    
    Peter Rotich's avatar
    Peter Rotich committed
                // Make sure the team is active and has members
    
                if (!$referee->isActive())
    
    Peter Rotich's avatar
    Peter Rotich committed
                    $f->addError(__('Team is disabled'));
    
                elseif (!$referee->getNumMembers())
    
    Peter Rotich's avatar
    Peter Rotich committed
                    $f->addError(__('Team does not have members'));
            break;
    
            case $referee instanceof Dept:
    
    Peter Rotich's avatar
    Peter Rotich committed
            break;
            default:
                $f->addError(__('Unknown selection'));
            }
    
            return !$this->errors();
        }
    
    
        function render($options=array()) {
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            switch(strtolower($options['template'])) {
            case 'simple':
                $inc = STAFFINC_DIR . 'templates/dynamic-form-simple.tmpl.php';
                break;
            default:
                throw new Exception(sprintf(__('%s: Unknown template style %s'),
                            'FormUtils', $options['template']));
            }
    
            $form = $this;
            include $inc;
        }
    
    
        function setChoices($field, $choices, $prompt='') {
    
            if (!($f= $this->getField($field)))
               return;
    
            $f->set('choices', $choices);
    
            return $f;
    
        function getReferee() {
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
            $target = $this->getField('target')->getClean();
            if (!$target || !($f=$this->getField($target)))
                return null;
    
    Peter Rotich's avatar
    Peter Rotich committed
    
    
            $id = $f->getClean();
            switch($target) {
            case 'agent':
                return Staff::lookup($id);
            case 'team':
                return Team::lookup($id);
            case 'dept':
                return Dept::lookup($id);
            }
    
    Peter Rotich's avatar
    Peter Rotich committed
        }
    
        function getComments() {
            return $this->getField('comments')->getClean();
        }
    }
    
    
    
    Peter Rotich's avatar
    Peter Rotich committed
    class TransferForm extends Form {
    
        static $id = 'transfer';
        var $_dept = null;
    
        function __construct($source=null, $options=array()) {
            parent::__construct($source, $options);
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getFields() {
    
            if ($this->fields)
                return $this->fields;
    
            $fields = array(
                'dept' => new DepartmentField(array(
                        'id'=>1,
                        'label' => __('Department'),
                        'flags' => hexdec(0X450F3),
                        'required' => true,
    
                        'validator-error' => __('Department selection is required'),
    
                'refer' => new BooleanField(array(
                    'id'=>2, 'label'=>'', 'required'=>false, 'default'=>false,
                    'configuration'=>array(
                        'desc' => 'Maintain referral access to current department')
                )),
    
    Peter Rotich's avatar
    Peter Rotich committed
                'comments' => new TextareaField(array(
    
    Peter Rotich's avatar
    Peter Rotich committed
                        'label'=> '',
                        'required'=>false,
                        'default'=>'',
                        'configuration' => array(
                            'html' => true,
    
    Peter Rotich's avatar
    Peter Rotich committed
                            'size' => 'small',
    
    Peter Rotich's avatar
    Peter Rotich committed
                            'placeholder' => __('Optional reason for the transfer'),
                            ),
                        )
                    ),
                );
    
            $this->setFields($fields);
    
            return $this->fields;
    
        function isValid($include=false) {
    
            if (!parent::isValid($include))
    
    Peter Rotich's avatar
    Peter Rotich committed
                return false;
    
            // Do additional validations
            if (!($dept = $this->getDept()))
                $this->getField('dept')->addError(
                        __('Unknown department'));
    
            return !$this->errors();
    
        function render($options=array()) {
    
    Peter Rotich's avatar
    Peter Rotich committed
    
            switch(strtolower($options['template'])) {
            case 'simple':
                $inc = STAFFINC_DIR . 'templates/dynamic-form-simple.tmpl.php';
                break;
            default:
                throw new Exception(sprintf(__('%s: Unknown template style %s'),
                            get_class(), $options['template']));
            }
    
            $form = $this;
            include $inc;
    
    
        function refer() {
            return $this->getField('refer')->getClean();
        }
    
    
    Peter Rotich's avatar
    Peter Rotich committed
        function getDept() {
    
            if (!isset($this->_dept)) {
                if (($id = $this->getField('dept')->getClean()))
                    $this->_dept = Dept::lookup($id);
            }
    
            return $this->_dept;
    
    /**
     * FieldUnchanged
     *
     * Thrown in the to_database() method to indicate the value should not be
     * saved in the database (it wasn't changed in the request)
     */
    class FieldUnchanged extends Exception {}