PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/app/Http/Controllers/Calendar/EventController.php

https://bitbucket.org/vit_che/backpart
PHP | 485 lines | 299 code | 145 blank | 41 comment | 34 complexity | 47e51b1ed8993d07aa5d3e025bd714a2 MD5 | raw file
Possible License(s): Apache-2.0, MIT, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. <?php
  2. namespace App\Http\Controllers\Calendar;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. use DB;
  6. use function MongoDB\BSON\toJSON;
  7. use Validator;
  8. use Auth;
  9. use App\Event;
  10. use App\User;
  11. use App\Departament;
  12. class EventController extends Controller
  13. { /* get remind about events in the day */
  14. public function getRemind(){
  15. $today = date('Y-m-d');
  16. $events = DB::table('events')
  17. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  18. ->join('users', 'events.user_id', '=', 'users.id')
  19. ->select('title', 'start', 'end', 'departaments.name as departament', 'users.name as name', 'events.id as id')
  20. ->where('remind_date','<=', $today)
  21. ->where('events.start','>=', $today)
  22. ->orderBy('start')
  23. ->get();
  24. return $events;
  25. }
  26. /* get Month Events List */
  27. public function listEventsMonth(Request $request)
  28. {
  29. $start = $request->query('start');
  30. $end = $request->query('end');
  31. $events = DB::table('events')
  32. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  33. ->select('title', 'events.start as start', 'events.end as end', 'departaments.name as name', 'departament_id', 'departaments.color as color')
  34. ->where('start','>=', $start)
  35. ->where('start','<=', $end)
  36. ->orderBy('start')
  37. ->get();
  38. /* get Events array */
  39. $arr_event = [];
  40. $j = 0;
  41. foreach ($events as $ev){
  42. $days = $this->getEventTime($ev->start, $ev->end);
  43. if($days == 0){
  44. $days = 1;
  45. }
  46. $in_ev_start = $ev->start;
  47. for ($i = 0; $i < $days; $i++){
  48. $arr_item = $this->setArrItem($ev->name, $ev->departament_id, $in_ev_start, $ev->color, $ev->name);
  49. $arr_event[$j][$i] = $arr_item;
  50. $in_ev_start = $this->setNextDay($in_ev_start);
  51. }
  52. $j = $j + 1;
  53. }
  54. $arr_out = [];
  55. foreach($arr_event as $arr){
  56. $arr_out = array_merge($arr_out, $arr);
  57. }
  58. /*set title 1 */
  59. $new_arr = [];
  60. $e = 0;
  61. foreach ($arr_out as $out){
  62. $out['title'] = 1;
  63. $new_arr[$e] = $out;
  64. $e++;
  65. }
  66. /* group events by days & departaments */
  67. $evens_arr = [];
  68. foreach ( $new_arr as $ar ){
  69. if( empty($evens_arr[$ar['start']][$ar['departament_id']] ) ) {
  70. $dep_name = $ar['name'];
  71. $evens_arr[$ar['start']][$ar['departament_id']] = $ar;
  72. $evens_arr[$ar['start']][$ar['departament_id']]['title'] .= ' '.$dep_name;
  73. } else {
  74. $dep_name = $ar['name'];
  75. $evens_arr[$ar['start']][$ar['departament_id']]['title'] += 1;
  76. $evens_arr[$ar['start']][$ar['departament_id']]['title'].=' '.$dep_name;
  77. }
  78. }
  79. /* merge array */
  80. $evens_out = [];
  81. foreach($evens_arr as $even){
  82. $evens_out = array_merge($evens_out, $even);
  83. }
  84. return response()->json($evens_out);
  85. }
  86. /* function set new array items */
  87. public function setArrItem($dep_name, $dep_id, $start, $color)
  88. {
  89. return [ "title" => $dep_name, "departament_id" => $dep_id, "start" => $start, "color" =>$color, "name" => $dep_name ];
  90. }
  91. /* how many days has event */
  92. public function getEventTime($start, $end){
  93. $t_start = strtotime($start);
  94. $t_end = strtotime($end);
  95. if (($start || $end) && ($end > $start)) {
  96. $days = idate('d', $t_end - $t_start);
  97. } else {
  98. return false;
  99. }
  100. return $days;
  101. }
  102. public function setNextDay($day){
  103. return date('Y-m-d', strtotime($day) + 86400);
  104. }
  105. public function listEventsDay(Request $request){
  106. $start = $request->query('start');
  107. $departament_id = $request->query('departament_id');
  108. $events_day = DB::table('events')
  109. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  110. ->join('users', 'events.user_id', '=', 'users.id')
  111. ->select('events.id as id', 'title', 'start', 'end', 'users.name as perfomer', 'departaments.name')
  112. ->where('start','<=', $start)
  113. ->where('end', '>=', $start)
  114. ->where('events.departament_id','=', $departament_id)
  115. ->get();
  116. return response()->json($events_day);
  117. }
  118. public function getEvent(Request $request){
  119. $id = $request->id;
  120. $event = DB::table('events')
  121. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  122. ->join('users', 'events.user_id', '=', 'users.id')
  123. ->select('title', 'description', 'start', 'end', 'users.name as perfomer','users.id as userid', 'departaments.name', 'departaments.id as depsid', 'remind_date')
  124. ->where('events.id', '=', $id)
  125. ->get();
  126. $departaments = Departament::all();
  127. $users = User::all();
  128. $data = [
  129. 'event' => $event,
  130. 'deps' => $departaments,
  131. 'users' => $users
  132. ];
  133. return $data;
  134. }
  135. public function edit(Request $request){
  136. $user = Auth::user();
  137. $user_role_id = User::find($user->id)->role->id;
  138. $event_id = $request->id;
  139. $event = Event::find($event_id);
  140. if ($user_role_id != User::ROLE_ADMIN) {
  141. //сообщение о превышении Прав
  142. $mistake = 'You don`t have a right to DELETE Event!';
  143. return $mistake;
  144. } elseif ( $user_role_id == User::ROLE_ADMIN ){
  145. if ($request->isMethod('DELETE')) {
  146. if($event->delete()) {
  147. $msg = 'Событие Удалено';
  148. return $msg;
  149. } else {
  150. $msg = 'Событие НЕ было Удалено!!!';
  151. return $msg;
  152. }
  153. } elseif ($request->isMethod('POST')){
  154. $input = $request->except('_token');
  155. $messages = [
  156. 'required' => 'Поле :attribute обязательно к заполнению',
  157. 'max' => "длина превышает 255 символов"
  158. ];
  159. $validator = Validator::make($input, [
  160. 'title' => 'required|max:255',
  161. ], $messages);
  162. if($validator->fails()){
  163. return $this->validatorFails($validator);
  164. }
  165. $event->fill($input);
  166. if($event->update()) {
  167. $msg = 'Изменения Сохранены';
  168. return $msg;
  169. }
  170. }
  171. }
  172. }
  173. public function execute(Request $request) // add Event
  174. {
  175. $user = Auth::user();
  176. $user_role_id = User::find($user->id)->role->id;
  177. if ( $user_role_id == User::ROLE_ADMIN ) {
  178. return $this->_addEvent($request);
  179. } elseif ($user_role_id == User::ROLE_MODER) {
  180. return $this->_addEvent($request);
  181. } else {
  182. $message = "У Вас нет прав для этого действия!";
  183. return $message;
  184. }
  185. }
  186. public function _addEvent($request) {
  187. if ($request->isMethod('post')) {
  188. $input = $request->except('_token');
  189. $messages = [
  190. 'required' => 'Поле :attribute обязательно к заполнению',
  191. ];
  192. $validator = Validator::make($input, [
  193. 'title' => 'required|max:255',
  194. 'start' => 'required'
  195. ], $messages);
  196. if ($validator->fails()) {
  197. return $this->validatorFails($validator);
  198. }
  199. $user = Auth::user();
  200. $event = new Event();
  201. $event->fill($input);
  202. $event->creator_id = $user->id;
  203. if ($event->end == null) {
  204. $event->end = $event->start;
  205. }
  206. if ($event->save()) {
  207. $message = "Событие Сохранено!";
  208. return $message;
  209. }
  210. }
  211. }
  212. public function getAllEvents(){
  213. $user = Auth::user();
  214. $user_role_id = User::find($user->id)->role->id;
  215. if ( $user_role_id == User::ROLE_ADMIN) {
  216. return $this->getAllEventsIn();
  217. } elseif ( $user_role_id == User::ROLE_MODER ){
  218. return $this->getAllEventsIn();
  219. } else {
  220. $mistake = 'You don`t have a right!';
  221. return $mistake;
  222. }
  223. }
  224. private function getAllEventsIn(){
  225. $today = date('Y-m-d');
  226. $date = date('Y-m-d', strtotime($today) - 1296000);
  227. $events = DB::table('events')
  228. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  229. ->join('users', 'events.user_id', '=', 'users.id')
  230. ->select('events.id as id','title', 'start', 'end', 'users.name as perfomer', 'departaments.name')
  231. ->where('start','>=', $date)
  232. ->where('end', '>=', $date)
  233. ->orderBy('start')
  234. ->get();
  235. return $events;
  236. }
  237. public function getCsvList(Request $request){
  238. $user = Auth::user();
  239. $user_role_id = User::find($user->id)->role->id;
  240. $user_departament = User::find($user->id)->departament->id;
  241. if ( $user_role_id == User::ROLE_ADMIN ) {
  242. return $this->createCsv($request);
  243. } elseif ($user_role_id == User::ROLE_MODER) {
  244. return $this->createModerCsv($request, $user_departament);
  245. } else {
  246. $message = "У Вас нет прав для этого действия!";
  247. return $message;
  248. }
  249. // $start = $request->start;
  250. // $end = $request->end;
  251. //
  252. // $events = DB::table('events')
  253. // ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  254. // ->join('users', 'events.user_id', '=', 'users.id')
  255. // ->select('title', 'start', 'end', 'users.name as perfomer', 'departaments.name')
  256. // ->where('start','>=', $start)
  257. // ->where('start', '<=', $end)
  258. // ->orderBy('start')
  259. // ->get();
  260. //
  261. // $array = [];
  262. // $i = 0;
  263. // foreach($events as $event) {
  264. // $ar = (array)$event;
  265. // $array [$i] = $ar;
  266. // $i++;
  267. // }
  268. //
  269. // $fp = fopen('/home/dok/projects/websites/laravelcalendar/public/file.csv', 'w');
  270. //
  271. // foreach ($array as $ev){
  272. // fputcsv($fp, $ev);
  273. // }
  274. // fclose($fp);
  275. //
  276. // header("content-type: application/csv");
  277. // header('Content-Disposition: attachment; filename="file.csv"');
  278. //
  279. // $link = '/file.csv';
  280. //
  281. // return $link;
  282. }
  283. private function createCsv(Request $request){
  284. $start = $request->start;
  285. $end = $request->end;
  286. $events = DB::table('events')
  287. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  288. ->join('users', 'events.user_id', '=', 'users.id')
  289. ->select('title', 'start', 'end', 'users.name as perfomer', 'departaments.name')
  290. ->where('start','>=', $start)
  291. ->where('start', '<=', $end)
  292. ->orderBy('start')
  293. ->get();
  294. $array = [];
  295. $i = 0;
  296. foreach($events as $event) {
  297. $ar = (array)$event;
  298. $array [$i] = $ar;
  299. $i++;
  300. }
  301. $fp = fopen('/home/dok/projects/websites/laravelcalendar/public/file.csv', 'w');
  302. foreach ($array as $ev){
  303. fputcsv($fp, $ev);
  304. }
  305. fclose($fp);
  306. header("content-type: application/csv");
  307. header('Content-Disposition: attachment; filename="file.csv"');
  308. $link = '/file.csv';
  309. return $link;
  310. }
  311. private function createModerCsv(Request $request, $departament){
  312. $start = $request->start;
  313. $end = $request->end;
  314. $events = DB::table('events')
  315. ->join('departaments', 'events.departament_id', '=', 'departaments.id')
  316. ->join('users', 'events.user_id', '=', 'users.id')
  317. ->select('title', 'start', 'end', 'users.name as perfomer', 'departaments.name')
  318. ->where('start','>=', $start)
  319. ->where('start', '<=', $end)
  320. ->where('departaments.id', '=', $departament)
  321. ->orderBy('start')
  322. ->get();
  323. $array = [];
  324. $i = 0;
  325. foreach($events as $event) {
  326. $ar = (array)$event;
  327. $array [$i] = $ar;
  328. $i++;
  329. }
  330. $fp = fopen('/home/dok/projects/websites/laravelcalendar/public/file.csv', 'w');
  331. foreach ($array as $ev){
  332. fputcsv($fp, $ev);
  333. }
  334. fclose($fp);
  335. header("content-type: application/csv");
  336. header('Content-Disposition: attachment; filename="file.csv"');
  337. $link = '/file.csv';
  338. return $link;
  339. }
  340. }