Proyectos de Subversion LeadersLinked - Services

Rev

Rev 629 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Mapper;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Db\Sql\Expression;
9
use Laminas\Log\LoggerInterface;
10
 
11
use LeadersLinked\Model\User;
12
use LeadersLinked\Mapper\Common\MapperCommon;
13
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
14
use Laminas\Hydrator\ArraySerializableHydrator;
15
use Laminas\Paginator\Paginator;
16
use Laminas\Paginator\Adapter\DbSelect;
17
use Laminas\Db\ResultSet\HydratingResultSet;
18
use LeadersLinked\Model\UserType;
19
use LeadersLinked\Model\CompanyUser;
626 stevensc 20
use LeadersLinked\Model\MicrolearningTopicUser;
1 efrain 21
 
22
 
23
class UserMapper extends MapperCommon
24
{
25
    const _TABLE = 'tbl_users';
26
 
27
    /**
28
     *
29
     * @var UserMapper
30
     */
31
    private static $_instance;
32
 
33
    /**
34
     *
35
     * @param AdapterInterface $adapter
36
     */
37
    private function __construct($adapter)
38
    {
39
        parent::__construct($adapter);
40
    }
41
 
42
    /**
43
     *
44
     * @param AdapterInterface $adapter
45
     * @return UserMapper
46
     */
47
    public static function getInstance($adapter)
48
    {
49
        if (self::$_instance == null) {
50
            self::$_instance = new UserMapper($adapter);
51
        }
52
        return self::$_instance;
53
    }
54
 
55
    /**
56
     *
57
     * @param string $uuid
58
     * @return User
59
     */
60
    public function fetchOneByUuid($uuid)
61
    {
62
        $prototype = new User();
63
        $select = $this->sql->select(self::_TABLE);
64
        $select->where->equalTo('uuid', $uuid);
65
 
66
 
67
        return $this->executeFetchOneObject($select, $prototype);
68
    }
69
 
70
 
71
    /**
72
     *
73
     * @return User
74
     */
75
    public function fetchOneDefaultForConnection()
76
    {
77
        $prototype = new User();
78
        $select = $this->sql->select(self::_TABLE);
79
        $select->where->equalTo('default_for_connection', User::DEFAULT_FOR_CONNECTION_YES);
80
 
81
 
82
        return $this->executeFetchOneObject($select, $prototype);
83
    }
84
 
85
 
86
 
87
    /**
88
     *
89
     * @param string $uuid
90
     * @param int $network_id
91
     * @return User
92
     */
93
    public function fetchOneByUuidAndNetworkId($uuid, $network_id)
94
    {
95
        $prototype = new User();
96
        $select = $this->sql->select(self::_TABLE);
97
        $select->where->equalTo('uuid', $uuid);
98
        $select->where->equalTo('network_id', $network_id);
99
 
100
 
101
        return $this->executeFetchOneObject($select, $prototype);
102
    }
103
 
104
    /**
105
     *
106
     * @param int $id
107
     * @return User
108
     */
109
    public function fetchOne($id)
110
    {
111
        $prototype = new User();
112
        $select = $this->sql->select(self::_TABLE);
113
        $select->where->equalTo('id', $id);
114
 
115
        return $this->executeFetchOneObject($select, $prototype);
116
    }
117
 
118
    public function fetchOneRelation($id)
119
    {
120
        $prototype = new User();
121
        $select = $this->sql->select(self::_TABLE);
122
        $select->where->equalTo('id', $id);
123
 
124
        return $this->executeFetchOneObject($select, $prototype);
125
    }
126
 
127
 
128
    /**
129
     *
130
     * @param string $email
131
     * @return void|User
132
     */
133
    public function fetchOneByEmail($email)
134
    {
135
        $prototype = new User();
136
        $select = $this->sql->select(self::_TABLE);
137
        $select->where->equalTo('email', $email);
138
 
139
        //echo $select->getSqlString($this->adapter->platform); exit;
140
 
141
        return $this->executeFetchOneObject($select, $prototype);
142
    }
143
 
144
    /**
145
     *
146
     * @param string $email
147
     * @param int $network_id
148
     * @return void|User
149
     */
150
    public function fetchOneByEmailAndNetworkId($email, $network_id)
151
    {
152
        $prototype = new User();
153
        $select = $this->sql->select(self::_TABLE);
154
        $select->where->equalTo('email', $email);
155
        $select->where->equalTo('network_id', $network_id);
629 ariadna 156
 
1 efrain 157
        return $this->executeFetchOneObject($select, $prototype);
158
    }
159
 
160
    /**
161
     *
162
     * @param string $email
163
     * @param int $network_id
164
     * @return void|User
165
     */
166
    public function fetchOneActiveByEmailAndNetworkId($email, $network_id)
167
    {
168
        $prototype = new User();
169
        $select = $this->sql->select(self::_TABLE);
170
        $select->where->equalTo('email', $email);
171
        $select->where->equalTo('network_id', $network_id);
172
        $select->where->equalTo('status', User::STATUS_ACTIVE);
173
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
174
 
175
        //echo $select->getSqlString($this->adapter->platform); exit;
176
 
177
        return $this->executeFetchOneObject($select, $prototype);
178
    }
179
 
257 efrain 180
    /**
181
     *
182
     * @param $username_xmpp
183
     * @return void|User
184
     */
185
    public function fetchOneByUsernameXmpp($username_xmpp)
186
    {
187
        $prototype = new User();
188
        $select = $this->sql->select(self::_TABLE);
189
        $select->where->equalTo('username_xmpp', $username_xmpp);
629 ariadna 190
 
257 efrain 191
        //echo $select->getSqlString($this->adapter->platform); exit;
629 ariadna 192
 
257 efrain 193
        return $this->executeFetchOneObject($select, $prototype);
194
    }
629 ariadna 195
 
196
 
257 efrain 197
    /**
198
     *
199
     * @param $username_xmpp
200
     * @return void|User
201
     */
202
    public function fetchLastLikeUsernameXmpp($username_xmpp)
203
    {
204
        $prototype = new User();
205
        $select = $this->sql->select(self::_TABLE);
206
        $select->where->like('username_xmpp', $username_xmpp . '%');
207
        $select->order('id desc');
629 ariadna 208
 
257 efrain 209
        return $this->executeFetchOneObject($select, $prototype);
210
    }
629 ariadna 211
 
257 efrain 212
    /**
213
     *
214
     * @param $username_xmpp
215
     * @return void|User
216
     */
217
    public function fetchOneActiveByUsernameXmpp($username_xmpp)
218
    {
219
        $prototype = new User();
220
        $select = $this->sql->select(self::_TABLE);
221
        $select->where->equalTo('username_xmpp', $username_xmpp);
222
        $select->where->equalTo('status', User::STATUS_ACTIVE);
223
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
629 ariadna 224
 
257 efrain 225
        //echo $select->getSqlString($this->adapter->platform); exit;
629 ariadna 226
 
257 efrain 227
        return $this->executeFetchOneObject($select, $prototype);
228
    }
1 efrain 229
 
230
 
231
    /**
232
     *
233
     * @param string $password_reset_key
234
     * @return void|User
235
     */
236
    public function fetchOneByPasswordResetKey($password_reset_key)
237
    {
238
        $prototype = new User();
239
        $select = $this->sql->select(self::_TABLE);
240
        $select->where->equalTo('password_reset_key', $password_reset_key);
241
 
242
        return $this->executeFetchOneObject($select, $prototype);
243
    }
244
 
245
 
246
    /**
247
     *
248
     * @param string $password_reset_key
249
     * @param int $network_id
250
     * @return void|User
251
     */
252
    public function fetchOneByPasswordResetKeyAndNetworkId($password_reset_key, $network_id)
253
    {
254
        $prototype = new User();
255
        $select = $this->sql->select(self::_TABLE);
256
        $select->where->equalTo('password_reset_key', $password_reset_key);
257
        $select->where->equalTo('network_id', $network_id);
258
 
259
        return $this->executeFetchOneObject($select, $prototype);
260
    }
261
 
262
    /**
263
     *
264
     * @param string $activation_key
265
     * @return void|User
266
     */
267
    public function fetchOneByActivationKey($activation_key)
268
    {
269
        $prototype = new User();
270
        $select = $this->sql->select(self::_TABLE);
271
        $select->where->equalTo('activation_key', $activation_key);
272
 
273
        return $this->executeFetchOneObject($select, $prototype);
274
    }
275
 
276
    /**
277
     *
278
     * @param string $activation_key
279
     * @param int $network_id
280
     * @return void|User
281
     */
282
    public function fetchOneByActivationKeyAndNetworkId($activation_key, $network_id)
283
    {
284
        $prototype = new User();
285
        $select = $this->sql->select(self::_TABLE);
286
        $select->where->equalTo('activation_key', $activation_key);
287
        $select->where->equalTo('network_id', $network_id);
288
 
289
 
290
 
291
        return $this->executeFetchOneObject($select, $prototype);
292
    }
293
 
294
 
295
    /**
296
     *
297
     * @param int $network_id
298
     * @return int
299
     */
300
    public function fetchCountByNetworkId($network_id)
301
    {
302
 
303
        $select = $this->sql->select(self::_TABLE);
304
        $select->columns(['total' => new Expression('COUNT(*)')]);
305
        $select->where->equalTo('network_id', $network_id);
306
 
307
        $record = $this->executeFetchOneArray($select);
308
 
309
        return $record['total'];
310
    }
311
 
312
    /**
313
     *
314
     * @param int $network_id
315
     * @return int
316
     */
317
    public function fetchCountActiveByDefaultNetworkId($network_id)
318
    {
319
 
320
        $select = $this->sql->select(self::_TABLE);
321
        $select->columns(['total' => new Expression('COUNT(*)')]);
322
        $select->where->equalTo('network_id', $network_id);
323
        $select->where->in('usertype_id', [UserType::USER, UserType::ADMIN]);
324
        $select->where->equalTo('status', User::STATUS_ACTIVE);
325
 
326
        $record = $this->executeFetchOneArray($select);
327
 
328
        return $record['total'];
329
    }
330
 
331
    /**
332
     *
333
     * @param int $network_id
334
     * @return int
335
     */
336
    public function fetchCountActiveByOtherNetworkId($network_id)
337
    {
338
 
339
        $select = $this->sql->select(self::_TABLE);
340
        $select->columns(['total' => new Expression('COUNT(*)')]);
341
        $select->where->equalTo('network_id', $network_id);
342
        $select->where->in('usertype_id', [UserType::USER, UserType::ADMIN]);
343
        $select->where->equalTo('status', User::STATUS_ACTIVE);
344
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_APPROVED);
345
 
346
 
347
        $record = $this->executeFetchOneArray($select);
348
 
349
        return $record['total'];
350
    }
351
 
352
 
353
 
354
    /**
355
     *
356
     * @param string $keyword
357
     * @param int $current_user
358
     * @return User[]
359
     */
360
    public function fetchAllByKeyword($keyword, $current_user = 0)
361
    {
362
 
363
        $prototype = new User();
364
 
365
        $select = $this->sql->select(self::_TABLE);
366
 
367
        $select->where->equalTo('status', User::STATUS_ACTIVE);
368
        $select->where->notEqualTo('id', $current_user);
369
        $select->where->and->nest()
370
            ->like('first_name', '%' . $keyword . '%')
371
            ->or->like('last_name', '%' . $keyword . '%')
372
            ->or->like(new Expression("CONCAT(first_name,' ',last_name)"), '%' . $keyword . '%')
373
            ->unnest();
374
 
375
 
376
        return $this->executeFetchAllObject($select, $prototype);
377
    }
378
 
379
    /**
380
     *
381
     * @param int[] $ids
382
     * @param int $current_user
383
     * @param string $status
384
     * @return User[]
385
     */
386
    public function fetchAllByIds($ids, $current_user = 0, $status = User::STATUS_ACTIVE)
387
    {
388
 
389
        $prototype = new User();
390
        $select = $this->sql->select(self::_TABLE);
391
 
392
 
393
        $select->where->equalTo('status', User::STATUS_ACTIVE);
394
        $select->where->and->in('id', $ids);
395
 
396
        if ($current_user) {
397
            $select->where->and->notEqualTo('id ', $current_user);
398
        }
399
        $select->order(['first_name ASC', 'last_name ASC', 'email ASC']);
400
 
401
        return $this->executeFetchAllObject($select, $prototype);
402
    }
403
 
404
    /**
405
     *
406
     * @param int[] $ids
407
     * @param string $search
408
     * @param int $current_user
409
     * @param string $status
410
     * @return User[]
411
     */
412
    public function fetchAllByIdsAndSearch($ids, $search, $current_user = 0, $status = User::STATUS_ACTIVE)
413
    {
414
 
415
        $prototype = new User();
416
        $select = $this->sql->select(self::_TABLE);
417
 
418
 
419
        $select->where->equalTo('status', User::STATUS_ACTIVE);
420
        $select->where->and->in('id', $ids);
421
        $select->where->nest()
422
            ->like('first_name', '%' . $search . '%')
423
            ->or->like('last_name', '%' . $search . '%')
424
            ->or->like(new Expression("CONCAT(first_name,' ',last_name)"), '%' . $search . '%')
425
            ->or->like(new Expression("CONCAT(last_name,' ',first_name)"), '%' . $search . '%')
426
            ->or->like('email', '%' . $search . '%')->unnest();
427
 
428
        if ($current_user) {
429
            $select->where->and->notEqualTo('id ', $current_user);
430
        }
431
        $select->order(['first_name ASC', 'last_name ASC', 'email ASC']);
432
 
433
        return $this->executeFetchAllObject($select, $prototype);
434
    }
435
 
436
 
437
 
438
    /**
439
     *
440
     * @param int $network_id
441
     * @param int[] $ids
442
     * @param string $search
443
     * @param int $current_user
444
     * @param string $status
445
     * @return User[]
446
     */
447
    public function fetchAllByNetworkIdAndIdsAndSearch($network_id, $ids, $search, $current_user = 0, $status = User::STATUS_ACTIVE)
448
    {
449
 
450
        $prototype = new User();
451
        $select = $this->sql->select(self::_TABLE);
452
 
453
 
454
        $select->where->equalTo('status', User::STATUS_ACTIVE);
455
        $select->where->equalTo('network_id', $network_id);
456
        $select->where->and->in('id', $ids);
457
        $select->where->nest()
458
            ->like('first_name', '%' . $search . '%')
459
            ->or->like('last_name', '%' . $search . '%')
460
            ->or->like('email', '%' . $search . '%')->unnest();
461
 
462
        if ($current_user) {
463
            $select->where->and->notEqualTo('id ', $current_user);
464
        }
465
        $select->order(['first_name ASC', 'last_name ASC', 'email ASC']);
466
 
467
        return $this->executeFetchAllObject($select, $prototype);
468
    }
469
 
470
 
471
 
472
 
473
    /**
474
     *
475
     * @return User[]
476
     */
257 efrain 477
    public function fetchAll()
1 efrain 478
    {
479
 
480
        $prototype = new User();
481
        $select = $this->sql->select(self::_TABLE);
482
 
483
        return $this->executeFetchAllObject($select, $prototype);
484
    }
485
 
486
    /**
487
     *
488
     * @param int $network_id
489
     * @param int $current_user_id;
490
     * @return int[]
491
     */
492
    public function fetchAllIdsByDefaultNetworkId($network_id, $current_user_id = 0)
493
    {
494
 
495
 
496
        $select = $this->sql->select(self::_TABLE);
497
        $select->columns(['id']);
498
        $select->where->equalTo('network_id', $network_id);
499
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
500
        $select->where->equalTo('status', User::STATUS_ACTIVE);
501
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
502
 
503
        if ($current_user_id) {
504
            $select->where->notEqualTo('id', $current_user_id);
505
        }
506
 
507
        $ids = [];
508
 
509
        $records = $this->executeFetchAllArray($select);
510
        foreach ($records as $record) {
511
            array_push($ids, $record['id']);
512
        }
513
 
514
        return $ids;
515
    }
516
 
517
    /**
518
     *
519
     * @param int $network_id
520
     * @param string $search
521
     * @param int $current_user_id;
522
     * @return int[]
523
     */
524
    public function fetchAllIdsByDefaultNetworkIdAndSearch($network_id, $search, $current_user_id = 0)
525
    {
526
 
527
 
528
        $select = $this->sql->select(self::_TABLE);
529
        $select->columns(['id']);
530
        $select->where->equalTo('network_id', $network_id);
531
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
532
        $select->where->equalTo('status', User::STATUS_ACTIVE);
533
        $select->where->nest()
534
            ->like('first_name', '%' . $search . '%')
535
            ->or->like('last_name', '%' . $search . '%')
536
            ->or->like('email', '%' . $search . '%')->unnest();
537
 
538
        if ($current_user_id) {
539
            $select->where->notEqualTo('id', $current_user_id);
540
        }
541
 
542
        $ids = [];
543
 
544
        $records = $this->executeFetchAllArray($select);
545
        foreach ($records as $record) {
546
            array_push($ids, $record['id']);
547
        }
548
 
549
        return $ids;
550
    }
551
 
552
    /**
553
     *
554
     * @param int $network_id
555
     * @param int $current_user_id;
556
     * @return int[]
557
     */
558
    public function fetchAllIdsByNonDefaultNetworkId($network_id, $current_user_id = 0)
559
    {
560
 
561
 
562
        $select = $this->sql->select(self::_TABLE);
563
        $select->columns(['id']);
564
        $select->where->equalTo('network_id', $network_id);
565
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
566
        $select->where->equalTo('status', User::STATUS_ACTIVE);
567
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
568
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_APPROVED);
569
 
570
        if ($current_user_id) {
571
            $select->where->notEqualTo('id', $current_user_id);
572
        }
573
 
574
        $ids = [];
575
 
576
        $records = $this->executeFetchAllArray($select);
577
        foreach ($records as $record) {
578
            array_push($ids, $record['id']);
579
        }
580
 
581
        return $ids;
582
    }
583
 
584
 
585
    /**
586
     *
587
     * @param int $network_id
588
     * @param string $search
589
     * @param int $current_user_id;
590
     * @return int[]
591
     */
592
    public function fetchAllIdsByNonDefaultNetworkIdAndSearch($network_id, $search, $current_user_id = 0)
593
    {
594
 
595
 
596
        $select = $this->sql->select(self::_TABLE);
597
        $select->columns(['id']);
598
        $select->where->equalTo('network_id', $network_id);
599
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
600
        $select->where->equalTo('status', User::STATUS_ACTIVE);
601
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_APPROVED);
602
        $select->where->nest()
603
            ->like('first_name', '%' . $search . '%')
604
            ->or->like('last_name', '%' . $search . '%')
605
            ->or->like('email', '%' . $search . '%')->unnest();
606
 
607
        if ($current_user_id) {
608
            $select->where->notEqualTo('id', $current_user_id);
609
        }
610
 
611
 
612
        $ids = [];
613
 
614
        $records = $this->executeFetchAllArray($select);
615
        foreach ($records as $record) {
616
            array_push($ids, $record['id']);
617
        }
618
 
619
        return $ids;
620
    }
621
 
622
 
623
    /**
624
     *
625
     * @param int $company_id
626
     * @return User[]
627
     */
628
    public function fetchAllByCompanyId($company_id)
629
    {
630
 
631
        $prototype = new User();
632
        $select = $this->sql->select();
633
        $select->from(['tb1' => self::_TABLE]);
634
        $select->join(['tb2' => CompanyUserMapper::_TABLE], 'tb1.id = tb2.user_id', []);
635
 
636
 
637
        $select->where->equalTo('tb2.company_id', $company_id);
638
        $select->where->in('tb2.status', [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD]);
639
 
640
        $select->where->equalTo('tb1.status', User::STATUS_ACTIVE);
641
        $select->where->equalTo('tb1.email_verified', User::EMAIL_VERIFIED_YES);
642
 
643
        $select->order(['first_name DESC, last_name DESC, email_DESC']);
644
 
645
 
646
 
647
        return $this->executeFetchAllObject($select, $prototype);
648
    }
649
 
650
    /**
651
     *
652
     * @param int $user_id
653
     * @return boolean
654
     */
655
    public function leaveImpersonate($user_id)
656
    {
657
        $values = [
658
            'impersonate_user_id' => new Expression('NULL')
659
        ];
660
 
661
        $update = $this->sql->update(self::_TABLE);
662
        $update->set($values);
663
        $update->where->equalTo('id', $user_id);
664
 
665
        return $this->executeUpdate($update);
666
    }
667
 
668
    /**
669
     *
670
     * @param int $user_id
671
     * @param int $impersonate_user_id
672
     * @return boolean
673
     */
674
    public function startImpersonate($user_id, $impersonate_user_id)
675
    {
676
        $values = [
677
            'impersonate_user_id' => $impersonate_user_id
678
        ];
679
 
680
        $update = $this->sql->update(self::_TABLE);
681
        $update->set($values);
682
        $update->where->equalTo('id', $user_id);
683
 
684
        return $this->executeUpdate($update);
685
    }
686
 
687
    /**
688
     *
689
     * @param int $user_id
690
     * @param string $password_reset_key
691
     * @return boolean
692
     */
693
    public function updatePasswordResetKey($user_id, $password_reset_key)
694
    {
695
        $values = [
696
            'password_reset_key' => $password_reset_key,
697
            'password_generated_on' => date('Y-m-d H:i:s'),
698
            'updated_on' => new Expression('NOW()')
699
        ];
700
 
701
        $update = $this->sql->update(self::_TABLE);
702
        $update->set($values);
703
        $update->where->equalTo('id', $user_id);
704
 
705
        return $this->executeUpdate($update);
706
    }
707
 
708
 
709
    /**
710
     *
711
     * @param int $user_id
712
     * @param string $delete_account_key
713
     * @return boolean
714
     */
715
    public function updateDeleteAccountKey($user_id, $delete_account_key)
716
    {
717
        $values = [
718
            'delete_account_key' => $delete_account_key,
719
            'delete_account_generated_on' => date('Y-m-d H:i:s'),
720
            'updated_on' => new Expression('NOW()')
721
        ];
722
 
723
        $update = $this->sql->update(self::_TABLE);
724
        $update->set($values);
725
        $update->where->equalTo('id', $user_id);
726
 
727
        return $this->executeUpdate($update);
728
    }
729
 
730
 
731
 
732
    /**
733
     *
734
     * @param User $user
735
     * @param string $password_hash
736
     * @return boolean
737
     */
738
    public function updatePassword($user, $password_hash)
739
    {
740
        $values = [
741
            'password'              => $password_hash,
742
            'password_reset_key'    => '',
743
            'password_updated_on'   => date('Y-m-d H:i:s'),
744
            'login_attempt'         => 0,
745
            'blocked'               => User::BLOCKED_NO,
746
            'updated_on'            => new Expression('NOW()')
747
        ];
748
 
749
        $update = $this->sql->update(self::_TABLE);
750
        $update->set($values);
751
        $update->where->equalTo('id', $user->id);
752
 
753
        return $this->executeUpdate($update);
754
    }
755
 
756
 
757
 
758
    /**
759
     *
760
     * @param User $user
761
     * @param int $usertype_id
762
     * @return boolean
763
     */
764
    public function updateUserTypeId($user, $usertype_id)
765
    {
766
        $values = [
767
            'usertype_id'   => $usertype_id,
768
            'updated_on'    => new Expression('NOW()')
769
        ];
770
 
771
        $update = $this->sql->update(self::_TABLE);
772
        $update->set($values);
773
        $update->where->equalTo('id', $user->id);
774
 
775
        return $this->executeUpdate($update);
776
    }
777
 
778
 
779
    /**
780
     *
781
     * @param User $user
782
     * @return boolean
783
     */
784
    public function unblock($user)
785
    {
786
        $values = [
787
            'login_attempt'         => 0,
788
            'blocked'               => User::BLOCKED_NO,
789
            'updated_on'            => new Expression('NOW()')
790
        ];
791
 
792
        $update = $this->sql->update(self::_TABLE);
793
        $update->set($values);
794
        $update->where->equalTo('id', $user->id);
795
 
796
        return $this->executeUpdate($update);
797
    }
798
 
799
 
800
 
801
 
802
    /**
803
     *
804
     * @param User $user
805
     * @param string $one_time_password
806
     * @return boolean
807
     */
808
    public function updateOneTimePassword($user, $one_time_password)
809
    {
810
        $values = [
811
            'one_time_password' => $one_time_password,
812
            'updated_on'        => new Expression('NOW()')
813
        ];
814
 
815
        $update = $this->sql->update(self::_TABLE);
816
        $update->set($values);
817
        $update->where->equalTo('id', $user->id);
818
 
819
        return $this->executeUpdate($update);
820
    }
821
 
822
 
823
    /**
824
     *
825
     * @param User $user
826
     * @return boolean
827
     */
828
    public function update($user)
829
    {
830
        $hydrator = new ObjectPropertyHydrator();
831
        $values = $hydrator->extract($user);
832
        //$values = $this->removeEmpty($values);
833
 
834
 
629 ariadna 835
 
1 efrain 836
        unset($values['added_on']);
837
        $values['updated_on'] = new Expression('NOW()');
838
 
629 ariadna 839
 
840
 
841
 
842
 
1 efrain 843
        $update = $this->sql->update(self::_TABLE);
844
        $update->set($values);
845
        $update->where->equalTo('id', $user->id);
846
 
629 ariadna 847
        //echo $update->getSqlString($this->adapter->platform); exit;
1 efrain 848
 
849
        return $this->executeUpdate($update);
850
    }
851
 
852
    /**
853
     *
854
     * @param User $user
855
     * @return boolean
856
     */
857
    public function updatePrivacy($user)
858
    {
859
        $values = [
860
            'show_in_search' => $user->show_in_search,
861
            'updated_on' => new Expression('NOW()')
862
        ];
863
 
864
        $update = $this->sql->update(self::_TABLE);
865
        $update->set($values);
866
        $update->where->equalTo('id', $user->id);
867
 
868
        return $this->executeUpdate($update);
869
    }
870
 
871
    /**
872
     *
873
     * @param User $user
874
     * @return boolean
875
     */
876
    public function updateBasic($user)
877
    {
878
        $values = [
879
            'first_name' => $user->first_name,
880
            'last_name' => $user->last_name,
881
            'phone' => $user->phone,
882
            'gender' => $user->gender,
883
            'timezone' => $user->timezone,
884
            'is_adult' => $user->is_adult,
885
            'updated_on' => new Expression('NOW()')
886
        ];
887
 
888
        $update = $this->sql->update(self::_TABLE);
889
        $update->set($values);
890
        $update->where->equalTo('id', $user->id);
891
 
892
        return $this->executeUpdate($update);
893
    }
894
 
629 ariadna 895
 
1 efrain 896
    /**
897
     *
898
     * @param User $user
899
     * @return boolean
900
     */
901
    public function updateFirstNameAndLastName($user)
902
    {
903
        $values = [
904
            'first_name' => $user->first_name,
905
            'last_name' => $user->last_name,
906
            'updated_on' => new Expression('NOW()')
907
        ];
629 ariadna 908
 
1 efrain 909
        $update = $this->sql->update(self::_TABLE);
910
        $update->set($values);
911
        $update->where->equalTo('id', $user->id);
629 ariadna 912
 
1 efrain 913
        return $this->executeUpdate($update);
914
    }
915
 
629 ariadna 916
 
1 efrain 917
    /**
918
     *
919
     * @param User $user
920
     * @return boolean
921
     */
922
    public function updateImage($user)
923
    {
924
        $values = [
925
            'image' => $user->image,
926
            'updated_on' => new Expression('NOW()')
927
        ];
928
 
929
        $update = $this->sql->update(self::_TABLE);
930
        $update->set($values);
931
        $update->where->equalTo('id', $user->id);
932
 
933
        return $this->executeUpdate($update);
934
    }
935
 
936
    /**
937
     *
938
     * @param User $user
939
     * @return boolean
940
     */
941
    public function updateLocation($user)
942
    {
943
        $values = [
944
            'location_id' => $user->location_id,
945
            'updated_on' => new Expression('NOW()')
946
        ];
947
 
948
        $update = $this->sql->update(self::_TABLE);
949
        $update->set($values);
950
        $update->where->equalTo('id', $user->id);
951
 
952
        return $this->executeUpdate($update);
953
    }
954
 
955
    /**
956
     *
957
     * @param int $user_id
958
     * @return boolean
959
     */
960
    public function activateAccount($user_id)
961
    {
962
        $values = [
963
            'email_verified'    => User::EMAIL_VERIFIED_YES,
964
            'status'            => User::STATUS_ACTIVE,
965
            'activation_key'    => '',
966
            'updated_on' => new Expression('NOW()')
967
        ];
968
 
969
        $update = $this->sql->update(self::_TABLE);
970
        $update->set($values);
971
        $update->where->equalTo('id', $user_id);
972
 
973
        return $this->executeUpdate($update);
974
    }
975
 
976
    /**
977
     *
978
     * @param User $user
979
     * @return boolean
980
     */
981
    public function insert($user)
982
    {
983
 
984
        $hydrator = new ObjectPropertyHydrator();
985
        $values = $hydrator->extract($user);
986
        $values = $this->removeEmpty($values);
987
 
988
        $insert = $this->sql->insert(self::_TABLE);
989
        $insert->values($values);
990
 
991
        $response = $this->executeInsert($insert);
992
        if ($response) {
993
            $user->id = $this->lastInsertId;
994
        }
995
 
996
        return $response;
997
    }
998
 
999
 
1000
    /**
1001
     *
1002
     * @return boolean
1003
     */
1004
    public function truncate()
1005
    {
1006
        $sql = sprintf('TRUNCATE TABLE `%s` ', self::_TABLE);
1007
        return $this->executeSentenceWithParameters($sql);
1008
    }
1009
 
1010
    /**
1011
     *
1012
     * @param int $company_id
1013
     * @param string $status
1014
     * @param string $search
1015
     * @param int $page
1016
     * @param int $records_per_page
1017
     * @param string $order_field
1018
     * @param string $order_direction
1019
     * @return Paginator
1020
     */
1021
    public function fetchAllDataTableByCompanyId($company_id,  $search, $status = '', $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1022
    {
1023
        $select = $this->sql->select();
1024
        $select->columns(['status', 'backend', 'creator']);
1025
        $select->from(['tb1' => CompanyUserMapper::_TABLE]);
1026
        $select->join(['tb2' => self::_TABLE], 'tb1.user_id = tb2.id', [
629 ariadna 1027
            'id',
1028
            'uuid',
1029
            'first_name',
1030
            'last_name',
1031
            'email',
1032
            'last_activity_on',
1033
            'image',
1034
            'blocked',
1035
            'login_attempt',
1036
            'email_verified'
1 efrain 1037
 
1038
        ]);
1039
 
1040
        $select->where->equalTo('tb1.company_id', $company_id);
1041
        $select->where->equalTo('tb1.owner', CompanyUser::OWNER_NO);
1042
 
1043
        if ($status) {
1044
            $select->where->equalTo('tb1.status', $status);
1045
        }
1046
 
1047
        if ($search) {
1048
            $select->where->nest()
1049
                ->like('first_name', '%' . $search . '%')
1050
                ->or->like('last_name', '%' . $search . '%')
1051
                ->or->like('email', '%' . $search . '%')
1052
                ->unnest();
1053
        }
1054
 
1055
 
1056
        $select->order($order_field . ' ' . $order_direction);
1057
 
1058
        $hydrator   = new ArraySerializableHydrator();
1059
        $resultset  = new HydratingResultSet($hydrator);
1060
 
1061
        $adapter = new DbSelect($select, $this->sql, $resultset);
1062
        $paginator = new Paginator($adapter);
1063
        $paginator->setItemCountPerPage($records_per_page);
1064
        $paginator->setCurrentPageNumber($page);
1065
 
1066
 
1067
        return $paginator;
1068
    }
1069
 
1070
 
1071
    /**
1072
     *
1073
     * @param int $company_id
1074
     * @param string $search
1075
     * @param int $page
1076
     * @param int $records_per_page
1077
     * @param string $order_field
1078
     * @param string $order_direction
1079
     * @return Paginator
1080
     */
1081
    public function fetchAllDataTableStudensByCompanyId($company_id,  $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1082
    {
1083
        $date = date('Y-m-d');
1084
 
626 stevensc 1085
        $selectTopicUser = $this->getSql()->select();
1086
        $selectTopicUser->columns(['user_id' => new Expression('DISTINCT(user_id)')]);
1087
        $selectTopicUser->from(MicrolearningTopicUserMapper::_TABLE);
1088
        $selectTopicUser->where->equalTo('company_id', $company_id);
1089
        $selectTopicUser->where->nest->equalTo('access', MicrolearningTopicUser::ACCESS_UNLIMITED)->or->nest()
1090
            ->equalTo('access', MicrolearningTopicUser::ACCESS_PAY_PERIOD)
1 efrain 1091
            ->and->lessThanOrEqualTo(new Expression('DATE(paid_from)'), $date)
1092
            ->and->greaterThanOrEqualTo(new Expression('DATE(paid_to)'), $date)->unnest()->unnest();
1093
 
1094
        //echo $select->getSqlString($this->adapter->platform); exit;
1095
 
1096
        $select = $this->sql->select();
1097
        $select->columns(['id', 'uuid', 'first_name', 'last_name', 'email', 'blocked']);
1098
        $select->from(UserMapper::_TABLE);
626 stevensc 1099
        $select->where->in('id', $selectTopicUser);
1 efrain 1100
 
1101
 
1102
        if ($search) {
1103
            $select->where->nest()
1104
                ->like('first_name', '%' . $search . '%')
1105
                ->or->like('last_name', '%' . $search . '%')
1106
                ->or->like('email', '%' . $search . '%')
1107
                ->unnest();
1108
        }
1109
 
1110
 
1111
        $select->order($order_field . ' ' . $order_direction);
1112
 
1113
        $hydrator   = new ArraySerializableHydrator();
1114
        $resultset  = new HydratingResultSet($hydrator);
1115
 
1116
        $adapter = new DbSelect($select, $this->sql, $resultset);
1117
        $paginator = new Paginator($adapter);
1118
        $paginator->setItemCountPerPage($records_per_page);
1119
        $paginator->setCurrentPageNumber($page);
1120
 
1121
 
1122
        return $paginator;
1123
    }
1124
 
1125
 
1126
    /**
1127
     *
1128
     * @param int $company_id
1129
     * @param string $search
1130
     * @param int $page
1131
     * @param int $records_per_page
1132
     * @param string $order_field
1133
     * @param string $order_direction
1134
     * @return Paginator
1135
     */
1136
    public function fetchAllStudensByCompanyId($company_id)
1137
    {
1138
 
1139
        $date = date('Y-m-d');
1140
 
626 stevensc 1141
        $selectTopicUser = $this->getSql()->select();
1142
        $selectTopicUser->columns(['user_id' => new Expression('DISTINCT(user_id)')]);
1143
        $selectTopicUser->from(MicrolearningTopicUserMapper::_TABLE);
1144
        $selectTopicUser->where->equalTo('company_id', $company_id);
1145
        $selectTopicUser->where->nest->equalTo('access', MicrolearningTopicUser::ACCESS_UNLIMITED)->or->nest()
1146
            ->equalTo('access', MicrolearningTopicUser::ACCESS_PAY_PERIOD)
1 efrain 1147
            ->and->lessThanOrEqualTo(new Expression('DATE(paid_from)'), $date)
1148
            ->and->greaterThanOrEqualTo(new Expression('DATE(paid_to)'), $date)->unnest()->unnest();
1149
 
1150
        //echo $select->getSqlString($this->adapter->platform); exit;
1151
        $prototype = new User();
1152
        $select = $this->sql->select();
1153
        $select->columns(['id', 'uuid', 'first_name', 'last_name', 'email', 'blocked']);
1154
        $select->from(UserMapper::_TABLE);
626 stevensc 1155
        $select->where->in('id', $selectTopicUser);
1 efrain 1156
        return $this->executeFetchAllObject($select, $prototype);
1157
    }
1158
 
1159
    /**
1160
     *
1161
     * @param string $search
1162
     * @return User[]
1163
     */
1164
    public function fetchAllSuggest($search)
1165
    {
1166
 
1167
        $select = $this->sql->select();
1168
        $select->from(self::_TABLE);
1169
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1170
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1171
 
1172
        if ($search) {
1173
            $select->where->nest()
1174
                ->like('first_name', '%' . $search . '%')
1175
                ->or->like('last_name', '%' . $search . '%')
1176
                ->or->like('email', '%' . $search . '%')
1177
                ->unnest();
1178
        }
1179
 
1180
        $select->order(['first_name', 'last_name']);
1181
 
1182
        // echo $select->getSqlString($this->adapter->platform); exit;
1183
 
1184
        $prototype = new User();
1185
 
1186
        return $this->executeFetchAllObject($select, $prototype);
1187
    }
1188
 
1189
    /**
1190
     *
1191
     * @param int $network_id
1192
     * @param string $search
1193
     * @return User[]
1194
     */
1195
    public function fetchAllSuggestByNetworkIdAndSearch($network_id, $search)
1196
    {
1197
 
1198
        $select = $this->sql->select();
1199
        $select->from(self::_TABLE);
1200
        $select->where->equalTo('network_id', $network_id);
1201
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1202
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1203
 
1204
        if ($search) {
1205
            $select->where->nest()
1206
                ->like('first_name', '%' . $search . '%')
1207
                ->or->like('last_name', '%' . $search . '%')
1208
                ->or->like(new Expression("CONCAT(first_name,' ',last_name)"), '%' . $search . '%')
1209
                ->or->like(new Expression("CONCAT(last_name,' ',first_name)"), '%' . $search . '%')
1210
                ->or->like('email', '%' . $search . '%')
1211
                ->unnest();
1212
        }
1213
 
1214
        $select->order(['first_name', 'last_name']);
1215
 
1216
        // echo $select->getSqlString($this->adapter->platform); exit;
1217
 
1218
        $prototype = new User();
1219
 
1220
        return $this->executeFetchAllObject($select, $prototype);
1221
    }
629 ariadna 1222
 
1223
 
277 efrain 1224
    /**
1225
     *
1226
     * @param int $network_id
1227
     * @param string $search
1228
     * @param int $records_per_page
1229
     * @param int $page
1230
     * @param int[] $userBlockedIds
1231
     *
1232
     * @return User[]
1233
     */
1234
    public function fetchAllSuggestPaginateByNetworkIdAndSearchAndNotBlocked($network_id, $search, $records_per_page, $page,  $userBlockedIds = [])
1235
    {
629 ariadna 1236
 
277 efrain 1237
        $select = $this->sql->select();
1238
        $select->from(self::_TABLE);
1239
        $select->where->equalTo('network_id', $network_id);
1240
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1241
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
629 ariadna 1242
 
1243
        if ($userBlockedIds) {
278 efrain 1244
            $select->where->notIn('id', $userBlockedIds);
277 efrain 1245
        }
629 ariadna 1246
 
277 efrain 1247
        if ($search) {
1248
            $select->where->nest()
629 ariadna 1249
                ->like('first_name', '%' . $search . '%')
1250
                ->or->like('last_name', '%' . $search . '%')
1251
                ->or->like(new Expression("CONCAT(first_name,' ',last_name)"), '%' . $search . '%')
1252
                ->or->like(new Expression("CONCAT(last_name,' ',first_name)"), '%' . $search . '%')
1253
                ->or->like('email', '%' . $search . '%')
1254
                ->unnest();
277 efrain 1255
        }
629 ariadna 1256
 
277 efrain 1257
        $select->order(['first_name', 'last_name']);
629 ariadna 1258
 
277 efrain 1259
        // echo $select->getSqlString($this->adapter->platform); exit;
629 ariadna 1260
 
277 efrain 1261
        $prototype = new User();
629 ariadna 1262
 
277 efrain 1263
        $hydrator   = new ObjectPropertyHydrator();
1264
        $resultset  = new HydratingResultSet($hydrator, $prototype);
629 ariadna 1265
 
277 efrain 1266
        $adapter = new DbSelect($select, $this->sql, $resultset);
1267
        $paginator = new Paginator($adapter);
1268
        $paginator->setItemCountPerPage($records_per_page);
1269
        $paginator->setCurrentPageNumber($page);
629 ariadna 1270
 
1271
 
277 efrain 1272
        return $paginator;
1273
    }
1 efrain 1274
 
629 ariadna 1275
 
1 efrain 1276
    /**
1277
     *
1278
     * @param int $company_id
1279
     * @param int $network_id
1280
     * @param string $search
1281
     * @return User[]
1282
     */
1283
    public function fetchAllByNetworkIdAndCompanyIdAndSearch($network_id, $company_id, $search)
1284
    {
1285
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1286
        $selectCompanyUsers->columns(['user_id']);
1287
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1288
        $selectCompanyUsers->where->in('status', [
1289
            CompanyUser::STATUS_ACCEPTED,
1290
            CompanyUser::STATUS_ADMIN_WILL_ADD,
629 ariadna 1291
 
1 efrain 1292
        ]);
629 ariadna 1293
 
1 efrain 1294
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
629 ariadna 1295
 
1 efrain 1296
        $select = $this->sql->select();
1297
        $select->from(self::_TABLE);
1298
        $select->where->equalTo('network_id', $network_id);
1299
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1300
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
629 ariadna 1301
 
1302
 
1 efrain 1303
        if ($search) {
1304
            $select->where->nest()
629 ariadna 1305
                ->like('first_name', '%' . $search . '%')
1306
                ->or->like('last_name', '%' . $search . '%')
1307
                ->or->like('email', '%' . $search . '%')
1308
                ->unnest();
1 efrain 1309
        }
629 ariadna 1310
 
1 efrain 1311
        $select->where->In('id', $selectCompanyUsers);
629 ariadna 1312
 
1 efrain 1313
        $select->order(['first_name', 'last_name']);
629 ariadna 1314
 
1315
        // echo $select->getSqlString($this->adapter->platform); exit;
1316
 
1 efrain 1317
        $prototype = new User();
629 ariadna 1318
 
1 efrain 1319
        return $this->executeFetchAllObject($select, $prototype);
1320
    }
629 ariadna 1321
 
1322
 
1 efrain 1323
    /**
1324
     *
1325
     * @param int $company_id
1326
     * @param int $network_id
1327
     * @param string $search
1328
     * @return User[]
1329
     */
1330
    public function fetchAllSuggestForInvitationByCompanyIdAndNetworkIdAndSearch($company_id, $network_id, $search)
1331
    {
1332
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1333
        $selectCompanyUsers->columns(['user_id']);
1334
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1335
        $selectCompanyUsers->where->in('status', [
1336
            CompanyUser::STATUS_ACCEPTED,
1337
            CompanyUser::STATUS_PENDING,
1338
            CompanyUser::STATUS_SENT,
1339
 
1340
        ]);
1341
 
1342
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
1343
 
1344
        $select = $this->sql->select();
1345
        $select->from(self::_TABLE);
1346
        $select->where->notIn('id', $selectCompanyUsers);
1347
        $select->where->equalTo('network_id', $network_id);
1348
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1349
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1350
 
1351
        if ($search) {
1352
            $select->where->nest()
1353
                ->like('first_name', '%' . $search . '%')
1354
                ->or->like('last_name', '%' . $search . '%')
1355
                ->or->like('email', '%' . $search . '%')
1356
                ->unnest();
1357
        }
1358
 
1359
        $select->order(['first_name', 'last_name']);
1360
 
1361
        // echo $select->getSqlString($this->adapter->platform); exit;
1362
 
1363
        $prototype = new User();
1364
 
1365
        return $this->executeFetchAllObject($select, $prototype);
1366
    }
1367
 
1368
    /**
1369
     *
1370
     * @param int $company_id
1371
     * @param string $search
1372
     * @return User[]
1373
     */
1374
    public function fetchAllSuggestForInvitationByCompanyId($company_id, $search)
1375
    {
1376
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1377
        $selectCompanyUsers->columns(['user_id']);
1378
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1379
        $selectCompanyUsers->where->in('status', [
1380
            CompanyUser::STATUS_ACCEPTED,
1381
            CompanyUser::STATUS_PENDING,
1382
            CompanyUser::STATUS_SENT,
1383
 
1384
        ]);
1385
 
1386
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
1387
 
1388
        $select = $this->sql->select();
1389
        $select->from(self::_TABLE);
1390
        $select->where->notIn('id', $selectCompanyUsers);
1391
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1392
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1393
 
1394
        if ($search) {
1395
            $select->where->nest()
1396
                ->like('first_name', '%' . $search . '%')
1397
                ->or->like('last_name', '%' . $search . '%')
1398
                ->or->like('email', '%' . $search . '%')
1399
                ->unnest();
1400
        }
1401
 
1402
        $select->order(['first_name', 'last_name']);
1403
 
1404
        // echo $select->getSqlString($this->adapter->platform); exit;
1405
 
1406
        $prototype = new User();
1407
 
1408
        return $this->executeFetchAllObject($select, $prototype);
1409
    }
1410
 
1411
    /**
1412
     *
1413
     * @param int $group_id
1414
     * @param int $network_id
1415
     * @param string $search
1416
     * @return User[]
1417
     */
1418
    public function fetchAllSuggestForInvitationByGroupIdAndNetworkIdAndSearch($group_id, $network_id, $search)
1419
    {
1420
        $selectGroupMembers = $this->sql->select(GroupMemberMapper::_TABLE);
1421
        $selectGroupMembers->columns(['user_id']);
1422
        $selectGroupMembers->where->equalTo('group_id', $group_id);
1423
        $selectGroupMembers->where->in('status', [
1424
            CompanyUser::STATUS_ACCEPTED,
1425
        ]);
1426
 
1427
        //echo $selectGroupMembers->getSqlString($this->adapter->platform); exit;
1428
 
1429
        $select = $this->sql->select();
1430
        $select->from(self::_TABLE);
1431
        $select->where->equalTo('network_id', $network_id);
1432
        $select->where->notIn('id', $selectGroupMembers);
1433
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1434
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1435
 
1436
        if ($search) {
1437
            $select->where->nest()
1438
                ->like('first_name', '%' . $search . '%')
1439
                ->or->like('last_name', '%' . $search . '%')
1440
                ->or->like('email', '%' . $search . '%')
1441
                ->unnest();
1442
        }
1443
 
1444
        $select->order(['first_name', 'last_name']);
1445
 
1446
        // echo $select->getSqlString($this->adapter->platform); exit;
1447
 
1448
        $prototype = new User();
1449
 
1450
        return $this->executeFetchAllObject($select, $prototype);
1451
    }
1452
 
1453
    /**
1454
     *
1455
     * @param int $group_id
1456
     * @param string $search
1457
     * @return User[]
1458
     */
1459
    public function fetchAllSuggestForInvitationByGroupId($group_id, $search)
1460
    {
1461
        $selectGroupMembers = $this->sql->select(GroupMemberMapper::_TABLE);
1462
        $selectGroupMembers->columns(['user_id']);
1463
        $selectGroupMembers->where->equalTo('group_id', $group_id);
1464
        $selectGroupMembers->where->in('status', [
1465
            CompanyUser::STATUS_ACCEPTED,
1466
        ]);
1467
 
1468
        //echo $selectGroupMembers->getSqlString($this->adapter->platform); exit;
1469
 
1470
        $select = $this->sql->select();
1471
        $select->from(self::_TABLE);
1472
        $select->where->notIn('id', $selectGroupMembers);
1473
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1474
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1475
 
1476
        if ($search) {
1477
            $select->where->nest()
1478
                ->like('first_name', '%' . $search . '%')
1479
                ->or->like('last_name', '%' . $search . '%')
1480
                ->or->like('email', '%' . $search . '%')
1481
                ->unnest();
1482
        }
1483
 
1484
        $select->order(['first_name', 'last_name']);
1485
 
1486
        // echo $select->getSqlString($this->adapter->platform); exit;
1487
 
1488
        $prototype = new User();
1489
 
1490
        return $this->executeFetchAllObject($select, $prototype);
1491
    }
1492
 
1493
 
1494
 
1495
 
1496
    /**
1497
     *
1498
     * @param string $search
1499
     * @param int $page
1500
     * @param int $records_per_page
1501
     * @param string $order_field
1502
     * @param string $order_direction
1503
     * @return Paginator
1504
     */
1505
    public function fetchAllDataTable($search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1506
    {
1507
        $prototype = new User();
1508
        $select = $this->sql->select(self::_TABLE);
1509
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1510
 
1511
 
1512
        if ($search) {
1513
            $select->where->nest()
1514
                ->like('first_name', '%' . $search . '%')
1515
                ->or->like('last_name', '%' . $search . '%')
1516
                ->or->like('email', '%' . $search . '%')
1517
                ->unnest();
1518
        }
1519
 
1520
 
1521
        $select->order($order_field . ' ' . $order_direction);
1522
 
1523
        $hydrator   = new ObjectPropertyHydrator();
1524
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1525
 
1526
        $adapter = new DbSelect($select, $this->sql, $resultset);
1527
        $paginator = new Paginator($adapter);
1528
        $paginator->setItemCountPerPage($records_per_page);
1529
        $paginator->setCurrentPageNumber($page);
1530
 
1531
 
1532
        return $paginator;
1533
    }
1534
 
1535
    /**
1536
     *
1537
     * @param int $network_id
1538
     * @param string $search
1539
     * @param int $page
1540
     * @param int $records_per_page
1541
     * @param string $order_field
1542
     * @param string $order_direction
1543
     * @return Paginator
1544
     */
1545
    public function fetchAllDataTableByNetworkId($network_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1546
    {
1547
        $prototype = new User();
1548
        $select = $this->sql->select(self::_TABLE);
1549
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1550
        $select->where->equalTo('network_id', $network_id);
1551
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_APPROVED);
1552
 
1553
 
1554
        if ($search) {
1555
            $select->where->nest()
1556
                ->like('first_name', '%' . $search . '%')
1557
                ->or->like('last_name', '%' . $search . '%')
1558
                ->or->like('email', '%' . $search . '%')
1559
                ->unnest();
1560
        }
1561
 
1562
 
1563
        $select->order($order_field . ' ' . $order_direction);
1564
 
1565
        $hydrator   = new ObjectPropertyHydrator();
1566
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1567
 
1568
        $adapter = new DbSelect($select, $this->sql, $resultset);
1569
        $paginator = new Paginator($adapter);
1570
        $paginator->setItemCountPerPage($records_per_page);
1571
        $paginator->setCurrentPageNumber($page);
1572
 
1573
 
1574
        return $paginator;
1575
    }
1576
 
1577
 
1578
 
1579
 
1580
    /**
1581
     *
1582
     * @param int $network_id
1583
     * @param string $search
1584
     * @param int $page
1585
     * @param int $records_per_page
1586
     * @param string $order_field
1587
     * @param string $order_direction
1588
     * @return Paginator
1589
     */
1590
    public function fetchAllDataTableRequestAccessPendingByNetworkId($network_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1591
    {
1592
        $prototype = new User();
1593
        $select = $this->sql->select(self::_TABLE);
1594
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1595
        $select->where->equalTo('network_id', $network_id);
1596
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_PENDING);
1597
 
1598
        if ($search) {
1599
            $select->where->nest()
1600
                ->like('first_name', '%' . $search . '%')
1601
                ->or->like('last_name', '%' . $search . '%')
1602
                ->or->like('email', '%' . $search . '%')
1603
                ->unnest();
1604
        }
1605
 
1606
 
1607
        $select->order($order_field . ' ' . $order_direction);
1608
 
1609
        $hydrator   = new ObjectPropertyHydrator();
1610
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1611
 
1612
        $adapter = new DbSelect($select, $this->sql, $resultset);
1613
        $paginator = new Paginator($adapter);
1614
        $paginator->setItemCountPerPage($records_per_page);
1615
        $paginator->setCurrentPageNumber($page);
1616
 
1617
 
1618
        return $paginator;
1619
    }
1620
 
1621
 
1622
    /**
1623
     *
1624
     * @param int $id
1625
     * @return boolean
1626
     */
1627
    public function markIsAdult($id)
1628
    {
1629
        $update = $this->sql->update(self::_TABLE);
1630
        $update->set([
1631
            'id_adult' => User::IS_ADULT_YES,
1632
        ]);
1633
        $update->where->equalTo('id', $id);
1634
 
1635
        return $this->executeUpdate($update);
1636
    }
1637
 
1638
    /**
1639
     *
1640
     * @param int $id
1641
     * @return boolean
1642
     */
1643
    public function markIsNotAdult($id)
1644
    {
1645
        $update = $this->sql->update(self::_TABLE);
1646
        $update->set([
1647
            'id_adult' => User::IS_ADULT_NO,
1648
        ]);
1649
        $update->where->equalTo('id', $id);
1650
 
1651
        return $this->executeUpdate($update);
1652
    }
1653
 
1654
    /**
1655
     *
1656
     * @param int $id
1657
     * @return boolean
1658
     */
1659
    public function updateChatOnlineStatus($id)
1660
    {
1661
        $update = $this->sql->update(self::_TABLE);
1662
        $update->set([
1663
            'online' => 1,
1664
        ]);
1665
        $update->where->equalTo('id', $id);
1666
 
1667
        return $this->executeUpdate($update);
1668
    }
1669
 
1670
 
1671
 
1672
    /**
1673
     *
1674
     * @param int $id
1675
     * @return boolean
1676
     */
1677
    public function updateLastActivity($id)
1678
    {
1679
        $update = $this->sql->update(self::_TABLE);
1680
        $update->set([
1681
            'last_activity_on' => new Expression('NOW()'),
1682
            'online' => 1,
1683
        ]);
1684
        $update->where->equalTo('id', $id);
1685
 
1686
        return $this->executeUpdate($update);
1687
    }
1688
 
1689
 
1690
    /**
1691
     *
1692
     * @param int $id
1693
     * @return boolean
1694
     */
1695
    public function updateLastHeartBeat($id)
1696
    {
1697
        $update = $this->sql->update(self::_TABLE);
1698
        $update->set([
1699
            'last_heart_beat_at' => new Expression('NOW()'),
1700
            'online' => 1,
1701
 
1702
        ]);
1703
        $update->where->equalTo('id', $id);
1704
 
1705
        return $this->executeUpdate($update);
1706
    }
1707
 
1708
    /**
1709
     *
1710
     * @param int $id
1711
     * @return boolean
1712
     */
1713
    public function emailVerifyAndActive($id)
1714
    {
1715
        $update = $this->sql->update(self::_TABLE);
1716
        $update->set([
1717
            'email_verified' => User::EMAIL_VERIFIED_YES,
1718
            'status' => User::STATUS_ACTIVE,
1719
        ]);
1720
        $update->where->equalTo('id', $id);
1721
 
1722
        return $this->executeUpdate($update);
1723
    }
1724
 
1725
    /**
1726
     *
1727
     * @param int $company_id
1728
     * @return User[]
1729
     */
1730
    public function fetchAllVerifyAndActiveByCompanyId($company_id)
1731
    {
1732
        $select = $this->sql->select();
1733
        $select->columns(['status', 'company_id']);
1734
        $select->from(['tb1' => CompanyUserMapper::_TABLE]);
1735
        $select->join(['tb2' => self::_TABLE], 'tb1.user_id = tb2.id');
1736
 
1737
 
1738
 
1739
        $select->where->equalTo('tb1.company_id', $company_id);
1740
        $select->where->equalTo('tb1.owner', CompanyUser::OWNER_NO);
1741
        $select->where->in('tb1.status', [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD]);
1742
        $select->where->equalTo('tb2.email_verified', User::EMAIL_VERIFIED_YES);
1743
        $select->where->equalTo('tb2.status', User::STATUS_ACTIVE);
1744
 
1745
        $select->order('first_name', 'last_name', 'email');
1746
 
1747
        $prototype = User();
1748
 
1749
        return $this->executeFetchAllObject($select, $prototype);
1750
    }
629 ariadna 1751
 
1752
 
1753
 
264 efrain 1754
    /**
1755
     *
1756
     * @param string $username_inmail
1757
     * @param int $network_id
1758
     * @return void|User
1759
     */
1760
    public function fetchOneByUsernameInmailAndNetworkId($username_inmail, $network_id)
1761
    {
1762
        $prototype = new User();
1763
        $select = $this->sql->select(self::_TABLE);
1764
        $select->where->equalTo('username_inmail', $username_inmail);
1765
        $select->where->equalTo('network_id', $network_id);
1766
        $select->where->equalTo('status', User::STATUS_ACTIVE);
629 ariadna 1767
 
1768
 
264 efrain 1769
        //echo $select->getSqlString($this->adapter->platform); exit;
629 ariadna 1770
 
264 efrain 1771
        return $this->executeFetchOneObject($select, $prototype);
1772
    }
629 ariadna 1773
 
1774
    /**
1775
     * Update the verification status of a user.
1776
     *
1777
     * @param User $user
1778
     * @param bool $is_verified
1779
     * @return boolean
1780
     */
1781
    public function updateUserEmailVerified($user, $is_verified)
1782
    {
1783
        $values = [
1784
            'email_verified' => $is_verified,
1785
            'updated_on'  => new Expression('NOW()')
1786
        ];
1787
 
1788
        $update = $this->sql->update(self::_TABLE);
1789
        $update->set($values);
1790
        $update->where->equalTo('id', $user->id);
1791
 
1792
        return $this->executeUpdate($update);
1793
    }
1794
 
1795
    /**
1796
     * Update the blocked status of a user.
1797
     *
1798
     * @param User $user
1799
     * @param bool $is_blocked
1800
     * @return boolean
1801
     */
1802
    public function updateUserBlockedStatus($user, $is_blocked)
1803
    {
1804
        $values = [
1805
            'blocked' => $is_blocked,
1806
            'updated_on' => new Expression('NOW()')
1807
        ];
1808
 
1809
        $update = $this->sql->update(self::_TABLE);
1810
        $update->set($values);
1811
        $update->where->equalTo('id', $user->id);
1812
 
1813
        return $this->executeUpdate($update);
1814
    }
1815
 
1816
    /**
1817
     * Update the status of a user.
1818
     *
1819
     * @param User $user
1820
     * @param string $status
1821
     * @return boolean
1822
     */
1823
    public function updateUserStatus($user, $status)
1824
    {
1825
        $values = [
1826
            'status'     => $status,
1827
            'updated_on' => new Expression('NOW()')
1828
        ];
1829
 
1830
        $update = $this->sql->update(self::_TABLE);
1831
        $update->set($values);
1832
        $update->where->equalTo('id', $user->id);
1833
 
1834
        return $this->executeUpdate($update);
1835
    }
630 ariadna 1836
 
1837
    /**
1838
     * Update multiple user fields: email_verified, blocked, status, and usertype_id.
1839
     *
1840
     * @param User $user
1841
     * @param string $email_verified
1842
     * @param string $blocked
1843
     * @param string $status
1844
     * @param int $usertype_id
1845
     * @return boolean
1846
     */
1847
    public function updateUserFieldsAdmin($user, $email_verified, $blocked, $status, $usertype_id)
1848
    {
1849
        $values = [
1850
            'email_verified' => $email_verified,
1851
            'blocked'        => $blocked,
1852
            'status'         => $status,
1853
            'usertype_id'    => $usertype_id,
1854
            'updated_on'     => new Expression('NOW()')
1855
        ];
1856
 
1857
        $update = $this->sql->update(self::_TABLE);
1858
        $update->set($values);
1859
        $update->where->equalTo('id', $user->id);
1860
 
1861
        return $this->executeUpdate($update);
1862
    }
1 efrain 1863
}