1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* Storgman - Student Organizations Management |
5
|
|
|
* Copyright (C) 2014-2016, Dejan Angelov <[email protected]> |
6
|
|
|
* |
7
|
|
|
* This file is part of Storgman. |
8
|
|
|
* |
9
|
|
|
* Storgman is free software: you can redistribute it and/or modify |
10
|
|
|
* it under the terms of the GNU General Public License as published by |
11
|
|
|
* the Free Software Foundation, either version 3 of the License, or |
12
|
|
|
* (at your option) any later version. |
13
|
|
|
* |
14
|
|
|
* Storgman is distributed in the hope that it will be useful, |
15
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
16
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17
|
|
|
* GNU General Public License for more details. |
18
|
|
|
* |
19
|
|
|
* You should have received a copy of the GNU General Public License |
20
|
|
|
* along with Storgman. If not, see <http://www.gnu.org/licenses/>. |
21
|
|
|
* |
22
|
|
|
* @package Storgman |
23
|
|
|
* @copyright Copyright (C) 2014-2016, Dejan Angelov <[email protected]> |
24
|
|
|
* @license https://github.com/angelov/storgman/blob/master/LICENSE |
25
|
|
|
* @author Dejan Angelov <[email protected]> |
26
|
|
|
*/ |
27
|
|
|
|
28
|
|
|
namespace Angelov\Storgman\Members\Http\Controllers; |
29
|
|
|
|
30
|
|
|
use Angelov\Storgman\Core\Http\Controllers\BaseController; |
31
|
|
|
use Angelov\Storgman\Faculties\Repositories\FacultiesRepositoryInterface; |
32
|
|
|
use Angelov\Storgman\Members\Commands\ApproveMemberCommand; |
33
|
|
|
use Angelov\Storgman\Members\Commands\CreateMemberCommand; |
34
|
|
|
use Angelov\Storgman\Members\Commands\DeclineMemberCommand; |
35
|
|
|
use Angelov\Storgman\Members\Commands\DeleteMemberCommand; |
36
|
|
|
use Angelov\Storgman\Members\Commands\UpdateMemberCommand; |
37
|
|
|
use Angelov\Storgman\Members\Http\Requests\StoreMemberRequest; |
38
|
|
|
use Angelov\Storgman\Members\Http\Requests\UpdateMemberRequest; |
39
|
|
|
use Angelov\Storgman\Members\MembersPaginator; |
40
|
|
|
use Angelov\Storgman\Membership\Repositories\FeesRepositoryInterface; |
41
|
|
|
use Angelov\Storgman\Meetings\MeetingsService; |
42
|
|
|
use Angelov\Storgman\Members\Repositories\MembersRepositoryInterface; |
43
|
|
|
use Illuminate\Contracts\Routing\UrlGenerator; |
44
|
|
|
use Illuminate\Contracts\View\View; |
45
|
|
|
use Illuminate\Http\JsonResponse; |
46
|
|
|
use Illuminate\Http\RedirectResponse; |
47
|
|
|
use Illuminate\Http\Request; |
48
|
|
|
|
49
|
|
|
class MembersController extends BaseController |
50
|
|
|
{ |
51
|
|
|
protected $members; |
52
|
|
|
protected $fees; |
53
|
|
|
|
54
|
|
|
public function __construct(MembersRepositoryInterface $members, FeesRepositoryInterface $fees) |
55
|
|
|
{ |
56
|
|
|
$this->members = $members; |
57
|
|
|
$this->fees = $fees; |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
/** |
61
|
|
|
* Display a listing of members |
62
|
|
|
* |
63
|
|
|
* @param Request $request |
64
|
|
|
* @param MembersPaginator $paginator |
65
|
|
|
* @return View |
66
|
|
|
*/ |
67
|
|
|
public function index(Request $request, MembersPaginator $paginator) |
68
|
|
|
{ |
69
|
|
|
$page = $request->get('page', 1); |
70
|
|
|
$members = $paginator->get($page); |
71
|
|
|
|
72
|
|
|
/** @todo This can get a little optimized */ |
73
|
|
|
$pending = count($this->members->getUnapprovedMembers()); |
74
|
|
|
|
75
|
|
|
return view('members.index', compact('members', 'pending')); |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
/** |
79
|
|
|
* Returns the list of members to be used for autocompletion |
80
|
|
|
* |
81
|
|
|
* @param UrlGenerator $url |
82
|
|
|
* @return JsonResponse |
83
|
|
|
*/ |
84
|
|
|
public function prefetch(UrlGenerator $url) |
85
|
|
|
{ |
86
|
|
|
$members = $this->members->all(); |
87
|
|
|
$result = []; |
88
|
|
|
|
89
|
|
|
foreach ($members as $member) { |
90
|
|
|
$tmp = []; |
91
|
|
|
$tmp['value'] = $member->getFullName(); |
92
|
|
|
$tmp['image'] = $url->route('imagecache', ['xsmall', $member->getPhoto()]); |
93
|
|
|
$tmp['id'] = $member->getId(); |
94
|
|
|
|
95
|
|
|
$result[] = $tmp; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
return new JsonResponse($result); |
99
|
|
|
} |
100
|
|
|
|
101
|
|
|
/** |
102
|
|
|
* Show a page that lists the board members |
103
|
|
|
* |
104
|
|
|
* @return View |
105
|
|
|
*/ |
106
|
|
|
public function board() |
107
|
|
|
{ |
108
|
|
|
$members = $this->members->getBoardMembers(); |
109
|
|
|
|
110
|
|
|
return view('members.board', compact('members')); |
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
/** |
114
|
|
|
* Show a page with the unapproved member accounts |
115
|
|
|
* |
116
|
|
|
* @return View |
117
|
|
|
*/ |
118
|
|
|
public function unapproved() |
119
|
|
|
{ |
120
|
|
|
$members = $this->members->getUnapprovedMembers(); |
121
|
|
|
|
122
|
|
|
return view('members.unapproved', compact('members')); |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
/** |
126
|
|
|
* Show the form for creating a new member |
127
|
|
|
* |
128
|
|
|
* @param FacultiesRepositoryInterface $faculties |
129
|
|
|
* @return View |
130
|
|
|
*/ |
131
|
|
|
public function create(FacultiesRepositoryInterface $faculties) |
132
|
|
|
{ |
133
|
|
|
$faculties = $faculties->getEnabled(); |
134
|
|
|
|
135
|
|
|
return view('members.create', compact('faculties')); |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
/** |
139
|
|
|
* Store a newly created member in storage. |
140
|
|
|
* |
141
|
|
|
* @param StoreMemberRequest $request |
142
|
|
|
* @return RedirectResponse |
143
|
|
|
*/ |
144
|
|
View Code Duplication |
public function store(StoreMemberRequest $request) |
|
|
|
|
145
|
|
|
{ |
146
|
|
|
$data = $request->all(); |
147
|
|
|
|
148
|
|
|
dispatch(new CreateMemberCommand($data, $approve = true)); |
149
|
|
|
|
150
|
|
|
session()->flash('action-message', "Member added successfully."); |
151
|
|
|
|
152
|
|
|
return redirect()->route('members.index'); |
153
|
|
|
} |
154
|
|
|
|
155
|
|
|
/** |
156
|
|
|
* Display the specified member. |
157
|
|
|
* |
158
|
|
|
* @param MeetingsService $meetingsService |
159
|
|
|
* @param int $id |
160
|
|
|
* @return View |
161
|
|
|
* |
162
|
|
|
* @todo Information separated in tabs (in the view) should be separated in few methods |
163
|
|
|
*/ |
164
|
|
|
public function show(MeetingsService $meetingsService, $id) |
165
|
|
|
{ |
166
|
|
|
$member = $this->members->get($id); |
167
|
|
|
|
168
|
|
|
$attendance = $meetingsService->calculateAttendanceDetailsForMember($member); |
169
|
|
|
|
170
|
|
|
$latestMeetings = $meetingsService->latestMeetingsAttendanceStatusForMember($member); |
171
|
|
|
|
172
|
|
|
$monthly = json_encode($meetingsService->calculateMonthlyAttendanceDetailsForMember($member)); |
173
|
|
|
|
174
|
|
|
return view('members.show', compact('member', 'attendance', 'latestMeetings', 'monthly')); |
175
|
|
|
} |
176
|
|
|
|
177
|
|
|
/** |
178
|
|
|
* Returns html component with short member info |
179
|
|
|
* (focused on the membership) |
180
|
|
|
* |
181
|
|
|
* @param int $id |
182
|
|
|
* @return View |
183
|
|
|
*/ |
184
|
|
|
public function quickMemberInfo($id) |
185
|
|
|
{ |
186
|
|
|
$member = $this->members->get($id); |
187
|
|
|
|
188
|
|
|
return view('members.components.quick-info', compact('member')); |
189
|
|
|
} |
190
|
|
|
|
191
|
|
|
/** |
192
|
|
|
* Show the form for editing the specified member. |
193
|
|
|
* |
194
|
|
|
* @param int $id |
195
|
|
|
* @param FacultiesRepositoryInterface $faculties |
196
|
|
|
* @return View |
197
|
|
|
*/ |
198
|
|
|
public function edit($id, FacultiesRepositoryInterface $faculties) |
199
|
|
|
{ |
200
|
|
|
$member = $this->members->get($id); |
201
|
|
|
$faculties = $faculties->getEnabled(); |
202
|
|
|
|
203
|
|
|
return view('members.edit', compact('member', 'faculties')); |
204
|
|
|
} |
205
|
|
|
|
206
|
|
|
/** |
207
|
|
|
* Update the specified member in storage. |
208
|
|
|
* |
209
|
|
|
* @param UpdateMemberRequest $request |
210
|
|
|
* @param int $id |
211
|
|
|
* @return RedirectResponse |
212
|
|
|
*/ |
213
|
|
View Code Duplication |
public function update(UpdateMemberRequest $request, $id) |
|
|
|
|
214
|
|
|
{ |
215
|
|
|
$data = $request->all(); |
216
|
|
|
|
217
|
|
|
dispatch(new UpdateMemberCommand($id, $data)); |
218
|
|
|
|
219
|
|
|
session()->flash('action-message', "Member updated successfully."); |
220
|
|
|
|
221
|
|
|
return redirect()->route('members.index'); |
222
|
|
|
} |
223
|
|
|
|
224
|
|
|
/** |
225
|
|
|
* Remove the specified members from storage. |
226
|
|
|
* Method available only via AJAX requests |
227
|
|
|
* |
228
|
|
|
* @param int $id |
229
|
|
|
* @return JsonResponse |
230
|
|
|
*/ |
231
|
|
|
public function destroy($id) |
232
|
|
|
{ |
233
|
|
|
dispatch(new DeleteMemberCommand($id)); |
234
|
|
|
|
235
|
|
|
return $this->successfulJsonResponse('Member deleted successfully.'); |
236
|
|
|
} |
237
|
|
|
|
238
|
|
|
/** |
239
|
|
|
* Approve a pending member account |
240
|
|
|
* Method available only via AJAX requests |
241
|
|
|
* |
242
|
|
|
* @param int $id |
243
|
|
|
* @return JsonResponse |
244
|
|
|
*/ |
245
|
|
|
public function approve($id) |
246
|
|
|
{ |
247
|
|
|
dispatch(new ApproveMemberCommand($id)); |
248
|
|
|
|
249
|
|
|
return $this->successfulJsonResponse('Member approved successfully.'); |
250
|
|
|
} |
251
|
|
|
|
252
|
|
|
/** |
253
|
|
|
* Decline a pending member account |
254
|
|
|
* Method available only via AJAX requests |
255
|
|
|
* |
256
|
|
|
* @param int $id |
257
|
|
|
* @return JsonResponse |
258
|
|
|
*/ |
259
|
|
|
public function decline($id) |
260
|
|
|
{ |
261
|
|
|
dispatch(new DeclineMemberCommand($id)); |
262
|
|
|
|
263
|
|
|
return $this->successfulJsonResponse('Member declined successfully.'); |
264
|
|
|
} |
265
|
|
|
|
266
|
|
|
/** |
267
|
|
|
* The new members can create their profiles on the system |
268
|
|
|
* |
269
|
|
|
* @param FacultiesRepositoryInterface $faculties |
270
|
|
|
* @return View |
271
|
|
|
*/ |
272
|
|
|
public function register(FacultiesRepositoryInterface $faculties) |
273
|
|
|
{ |
274
|
|
|
$faculties = $faculties->getEnabled(); |
275
|
|
|
|
276
|
|
|
return view('members.register', compact('faculties')); |
277
|
|
|
} |
278
|
|
|
|
279
|
|
|
/** |
280
|
|
|
* Proceed the information submitted via the registration form |
281
|
|
|
* |
282
|
|
|
* @param StoreMemberRequest $request |
283
|
|
|
* @return RedirectResponse |
284
|
|
|
*/ |
285
|
|
View Code Duplication |
public function postRegister(StoreMemberRequest $request) |
|
|
|
|
286
|
|
|
{ |
287
|
|
|
$data = $request->all(); |
288
|
|
|
|
289
|
|
|
dispatch(new CreateMemberCommand($data)); |
290
|
|
|
|
291
|
|
|
session()->flash( |
292
|
|
|
'action-message', |
293
|
|
|
"Your account was created successfully. You will be notified when the board members approve it." |
294
|
|
|
); |
295
|
|
|
|
296
|
|
|
return redirect()->route('members.register'); |
297
|
|
|
} |
298
|
|
|
} |
299
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.