Viewing File core/request/RequestManager.php of 0.00.3a
|
1: <?php 2: /* ------------------------------------------------------------- 3: This file is part of FreeDESK 4: 5: FreeDESK is (C) Copyright 2012 David Cutting 6: 7: FreeDESK is free software: you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation, either version 3 of the License, or 10: (at your option) any later version. 11: 12: FreeDESK is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with FreeDESK. If not, see www.gnu.org/licenses 19: 20: For more information see www.purplepixie.org/freedesk/ 21: -------------------------------------------------------------- */ 22: 23: /** 24: * Request Manager - handle all management of requests 25: **/ 26: class RequestManager 27: { 28: /** 29: * FreeDESK instance 30: **/ 31: private $DESK = null; 32: 33: /** 34: * Team List 35: **/ 36: private $Teams = null; 37: 38: /** 39: * User List (Assignment) 40: **/ 41: private $Users = null; 42: 43: /** 44: * Request classes list 45: **/ 46: private $ClassList = null; 47: 48: /** 49: * Constructor 50: * @param mixed &$freeDESK FreeDESK instance 51: **/ 52: function RequestManager(&$freeDESK) 53: { 54: $this->DESK=&$freeDESK; 55: $this->DESK->PluginManager->Register(new Plugin( 56: "Request Manager", "0.01", "Core" )); 57: // Register our permissions 58: $this->DESK->PermissionManager->Register("request_view_otherteam",false); 59: $this->DESK->PermissionManager->Register("request_view_otherteamuser",false); 60: $this->DESK->PermissionManager->Register("request_view_otheruser",false); 61: $this->DESK->PermissionManager->Register("request_view_unassigned",false); 62: $this->DESK->PermissionManager->Register("request_assign_otherteam",false); 63: $this->DESK->PermissionManager->Register("request_assign_otherteamuser",false); 64: $this->DESK->PermissionManager->Register("request_assign_otheruser",false); 65: $this->DESK->PermissionManager->Register("request_assign_unassigned",false); 66: 67: } 68: 69: /** 70: * Team and User List (Assignment and View List) 71: * @return array Mixed array with teams and users with view and assign flags 72: **/ 73: function TeamUserList() 74: { 75: $out = array(); 76: 77: $this->Users = array(); 78: $this->Teams = array(); 79: 80: $q="SELECT ".$this->DESK->Database->Field("username").",".$this->DESK->Database->Field("realname")." FROM ".$this->DESK->Database->Table("user"); 81: $r=$this->DESK->Database->Query($q); 82: $users=array(); 83: while($row=$this->DESK->Database->FetchAssoc($r)) 84: { 85: $users[$row['username']] = $row['realname']; 86: $this->Users[$row['username']] = $row['realname']; 87: } 88: $this->DESK->Database->Free($r); 89: 90: $q="SELECT * FROM ".$this->DESK->Database->Table("team"); 91: $r=$this->DESK->Database->Query($q); 92: $team=array(); 93: while($row=$this->DESK->Database->FetchAssoc($r)) 94: { 95: $team[$row['teamid']]=$row['teamname']; 96: $this->Teams[$row['teamid']]=$row['teamname']; 97: } 98: 99: $q="SELECT * FROM ".$this->DESK->Database->Table("teamuserlink"); 100: $r=$this->DESK->Database->Query($q); 101: $teamlink=array(); 102: while($row=$this->DESK->Database->FetchAssoc($r)) 103: { 104: if (isset($teamlink[$row['teamid']])) 105: $teamlink[$row['teamid']][]=$row['username']; 106: else 107: $teamlink[$row['teamid']]=array( $row['username'] ); 108: } 109: 110: 111: $pRvOtherTeam = $this->DESK->ContextManager->Permission("request_view_otherteam"); 112: $pRvOtherTeamUser = $this->DESK->ContextManager->Permission("request_view_otherteamuser"); 113: $pRvOtherUser = $this->DESK->ContextManager->Permission("request_view_otheruser"); 114: $pRvUnassigned = $this->DESK->ContextManager->Permission("request_view_unassigned"); 115: 116: $pRaOtherTeam = $this->DESK->ContextManager->Permission("request_assign_otherteam"); 117: $pRaOtherTeamUser = $this->DESK->ContextManager->Permission("request_assign_otherteamuser"); 118: $pRaOtherUser = $this->DESK->ContextManager->Permission("request_assign_otheruser"); 119: $pRaUnassigned = $this->DESK->ContextManager->Permission("request_assign_unassigned"); 120: 121: $out[0]=array( 122: "name" => "Unassigned", 123: "id" => 0, 124: "team" => true, 125: "assign" => $pRaUnassigned, 126: "view" => $pRvUnassigned, 127: "items" => array() ); 128: 129: foreach($team as $teamid => $teamname) 130: { 131: $userInTeam = $this->IsUserInTeam($this->DESK->ContextManager->Session->username, $teamid); 132: 133: $assign = ($userInTeam || $pRaOtherTeam) ? true : false; 134: $view = ($userInTeam || $pRvOtherTeam) ? true : false; 135: 136: $out[$teamid]=array( 137: "name" => $teamname, 138: "id" => $teamid, 139: "team" => true, 140: "assign" => $assign, 141: "view" => $view, 142: "items" => array() ); 143: 144: if (isset($teamlink[$teamid])) 145: { 146: 147: foreach($teamlink[$teamid] as $username) 148: { 149: $assign = ($userInTeam || $pRaOtherTeamUser) ? true : false; 150: $view = ($userInTeam || $pRvOtherTeamUser) ? true : false; 151: 152: $out[$teamid]["items"][$username] = array ( 153: "username" => $username, 154: "realname" => $users[$username], 155: "assign" => $assign, 156: "view" => $view ); 157: } 158: } 159: } 160: 161: $out['allusers']=array( 162: "name" => "All Users", 163: "id" => 0, 164: "team" => false, 165: "assign" => false, 166: "view" => false, 167: "items" => array() ); 168: foreach($users as $username => $realname) 169: { 170: $assign = ($this->DESK->ContextManager->Session->username == $username || $pRaOtherUser) ? true : false; 171: $view = ($this->DESK->ContextManager->Session->username == $username || $pRvOtherUser) ? true : false; 172: 173: $out['allusers']['items'][$username] = array( 174: "username" => $username, 175: "realname" => $realname, 176: "assign" => $assign, 177: "view" => $view ); 178: } 179: 180: return $out; 181: } 182: 183: /** 184: * Return a list of possible request statuses 185: * @return array Status list 186: **/ 187: function StatusList() 188: { 189: $q="SELECT * FROM ".$this->DESK->Database->Table("status"); 190: $q.=" ORDER BY ".$this->DESK->Database->Field("status")." DESC"; 191: $r=$this->DESK->Database->Query($q); 192: $out=array(); 193: while ($row=$this->DESK->Database->FetchAssoc($r)) 194: { 195: $out[$row['status']]=$row['description']; 196: } 197: $this->DESK->Database->Free($r); 198: return $out; 199: } 200: 201: /** 202: * Fetch a request by ID 203: * @param int $request Request ID 204: * @return mixed bool false if request not found or Request-type class on success 205: **/ 206: function Fetch($request) 207: { 208: $q="SELECT * FROM ".$this->DESK->Database->Table("request")." WHERE "; 209: $q.=$this->DESK->Database->Field("requestid")."=".$this->DESK->Database->Safe($request); 210: $r=$this->DESK->Database->Query($q); 211: if ($row=$this->DESK->Database->FetchAssoc($r)) 212: { 213: $req = $this->CreateByID($row['class']); 214: $req->ID = $row['requestid']; 215: foreach($row as $key => $val) 216: $req->Set($key, $val); 217: $assign=""; 218: if ($row['assignteam']!=0) 219: { 220: $teams = $this->TeamList(); 221: $assign.=$teams[$row['assignteam']]; 222: } 223: if ($row['assignuser']!="") 224: { 225: if ($assign!="") 226: $assign.=" - "; 227: $users = $this->UserList(); 228: $assign.=$users[$row['assignuser']]; 229: } 230: if ($row['assignteam']==0 && $row['assignuser']=="") 231: $assign=$this->DESK->Lang->Get("unassigned"); 232: $req->Set("assigned",$assign); 233: 234: $cq="SELECT ".$this->DESK->Database->Field("firstname").",".$this->DESK->Database->Field("lastname"); 235: $cq.=" FROM ".$this->DESK->Database->Table("customer")." "; 236: $cq.="WHERE ".$this->DESK->Database->Field("customerid")."=".$this->DESK->Database->Safe($row['customer']); 237: $cq.=" LIMIT 0,1"; 238: $cr=$this->DESK->Database->Query($cq); 239: $req->Set("customerid",$row['customer']); 240: if ($cust=$this->DESK->Database->FetchAssoc($cr)) 241: { 242: $req->Set("customer",$cust['firstname']." ".$cust['lastname']); 243: } 244: else 245: $req->Set("customer","Unknown (".$row['customer'].")"); 246: $this->DESK->Database->Free($cr); 247: 248: return $req; 249: } 250: else 251: return false; 252: } 253: 254: /** 255: * Fetch a request assignment list 256: * @param int $teamid Assigned team (optional, default 0) 257: * @param string $username Assigned username (optional, default "") 258: * @param string $sort Field to sort on 259: * @param string $order Order (ASC or DESC) 260: * @return mixed array of requests matching 261: **/ 262: function FetchAssigned($teamid=0, $username="", $sort="", $order="") 263: { 264: // assignteam assignuser 265: $q="SELECT ".$this->DESK->Database->Field("requestid")." FROM ".$this->DESK->Database->Table("request")." WHERE "; 266: 267: 268: if ( ($teamid==0) && ($username!="") ) // assigned to a user for any team 269: $q.=$this->DESK->Database->Field("assignuser")."=".$this->DESK->Database->SafeQuote($username); 270: else // use both 271: { 272: $q.=$this->DESK->Database->Field("assignuser")."=".$this->DESK->Database->SafeQuote($username)." AND "; 273: $q.=$this->DESK->Database->Field("assignteam")."=".$this->DESK->Database->Safe($teamid); 274: } 275: 276: $q.=" AND ".$this->DESK->Database->Field("status").">0"; 277: 278: if ($sort != "" && $sort != "assigned" && $sort != "customer") 279: { 280: $q.=" ORDER BY ".$this->DESK->Database->Field($sort)." "; 281: if ($order == "ASC") 282: $q.="ASC"; 283: else 284: $q.="DESC"; 285: } 286: else if ($sort == "assigned") 287: { 288: if ($order == "ASC") 289: $o="ASC"; 290: else 291: $o="DESC"; 292: $q.=" ORDER BY ".$this->DESK->Database->Field("assignteam")." ".$o.","; 293: $q.=$this->DESK->Database->Field("assignuser")." ".$o; 294: } 295: else if ($sort == "customer") 296: { 297: if ($order == "ASC") 298: $o="ASC"; 299: else 300: $o="DESC"; 301: $q.=" ORDER BY ".$this->DESK->Database->Field("customer")." ".$o; 302: } 303: 304: $out=array(); 305: $r=$this->DESK->Database->Query($q); 306: while ($row=$this->DESK->Database->FetchAssoc($r)) 307: { 308: $out[]=$this->Fetch($row['requestid']); 309: } 310: return $out; 311: } 312: 313: /** 314: * Fetch an array of request fields for the main list display with their default display options 315: * @return array of request fields 316: **/ 317: function FetchFields() 318: { 319: $out = array( 320: "requestid" => array("Request ID", 1), 321: "customer" => array("Customer", 1), 322: "assigned" => array("Assigned To", 1), 323: "openeddt" => array("Opened", 0), 324: "class" => array("Class", 0), 325: "priority" => array("Priority", 1), 326: "status" => array("Status", 1) ); 327: return $out; 328: } 329: 330: /** 331: * Fetch a list of users in form username=>realname 332: * @return array User list 333: **/ 334: function UserList() 335: { 336: if (!is_array($this->Users)) 337: $this->TeamUserList(); 338: return $this->Users; 339: } 340: 341: /** 342: * Fetch a list of teams in form teamid=>teamname 343: * @return array Team List 344: **/ 345: function TeamList() 346: { 347: if (!is_array($this->Teams)) 348: $this->TeamUserList(); 349: return $this->Teams; 350: } 351: 352: /** 353: * Determine is a user is in a team 354: * @param string $username Username 355: * @param int $teamid Team ID 356: * @return bool True if user is in team else false 357: **/ 358: function IsUserInTeam($username, $teamid) 359: { 360: $q="SELECT ".$this->DESK->Database->Field("linkid")." FROM "; 361: $q.=$this->DESK->Database->Table("teamuserlink")." WHERE "; 362: $q.=$this->DESK->Database->Field("teamid")."=".$this->DESK->Database->Safe($teamid)." AND "; 363: $q.=$this->DESK->Database->Field("username")."=".$this->DESK->Database->SafeQuote($username); 364: $q.=" LIMIT 0,1"; 365: 366: $r=$this->DESK->Database->Query($q); 367: 368: $inteam=false; 369: 370: if ($row=$this->DESK->Database->FetchAssoc($r)) 371: $inteam=true; 372: 373: $this->DESK->Database->Free($r); 374: 375: return $inteam; 376: } 377: 378: /** 379: * Load a class list 380: **/ 381: private function LoadClassList() 382: { 383: $q="SELECT * FROM ".$this->DESK->Database->Table("requestclass"); 384: $r=$this->DESK->Database->Query($q); 385: $this->ClassList = array(); 386: while ($row=$this->DESK->Database->FetchAssoc($r)) 387: { 388: $this->ClassList[$row['classid']] = $row; 389: } 390: $this->DESK->Database->Free($r); 391: } 392: 393: /** 394: * Create a request by classid 395: * @param int $classid Class ID 396: * @return object Request object 397: **/ 398: function CreateByID($classid) 399: { 400: if ($this->ClassList == null) 401: $this->LoadClassList(); 402: 403: if (isset($this->ClassList[$classid])) 404: return RequestFactory::Create($this->DESK, $this->ClassList[$classid]['classclass']); 405: else 406: return RequestFactory::Create($this->DESK, ""); 407: } 408: 409: /** 410: * Create a new team 411: * @param string $teamname Name of the team 412: **/ 413: function CreateTeam($teamname) 414: { 415: $q="INSERT INTO ".$this->DESK->Database->Table("team")."(".$this->DESK->Database->Field("teamname").") VALUES(". 416: $q.=$this->DESK->Database->SafeQuote($teamname).")"; 417: $this->DESK->Database->Query($q); 418: } 419: 420: /** 421: * Update a team name 422: * @param int $teamid ID 423: * @param string $teamname Team name 424: **/ 425: function UpdateTeam($teamid, $teamname) 426: { 427: $q="UPDATE ".$this->DESK->Database->Table("team")." SET ".$this->DESK->Database->Field("teamname")."=".$this->DESK->Database->SafeQuote($teamname); 428: $q.=" WHERE ".$this->DESK->Database->Field("teamid")."=".$this->DESK->Database->Safe($teamid); 429: $this->DESK->Database->Query($q); 430: } 431: 432: /** 433: * Delete a team 434: * @param int $teamid ID 435: **/ 436: function DeleteTeam($teamid) 437: { 438: $q="DELETE FROM ".$this->DESK->Database->Table("teamuserlink")." WHERE ".$this->DESK->Database->Field("teamid")."=".$this->DESK->Database->Safe($teamid); 439: $this->DESK->Database->Query($q); 440: 441: $q="DELETE FROM ".$this->DESK->Database->Table("team")." WHERE ".$this->DESK->Database->Field("teamid")."=".$this->DESK->Database->Safe($teamid); 442: $this->DESK->Database->Query($q); 443: } 444: 445: /** 446: * Create a new status 447: * @param string $name Status name 448: **/ 449: function CreateStatus($name) 450: { 451: $current = $this->StatusList(); 452: $high = 0; 453: foreach($current as $id => $curname) 454: if ($id > $high) 455: $high = $id; 456: $newid = $high+1; 457: 458: $q="INSERT INTO ".$this->DESK->Database->Table("status")."(".$this->DESK->Database->Field("status").",".$this->DESK->Database->Field("description").") "; 459: $q.="VALUES(".$this->DESK->Database->Safe($newid).",".$this->DESK->Database->SafeQuote($name).")"; 460: 461: $this->DESK->Database->Query($q); 462: } 463: 464: /** 465: * Update a status description 466: * @param int $id Status ID 467: * @param string $name New Name 468: **/ 469: function UpdateStatus($id, $name) 470: { 471: $q="UPDATE ".$this->DESK->Database->Table("status")." SET ".$this->DESK->Database->Field("description")."=".$this->DESK->Database->SafeQuote($name); 472: $q.=" WHERE ".$this->DESK->Database->Field("status")."=".$this->DESK->Database->Safe($id); 473: $this->DESK->Database->Query($q); 474: } 475: 476: /** 477: * Delete a status 478: * @param int $id Status ID 479: **/ 480: function DeleteStatus($id) 481: { 482: $q="DELETE FROM ".$this->DESK->Database->Table("status")." WHERE ".$this->DESK->Database->Field("status")."=".$this->DESK->Database->Safe($id); 483: $this->DESK->Database->Query($q); 484: } 485: 486: /** 487: * Get a list of all request classes 488: * @return array Request class data 489: **/ 490: function GetRequestClasses() 491: { 492: $q="SELECT * FROM ".$this->DESK->Database->Table("requestclass"); 493: $r=$this->DESK->Database->Query($q); 494: $out=array(); 495: while ($row=$this->DESK->Database->FetchAssoc($r)) 496: $out[$row['classid']]=$row; 497: $this->DESK->Database->Free($r); 498: return $out; 499: } 500: 501: /** 502: * Save/Create a Request Class 503: * @param string $classname Name 504: * @param string $classclass Class class (concrete request class) 505: * @param int $id (optional, if present will save otherwise create) 506: **/ 507: function SaveRequestClass($classname, $classclass, $id=0) 508: { 509: if ($id == 0) 510: { 511: $q="INSERT INTO ".$this->DESK->Database->Table("requestclass")."("; 512: $q.=$this->DESK->Database->Field("classname").",".$this->DESK->Database->Field("classclass").") "; 513: $q.="VALUES("; 514: $q.=$this->DESK->Database->SafeQuote($classname).",".$this->DESK->Database->SafeQuote($classclas).")"; 515: $this->DESK->Database->Query($q); 516: } 517: else 518: { 519: $q="UPDATE ".$this->DESK->Database->Table("requestclass")." SET "; 520: $q.=$this->DESK->Database->Field("classname")."=".$this->DESK->Database->SafeQuote($classname).","; 521: $q.=$this->DESK->Database->Field("classclass")."=".$this->DESK->Database->SafeQuote($classclass)." "; 522: $q.="WHERE ".$this->DESK->Database->Field("classid")."=".$this->DESK->Database->Safe($id); 523: $this->DESK->Database->Query($q); 524: } 525: } 526: 527: /** 528: * Delete a request class 529: * @param int $id Request Class ID 530: **/ 531: function DeleteRequestClass($id) 532: { 533: $q="DELETE FROM ".$this->DESK->Database->Table("requestclass")." WHERE "; 534: $q.=$this->DESK->Database->Field("classid")."=".$this->DESK->Database->Safe($id); 535: $this->DESK->Database->Query($q); 536: } 537: 538: /** 539: * Get a priority list 540: * @return array Priorities 541: **/ 542: function GetPriorityList() 543: { 544: $q="SELECT * FROM ".$this->DESK->Database->Table("priority"); 545: $r=$this->DESK->Database->Query($q); 546: $out=array(); 547: while ($row=$this->DESK->Database->FetchAssoc($r)) 548: { 549: $out[$row['priorityid']]=$row; 550: } 551: $this->DESK->Database->Free($r); 552: return $out; 553: } 554: 555: /** 556: * Save/Create a Request Priority 557: * @param string $priorityname Name 558: * @param int $resolutionsla Resolution SLA (seconds) 559: * @param int $schedule Schedule ID for SLA 560: * @param int $priorityid Priority ID (optional) 561: **/ 562: function SavePriority($priorityname, $resolutionsla, $schedule, $priorityid=0) 563: { 564: if ($priorityid == 0) 565: { 566: $q="INSERT INTO ".$this->DESK->Database->Table("priority")." ("; 567: $q.=$this->DESK->Database->Field("priorityname").",".$this->DESK->Database->Field("resolutionsla").","; 568: $q.=$this->DESK->Database->Field("schedule").") VALUES("; 569: $q.=$this->DESK->Database->SafeQuote($priorityname).",".$this->DESK->Database->Safe($resolutionsla).",".$this->DESK->Database->Safe($schedule).")"; 570: $this->DESK->Database->Query($q); 571: } 572: else 573: { 574: $q="UPDATE ".$this->DESK->Database->Table("priority")." SET "; 575: $q.=$this->DESK->Database->Field("priorityname")."=".$this->DESK->Database->SafeQuote($priorityname).","; 576: $q.=$this->DESK->Database->Field("resolutionsla")."=".$this->DESK->Database->Safe($resolutionsla).","; 577: $q.=$this->DESK->Database->Field("schedule")."=".$this->DESK->Database->Safe($schedule)." "; 578: $q.="WHERE ".$this->DESK->Database->Field("priorityid")."=".$this->DESK->Database->Safe($priorityid); 579: $this->DESK->Database->Query($q); 580: } 581: } 582: 583: /** 584: * Delete a priority 585: * @param int $priorityid Priority ID 586: **/ 587: function DeletePriority($priorityid) 588: { 589: $q="DELETE FROM ".$this->DESK->Database->Table("priority")." WHERE ".$this->DESK->Database->Field("priorityid")."=".$this->DESK->Database->Safe($priorityid); 590: $this->DESK->Database->Query($q); 591: } 592: 593: /** 594: * Search requests against parameters - no filtering 595: * @param array Search parameters (in form "field" "value" opt "match" [LIKE or =, default to =]) 596: * @return array Request list with all raw data (no class instances) 597: **/ 598: function SearchRequests($parameters) 599: { 600: $q="SELECT * FROM ".$this->DESK->Database->Table("request"); 601: if (sizeof($parameters)>0) 602: { 603: $q.=" WHERE "; 604: $first=true; 605: foreach($parameters as $param) 606: { 607: if ($first) 608: $first=false; 609: else 610: $q.=" AND "; 611: $w=$this->DESK->Database->Field($param["field"]); 612: if (isset($param["match"])) 613: $w.=" ".$param["match"]." "; 614: else 615: $w.="="; 616: $w.=$this->DESK->Database->SafeQuote($param["value"]); 617: $q.=$w; 618: } 619: } 620: //echo $q; 621: $r=$this->DESK->Database->Query($q); 622: $out = array(); 623: while ($row=$this->DESK->Database->FetchAssoc($r)) 624: { 625: $out[]=$row; 626: } 627: $this->DESK->Database->Free($r); 628: return $out; 629: } 630: 631: 632: 633: } 634: ?> 635: