Copyright (c) 2006-2010 osTicket http://www.osticket.com Released under the GNU General Public License WITHOUT ANY WARRANTY. See LICENSE.TXT for details. vim: expandtab sw=4 ts=4 sts=4: $Id: $ **********************************************************************/ require('staff.inc.php'); require_once(INCLUDE_DIR.'class.ticket.php'); require_once(INCLUDE_DIR.'class.dept.php'); require_once(INCLUDE_DIR.'class.banlist.php'); $page=''; $ticket=null; //clean start. //LOCKDOWN...See if the id provided is actually valid and if the user has access. if(!$errors && ($id=$_REQUEST['id']?$_REQUEST['id']:$_POST['ticket_id']) && is_numeric($id)) { $deptID=0; $ticket= new Ticket($id); if(!$ticket or !$ticket->getDeptId()) $errors['err']='Unbekannte Ticket ID#'.$id; //Sucker...invalid id elseif(!$thisuser->isAdmin() && (!$thisuser->canAccessDept($ticket->getDeptId()) && $thisuser->getId()!=$ticket->getStaffId())) $errors['err']='Zugriff verweigert. Denken Sie, dass dies ein Fehler ist, kontaktieren Sie den Administrator'; if(!$errors && $ticket->getId()==$id) $page='viewticket.inc.php'; //Default - view if(!$errors && $_REQUEST['a']=='edit') { //If it's an edit check permission. if($thisuser->canEditTickets() || ($thisuser->isManager() && $ticket->getDeptId()==$thisuser->getDeptId())) $page='editticket.inc.php'; else $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt das Ticket zu ändern. Denken Sie, dass dies ein Fehler ist, kontaktieren Sie den Administrator'; } }elseif($_REQUEST['a']=='open') { //TODO: Check perm here.. $page='newticket.inc.php'; } //At this stage we know the access status. we can process the post. if($_POST && !$errors): if($ticket && $ticket->getId()) { //More tea please. $errors=array(); $lock=$ticket->getLock(); //Ticket lock if any $statusKeys=array('open'=>'Offen','Reopen'=>'Offen','Close'=>'Geschlossen'); switch(strtolower($_POST['a'])): case 'reply': $fields=array(); $fields['msg_id'] = array('type'=>'int', 'required'=>1, 'error'=>'Nachrichten-ID fehlt'); $fields['response'] = array('type'=>'text', 'required'=>1, 'error'=>'Antwort erforderlich'); $params = new Validator($fields); if(!$params->validate($_POST)){ $errors=array_merge($errors,$params->errors()); } //Use locks to avoid double replies if($lock && $lock->getStaffId()!=$thisuser->getId()) $errors['err']='Aktion verweigert. Ticket ist durch jemand anderen gesperrt!'; //Check attachments restrictions. if($_FILES['attachment'] && $_FILES['attachment']['size']) { if(!$_FILES['attachment']['name'] || !$_FILES['attachment']['tmp_name']) $errors['attachment']='Ungültiger Anhang'; elseif(!$cfg->canUploadFiles()) //TODO: saved vs emailed attachments...admin config?? $errors['attachment']='Ungültige Verzeichnis. Administrator kontaktieren.'; elseif(!$cfg->canUploadFileType($_FILES['attachment']['name'])) $errors['attachment']='Ungültiger Dateityp'; } //Make sure the email is not banned if(!$errors && BanList::isbanned($ticket->getEmail())) $errors['err']='Email befindet sich auf der Sperrliste. Bitte erst enfernen um zu antworten.'; //If no error...do the do. if(!$errors && ($respId=$ticket->postResponse($_POST['msg_id'],$_POST['response'],$_POST['signature'],$_FILES['attachment']))){ $msg='Antwort erfolgreich erstellt'; //Set status if any. $wasOpen=$ticket->isOpen(); if(isset($_POST['ticket_status']) && $_POST['ticket_status']) { if($ticket->setStatus($_POST['ticket_status']) && $ticket->reload()) { $note=sprintf('%s %s das Ticket von ',$thisuser->getName(),$ticket->isOpen()?'wieder geöffnet':'geschlossen'); $ticket->logActivity('Ticketstatus wurde geändert auf '.($ticket->isOpen()?'Offen':'Geschlossen'),$note); } } //Finally upload attachment if any if($_FILES['attachment'] && $_FILES['attachment']['size']){ $ticket->uploadAttachment($_FILES['attachment'],$respId,'R'); } $ticket->reload(); //Mark the ticket answered if OPEN. if($ticket->isopen()){ $ticket->markAnswered(); }elseif($wasOpen) { //Closed on response??? $page=$ticket=null; //Going back to main listing. } }elseif(!$errors['err']){ $errors['err']='Senden der Anwort war nicht möglich.'; } break; case 'transfer': $fields=array(); $fields['dept_id'] = array('type'=>'int', 'required'=>1, 'error'=>'Abteilung wählen'); $fields['message'] = array('type'=>'text', 'required'=>1, 'error'=>'Notiz/Nachricht erforderlich'); $params = new Validator($fields); if(!$params->validate($_POST)){ $errors=array_merge($errors,$params->errors()); } if(!$errors && ($_POST['dept_id']==$ticket->getDeptId())) $errors['dept_id']='Ticket befindet sich bereit in dieser Abteilung.'; if(!$errors && !$thisuser->canTransferTickets()) $errors['err']='Aktion verweigert. Sie sind nicht berechtigt Tickets zuzuweisen.'; if(!$errors && $ticket->transfer($_POST['dept_id'])){ $olddept=$ticket->getDeptName(); $ticket->reload(); //dept manager changed! //Send out alerts?? - for now yes....part of internal note! $title='Abteilungszuweisung von '.$olddept.' zur '.$ticket->getDeptName(); $ticket->postNote($title,$_POST['message']); $msg='Ticket erfolgreich zu der Abteilung '.$ticket->getDeptName().' verschoben'; if(!$thisuser->canAccessDept($_POST['dept_id']) && $ticket->getStaffId()!=$thisuser->getId()) { //Check access. //Staff doesn't have access to the new department. $page='tickets.inc.php'; $ticket=null; } }elseif(!$errors['err']){ $errors['err']='Zuweisung konnte nicht abgeschlossen werden.'; } break; case 'assign': $fields=array(); $fields['staffId'] = array('type'=>'int', 'required'=>1, 'error'=>'Bitte zuweisen'); $fields['assign_message'] = array('type'=>'text', 'required'=>1, 'error'=>'Nachricht erforderlich'); $params = new Validator($fields); if(!$params->validate($_POST)){ $errors=array_merge($errors,$params->errors()); } if(!$errors && $ticket->isAssigned()){ if($_POST['staffId']==$ticket->getStaffId()) $errors['staffId']='Ticket ist bereits dem Mitarbeiter zugewiessen.'; } //if already assigned. if(!$errors && $ticket->isAssigned()) { //Re assigning. //Already assigned to the user? if($_POST['staffId']==$ticket->getStaffId()) $errors['staffId']='Ticket ist bereits dem Mitarbeiter zugewiessen.'; //Admin, Dept manager (any) or current assigneee ONLY can reassign if(!$thisuser->isadmin() && !$thisuser->isManager() && $thisuser->getId()!=$ticket->getStaffId()) $errors['err']='Ticket ist bereits zugewiesen. Sie sind nicht berechtigt zugewiesene Ticket neu zuzuweisen.'; } if(!$errors && $ticket->assignStaff($_POST['staffId'],$_POST['assign_message'])){ $staff=$ticket->getStaff(); $msg='Ticket an '.($staff?$staff->getName():'staff').' zugewiesen'; //Remove all the logs and go back to index page. TicketLock::removeStaffLocks($thisuser->getId(),$ticket->getId()); $page='tickets.inc.php'; $ticket=null; }elseif(!$errors['err']) { $errors['err']='Ticketzuweisung nicht möglich'; } break; case 'postnote': $fields=array(); $fields['title'] = array('type'=>'string', 'required'=>1, 'error'=>'Titel erforderlich'); $fields['note'] = array('type'=>'string', 'required'=>1, 'error'=>'Notiz erforderlich'); $params = new Validator($fields); if(!$params->validate($_POST)) $errors=array_merge($errors,$params->errors()); if(!$errors && $ticket->postNote($_POST['title'],$_POST['note'])){ $msg='Interne Notiz erstellt'; if(isset($_POST['ticket_status']) && $_POST['ticket_status']){ if($ticket->setStatus($_POST['ticket_status']) && $ticket->reload()){ $msg.=' und Status gesetzt auf '.($ticket->isClosed()?'geschlossen':'offen'); if($ticket->isClosed()) $page=$ticket=null; //Going back to main listing. } } }elseif(!$errors['err']) { $errors['err']='Fehler aufgetreten. Notiz erstellen nicht möglich.'; } break; case 'update': $page='editticket.inc.php'; if(!$ticket || !$thisuser->canEditTickets()) $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Tickets zu bearbeiten'; elseif($ticket->update($_POST,$errors)){ $msg='Ticket erfolgreich geändert'; $page='viewticket.inc.php'; }elseif(!$errors['err']) { $errors['err']='Fehler aufgetreten! Bitte nochmals versuchen.'; } break; case 'process': $isdeptmanager=($ticket->getDeptId()==$thisuser->getDeptId())?true:false; switch(strtolower($_POST['do'])): case 'change_priority': if(!$thisuser->canManageTickets() && !$thisuser->isManager()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt die Priorität der Tickets zu ändern.'; }elseif(!$_POST['ticket_priority'] or !is_numeric($_POST['ticket_priority'])){ $errors['err']='Sie müssen eine Priorität wählen'; } if(!$errors){ if($ticket->setPriority($_POST['ticket_priority'])){ $msg='Priorität erfolgreich geändert'; $ticket->reload(); $note='Ticketpriorität wurde geändert auf "'.$ticket->getPriority().'" durch '.$thisuser->getName(); $ticket->logActivity('Priorität geändert',$note); }else{ $errors['err']='Probleme beim Ändern der Priorität. Bitte nochmals versuchen.'; } } break; case 'close': if(!$thisuser->isadmin() && !$thisuser->canCloseTickets()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Tickets zu schlieβen.'; }else{ if($ticket->close()){ $msg='Ticket #'.$ticket->getExtId().' wurde GESCHLOSSEN'; $note='Ticket wurde mit einer Nachricht geschlossen von '.$thisuser->getName(); $ticket->logActivity('Ticket geschlossen',$note); $page=$ticket=null; //Going back to main listing. }else{ $errors['err']='Probleme beim Schlieβen des Ticket. Bitte nochmals versuchen.'; } } break; case 'reopen': //if they can close...then assume they can reopen. if(!$thisuser->isadmin() && !$thisuser->canCloseTickets()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Tickets wieder zu öffnen.'; }else{ if($ticket->reopen()){ $msg='Ticketstatus wurde auf OFFEN gesetzt'; $note='Ticket wieder geöffnet (ohne Kommentare)'; if($_POST['ticket_priority']) { $ticket->setPriority($_POST['ticket_priority']); $ticket->reload(); $note.=' und Prirität gesetzt auf '.$ticket->getPriority(); } $note.=' durch '.$thisuser->getName(); $ticket->logActivity('Ticket wieder geöffnet',$note); }else{ $errors['err']='Probleme bei Wiedereröffnen des Tickets. Bitte nochmals versuchen.'; } } break; case 'release': if(!($staff=$ticket->getStaff())) $errors['err']='Ticket ist ist nicht zugewiesen!'; elseif($ticket->release()) { $msg='Ticket freigegeben (nicht zugewiesen) durch '.$staff->getName().' von '.$thisuser->getName(); $ticket->logActivity('Ticket nicht zugewiesen',$msg); }else $errors['err']='Probleme beim Freigeben des Tickets. Bitte nochmals versuchen'; break; case 'overdue': //Mark the ticket as overdue if(!$thisuser->isadmin() && !$thisuser->isManager()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Ticket auf Überfällig zu setzen.'; }else{ if($ticket->markOverdue()){ $msg='Ticket ist als überfällig markiert'; $note=$msg; if($_POST['ticket_priority']) { $ticket->setPriority($_POST['ticket_priority']); $ticket->reload(); $note.=' und Status gesetzt auf '.$ticket->getPriority(); } $note.=' von '.$thisuser->getName(); $ticket->logActivity('Ticket als Überfällig markiert',$note); }else{ $errors['err']='Probleme beim markieren als Überfällig. Bitte nochmals versuchen'; } } break; case 'banemail': if(!$thisuser->isadmin() && !$thisuser->canManageBanList()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Emails zur Sperrliste hinzuzufügen'; }elseif(Banlist::add($ticket->getEmail(),$thisuser->getName())){ $msg='Email ('.$ticket->getEmail().') zur Sperrliste hinzugefüt'; if($ticket->isOpen() && $ticket->close()) { $msg.=' & Ticketstatus auf geschlossen gesetzt'; $ticket->logActivity('Ticket geschlossen',$msg); $page=$ticket=null; //Going back to main listing. } }else{ $errors['err']='Hinzufügen zur Sperrliste nicht möglich'; } break; case 'unbanemail': if(!$thisuser->isadmin() && !$thisuser->canManageBanList()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Email-Adressen von der Sperrliste zu entfernen.'; }elseif(Banlist::remove($ticket->getEmail())){ $msg='Email von Sperrliste entfernt'; }else{ $errors['err']='Entfernen von Sperrliste nicht möglich. Bitte nochmals versuchen.'; } break; case 'delete': // Dude what are you trying to hide? bad customer support?? if(!$thisuser->isadmin() && !$thisuser->canDeleteTickets()){ $errors['err']='Zugriff verweigert. Sie sind nicht berechtigt Tickets zu löschen!'; }else{ if($ticket->delete()){ $page='tickets.inc.php'; //ticket is gone...go back to the listing. $msg='Ticket FÜR IMMER gelöscht'; $ticket=null; //clear the object. }else{ $errors['err']='Probleme bei Löschen des Tickets. Bitte nochmals versuchen'; } } break; default: $errors['err']='Sie müssen eine Aktion auswählen um fortzufahren'; endswitch; break; default: $errors['err']='Unbekannte Aktion'; endswitch; if($ticket && is_object($ticket)) $ticket->reload();//Reload ticket info following post processing }elseif($_POST['a']) { switch($_POST['a']) { case 'mass_process': if(!$thisuser->canManageTickets()) $errors['err']='Sie haben keine Berechtigung mehrere Tickets gleichzeitig zu verwalten. Kontaktieren Sie bitte den Administrator um dieses Recht zu erhalten.'; elseif(!$_POST['tids'] || !is_array($_POST['tids'])) $errors['err']='Keine Tickets ausgewählt. Sie müssen mindestens ein Ticket auswählen.'; elseif(($_POST['reopen'] || $_POST['close']) && !$thisuser->canCloseTickets()) $errors['err']='Sie haben keine Berechtigung Tickets zu schlieβen oder wieder zu eröffnen.'; elseif($_POST['delete'] && !$thisuser->canDeleteTickets()) $errors['err']='Sie haben keine Berechtigung Tickets zu löschen'; elseif(!$_POST['tids'] || !is_array($_POST['tids'])) $errors['err']='Sie müssen mindestens ein Ticket auswählen'; if(!$errors) { $count=count($_POST['tids']); if(isset($_POST['reopen'])){ $i=0; $note='Ticket wieder geöffnet durch '.$thisuser->getName(); foreach($_POST['tids'] as $k=>$v) { $t = new Ticket($v); if($t && @$t->reopen()) { $i++; $t->logActivity('Ticket wieder geöffnet',$note,false,'System'); } } $msg="$i von $count gewählten Tickets wieder geöffnet"; }elseif(isset($_POST['close'])){ $i=0; $note='Ticket ohne Antwort geschlossen durch '.$thisuser->getName(); foreach($_POST['tids'] as $k=>$v) { $t = new Ticket($v); if($t && @$t->close()){ $i++; $t->logActivity('Ticket geschlossen',$note,false,'System'); } } $msg="$i von $count gewählten Tickets geschlossen"; }elseif(isset($_POST['overdue'])){ $i=0; $note='Ticket als überfällig markiert durch '.$thisuser->getName(); foreach($_POST['tids'] as $k=>$v) { $t = new Ticket($v); if($t && !$t->isoverdue()) if($t->markOverdue()) { $i++; $t->logActivity('Ticket als Überfällig markiert',$note,false,'System'); } } $msg="$i von $count gewählten Tickets als überfällig markiert"; }elseif(isset($_POST['delete'])){ $i=0; foreach($_POST['tids'] as $k=>$v) { $t = new Ticket($v); if($t && @$t->delete()) $i++; } $msg="$i von $count gewählten Tickets gelöscht"; } } break; case 'open': $ticket=null; //TODO: check if the user is allowed to create a ticet. if(($ticket=Ticket::create_by_staff($_POST,$errors))) { $ticket->reload(); $msg='Ticket erfolgreich erstellt'; if($thisuser->canAccessDept($ticket->getDeptId()) || $ticket->getStaffId()==$thisuser->getId()) { //View the sucker $page='viewticket.inc.php'; }else { //Staff doesn't have access to the newly created ticket's department. $page='tickets.inc.php'; $ticket=null; } }elseif(!$errors['err']) { $errors['err']='Erstellung des Tickets nicht möglich. Beheben sie die Fehler und versuchen es erneut.'; } break; } } $crap=''; endif; //Navigation $submenu=array(); /*quick stats...*/ $sql='SELECT count(open.ticket_id) as open, count(answered.ticket_id) as answered '. ',count(overdue.ticket_id) as overdue, count(assigned.ticket_id) as assigned '. ' FROM '.TICKET_TABLE.' ticket '. 'LEFT JOIN '.TICKET_TABLE.' open ON open.ticket_id=ticket.ticket_id AND open.status=\'open\' AND open.isanswered=0 '. 'LEFT JOIN '.TICKET_TABLE.' answered ON answered.ticket_id=ticket.ticket_id AND answered.status=\'open\' AND answered.isanswered=1 '. 'LEFT JOIN '.TICKET_TABLE.' overdue ON overdue.ticket_id=ticket.ticket_id AND overdue.status=\'open\' AND overdue.isoverdue=1 '. 'LEFT JOIN '.TICKET_TABLE.' assigned ON assigned.ticket_id=ticket.ticket_id AND assigned.staff_id='.db_input($thisuser->getId()); if(!$thisuser->isAdmin()){ $sql.=' WHERE ticket.dept_id IN('.implode(',',$thisuser->getDepts()).') OR ticket.staff_id='.db_input($thisuser->getId()); } //echo $sql; $stats=db_fetch_array(db_query($sql)); //print_r($stats); $nav->setTabActive('tickets'); if($cfg->showAnsweredTickets()) { $nav->addSubMenu(array('desc'=>'Offen ('.($stats['open']+$stats['answered']).')','title'=>'Offene Tickets', 'href'=>'tickets.php', 'iconclass'=>'Ticket')); }else{ if($stats['open']) $nav->addSubMenu(array('desc'=>'Offen ('.$stats['open'].')','title'=>'Offene Tickets', 'href'=>'tickets.php', 'iconclass'=>'Ticket')); if($stats['answered']) { $nav->addSubMenu(array('desc'=>'Beantwortet ('.$stats['answered'].')','title'=>'Beantwortete Tickets', 'href'=>'tickets.php?status=answered', 'iconclass'=>'answeredTickets')); } } if($stats['assigned']) { if(!$sysnotice && $stats['assigned']>10) $sysnotice=$stats['assigned'].' Ihnen zugewiesen!'; $nav->addSubMenu(array('desc'=>'Zugewiesen ('.$stats['assigned'].')','title'=>'Mir zugewiesene Tickets','href'=>'tickets.php?status=assigned','iconclass'=>'assignedTickets')); } if($stats['overdue']) { $nav->addSubMenu(array('desc'=>'Überfällig ('.$stats['overdue'].')','title'=>'Überfälligene Tickets', 'href'=>'tickets.php?status=overdue','iconclass'=>'overdueTickets')); if(!$sysnotice && $stats['overdue']>10) $sysnotice=$stats['overdue'] .' überfällige Tickets!'; } $nav->addSubMenu(array('desc'=>'Geschlossen','title'=>'Geschlossene Tickets', 'href'=>'tickets.php?status=closed', 'iconclass'=>'closedTickets')); if($thisuser->canCreateTickets()) { $nav->addSubMenu(array('desc'=>'Neues Ticket','href'=>'tickets.php?a=open','iconclass'=>'newTicket')); } //Render the page... $inc=$page?$page:'tickets.inc.php'; //If we're on tickets page...set refresh rate if the user has it configured. No refresh on search and POST to avoid repost. if(!$_POST && $_REQUEST['a']!='search' && !strcmp($inc,'tickets.inc.php') && ($min=$thisuser->getRefreshRate())){ define('AUTO_REFRESH',1); } require_once(STAFFINC_DIR.'header.inc.php'); require_once(STAFFINC_DIR.$inc); require_once(STAFFINC_DIR.'footer.inc.php'); ?>