Passed
Push — master ( fb8ba6...81d51d )
by Julito
09:20
created

UserRepository::findByUsername()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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