Proyectos de Subversion LeadersLinked - Services

Rev

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