Proyectos de Subversion LeadersLinked - Services

Rev

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