Passed
Push — 1.11.x ( b4ce57...e435f5 )
by Julito
09:28
created

MeetingRepository::periodUserMeetings()   A

Complexity

Conditions 5
Paths 2

Size

Total Lines 19
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 7
c 0
b 0
f 0
nc 2
nop 3
dl 0
loc 19
rs 9.6111
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\PluginBundle\Zoom;
5
6
use Chamilo\CoreBundle\Entity\Course;
7
use Chamilo\CoreBundle\Entity\Session;
8
use Chamilo\CourseBundle\Entity\CGroupInfo;
9
use Chamilo\PageBundle\Entity\User;
10
use DateTime;
11
use Doctrine\Common\Collections\ArrayCollection;
12
use Doctrine\Common\Collections\Collection;
13
use Doctrine\Common\Collections\Criteria;
14
use Doctrine\ORM\EntityRepository;
15
use Doctrine\ORM\QueryBuilder;
16
17
/**
18
 * Class MeetingRepository.
19
 */
20
class MeetingRepository extends EntityRepository
21
{
22
    /**
23
     * Retrieves information about meetings having a start_time between two dates.
24
     *
25
     * @param DateTime $startDate
26
     * @param DateTime $endDate
27
     *
28
     * @return Meeting[]
29
     */
30
    public function periodMeetings($startDate, $endDate)
31
    {
32
        $matching = [];
33
        $all = $this->findAll();
34
        foreach ($all as $candidate) {
35
            if ($candidate->startDateTime >= $startDate && $candidate->startDateTime <= $endDate) {
36
                $matching[] = $candidate;
37
            }
38
        }
39
40
        return $matching;
41
    }
42
43
    /**
44
     * @return ArrayCollection|Collection|Meeting[]
45
     */
46
    public function globalMeetings()
47
    {
48
        return $this->matching(
49
            Criteria::create()->where(
50
                Criteria::expr()->andX(
51
                    Criteria::expr()->eq('course', null),
52
                    Criteria::expr()->eq('user', null)
53
                )
54
            )
55
        );
56
    }
57
58
    /**
59
     * @return ArrayCollection|Collection|Meeting[]
60
     */
61
    public function unfinishedGlobalMeetings()
62
    {
63
        return $this->globalMeetings()->filter(
64
            function ($meeting) {
65
                return 'finished' !== $meeting->getMeetingInfoGet()->status;
66
            }
67
        );
68
    }
69
70
    /**
71
     * Returns either a user's meetings or all user meetings.
72
     *
73
     * @param User|null $user
74
     *
75
     * @return QueryBuilder
76
     */
77
    public function userMeetings($user = null)
78
    {
79
        $qb = $this->createQueryBuilder('m');
80
        $qb
81
            ->select('m')
82
            ->leftJoin('m.registrants', 'r');
83
84
        //$qb->select('m');
85
        /*$criteria = Criteria::create()->where(
86
            Criteria::expr()->andX(
87
                Criteria::expr()->isNull('course'),
88
                Criteria::expr()->orX(
89
                    Criteria::expr()->isNull('user'),
90
                    Criteria::expr()->eq('user', $user)
91
                )
92
            ));*/
93
94
        /*$qb->where(Criteria::expr()->andX(
95
            Criteria::expr()->isNull('course'),
96
            Criteria::expr()->orX(
97
                Criteria::expr()->isNull('user'),
98
                Criteria::expr()->eq('user', $user)
99
            )
100
        ));*/
101
102
        $qb
103
            ->andWhere('m.course IS NULL')
104
            ->andWhere('m.user IS NULL OR m.user = :user OR r.user = :user');
105
106
        $qb->setParameters(['user' => $user]);
107
108
        return $qb;
109
110
        /*return $this->matching(
111
            ,
112
                Criteria::expr()->andX(
113
                    Criteria::expr()->eq('registrants', null),
114
                    Criteria::expr()->orX(
115
                        Criteria::expr()->eq('user', null),
116
                        Criteria::expr()->eq('user', $user)
117
                    )
118
                )
119
            )
120
        );*/
121
122
        /*return $this->matching(
123
            Criteria::create()->where(
124
                Criteria::expr()->andX(
125
                    Criteria::expr()->eq('course', null),
126
                    Criteria::expr()->orX(
127
                        Criteria::expr()->eq('user', null),
128
                        Criteria::expr()->eq('user', $user)
129
                    )
130
                )
131
            )
132
        );*/
133
    }
134
135
    /**
136
     * @param User|null $user
137
     *
138
     * @return Meeting[]
139
     */
140
    public function unfinishedUserMeetings($user = null)
141
    {
142
        /*return $this->userMeetings($user)->filter(
143
           function ($meeting) {
144
               return 'finished' !== $meeting->getMeetingInfoGet()->status;
145
           }
146
       );*/
147
148
        $results = @$this->userMeetings($user)->getQuery()->getResult();
149
        $list = [];
150
        foreach ($results as $meeting) {
151
            if ('finished' === $meeting->getMeetingInfoGet()->status) {
152
                $list[] = $meeting;
153
            }
154
        }
155
156
        return $list;
157
    }
158
159
    /**
160
     * @param DateTime $start
161
     * @param DateTime $end
162
     * @param User     $user
163
     *
164
     * @return ArrayCollection|Collection|Meeting[]
165
     */
166
    public function periodUserMeetings($start, $end, $user = null)
167
    {
168
        /*return $this->userMeetings($user)->filter(
169
            function ($meeting) use ($start, $end) {
170
                return $meeting->startDateTime >= $start && $meeting->startDateTime <= $end;
171
            }
172
        );*/
173
174
        $results = @$this->userMeetings($user)->getQuery()->getResult();
175
        $list = [];
176
        if ($results) {
177
            foreach ($results as $meeting) {
178
                if ($meeting->startDateTime >= $start && $meeting->startDateTime <= $end) {
179
                    $list[] = $meeting;
180
                }
181
            }
182
        }
183
184
        return $list;
185
    }
186
187
    /**
188
     * Returns either a course's meetings or all course meetings.
189
     *
190
     * @param Course|null     $course
191
     * @param Session|null    $session
192
     * @param CGroupInfo|null $group
193
     *
194
     * @return ArrayCollection|Collection|Meeting[]
195
     */
196
    public function courseMeetings($course, $group = null, $session = null)
197
    {
198
        return $this->matching(
199
            Criteria::create()->where(
200
                    Criteria::expr()->andX(
201
                 Criteria::expr()->eq('group', $group),
202
                    Criteria::expr()->eq('course', $course),
203
                    Criteria::expr()->eq('session', $session)
204
                )
205
            )
206
        );
207
    }
208
}
209