Proyectos de Subversion LeadersLinked - Services

Rev

Rev 277 | Rev 608 | 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;
264 efrain 20
use LeadersLinked\Model\MicrolearningCapsuleUser;
1 efrain 21
 
22
 
23
class UserMapper extends MapperCommon
24
{
25
    const _TABLE = 'tbl_users';
26
 
27
    /**
28
     *
29
     * @var UserMapper
30
     */
31
    private static $_instance;
32
 
33
    /**
34
     *
35
     * @param AdapterInterface $adapter
36
     */
37
    private function __construct($adapter)
38
    {
39
        parent::__construct($adapter);
40
    }
41
 
42
    /**
43
     *
44
     * @param AdapterInterface $adapter
45
     * @return UserMapper
46
     */
47
    public static function getInstance($adapter)
48
    {
49
        if (self::$_instance == null) {
50
            self::$_instance = new UserMapper($adapter);
51
        }
52
        return self::$_instance;
53
    }
54
 
55
    /**
56
     *
57
     * @param string $uuid
58
     * @return User
59
     */
60
    public function fetchOneByUuid($uuid)
61
    {
62
        $prototype = new User();
63
        $select = $this->sql->select(self::_TABLE);
64
        $select->where->equalTo('uuid', $uuid);
65
 
66
 
67
        return $this->executeFetchOneObject($select, $prototype);
68
    }
69
 
70
 
71
    /**
72
     *
73
     * @return User
74
     */
75
    public function fetchOneDefaultForConnection()
76
    {
77
        $prototype = new User();
78
        $select = $this->sql->select(self::_TABLE);
79
        $select->where->equalTo('default_for_connection', User::DEFAULT_FOR_CONNECTION_YES);
80
 
81
 
82
        return $this->executeFetchOneObject($select, $prototype);
83
    }
84
 
85
 
86
 
87
    /**
88
     *
89
     * @param string $uuid
90
     * @param int $network_id
91
     * @return User
92
     */
93
    public function fetchOneByUuidAndNetworkId($uuid, $network_id)
94
    {
95
        $prototype = new User();
96
        $select = $this->sql->select(self::_TABLE);
97
        $select->where->equalTo('uuid', $uuid);
98
        $select->where->equalTo('network_id', $network_id);
99
 
100
 
101
        return $this->executeFetchOneObject($select, $prototype);
102
    }
103
 
104
    /**
105
     *
106
     * @param int $id
107
     * @return User
108
     */
109
    public function fetchOne($id)
110
    {
111
        $prototype = new User();
112
        $select = $this->sql->select(self::_TABLE);
113
        $select->where->equalTo('id', $id);
114
 
115
        return $this->executeFetchOneObject($select, $prototype);
116
    }
117
 
118
    public function fetchOneRelation($id)
119
    {
120
        $prototype = new User();
121
        $select = $this->sql->select(self::_TABLE);
122
        $select->where->equalTo('id', $id);
123
 
124
        return $this->executeFetchOneObject($select, $prototype);
125
    }
126
 
127
 
128
    /**
129
     *
130
     * @param string $email
131
     * @return void|User
132
     */
133
    public function fetchOneByEmail($email)
134
    {
135
        $prototype = new User();
136
        $select = $this->sql->select(self::_TABLE);
137
        $select->where->equalTo('email', $email);
138
 
139
        //echo $select->getSqlString($this->adapter->platform); exit;
140
 
141
        return $this->executeFetchOneObject($select, $prototype);
142
    }
143
 
144
    /**
145
     *
146
     * @param string $email
147
     * @param int $network_id
148
     * @return void|User
149
     */
150
    public function fetchOneByEmailAndNetworkId($email, $network_id)
151
    {
152
        $prototype = new User();
153
        $select = $this->sql->select(self::_TABLE);
154
        $select->where->equalTo('email', $email);
155
        $select->where->equalTo('network_id', $network_id);
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
 
264 efrain 850
       //echo $update->getSqlString($this->adapter->platform); exit;
1 efrain 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)')]);
264 efrain 1082
        $selectCapsuleUser->from(MicrolearningCapsuleUserMapper::_TABLE);
1 efrain 1083
        $selectCapsuleUser->where->equalTo('company_id', $company_id);
264 efrain 1084
        $selectCapsuleUser->where->nest->equalTo('access', MicrolearningCapsuleUser::ACCESS_UNLIMITED)->or->nest()
1085
            ->equalTo('access', MicrolearningCapsuleUser::ACCESS_PAY_PERIOD)
1 efrain 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)')]);
264 efrain 1138
        $selectCapsuleUser->from(MicrolearningCapsuleUserMapper::_TABLE);
1 efrain 1139
        $selectCapsuleUser->where->equalTo('company_id', $company_id);
264 efrain 1140
        $selectCapsuleUser->where->nest->equalTo('access', MicrolearningCapsuleUser::ACCESS_UNLIMITED)->or->nest()
1141
            ->equalTo('access', MicrolearningCapsuleUser::ACCESS_PAY_PERIOD)
1 efrain 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
    }
269 efrain 1217
 
1218
 
277 efrain 1219
    /**
1220
     *
1221
     * @param int $network_id
1222
     * @param string $search
1223
     * @param int $records_per_page
1224
     * @param int $page
1225
     * @param int[] $userBlockedIds
1226
     *
1227
     * @return User[]
1228
     */
1229
    public function fetchAllSuggestPaginateByNetworkIdAndSearchAndNotBlocked($network_id, $search, $records_per_page, $page,  $userBlockedIds = [])
1230
    {
1231
 
1232
        $select = $this->sql->select();
1233
        $select->from(self::_TABLE);
1234
        $select->where->equalTo('network_id', $network_id);
1235
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1236
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1237
 
1238
        if($userBlockedIds) {
278 efrain 1239
            $select->where->notIn('id', $userBlockedIds);
277 efrain 1240
        }
278 efrain 1241
 
277 efrain 1242
        if ($search) {
1243
            $select->where->nest()
1244
            ->like('first_name', '%' . $search . '%')
1245
            ->or->like('last_name', '%' . $search . '%')
1246
            ->or->like(new Expression("CONCAT(first_name,' ',last_name)"), '%' . $search . '%')
1247
            ->or->like(new Expression("CONCAT(last_name,' ',first_name)"), '%' . $search . '%')
1248
            ->or->like('email', '%' . $search . '%')
1249
            ->unnest();
1250
        }
1251
 
1252
        $select->order(['first_name', 'last_name']);
1253
 
1254
        // echo $select->getSqlString($this->adapter->platform); exit;
1255
 
1256
        $prototype = new User();
1257
 
1258
        $hydrator   = new ObjectPropertyHydrator();
1259
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1260
 
1261
        $adapter = new DbSelect($select, $this->sql, $resultset);
1262
        $paginator = new Paginator($adapter);
1263
        $paginator->setItemCountPerPage($records_per_page);
1264
        $paginator->setCurrentPageNumber($page);
1265
 
1266
 
1267
        return $paginator;
1268
    }
269 efrain 1269
 
1 efrain 1270
 
1271
    /**
1272
     *
1273
     * @param int $company_id
1274
     * @param int $network_id
1275
     * @param string $search
1276
     * @return User[]
1277
     */
1278
    public function fetchAllByNetworkIdAndCompanyIdAndSearch($network_id, $company_id, $search)
1279
    {
1280
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1281
        $selectCompanyUsers->columns(['user_id']);
1282
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1283
        $selectCompanyUsers->where->in('status', [
1284
            CompanyUser::STATUS_ACCEPTED,
1285
            CompanyUser::STATUS_ADMIN_WILL_ADD,
1286
 
1287
        ]);
1288
 
1289
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
1290
 
1291
        $select = $this->sql->select();
1292
        $select->from(self::_TABLE);
1293
        $select->where->equalTo('network_id', $network_id);
1294
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1295
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1296
 
1297
 
1298
        if ($search) {
1299
            $select->where->nest()
1300
            ->like('first_name', '%' . $search . '%')
1301
            ->or->like('last_name', '%' . $search . '%')
1302
            ->or->like('email', '%' . $search . '%')
1303
            ->unnest();
1304
        }
1305
 
1306
        $select->where->In('id', $selectCompanyUsers);
1307
 
1308
        $select->order(['first_name', 'last_name']);
1309
 
1310
       // echo $select->getSqlString($this->adapter->platform); exit;
1311
 
1312
        $prototype = new User();
1313
 
1314
        return $this->executeFetchAllObject($select, $prototype);
1315
    }
1316
 
1317
 
1318
    /**
1319
     *
1320
     * @param int $company_id
1321
     * @param int $network_id
1322
     * @param string $search
1323
     * @return User[]
1324
     */
1325
    public function fetchAllSuggestForInvitationByCompanyIdAndNetworkIdAndSearch($company_id, $network_id, $search)
1326
    {
1327
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1328
        $selectCompanyUsers->columns(['user_id']);
1329
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1330
        $selectCompanyUsers->where->in('status', [
1331
            CompanyUser::STATUS_ACCEPTED,
1332
            CompanyUser::STATUS_PENDING,
1333
            CompanyUser::STATUS_SENT,
1334
 
1335
        ]);
1336
 
1337
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
1338
 
1339
        $select = $this->sql->select();
1340
        $select->from(self::_TABLE);
1341
        $select->where->notIn('id', $selectCompanyUsers);
1342
        $select->where->equalTo('network_id', $network_id);
1343
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1344
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1345
 
1346
        if ($search) {
1347
            $select->where->nest()
1348
                ->like('first_name', '%' . $search . '%')
1349
                ->or->like('last_name', '%' . $search . '%')
1350
                ->or->like('email', '%' . $search . '%')
1351
                ->unnest();
1352
        }
1353
 
1354
        $select->order(['first_name', 'last_name']);
1355
 
1356
        // echo $select->getSqlString($this->adapter->platform); exit;
1357
 
1358
        $prototype = new User();
1359
 
1360
        return $this->executeFetchAllObject($select, $prototype);
1361
    }
1362
 
1363
    /**
1364
     *
1365
     * @param int $company_id
1366
     * @param string $search
1367
     * @return User[]
1368
     */
1369
    public function fetchAllSuggestForInvitationByCompanyId($company_id, $search)
1370
    {
1371
        $selectCompanyUsers = $this->sql->select(CompanyUserMapper::_TABLE);
1372
        $selectCompanyUsers->columns(['user_id']);
1373
        $selectCompanyUsers->where->equalTo('company_id', $company_id);
1374
        $selectCompanyUsers->where->in('status', [
1375
            CompanyUser::STATUS_ACCEPTED,
1376
            CompanyUser::STATUS_PENDING,
1377
            CompanyUser::STATUS_SENT,
1378
 
1379
        ]);
1380
 
1381
        //echo $selectCompanyUsers->getSqlString($this->adapter->platform); exit;
1382
 
1383
        $select = $this->sql->select();
1384
        $select->from(self::_TABLE);
1385
        $select->where->notIn('id', $selectCompanyUsers);
1386
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1387
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1388
 
1389
        if ($search) {
1390
            $select->where->nest()
1391
                ->like('first_name', '%' . $search . '%')
1392
                ->or->like('last_name', '%' . $search . '%')
1393
                ->or->like('email', '%' . $search . '%')
1394
                ->unnest();
1395
        }
1396
 
1397
        $select->order(['first_name', 'last_name']);
1398
 
1399
        // echo $select->getSqlString($this->adapter->platform); exit;
1400
 
1401
        $prototype = new User();
1402
 
1403
        return $this->executeFetchAllObject($select, $prototype);
1404
    }
1405
 
1406
    /**
1407
     *
1408
     * @param int $group_id
1409
     * @param int $network_id
1410
     * @param string $search
1411
     * @return User[]
1412
     */
1413
    public function fetchAllSuggestForInvitationByGroupIdAndNetworkIdAndSearch($group_id, $network_id, $search)
1414
    {
1415
        $selectGroupMembers = $this->sql->select(GroupMemberMapper::_TABLE);
1416
        $selectGroupMembers->columns(['user_id']);
1417
        $selectGroupMembers->where->equalTo('group_id', $group_id);
1418
        $selectGroupMembers->where->in('status', [
1419
            CompanyUser::STATUS_ACCEPTED,
1420
        ]);
1421
 
1422
        //echo $selectGroupMembers->getSqlString($this->adapter->platform); exit;
1423
 
1424
        $select = $this->sql->select();
1425
        $select->from(self::_TABLE);
1426
        $select->where->equalTo('network_id', $network_id);
1427
        $select->where->notIn('id', $selectGroupMembers);
1428
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1429
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1430
 
1431
        if ($search) {
1432
            $select->where->nest()
1433
                ->like('first_name', '%' . $search . '%')
1434
                ->or->like('last_name', '%' . $search . '%')
1435
                ->or->like('email', '%' . $search . '%')
1436
                ->unnest();
1437
        }
1438
 
1439
        $select->order(['first_name', 'last_name']);
1440
 
1441
        // echo $select->getSqlString($this->adapter->platform); exit;
1442
 
1443
        $prototype = new User();
1444
 
1445
        return $this->executeFetchAllObject($select, $prototype);
1446
    }
1447
 
1448
    /**
1449
     *
1450
     * @param int $group_id
1451
     * @param string $search
1452
     * @return User[]
1453
     */
1454
    public function fetchAllSuggestForInvitationByGroupId($group_id, $search)
1455
    {
1456
        $selectGroupMembers = $this->sql->select(GroupMemberMapper::_TABLE);
1457
        $selectGroupMembers->columns(['user_id']);
1458
        $selectGroupMembers->where->equalTo('group_id', $group_id);
1459
        $selectGroupMembers->where->in('status', [
1460
            CompanyUser::STATUS_ACCEPTED,
1461
        ]);
1462
 
1463
        //echo $selectGroupMembers->getSqlString($this->adapter->platform); exit;
1464
 
1465
        $select = $this->sql->select();
1466
        $select->from(self::_TABLE);
1467
        $select->where->notIn('id', $selectGroupMembers);
1468
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1469
        $select->where->equalTo('email_verified', User::EMAIL_VERIFIED_YES);
1470
 
1471
        if ($search) {
1472
            $select->where->nest()
1473
                ->like('first_name', '%' . $search . '%')
1474
                ->or->like('last_name', '%' . $search . '%')
1475
                ->or->like('email', '%' . $search . '%')
1476
                ->unnest();
1477
        }
1478
 
1479
        $select->order(['first_name', 'last_name']);
1480
 
1481
        // echo $select->getSqlString($this->adapter->platform); exit;
1482
 
1483
        $prototype = new User();
1484
 
1485
        return $this->executeFetchAllObject($select, $prototype);
1486
    }
1487
 
1488
 
1489
 
1490
 
1491
    /**
1492
     *
1493
     * @param string $search
1494
     * @param int $page
1495
     * @param int $records_per_page
1496
     * @param string $order_field
1497
     * @param string $order_direction
1498
     * @return Paginator
1499
     */
1500
    public function fetchAllDataTable($search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1501
    {
1502
        $prototype = new User();
1503
        $select = $this->sql->select(self::_TABLE);
1504
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1505
 
1506
 
1507
        if ($search) {
1508
            $select->where->nest()
1509
                ->like('first_name', '%' . $search . '%')
1510
                ->or->like('last_name', '%' . $search . '%')
1511
                ->or->like('email', '%' . $search . '%')
1512
                ->unnest();
1513
        }
1514
 
1515
 
1516
        $select->order($order_field . ' ' . $order_direction);
1517
 
1518
        $hydrator   = new ObjectPropertyHydrator();
1519
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1520
 
1521
        $adapter = new DbSelect($select, $this->sql, $resultset);
1522
        $paginator = new Paginator($adapter);
1523
        $paginator->setItemCountPerPage($records_per_page);
1524
        $paginator->setCurrentPageNumber($page);
1525
 
1526
 
1527
        return $paginator;
1528
    }
1529
 
1530
    /**
1531
     *
1532
     * @param int $network_id
1533
     * @param string $search
1534
     * @param int $page
1535
     * @param int $records_per_page
1536
     * @param string $order_field
1537
     * @param string $order_direction
1538
     * @return Paginator
1539
     */
1540
    public function fetchAllDataTableByNetworkId($network_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1541
    {
1542
        $prototype = new User();
1543
        $select = $this->sql->select(self::_TABLE);
1544
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1545
        $select->where->equalTo('network_id', $network_id);
1546
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_APPROVED);
1547
 
1548
 
1549
        if ($search) {
1550
            $select->where->nest()
1551
                ->like('first_name', '%' . $search . '%')
1552
                ->or->like('last_name', '%' . $search . '%')
1553
                ->or->like('email', '%' . $search . '%')
1554
                ->unnest();
1555
        }
1556
 
1557
 
1558
        $select->order($order_field . ' ' . $order_direction);
1559
 
1560
        $hydrator   = new ObjectPropertyHydrator();
1561
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1562
 
1563
        $adapter = new DbSelect($select, $this->sql, $resultset);
1564
        $paginator = new Paginator($adapter);
1565
        $paginator->setItemCountPerPage($records_per_page);
1566
        $paginator->setCurrentPageNumber($page);
1567
 
1568
 
1569
        return $paginator;
1570
    }
1571
 
1572
 
1573
 
1574
 
1575
    /**
1576
     *
1577
     * @param int $network_id
1578
     * @param string $search
1579
     * @param int $page
1580
     * @param int $records_per_page
1581
     * @param string $order_field
1582
     * @param string $order_direction
1583
     * @return Paginator
1584
     */
1585
    public function fetchAllDataTableRequestAccessPendingByNetworkId($network_id, $search, $page = 1, $records_per_page = 10, $order_field = 'name', $order_direction = 'ASC')
1586
    {
1587
        $prototype = new User();
1588
        $select = $this->sql->select(self::_TABLE);
1589
        $select->where->in('usertype_id', [UserType::ADMIN, UserType::USER]);
1590
        $select->where->equalTo('network_id', $network_id);
1591
        $select->where->equalTo('request_access', User::REQUEST_ACCESS_PENDING);
1592
 
1593
        if ($search) {
1594
            $select->where->nest()
1595
                ->like('first_name', '%' . $search . '%')
1596
                ->or->like('last_name', '%' . $search . '%')
1597
                ->or->like('email', '%' . $search . '%')
1598
                ->unnest();
1599
        }
1600
 
1601
 
1602
        $select->order($order_field . ' ' . $order_direction);
1603
 
1604
        $hydrator   = new ObjectPropertyHydrator();
1605
        $resultset  = new HydratingResultSet($hydrator, $prototype);
1606
 
1607
        $adapter = new DbSelect($select, $this->sql, $resultset);
1608
        $paginator = new Paginator($adapter);
1609
        $paginator->setItemCountPerPage($records_per_page);
1610
        $paginator->setCurrentPageNumber($page);
1611
 
1612
 
1613
        return $paginator;
1614
    }
1615
 
1616
 
1617
    /**
1618
     *
1619
     * @param int $id
1620
     * @return boolean
1621
     */
1622
    public function markIsAdult($id)
1623
    {
1624
        $update = $this->sql->update(self::_TABLE);
1625
        $update->set([
1626
            'id_adult' => User::IS_ADULT_YES,
1627
        ]);
1628
        $update->where->equalTo('id', $id);
1629
 
1630
        return $this->executeUpdate($update);
1631
    }
1632
 
1633
    /**
1634
     *
1635
     * @param int $id
1636
     * @return boolean
1637
     */
1638
    public function markIsNotAdult($id)
1639
    {
1640
        $update = $this->sql->update(self::_TABLE);
1641
        $update->set([
1642
            'id_adult' => User::IS_ADULT_NO,
1643
        ]);
1644
        $update->where->equalTo('id', $id);
1645
 
1646
        return $this->executeUpdate($update);
1647
    }
1648
 
1649
    /**
1650
     *
1651
     * @param int $id
1652
     * @return boolean
1653
     */
1654
    public function updateChatOnlineStatus($id)
1655
    {
1656
        $update = $this->sql->update(self::_TABLE);
1657
        $update->set([
1658
            'online' => 1,
1659
        ]);
1660
        $update->where->equalTo('id', $id);
1661
 
1662
        return $this->executeUpdate($update);
1663
    }
1664
 
1665
 
1666
 
1667
    /**
1668
     *
1669
     * @param int $id
1670
     * @return boolean
1671
     */
1672
    public function updateLastActivity($id)
1673
    {
1674
        $update = $this->sql->update(self::_TABLE);
1675
        $update->set([
1676
            'last_activity_on' => new Expression('NOW()'),
1677
            'online' => 1,
1678
        ]);
1679
        $update->where->equalTo('id', $id);
1680
 
1681
        return $this->executeUpdate($update);
1682
    }
1683
 
1684
 
1685
    /**
1686
     *
1687
     * @param int $id
1688
     * @return boolean
1689
     */
1690
    public function updateLastHeartBeat($id)
1691
    {
1692
        $update = $this->sql->update(self::_TABLE);
1693
        $update->set([
1694
            'last_heart_beat_at' => new Expression('NOW()'),
1695
            'online' => 1,
1696
 
1697
        ]);
1698
        $update->where->equalTo('id', $id);
1699
 
1700
        return $this->executeUpdate($update);
1701
    }
1702
 
1703
    /**
1704
     *
1705
     * @param int $id
1706
     * @return boolean
1707
     */
1708
    public function emailVerifyAndActive($id)
1709
    {
1710
        $update = $this->sql->update(self::_TABLE);
1711
        $update->set([
1712
            'email_verified' => User::EMAIL_VERIFIED_YES,
1713
            'status' => User::STATUS_ACTIVE,
1714
        ]);
1715
        $update->where->equalTo('id', $id);
1716
 
1717
        return $this->executeUpdate($update);
1718
    }
1719
 
1720
 
1721
    /**
1722
     *
1723
     * @param int $company_id
1724
     * @return User[]
1725
     */
1726
    public function fetchAllVerifyAndActiveByCompanyId($company_id)
1727
    {
1728
        $select = $this->sql->select();
1729
        $select->columns(['status', 'company_id']);
1730
        $select->from(['tb1' => CompanyUserMapper::_TABLE]);
1731
        $select->join(['tb2' => self::_TABLE], 'tb1.user_id = tb2.id');
1732
 
1733
 
1734
 
1735
        $select->where->equalTo('tb1.company_id', $company_id);
1736
        $select->where->equalTo('tb1.owner', CompanyUser::OWNER_NO);
1737
        $select->where->in('tb1.status', [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD]);
1738
        $select->where->equalTo('tb2.email_verified', User::EMAIL_VERIFIED_YES);
1739
        $select->where->equalTo('tb2.status', User::STATUS_ACTIVE);
1740
 
1741
        $select->order('first_name', 'last_name', 'email');
1742
 
1743
        $prototype = User();
1744
 
1745
        return $this->executeFetchAllObject($select, $prototype);
1746
    }
264 efrain 1747
 
1748
 
1749
 
1750
    /**
1751
     *
1752
     * @param string $username_inmail
1753
     * @param int $network_id
1754
     * @return void|User
1755
     */
1756
    public function fetchOneByUsernameInmailAndNetworkId($username_inmail, $network_id)
1757
    {
1758
        $prototype = new User();
1759
        $select = $this->sql->select(self::_TABLE);
1760
        $select->where->equalTo('username_inmail', $username_inmail);
1761
        $select->where->equalTo('network_id', $network_id);
1762
        $select->where->equalTo('status', User::STATUS_ACTIVE);
1763
 
1764
 
1765
        //echo $select->getSqlString($this->adapter->platform); exit;
1766
 
1767
        return $this->executeFetchOneObject($select, $prototype);
1768
    }
1 efrain 1769
}