diff --git a/include/staff/staffmembers.inc.php b/include/staff/staffmembers.inc.php index 9ea2607a6db6099cdef1d28ae85ce8ac321eefe9..9360ffa6ea08ed206d5c1ec5c80892fb91dcfc1c 100644 --- a/include/staff/staffmembers.inc.php +++ b/include/staff/staffmembers.inc.php @@ -1,74 +1,92 @@ <?php -if(!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) die('Access Denied'); +if (!defined('OSTADMININC') || !$thisstaff || !$thisstaff->isAdmin()) + die('Access Denied'); + $qstr=''; -$select='SELECT staff.*,CONCAT_WS(" ",firstname,lastname) as name, grp.group_name, dept.dept_name as dept,count(m.team_id) as teams '; -$from='FROM '.STAFF_TABLE.' staff '. - 'LEFT JOIN '.GROUP_TABLE.' grp ON(staff.group_id=grp.group_id) '. - 'LEFT JOIN '.DEPT_TABLE.' dept ON(staff.dept_id=dept.dept_id) '. - 'LEFT JOIN '.TEAM_MEMBER_TABLE.' m ON(m.staff_id=staff.staff_id) '; -$where='WHERE 1 '; - -if($_REQUEST['did'] && is_numeric($_REQUEST['did'])) { - $where.=' AND staff.dept_id='.db_input($_REQUEST['did']); - $qstr.='&did='.urlencode($_REQUEST['did']); -} +$sortOptions = array( + 'name' => 'lastname', + 'username' => 'username', + 'status' => 'isactive', + 'group' => 'group__name', + 'dept' => 'dept__name', + 'created' => 'created', + 'login' => 'lastlogin' + ); -if($_REQUEST['gid'] && is_numeric($_REQUEST['gid'])) { - $where.=' AND staff.group_id='.db_input($_REQUEST['gid']); - $qstr.='&gid='.urlencode($_REQUEST['gid']); -} +$orderWays = array('DESC'=>'DESC', 'ASC'=>'ASC'); +$sort = ($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])]) ? strtolower($_REQUEST['sort']) : 'name'; -if($_REQUEST['tid'] && is_numeric($_REQUEST['tid'])) { - $where.=' AND m.team_id='.db_input($_REQUEST['tid']); - $qstr.='&tid='.urlencode($_REQUEST['tid']); +if ($sort && $sortOptions[$sort]) { + $order_column = $sortOptions[$sort]; } -$sortOptions=array('name'=>'staff.firstname,staff.lastname','username'=>'staff.username','status'=>'isactive', - 'group'=>'grp.group_name','dept'=>'dept.dept_name','created'=>'staff.created','login'=>'staff.lastlogin'); -$orderWays=array('DESC'=>'DESC','ASC'=>'ASC'); -$sort=($_REQUEST['sort'] && $sortOptions[strtolower($_REQUEST['sort'])])?strtolower($_REQUEST['sort']):'name'; -//Sorting options... -if($sort && $sortOptions[$sort]) { - $order_column =$sortOptions[$sort]; -} -$order_column=$order_column?$order_column:'staff.firstname,staff.lastname'; +$order_column = $order_column ? $order_column : 'lastname'; -if($_REQUEST['order'] && $orderWays[strtoupper($_REQUEST['order'])]) { - $order=$orderWays[strtoupper($_REQUEST['order'])]; +if ($_REQUEST['order'] && isset($orderWays[strtoupper($_REQUEST['order'])])) { + $order = $orderWays[strtoupper($_REQUEST['order'])]; +} else { + $order = 'ASC'; } -$order=$order?$order:'ASC'; -if($order_column && strpos($order_column,',')){ +if ($order_column && strpos($order_column,',')) { $order_column=str_replace(','," $order,",$order_column); } $x=$sort.'_sort'; $$x=' class="'.strtolower($order).'" '; -$order_by="$order_column $order "; -$total=db_count('SELECT count(DISTINCT staff.staff_id) '.$from.' '.$where); -$page=($_GET['p'] && is_numeric($_GET['p']))?$_GET['p']:1; -$pageNav=new Pagenate($total,$page,PAGE_LIMIT); -$pageNav->setURL('staff.php',$qstr.'&sort='.urlencode($_REQUEST['sort']).'&order='.urlencode($_REQUEST['order'])); -//Ok..lets roll...create the actual query +//Filers +$filters = array(); +if ($_REQUEST['did'] && is_numeric($_REQUEST['did'])) { + $filters += array('dept_id' => $_REQUEST['did']); + $qstr.='&did='.urlencode($_REQUEST['did']); +} + +if ($_REQUEST['gid'] && is_numeric($_REQUEST['gid'])) { + $filters += array('group_id' => $_REQUEST['gid']); + $qstr.='&gid='.urlencode($_REQUEST['gid']); +} + +if ($_REQUEST['tid'] && is_numeric($_REQUEST['tid'])) { + $filters += array('teams__team_id' => $_REQUEST['tid']); + $qstr.='&tid='.urlencode($_REQUEST['tid']); +} + +//agents objects +$agents = Staff::objects() + ->annotate(array( + 'teams_count'=>SqlAggregate::COUNT('teams', true), + )) + ->order_by(sprintf('%s%s', + strcasecmp($order, 'DESC') ? '' : '-', + $order_column)); + +if ($filters) + $agents->filter($filters); + +// paginate +$page = ($_GET['p'] && is_numeric($_GET['p'])) ? $_GET['p'] : 1; +$count = $agents->count(); +$pageNav = new Pagenate($count, $page, PAGE_LIMIT); +$_qstr = $qstr.'&sort='.urlencode($_REQUEST['sort']).'&order='.urlencode($_REQUEST['order']); +$pageNav->setURL('staff.php', $_qstr); +$showing = $pageNav->showing().' '._N('agent', 'agents', $count); $qstr.='&order='.($order=='DESC'?'ASC':'DESC'); -$query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ".$pageNav->getStart().",".$pageNav->getLimit(); -//echo $query; + +// add limits. +$agents->limit($pageNav->getLimit())->offset($pageNav->getStart()); ?> <h2><?php echo __('Agents');?></h2> + <div class="pull-left" style="width:700px;"> <form action="staff.php" method="GET" name="filter"> <input type="hidden" name="a" value="filter" > <select name="did" id="did"> <option value="0">— <?php echo __('All Department');?> —</option> <?php - $sql='SELECT dept.dept_id, dept.dept_name,count(staff.staff_id) as users '. - 'FROM '.DEPT_TABLE.' dept '. - 'INNER JOIN '.STAFF_TABLE.' staff ON(staff.dept_id=dept.dept_id) '. - 'GROUP By dept.dept_id HAVING users>0 ORDER BY dept_name'; - if(($res=db_query($sql)) && db_num_rows($res)){ - while(list($id,$name, $users)=db_fetch_row($res)){ + if (($depts=Dept::getDepartments())) { + foreach ($depts as $id => $name) { $sel=($_REQUEST['did'] && $_REQUEST['did']==$id)?'selected="selected"':''; - echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users); + echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name); } } ?> @@ -76,14 +94,10 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ". <select name="gid" id="gid"> <option value="0">— <?php echo __('All Groups');?> —</option> <?php - $sql='SELECT grp.group_id, group_name,count(staff.staff_id) as users '. - 'FROM '.GROUP_TABLE.' grp '. - 'INNER JOIN '.STAFF_TABLE.' staff ON(staff.group_id=grp.group_id) '. - 'GROUP BY grp.group_id ORDER BY group_name'; - if(($res=db_query($sql)) && db_num_rows($res)){ - while(list($id,$name,$users)=db_fetch_row($res)){ + if (($groups=Group::getGroups())) { + foreach ($groups as $id => $name) { $sel=($_REQUEST['gid'] && $_REQUEST['gid']==$id)?'selected="selected"':''; - echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users); + echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name); } } ?> @@ -91,13 +105,10 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ". <select name="tid" id="tid"> <option value="0">— <?php echo __('All Teams');?> —</option> <?php - $sql='SELECT team.team_id, team.name, count(member.staff_id) as users FROM '.TEAM_TABLE.' team '. - 'INNER JOIN '.TEAM_MEMBER_TABLE.' member ON(member.team_id=team.team_id) '. - 'GROUP BY team.team_id ORDER BY team.name'; - if(($res=db_query($sql)) && db_num_rows($res)){ - while(list($id,$name,$users)=db_fetch_row($res)){ + if (($teams=Team::getTeams())) { + foreach ($teams as $id => $name) { $sel=($_REQUEST['tid'] && $_REQUEST['tid']==$id)?'selected="selected"':''; - echo sprintf('<option value="%d" %s>%s (%s)</option>',$id,$sel,$name,$users); + echo sprintf('<option value="%d" %s>%s</option>',$id,$sel,$name); } } ?> @@ -108,13 +119,6 @@ $query="$select $from $where GROUP BY staff.staff_id ORDER BY $order_by LIMIT ". </div> <div class="pull-right flush-right" style="padding-right:5px;"><b><a href="staff.php?a=add" class="Icon newstaff"><?php echo __('Add New Agent');?></a></b></div> <div class="clear"></div> -<?php -$res=db_query($query); -if($res && ($num=db_num_rows($res))) - $showing=$pageNav->showing() . ' ' . _N('agent', 'agents', $num); -else - $showing=__('No agents found!'); -?> <form action="staff.php" method="POST" name="staff" > <?php csrf_token(); ?> <input type="hidden" name="do" value="mass_process" > @@ -135,31 +139,38 @@ else </thead> <tbody> <?php - if($res && db_num_rows($res)): - $ids=($errors && is_array($_POST['ids']))?$_POST['ids']:null; - while ($row = db_fetch_array($res)) { + if ($count): + $ids = ($errors && is_array($_POST['ids'])) ? $_POST['ids'] : null; + foreach ($agents as $agent) { + $id = $agent->getId(); $sel=false; - if($ids && in_array($row['staff_id'],$ids)) + if ($ids && in_array($id, $ids)) $sel=true; ?> - <tr id="<?php echo $row['staff_id']; ?>"> + <tr id="<?php echo $id; ?>"> <td width=7px> - <input type="checkbox" class="ckb" name="ids[]" value="<?php echo $row['staff_id']; ?>" <?php echo $sel?'checked="checked"':''; ?> > - <td><a href="staff.php?id=<?php echo $row['staff_id']; ?>"><?php echo Format::htmlchars($row['name']); ?></a> </td> - <td><?php echo $row['username']; ?></td> - <td><?php echo $row['isactive']?__('Active'):'<b>'.__('Locked').'</b>'; ?> <?php echo $row['onvacation']?'<small>(<i>'.__('vacation').'</i>)</small>':''; ?></td> - <td><a href="groups.php?id=<?php echo $row['group_id']; ?>"><?php echo Format::htmlchars($row['group_name']); ?></a></td> - <td><a href="departments.php?id=<?php echo $row['dept_id']; ?>"><?php echo Format::htmlchars($row['dept']); ?></a></td> - <td><?php echo Format::date($row['created']); ?></td> - <td><?php echo Format::datetime($row['lastlogin']); ?> </td> + <input type="checkbox" class="ckb" name="ids[]" + value="<?php echo $id; ?>" <?php echo $sel ? 'checked="checked"' : ''; ?> > + <td><a href="staff.php?id=<?php echo $id; ?>"><?php echo + Format::htmlchars($agent->getName()); ?></a> </td> + <td><?php echo $agent->getUserName(); ?></td> + <td><?php echo $agent->isActive() ? __('Active') :'<b>'.__('Locked').'</b>'; ?> <?php + echo $agent->onvacation ? '<small>(<i>'.__('vacation').'</i>)</small>' : ''; ?></td> + <td><a href="groups.php?id=<?php echo $agent->getGroupId(); ?>"><?php + echo Format::htmlchars('FIXME'/*$agent->group->getName()*/); ?></a></td> + <td><a href="departments.php?id=<?php echo + $agent->getDeptId(); ?>"><?php + echo Format::htmlchars((string) $agent->dept); ?></a></td> + <td><?php echo Format::date($agent->created); ?></td> + <td><?php echo Format::datetime($agent->lastlogin); ?> </td> </tr> <?php - } //end of while. + } //end of foreach endif; ?> <tfoot> <tr> <td colspan="8"> - <?php if($res && $num){ ?> + <?php if ($count) { ?> <?php echo __('Select');?>: <a id="selectAll" href="#ckb"><?php echo __('All');?></a> <a id="selectNone" href="#ckb"><?php echo __('None');?></a> @@ -172,7 +183,7 @@ else </tfoot> </table> <?php -if($res && $num): //Show options.. +if ($count): //Show options.. echo '<div> '.__('Page').':'.$pageNav->getPageLinks().' </div>'; ?> <p class="centered" id="actions"> diff --git a/scp/staff.php b/scp/staff.php index 384af7df0771efdeafd05a8684aa03114950b899..17a106e93c41cbe16da59755ffb0b7fdefd9563b 100644 --- a/scp/staff.php +++ b/scp/staff.php @@ -52,10 +52,13 @@ if($_POST){ $count=count($_POST['ids']); switch(strtolower($_POST['a'])) { case 'enable': - $sql='UPDATE '.STAFF_TABLE.' SET isactive=1 ' - .' WHERE staff_id IN ('.implode(',', db_input($_POST['ids'])).')'; + $num = Staff::objects()->filter(array( + 'staff_id__in' => $_POST['ids'] + ))->update(array( + 'isactive' => 1 + )); - if(db_query($sql) && ($num=db_affected_rows())) { + if ($num) { if($num==$count) $msg = sprintf('Successfully activated %s', _N('selected agent', 'selected agents', $count)); @@ -68,10 +71,13 @@ if($_POST){ } break; case 'disable': - $sql='UPDATE '.STAFF_TABLE.' SET isactive=0 ' - .' WHERE staff_id IN ('.implode(',', db_input($_POST['ids'])).') AND staff_id!='.db_input($thisstaff->getId()); + $num = Staff::objects()->filter(array( + 'staff_id__in' => $_POST['ids'] + ))->update(array( + 'isactive' => 0 + )); - if(db_query($sql) && ($num=db_affected_rows())) { + if ($num) { if($num==$count) $msg = sprintf('Successfully disabled %s', _N('selected agent', 'selected agents', $count)); @@ -84,6 +90,7 @@ if($_POST){ } break; case 'delete': + $i = 0; foreach($_POST['ids'] as $k=>$v) { if($v!=$thisstaff->getId() && ($s=Staff::lookup($v)) && $s->delete()) $i++;