Passed
Push — 1.11.x ( edf83c...19744e )
by Julito
13:08 queued 12s
created

findSessionFromVerticesEdges()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 10
nc 3
nop 1
dl 0
loc 18
rs 9.9332
c 1
b 0
f 0
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\CoreBundle\Entity\Repository;
5
6
use Chamilo\CoreBundle\Entity\SequenceResource;
7
use Doctrine\ORM\EntityRepository;
8
use Fhaculty\Graph\Set\Vertices;
9
use Fhaculty\Graph\Vertex;
10
11
/**
12
 * Class SequenceResourceRepository
13
 */
14
class SequenceResourceRepository extends EntityRepository
15
{
16
    /**
17
     * Find the SequenceResource based in the resourceId and type.
18
     *
19
     * @param int $resourceId
20
     * @param int $type
21
     *
22
     * @return SequenceResource
23
     */
24
    public function findRequirementForResource($resourceId, $type)
25
    {
26
        return $this->findOneBy(['resourceId' => $resourceId, 'type' => $type]);
27
    }
28
29
    /**
30
     * @todo implement for all types only work for sessions
31
     *
32
     * @param int $resourceId
33
     * @param int $type
34
     *
35
     * @return array
36
     */
37
    public function getRequirementAndDependencies($resourceId, $type)
38
    {
39
        $sequence = $this->findRequirementForResource($resourceId, $type);
40
        $result = ['requirements' => [], 'dependencies' => []];
41
        if ($sequence && $sequence->hasGraph()) {
42
            $graph = $sequence->getSequence()->getUnSerializeGraph();
43
            $vertex = $graph->getVertex($resourceId);
44
            $from = $vertex->getVerticesEdgeFrom();
45
46
            foreach ($from as $subVertex) {
47
                $vertexId = $subVertex->getId();
48
                $sessionInfo = api_get_session_info($vertexId);
49
                $sessionInfo['admin_link'] = '<a href="'.\SessionManager::getAdminPath($vertexId).'">'.$sessionInfo['name'].'</a>';
0 ignored issues
show
Bug introduced by
Are you sure SessionManager::getAdminPath($vertexId) of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

49
                $sessionInfo['admin_link'] = '<a href="'./** @scrutinizer ignore-type */ \SessionManager::getAdminPath($vertexId).'">'.$sessionInfo['name'].'</a>';
Loading history...
50
                $result['requirements'][] = $sessionInfo;
51
            }
52
53
            $to = $vertex->getVerticesEdgeTo();
54
            foreach ($to as $subVertex) {
55
                $vertexId = $subVertex->getId();
56
                $sessionInfo = api_get_session_info($vertexId);
57
                $sessionInfo['admin_link'] = '<a href="'.\SessionManager::getAdminPath($vertexId).'">'.$sessionInfo['name'].'</a>';
58
                $result['dependencies'][] = $sessionInfo;
59
            }
60
        }
61
62
        return $result;
63
    }
64
65
    /**
66
     * Deletes a node and check in all the dependencies if the node exists in
67
     * order to deleted.
68
     *
69
     * @param int $resourceId
70
     * @param int $type
71
     */
72
    public function deleteResource($resourceId, $type)
73
    {
74
        $sequence = $this->findRequirementForResource($resourceId, $type);
75
        if ($sequence && $sequence->hasGraph()) {
76
            $em = $this->getEntityManager();
77
            $graph = $sequence->getSequence()->getUnSerializeGraph();
78
            $mainVertex = $graph->getVertex($resourceId);
79
            $vertices = $graph->getVertices();
80
81
            /** @var Vertex $vertex */
82
            foreach ($vertices as $vertex) {
83
                $subResourceId = $vertex->getId();
84
                $subSequence = $this->findRequirementForResource($subResourceId, $type);
85
                if ($sequence && $subSequence->hasGraph()) {
86
                    $graph = $subSequence->getSequence()->getUnSerializeGraph();
87
                    $subMainVertex = $graph->getVertex($resourceId);
88
                    $subMainVertex->destroy();
89
                    $subSequence->getSequence()->setGraphAndSerialize($graph);
90
                    $em->persist($subSequence);
91
                }
92
            }
93
94
            $mainVertex->destroy();
95
            $em->remove($sequence);
96
            $em->flush();
97
        }
98
    }
99
100
    /**
101
     * Get the requirements for a resource only.
102
     *
103
     * @param int $resourceId The resource ID
104
     * @param int $type       The type of sequence resource
105
     *
106
     * @return array
107
     */
108
    public function getRequirements($resourceId, $type)
109
    {
110
        $sequencesResource = $this->findBy(['resourceId' => $resourceId, 'type' => $type]);
111
112
        $result = [];
113
        /** @var SequenceResource $sequenceResource */
114
        foreach ($sequencesResource as $sequenceResource) {
115
            if (!$sequenceResource->hasGraph()) {
116
                continue;
117
            }
118
119
            $sequence = $sequenceResource->getSequence();
120
            $graph = $sequence->getUnSerializeGraph();
121
            $vertex = $graph->getVertex($resourceId);
122
            $from = $vertex->getVerticesEdgeFrom();
123
124
            $sequenceInfo = [
125
                'name' => $sequence->getName(),
126
                'requirements' => [],
127
            ];
128
129
            foreach ($from as $subVertex) {
130
                $vertexId = $subVertex->getId();
131
                $resource = null;
132
                switch ($type) {
133
                    case SequenceResource::SESSION_TYPE:
134
                        $repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Session');
135
                        $resource = $repo->find($vertexId);
136
137
                        break;
138
                    case SequenceResource::COURSE_TYPE:
139
                        $repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Course');
140
                        $resource = $repo->find($vertexId);
141
142
                        break;
143
                }
144
145
                if (null === $resource) {
146
                    continue;
147
                }
148
149
                $sequenceInfo['requirements'][$vertexId] = $resource;
150
            }
151
152
            $result[$sequence->getId()] = $sequenceInfo;
153
        }
154
155
        return $result;
156
    }
157
158
    /**
159
     * Get the requirements and dependencies within a sequence for a resource.
160
     *
161
     * @param int $resourceId The resource ID
162
     * @param int $type       The type of sequence resource
163
     *
164
     * @return array
165
     */
166
    public function getRequirementsAndDependenciesWithinSequences($resourceId, $type)
167
    {
168
        $sequencesResource = $this->findBy([
169
            'resourceId' => $resourceId,
170
            'type' => $type,
171
        ]);
172
173
        $result = [];
174
175
        /** @var SequenceResource $sequenceResource */
176
        foreach ($sequencesResource as $sequenceResource) {
177
            if (!$sequenceResource->hasGraph()) {
178
                continue;
179
            }
180
181
            $sequence = $sequenceResource->getSequence();
182
            $graph = $sequence->getUnSerializeGraph();
183
            $vertex = $graph->getVertex($resourceId);
184
            $from = $vertex->getVerticesEdgeFrom();
185
            $to = $vertex->getVerticesEdgeTo();
186
187
            $requirements = [];
188
            $dependencies = [];
189
190
            switch ($type) {
191
                case SequenceResource::SESSION_TYPE:
192
                    $requirements = $this->findSessionFromVerticesEdges($from);
193
                    $dependencies = $this->findSessionFromVerticesEdges($to);
194
                    break;
195
            }
196
197
            $result[$sequence->getId()] = [
198
                'name' => $sequence->getName(),
199
                'requirements' => $requirements,
200
                'dependencies' => $dependencies,
201
            ];
202
        }
203
204
        return [
205
            'sequences' => $result,
206
        ];
207
    }
208
209
    /**
210
     * Get sessions from vertices.
211
     *
212
     * @param Vertices $verticesEdges The vertices
213
     *
214
     * @return array
215
     */
216
    protected function findSessionFromVerticesEdges(Vertices $verticesEdges)
217
    {
218
        $sessionVertices = [];
219
        foreach ($verticesEdges as $supVertex) {
220
            $vertexId = $supVertex->getId();
221
            $session = $this->getEntityManager()->getReference(
222
                'ChamiloCoreBundle:Session',
223
                $vertexId
224
            );
225
226
            if (empty($session)) {
227
                continue;
228
            }
229
230
            $sessionVertices[$vertexId] = $session;
231
        }
232
233
        return $sessionVertices;
234
    }
235
236
    /**
237
     * Check if the ser has completed the requirements for the sequences.
238
     *
239
     * @param array $sequences The sequences
240
     * @param int   $type      The type of sequence resource
241
     * @param int   $userId
242
     *
243
     * @return array
244
     */
245
    public function checkRequirementsForUser(array $sequences, $type, $userId)
246
    {
247
        $sequenceList = [];
248
        $gradebookCategoryRepo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:GradebookCategory');
249
250
        foreach ($sequences as $sequenceId => $sequence) {
251
            $item = [
252
                'name' => $sequence['name'],
253
                'requirements' => [],
254
            ];
255
            $resourceItem = null;
256
257
            foreach ($sequence['requirements'] as $resource) {
258
                switch ($type) {
259
                    case SequenceResource::SESSION_TYPE:
260
                        $id = $resource->getId();
261
                        $resourceItem = [
262
                            'name' => $resource->getName(),
263
                            'status' => true,
264
                        ];
265
266
                        $sessionsCourses = $resource->getCourses();
267
268
                        foreach ($sessionsCourses as $sessionCourse) {
269
                            $course = $sessionCourse->getCourse();
270
271
                            $gradebooks = $gradebookCategoryRepo->findBy(
272
                                [
273
                                    'courseCode' => $course->getCode(),
274
                                    'sessionId' => $resource->getId(),
275
                                    'isRequirement' => true,
276
                                ]
277
                            );
278
279
                            foreach ($gradebooks as $gradebook) {
280
                                $category = \Category::createCategoryObjectFromEntity($gradebook);
281
282
                                if (!empty($userId)) {
283
                                    $resourceItem['status'] = $resourceItem['status'] && \Category::userFinishedCourse(
284
                                        $userId,
285
                                        $category
286
                                    );
287
                                }
288
                            }
289
                        }
290
291
                        break;
292
293
                    case SequenceResource::COURSE_TYPE:
294
                        $id = $resource->getId();
295
                        $resourceItem = [
296
                            'name' => $resource->getTitle(),
297
                            'status' => true,
298
                        ];
299
300
                        $gradebooks = $gradebookCategoryRepo->findBy(
301
                            [
302
                                'courseCode' => $resource->getCode(),
303
                                'sessionId' => 0,
304
                                'isRequirement' => true,
305
                            ]
306
                        );
307
308
                        foreach ($gradebooks as $gradebook) {
309
                            $category = \Category::createCategoryObjectFromEntity($gradebook);
310
311
                            if (!empty($userId)) {
312
                                $resourceItem['status'] = $resourceItem['status'] && \Category::userFinishedCourse(
313
                                    $userId,
314
                                    $category
315
                                );
316
                            }
317
                        }
318
319
                        break;
320
                }
321
322
                if (empty($id)) {
323
                    continue;
324
                }
325
326
                $item['requirements'][$id] = $resourceItem;
327
            }
328
            $sequenceList[$sequenceId] = $item;
329
        }
330
331
        return $sequenceList;
332
    }
333
334
    /**
335
     * Check if at least one sequence are completed.
336
     *
337
     * @param array $sequences The sequences
338
     *
339
     * @return bool
340
     */
341
    public function checkSequenceAreCompleted(array $sequences)
342
    {
343
        foreach ($sequences as $sequence) {
344
            $status = true;
345
346
            foreach ($sequence['requirements'] as $item) {
347
                $status = $status && $item['status'];
348
            }
349
350
            if ($status) {
351
                return true;
352
            }
353
        }
354
355
        return false;
356
    }
357
}
358