Proyectos de Subversion LeadersLinked - Services

Rev

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