Proyectos de Subversion LeadersLinked - Services

Rev

Rev 157 | Rev 192 | 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
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
1950
 
1951
                $link_admin         = $currentUser->usertype_id == UserType::ADMIN ? 1 : 0;
1952
                $link_impersonate   = $currentUser->is_super_user == User::IS_SUPER_USER_YES ? 1 : 0;
1953
                if($link_impersonate) {
1954
                    $url_impersonate = $this->url()->fromRoute('signin/impersonate');
1955
                } else {
1956
                    $url_impersonate = '';
1957
                }
1958
 
1959
                $fullname = trim($currentUser->first_name . ' ' . $currentUser->last_name);
1960
 
1961
                $profileVisitMapper = ProfileVisitMapper::getInstance($this->adapter);
1962
                $visits = $profileVisitMapper->getTotalByVisitedId($currentUser->id);
1963
 
1964
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1965
                $connections = $connectionMapper->fetchTotalConnectionByUser($currentUser->id);
1966
 
1967
 
1968
                if($currentUser->location_id) {
1969
                    $locationMapper = LocationMapper::getInstance($this->adapter);
1970
                    $location = $locationMapper->fetchOne($currentUser->location_id);
1971
 
1972
                    $country = $location->country;
1973
                } else {
1974
                    $country = '';
1975
                }
1976
 
1977
 
1978
 
1979
 
1980
                if($currentUser->usertype_id == UserType::ADMIN) {
1981
                    $url_admin = $this->url()->fromRoute( 'backend/signin-admin');
1982
                } else {
1983
                    $url_admin = '';
1984
                }
1985
 
1986
 
1987
 
1988
                $link_company = '';
1989
                if($network->default != Network::DEFAULT_YES) {
1990
                    $companyMapper = CompanyMapper::getInstance($this->adapter);
1991
                    $company = $companyMapper->fetchDefaultForNetworkByNetworkId($network->id);
1992
                    if($company) {
1993
                        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1994
                        $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1995
                        if($companyUser) {
1996
                            if($companyUser && $companyUser->status == CompanyUser::STATUS_ACCEPTED && $companyUser->backend == CompanyUser::BACKEND_YES ) {
1997
                                $link_company = ['route' => 'backend/signin-company', 'id' => $company->uuid ];
1998
                            }
1999
                        }
2000
                    }
157 efrain 2001
                } else {
2002
 
1 efrain 2003
                }
2004
 
167 efrain 2005
 
2006
 
2007
 
2008
 
1 efrain 2009
                if ($acl->isAllowed($currentUser->usertype_id,  'knowledge-area')) {
2010
                    $route_knowledge_area = $this->url()->fromRoute('knowledge-area');
2011
                    $link_knowledge_area = 1;
2012
                } else {
2013
 
2014
                    $route_knowledge_area = '';
2015
                    $link_knowledge_area = 0;
2016
                }
2017
 
2018
                if ($acl->isAllowed($currentUser->usertype_id,  'my-coach')) {
2019
                    $route_my_coach = $this->url()->fromRoute('my-coach');
2020
                    $link_my_coach = 1;
2021
                } else {
2022
 
2023
                    $route_my_coach = '';
2024
                    $link_my_coach = 0;
2025
                }
2026
 
2027
                if($network->default == Network::DEFAULT_YES) {
2028
                    if($network->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
2029
                        $pages = getAclMenuDefaultNetworkConnectionUser2User();
2030
                    } else {
2031
                        $pages = getAclMenuDefaultNetworkConnectionAll2All();
2032
                    }
2033
                } else {
2034
                    if($network->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
2035
 
2036
                        $pages = getAclMenuNonDefaulNetworkConnectionUser2User();
2037
 
2038
                    } else {
2039
                        $pages = getAclMenuNonDefaultNetworkConnectionAll2All();
2040
                    }
2041
                }
2042
 
2043
 
2044
                $menu = [];
2045
                foreach ($pages as $page) {
2046
 
2047
                    if (!$page || empty($page['route']) || !$acl->isAllowed($currentUser->usertype_id, $page['route'])) {
2048
                        continue;
2049
                    }
2050
 
2051
                    $ajax = false;
2052
                    if ($page['route'] == 'company' && $network->default == Network::DEFAULT_NO) {
2053
 
2054
                        if ($link_company) {
157 efrain 2055
                            $page['route'] = $this->url()->fromRoute($link_company['route'], ['id' => $link_company['id']]);
1 efrain 2056
                            $ajax = true;
2057
                        } else {
2058
                            continue;
2059
                        }
2060
                    }
2061
 
2062
                    $option = [
2063
                        'label' => $page['label'],
2064
                        'href' => $page['route'],
2065
                        'img' => empty($page['class']) ? '' : $page['class'],
2066
                        'ajax' => $ajax ? 1 : 0,
2067
                        'childs' => [],
2068
                    ];
2069
 
2070
                    $childs = empty($page['pages']) ? [] : $page['pages'];
2071
                    if ($childs) {
2072
                        foreach ($childs as $child) {
2073
                            if (!$acl->isAllowed($currentUser->usertype_id,  $child['route'])) {
2074
                                continue;
2075
                            }
2076
 
2077
                            $childs_level2 = [];
2078
 
2079
                            $childsLevel2 = empty($child['pages']) ? [] : $child['pages'];
2080
 
2081
                            if ($childsLevel2) {
2082
                                foreach ($childsLevel2 as $childLevel2) {
2083
                                    if (!$acl->isAllowed($currentUser->usertype_id,  $childLevel2['route'])) {
2084
                                        continue;
2085
                                    }
2086
 
2087
                                    array_push($childs_level2, [
2088
                                        'label' => $childLevel2['label'],
2089
                                        'href' => $childLevel2['route'],
2090
 
2091
                                    ]);
2092
                                }
2093
                            }
2094
 
2095
                            array_push($option['childs'], [
2096
                                'label' => $child['label'],
2097
                                'href' => $child['route'],
2098
                                'childs' => $childs_level2,
2099
                            ]);
2100
                        }
2101
                    }
2102
 
2103
                    array_push($menu, $option);
2104
                }
2105
 
2106
 
60 efrain 2107
                $image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $currentUser->uuid, 'filename' => $currentUser->image],['force_canonical' => true]);
1 efrain 2108
                $isChatPage = $this->getEvent()->getViewModel()->getVariable('is_chat');
2109
                $routeCheckSession = $this->url()->fromRoute('check-session');
2110
 
2111
 
2112
 
2113
                return new JsonModel([
2114
                    'menu'                  => $menu,
2115
                    'isChatPage'            => $isChatPage == 1,
2116
                    'routeCheckSession'     => $routeCheckSession,
2117
                    'linkAdmin'             => $link_admin == 1,
2118
                    'urlAdmin'              => $url_admin,
2119
                    'linkImpersonate'       => $link_impersonate ==1 ,
2120
                    'urlImpersonate'        => $url_impersonate,
2121
                    'image'                 => $image,
2122
                    'fullName'              => $fullname,
2123
                    'country'               => $country,
2124
                    'visits'                => $visits,
2125
                    'connections'           => $connections,
2126
                    'logoForNavbar'         => 'https://' . $network->main_hostname . '/storage-network/type/navbar',
2127
                    'defaultNetwork'        => $network->default,
167 efrain 2128
                    //'linkKnowledgeArea'     => $link_knowledge_area == 1,
2129
                    //'routeKnowledgeArea'    => $route_knowledge_area,
2130
                    //'linkMyCoach'           => $link_my_coach == 1,
2131
                    //'routeMyCoach'          => $route_my_coach,
1 efrain 2132
               ]);
2133
 
2134
 
2135
 
2136
            }
2137
 
2138
 
2139
            return new JsonModel([
2140
                'menu'                  => [],
2141
                'isChatPage'            => false,
2142
                'routeCheckSession'     => '',
2143
                'linkAdmin'             => false,
2144
                'urlAdmin'              => '',
2145
                'linkImpersonate'       => false,
2146
                'urlImpersonate'        => '',
2147
                'image'                 => '',
2148
                'fullName'              => '',
2149
                'country'               => 0,
2150
                'visits'                => 0,
2151
                'connections'           => 0,
2152
                'logoForNavbar'         => 'https://' . $network->main_hostname . '/storage-network/type/navbar',
2153
                'defaultNetwork'        => $network->default,
2154
                'linkKnowledgeArea'     => false,
2155
                'routeKnowledgeArea'    => '',
2156
                'linkMyCoach'           => false,
2157
                'routeMyCoach'          => '',
2158
            ]);
2159
 
2160
        } else {
2161
 
2162
            return new JsonModel([
2163
                'success' => false,
2164
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2165
            ]);
2166
        }
2167
 
2168
 
2169
        return new JsonModel([
2170
            'success' => false,
2171
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2172
        ]);
2173
    }
2174
 
2175
    public function companySizesAction()
2176
    {
2177
        $request = $this->getRequest();
2178
 
2179
 
2180
 
2181
        if ($request->isGet()) {
2182
            $items = [];
2183
 
2184
            $mapper = CompanySizeMapper::getInstance($this->adapter);
2185
            $records = $mapper->fetchAllActive();
2186
            foreach($records as $record)
2187
            {
2188
                 $items[ $record->uuid ] = $record->name;
2189
            }
2190
 
2191
            return new JsonModel([
2192
                'success' => true,
2193
                'data' => $items
2194
            ]);
2195
 
2196
 
2197
        }
2198
        return new JsonModel([
2199
            'success' => false,
2200
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2201
        ]);
2202
    }
2203
 
2204
    public function degreesAction()
2205
    {
2206
        $request = $this->getRequest();
2207
 
2208
 
2209
 
2210
        if ($request->isGet()) {
2211
            $items = [];
2212
 
2213
            $mapper = DegreeMapper::getInstance($this->adapter);
2214
            $records = $mapper->fetchAllActive();
2215
            foreach($records as $record)
2216
            {
2217
                $items[ $record->uuid ] = $record->name;
2218
            }
2219
 
2220
            return new JsonModel([
2221
                'success' => true,
2222
                'data' => $items
2223
            ]);
2224
 
2225
 
2226
        }
2227
        return new JsonModel([
2228
            'success' => false,
2229
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2230
        ]);
2231
    }
2232
 
2233
    public function languagesAction()
2234
    {
2235
        $request = $this->getRequest();
2236
 
2237
 
2238
 
2239
        if ($request->isGet()) {
2240
            $items = [];
2241
 
2242
            $mapper = LanguageMapper::getInstance($this->adapter);
2243
            $records = $mapper->fetchAllActive();
2244
            foreach($records as $record)
2245
            {
2246
                $items[ $record->id ] = $record->name;
2247
            }
2248
 
2249
            return new JsonModel([
2250
                'success' => true,
2251
                'data' => $items
2252
            ]);
2253
 
2254
 
2255
        }
2256
        return new JsonModel([
2257
            'success' => false,
2258
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2259
        ]);
2260
    }
2261
 
2262
    public function skillsAction()
2263
    {
2264
        $request = $this->getRequest();
2265
 
2266
 
2267
 
2268
        if ($request->isGet()) {
2269
            $items = [];
2270
 
2271
            $mapper = SkillMapper::getInstance($this->adapter);
2272
            $records = $mapper->fetchAllActive();
2273
            foreach($records as $record)
2274
            {
2275
                $items[ $record->uuid ] = $record->name;
2276
            }
2277
 
2278
            return new JsonModel([
2279
                'success' => true,
2280
                'data' => $items
2281
            ]);
2282
 
2283
 
2284
        }
2285
        return new JsonModel([
2286
            'success' => false,
2287
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2288
        ]);
2289
    }
2290
 
2291
 
2292
    public function aptitudesAction()
2293
    {
2294
        $request = $this->getRequest();
2295
 
2296
 
2297
 
2298
        if ($request->isGet()) {
2299
            $items = [];
2300
 
2301
            $mapper = AptitudeMapper::getInstance($this->adapter);
2302
            $records = $mapper->fetchAllActive();
2303
            foreach($records as $record)
2304
            {
2305
                $items[ $record->uuid ] = $record->name;
2306
            }
2307
 
2308
            return new JsonModel([
2309
                'success' => true,
2310
                'data' => $items
2311
            ]);
2312
 
2313
 
2314
        }
2315
        return new JsonModel([
2316
            'success' => false,
2317
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2318
        ]);
2319
    }
2320
 
2321
    public function hobbiesAction()
2322
    {
2323
        $request = $this->getRequest();
2324
 
2325
 
2326
 
2327
        if ($request->isGet()) {
2328
            $items = [];
2329
 
2330
            $mapper = HobbyAndInterestMapper::getInstance($this->adapter);
2331
            $records = $mapper->fetchAllActive();
2332
            foreach($records as $record)
2333
            {
2334
                $items[ $record->uuid ] = $record->name;
2335
            }
2336
 
2337
            return new JsonModel([
2338
                'success' => true,
2339
                'data' => $items
2340
            ]);
2341
 
2342
 
2343
        }
2344
        return new JsonModel([
2345
            'success' => false,
2346
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2347
        ]);
2348
    }
2349
 
2350
    public function industriesAction()
2351
    {
2352
        $request = $this->getRequest();
2353
 
2354
 
2355
 
2356
        if ($request->isGet()) {
2357
            $items = [];
2358
 
2359
            $mapper = IndustryMapper::getInstance($this->adapter);
2360
            $records = $mapper->fetchAllActive();
2361
            foreach($records as $record)
2362
            {
2363
                $items[ $record->uuid ] = $record->name;
2364
            }
2365
 
2366
            return new JsonModel([
2367
                'success' => true,
2368
                'data' => $items
2369
            ]);
2370
 
2371
 
2372
        }
2373
        return new JsonModel([
2374
            'success' => false,
2375
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2376
        ]);
2377
    }
2378
 
2379
    public function timeZonesAction() {
2380
 
2381
        $request = $this->getRequest();
2382
 
2383
 
2384
 
2385
        if ($request->isGet()) {
2386
            $items = [];
2387
 
2388
 
2389
            $records = Functions::getAllTimeZones();
2390
            foreach($records as $record)
2391
            {
2392
                $items[ $record ] = $record;
2393
            }
2394
 
2395
            return new JsonModel([
2396
                'success' => true,
2397
                'data' => $items
2398
            ]);
2399
 
2400
 
2401
        }
2402
        return new JsonModel([
2403
            'success' => false,
2404
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2405
        ]);
2406
 
2407
 
2408
 
2409
 
2410
 
2411
 
2412
    }
2413
 
117 efrain 2414
 
2415
    public function groupTypesAction()
2416
    {
2417
        $request = $this->getRequest();
2418
 
2419
 
2420
 
2421
        if ($request->isGet()) {
2422
            $items = [];
2423
 
2424
            $mapper = GroupTypeMapper::getInstance($this->adapter);
2425
            $records = $mapper->fetchAllActive();
2426
            foreach($records as $record)
2427
            {
2428
                $items[ $record->uuid ] = $record->name;
2429
            }
2430
 
2431
            return new JsonModel([
2432
                'success' => true,
2433
                'data' => $items
2434
            ]);
2435
 
2436
 
2437
        }
2438
        return new JsonModel([
2439
            'success' => false,
2440
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2441
        ]);
2442
    }
2443
 
2444
 
1 efrain 2445
 
2446
}