Passed
Pull Request — master (#5832)
by
unknown
12:26
created

CourseRelUserRepository::getCourseUsers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 2
eloc 16
nc 2
nop 3
dl 0
loc 21
rs 9.7333
c 3
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository;
8
9
10
use Chamilo\CoreBundle\Entity\CourseRelUser;
11
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
12
use Chamilo\CourseBundle\Entity\CLp;
13
use Chamilo\CourseBundle\Entity\CLpView;
14
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
15
use Doctrine\Persistence\ManagerRegistry;
16
17
class CourseRelUserRepository extends ServiceEntityRepository
18
{
19
    public function __construct(ManagerRegistry $registry)
20
    {
21
        parent::__construct($registry, CourseRelUser::class);
22
    }
23
24
    /**
25
     * Retrieves users from a course, with or without a session, and their LP progress.
26
     */
27
    public function getCourseUsers(int $courseId, array $lpIds, bool $checkSession = false): array
28
    {
29
        $qb = $this->createQueryBuilder('cu')
30
            ->select('u.id AS userId, c.title AS courseTitle, lp.iid AS lpId, lpv.progress')
31
            ->innerJoin('cu.user', 'u')
32
            ->innerJoin('cu.course', 'c')
33
            ->leftJoin(CLpView::class, 'lpv', 'WITH', 'lpv.user = u.id')
34
            ->leftJoin(CLp::class, 'lp', 'WITH', 'lp.iid = lpv.lp')
35
            ->where('cu.course = :courseId')
36
            ->andWhere('lp.iid IN (:lpIds)')
37
            ->setParameter('courseId', $courseId)
38
            ->setParameter('lpIds', $lpIds)
39
            ->andWhere('(lpv.progress < 100 OR lpv.progress IS NULL)');
40
41
        if ($checkSession) {
42
            $qb->addSelect('IDENTITY(scu.session) AS sessionId')
43
                ->leftJoin(SessionRelCourseRelUser::class, 'scu', 'WITH', 'scu.user = u AND scu.course = cu.course')
44
                ->andWhere('scu.session IS NOT NULL');
45
        }
46
47
        return $qb->getQuery()->getResult();
48
    }
49
}
50