Passed
Push — master ( 145827...6e0f6e )
by Julito
23:20 queued 12:22
created

UserRepository::getAssignedHrmUserList()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

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