Proyectos de Subversion LeadersLinked - Services

Rev

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