Completed
Push — master ( bf9357...375c96 )
by Julito
14:39 queued 22s
created

UserRepository::searchUsersByStatus()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 25
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 16
c 0
b 0
f 0
nc 4
nop 3
dl 0
loc 25
rs 9.7333
1
<?php
2
/* For licensing terms, see /license.txt */
3
4
namespace Chamilo\UserBundle\Repository;
5
6
use Chamilo\CoreBundle\Entity\AccessUrl;
7
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
8
use Chamilo\CoreBundle\Entity\Course;
9
use Chamilo\CoreBundle\Entity\CourseRelUser;
10
use Chamilo\CoreBundle\Entity\GradebookCertificate;
11
use Chamilo\CoreBundle\Entity\GradebookResult;
12
use Chamilo\CoreBundle\Entity\Message;
13
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
14
use Chamilo\CoreBundle\Entity\Session;
15
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
16
use Chamilo\CoreBundle\Entity\SkillRelUser;
17
use Chamilo\CoreBundle\Entity\SkillRelUserComment;
18
use Chamilo\CoreBundle\Entity\TrackEAccess;
19
use Chamilo\CoreBundle\Entity\TrackEAttempt;
20
use Chamilo\CoreBundle\Entity\TrackECourseAccess;
21
use Chamilo\CoreBundle\Entity\TrackEDefault;
22
use Chamilo\CoreBundle\Entity\TrackEDownloads;
23
use Chamilo\CoreBundle\Entity\TrackEExercises;
24
use Chamilo\CoreBundle\Entity\TrackELastaccess;
25
use Chamilo\CoreBundle\Entity\TrackELogin;
26
use Chamilo\CoreBundle\Entity\TrackEOnline;
27
use Chamilo\CoreBundle\Entity\TrackEUploads;
28
use Chamilo\CoreBundle\Entity\UserApiKey;
29
use Chamilo\CoreBundle\Entity\UserCourseCategory;
30
use Chamilo\CoreBundle\Entity\UsergroupRelUser;
31
use Chamilo\CoreBundle\Entity\UserRelCourseVote;
32
use Chamilo\CoreBundle\Repository\ResourceRepository;
33
use Chamilo\CoreBundle\Repository\ResourceRepositoryInterface;
34
use Chamilo\CourseBundle\Entity\CAttendanceResult;
35
use Chamilo\CourseBundle\Entity\CAttendanceSheet;
36
use Chamilo\CourseBundle\Entity\CBlogPost;
37
use Chamilo\CourseBundle\Entity\CDropboxFeedback;
38
use Chamilo\CourseBundle\Entity\CDropboxFile;
39
use Chamilo\CourseBundle\Entity\CDropboxPerson;
40
use Chamilo\CourseBundle\Entity\CForumPost;
41
use Chamilo\CourseBundle\Entity\CForumThread;
42
use Chamilo\CourseBundle\Entity\CGroupRelUser;
43
use Chamilo\CourseBundle\Entity\CLpView;
44
use Chamilo\CourseBundle\Entity\CNotebook;
45
use Chamilo\CourseBundle\Entity\CStudentPublication;
46
use Chamilo\CourseBundle\Entity\CStudentPublicationComment;
47
use Chamilo\CourseBundle\Entity\CSurveyAnswer;
48
use Chamilo\CourseBundle\Entity\CWiki;
49
use Chamilo\TicketBundle\Entity\Ticket;
50
use Chamilo\UserBundle\Entity\User;
51
use Doctrine\ORM\EntityManagerInterface;
52
use Doctrine\ORM\EntityRepository;
53
use Doctrine\ORM\Query\Expr\Join;
54
use Symfony\Component\Finder\Finder;
55
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
56
use Symfony\Component\Serializer\Encoder\JsonEncoder;
57
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
58
use Symfony\Component\Serializer\Serializer;
59
60
/**
61
 * Class UserRepository.
62
 *
63
 * All functions that query the database (selects)
64
 * Functions should return query builders.
65
 */
66
class UserRepository extends ResourceRepository
67
{
68
    /**
69
     * @var EntityRepository
70
     */
71
    //private $repository;
72
73
    /*public function __construct(EntityManagerInterface $entityManager)
74
    {
75
        $this->repository = $entityManager->getRepository(User::class);
76
    }*/
77
78
    /*public function find($id)
79
    {
80
        $user = $this->repository->find($id);
81
82
        if (null === $user) {
83
            throw new UsernameNotFoundException(sprintf("User '%s' not found.", $id));
84
        }
85
86
        return $user;
87
    }*/
88
89
    public function addUserToResourceNode(int $userId, int $creatorId, AccessUrl $url): ResourceNode
90
    {
91
        /** @var User $user */
92
        $user = $this->find($userId);
93
        $creator = $this->find($creatorId);
94
95
        $resourceNode = new ResourceNode();
96
        $resourceNode
97
            ->setSlug($user->getUsername())
98
            ->setCreator($creator)
99
            ->setResourceType($this->getResourceType())
100
            ->setParent($url->getResourceNode());
101
        $this->getEntityManager()->persist($resourceNode);
102
        $user->setResourceNode($resourceNode);
103
        $this->getEntityManager()->persist($user);
104
105
        return $resourceNode;
106
    }
107
108
    public function findByUsername(string $username): ?User
109
    {
110
        $user = $this->repository->findOneBy(['username' => $username]);
111
112
        if (null === $user) {
113
            throw new UsernameNotFoundException(sprintf("User with id '%s' not found.", $username));
114
        }
115
116
        return $user;
117
    }
118
119
    /**
120
     * @param string $keyword
121
     *
122
     * @return mixed
123
     */
124
    public function searchUserByKeyword($keyword)
125
    {
126
        $qb = $this->repository->createQueryBuilder('a');
127
128
        // Selecting user info
129
        $qb->select('DISTINCT b');
130
131
        $qb->from('Chamilo\UserBundle\Entity\User', 'b');
132
133
        // Selecting courses for users
134
        //$qb->innerJoin('u.courses', 'c');
135
136
        //@todo check app settings
137
        $qb->add('orderBy', 'b.firstname ASC');
138
        $qb->where('b.firstname LIKE :keyword OR b.lastname LIKE :keyword ');
139
        $qb->setParameter('keyword', "%$keyword%");
140
        $query = $qb->getQuery();
141
142
        return $query->execute();
143
    }
144
145
    /**
146
     * @param string $role
147
     *
148
     * @return array
149
     */
150
    public function findByRole($role)
151
    {
152
        $em = $this->repository->getEntityManager();
153
        $qb = $em->createQueryBuilder();
154
155
        $qb->select('u')
156
            ->from($this->_entityName, 'u')
157
            ->where('u.roles LIKE :roles')
158
            ->setParameter('roles', '%"'.$role.'"%');
159
160
        return $qb->getQuery()->getResult();
161
    }
162
163
    /**
164
     * Get course user relationship based in the course_rel_user table.
165
     *
166
     * @return array
167
     */
168
    /*public function getCourses(User $user)
169
    {
170
        $queryBuilder = $this->createQueryBuilder('user');
171
172
        // Selecting course info.
173
        $queryBuilder->select('c');
174
175
        // Loading User.
176
        //$qb->from('Chamilo\UserBundle\Entity\User', 'u');
177
178
        // Selecting course
179
        $queryBuilder->innerJoin('Chamilo\CoreBundle\Entity\Course', 'c');
180
181
        //@todo check app settings
182
        //$qb->add('orderBy', 'u.lastname ASC');
183
184
        $wherePart = $queryBuilder->expr()->andx();
185
186
        // Get only users subscribed to this course
187
        $wherePart->add($queryBuilder->expr()->eq('user.userId', $user->getUserId()));
188
189
        $queryBuilder->where($wherePart);
190
        $query = $queryBuilder->getQuery();
191
192
        return $query->execute();
193
    }
194
195
    public function getTeachers()
196
    {
197
        $queryBuilder = $this->createQueryBuilder('u');
198
199
        // Selecting course info.
200
        $queryBuilder
201
            ->select('u')
202
            ->where('u.groups.id = :groupId')
203
            ->setParameter('groupId', 1);
204
205
        $query = $queryBuilder->getQuery();
206
207
        return $query->execute();
208
    }*/
209
210
    /*public function getUsers($group)
211
    {
212
        $queryBuilder = $this->createQueryBuilder('u');
213
214
        // Selecting course info.
215
        $queryBuilder
216
            ->select('u')
217
            ->where('u.groups = :groupId')
218
            ->setParameter('groupId', $group);
219
220
        $query = $queryBuilder->getQuery();
221
222
        return $query->execute();
223
    }*/
224
225
    /**
226
     * Get a filtered list of user by status and (optionally) access url.
227
     *
228
     * @todo not use status
229
     *
230
     * @param string $query       The query to filter
231
     * @param int    $status      The status
232
     * @param int    $accessUrlId The access URL ID
233
     *
234
     * @return array
235
     */
236
    public function searchUsersByStatus($query, $status, $accessUrlId = null)
237
    {
238
        $accessUrlId = (int) $accessUrlId;
239
        $queryBuilder = $this->repository->createQueryBuilder('u');
240
241
        if ($accessUrlId > 0) {
242
            $queryBuilder->innerJoin(
243
                'ChamiloCoreBundle:AccessUrlRelUser',
244
                'auru',
245
                Join::WITH,
246
                'u.id = auru.user'
247
            );
248
        }
249
250
        $queryBuilder->where('u.status = :status')
251
            ->andWhere('u.username LIKE :query OR u.firstname LIKE :query OR u.lastname LIKE :query')
252
            ->setParameter('status', $status)
253
            ->setParameter('query', "$query%");
254
255
        if ($accessUrlId > 0) {
256
            $queryBuilder->andWhere('auru.url = :url')
257
                ->setParameter(':url', $accessUrlId);
258
        }
259
260
        return $queryBuilder->getQuery()->getResult();
261
    }
262
263
    /**
264
     * Get the coaches for a course within a session.
265
     *
266
     * @param Session $session The session
267
     * @param Course  $course  The course
268
     *
269
     * @return \Doctrine\ORM\QueryBuilder
270
     */
271
    public function getCoachesForSessionCourse(Session $session, Course $course)
272
    {
273
        $queryBuilder = $this->repository->createQueryBuilder('u');
274
275
        $queryBuilder->select('u')
276
            ->innerJoin(
277
                'ChamiloCoreBundle:SessionRelCourseRelUser',
278
                'scu',
279
                Join::WITH,
280
                'scu.user = u'
281
            )
282
            ->where(
283
                $queryBuilder->expr()->andX(
284
                    $queryBuilder->expr()->eq('scu.session', $session->getId()),
285
                    $queryBuilder->expr()->eq('scu.course', $course->getId()),
286
                    $queryBuilder->expr()->eq('scu.status', SessionRelCourseRelUser::STATUS_COURSE_COACH)
287
                )
288
            );
289
290
        return $queryBuilder->getQuery()->getResult();
291
    }
292
293
    /**
294
     * Get course user relationship based in the course_rel_user table.
295
     *
296
     * @return array
297
     */
298
    /*public function getCourses(User $user)
299
    {
300
        $queryBuilder = $this->createQueryBuilder('user');
301
302
        // Selecting course info.
303
        $queryBuilder->select('c');
304
305
        // Loading User.
306
        //$qb->from('Chamilo\UserBundle\Entity\User', 'u');
307
308
        // Selecting course
309
        $queryBuilder->innerJoin('Chamilo\CoreBundle\Entity\Course', 'c');
310
311
        //@todo check app settings
312
        //$qb->add('orderBy', 'u.lastname ASC');
313
314
        $wherePart = $queryBuilder->expr()->andx();
315
316
        // Get only users subscribed to this course
317
        $wherePart->add($queryBuilder->expr()->eq('user.userId', $user->getUserId()));
318
319
        $queryBuilder->where($wherePart);
320
        $query = $queryBuilder->getQuery();
321
322
        return $query->execute();
323
    }
324
325
    public function getTeachers()
326
    {
327
        $queryBuilder = $this->createQueryBuilder('u');
328
329
        // Selecting course info.
330
        $queryBuilder
331
            ->select('u')
332
            ->where('u.groups.id = :groupId')
333
            ->setParameter('groupId', 1);
334
335
        $query = $queryBuilder->getQuery();
336
337
        return $query->execute();
338
    }*/
339
340
    /*public function getUsers($group)
341
    {
342
        $queryBuilder = $this->createQueryBuilder('u');
343
344
        // Selecting course info.
345
        $queryBuilder
346
            ->select('u')
347
            ->where('u.groups = :groupId')
348
            ->setParameter('groupId', $group);
349
350
        $query = $queryBuilder->getQuery();
351
352
        return $query->execute();
353
    }*/
354
355
    /**
356
     * Get the sessions admins for a user.
357
     *
358
     * @return array
359
     */
360
    public function getSessionAdmins(User $user)
361
    {
362
        $queryBuilder = $this->repository->createQueryBuilder('u');
363
        $queryBuilder
364
            ->distinct()
365
            ->innerJoin(
366
                'ChamiloCoreBundle:SessionRelUser',
367
                'su',
368
                Join::WITH,
369
                $queryBuilder->expr()->eq('u', 'su.user')
370
            )
371
            ->innerJoin(
372
                'ChamiloCoreBundle:SessionRelCourseRelUser',
373
                'scu',
374
                Join::WITH,
375
                $queryBuilder->expr()->eq('su.session', 'scu.session')
376
            )
377
            ->where(
378
                $queryBuilder->expr()->eq('scu.user', $user->getId())
379
            )
380
            ->andWhere(
381
                $queryBuilder->expr()->eq('su.relationType', SESSION_RELATION_TYPE_RRHH)
382
            )
383
        ;
384
385
        return $queryBuilder->getQuery()->getResult();
386
    }
387
388
    /**
389
     * Get the student bosses for a user.
390
     *
391
     * @return array
392
     */
393
    public function getStudentBosses(User $user)
394
    {
395
        $queryBuilder = $this->repository->createQueryBuilder('u');
396
        $queryBuilder
397
            ->distinct()
398
            ->innerJoin(
399
                'ChamiloCoreBundle:UserRelUser',
400
                'uu',
401
                Join::WITH,
402
                $queryBuilder->expr()->eq('u.id', 'uu.friendUserId')
403
            )
404
            ->where(
405
                $queryBuilder->expr()->eq('uu.relationType', USER_RELATION_TYPE_BOSS)
406
            )
407
            ->andWhere(
408
                $queryBuilder->expr()->eq('uu.userId', $user->getId())
409
            );
410
411
        return $queryBuilder->getQuery()->getResult();
412
    }
413
414
    /**
415
     * Get number of users in URL.
416
     *
417
     * @return int
418
     */
419
    public function getCountUsersByUrl(AccessUrl $url)
420
    {
421
        return $this->repository->createQueryBuilder('a')
422
            ->select('COUNT(a)')
423
            ->innerJoin('a.portals', 'u')
424
            ->where('u.portal = :u')
425
            ->setParameters(['u' => $url])
426
            ->getQuery()
427
            ->getSingleScalarResult();
428
    }
429
430
    /**
431
     * Get number of users in URL.
432
     *
433
     * @return int
434
     */
435
    public function getCountTeachersByUrl(AccessUrl $url)
436
    {
437
        $qb = $this->repository->createQueryBuilder('a');
438
439
        return $qb
440
            ->select('COUNT(a)')
441
            ->innerJoin('a.portals', 'u')
442
            ->where('u.portal = :u and u.group = :g')
443
            ->andWhere($qb->expr()->in('a.roles', ['ROLE_TEACHER']))
444
            ->setParameters(['u' => $url, 'g' => $group])
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $group seems to be never defined.
Loading history...
445
            ->getQuery()
446
            ->getSingleScalarResult()
447
        ;
448
    }
449
450
    /**
451
     * Find potential users to send a message.
452
     *
453
     * @param int    $currentUserId The current user ID
454
     * @param string $searchFilter  Optional. The search text to filter the user list
455
     * @param int    $limit         Optional. Sets the maximum number of results to retrieve
456
     *
457
     * @return mixed
458
     */
459
    public function findUsersToSendMessage($currentUserId, $searchFilter = null, $limit = 10)
460
    {
461
        $allowSendMessageToAllUsers = api_get_setting('allow_send_message_to_all_platform_users');
462
        $accessUrlId = api_get_multiple_access_url() ? api_get_current_access_url_id() : 1;
463
464
        if (api_get_setting('allow_social_tool') === 'true' &&
465
            api_get_setting('allow_message_tool') === 'true'
466
        ) {
467
            // All users
468
            if ($allowSendMessageToAllUsers === 'true' || api_is_platform_admin()) {
469
                $dql = "SELECT DISTINCT U
470
                        FROM ChamiloUserBundle:User U
471
                        LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
472
                        WITH U = R.user
473
                        WHERE
474
                            U.active = 1 AND
475
                            U.status != 6  AND
476
                            U.id != $currentUserId AND
477
                            R.url = $accessUrlId";
478
            } else {
479
                $dql = "SELECT DISTINCT U
480
                        FROM ChamiloCoreBundle:AccessUrlRelUser R, ChamiloCoreBundle:UserRelUser UF
481
                        INNER JOIN ChamiloUserBundle:User AS U
482
                        WITH UF.friendUserId = U
483
                        WHERE
484
                            U.active = 1 AND
485
                            U.status != 6 AND
486
                            UF.relationType NOT IN(".USER_RELATION_TYPE_DELETED.", ".USER_RELATION_TYPE_RRHH.") AND
487
                            UF.userId = $currentUserId AND
488
                            UF.friendUserId != $currentUserId AND
489
                            U = R.user AND
490
                            R.url = $accessUrlId";
491
            }
492
        } elseif (
493
            api_get_setting('allow_social_tool') === 'false' &&
494
            api_get_setting('allow_message_tool') === 'true'
495
        ) {
496
            if ($allowSendMessageToAllUsers === 'true') {
497
                $dql = "SELECT DISTINCT U
498
                        FROM ChamiloUserBundle:User U
499
                        LEFT JOIN ChamiloCoreBundle:AccessUrlRelUser R
500
                        WITH U = R.user
501
                        WHERE
502
                            U.active = 1 AND
503
                            U.status != 6  AND
504
                            U.id != $currentUserId AND
505
                            R.url = $accessUrlId";
506
            } else {
507
                $time_limit = api_get_setting('time_limit_whosonline');
508
                $online_time = time() - $time_limit * 60;
509
                $limit_date = api_get_utc_datetime($online_time);
510
                $dql = "SELECT DISTINCT U
511
                        FROM ChamiloUserBundle:User U
512
                        INNER JOIN ChamiloCoreBundle:TrackEOnline T
513
                        WITH U.id = T.loginUserId
514
                        WHERE
515
                          U.active = 1 AND
516
                          T.loginDate >= '".$limit_date."'";
517
            }
518
        }
519
520
        $parameters = [];
521
522
        if (!empty($searchFilter)) {
523
            $dql .= ' AND (U.firstname LIKE :search OR U.lastname LIKE :search OR U.email LIKE :search OR U.username LIKE :search)';
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $dql does not seem to be defined for all execution paths leading up to this point.
Loading history...
524
            $parameters['search'] = "%$searchFilter%";
525
        }
526
527
        return $this->getEntityManager()
528
            ->createQuery($dql)
529
            ->setMaxResults($limit)
530
            ->setParameters($parameters)
531
            ->getResult();
532
    }
533
534
    /**
535
     * Get the list of HRM who have assigned this user.
536
     *
537
     * @param int $userId
538
     * @param int $urlId
539
     *
540
     * @return array
541
     */
542
    public function getAssignedHrmUserList($userId, $urlId)
543
    {
544
        $qb = $this->repository->createQueryBuilder('user');
545
546
        $hrmList = $qb
547
            ->select('uru')
548
            ->innerJoin('ChamiloCoreBundle:UserRelUser', 'uru', Join::WITH, 'uru.userId = user.id')
549
            ->innerJoin('ChamiloCoreBundle:AccessUrlRelUser', 'auru', Join::WITH, 'auru.user = uru.friendUserId')
550
            ->where(
551
                $qb->expr()->eq('auru.url', $urlId)
552
            )
553
            ->andWhere(
554
                $qb->expr()->eq('uru.userId', $userId)
555
            )
556
            ->andWhere(
557
                $qb->expr()->eq('uru.relationType', USER_RELATION_TYPE_RRHH)
558
            )
559
            ->getQuery()
560
            ->getResult();
561
562
        return $hrmList;
563
    }
564
565
    /**
566
     * Serialize the whole entity to an array.
567
     *
568
     * @param int   $userId
569
     * @param array $substitutionTerms Substitute terms for some elements
570
     *
571
     * @return string
572
     */
573
    public function getPersonalDataToJson($userId, array $substitutionTerms)
574
    {
575
        $em = $this->getEntityManager();
576
        $dateFormat = \Datetime::ATOM;
577
578
        /** @var User $user */
579
        $user = $this->find($userId);
580
581
        $user->setPassword($substitutionTerms['password']);
582
        $user->setSalt($substitutionTerms['salt']);
583
        $noDataLabel = $substitutionTerms['empty'];
584
585
        // Dummy content
586
        $user->setDateOfBirth(null);
587
        //$user->setBiography($noDataLabel);
588
        $user->setFacebookData($noDataLabel);
589
        $user->setFacebookName($noDataLabel);
590
        $user->setFacebookUid($noDataLabel);
591
        //$user->setImageName($noDataLabel);
592
        //$user->setTwoStepVerificationCode($noDataLabel);
593
        $user->setGender($noDataLabel);
594
        $user->setGplusData($noDataLabel);
595
        $user->setGplusName($noDataLabel);
596
        $user->setGplusUid($noDataLabel);
597
        $user->setLocale($noDataLabel);
598
        $user->setTimezone($noDataLabel);
599
        $user->setTwitterData($noDataLabel);
600
        $user->setTwitterName($noDataLabel);
601
        $user->setTwitterUid($noDataLabel);
602
        $user->setWebsite($noDataLabel);
603
        $user->setToken($noDataLabel);
604
605
        $courses = $user->getCourses();
606
        $list = [];
607
        $chatFiles = [];
608
        /** @var CourseRelUser $course */
609
        foreach ($courses as $course) {
610
            $list[] = $course->getCourse()->getCode();
611
            $courseDir = api_get_path(SYS_COURSE_PATH).$course->getCourse()->getDirectory();
0 ignored issues
show
Bug introduced by
The constant Chamilo\UserBundle\Repository\SYS_COURSE_PATH was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
612
            $documentDir = $courseDir.'/document/chat_files/';
613
            if (is_dir($documentDir)) {
614
                $fs = new Finder();
615
                $fs->files()->in($documentDir);
616
                foreach ($fs as $file) {
617
                    $chatFiles[] =
618
                        $course->getCourse()->getDirectory().'/document/chat_files/'.$file->getFilename().' - '.
619
                        get_lang('This content is not accessible to you directly because of course-related access rules. If you require access to that data, please contact the Data Privacy Officer as defined in our privacy terms.');
620
                }
621
            }
622
        }
623
624
        $user->setCourses($list);
625
626
        $classes = $user->getClasses();
627
        $list = [];
628
        /** @var UsergroupRelUser $class */
629
        foreach ($classes as $class) {
630
            $name = $class->getUsergroup()->getName();
631
            $list[$class->getUsergroup()->getGroupType()][] = $name.' - Status: '.$class->getRelationType();
632
        }
633
        $user->setClasses($list);
634
635
        $collection = $user->getSessionCourseSubscriptions();
636
        $list = [];
637
        /** @var SessionRelCourseRelUser $item */
638
        foreach ($collection as $item) {
639
            $list[$item->getSession()->getName()][] = $item->getCourse()->getCode();
640
        }
641
        $user->setSessionCourseSubscriptions($list);
642
643
        $documents = \DocumentManager::getAllDocumentsCreatedByUser($userId);
644
645
        $friends = \SocialManager::get_friends($userId);
646
        $friendList = [];
647
        if (!empty($friends)) {
648
            foreach ($friends as $friend) {
649
                $friendList[] = $friend['user_info']['complete_name'];
650
            }
651
        }
652
653
        $agenda = new \Agenda('personal');
654
        $events = $agenda->getEvents('', '', null, null, $userId, 'array');
655
        $eventList = [];
656
        if (!empty($events)) {
657
            foreach ($events as $event) {
658
                $eventList[] = $event['title'].' '.$event['start_date_localtime'].' / '.$event['end_date_localtime'];
659
            }
660
        }
661
662
        // GradebookCertificate
663
        $criteria = [
664
            'userId' => $userId,
665
        ];
666
        $result = $em->getRepository('ChamiloCoreBundle:GradebookCertificate')->findBy($criteria);
667
        $gradebookCertificate = [];
668
        /** @var GradebookCertificate $item */
669
        foreach ($result as $item) {
670
            $createdAt = $item->getCreatedAt() ? $item->getCreatedAt()->format($dateFormat) : '';
671
            $list = [
672
                'Score: '.$item->getScoreCertificate(),
673
                'Path: '.$item->getPathCertificate(),
674
                'Created at: '.$createdAt,
675
            ];
676
            $gradebookCertificate[] = implode(', ', $list);
677
        }
678
679
        // TrackEExercises
680
        $criteria = [
681
            'exeUserId' => $userId,
682
        ];
683
        $result = $em->getRepository('ChamiloCoreBundle:TrackEExercises')->findBy($criteria);
684
        $trackEExercises = [];
685
        /** @var TrackEExercises $item */
686
        foreach ($result as $item) {
687
            $date = $item->getExeDate() ? $item->getExeDate()->format($dateFormat) : '';
688
            $list = [
689
                'IP: '.$item->getUserIp(),
690
                'Start: '.$date,
691
                'Status: '.$item->getStatus(),
692
                // 'Result: '.$item->getExeResult(),
693
                // 'Weighting: '.$item->getExeWeighting(),
694
            ];
695
            $trackEExercises[] = implode(', ', $list);
696
        }
697
698
        // TrackEAttempt
699
        $criteria = [
700
            'userId' => $userId,
701
        ];
702
        $result = $em->getRepository('ChamiloCoreBundle:TrackEAttempt')->findBy($criteria);
703
        $trackEAttempt = [];
704
        /** @var TrackEAttempt $item */
705
        foreach ($result as $item) {
706
            $date = $item->getTms() ? $item->getTms()->format($dateFormat) : '';
707
            $list = [
708
                'Attempt #'.$item->getExeId(),
709
                'Course # '.$item->getCourse()->getCode(),
710
                //'Answer: '.$item->getAnswer(),
711
                'Session #'.$item->getSessionId(),
712
                //'Marks: '.$item->getMarks(),
713
                'Position: '.$item->getPosition(),
714
                'Date: '.$date,
715
            ];
716
            $trackEAttempt[] = implode(', ', $list);
717
        }
718
719
        // TrackECourseAccess
720
        $criteria = [
721
            'userId' => $userId,
722
        ];
723
        $result = $em->getRepository('ChamiloCoreBundle:TrackECourseAccess')->findBy($criteria);
724
        $trackECourseAccessList = [];
725
        /** @var TrackECourseAccess $item */
726
        foreach ($result as $item) {
727
            $startDate = $item->getLoginCourseDate() ? $item->getLoginCourseDate()->format($dateFormat) : '';
728
            $endDate = $item->getLogoutCourseDate() ? $item->getLogoutCourseDate()->format($dateFormat) : '';
729
            $list = [
730
                'IP: '.$item->getUserIp(),
731
                'Start: '.$startDate,
732
                'End: '.$endDate,
733
            ];
734
            $trackECourseAccessList[] = implode(', ', $list);
735
        }
736
737
        $checkEntities = [
738
            'ChamiloCoreBundle:TrackELogin' => 'loginUserId',
739
            'ChamiloCoreBundle:TrackEAccess' => 'accessUserId',
740
            'ChamiloCoreBundle:TrackEOnline' => 'loginUserId',
741
            'ChamiloCoreBundle:TrackEDefault' => 'defaultUserId',
742
            'ChamiloCoreBundle:TrackELastaccess' => 'accessUserId',
743
            'ChamiloCoreBundle:TrackEUploads' => 'uploadUserId',
744
            'ChamiloCoreBundle:GradebookResult' => 'userId',
745
            'ChamiloCoreBundle:TrackEDownloads' => 'downUserId',
746
        ];
747
748
        $maxResults = 1000;
749
        $trackResults = [];
750
        foreach ($checkEntities as $entity => $field) {
751
            $qb = $em->createQueryBuilder();
752
            $qb->select($qb->expr()->count('l'))
753
                ->from($entity, 'l')
754
                ->where("l.$field = :login")
755
                ->setParameter('login', $userId);
756
            $query = $qb->getQuery();
757
            $count = $query->getSingleScalarResult();
758
759
            if ($count > $maxResults) {
760
                $qb = $em->getRepository($entity)->createQueryBuilder('l');
761
                $qb
762
                    ->select('l')
763
                    ->where("l.$field = :login")
764
                    ->setParameter('login', $userId);
765
                $qb
766
                    ->setFirstResult(0)
767
                    ->setMaxResults($maxResults)
768
                ;
769
                $result = $qb->getQuery()->getResult();
770
            } else {
771
                $criteria = [
772
                    $field => $userId,
773
                ];
774
                $result = $em->getRepository($entity)->findBy($criteria);
775
            }
776
            $trackResults[$entity] = $result;
777
        }
778
779
        $trackELoginList = [];
780
        /** @var TrackELogin $item */
781
        foreach ($trackResults['ChamiloCoreBundle:TrackELogin'] as $item) {
782
            $startDate = $item->getLoginDate() ? $item->getLoginDate()->format($dateFormat) : '';
783
            $endDate = $item->getLogoutDate() ? $item->getLogoutDate()->format($dateFormat) : '';
784
            $list = [
785
                'IP: '.$item->getUserIp(),
786
                'Start: '.$startDate,
787
                'End: '.$endDate,
788
            ];
789
            $trackELoginList[] = implode(', ', $list);
790
        }
791
792
        // TrackEAccess
793
        $trackEAccessList = [];
794
        /** @var TrackEAccess $item */
795
        foreach ($trackResults['ChamiloCoreBundle:TrackEAccess'] as $item) {
796
            $date = $item->getAccessDate() ? $item->getAccessDate()->format($dateFormat) : '';
797
            $list = [
798
                'IP: '.$item->getUserIp(),
799
                'Tool: '.$item->getAccessTool(),
800
                'End: '.$date,
801
            ];
802
            $trackEAccessList[] = implode(', ', $list);
803
        }
804
805
        // TrackEOnline
806
        $trackEOnlineList = [];
807
        /** @var TrackEOnline $item */
808
        foreach ($trackResults['ChamiloCoreBundle:TrackEOnline'] as $item) {
809
            $date = $item->getLoginDate() ? $item->getLoginDate()->format($dateFormat) : '';
810
            $list = [
811
                'IP: '.$item->getUserIp(),
812
                'Login date: '.$date,
813
                'Course # '.$item->getCId(),
814
                'Session # '.$item->getSessionId(),
815
            ];
816
            $trackEOnlineList[] = implode(', ', $list);
817
        }
818
819
        // TrackEDefault
820
        $trackEDefault = [];
821
        /** @var TrackEDefault $item */
822
        foreach ($trackResults['ChamiloCoreBundle:TrackEDefault'] as $item) {
823
            $date = $item->getDefaultDate() ? $item->getDefaultDate()->format($dateFormat) : '';
824
            $list = [
825
                'Type: '.$item->getDefaultEventType(),
826
                'Value: '.$item->getDefaultValue(),
827
                'Value type: '.$item->getDefaultValueType(),
828
                'Date: '.$date,
829
                'Course #'.$item->getCId(),
830
                'Session # '.$item->getSessionId(),
831
            ];
832
            $trackEDefault[] = implode(', ', $list);
833
        }
834
835
        // TrackELastaccess
836
        $trackELastaccess = [];
837
        /** @var TrackELastaccess $item */
838
        foreach ($trackResults['ChamiloCoreBundle:TrackELastaccess'] as $item) {
839
            $date = $item->getAccessDate() ? $item->getAccessDate()->format($dateFormat) : '';
840
            $list = [
841
                'Course #'.$item->getCId(),
842
                'Session # '.$item->getAccessSessionId(),
843
                'Tool: '.$item->getAccessTool(),
844
                'Access date: '.$date,
845
            ];
846
            $trackELastaccess[] = implode(', ', $list);
847
        }
848
849
        // TrackEUploads
850
        $trackEUploads = [];
851
        /** @var TrackEUploads $item */
852
        foreach ($trackResults['ChamiloCoreBundle:TrackEUploads'] as $item) {
853
            $date = $item->getUploadDate() ? $item->getUploadDate()->format($dateFormat) : '';
854
            $list = [
855
                'Course #'.$item->getCId(),
856
                'Uploaded at: '.$date,
857
                'Upload id # '.$item->getUploadId(),
858
            ];
859
            $trackEUploads[] = implode(', ', $list);
860
        }
861
862
        $gradebookResult = [];
863
        /** @var GradebookResult $item */
864
        foreach ($trackResults['ChamiloCoreBundle:GradebookResult'] as $item) {
865
            $date = $item->getCreatedAt() ? $item->getCreatedAt()->format($dateFormat) : '';
866
            $list = [
867
                'Evaluation id# '.$item->getEvaluationId(),
868
                //'Score: '.$item->getScore(),
869
                'Creation date: '.$date,
870
            ];
871
            $gradebookResult[] = implode(', ', $list);
872
        }
873
874
        $trackEDownloads = [];
875
        /** @var TrackEDownloads $item */
876
        foreach ($trackResults['ChamiloCoreBundle:TrackEDownloads'] as $item) {
877
            $date = $item->getDownDate() ? $item->getDownDate()->format($dateFormat) : '';
878
            $list = [
879
                'File: '.$item->getDownDocPath(),
880
                'Download at: '.$date,
881
            ];
882
            $trackEDownloads[] = implode(', ', $list);
883
        }
884
885
        // UserCourseCategory
886
        $criteria = [
887
            'userId' => $userId,
888
        ];
889
        $result = $em->getRepository('ChamiloCoreBundle:UserCourseCategory')->findBy($criteria);
890
        $userCourseCategory = [];
891
        /** @var UserCourseCategory $item */
892
        foreach ($result as $item) {
893
            $list = [
894
                'Title: '.$item->getTitle(),
895
            ];
896
            $userCourseCategory[] = implode(', ', $list);
897
        }
898
899
        // Forum
900
        $criteria = [
901
            'posterId' => $userId,
902
        ];
903
        $result = $em->getRepository('ChamiloCourseBundle:CForumPost')->findBy($criteria);
904
        $cForumPostList = [];
905
        /** @var CForumPost $item */
906
        foreach ($result as $item) {
907
            $date = $item->getPostDate() ? $item->getPostDate()->format($dateFormat) : '';
908
            $list = [
909
                'Title: '.$item->getPostTitle(),
910
                'Creation date: '.$date,
911
            ];
912
            $cForumPostList[] = implode(', ', $list);
913
        }
914
915
        // CForumThread
916
        $criteria = [
917
            'threadPosterId' => $userId,
918
        ];
919
        $result = $em->getRepository('ChamiloCourseBundle:CForumThread')->findBy($criteria);
920
        $cForumThreadList = [];
921
        /** @var CForumThread $item */
922
        foreach ($result as $item) {
923
            $date = $item->getThreadDate() ? $item->getThreadDate()->format($dateFormat) : '';
924
            $list = [
925
                'Title: '.$item->getThreadTitle(),
926
                'Creation date: '.$date,
927
            ];
928
            $cForumThreadList[] = implode(', ', $list);
929
        }
930
931
        // CForumAttachment
932
        /*$criteria = [
933
            'threadPosterId' => $userId,
934
        ];
935
        $result = $em->getRepository('ChamiloCourseBundle:CForumAttachment')->findBy($criteria);
936
        $cForumThreadList = [];
937
        * @var CForumThread $item
938
        foreach ($result as $item) {
939
            $list = [
940
                'Title: '.$item->getThreadTitle(),
941
                'Creation date: '.$item->getThreadDate()->format($dateFormat),
942
            ];
943
            $cForumThreadList[] = implode(', ', $list);
944
        }*/
945
946
        // cGroupRelUser
947
        $criteria = [
948
            'user' => $userId,
949
        ];
950
        $result = $em->getRepository('ChamiloCourseBundle:CGroupRelUser')->findBy($criteria);
951
        $cGroupRelUser = [];
952
        /** @var CGroupRelUser $item */
953
        foreach ($result as $item) {
954
            $list = [
955
                'Course # '.$item->getCId(),
956
                'Group #'.$item->getGroup()->getId(),
957
                'Role: '.$item->getStatus(),
958
            ];
959
            $cGroupRelUser[] = implode(', ', $list);
960
        }
961
962
        // CAttendanceSheet
963
        $criteria = [
964
            'userId' => $userId,
965
        ];
966
        $result = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet')->findBy($criteria);
967
        $cAttendanceSheetList = [];
968
        /** @var CAttendanceSheet $item */
969
        foreach ($result as $item) {
970
            $list = [
971
                'Presence: '.$item->getPresence(),
972
                'Calendar id: '.$item->getAttendanceCalendarId(),
973
            ];
974
            $cAttendanceSheetList[] = implode(', ', $list);
975
        }
976
977
        // CBlogPost
978
        $criteria = [
979
            'authorId' => $userId,
980
        ];
981
        $result = $em->getRepository('ChamiloCourseBundle:CBlogPost')->findBy($criteria);
982
        $cBlog = [];
983
        /** @var CBlogPost $item */
984
        foreach ($result as $item) {
985
            $date = $item->getDateCreation() ? $item->getDateCreation()->format($dateFormat) : '';
986
            $list = [
987
                'Title: '.$item->getTitle(),
988
                'Date: '.$date,
989
            ];
990
            $cBlog[] = implode(', ', $list);
991
        }
992
993
        // CAttendanceResult
994
        $criteria = [
995
            'userId' => $userId,
996
        ];
997
        $result = $em->getRepository('ChamiloCourseBundle:CAttendanceResult')->findBy($criteria);
998
        $cAttendanceResult = [];
999
        /** @var CAttendanceResult $item */
1000
        foreach ($result as $item) {
1001
            $list = [
1002
                'Score : '.$item->getScore(),
1003
                'Calendar id: '.$item->getAttendanceId(),
1004
            ];
1005
            $cAttendanceResult[] = implode(', ', $list);
1006
        }
1007
1008
        // Message
1009
        $criteria = [
1010
            'userSender' => $userId,
1011
        ];
1012
        $result = $em->getRepository('ChamiloCoreBundle:Message')->findBy($criteria);
1013
        $messageList = [];
1014
        /** @var Message $item */
1015
        foreach ($result as $item) {
1016
            $date = $item->getSendDate() ? $item->getSendDate()->format($dateFormat) : '';
1017
            $userName = '';
1018
            if ($item->getUserReceiver()) {
1019
                $userName = $item->getUserReceiver()->getUsername();
1020
            }
1021
            $list = [
1022
                'Title: '.$item->getTitle(),
1023
                'Sent date: '.$date,
1024
                'To user: '.$userName,
1025
                'Status'.$item->getMsgStatus(),
1026
            ];
1027
            $messageList[] = implode(', ', $list);
1028
        }
1029
1030
        // CSurveyAnswer
1031
        $criteria = [
1032
            'user' => $userId,
1033
        ];
1034
        $result = $em->getRepository('ChamiloCourseBundle:CSurveyAnswer')->findBy($criteria);
1035
        $cSurveyAnswer = [];
1036
        /** @var CSurveyAnswer $item */
1037
        foreach ($result as $item) {
1038
            $list = [
1039
                'Answer # '.$item->getAnswerId(),
1040
                'Value: '.$item->getValue(),
1041
            ];
1042
            $cSurveyAnswer[] = implode(', ', $list);
1043
        }
1044
1045
        // CDropboxFile
1046
        $criteria = [
1047
            'uploaderId' => $userId,
1048
        ];
1049
        $result = $em->getRepository('ChamiloCourseBundle:CDropboxFile')->findBy($criteria);
1050
        $cDropboxFile = [];
1051
        /** @var CDropboxFile $item */
1052
        foreach ($result as $item) {
1053
            $date = $item->getUploadDate() ? $item->getUploadDate()->format($dateFormat) : '';
1054
            $list = [
1055
                'Title: '.$item->getTitle(),
1056
                'Uploaded date: '.$date,
1057
                'File: '.$item->getFilename(),
1058
            ];
1059
            $cDropboxFile[] = implode(', ', $list);
1060
        }
1061
1062
        // CDropboxPerson
1063
        $criteria = [
1064
            'userId' => $userId,
1065
        ];
1066
        $result = $em->getRepository('ChamiloCourseBundle:CDropboxPerson')->findBy($criteria);
1067
        $cDropboxPerson = [];
1068
        /** @var CDropboxPerson $item */
1069
        foreach ($result as $item) {
1070
            $list = [
1071
                'File #'.$item->getFileId(),
1072
                'Course #'.$item->getCId(),
1073
            ];
1074
            $cDropboxPerson[] = implode(', ', $list);
1075
        }
1076
1077
        // CDropboxPerson
1078
        $criteria = [
1079
            'authorUserId' => $userId,
1080
        ];
1081
        $result = $em->getRepository('ChamiloCourseBundle:CDropboxFeedback')->findBy($criteria);
1082
        $cDropboxFeedback = [];
1083
        /** @var CDropboxFeedback $item */
1084
        foreach ($result as $item) {
1085
            $date = $item->getFeedbackDate() ? $item->getFeedbackDate()->format($dateFormat) : '';
1086
            $list = [
1087
                'File #'.$item->getFileId(),
1088
                'Feedback: '.$item->getFeedback(),
1089
                'Date: '.$date,
1090
            ];
1091
            $cDropboxFeedback[] = implode(', ', $list);
1092
        }
1093
1094
        // CNotebook
1095
        $criteria = [
1096
            'userId' => $userId,
1097
        ];
1098
        $result = $em->getRepository('ChamiloCourseBundle:CNotebook')->findBy($criteria);
1099
        $cNotebook = [];
1100
        /** @var CNotebook $item */
1101
        foreach ($result as $item) {
1102
            $date = $item->getUpdateDate() ? $item->getUpdateDate()->format($dateFormat) : '';
1103
            $list = [
1104
                'Title: '.$item->getTitle(),
1105
                'Date: '.$date,
1106
            ];
1107
            $cNotebook[] = implode(', ', $list);
1108
        }
1109
1110
        // CLpView
1111
        $criteria = [
1112
            'userId' => $userId,
1113
        ];
1114
        $result = $em->getRepository('ChamiloCourseBundle:CLpView')->findBy($criteria);
1115
        $cLpView = [];
1116
        /** @var CLpView $item */
1117
        foreach ($result as $item) {
1118
            $list = [
1119
                //'Id #'.$item->getId(),
1120
                'LP #'.$item->getLpId(),
1121
                'Progress: '.$item->getProgress(),
1122
                'Course #'.$item->getCId(),
1123
                'Session #'.$item->getSessionId(),
1124
            ];
1125
            $cLpView[] = implode(', ', $list);
1126
        }
1127
1128
        // CStudentPublication
1129
        $criteria = [
1130
            'userId' => $userId,
1131
        ];
1132
        $result = $em->getRepository('ChamiloCourseBundle:CStudentPublication')->findBy($criteria);
1133
        $cStudentPublication = [];
1134
        /** @var CStudentPublication $item */
1135
        foreach ($result as $item) {
1136
            $list = [
1137
                'Title: '.$item->getTitle(),
1138
                'URL: '.$item->getUrl(),
1139
            ];
1140
            $cStudentPublication[] = implode(', ', $list);
1141
        }
1142
1143
        // CStudentPublicationComment
1144
        $criteria = [
1145
            'userId' => $userId,
1146
        ];
1147
        $result = $em->getRepository('ChamiloCourseBundle:CStudentPublicationComment')->findBy($criteria);
1148
        $cStudentPublicationComment = [];
1149
        /** @var CStudentPublicationComment $item */
1150
        foreach ($result as $item) {
1151
            $date = $item->getSentAt() ? $item->getSentAt()->format($dateFormat) : '';
1152
            $list = [
1153
                'Commment: '.$item->getComment(),
1154
                'File '.$item->getFile(),
1155
                'Course # '.$item->getCId(),
1156
                'Date: '.$date,
1157
            ];
1158
            $cStudentPublicationComment[] = implode(', ', $list);
1159
        }
1160
1161
        // CWiki
1162
        $criteria = [
1163
            'userId' => $userId,
1164
        ];
1165
        $result = $em->getRepository('ChamiloCourseBundle:CWiki')->findBy($criteria);
1166
        $cWiki = [];
1167
        /** @var CWiki $item */
1168
        foreach ($result as $item) {
1169
            $list = [
1170
                'Title: '.$item->getTitle(),
1171
                'Progress: '.$item->getProgress(),
1172
                'IP: '.$item->getUserIp(),
1173
            ];
1174
            $cWiki[] = implode(', ', $list);
1175
        }
1176
1177
        // Ticket
1178
        $criteria = [
1179
            'insertUserId' => $userId,
1180
        ];
1181
        $result = $em->getRepository('ChamiloTicketBundle:Ticket')->findBy($criteria);
1182
        $ticket = [];
1183
        /** @var Ticket $item */
1184
        foreach ($result as $item) {
1185
            $list = [
1186
                'Code: '.$item->getCode(),
1187
                'Subject: '.$item->getSubject(),
1188
            ];
1189
            $ticket[] = implode(', ', $list);
1190
        }
1191
1192
        // Message
1193
        $criteria = [
1194
            'insertUserId' => $userId,
1195
        ];
1196
        $result = $em->getRepository('ChamiloTicketBundle:Message')->findBy($criteria);
1197
        $ticketMessage = [];
1198
        /** @var \Chamilo\TicketBundle\Entity\Message $item */
1199
        foreach ($result as $item) {
1200
            $date = $item->getInsertDateTime() ? $item->getInsertDateTime()->format($dateFormat) : '';
1201
            $list = [
1202
                'Subject: '.$item->getSubject(),
1203
                'IP: '.$item->getIpAddress(),
1204
                'Status: '.$item->getStatus(),
1205
                'Creation date: '.$date,
1206
            ];
1207
            $ticketMessage[] = implode(', ', $list);
1208
        }
1209
1210
        // SkillRelUserComment
1211
        $criteria = [
1212
            'feedbackGiver' => $userId,
1213
        ];
1214
        $result = $em->getRepository('ChamiloCoreBundle:SkillRelUserComment')->findBy($criteria);
1215
        $skillRelUserComment = [];
1216
        /** @var SkillRelUserComment $item */
1217
        foreach ($result as $item) {
1218
            $date = $item->getFeedbackDateTime() ? $item->getFeedbackDateTime()->format($dateFormat) : '';
1219
            $list = [
1220
                'Feedback: '.$item->getFeedbackText(),
1221
                'Value: '.$item->getFeedbackValue(),
1222
                'Created at: '.$date,
1223
            ];
1224
            $skillRelUserComment[] = implode(', ', $list);
1225
        }
1226
1227
        // UserRelCourseVote
1228
        $criteria = [
1229
            'userId' => $userId,
1230
        ];
1231
        $result = $em->getRepository('ChamiloCoreBundle:UserRelCourseVote')->findBy($criteria);
1232
        $userRelCourseVote = [];
1233
        /** @var UserRelCourseVote $item */
1234
        foreach ($result as $item) {
1235
            $list = [
1236
                'Course #'.$item->getCId(),
1237
                'Session #'.$item->getSessionId(),
1238
                'Vote: '.$item->getVote(),
1239
            ];
1240
            $userRelCourseVote[] = implode(', ', $list);
1241
        }
1242
1243
        // UserApiKey
1244
        $criteria = [
1245
            'userId' => $userId,
1246
        ];
1247
        $result = $em->getRepository('ChamiloCoreBundle:UserApiKey')->findBy($criteria);
1248
        $userApiKey = [];
1249
        /** @var UserApiKey $item */
1250
        foreach ($result as $item) {
1251
            $validityStart = $item->getValidityStartDate() ? $item->getValidityStartDate()->format($dateFormat) : '';
1252
            $validityEnd = $item->getValidityEndDate() ? $item->getValidityEndDate()->format($dateFormat) : '';
1253
            $created = $item->getCreatedDate() ? $item->getCreatedDate()->format($dateFormat) : '';
1254
1255
            $list = [
1256
                'ApiKey #'.$item->getApiKey(),
1257
                'Service: '.$item->getApiService(),
1258
                'EndPoint: '.$item->getApiEndPoint(),
1259
                'Validity start date: '.$validityStart,
1260
                'Validity enddate: '.$validityEnd,
1261
                'Created at: '.$created,
1262
            ];
1263
            $userApiKey[] = implode(', ', $list);
1264
        }
1265
1266
        $user->setDropBoxSentFiles(
1267
            [
1268
                'Friends' => $friendList,
1269
                'Events' => $eventList,
1270
                'GradebookCertificate' => $gradebookCertificate,
1271
1272
                'TrackECourseAccess' => $trackECourseAccessList,
1273
                'TrackELogin' => $trackELoginList,
1274
                'TrackEAccess' => $trackEAccessList,
1275
                'TrackEDefault' => $trackEDefault,
1276
                'TrackEOnline' => $trackEOnlineList,
1277
                'TrackEUploads' => $trackEUploads,
1278
                'TrackELastaccess' => $trackELastaccess,
1279
                'GradebookResult' => $gradebookResult,
1280
                'Downloads' => $trackEDownloads,
1281
                'UserCourseCategory' => $userCourseCategory,
1282
                'SkillRelUserComment' => $skillRelUserComment,
1283
                'UserRelCourseVote' => $userRelCourseVote,
1284
                'UserApiKey' => $userApiKey,
1285
1286
                // courses
1287
                'AttendanceResult' => $cAttendanceResult,
1288
                'Blog' => $cBlog,
1289
                'DocumentsAdded' => $documents,
1290
                'Chat' => $chatFiles,
1291
                'ForumPost' => $cForumPostList,
1292
                'ForumThread' => $cForumThreadList,
1293
                'TrackEExercises' => $trackEExercises,
1294
                'TrackEAttempt' => $trackEAttempt,
1295
1296
                'GroupRelUser' => $cGroupRelUser,
1297
                'Message' => $messageList,
1298
                'Survey' => $cSurveyAnswer,
1299
                'StudentPublication' => $cStudentPublication,
1300
                'StudentPublicationComment' => $cStudentPublicationComment,
1301
                'DropboxFile' => $cDropboxFile,
1302
                'DropboxPerson' => $cDropboxPerson,
1303
                'DropboxFeedback' => $cDropboxFeedback,
1304
1305
                'LpView' => $cLpView,
1306
                'Notebook' => $cNotebook,
1307
1308
                'Wiki' => $cWiki,
1309
                // Tickets
1310
1311
                'Ticket' => $ticket,
1312
                'TicketMessage' => $ticketMessage,
1313
            ]
1314
        );
1315
1316
        $user->setDropBoxReceivedFiles([]);
1317
        //$user->setGroups([]);
1318
        $user->setCurriculumItems([]);
1319
1320
        $portals = $user->getPortals();
1321
        if (!empty($portals)) {
1322
            $list = [];
1323
            /** @var AccessUrlRelUser $portal */
1324
            foreach ($portals as $portal) {
1325
                $portalInfo = \UrlManager::get_url_data_from_id($portal->getUrl()->getId());
1326
                $list[] = $portalInfo['url'];
1327
            }
1328
        }
1329
        $user->setPortals($list);
1330
1331
        $coachList = $user->getSessionAsGeneralCoach();
1332
        $list = [];
1333
        /** @var Session $session */
1334
        foreach ($coachList as $session) {
1335
            $list[] = $session->getName();
1336
        }
1337
        $user->setSessionAsGeneralCoach($list);
1338
1339
        $skillRelUserList = $user->getAchievedSkills();
1340
        $list = [];
1341
        /** @var SkillRelUser $skillRelUser */
1342
        foreach ($skillRelUserList as $skillRelUser) {
1343
            $list[] = $skillRelUser->getSkill()->getName();
1344
        }
1345
        $user->setAchievedSkills($list);
1346
        $user->setCommentedUserSkills([]);
1347
1348
        $extraFieldValues = new \ExtraFieldValue('user');
1349
        $items = $extraFieldValues->getAllValuesByItem($userId);
1350
        //$user->setExtraFields($items);
1351
        //$user->setExtraFields([]);
1352
1353
        $lastLogin = $user->getLastLogin();
1354
        if (empty($lastLogin)) {
1355
            $login = $this->getLastLogin($user);
1356
            if ($login) {
1357
                $lastLogin = $login->getLoginDate();
1358
            }
1359
        }
1360
        $user->setLastLogin($lastLogin);
1361
1362
        $dateNormalizer = new GetSetMethodNormalizer();
1363
        $dateNormalizer->setCircularReferenceHandler(function ($object) {
1364
            return get_class($object);
1365
        });
1366
1367
        $ignore = [
1368
            'twoStepVerificationCode',
1369
            'biography',
1370
            'dateOfBirth',
1371
            'gender',
1372
            'facebookData',
1373
            'facebookName',
1374
            'facebookUid',
1375
            'gplusData',
1376
            'gplusName',
1377
            'gplusUid',
1378
            'locale',
1379
            'timezone',
1380
            'twitterData',
1381
            'twitterName',
1382
            'twitterUid',
1383
            'gplusUid',
1384
            'token',
1385
            'website',
1386
            'plainPassword',
1387
            'completeNameWithUsername',
1388
            'completeName',
1389
            'completeNameWithClasses',
1390
            'salt',
1391
        ];
1392
1393
        $dateNormalizer->setIgnoredAttributes($ignore);
1394
1395
        $callback = function ($dateTime) {
1396
            return $dateTime instanceof \DateTime ? $dateTime->format(\DateTime::ATOM) : '';
1397
        };
1398
1399
        $dateNormalizer->setCallbacks(
1400
            [
1401
                'createdAt' => $callback,
1402
                'lastLogin' => $callback,
1403
                'registrationDate' => $callback,
1404
                'memberSince' => $callback,
1405
            ]
1406
        );
1407
1408
        $normalizers = [$dateNormalizer];
1409
        $serializer = new Serializer($normalizers, [new JsonEncoder()]);
1410
1411
        $jsonContent = $serializer->serialize($user, 'json');
1412
1413
        return $jsonContent;
1414
    }
1415
1416
    /**
1417
     * Get the last login from the track_e_login table.
1418
     * This might be different from user.last_login in the case of legacy users
1419
     * as user.last_login was only implemented in 1.10 version with a default
1420
     * value of NULL (not the last record from track_e_login).
1421
     *
1422
     * @throws \Exception
1423
     *
1424
     * @return TrackELogin|null
1425
     */
1426
    public function getLastLogin(User $user)
1427
    {
1428
        $repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:TrackELogin');
1429
        $qb = $repo->createQueryBuilder('l');
1430
1431
        $login = $qb
1432
            ->select('l')
1433
            ->where(
1434
                $qb->expr()->eq('l.loginUserId', $user->getId())
1435
            )
1436
            ->setMaxResults(1)
1437
            ->orderBy('l.loginDate', 'DESC')
1438
            ->getQuery()
1439
            ->getOneOrNullResult();
1440
1441
        return $login;
1442
    }
1443
}
1444