Proyectos de Subversion LeadersLinked - Services

Rev

Rev 146 | Rev 167 | 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\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
 
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Mapper\CalendarEventMapper;
13
use LeadersLinked\Mapper\CompanyFollowerMapper;
14
use LeadersLinked\Mapper\CompanyServiceMapper;
15
use LeadersLinked\Mapper\JobDescriptionMapper;
16
use LeadersLinked\Mapper\PerformanceEvaluationFormMapper;
17
use LeadersLinked\Mapper\PerformanceEvaluationTestMapper;
18
use LeadersLinked\Mapper\QueryMapper;
19
use LeadersLinked\Mapper\RecruitmentSelectionCandidateMapper;
20
use LeadersLinked\Mapper\RecruitmentSelectionInterviewMapper;
21
use LeadersLinked\Mapper\RecruitmentSelectionVacancyMapper;
22
use LeadersLinked\Mapper\UserMapper;
23
use LeadersLinked\Mapper\ZoomMeetingMapper;
24
use LeadersLinked\Library\Functions;
25
use LeadersLinked\Mapper\UserNotificationSettingMapper;
26
 
27
use LeadersLinked\Model\CalendarEvent;
28
use LeadersLinked\Model\PerformanceEvaluationTest;
29
use LeadersLinked\Model\RecruitmentSelectionInterview;
30
use LeadersLinked\Model\User;
31
use LeadersLinked\Mapper\ConnectionMapper;
32
use LeadersLinked\Mapper\ProfileVisitMapper;
33
use LeadersLinked\Mapper\GroupMemberMapper;
34
use LeadersLinked\Model\GroupMember;
35
use LeadersLinked\Mapper\GroupMapper;
36
use LeadersLinked\Model\Group;
37
use Laminas\Db\Sql\Expression;
38
use LeadersLinked\Mapper\CompanyUserMapper;
39
use LeadersLinked\Model\CompanyUser;
40
use LeadersLinked\Model\UserType;
41
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;
42
use LeadersLinked\Model\Notification;
43
use LeadersLinked\Mapper\NotificationMapper;
44
use LeadersLinked\Mapper\EmailTemplateMapper;
45
use LeadersLinked\Model\EmailTemplate;
46
use LeadersLinked\Library\QueueEmail;
47
use LeadersLinked\Mapper\PostMapper;
48
use LeadersLinked\Mapper\CompanyMapper;
49
use LeadersLinked\Model\Company;
50
use LeadersLinked\Model\Connection;
51
use LeadersLinked\Model\Service;
52
use LeadersLinked\Mapper\DailyPulseEmojiMapper;
53
use LeadersLinked\Mapper\UserProfileMapper;
54
use LeadersLinked\Mapper\NetworkMapper;
55
use LeadersLinked\Model\Network;
56
use LeadersLinked\Mapper\LocationMapper;
57
use LeadersLinked\Mapper\CompanySizeMapper;
58
use LeadersLinked\Mapper\DegreeMapper;
59
use LeadersLinked\Mapper\LanguageMapper;
60
use LeadersLinked\Mapper\SkillMapper;
61
use LeadersLinked\Mapper\AptitudeMapper;
62
use LeadersLinked\Mapper\HobbyAndInterestMapper;
63
use LeadersLinked\Mapper\IndustryMapper;
64
use LeadersLinked\Mapper\SurveyTestMapper;
65
use LeadersLinked\Model\SurveyTest;
66
use LeadersLinked\Mapper\SurveyCampaignMapper;
117 efrain 67
use LeadersLinked\Mapper\GroupTypeMapper;
1 efrain 68
 
69
class HelperController extends AbstractActionController
70
{
71
    /**
72
     *
73
     * @var \Laminas\Db\Adapter\AdapterInterface
74
     */
75
    private $adapter;
76
 
77
    /**
78
     *
79
     * @var \LeadersLinked\Cache\CacheInterface
80
     */
81
    private $cache;
82
 
83
 
84
    /**
85
     *
86
     * @var \Laminas\Log\LoggerInterface
87
     */
88
    private $logger;
89
 
90
    /**
91
     *
92
     * @var array
93
     */
94
    private $config;
95
 
96
 
97
    /**
98
     *
99
     * @var \Laminas\Mvc\I18n\Translator
100
     */
101
    private $translator;
102
 
103
 
104
    /**
105
     *
106
     * @var array
107
     */
108
    private $navigation;
109
 
110
    /**
111
     *
112
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
113
     * @param \LeadersLinked\Cache\CacheInterface $cache
114
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
115
     * @param array $config
116
     * @param \Laminas\Mvc\I18n\Translator $translator
117
     * @param array $navigation
118
     */
119
    public function __construct($adapter, $cache, $logger, $config, $translator, $navigation)
120
    {
121
        $this->adapter      = $adapter;
122
        $this->cache        = $cache;
123
        $this->logger       = $logger;
124
        $this->config       = $config;
125
        $this->translator   = $translator;
126
        $this->navigation   = $navigation;
127
    }
128
 
129
 
130
    /**
131
     * Recuperamos las personas que pueda conocer
132
     * tiene que enviarse un petición GET a la siguiente url: /helpers/people-you-may-know
133
     * retorna un json en caso de ser  positivo
134
     * [
135
     *  'success' : true,
136
     *  'data' : [
137
     *      [
138
     *        'id'      => 'id del usuario encriptado',
139
     *        'name'    => 'nombre del usuario',
140
     *        'image'   => 'imagen del usuario',
141
     *        'profile' => 'url del profile',
142
     *     ]
143
     * ]
144
     * En caso de ser negativo
145
     * [
146
     *  'success' : false,
147
     *  'data' : mensaje de error
148
     * ]
149
     * @return \Laminas\View\Model\JsonModel
150
     */
151
    public function peopleYouMayKnowAction()
152
    {
153
        $request = $this->getRequest();
154
        if ($request->isGet()) {
155
            $currentUserPlugin = $this->plugin('currentUserPlugin');
156
            $currentUser = $currentUserPlugin->getUser();
157
 
158
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
159
            $first_degree_connections_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
160
            $first_degree_connections_ids = $first_degree_connections_ids ? $first_degree_connections_ids : [0];
161
 
162
            $second_degree_connections_ids = $connectionMapper->fetchAllSecondDegreeConnectionsForUserIdReturnIds($currentUser->id);
163
            $second_degree_connections_ids = $second_degree_connections_ids ? $second_degree_connections_ids : [0];
164
 
165
            /*Usuarios de la empresas donde trabajo o soy dueño */
166
            $company_user_ids = [];
167
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
168
 
169
            $records = $companyUserMapper->fetchAllByUserId($currentUser->id);
170
            foreach ($records as $record) {
171
 
172
                if ($record->status != CompanyUser::STATUS_ACCEPTED) {
173
                    continue;
174
                }
175
 
176
                $otherUsers = $companyUserMapper->fetchAllByCompanyId($record->company_id);
177
                foreach ($otherUsers as $otherUser) {
178
                    if ($currentUser->id != $otherUser->user_id && $otherUser->creator == CompanyUser::CREATOR_NO && $otherUser->status == CompanyUser::STATUS_ACCEPTED) {
179
 
180
                        if (!in_array($otherUser->user_id, $company_user_ids)) {
181
                            array_push($company_user_ids, $otherUser->user_id);
182
                        }
183
                    }
184
                }
185
            }
186
            $company_user_ids =  $company_user_ids ? $company_user_ids : [0];
187
 
188
            /* Usuario de los grupos donde soy dueño o participo */
189
 
190
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
191
 
192
            $group_member_ids = [];
193
 
194
            $records = $groupMemberMapper->fetchAllByUserId($currentUser->id);
195
            foreach ($records as $record) {
196
                if ($record->status != GroupMember::STATUS_ACCEPTED) {
197
                    continue;
198
                }
199
 
200
                $otherUsers = $groupMemberMapper->fetchAllByGroupId($record->group_id);
201
                foreach ($otherUsers as $otherUser) {
202
                    if ($currentUser->id != $otherUser->user_id && $otherUser->status == GroupMember::STATUS_ACCEPTED) {
203
 
204
                        if (!in_array($otherUser->user_id, $group_member_ids)) {
205
                            array_push($group_member_ids, $otherUser->user_id);
206
                        }
207
                    }
208
                }
209
            }
210
 
211
            $group_member_ids = $group_member_ids ? $group_member_ids : [0];
212
 
213
 
214
 
215
            /* Usuarios con que comparto capsulas */
216
            $capsule_user_ids = [];
217
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
218
 
219
            $company_ids = [];
220
            $records = $capsuleUserMapper->fetchAllActiveByUserId($currentUser->id);
221
            foreach ($records as $record) {
222
                if (!in_array($record->company_id, $company_ids)) {
223
                    array_push($company_ids, $record->company_id);
224
                }
225
            }
226
 
227
 
228
 
229
            foreach ($company_ids as $company_id) {
230
                $otherUsers = $capsuleUserMapper->fetchAllUserIdsForCapsulesActiveByCompanyId($company_id);
231
                foreach ($otherUsers as $user_id) {
232
                    if ($currentUser->id != $user_id) {
233
 
234
                        if (!in_array($user_id, $capsule_user_ids)) {
235
                            array_push($capsule_user_ids, $user_id);
236
                        }
237
                    }
238
                }
239
            }
240
 
241
            $capsule_user_ids = $capsule_user_ids ? $capsule_user_ids : [0];
242
 
243
 
244
            $other_users = array_unique(array_merge(
245
                $second_degree_connections_ids,
246
                $company_user_ids,
247
                $group_member_ids,
248
                $capsule_user_ids
249
            ));
250
 
251
 
252
 
253
 
254
 
255
 
256
 
257
 
258
            $items = [];
259
            $queryMapper = QueryMapper::getInstance($this->adapter);
260
            $select = $queryMapper->getSql()->select();
261
            $select->columns(['id', 'uuid',  'first_name', 'last_name', 'image']);
262
            $select->from(['u' => UserMapper::_TABLE]);
263
            $select->join(['up' => UserProfileMapper::_TABLE], 'up.user_id = u.id ', ['description']);
264
            $select->where->equalTo('network_id', $currentUser->network_id);
265
            $select->where->in('u.id', $other_users);
266
            $select->where->notIn('u.id', $first_degree_connections_ids);
267
            $select->where->notEqualTo('u.id', $currentUser->id);
268
            $select->where->equalTo('u.status', User::STATUS_ACTIVE);
269
            $select->where->in('u.usertype_id', [UserType::ADMIN, UserType::USER]);
270
            $select->order(['first_name', 'last_name']);
271
 
272
            //echo $select->getSqlString($this->adapter->platform); exit;
273
 
274
            $records = $queryMapper->fetchAll($select);
275
            foreach ($records as $record) {
276
 
277
                $relation = [];
278
                if (in_array($record['id'], $second_degree_connections_ids)) {
279
                    array_push($relation, 'LABEL_RELATION_TYPE_SECOND_GRADE');
280
                }
281
                if (in_array($record['id'], $company_user_ids)) {
282
                    array_push($relation, 'LABEL_RELATION_TYPE_COMPANY_USER');
283
                }
284
                if (in_array($record['id'], $group_member_ids)) {
285
                    array_push($relation, 'LABEL_RELATION_TYPE_GROUP_MEMBER');
286
                }
287
                if (in_array($record['id'], $capsule_user_ids)) {
288
                    array_push($relation, 'LABEL_RELATION_TYPE_CAPSULE_USER');
289
                }
290
 
291
 
292
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $record['id']);
293
 
294
                $item = [
295
                    'id'    => $record['uuid'],
296
                    'name'  => trim($record['first_name'] . ' ' . $record['last_name']),
60 efrain 297
                    'image' => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'user', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 298
                    'profile'   => $this->url()->fromRoute('profile/view', ['id' => $record['uuid']]),
299
                    'relation' => $relation,
300
                    'link_cancel'   => '',
301
                    'link_request'  => '',
302
                    'user_profile' => $record['description'],
303
                ];
304
 
305
                if ($connection) {
306
                    switch ($connection->status) {
307
                        case Connection::STATUS_SENT:
308
                            $item['link_cancel'] = $this->url()->fromRoute('connection/delete', ['id' => $record['uuid']]);
309
                            break;
310
 
311
                        case Connection::STATUS_ACCEPTED:
312
                            $item['link_cancel'] = $this->url()->fromRoute('connection/cancel', ['id' => $record['uuid']]);
313
                            break;
314
 
315
                        default:
316
                            $item['link_request'] = $this->url()->fromRoute('connection/request', ['id' => $record['uuid']]);
317
                            break;
318
                    }
319
                } else {
320
                    $item['link_request'] = $this->url()->fromRoute('connection/request', ['id' => $record['uuid']]);
321
                }
322
 
323
 
324
                array_push($items, $item);
325
            }
326
 
327
            return new JsonModel([
328
                'success' => true,
329
                'data' => $items
330
            ]);
331
        } else {
332
            return new JsonModel([
333
                'success' => false,
334
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
335
            ]);
336
        }
337
    }
338
 
339
    /**
340
     * Recuperamos las personas que pueda conocer
341
     * tiene que enviarse un petición GET a la siguiente url: /helpers/people-viewed-profile/:user_profile_id
342
     * retorna un json en caso de ser  positivo
343
     * [
344
     *  'success' : true,
345
     *  'data' : [
346
     *      [
347
     *        'id'      => 'id del usuario encriptado',
348
     *        'name'    => 'nombre del usuario',
349
     *        'image'   => 'imagen del usuario',
350
     *        'profile' => 'url del profile',
351
     *     ]
352
     * ]
353
     * En caso de ser negativo
354
     * [
355
     *  'success' : false,
356
     *  'data' : mensaje de error
357
     * ]
358
     * @return \Laminas\View\Model\JsonModel
359
     */
360
    public function peopleViewedProfileAction()
361
    {
362
        $request = $this->getRequest();
363
        if ($request->isGet()) {
364
            $currentUserPlugin = $this->plugin('currentUserPlugin');
365
            $currentUser = $currentUserPlugin->getUser();
366
 
367
            $items = [];
368
            $user_profile_id = $this->params()->fromRoute('user_profile_id');
369
 
370
            $items = [];
371
 
372
            $mapper = QueryMapper::getInstance($this->adapter);
373
            $select = $mapper->getSql()->select(ProfileVisitMapper::_TABLE);
374
            $select->columns(['user_id' => new Expression('DISTINCT(visitor_id)')]);
375
            $select->where->equalTo('user_profile_id', $user_profile_id);
376
            $records = $mapper->fetchAll($select);
377
 
378
            if ($records) {
379
 
380
                $user_ids = [];
381
                foreach ($records as $record) {
382
                    array_push($user_ids, $record['user_id']);
383
                }
384
 
385
                $mapper = QueryMapper::getInstance($this->adapter);
386
                $select = $mapper->getSql()->select(UserMapper::_TABLE);
387
                $select->columns(['id', 'uuid', 'first_name', 'last_name', 'image']);
388
                $select->where->in('id', $user_ids);
389
                $select->where->equalTo('network_id', $currentUser->network_id);
390
                $select->where->equalTo('status', User::STATUS_ACTIVE);
391
                $select->order(['last_name ASC', 'first_name ASC']);
392
 
393
                $records = $mapper->fetchAll($select);
394
                foreach ($records as $record) {
395
                    array_push($items, [
396
                        'id'        => $record['uuid'],
397
                        'name'      => trim($record['first_name'] . ' ' . $record['last_name']),
60 efrain 398
                        'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'user', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 399
                        'profile'   => $this->url()->fromRoute('profile/view', ['id' => $record['uuid']]),
400
                    ]);
401
                }
402
            }
403
 
404
 
405
            return new JsonModel([
406
                'success' => true,
407
                'data' => $items
408
            ]);
409
        } else {
410
            return new JsonModel([
411
                'success' => false,
412
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
413
            ]);
414
        }
415
    }
416
 
417
 
418
    /**
419
     * Recuperamos los seguidores de la empresa
420
     * tiene que enviarse un petición GET a la siguiente url: /helpers/company-follower/:company_id
421
     * retorna un json en caso de ser  positivo
422
     * [
423
     *  'success' : true,
424
     *  'data' : [
425
     *      [
426
     *        'id'      => 'id del usuario encriptado',
427
     *        'name'    => 'nombre del usuario',
428
     *        'image'   => 'imagen del usuario',
429
     *        'profile' => 'url del profile',
430
     *     ]
431
     * ]
432
     * En caso de ser negativo
433
     * [
434
     *  'success' : false,
435
     *  'data' : mensaje de error
436
     * ]
437
     * @return \Laminas\View\Model\JsonModel
438
     */
439
    public function companyFollowerAction()
440
    {
441
 
442
 
443
        $request = $this->getRequest();
444
        if ($request->isGet()) {
445
            $currentUserPlugin = $this->plugin('currentUserPlugin');
446
            $currentUser = $currentUserPlugin->getUser();
447
 
448
            $company_uuid  = $this->params()->fromRoute('company_id');
449
 
450
            $companyMapper = CompanyMapper::getInstance($this->adapter);
451
            $company = $companyMapper->fetchOneByUuidAndNetworkId($company_uuid, $currentUser->network_id);
452
 
453
            $items = [];
454
            if ($company && $company->status == Company::STATUS_ACTIVE) {
455
 
456
 
457
                //print_r($company);
458
 
459
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
460
                $records = $companyFollowerMapper->fetchAllByCompanyId($company->id);
461
 
462
                $ids = [];
463
                foreach ($records as $record) {
464
                    if (!in_array($record->follower_id, $ids)) {
465
                        array_push($ids, $record->follower_id);
466
                    }
467
                }
468
 
469
                //print_r($records);
470
 
471
 
472
                if ($ids) {
473
 
474
                    $mapper = QueryMapper::getInstance($this->adapter);
475
                    $select = $mapper->getSql()->select(UserMapper::_TABLE);
476
                    $select->columns(['id', 'uuid', 'first_name', 'last_name', 'image']);
477
                    $select->where->equalTo('network_id', $currentUser->network_id);
478
                    $select->where->in('id', $ids);
479
                    $select->where->equalTo('status', User::STATUS_ACTIVE);
480
                    $select->order(['last_name', 'first_name']);
481
 
482
                    //echo $select->getSqlString($this->adapter->platform); exit;
483
 
484
 
485
 
486
                    $records = $mapper->fetchAll($select);
487
                    foreach ($records as $record) {
488
 
489
 
490
                        array_push($items, [
491
                            'id'        => $record['uuid'],
492
                            'name'      => trim($record['first_name'] . ' ' . $record['last_name']),
60 efrain 493
                            'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'user', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 494
                            'profile'   => $this->url()->fromRoute('profile/view', ['id' => $record['uuid']]),
495
                        ]);
496
                    }
497
                }
498
            }
499
 
500
            return new JsonModel([
501
                'success' => true,
502
                'data' => $items
503
            ]);
504
        } else {
505
            return new JsonModel([
506
                'success' => false,
507
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
508
            ]);
509
        }
510
    }
511
 
512
    public function companySuggestionAction()
513
    {
514
        $request = $this->getRequest();
515
        if ($request->isGet()) {
516
            $currentUserPlugin = $this->plugin('currentUserPlugin');
517
            $currentUser = $currentUserPlugin->getUser();
518
 
519
            $company_uuid = $this->params()->fromRoute('company_id');
520
 
521
            $companyMapper = CompanyMapper::getInstance($this->adapter);
522
            $company = $companyMapper->fetchOneByUuidAndNetworkId($company_uuid, $currentUser->network_id);
523
 
524
            $items = [];
525
            if ($company && $company->status == Company::STATUS_ACTIVE) {
526
 
527
 
528
                $mapper = QueryMapper::getInstance($this->adapter);
529
                $select = $mapper->getSql()->select(CompanyMapper::_TABLE);
530
                $select->columns(['id', 'uuid', 'name', 'image']);
531
                $select->where->equalTo('network_id', $currentUser->network_id);
532
                $select->where->notEqualTo('id', $company->id);
533
                $select->where->equalTo('status', Company::STATUS_ACTIVE);
534
                $select->where->equalTo('industry_id', $company->industry_id);
535
                //  $select->where->equalTo('company_size_id', $company->company_size_id);
536
                $select->order(['name']);
537
 
538
 
539
                //echo $select->getSqlString($this->adapter->platform); exit;
540
 
541
                $records = $mapper->fetchAll($select);
542
                foreach ($records as $record) {
543
                    array_push($items, [
544
                        'id'        => $record['uuid'],
545
                        'name'      => trim($record['name']),
60 efrain 546
                        'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'company', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 547
                        'profile'   => $this->url()->fromRoute('company/view', ['id' => $record['uuid']]),
548
                    ]);
549
                }
550
            }
551
 
552
            return new JsonModel([
553
                'success' => true,
554
                'data' => $items
555
            ]);
556
        } else {
557
            return new JsonModel([
558
                'success' => false,
559
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
560
            ]);
561
        }
562
    }
563
 
564
    /**
565
     * Recuperamos los miembros del grupo
566
     * tiene que enviarse un petición GET a la siguiente url: /helpers/group-members/:group_id
567
     * retorna un json en caso de ser  positivo
568
     * [
569
     *  'success' : true,
570
     *  'data' : [
571
     *      [
572
     *        'id'      => 'id del usuario encriptado',
573
     *        'name'    => 'nombre del usuario',
574
     *        'image'   => 'imagen del usuario',
575
     *        'profile' => 'url del profile',
576
     *     ]
577
     * ]
578
     * En caso de ser negativo
579
     * [
580
     *  'success' : false,
581
     *  'data' : mensaje de error
582
     * ]
583
     * @return \Laminas\View\Model\JsonModel
584
     */
585
    public function groupMembersAction()
586
    {
587
        $currentUserPlugin = $this->plugin('currentUserPlugin');
588
        $currentUser = $currentUserPlugin->getUser();
589
 
590
        $request = $this->getRequest();
591
        if ($request->isGet()) {
592
 
593
            $group_uuid = $this->params()->fromRoute('group_id');
594
 
595
            $groupMapper = GroupMapper::getInstance($this->adapter);
596
            $group = $groupMapper->fetchOneByUuidAndNetworkId($group_uuid, $currentUser->network_id);
597
 
598
            $items = [];
599
            if ($group && $group->status == Group::STATUS_ACTIVE) {
600
 
601
                $mapper = QueryMapper::getInstance($this->adapter);
602
                $select = $mapper->getSql()->select();
603
                $select->columns(['id', 'uuid', 'first_name', 'last_name', 'image']);
604
                $select->from(['u' => UserMapper::_TABLE]);
605
                $select->join(['gm' => GroupMemberMapper::_TABLE], 'gm.user_id = u.id ', ['user_id', 'status']);
606
                $select->join(['g' => GroupMapper::_TABLE], 'gm.group_id = g.id', ['group_uuid' => 'uuid']);
607
                $select->where->equalTo('u.network_id',  $currentUser->network_id);
608
                $select->where->equalTo('g.network_id', $currentUser->network_id);
609
                $select->where->equalTo('g.uuid', $group_uuid);
610
 
611
                if ($group->user_id == $currentUser->id) {
612
                    $select->where->in('gm.status', [
613
                        GroupMember::STATUS_ACCEPTED,
614
                        GroupMember::STATUS_ADDED_BY_ADMIN,
615
                        GroupMember::STATUS_AUTO_JOIN,
616
                        GroupMember::STATUS_JOINING_REQUESTED,
617
                    ]);
618
                } else {
619
                    $select->where->in('gm.status', [GroupMember::STATUS_ACCEPTED, GroupMember::STATUS_AUTO_JOIN]);
620
                }
621
 
622
 
623
                $select->where->equalTo('u.status', User::STATUS_ACTIVE);
624
                $select->order(['last_name', 'first_name']);
625
 
626
                //echo $select->getSqlString($this->adapter->platform);
627
 
628
 
629
 
630
 
631
                $records = $mapper->fetchAll($select);
632
                foreach ($records as $record) {
633
 
634
                    $actions = [];
635
                    if ($group->user_id == $currentUser->id) {
636
                        if ($record['id'] != $currentUser->id) {
637
 
638
 
639
 
640
                            switch ($record['status']) {
641
                                case GroupMember::STATUS_JOINING_REQUESTED:
642
                                    $actions['link_approve'] = $this->url()->fromRoute('helpers/group-members/approve', ['group_id' => $group->uuid, 'user_id' => $record['uuid']]);
643
                                    $actions['link_reject'] = $this->url()->fromRoute('helpers/group-members/reject', ['group_id' => $group->uuid, 'user_id' => $record['uuid']]);
644
                                    break;
645
 
646
                                case GroupMember::STATUS_ACCEPTED:
647
                                case GroupMember::STATUS_AUTO_JOIN:
648
                                case GroupMember::STATUS_ADDED_BY_ADMIN:
649
                                    $actions['link_cancel'] = $this->url()->fromRoute('helpers/group-members/cancel', ['group_id' => $group->uuid, 'user_id' => $record['uuid']]);
650
                                    break;
651
                            }
652
                        }
653
                    }
654
 
655
                    array_push($items, [
656
                        'id'        => $record['uuid'],
657
                        'name'      => trim($record['first_name'] . ' ' . $record['last_name']),
60 efrain 658
                        'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'user', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 659
                        'profile'   => $this->url()->fromRoute('profile/view', ['id' => $record['uuid']]),
660
                        'actions'   => $actions,
661
 
662
                    ]);
663
                }
664
            }
665
 
666
            return new JsonModel([
667
                'success' => true,
668
                'data' => [
669
                    'items' => $items,
670
                    'link_invite' => $group->user_id == $currentUser->id ? $this->url()->fromRoute('helpers/group-members/invite', ['group_id' => $group->uuid])  : '',
671
                ]
672
            ]);
673
        } else {
674
            return new JsonModel([
675
                'success' => false,
676
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
677
            ]);
678
        }
679
    }
680
 
681
    public function groupMemberInviteAction()
682
    {
683
        $currentUserPlugin = $this->plugin('currentUserPlugin');
684
        $currentUser = $currentUserPlugin->getUser();
685
 
686
        $group_uuid = $this->params()->fromRoute('group_id');
687
 
688
        $groupMapper = GroupMapper::getInstance($this->adapter);
689
        $group = $groupMapper->fetchOneByUuidAndNetworkId($group_uuid, $currentUser->network_id);
690
 
691
        if (!$group) {
692
            return new JsonModel([
693
                'success' => false,
694
                'data' => 'ERROR_GROUP_NOT_FOUND'
695
            ]);
696
        }
697
 
698
        if ($group->status != Group::STATUS_ACTIVE) {
699
            return new JsonModel([
700
                'success' => false,
701
                'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
702
            ]);
703
        }
704
 
705
        if ($currentUser->id != $group->user_id) {
706
            return new JsonModel([
707
                'success' => false,
708
                'data' => 'ERROR_GROUP_IS_NOT_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
709
            ]);
710
        }
711
 
712
 
713
        $request = $this->getRequest();
714
        if ($request->isGet()) {
715
            $search = filter_var($this->params()->fromQuery('search', ''));
716
            if (strlen($search) >= 3) {
717
 
718
                $userMapper = UserMapper::getInstance($this->adapter);
719
                $records  = $userMapper->fetchAllSuggestForInvitationByGroupIdAndNetworkIdAndSearch($group->id, $currentUser->network_id, $search);
720
 
721
                $users = [];
722
                foreach ($records as $record) {
723
                    array_push($users, [
724
                        'value' => $record->uuid,
725
                        'text' => trim($record->first_name . ' ' . $record->last_name) . ' (' . $record->email . ')'
726
 
727
                    ]);
728
                }
729
 
730
                return new JsonModel([
731
                    'success' => true,
732
                    'data' => $users
733
                ]);
734
            } else {
735
                return new JsonModel([
736
                    'success' => true,
737
                    'data' => []
738
                ]);
739
            }
740
        } else if ($request->isPost()) {
741
            $uuid = $this->params()->fromPost('id');
742
            if (!$uuid) {
743
                return new JsonModel([
744
                    'success'   => false,
745
                    'data'      => 'ERROR_INVALID_PARAMETER'
746
                ]);
747
            }
748
 
749
            $userMapper = UserMapper::getInstance($this->adapter);
750
            $user = $userMapper->fetchOneByUuidAndNetworkId($uuid, $currentUser->network_id);
751
 
752
            if (!$user) {
753
                return new JsonModel([
754
                    'success'   => false,
755
                    'data'      => 'ERROR_USER_NOT_FOUND'
756
                ]);
757
            }
758
 
759
            if ($user->status != User::STATUS_ACTIVE) {
760
                return new JsonModel([
761
                    'success'   => false,
762
                    'data'      => 'ERROR_USER_IS_INACTIVE'
763
                ]);
764
            }
765
 
766
            if ($group->user_id == $user->id) {
767
                return new JsonModel([
768
                    'success'   => false,
769
                    'data'      => 'ERROR_GROUP_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
770
                ]);
771
            }
772
 
773
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
774
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $user->id);
775
 
776
 
777
 
778
            if ($groupMember) {
779
                $result = false;
780
 
781
                switch ($groupMember->status) {
782
                    case GroupMember::STATUS_ACCEPTED:
783
                    case GroupMember::STATUS_AUTO_JOIN:
784
 
785
                        return new JsonModel([
786
                            'success'   => false,
787
                            'data'      => 'ERROR_GROUP_YOU_ARE_MEMBER',
788
                        ]);
789
                        break;
790
 
791
 
792
                    case $groupMember->status == GroupMember::STATUS_REJECTED:
793
                    case $groupMember->status == GroupMember::STATUS_CANCELLED:
794
 
795
                        $groupMember->status = GroupMember::STATUS_ADDED_BY_ADMIN;
796
                        $groupMember->joining_request_on = date('H-m-d H:i:s');
797
 
798
                        $result = $groupMemberMapper->update($groupMember);
799
                        break;
800
 
801
                    case GroupMember::STATUS_ADDED_BY_ADMIN:
802
                    case  GroupMember::STATUS_JOINING_REQUESTED:
803
                        return new JsonModel([
804
                            'success'   => false,
805
                            'data'      => 'ERROR_GROUP_THERE_IS_A_PENDING_REQUEST'
806
                        ]);
807
                        break;
808
 
809
                    default:
810
                        return new JsonModel([
811
                            'success'   => false,
812
                            'data'      => 'ERROR_UNKNOWN_OPERATION'
813
                        ]);
814
                        break;
815
                }
816
            } else {
817
 
818
 
819
 
820
                $groupMember = new GroupMember();
821
                $groupMember->user_id = $user->id;
822
                $groupMember->group_id = $group->id;
823
                $groupMember->status = GroupMember::STATUS_ADDED_BY_ADMIN;
824
                $groupMember->joining_request_on = date('H-m-d H:i:s');
825
 
826
                $result = $groupMemberMapper->insert($groupMember);
827
            }
828
 
829
            if ($result) {
830
 
831
                $notification = new Notification();
832
                $notification->type     = Notification::TYPE_RECEIVE_INVITATION_GROUP;
833
                $notification->read     = Notification::NO;
834
                $notification->user_id  = $user->id;
835
                $notification->group_id = $group->id;
836
                $notification->message  = 'LABEL_NOTIFICATION_RECEIVE_INVITATION_GROUP';
837
                $notification->url      = $this->url()->fromRoute('group/view', ['id' => $group->uuid]);
838
 
839
                $notificationMapper = NotificationMapper::getInstance($this->adapter);
840
                $notificationMapper->insert($notification);
841
 
842
                $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
843
                $userNotification = $userNotificationMapper->fetchOne($user->id);
844
 
845
                if ($userNotification && $userNotification->receive_invitation_group) {
846
                    $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
847
                    $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_RECEIVE_INVITATION_GROUP, $currentUser->network_id);
848
 
849
                    if ($emailTemplate) {
850
                        $arrayCont = [
851
                            'firstname'             => $currentUser->first_name,
852
                            'lastname'              => $currentUser->last_name,
853
                            'other_user_firstname'  => $user->first_name,
854
                            'other_user_lastname'   => $user->last_name,
855
                            'company_name'          => '',
856
                            'group_name'            => $group->name,
857
                            'content'               => '',
858
                            'code'                  => '',
859
                            'link'                  => $this->url()->fromRoute('group/view', ['id' => $group->uuid], ['force_canonical' => true])
860
                        ];
861
 
862
                        $email = new QueueEmail($this->adapter);
863
                        $email->processEmailTemplate($emailTemplate, $arrayCont, $user->email, trim($user->first_name . ' ' . $user->last_name));
864
                    }
865
                }
866
 
867
                return new JsonModel([
868
                    'success'   => true,
869
                    'data'      => 'LABEL_GROUP_REQUEST_SUCCESS'
870
                ]);
871
            } else {
872
 
873
                return new JsonModel([
874
                    'success'   => false,
875
                    'data'      => 'ERROR_GROUP_REQUEST_COULD_NOT_BE_SENT'
876
                ]);
877
            }
878
        } else {
879
            return new JsonModel([
880
                'success' => false,
881
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
882
            ]);
883
        }
884
    }
885
 
886
    public function  groupMemberCancelAction()
887
    {
888
        $currentUserPlugin = $this->plugin('currentUserPlugin');
889
        $currentUser = $currentUserPlugin->getUser();
890
 
891
        $request = $this->getRequest();
892
        if ($request->isPost()) {
893
            $group_uuid = $this->params()->fromRoute('group_id');
894
            $user_uuid  = $this->params()->fromRoute('user_id');
895
 
896
            $groupMapper = GroupMapper::getInstance($this->adapter);
897
            $group = $groupMapper->fetchOneByUuidAndNetworkId($group_uuid, $currentUser->network_id);
898
 
899
            if (!$group) {
900
                return new JsonModel([
901
                    'success' => false,
902
                    'data' => 'ERROR_GROUP_NOT_FOUND'
903
                ]);
904
            }
905
 
906
            if ($group->status != Group::STATUS_ACTIVE) {
907
                return new JsonModel([
908
                    'success' => false,
909
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
910
                ]);
911
            }
912
 
913
            if ($currentUser->id != $group->user_id) {
914
                return new JsonModel([
915
                    'success' => false,
916
                    'data' => 'ERROR_GROUP_IS_NOT_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
917
                ]);
918
            }
919
 
920
            $userMapper = UserMapper::getInstance($this->adapter);
921
            $user = $userMapper->fetchOneByUuidAndNetworkId($user_uuid, $currentUser->network_id);
922
 
923
            if (!$user) {
924
                return new JsonModel([
925
                    'success' => false,
926
                    'data' => 'ERROR_USER_NOT_FOUND'
927
                ]);
928
            }
929
 
930
            if ($user->id == $currentUser->id) {
931
                return new JsonModel([
932
                    'success' => false,
933
                    'data' => 'ERROR_GROUP_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
934
                ]);
935
            }
936
 
937
 
938
 
939
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
940
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $user->id);
941
            if ($groupMember) {
942
 
943
                if (
944
                    $groupMember->status == GroupMember::STATUS_ACCEPTED ||
945
                    $groupMember->status == GroupMember::STATUS_ADDED_BY_ADMIN ||
946
                    $groupMember->status == GroupMember::STATUS_AUTO_JOIN
947
                ) {
948
 
949
                    $groupMember->status = GroupMember::STATUS_CANCELLED;
950
                    if ($groupMemberMapper->update($groupMember)) {
951
 
952
                        return new JsonModel([
953
                            'success' => true,
954
                            'data' =>  'LABEL_GROUP_MEMBER_CANCELLED_SUCCESS'
955
                        ]);
956
                    } else {
957
                        return new JsonModel([
958
                            'success' => true,
959
                            'data' =>    'LABEL_GROUP_MEMBER_CANCELLED_FAILED'
960
                        ]);
961
                    }
962
                }
963
            }
964
 
965
 
966
            return new JsonModel([
967
                'success' => false,
968
                'data' => 'ERROR_GROUP_REQUEST_OR_MEMBER_NOT_FOUND_TO_CANCEL'
969
            ]);
970
        } else {
971
 
972
            return new JsonModel([
973
                'success' => false,
974
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
975
            ]);
976
        }
977
    }
978
 
979
    public function  groupMemberRejectAction()
980
    {
981
        $currentUserPlugin = $this->plugin('currentUserPlugin');
982
        $currentUser = $currentUserPlugin->getUser();
983
 
984
        $request = $this->getRequest();
985
        if ($request->isPost()) {
986
            $group_uuid = $this->params()->fromRoute('group_id');
987
            $user_uuid  = $this->params()->fromRoute('user_id');
988
 
989
            $groupMapper = GroupMapper::getInstance($this->adapter);
990
            $group = $groupMapper->fetchOneByUuidAndNetworkId($group_uuid, $currentUser->network_id);
991
 
992
            if (!$group) {
993
                return new JsonModel([
994
                    'success' => false,
995
                    'data' => 'ERROR_GROUP_NOT_FOUND'
996
                ]);
997
            }
998
 
999
            if ($group->status != Group::STATUS_ACTIVE) {
1000
                return new JsonModel([
1001
                    'success' => false,
1002
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
1003
                ]);
1004
            }
1005
 
1006
            if ($currentUser->id != $group->user_id) {
1007
                return new JsonModel([
1008
                    'success' => false,
1009
                    'data' => 'ERROR_GROUP_IS_NOT_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
1010
                ]);
1011
            }
1012
 
1013
            $userMapper = UserMapper::getInstance($this->adapter);
1014
            $user = $userMapper->fetchOneByUuidAndNetworkId($user_uuid, $currentUser->network_id);
1015
 
1016
            if (!$user) {
1017
                return new JsonModel([
1018
                    'success' => false,
1019
                    'data' => 'ERROR_USER_NOT_FOUND'
1020
                ]);
1021
            }
1022
 
1023
            if ($user->id == $currentUser->id) {
1024
                return new JsonModel([
1025
                    'success' => false,
1026
                    'data' => 'ERROR_GROUP_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
1027
                ]);
1028
            }
1029
 
1030
 
1031
 
1032
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1033
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $user->id);
1034
            if ($groupMember) {
1035
 
1036
                if ($groupMember->status == GroupMember::STATUS_JOINING_REQUESTED) {
1037
 
1038
                    $groupMember->status = GroupMember::STATUS_REJECTED;
1039
                    if ($groupMemberMapper->update($groupMember)) {
1040
 
1041
                        return new JsonModel([
1042
                            'success' => true,
1043
                            'data' =>  'LABEL_GROUP_MEMBER_REJECTED_SUCCESS'
1044
                        ]);
1045
                    } else {
1046
                        return new JsonModel([
1047
                            'success' => true,
1048
                            'data' =>    'LABEL_GROUP_MEMBER_REJECTED_FAILED'
1049
                        ]);
1050
                    }
1051
                }
1052
            }
1053
 
1054
 
1055
            return new JsonModel([
1056
                'success' => false,
1057
                'data' => 'ERROR_GROUP_THERE_IS_NO_PENDING_REQUEST_TO_REJECT'
1058
            ]);
1059
        } else {
1060
 
1061
            return new JsonModel([
1062
                'success' => false,
1063
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1064
            ]);
1065
        }
1066
    }
1067
 
1068
    public function  groupMemberApproveAction()
1069
    {
1070
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1071
        $currentUser = $currentUserPlugin->getUser();
1072
 
1073
        $request = $this->getRequest();
1074
        if ($request->isPost()) {
1075
            $group_uuid = $this->params()->fromRoute('group_id');
1076
            $user_uuid  = $this->params()->fromRoute('user_id');
1077
 
1078
            $groupMapper = GroupMapper::getInstance($this->adapter);
1079
            $group = $groupMapper->fetchOneByUuidAndNetworkId($group_uuid, $currentUser->network_id);
1080
 
1081
            if (!$group) {
1082
                return new JsonModel([
1083
                    'success' => false,
1084
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1085
                ]);
1086
            }
1087
 
1088
            if ($group->status != Group::STATUS_ACTIVE) {
1089
                return new JsonModel([
1090
                    'success' => false,
1091
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
1092
                ]);
1093
            }
1094
 
1095
            if ($currentUser->id != $group->user_id) {
1096
                return new JsonModel([
1097
                    'success' => false,
1098
                    'data' => 'ERROR_GROUP_IS_NOT_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
1099
                ]);
1100
            }
1101
 
1102
            $userMapper = UserMapper::getInstance($this->adapter);
1103
            $user = $userMapper->fetchOneByUuidAndNetworkId($user_uuid, $currentUser->network_id);
1104
 
1105
            if (!$user) {
1106
                return new JsonModel([
1107
                    'success' => false,
1108
                    'data' => 'ERROR_USER_NOT_FOUND'
1109
                ]);
1110
            }
1111
 
1112
            if ($user->id == $currentUser->id) {
1113
                return new JsonModel([
1114
                    'success' => false,
1115
                    'data' => 'ERROR_GROUP_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
1116
                ]);
1117
            }
1118
 
1119
 
1120
 
1121
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1122
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $user->id);
1123
            if ($groupMember) {
1124
 
1125
                if ($groupMember->status == GroupMember::STATUS_JOINING_REQUESTED) {
1126
 
1127
                    $groupMember->status = GroupMember::STATUS_ACCEPTED;
1128
                    if ($groupMemberMapper->update($groupMember)) {
1129
 
1130
 
1131
                        $notification = new Notification();
1132
                        $notification->type     = Notification::TYPE_ACCEPT_MY_REQUEST_JOIN_GROUP;
1133
                        $notification->read     = Notification::NO;
1134
                        $notification->user_id  = $user->id;
1135
                        $notification->group_id = $group->id;
1136
                        $notification->message  = 'LABEL_NOTIFICATION_ACCEPT_MY_REQUEST_JOIN_GROUP';
1137
                        $notification->url      = $this->url()->fromRoute('group/view', ['id' => $group->uuid]);
1138
 
1139
                        $notificationMapper = NotificationMapper::getInstance($this->adapter);
1140
                        $notificationMapper->insert($notification);
1141
 
1142
                        $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
1143
                        $userNotification = $userNotificationMapper->fetchOne($user->id);
1144
 
1145
                        if ($userNotification && $userNotification->receive_invitation_group) {
1146
                            $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
1147
                            $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_ACCEPT_MY_REQUEST_JOIN_GROUP, $currentUser->network_id);
1148
 
1149
                            if ($emailTemplate) {
1150
                                $arrayCont = [
1151
                                    'firstname'             => $currentUser->first_name,
1152
                                    'lastname'              => $currentUser->last_name,
1153
                                    'other_user_firstname'  => $user->first_name,
1154
                                    'other_user_lastname'   => $user->last_name,
1155
                                    'company_name'          => '',
1156
                                    'group_name'            => $group->name,
1157
                                    'content'               => '',
1158
                                    'code'                  => '',
1159
                                    'link'                  => $this->url()->fromRoute('group/view', ['id' => $group->uuid], ['force_canonical' => true])
1160
                                ];
1161
 
1162
                                $email = new QueueEmail($this->adapter);
1163
                                $email->processEmailTemplate($emailTemplate, $arrayCont, $user->email, trim($user->first_name . ' ' . $user->last_name));
1164
                            }
1165
                        }
1166
 
1167
                        return new JsonModel([
1168
                            'success' => true,
1169
                            'data' =>  'LABEL_GROUP_MEMBER_APPROVED_SUCCESS'
1170
                        ]);
1171
                    } else {
1172
                        return new JsonModel([
1173
                            'success' => true,
1174
                            'data' =>    'LABEL_GROUP_MEMBER_APPROVED_FAILED'
1175
                        ]);
1176
                    }
1177
                }
1178
            }
1179
 
1180
 
1181
            return new JsonModel([
1182
                'success' => false,
1183
                'data' => 'ERROR_GROUP_THERE_IS_NO_PENDING_REQUEST_TO_APPROVED'
1184
            ]);
1185
        } else {
1186
 
1187
            return new JsonModel([
1188
                'success' => false,
1189
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1190
            ]);
1191
        }
1192
    }
1193
 
1194
 
1195
    /**
1196
     * Recuperamos los grupos sugeridos
1197
     * tiene que enviarse un petición GET a la siguiente url: /helpers/groups-suggestion/:group_id
1198
     * retorna un json en caso de ser  positivo
1199
     * [
1200
     *  'success' : true,
1201
     *  'data' : [
1202
     *      [
1203
     *        'id'      => 'id del grupo encriptado',
1204
     *        'name'    => 'nombre del grupo',
1205
     *        'image'   => 'imagen del grupo',
1206
     *        'profile' => 'url del profile',
1207
     *     ]
1208
     * ]
1209
     * En caso de ser negativo
1210
     * [
1211
     *  'success' : false,
1212
     *  'data' : mensaje de error
1213
     * ]
1214
     * @return \Laminas\View\Model\JsonModel
1215
     */
1216
    public function groupsSuggestionAction()
1217
    {
1218
 
1219
        $request = $this->getRequest();
1220
        if ($request->isGet()) {
1221
 
1222
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1223
            $currentUser = $currentUserPlugin->getUser();
1224
 
1225
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1226
            $first_degree_connections_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1227
            $first_degree_connections_ids = $first_degree_connections_ids ? $first_degree_connections_ids : [0];
1228
 
1229
            $second_degree_connections_ids = $connectionMapper->fetchAllSecondDegreeConnectionsForUserIdReturnIds($currentUser->id);
1230
            $second_degree_connections_ids = $second_degree_connections_ids ? $second_degree_connections_ids : [0];
1231
 
1232
            /*Usuarios de la empresas donde trabajo o soy dueño */
1233
            $company_user_ids = [];
1234
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1235
 
1236
            $records = $companyUserMapper->fetchAllByUserId($currentUser->id);
1237
            foreach ($records as $record) {
1238
 
1239
                if ($record->status != CompanyUser::STATUS_ACCEPTED) {
1240
                    continue;
1241
                }
1242
 
1243
                $otherUsers = $companyUserMapper->fetchAllByCompanyId($record->company_id);
1244
                foreach ($otherUsers as $otherUser) {
1245
                    if ($currentUser->id != $otherUser->user_id && $otherUser->creator == CompanyUser::CREATOR_NO && $otherUser->status == CompanyUser::STATUS_ACCEPTED) {
1246
 
1247
                        if (!in_array($otherUser->user_id, $company_user_ids)) {
1248
                            array_push($company_user_ids, $otherUser->user_id);
1249
                        }
1250
                    }
1251
                }
1252
            }
1253
            $company_user_ids =  $company_user_ids ? $company_user_ids : [0];
1254
 
1255
            /* Usuario de los grupos donde soy dueño o participo */
1256
 
1257
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1258
 
1259
            $group_member_ids = [];
1260
 
1261
            $records = $groupMemberMapper->fetchAllByUserId($currentUser->id);
1262
            foreach ($records as $record) {
1263
                if ($record->status != GroupMember::STATUS_ACCEPTED) {
1264
                    continue;
1265
                }
1266
 
1267
                $otherUsers = $groupMemberMapper->fetchAllByGroupId($record->group_id);
1268
                foreach ($otherUsers as $otherUser) {
1269
                    if ($currentUser->id != $otherUser->user_id && $otherUser->status == GroupMember::STATUS_ACCEPTED) {
1270
 
1271
                        if (!in_array($otherUser->user_id, $group_member_ids)) {
1272
                            array_push($group_member_ids, $otherUser->user_id);
1273
                        }
1274
                    }
1275
                }
1276
            }
1277
 
1278
            $group_member_ids = $group_member_ids ? $group_member_ids : [0];
1279
 
1280
            /* Usuarios con que comparto capsulas */
1281
            $capsule_user_ids = [];
1282
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1283
 
1284
            $company_ids = [];
1285
            $records = $capsuleUserMapper->fetchAllActiveByUserId($currentUser->id);
1286
            foreach ($records as $record) {
1287
                if (!in_array($record->company_id, $company_ids)) {
1288
                    array_push($company_ids, $record->company_id);
1289
                }
1290
            }
1291
 
1292
            foreach ($company_ids as $company_id) {
1293
                $otherUsers = $capsuleUserMapper->fetchAllUserIdsForCapsulesActiveByCompanyId($company_id);
1294
                foreach ($otherUsers as $user_id) {
1295
                    if ($currentUser->id != $user_id) {
1296
 
1297
                        if (!in_array($user_id, $capsule_user_ids)) {
1298
                            array_push($capsule_user_ids, $user_id);
1299
                        }
1300
                    }
1301
                }
1302
            }
1303
 
1304
            $capsule_user_ids = $capsule_user_ids ? $capsule_user_ids : [0];
1305
 
1306
 
1307
            $other_users = array_unique(array_merge(
1308
 
1309
                $second_degree_connections_ids,
1310
                $company_user_ids,
1311
                $group_member_ids,
1312
                $capsule_user_ids
1313
            ));
1314
 
1315
            $queryMapper = QueryMapper::getInstance($this->adapter);
1316
 
1317
 
1318
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1319
            $group_ids = $groupMemberMapper->fetchAllGroupIdsByUserIds($other_users);
1320
            $group_ids = $group_ids ? $group_ids : [0];
1321
 
1322
 
1323
 
1324
 
1325
            $select = $queryMapper->getSql()->select();
1326
            $select->columns(['id', 'uuid', 'name', 'image', 'status', 'privacy', 'priority' => new Expression('0')]);
1327
            $select->from(['g' => GroupMapper::_TABLE]);
1328
            $select->where->equalTo('network_id', $currentUser->network_id);
1329
            $select->where->equalTo('privacy', Group::PRIVACY_IS_PUBLIC);
1330
            $select->where->equalTo('status', Group::STATUS_ACTIVE);
1331
            $select->where->in('g.id', $group_ids);
1332
            $select->where->notEqualTo('g.user_id', $currentUser->id);
1333
            $select->order('name ASC');
1334
 
1335
 
1336
 
1337
            //echo $select->getSqlString($this->adapter->platform); exit;
1338
 
1339
            $records = $queryMapper->fetchAll($select);
1340
            usort($records, function ($a, $b) {
1341
                if ($a['priority'] == $b['priority']) {
1342
                    return 0;
1343
                } else {
1344
                    return $a['priority'] < $b['priority'] ? 1 : -1;
1345
                }
1346
            });
1347
 
1348
 
1349
            $items = [];
1350
 
1351
            foreach ($records as $record) {
1352
 
1353
                array_push($items, [
1354
                    'id'        => $record['uuid'],
1355
                    'name'      => trim($record['name']),
60 efrain 1356
                    'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'group', 'filename' => $record['image']],['force_canonical' => true],['force_canonical' => true]),
1 efrain 1357
                    'profile'   => $this->url()->fromRoute('group/view', ['id' => $record['uuid']]),
1358
                    'priority'  => $record['priority'],
1359
 
1360
                ]);
1361
            }
1362
 
1363
            return new JsonModel([
1364
                'success' => true,
1365
                'data' => $items
1366
            ]);
1367
        } else {
1368
            return new JsonModel([
1369
                'success' => false,
1370
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1371
            ]);
1372
        }
1373
    }
1374
 
1375
    public function postsAction()
1376
    {
1377
        $request = $this->getRequest();
1378
        if ($request->isGet()) {
1379
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1380
            $currentUser = $currentUserPlugin->getUser();
1381
 
1382
            $items = [];
1383
            $postMapper = PostMapper::getInstance($this->adapter);
1384
            $posts = $postMapper->fetchAllActiveByNetworkId($currentUser->network_id);
1385
 
1386
            //print_r($posts);
1387
 
1388
            foreach ($posts as $post) {
1389
                $dt = \DateTime::createFromFormat('Y-m-d', $post->date);
1390
                array_push($items, [
60 efrain 1391
                    'image' => $this->url()->fromRoute('storage', ['code' => $post->uuid, 'type' => 'post', 'filename' => $post->image],['force_canonical' => true]),
1 efrain 1392
                    'date' => $dt->format('d/m/Y'),
1393
                    'title' => $post->title,
1394
                    'link' => $this->url()->fromRoute('post', ['id' => $post->uuid]),
1395
                ]);
1396
            }
1397
 
1398
            return new JsonModel([
1399
                'success' => true,
1400
                'data' => $items
1401
            ]);
1402
        }
1403
 
1404
        return new JsonModel([
1405
            'success' => false,
1406
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1407
        ]);
1408
    }
1409
 
1410
 
1411
 
1412
    public function searchPeopleAction()
1413
    {
1414
        $request = $this->getRequest();
1415
        if ($request->isGet()) {
1416
 
1417
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1418
            $currentUser = $currentUserPlugin->getUser();
1419
 
1420
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
1421
            if (strlen($search) >= 3) {
1422
 
1423
 
1424
                $userMapper = UserMapper::getInstance($this->adapter);
1425
                $records  = $userMapper->fetchAllSuggestByNetworkIdAndSearch($currentUser->network_id, $search);
1426
 
1427
                $users = [];
1428
                foreach ($records as $record) {
1429
                    if ($currentUser->id == $record->id) {
1430
                        continue;
1431
                    }
1432
 
1433
 
1434
                    array_push($users, [
1435
                        'value' => $record->uuid,
1436
                        'text' => trim($record->first_name . ' ' . $record->last_name) . ' (' . $record->email . ')'
1437
 
1438
                    ]);
1439
                }
1440
 
1441
                return new JsonModel([
1442
                    'success' => true,
1443
                    'data' => $users
1444
                ]);
1445
            } else {
1446
                return new JsonModel([
1447
                    'success' => true,
1448
                    'data' => []
1449
                ]);
1450
            }
1451
        } else {
1452
            return new JsonModel([
1453
                'success' => false,
1454
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1455
            ]);
1456
        }
1457
    }
1458
 
1459
    public function footerAction()
1460
    {
1461
        $request = $this->getRequest();
1462
        if ($request->isGet()) {
1463
 
1464
 
1465
            $links = isset($this->navigation['footer']) ?  $this->navigation['footer'] : [];
1466
 
1467
 
1468
            $data = [];
1469
            foreach ($links as $link) {
1470
                $data[$link['route']] = $link['label'];
1471
            }
1472
 
1473
 
1474
            return new JsonModel([
1475
                'success' => true,
1476
                'data' => $data,
1477
            ]);
1478
        } else {
1479
            return new JsonModel([
1480
                'success' => false,
1481
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1482
            ]);
1483
        }
1484
    }
1485
 
1486
 
1487
    /**
1488
     * Recuperamos los grupos sugeridos
1489
     * tiene que enviarse un petición GET a la siguiente url: /helpers/groups-suggestion/:group_id
1490
     * retorna un json en caso de ser  positivo
1491
     * [
1492
     *  'success' : true,
1493
     *  'data' : [
1494
     *      [
1495
     *        'id'      => 'id del grupo encriptado',
1496
     *        'name'    => 'nombre del grupo',
1497
     *        'image'   => 'imagen del grupo',
1498
     *        'profile' => 'url del profile',
1499
     *     ]
1500
     * ]
1501
     * En caso de ser negativo
1502
     * [
1503
     *  'success' : false,
1504
     *  'data' : mensaje de error
1505
     * ]
1506
     * @return \Laminas\View\Model\JsonModel
1507
     */
1508
    public function myGroupsAction()
1509
    {
1510
 
1511
        $request = $this->getRequest();
1512
        if ($request->isGet()) {
1513
 
1514
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1515
            $currentUser = $currentUserPlugin->getUser();
1516
 
1517
 
1518
            $queryMapper = QueryMapper::getInstance($this->adapter);
1519
            $select = $queryMapper->getSql()->select();
1520
            $select->columns(['id', 'uuid', 'name', 'image', 'status', 'privacy', 'priority' => new Expression('0')]);
1521
            $select->from(['g' => GroupMapper::_TABLE]);
1522
            $select->where->equalTo('status', Group::STATUS_ACTIVE);
1523
            $select->where->equalTo('g.user_id', $currentUser->id);
1524
            $select->order('name ASC');
1525
 
1526
 
1527
            $items = [];
1528
 
1529
            $records = $queryMapper->fetchAll($select);
1530
            foreach ($records as $record) {
1531
 
1532
                array_push($items, [
1533
                    'id'        => $record['uuid'],
1534
                    'name'      => trim($record['name']),
60 efrain 1535
                    'image'     => $this->url()->fromRoute('storage', ['code' => $record['uuid'], 'type' => 'group', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 1536
                    'profile'   => $this->url()->fromRoute('group/view', ['id' => $record['uuid']]),
1537
                    'priority'  => $record['priority'],
1538
 
1539
                ]);
1540
            }
1541
 
1542
            return new JsonModel([
1543
                'success' => true,
1544
                'data' => $items
1545
            ]);
1546
        } else {
1547
            return new JsonModel([
1548
                'success' => false,
1549
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1550
            ]);
1551
        }
1552
    }
1553
 
1554
    public function nextEventsAction()
1555
    {
1556
        $request = $this->getRequest();
1557
        if ($request->isGet()) {
1558
 
1559
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1560
            $currentUser = $currentUserPlugin->getUser();
1561
 
1562
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1563
            $currentNetwork = $currentNetworkPlugin->getNetwork();
1564
 
1565
 
1566
 
1567
            $dt = new \DateTime();
1568
            $dt->setTime(0, 0, 0);
1569
            $start = $dt->format('Y-m-d H:i:s');
1570
 
1571
            $dt->add(new \DateInterval('P30D'));
1572
            $dt->setTime(23, 59, 59);
1573
            $end = $dt->format('Y-m-d H:i:s');
1574
 
1575
 
1576
 
1577
 
1578
            $events = [];
1579
 
1580
 
1581
 
1582
            //3 días
1583
            $expirePeriod = 86400 * 3;
1584
            $t1 = time();
1585
 
1586
            $companies = [];
1587
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1588
 
1589
            $companyUsers = [];
1590
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1591
            $records = $companyUserMapper->fetchAllByUserId($currentUser->id);
1592
 
1593
            foreach ($records as $record) {
1594
                $companyUsers[$record->company_id] = $record->backend == CompanyUser::BACKEND_YES;
1595
            }
1596
 
1597
 
1598
 
1599
            $zoomMeetingMapper = ZoomMeetingMapper::getInstance($this->adapter);
1600
            $recruitmentSelectionCandidateMapper = RecruitmentSelectionCandidateMapper::getInstance($this->adapter);
1601
            $recruitmentSelectionVacancyMapper = RecruitmentSelectionVacancyMapper::getInstance($this->adapter);
1602
            $recruitmentSelectionInterviewMapper = RecruitmentSelectionInterviewMapper::getInstance($this->adapter);
1603
            $performanceEvaluationTestMapper = PerformanceEvaluationTestMapper::getInstance($this->adapter);
1604
            $performanceEvaluationFormMapper = PerformanceEvaluationFormMapper::getInstance($this->adapter);
1605
            $jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);
1606
            $userMapper = UserMapper::getInstance($this->adapter);
1607
 
1608
            $calendarEventMapper = CalendarEventMapper::getInstance($this->adapter);
1609
            $records = $calendarEventMapper->fetchAllByUserIdAndStartTimeAndEndTime($currentUser->id, $start, $end);
1610
            foreach ($records as $record) {
1611
                switch ($record->type) {
1612
 
1613
                    case CalendarEvent::TYPE_SURVEY_NORMAL:
1614
                        $backgroundColor = $currentNetwork->css_calendar_survey_bg_color;
1615
                        $textColor = $currentNetwork->css_calendar_survey_text_color;
1616
 
1617
                        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
1618
                        $surveyTest = $surveyTestMapper->fetchOne($record->relational_id);
1619
 
1620
                        if($surveyTest && $surveyTest->user_id == $currentUser->id) {
1621
 
1622
                            $surveyCampaingMapper = SurveyCampaignMapper::getInstance($this->adapter);
1623
                            $surveyCampaing = $surveyCampaingMapper->fetchOne($surveyTest->campaign_id);
1624
 
1625
                            $url = '';
1626
                            $hasLink = !empty($companyUsers[$surveyTest->company_id]);
1627
 
1628
                            if ($hasLink) {
1629
 
1630
                                if (!isset($companies[$surveyTest->company_id])) {
1631
                                    $company  = $companyMapper->fetchOne($surveyTest->company_id);
1632
 
1633
                                    $companies[$company->id]  = $company;
1634
                                } else {
1635
                                    $company = $companies[$surveyTest->company_id];
1636
                                }
1637
 
1638
 
1639
                                $url = $this->url()->fromRoute('backend/signin-company', [
1640
                                    'id' => $company->uuid,
1641
                                    'relational' => $surveyTest->uuid,
1642
                                    'type' => CalendarEvent::TYPE_SURVEY_ORGANIZATIONAL_CLIMATE,
136 efrain 1643
                                ], ['force_canonical' => true]);
1 efrain 1644
                            }
1645
 
1646
                            $dtStart = \DateTime::createFromFormat('Y-m-d', $surveyCampaing->end_date);
1647
 
1648
 
1649
                            array_push($events, [
1650
                                'id'                => $surveyTest->uuid,
1651
                                'title'             => $surveyCampaing->name,
146 efrain 1652
                                'start'             => $dtStart->format('Y-m-d'),
1 efrain 1653
                                'url'               => $url,
1654
                                'backgroundColor'   => $backgroundColor,
1655
                                'textColor'         => $textColor,
1656
                                'allDay'            => true,
1657
                                'type'              => 'task',
135 efrain 1658
                                'source'            => 'internal',
1 efrain 1659
                            ]);
1660
                        }
1661
 
1662
                        break;
1663
 
1664
                    case CalendarEvent::TYPE_SURVEY_ORGANIZATIONAL_CLIMATE:
1665
                        $backgroundColor = $currentNetwork->css_calendar_organizational_climate_bg_color;
1666
                        $textColor = $currentNetwork->css_calendar_organizational_climate_text_color;
1667
 
1668
                        $surveyTestMapper = SurveyTestMapper::getInstance($this->adapter);
1669
                        $surveyTest = $surveyTestMapper->fetchOne($record->relational_id);
1670
 
1671
                        if($surveyTest && $surveyTest->user_id == $currentUser->id) {
1672
 
1673
                            $surveyCampaingMapper = SurveyCampaignMapper::getInstance($this->adapter);
1674
                            $surveyCampaing = $surveyCampaingMapper->fetchOne($surveyTest->campaign_id);
1675
 
1676
                            $url = '';
1677
                            $hasLink = !empty($companyUsers[$surveyTest->company_id]);
1678
 
1679
                            if ($hasLink) {
1680
 
1681
                                if (!isset($companies[$surveyTest->company_id])) {
1682
                                    $company  = $companyMapper->fetchOne($surveyTest->company_id);
1683
 
1684
                                    $companies[$company->id]  = $company;
1685
                                } else {
1686
                                    $company = $companies[$surveyTest->company_id];
1687
                                }
1688
 
1689
 
1690
                                $url = $this->url()->fromRoute('backend/signin-company', [
1691
                                    'id' => $company->uuid,
1692
                                    'relational' => $surveyTest->uuid,
1693
                                    'type' => CalendarEvent::TYPE_SURVEY_ORGANIZATIONAL_CLIMATE,
136 efrain 1694
                                ], ['force_canonical' => true]);
1 efrain 1695
                            }
1696
 
1697
                            $dtStart = \DateTime::createFromFormat('Y-m-d', $surveyCampaing->end_date);
1698
 
1699
 
1700
                            array_push($events, [
1701
                                'id'                => $surveyTest->uuid,
1702
                                'title'             => $surveyCampaing->name,
146 efrain 1703
                                'start'             => $dtStart->format('Y-m-d'),
1 efrain 1704
                                'url'               => $url,
1705
                                'backgroundColor'   => $backgroundColor,
1706
                                'textColor'         => $textColor,
1707
                                'allDay'            => true,
1708
                                'type'              => 'task',
135 efrain 1709
                                'source'            => 'internal',
1 efrain 1710
                            ]);
1711
                        }
1712
 
1713
                        break;
1714
 
1715
 
1716
 
1717
 
1718
 
1719
 
1720
 
1721
 
1722
 
1723
 
1724
                    case CalendarEvent::TYPE_RECRUITMENT_SELECTION_INTERVIEW:
1725
                        $backgroundColor = $currentNetwork->css_calendar_recruitment_and_selection_bg_color;
1726
                        $textColor = $currentNetwork->css_calendar_recruitment_and_selection_text_color;
1727
 
1728
 
1729
                        $recruitmentSelectionInterview = $recruitmentSelectionInterviewMapper->fetchOne($record->relational_id);
1730
                        if ($recruitmentSelectionInterview) {
1731
                            $recruitmentSelectionVacancy = $recruitmentSelectionVacancyMapper->fetchOne($recruitmentSelectionInterview->vacancy_id);
1732
 
1733
                            $recruitmentSelectionCandidate = $recruitmentSelectionCandidateMapper->fetchOne($recruitmentSelectionInterview->candidate_id);
1734
                            if ($recruitmentSelectionVacancy && $recruitmentSelectionCandidate) {
1735
                                $jobDescription = $jobDescriptionMapper->fetchOne($recruitmentSelectionVacancy->job_description_id);
1736
                                if ($jobDescription) {
1737
                                    $url = '';
1738
                                    $hasLink = !empty($companyUsers[$recruitmentSelectionInterview->company_id]);
1739
 
1740
                                    if ($hasLink) {
1741
 
1742
                                        if (!isset($companies[$recruitmentSelectionInterview->company_id])) {
1743
                                            $company  = $companyMapper->fetchOne($recruitmentSelectionInterview->company_id);
1744
 
1745
                                            $companies[$company->id]  = $company;
1746
                                        } else {
1747
                                            $company = $companies[$recruitmentSelectionInterview->company_id];
1748
                                        }
1749
 
1750
 
1751
                                        $url = $this->url()->fromRoute('backend/signin-company', [
1752
                                            'id' => $company->uuid,
1753
                                            'relational' => $recruitmentSelectionInterview->uuid,
1754
                                            'type' => CalendarEvent::TYPE_RECRUITMENT_SELECTION_INTERVIEW
136 efrain 1755
                                        ], ['force_canonical' => true]);
1 efrain 1756
                                    }
1757
 
1758
                                    $dtStart = \DateTime::createFromFormat('Y-m-d', $recruitmentSelectionInterview->last_date);
1759
 
1760
 
1761
 
1762
 
1763
                                    array_push($events, [
1764
                                        'id'                => $recruitmentSelectionInterview->uuid,
1765
                                        'title'             => $recruitmentSelectionVacancy->name,
146 efrain 1766
                                        'start'             => $dtStart->format('Y-m-d'),
1 efrain 1767
                                        'url'               => $url,
1768
                                        'backgroundColor'   => $backgroundColor,
1769
                                        'textColor'         => $textColor,
1770
                                        'allDay'            => true,
1771
                                        'type'              => 'task',
135 efrain 1772
                                        'source'            => 'internal',
1 efrain 1773
                                    ]);
1774
                                }
1775
                            }
1776
                        }
1777
 
1778
 
1779
                        break;
1780
 
1781
                    case CalendarEvent::TYPE_PERFORMANCE_EVALUATION:
1782
 
1783
 
1784
                        $backgroundColor = $currentNetwork->css_calendar_performance_evaluation_bg_color;
1785
                        $textColor = $currentNetwork->css_calendar_performance_evaluation_text_color;
1786
 
1787
 
1788
                        $performanceEvaluationTest = $performanceEvaluationTestMapper->fetchOne($record->relational_id);
1789
                        if ($performanceEvaluationTest) {
1790
 
1791
                            $performanceEvaluationForm = $performanceEvaluationFormMapper->fetchOne($performanceEvaluationTest->form_id);
1792
                            if ($performanceEvaluationForm) {
1793
                                $jobDescription = $jobDescriptionMapper->fetchOne($performanceEvaluationForm->job_description_id);
1794
                                if ($jobDescription) {
1795
                                    $url = '';
1796
                                    $hasLink = !empty($companyUsers[$performanceEvaluationTest->company_id]);
1797
 
1798
                                    if ($performanceEvaluationTest->supervisor_id) {
1799
                                        $supervisor = $userMapper->fetchOne($performanceEvaluationTest->supervisor_id);
1800
                                    } else {
1801
                                        $supervisor = '';
1802
                                    }
1803
 
1804
                                    if ($performanceEvaluationTest->employee_id) {
1805
                                        $employee = $userMapper->fetchOne($performanceEvaluationTest->employee_id);
1806
                                    } else {
1807
                                        $employee = '';
1808
                                    }
1809
 
1810
 
1811
 
1812
                                    if ($hasLink) {
1813
 
1814
                                        if (!isset($companies[$performanceEvaluationTest->company_id])) {
1815
                                            $company  = $companyMapper->fetchOne($performanceEvaluationTest->company_id);
1816
 
1817
                                            $companies[$company->id]  = $company;
1818
                                        } else {
1819
                                            $company = $companies[$performanceEvaluationTest->company_id];
1820
                                        }
1821
 
1822
 
1823
                                        $url = $this->url()->fromRoute('backend/signin-company', [
1824
                                            'id' => $company->uuid,
1825
                                            'relational' => $performanceEvaluationTest->uuid,
1826
                                            'type' => CalendarEvent::TYPE_PERFORMANCE_EVALUATION
136 efrain 1827
                                        ], ['force_canonical' => true]);
1 efrain 1828
                                    }
1829
 
1830
                                    $dtStart = \DateTime::createFromFormat('Y-m-d', $performanceEvaluationTest->last_date);
1831
 
1832
                                    array_push($events, [
1833
                                        'id'                => $performanceEvaluationTest->uuid,
1834
                                        'title'             =>  $performanceEvaluationForm->name,
146 efrain 1835
                                        'start'             => $dtStart->format('Y-m-d'),
1 efrain 1836
                                        'url'               => $url,
1837
                                        'backgroundColor'   => $backgroundColor,
1838
                                        'textColor'         => $textColor,
1839
                                        'allDay'            => true,
1840
                                        'type'              => 'task',
135 efrain 1841
                                        'source'            => 'internal',
1 efrain 1842
                                    ]);
1843
                                }
1844
                            }
1845
                        }
1846
 
1847
 
1848
 
1849
 
1850
 
1851
                        break;
1852
 
1853
 
1854
                    case CalendarEvent::TYPE_ZOOM:
1855
                        $zoomMeeting = $zoomMeetingMapper->fetchOne($record->relational_id);
1856
                        if ($zoomMeeting) {
1857
 
1858
                            $backgroundColor = $currentNetwork->css_calendar_zoom_bg_color;
1859
                            $textColor = $currentNetwork->css_calendar_zoom_text_color;
1860
 
1861
                            $dtStart = \DateTime::createFromFormat('Y-m-d H:i:s', $zoomMeeting->start_time);
1862
                            $t2 = $dtStart->getTimestamp();
1863
 
1864
                            if ($t2 > $t1) {
1865
 
1866
                                $t3 = $t1 + $expirePeriod;
1867
                                if ($t3 > $t2) {
1868
                                    $backgroundColor = $currentNetwork->css_calendar_expire_bg_color;
1869
                                    $textColor = $currentNetwork->css_calendar_expire_text_color;
1870
                                }
1871
                            }
1872
 
1873
 
1874
 
1875
                            if ($currentUser->timezone && $currentUser->timezone != $zoomMeeting->timezone) {
1876
 
1877
                                $start =  str_replace(' ', 'T', Functions::convertDateTimeBetweenTimeZones($zoomMeeting->start_time, $zoomMeeting->timezone, $currentUser->timezone));
1878
                                $end =  str_replace(' ', 'T', Functions::convertDateTimeBetweenTimeZones($zoomMeeting->end_time, $zoomMeeting->timezone, $currentUser->timezone));
1879
                            } else {
1880
                                $start = str_replace(' ', 'T', $zoomMeeting->start_time);
1881
                                $end = str_replace(' ', 'T', $zoomMeeting->end_time);
1882
                            }
1883
 
1884
 
1885
 
1886
                            $url = $zoomMeeting->join_url;
1887
 
1888
 
1889
 
1890
 
1891
                            $agenda = $zoomMeeting->agenda . "<br>" .
1892
                                " LABEL_ZOOM_MEETING_START_DATE : " . $dtStart->format('Y-m-d') . "<br>" .
1893
                                " LABEL_ZOOM_MEETING_START_TIME : " . $dtStart->format('H:i a') . "<br>" .
1894
                                " LABEL_ZOOM_MEETING_TIMEZONE : " . $zoomMeeting->timezone . "<br>" .
1895
                                " LABEL_ZOOM_MEETING_TITLE :  " . $zoomMeeting->topic  . "<br>" .
1896
                                " LABEL_ZOOM_MEETING_URL : " . $zoomMeeting->join_url . "<br>" .
1897
                                " LABEL_ZOOM_MEETING_PASSWORD : " . $zoomMeeting->password . "<br>";
1898
 
1899
                            array_push($events, [
1900
                                'id'                => $zoomMeeting->id,
1901
                                'title'             => $zoomMeeting->topic,
1902
                                'agenda'            => $agenda,
1903
                                'start'             => $start,
1904
                                'end'               => $end,
1905
                                'url'               => $zoomMeeting->join_url,
1906
                                'backgroundColor'   => $backgroundColor,
1907
                                'textColor'         => $textColor,
135 efrain 1908
                                'type'              => 'event',
1909
                                'source'            => 'external',
1 efrain 1910
                            ]);
1911
                        }
1912
                        break;
1913
                }
1914
            }
1915
 
1916
 
1917
 
1918
            return new JsonModel([
1919
                'success' => true,
1920
                'data' => $events
1921
            ]);
1922
        } else {
1923
            return new JsonModel([
1924
                'success' => false,
1925
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1926
            ]);
1927
        }
1928
    }
1929
 
1930
    public function menuAction()
1931
    {
1932
 
1933
 
1934
        $request = $this->getRequest();
1935
 
1936
 
1937
 
1938
        if ($request->isGet()) {
1939
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1940
            $network =  $currentNetworkPlugin->getNetwork();
1941
 
1942
 
1943
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1944
            if($currentUserPlugin->hasIdentity()) {
1945
                $currentUser = $currentUserPlugin->getUser();
157 efrain 1946
 
1 efrain 1947
 
1948
 
1949
 
1950
 
1951
 
1952
 
1953
 
1954
 
1955
 
1956
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
1957
 
1958
                $link_admin         = $currentUser->usertype_id == UserType::ADMIN ? 1 : 0;
1959
                $link_impersonate   = $currentUser->is_super_user == User::IS_SUPER_USER_YES ? 1 : 0;
1960
                if($link_impersonate) {
1961
                    $url_impersonate = $this->url()->fromRoute('signin/impersonate');
1962
                } else {
1963
                    $url_impersonate = '';
1964
                }
1965
 
1966
                $fullname = trim($currentUser->first_name . ' ' . $currentUser->last_name);
1967
 
1968
                $profileVisitMapper = ProfileVisitMapper::getInstance($this->adapter);
1969
                $visits = $profileVisitMapper->getTotalByVisitedId($currentUser->id);
1970
 
1971
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1972
                $connections = $connectionMapper->fetchTotalConnectionByUser($currentUser->id);
1973
 
1974
 
1975
                if($currentUser->location_id) {
1976
                    $locationMapper = LocationMapper::getInstance($this->adapter);
1977
                    $location = $locationMapper->fetchOne($currentUser->location_id);
1978
 
1979
                    $country = $location->country;
1980
                } else {
1981
                    $country = '';
1982
                }
1983
 
1984
 
1985
 
1986
 
1987
                if($currentUser->usertype_id == UserType::ADMIN) {
1988
                    $url_admin = $this->url()->fromRoute( 'backend/signin-admin');
1989
                } else {
1990
                    $url_admin = '';
1991
                }
1992
 
1993
 
1994
 
1995
                $link_company = '';
1996
                if($network->default != Network::DEFAULT_YES) {
1997
                    $companyMapper = CompanyMapper::getInstance($this->adapter);
1998
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
1999
                    if($company) {
2000
                        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
2001
                        $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
2002
                        if($companyUser) {
2003
                            if($companyUser && $companyUser->status == CompanyUser::STATUS_ACCEPTED && $companyUser->backend == CompanyUser::BACKEND_YES ) {
2004
                                $link_company = ['route' => 'backend/signin-company', 'id' => $company->uuid ];
2005
                            }
2006
                        }
2007
                    }
157 efrain 2008
                } else {
2009
 
1 efrain 2010
                }
2011
 
2012
                if ($acl->isAllowed($currentUser->usertype_id,  'knowledge-area')) {
2013
                    $route_knowledge_area = $this->url()->fromRoute('knowledge-area');
2014
                    $link_knowledge_area = 1;
2015
                } else {
2016
 
2017
                    $route_knowledge_area = '';
2018
                    $link_knowledge_area = 0;
2019
                }
2020
 
2021
                if ($acl->isAllowed($currentUser->usertype_id,  'my-coach')) {
2022
                    $route_my_coach = $this->url()->fromRoute('my-coach');
2023
                    $link_my_coach = 1;
2024
                } else {
2025
 
2026
                    $route_my_coach = '';
2027
                    $link_my_coach = 0;
2028
                }
2029
 
2030
                if($network->default == Network::DEFAULT_YES) {
2031
                    if($network->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
2032
                        $pages = getAclMenuDefaultNetworkConnectionUser2User();
2033
                    } else {
2034
                        $pages = getAclMenuDefaultNetworkConnectionAll2All();
2035
                    }
2036
                } else {
2037
                    if($network->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
2038
 
2039
                        $pages = getAclMenuNonDefaulNetworkConnectionUser2User();
2040
 
2041
                    } else {
2042
                        $pages = getAclMenuNonDefaultNetworkConnectionAll2All();
2043
                    }
2044
                }
2045
 
2046
 
2047
                $menu = [];
2048
                foreach ($pages as $page) {
2049
 
2050
                    if (!$page || empty($page['route']) || !$acl->isAllowed($currentUser->usertype_id, $page['route'])) {
2051
                        continue;
2052
                    }
2053
 
2054
                    $ajax = false;
2055
                    if ($page['route'] == 'company' && $network->default == Network::DEFAULT_NO) {
2056
 
2057
                        if ($link_company) {
157 efrain 2058
                            $page['route'] = $this->url()->fromRoute($link_company['route'], ['id' => $link_company['id']]);
1 efrain 2059
                            $ajax = true;
2060
                        } else {
2061
                            continue;
2062
                        }
2063
                    }
2064
 
2065
                    $option = [
2066
                        'label' => $page['label'],
2067
                        'href' => $page['route'],
2068
                        'img' => empty($page['class']) ? '' : $page['class'],
2069
                        'ajax' => $ajax ? 1 : 0,
2070
                        'childs' => [],
2071
                    ];
2072
 
2073
                    $childs = empty($page['pages']) ? [] : $page['pages'];
2074
                    if ($childs) {
2075
                        foreach ($childs as $child) {
2076
                            if (!$acl->isAllowed($currentUser->usertype_id,  $child['route'])) {
2077
                                continue;
2078
                            }
2079
 
2080
                            $childs_level2 = [];
2081
 
2082
                            $childsLevel2 = empty($child['pages']) ? [] : $child['pages'];
2083
 
2084
                            if ($childsLevel2) {
2085
                                foreach ($childsLevel2 as $childLevel2) {
2086
                                    if (!$acl->isAllowed($currentUser->usertype_id,  $childLevel2['route'])) {
2087
                                        continue;
2088
                                    }
2089
 
2090
                                    array_push($childs_level2, [
2091
                                        'label' => $childLevel2['label'],
2092
                                        'href' => $childLevel2['route'],
2093
 
2094
                                    ]);
2095
                                }
2096
                            }
2097
 
2098
                            array_push($option['childs'], [
2099
                                'label' => $child['label'],
2100
                                'href' => $child['route'],
2101
                                'childs' => $childs_level2,
2102
                            ]);
2103
                        }
2104
                    }
2105
 
2106
                    array_push($menu, $option);
2107
                }
2108
 
2109
 
60 efrain 2110
                $image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $currentUser->uuid, 'filename' => $currentUser->image],['force_canonical' => true]);
1 efrain 2111
                $isChatPage = $this->getEvent()->getViewModel()->getVariable('is_chat');
2112
                $routeCheckSession = $this->url()->fromRoute('check-session');
2113
 
2114
 
2115
 
2116
                return new JsonModel([
2117
                    'menu'                  => $menu,
2118
                    'isChatPage'            => $isChatPage == 1,
2119
                    'routeCheckSession'     => $routeCheckSession,
2120
                    'linkAdmin'             => $link_admin == 1,
2121
                    'urlAdmin'              => $url_admin,
2122
                    'linkImpersonate'       => $link_impersonate ==1 ,
2123
                    'urlImpersonate'        => $url_impersonate,
2124
                    'image'                 => $image,
2125
                    'fullName'              => $fullname,
2126
                    'country'               => $country,
2127
                    'visits'                => $visits,
2128
                    'connections'           => $connections,
2129
                    'logoForNavbar'         => 'https://' . $network->main_hostname . '/storage-network/type/navbar',
2130
                    'defaultNetwork'        => $network->default,
2131
                    'linkKnowledgeArea'     => $link_knowledge_area == 1,
2132
                    'routeKnowledgeArea'    => $route_knowledge_area,
2133
                    'linkMyCoach'           => $link_my_coach == 1,
2134
                    'routeMyCoach'          => $route_my_coach,
2135
               ]);
2136
 
2137
 
2138
 
2139
            }
2140
 
2141
 
2142
            return new JsonModel([
2143
                'menu'                  => [],
2144
                'isChatPage'            => false,
2145
                'routeCheckSession'     => '',
2146
                'linkAdmin'             => false,
2147
                'urlAdmin'              => '',
2148
                'linkImpersonate'       => false,
2149
                'urlImpersonate'        => '',
2150
                'image'                 => '',
2151
                'fullName'              => '',
2152
                'country'               => 0,
2153
                'visits'                => 0,
2154
                'connections'           => 0,
2155
                'logoForNavbar'         => 'https://' . $network->main_hostname . '/storage-network/type/navbar',
2156
                'defaultNetwork'        => $network->default,
2157
                'linkKnowledgeArea'     => false,
2158
                'routeKnowledgeArea'    => '',
2159
                'linkMyCoach'           => false,
2160
                'routeMyCoach'          => '',
2161
            ]);
2162
 
2163
        } else {
2164
 
2165
            return new JsonModel([
2166
                'success' => false,
2167
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2168
            ]);
2169
        }
2170
 
2171
 
2172
        return new JsonModel([
2173
            'success' => false,
2174
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2175
        ]);
2176
    }
2177
 
2178
    public function companySizesAction()
2179
    {
2180
        $request = $this->getRequest();
2181
 
2182
 
2183
 
2184
        if ($request->isGet()) {
2185
            $items = [];
2186
 
2187
            $mapper = CompanySizeMapper::getInstance($this->adapter);
2188
            $records = $mapper->fetchAllActive();
2189
            foreach($records as $record)
2190
            {
2191
                 $items[ $record->uuid ] = $record->name;
2192
            }
2193
 
2194
            return new JsonModel([
2195
                'success' => true,
2196
                'data' => $items
2197
            ]);
2198
 
2199
 
2200
        }
2201
        return new JsonModel([
2202
            'success' => false,
2203
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2204
        ]);
2205
    }
2206
 
2207
    public function degreesAction()
2208
    {
2209
        $request = $this->getRequest();
2210
 
2211
 
2212
 
2213
        if ($request->isGet()) {
2214
            $items = [];
2215
 
2216
            $mapper = DegreeMapper::getInstance($this->adapter);
2217
            $records = $mapper->fetchAllActive();
2218
            foreach($records as $record)
2219
            {
2220
                $items[ $record->uuid ] = $record->name;
2221
            }
2222
 
2223
            return new JsonModel([
2224
                'success' => true,
2225
                'data' => $items
2226
            ]);
2227
 
2228
 
2229
        }
2230
        return new JsonModel([
2231
            'success' => false,
2232
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2233
        ]);
2234
    }
2235
 
2236
    public function languagesAction()
2237
    {
2238
        $request = $this->getRequest();
2239
 
2240
 
2241
 
2242
        if ($request->isGet()) {
2243
            $items = [];
2244
 
2245
            $mapper = LanguageMapper::getInstance($this->adapter);
2246
            $records = $mapper->fetchAllActive();
2247
            foreach($records as $record)
2248
            {
2249
                $items[ $record->id ] = $record->name;
2250
            }
2251
 
2252
            return new JsonModel([
2253
                'success' => true,
2254
                'data' => $items
2255
            ]);
2256
 
2257
 
2258
        }
2259
        return new JsonModel([
2260
            'success' => false,
2261
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2262
        ]);
2263
    }
2264
 
2265
    public function skillsAction()
2266
    {
2267
        $request = $this->getRequest();
2268
 
2269
 
2270
 
2271
        if ($request->isGet()) {
2272
            $items = [];
2273
 
2274
            $mapper = SkillMapper::getInstance($this->adapter);
2275
            $records = $mapper->fetchAllActive();
2276
            foreach($records as $record)
2277
            {
2278
                $items[ $record->uuid ] = $record->name;
2279
            }
2280
 
2281
            return new JsonModel([
2282
                'success' => true,
2283
                'data' => $items
2284
            ]);
2285
 
2286
 
2287
        }
2288
        return new JsonModel([
2289
            'success' => false,
2290
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2291
        ]);
2292
    }
2293
 
2294
 
2295
    public function aptitudesAction()
2296
    {
2297
        $request = $this->getRequest();
2298
 
2299
 
2300
 
2301
        if ($request->isGet()) {
2302
            $items = [];
2303
 
2304
            $mapper = AptitudeMapper::getInstance($this->adapter);
2305
            $records = $mapper->fetchAllActive();
2306
            foreach($records as $record)
2307
            {
2308
                $items[ $record->uuid ] = $record->name;
2309
            }
2310
 
2311
            return new JsonModel([
2312
                'success' => true,
2313
                'data' => $items
2314
            ]);
2315
 
2316
 
2317
        }
2318
        return new JsonModel([
2319
            'success' => false,
2320
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2321
        ]);
2322
    }
2323
 
2324
    public function hobbiesAction()
2325
    {
2326
        $request = $this->getRequest();
2327
 
2328
 
2329
 
2330
        if ($request->isGet()) {
2331
            $items = [];
2332
 
2333
            $mapper = HobbyAndInterestMapper::getInstance($this->adapter);
2334
            $records = $mapper->fetchAllActive();
2335
            foreach($records as $record)
2336
            {
2337
                $items[ $record->uuid ] = $record->name;
2338
            }
2339
 
2340
            return new JsonModel([
2341
                'success' => true,
2342
                'data' => $items
2343
            ]);
2344
 
2345
 
2346
        }
2347
        return new JsonModel([
2348
            'success' => false,
2349
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2350
        ]);
2351
    }
2352
 
2353
    public function industriesAction()
2354
    {
2355
        $request = $this->getRequest();
2356
 
2357
 
2358
 
2359
        if ($request->isGet()) {
2360
            $items = [];
2361
 
2362
            $mapper = IndustryMapper::getInstance($this->adapter);
2363
            $records = $mapper->fetchAllActive();
2364
            foreach($records as $record)
2365
            {
2366
                $items[ $record->uuid ] = $record->name;
2367
            }
2368
 
2369
            return new JsonModel([
2370
                'success' => true,
2371
                'data' => $items
2372
            ]);
2373
 
2374
 
2375
        }
2376
        return new JsonModel([
2377
            'success' => false,
2378
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2379
        ]);
2380
    }
2381
 
2382
    public function timeZonesAction() {
2383
 
2384
        $request = $this->getRequest();
2385
 
2386
 
2387
 
2388
        if ($request->isGet()) {
2389
            $items = [];
2390
 
2391
 
2392
            $records = Functions::getAllTimeZones();
2393
            foreach($records as $record)
2394
            {
2395
                $items[ $record ] = $record;
2396
            }
2397
 
2398
            return new JsonModel([
2399
                'success' => true,
2400
                'data' => $items
2401
            ]);
2402
 
2403
 
2404
        }
2405
        return new JsonModel([
2406
            'success' => false,
2407
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2408
        ]);
2409
 
2410
 
2411
 
2412
 
2413
 
2414
 
2415
    }
2416
 
117 efrain 2417
 
2418
    public function groupTypesAction()
2419
    {
2420
        $request = $this->getRequest();
2421
 
2422
 
2423
 
2424
        if ($request->isGet()) {
2425
            $items = [];
2426
 
2427
            $mapper = GroupTypeMapper::getInstance($this->adapter);
2428
            $records = $mapper->fetchAllActive();
2429
            foreach($records as $record)
2430
            {
2431
                $items[ $record->uuid ] = $record->name;
2432
            }
2433
 
2434
            return new JsonModel([
2435
                'success' => true,
2436
                'data' => $items
2437
            ]);
2438
 
2439
 
2440
        }
2441
        return new JsonModel([
2442
            'success' => false,
2443
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2444
        ]);
2445
    }
2446
 
2447
 
1 efrain 2448
 
2449
}