PageRenderTime 61ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 1ms

/app/Http/Controllers/Admin/TicketsController.php

https://bitbucket.org/nextleveltechus/nextleveltech
PHP | 284 lines | 186 code | 61 blank | 37 comment | 18 complexity | 9a6bce16dac1223021028d4b1b45fc9d MD5 | raw file
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. use Illuminate\Validation\Rule;
  6. use App\Rules\CheckUploadFile;
  7. use \Auth;
  8. class TicketsController extends Controller
  9. {
  10. var $rules = array();
  11. var $req = array();
  12. //
  13. public function __construct()
  14. {
  15. $this->requireLoggedIn();
  16. $this->requireUserType(array('SYSTEM ADMINISTRATOR'));
  17. $this->rules = array(
  18. 'title' => 'required|max:100'
  19. ,'description' => 'required'
  20. ,'type' => ['required',Rule::in(array_keys(\App\Ticket::TYPE))]
  21. ,'status' => ['required',Rule::in(array_keys(\App\Ticket::STATUS))]
  22. ,'priority' => ['required',Rule::in(array_keys(\App\Ticket::PRIORITY))]
  23. ,'estimatedTime' => 'nullable|integer'
  24. ,'percentageComplete' => ['nullable','integer',Rule::in(array_keys(\App\Common::PERCENTS))]
  25. ,'assigneeId' => 'required|integer'
  26. ,'userfile' => ['nullable','file',new CheckUploadFile]
  27. );
  28. }
  29. /**
  30. * Display a listing of the resource.
  31. *
  32. * @return \Illuminate\Http\Response
  33. */
  34. public function index(Request $request, $slashdata = NULL)
  35. {
  36. $sort = get_param('sort',$slashdata)??'id';
  37. $order = get_param('order',$slashdata)??'desc';
  38. $data['numPerPage'] = \Cookie::get('numPerPage')??env('DEFAULT_NUM_PER_PAGE');
  39. $data['ticketsShowOnly'] = \Cookie::get('ticketsShowOnly');
  40. $data['ticketsShowOnlyAdmin'] = \Cookie::get('ticketsShowOnlyAdmin');
  41. $data['start'] = (isset($_GET['page'])) ? $data['numPerPage'] * $_GET['page'] - $data['numPerPage'] : 0;
  42. $in = (empty($data['ticketsShowOnly'])) ? array("NEW" => "New","DESIGN" => "Design","IN PROGRESS" => "In Progress","FEEDBACK" => "Feedback","QUALITY ASSURANCE" => "Quality Assurance","QUALITY ASSURANCE PASSED" => "Quality Assurance Passed","RELEASED" => "Released","CLEANUP" => "Cleanup") : array($data['ticketsShowOnly']);
  43. $inAdmin = array($data['ticketsShowOnlyAdmin']);
  44. if(empty($data['ticketsShowOnlyAdmin']))
  45. $inAdmin = ['id' => Auth::user()->id];
  46. elseif($data['ticketsShowOnlyAdmin'] == 'all')
  47. $inAdmin = \App\User::system_admins_array();
  48. $data['tickets'] = \App\Ticket::orderBy($sort,$order)
  49. ->select(['tickets.*','u.fname','u.lname','a.fname as assigneefname','a.lname as assigneelname'])
  50. ->whereIn('tickets.status',$in)
  51. ->whereIn('tickets.assigneeId',$inAdmin)
  52. ->join('users as u','tickets.userId','u.id')
  53. ->join('users as a','tickets.assigneeId','a.id')
  54. ->paginate($data['numPerPage']);
  55. return view('admin.tickets.index',$data);
  56. }
  57. /**
  58. * Show the form for creating a new resource.
  59. *
  60. * @return \Illuminate\Http\Response
  61. */
  62. public function create()
  63. {
  64. return view('admin.tickets.create');
  65. }
  66. /**
  67. * Store a newly created resource in storage.
  68. *
  69. * @param \Illuminate\Http\Request $request
  70. * @return \Illuminate\Http\Response
  71. */
  72. public function store(Request $request)
  73. {
  74. if(empty($_FILES['userfile']['error']))
  75. $this->rules['fileTitle'] = 'required|max:100';
  76. // form validation
  77. $request->validate($this->rules);
  78. $input = $request->all();
  79. ($input['startDate']) ? $input['startDate'] = strtotime($input['startDate']) : NULL;
  80. ($input['endDate']) ? $input['endDate'] = strtotime($input['endDate']) : NULL;
  81. $input['userId'] = Auth::user()->id;
  82. $ticket = \App\Ticket::create($input);
  83. $this->_save_file($ticket);
  84. session()->flash('notice','The ticket has been created.');
  85. return redirect()->route('admin.tickets.index');
  86. }
  87. private function _save_file( $ticket = array() )
  88. {
  89. if(!empty($_FILES['userfile']['error']))
  90. return;
  91. $info = new \SplFileInfo($_FILES['userfile']['name']);
  92. $extension = strtolower($info->getExtension());
  93. $filename = strtolower(substr(sha1(time()),0,20));
  94. $size = getimagesize($_FILES['userfile']['tmp_name']);
  95. $files['basepath'] = env('FILE_BASEPATH');
  96. $files['title'] = $ticket['title'];
  97. $files['raw_name'] = $filename;
  98. $files['file_ext'] = $extension;
  99. $files['file_size'] = $_FILES['userfile']['size'];
  100. $files['image_width'] = @$size[0];
  101. $files['image_height'] = @$size[1];
  102. $files['image_size_str'] = @$size[3];
  103. $files['mime'] = @$size['mime'];
  104. $files['userId'] = Auth::user()->id;
  105. $files['instanceType'] = \App\File::INSTANCE_TYPE['TICKET'];
  106. $files['instanceId'] = $ticket['id'];
  107. $file = \App\File::create($files);
  108. $directory = \App\Common::create_dir_from_id($files['basepath'],$file->id);
  109. $new_file = "{$directory}/{$files['raw_name']}.{$files['file_ext']}";
  110. // move file
  111. copy($_FILES['userfile']['tmp_name'],$new_file);
  112. }
  113. /**
  114. * Show the form for editing the specified resource.
  115. *
  116. * @param int $id
  117. * @return \Illuminate\Http\Response
  118. */
  119. public function edit($id)
  120. {
  121. $data['ticket'] = \App\Ticket::where('tickets.id',$id)
  122. ->select(['tickets.*','u.fname','u.lname','a.fname as assigneefname','a.lname as assigneelname'])
  123. ->join('users as u','tickets.userId','u.id')
  124. ->join('users as a','tickets.assigneeId','a.id')
  125. ->first();
  126. $data['ticketResponses'] = \App\TicketResponse::orderBy('ticket_responses.created_at','DESC')
  127. ->select('users.*','ticket_responses.*')
  128. ->where('ticketId',$id)
  129. ->join('users','userId','users.id')
  130. ->get();
  131. $data['files'] = \App\File::orderBy('created_at','DESC')
  132. ->where('instanceId',$id)
  133. ->where('instanceType',\App\File::INSTANCE_TYPE['TICKET'])
  134. ->get();
  135. return view('admin.tickets.edit',$data);
  136. }
  137. /**
  138. * Update the specified resource in storage.
  139. *
  140. * @param \Illuminate\Http\Request $request
  141. * @param int $id
  142. * @return \Illuminate\Http\Response
  143. */
  144. public function update(Request $request, $id)
  145. {
  146. if(empty($_FILES['userfile']['error']))
  147. $this->rules['fileTitle'] = 'required|max:100';
  148. // form validation
  149. $request->validate($this->rules);
  150. $input = $request->except(['_method','_token','fileTitle','userId']);
  151. ($input['startDate']) ? $input['startDate'] = strtotime($input['startDate']) : NULL;
  152. ($input['endDate']) ? $input['endDate'] = strtotime($input['endDate']) : NULL;
  153. $ticket = \App\Ticket::find($id);
  154. \App\Ticket::find($id)
  155. ->update($input);
  156. \App\Ticket::find($id)
  157. ->touch();
  158. $updates = array();
  159. $skipFields = array('description','response','fileTitle','submit','userfile');
  160. foreach($input as $k => $v){
  161. if(!in_array($k,$skipFields) && $_POST[$k] != $ticket[$k]){
  162. $first = ($ticket[$k]) ? ucwords(strtolower($ticket[$k])) : 'Null';
  163. $second = ($_POST[$k]) ? ucwords(strtolower($_POST[$k])) : 'Null';
  164. ($k == 'startDate') ? $first = displayFormattedDate($ticket[$k]) : NULL;
  165. ($k == 'endDate') ? $first = displayFormattedDate($ticket[$k]) : NULL;
  166. if($first != $second)
  167. array_push($updates,titleize($k) . " changed from {$first} to {$second}.");
  168. }
  169. if($k == 'description' && $input[$k] != $ticket[$k])
  170. array_push($updates,"The description has been changed.");
  171. }
  172. if(empty($_FILES['userfile']['error']))
  173. array_push($updates,"The file {$request->input('fileTitle')} was uploaded.");
  174. $input = $request->except(['_method','_token']);
  175. $input['updates'] = serialize($updates);
  176. $input['userId'] = Auth::user()->id;
  177. $input['ticketId'] = $id;
  178. \App\TicketResponse::create($input);
  179. $this->_save_file(['id' => $id, 'title' => $request->input('fileTitle')]);
  180. session()->flash('notice','The ticket has been updated.');
  181. return redirect()->route('admin.tickets.edit',$id);
  182. }
  183. //
  184. public function searchQuick(Request $request)
  185. {
  186. $data['search'] = $request->input('search');
  187. $data['tickets'] = collect();
  188. if(!empty($data['search']))
  189. $data['tickets'] = \App\Ticket::select(['tickets.*','u.fname','u.lname','a.fname as assigneefname','a.lname as assigneelname'])
  190. ->where('tickets.title','like',"%{$data['search']}%")
  191. ->orWhere('tickets.description','like',"%{$data['search']}%")
  192. ->join('users as u','tickets.userId','u.id')
  193. ->join('users as a','tickets.assigneeId','a.id')
  194. ->get();
  195. return view('admin.tickets.index',$data);
  196. }
  197. //
  198. public function saveNumPerPage(Request $request)
  199. {
  200. $this->rules = array(
  201. 'numPerPage' => ['nullable',Rule::in(\App\Common::NUMPERPAGE)]
  202. );
  203. $request->validate($this->rules);
  204. \Cookie::queue('numPerPage', $request->input('numPerPage'), 86400*30);
  205. return redirect()->route('admin.tickets.index');
  206. }
  207. //
  208. function saveShowOnly(Request $request)
  209. {
  210. $this->rules = array(
  211. 'status' => ['nullable',Rule::in(\App\Ticket::STATUS)]
  212. );
  213. $request->validate($this->rules);
  214. \Cookie::queue('ticketsShowOnly', $request->input('status'), 86400*30);
  215. return redirect()->route('admin.tickets.index');
  216. }
  217. //
  218. function saveShowOnlyAdmin(Request $request)
  219. {
  220. \Cookie::queue('ticketsShowOnlyAdmin', $request->input('assigneeId'), 86400*30);
  221. return redirect()->route('admin.tickets.index');
  222. }
  223. }