Passed
Push — 1.11.x ( bce6cd...c146d9 )
by Angel Fernando Quiroz
12:25
created

main/gradebook/lib/be/result.class.php (3 issues)

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
/**
5
 * Defines a gradebook Result object.
6
 *
7
 * @author Bert Steppé, Stijn Konings
8
 */
9
class Result
10
{
11
    private $id;
12
    private $user_id;
13
    private $evaluation;
14
    private $created_at;
15
    private $score;
16
17
    /**
18
     * Result constructor.
19
     */
20
    public function __construct()
21
    {
22
        $this->created_at = api_get_utc_datetime();
23
    }
24
25
    public function get_id()
26
    {
27
        return $this->id;
28
    }
29
30
    public function get_user_id()
31
    {
32
        return $this->user_id;
33
    }
34
35
    public function get_evaluation_id()
36
    {
37
        return $this->evaluation;
38
    }
39
40
    public function get_date()
41
    {
42
        return $this->created_at;
43
    }
44
45
    public function get_score()
46
    {
47
        return $this->score;
48
    }
49
50
    public function set_id($id)
51
    {
52
        $this->id = $id;
53
    }
54
55
    public function set_user_id($user_id)
56
    {
57
        $this->user_id = $user_id;
58
    }
59
60
    public function set_evaluation_id($evaluation_id)
61
    {
62
        $this->evaluation = $evaluation_id;
63
    }
64
65
    /**
66
     * @param string $creation_date
67
     */
68
    public function set_date($creation_date)
69
    {
70
        $this->created_at = $creation_date;
71
    }
72
73
    /**
74
     * @param float $score
75
     */
76
    public function set_score($score)
77
    {
78
        $this->score = $score;
79
    }
80
81
    /**
82
     * Retrieve results and return them as an array of Result objects.
83
     *
84
     * @param $id result id
85
     * @param $user_id user id (student)
86
     * @param $evaluation_id evaluation where this is a result for
87
     *
88
     * @return array
89
     */
90
    public static function load($id = null, $user_id = null, $evaluation_id = null)
91
    {
92
        $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
93
        $tbl_grade_results = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
94
        $tbl_course_rel_course = Database::get_main_table(TABLE_MAIN_COURSE_USER);
95
        $tbl_session_rel_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
96
        $sessionId = api_get_session_id();
97
        $list_user_course_list = [];
98
99
        if (is_null($id) && is_null($user_id) && !is_null($evaluation_id)) {
100
            // Verified_if_exist_evaluation
101
            $sql = 'SELECT COUNT(*) AS count
102
                    FROM '.$tbl_grade_results.'
103
                    WHERE evaluation_id="'.Database::escape_string($evaluation_id).'"';
104
105
            $result = Database::query($sql);
106
            $existEvaluation = Database::result($result, 0, 0);
107
108
            if (0 != $existEvaluation) {
109
                if ($sessionId) {
110
                    $sql = 'SELECT c_id, user_id as user_id, status
111
                            FROM '.$tbl_session_rel_course_user.'
112
							WHERE
113
							    status= 0 AND
114
							    c_id = "'.api_get_course_int_id().'" AND
115
							    session_id = '.$sessionId;
116
                } else {
117
                    $sql = 'SELECT c_id, user_id, status
118
                            FROM '.$tbl_course_rel_course.'
119
                            WHERE status ="'.STUDENT.'" AND c_id = "'.api_get_course_int_id().'" ';
120
                }
121
122
                $res_course_rel_user = Database::query($sql);
123
                while ($row_course_rel_user = Database::fetch_array($res_course_rel_user, 'ASSOC')) {
124
                    $list_user_course_list[] = $row_course_rel_user;
125
                }
126
                $current_date = api_get_utc_datetime();
127
                for ($i = 0; $i < count($list_user_course_list); $i++) {
0 ignored issues
show
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
128
                    $sql_verified = 'SELECT COUNT(*) AS count
129
                                    FROM '.$tbl_grade_results.'
130
                                    WHERE
131
                                        user_id="'.intval($list_user_course_list[$i]['user_id']).'" AND
132
                                        evaluation_id="'.intval($evaluation_id).'";';
133
                    $res_verified = Database::query($sql_verified);
134
                    $info_verified = Database::result($res_verified, 0, 0);
135
                    if (0 == $info_verified) {
136
                        $sql_insert = 'INSERT INTO '.$tbl_grade_results.'(user_id,evaluation_id,created_at,score)
137
									   VALUES ("'.intval($list_user_course_list[$i]['user_id']).'","'.intval($evaluation_id).'","'.$current_date.'",0);';
138
                        Database::query($sql_insert);
139
                    }
140
                }
141
            }
142
        }
143
144
        $userIdList = [];
145
        foreach ($list_user_course_list as $data) {
146
            $userIdList[] = $data['user_id'];
147
        }
148
        $userIdListToString = implode("', '", $userIdList);
149
150
        $sql = "SELECT lastname, gr.id, gr.user_id, gr.evaluation_id, gr.created_at, gr.score
151
                FROM $tbl_grade_results gr
152
                INNER JOIN $tbl_user u
153
                ON gr.user_id = u.user_id ";
154
155
        if (!empty($userIdList)) {
156
            $sql .= " AND u.user_id IN ('$userIdListToString')";
157
        }
158
159
        $paramcount = 0;
160
        if (!empty($id)) {
161
            $sql .= ' WHERE gr.id = '.intval($id);
162
            $paramcount++;
163
        }
164
        if (!empty($user_id)) {
165
            if (0 != $paramcount) {
166
                $sql .= ' AND';
167
            } else {
168
                $sql .= ' WHERE';
169
            }
170
            $sql .= ' gr.user_id = '.intval($user_id);
171
            $paramcount++;
172
        }
173
        if (!empty($evaluation_id)) {
174
            if (0 != $paramcount) {
175
                $sql .= ' AND';
176
            } else {
177
                $sql .= ' WHERE';
178
            }
179
            $sql .= ' gr.evaluation_id = '.intval($evaluation_id);
180
        }
181
        $sql .= ' ORDER BY u.lastname, u.firstname';
182
183
        $result = Database::query($sql);
184
        $allres = [];
185
        while ($data = Database::fetch_array($result)) {
186
            $res = new Result();
187
            $res->set_id($data['id']);
188
            $res->set_user_id($data['user_id']);
189
            $res->set_evaluation_id($data['evaluation_id']);
190
            $res->set_date(api_get_local_time($data['created_at']));
191
            $res->set_score($data['score']);
192
            $allres[] = $res;
193
        }
194
195
        return $allres;
196
    }
197
198
    /**
199
     * Insert this result into the database.
200
     */
201
    public function add()
202
    {
203
        if (isset($this->user_id) && isset($this->evaluation)) {
204
            $tbl_grade_results = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
205
            $sql = "INSERT INTO ".$tbl_grade_results
206
                ." (user_id, evaluation_id,
207
					created_at";
208
            if (isset($this->score)) {
209
                $sql .= ",score";
210
            }
211
            $sql .= ") VALUES
212
					(".(int) $this->get_user_id().", ".(int) $this->get_evaluation_id()
213
                .", '".$this->get_date()."' ";
214
            if (isset($this->score)) {
215
                $sql .= ", ".$this->get_score();
216
            }
217
            $sql .= ")";
218
            Database::query($sql);
219
        } else {
220
            exit('Error in Result add: required field empty');
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
221
        }
222
    }
223
224
    /**
225
     * insert log result.
226
     */
227
    public function addResultLog($userid, $evaluationid)
228
    {
229
        if (isset($userid) && isset($evaluationid)) {
230
            $table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT_LOG);
231
            $result = new Result();
232
233
            $arr_result = $result->load(null, $userid, $evaluationid);
234
            $arr = get_object_vars($arr_result[0]);
235
236
            $sql = 'INSERT INTO '.$table
237
                .' (id_result,user_id, evaluation_id,created_at';
238
            if (isset($arr['score'])) {
239
                $sql .= ',score';
240
            }
241
            $sql .= ') VALUES
242
					('.(int) $arr['id'].','.(int) $arr['user_id'].', '.(int) $arr['evaluation']
243
                .", '".api_get_utc_datetime()."'";
244
            if (isset($arr['score'])) {
245
                $sql .= ', '.$arr['score'];
246
            }
247
            $sql .= ')';
248
249
            Database::query($sql);
250
        } else {
251
            exit('Error in Result add: required field empty');
0 ignored issues
show
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
252
        }
253
    }
254
255
    /**
256
     * Update the properties of this result in the database.
257
     */
258
    public function save()
259
    {
260
        $table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
261
        $sql = 'UPDATE '.$table.'
262
                SET user_id = '.$this->get_user_id()
263
            .', evaluation_id = '.$this->get_evaluation_id()
264
            .', score = ';
265
        if (isset($this->score)) {
266
            $sql .= $this->get_score();
267
        } else {
268
            $sql .= 'null';
269
        }
270
        $sql .= ' WHERE id = '.$this->id;
271
        // no need to update creation date
272
        Database::query($sql);
273
274
        Evaluation::generateStats($this->get_evaluation_id());
275
    }
276
277
    /**
278
     * Delete this result from the database.
279
     */
280
    public function delete()
281
    {
282
        $table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
283
        $sql = 'DELETE FROM '.$table.' WHERE id = '.$this->id;
284
        Database::query($sql);
285
        $allowMultipleAttempts = api_get_configuration_value('gradebook_multiple_evaluation_attempts');
286
        if ($allowMultipleAttempts) {
287
            $table = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT_ATTEMPT);
288
            $sql = "DELETE FROM $table WHERE result_id = ".$this->id;
289
            Database::query($sql);
290
        }
291
292
        Evaluation::generateStats($this->get_evaluation_id());
293
    }
294
295
    /**
296
     * Check if exists a result with its user and evaluation.
297
     *
298
     * @throws \Doctrine\ORM\Query\QueryException
299
     *
300
     * @return bool
301
     */
302
    public function exists()
303
    {
304
        $em = Database::getManager();
305
306
        $result = $em
307
            ->createQuery(
308
                'SELECT COUNT(gr) FROM ChamiloCoreBundle:GradebookResult gr
309
                WHERE gr.evaluationId = :eval_id AND gr.userId = :user_id'
310
            )
311
            ->setParameters(['eval_id' => $this->evaluation, 'user_id' => $this->user_id])
312
            ->getSingleScalarResult();
313
        $count = (int) $result;
314
315
        return $count > 0;
316
    }
317
}
318