Completed
Push — master ( 6374b3...243f6e )
by D.
17:36 queued 12:41
created

TrainingController::sendReminder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
crap 1
1
<?php
2
3
namespace SET\Http\Controllers;
4
5
use Illuminate\Http\Request;
6
use Illuminate\Support\Facades\Auth;
7
use Illuminate\Support\Facades\DB;
8
use Illuminate\Support\Facades\Event;
9
use Illuminate\Support\Facades\Input;
10
use Krucas\Notification\Facades\Notification;
11
use SET\Attachment;
12
use SET\Events\TrainingAssigned;
13
use SET\Group;
14
use SET\Handlers\Excel\CompletedTrainingExport;
15
use SET\Http\Requests\AssignTrainingRequest;
16
use SET\Http\Requests\StoreTrainingRequest;
17
use SET\Training;
18
use SET\TrainingType;
19
use SET\TrainingUser;
20
use SET\User;
21
22
/**
23
 * Class TrainingController.
24
 */
25
class TrainingController extends Controller
26
{
27
    /**
28
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
29
     */
30 2
    public function index(Request $request, $trainingTypeID = null)
31
    {
32 2
        $this->authorize('view');
33
34 2
        $hasTrainingType = TrainingType::count() > 0;
35 2
        $isTrainingType = (strpos($request->path(), '/trainingtype/'));
36
37 2
        if ($trainingTypeID) {
38
            $trainings = Training::with(['users' => function ($q) {
39 1
                $q->active();
40 1
            }])
41 1
                          ->where('training_type_id', $trainingTypeID)
42 1
                          ->get()
43 1
                          ->sortBy('name');
44
        } else {
45
            $trainings = Training::with(['users' => function ($q) {
46
                $q->active();
47 2
            }])->get()->sortBy('name');
48
        }
49
50 2
        return view('training.index', compact('trainings', 'isTrainingType', 'hasTrainingType'));
51
    }
52
53 1 View Code Duplication
    public function create()
54
    {
55 1
        $this->authorize('edit');
56
57 1
        $users = User::skipSystem()->active()->orderBy('last_name')->get()->pluck('UserFullName', 'id');
58 1
        $groups = Group::orderBy('name')->get()->pluck('name', 'id');
59 1
        $training_types = TrainingType::whereStatus(true)->orderBy('name')->get()->pluck('name', 'id');
60
61 1
        return view('training.create', compact('users', 'groups', 'training_types'));
62
    }
63
64
    /**
65
     * Store a newly created resource in storage.
66
     *
67
     * @param StoreTrainingRequest $request
68
     *
69
     * @return \Illuminate\Http\RedirectResponse
70
     */
71 1 View Code Duplication
    public function store(StoreTrainingRequest $request)
72
    {
73 1
        $data = $request->all();
74 1
        $training = Training::create($data);
75
76 1
        if ($request->hasFile('files')) {
77
            Attachment::upload($training, $request->file('files'));
78
        }
79
80 1
        $data['training_id'] = $training->id;
81
82 1
        $this->createTrainingNotes($data);
83
84 1
        Notification::container()->success('Training Created');
85
86 1
        return redirect()->action('TrainingController@index');
87
    }
88
89
    /**
90
     * Show the individual training record.
91
     *
92
     * @param $trainingId
93
     *
94
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
95
     */
96 1
    public function show($trainingId)
97
    {
98 1
        $this->authorize('view');
99 1
        $showAll = Input::get('showAll');
100
101 1
        $training = Training::with('attachments')->find($trainingId);
102 1
        $notes = $training->assignedUsers()
103 1
            ->with('user')
104 1
            ->orderBy(DB::raw('CASE WHEN completed_date IS NULL THEN 0 ELSE 1 END'))
105 1
            ->orderBy('completed_date', 'desc')
106 1
            ->get();
107 1
        if (!$showAll) {
108 1
            $notes = $notes->unique('user_id')->where('user.status', 'active');
109
        }
110
111 1
        return view('training.show', compact('notes', 'training', 'showAll'));
112
    }
113
114 1 View Code Duplication
    public function edit(Training $training)
115
    {
116 1
        $this->authorize('edit');
117
118 1
        $users = User::skipSystem()->active()->orderBy('last_name')->get()->pluck('UserFullName', 'id');
119 1
        $groups = Group::orderBy('name')->get()->pluck('name', 'id');
120 1
        $training_types = TrainingType::whereStatus(true)->orderBy('name')->get()->pluck('name', 'id');
121
122 1
        return view('training.edit', compact('training', 'users', 'groups', 'training_types'));
123
    }
124
125 1 View Code Duplication
    public function update(Request $request, Training $training)
126
    {
127 1
        $this->authorize('edit');
128
129 1
        $data = $request->all();
130 1
        $training->update($data);
131 1
        if ($request->hasFile('files')) {
132
            Attachment::upload($training, $request->file('files'));
133
        }
134
135 1
        $data['training_id'] = $training->id;
136 1
        $this->createTrainingNotes($data);
137
138 1
        Notification::container()->success('Training Updated');
139
140 1
        return redirect()->action('TrainingController@show', $training->id);
141
    }
142
143
    /**
144
     * Remove the specified resource from storage.
145
     *
146
     * @param int $trainingId
147
     */
148 1
    public function destroy($trainingId)
149
    {
150 1
        $this->authorize('edit');
151 1
        Training::findOrFail($trainingId)->delete();
152 1
    }
153
154 1 View Code Duplication
    public function assignForm($trainingID)
155
    {
156 1
        $this->authorize('edit');
157
158 1
        $training = Training::findOrFail($trainingID);
159 1
        $users = User::skipSystem()->active()->orderBy('last_name')->get()->pluck('UserFullName', 'id');
160 1
        $groups = Group::orderBy('name')->get()->pluck('name', 'id');
161
162 1
        return view('training.assign_user', compact('users', 'groups', 'training'));
163
    }
164
165
    /**
166
     * Assign our users to training.
167
     *
168
     * @param AssignTrainingRequest $request
169
     * @param int                   $trainingID
170
     *
171
     * @return \Illuminate\Http\RedirectResponse
172
     */
173 1 View Code Duplication
    public function assign(AssignTrainingRequest $request, $trainingID)
174
    {
175 1
        $this->authorize('edit');
176
177 1
        $data = $request->all();
178 1
        $data['training_id'] = $trainingID;
179
180 1
        $this->createTrainingNotes($data);
181
182 1
        Notification::container()->success('Training was assigned to the user(s).');
183
184 1
        return redirect()->action('TrainingController@show', $trainingID);
185
    }
186
187
    /**
188
     * Generate Excel file with user/training table with date of completion.
189
     *
190
     * Calls to \SET\app\Handlers\Excel\
191
     *
192
     * @param CompletedTrainingExport $export
193
     *
194
     * @return mixed
195
     */
196
    public function showCompleted(CompletedTrainingExport $export)
197
    {
198
        $this->authorize('view');
199
200
        return $export->handleExport();
201
    }
202
203
    /**
204
     * Send out a reminder that the training is due.
205
     *
206
     * @param $trainingUserId
207
     *
208
     * @return \Illuminate\Http\RedirectResponse
209
     */
210 1
    public function sendReminder($trainingUserId)
211
    {
212 1
        $trainingUser = TrainingUser::with('user')->find($trainingUserId);
213 1
        Event::fire(new TrainingAssigned($trainingUser));
214 1
        Notification::container()->success('Reminder sent to '.$trainingUser->user->userFullName);
215
216 1
        return redirect()->back();
217
    }
218
219
    /***************************/
220
    /* BEGIN PRIVATE FUNCTIONS */
221
    /***************************/
222
223
    /**
224
     * Get a list of users and create training notes from that list.
225
     *
226
     * @param $data
227
     */
228 3
    private function createTrainingNotes($data)
229
    {
230 3
        $data['author_id'] = Auth::user()->id;
231
232 3
        $users = [];
233
234
        //If we have groups, let's get the user ids.
235 3
        if (isset($data['groups'])) {
236
            $groupUsers = User::whereHas('groups', function ($q) use ($data) {
237
                $q->where('id', $data['groups']);
238
            })->get();
239
240
            //get the user ids from our groups
241
            foreach ($groupUsers as $user) {
242
                array_push($users, $user->id);
243
            }
244
        }
245
246
        //pull out our user ids.
247 3
        if (isset($data['users'])) {
248 1
            $users = array_merge($users, $data['users']);
249
        }
250
251
        //create records for each unique
252 3
        foreach (array_unique($users) as $user) {
253 1
            $data['user_id'] = $user;
254 1
            $note = TrainingUser::create($data);
255 1
            Event::fire(new TrainingAssigned($note));
256
        }
257 3
    }
258
}
259