Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17160 | Rev 17178 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
17152 stevensc 7
use Laminas\Log\LoggerInterface;
1 www 8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\View\Model\ViewModel;
10
use Laminas\View\Model\JsonModel;
17154 stevensc 11
use Laminas\Hydrator\ArraySerializableHydrator;
12
use Laminas\Db\ResultSet\HydratingResultSet;
13
use Laminas\Paginator\Adapter\DbSelect;
14
use Laminas\Paginator\Paginator;
15
use Laminas\Mvc\I18n\Translator;
17002 efrain 16
use LeadersLinked\Mapper\MicrolearningTopicMapper;
17
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
17154 stevensc 18
use LeadersLinked\Mapper\MicrolearningTopicCapsuleMapper;
17002 efrain 19
use LeadersLinked\Mapper\MicrolearningCapsuleUserMapper;
17154 stevensc 20
use LeadersLinked\Mapper\MicrolearningUserMapper;
1 www 21
use LeadersLinked\Mapper\UserMapper;
17154 stevensc 22
use LeadersLinked\Mapper\QueryMapper;
1 www 23
use LeadersLinked\Mapper\ApplicationMapper;
24
use LeadersLinked\Mapper\PushMapper;
25
use LeadersLinked\Mapper\PushTemplateMapper;
26
use LeadersLinked\Mapper\DeviceHistoryMapper;
17154 stevensc 27
use LeadersLinked\Mapper\ApplicationVariantMapper;
28
use LeadersLinked\Mapper\NotificationMapper;
29
use LeadersLinked\Mapper\NetworkMapper;
30
use LeadersLinked\Mapper\CompanyMapper;
31
use LeadersLinked\Mapper\CompanyFollowerMapper;
32
use LeadersLinked\Mapper\ConnectionMapper;
1 www 33
use LeadersLinked\Mapper\UserPasswordMapper;
17002 efrain 34
use LeadersLinked\Mapper\MicrolearningExtendUserMapper;
35
use LeadersLinked\Mapper\MicrolearningExtendUserCompanyMapper;
36
use LeadersLinked\Mapper\MicrolearningExtendUserFunctionMapper;
37
use LeadersLinked\Mapper\MicrolearningExtendUserGroupMapper;
38
use LeadersLinked\Mapper\MicrolearningExtendUserInstitutionMapper;
39
use LeadersLinked\Mapper\MicrolearningExtendUserProgramMapper;
40
use LeadersLinked\Mapper\MicrolearningExtendUserPartnerMapper;
41
use LeadersLinked\Mapper\MicrolearningExtendUserSectorMapper;
42
use LeadersLinked\Mapper\MicrolearningExtendUserStudentTypeMapper;
17154 stevensc 43
use LeadersLinked\Mapper\MicrolearningExtendUserCountryMapper;
44
use LeadersLinked\Model\MicrolearningCapsuleUser;
45
use LeadersLinked\Model\MicrolearningUser;
46
use LeadersLinked\Model\Push;
47
use LeadersLinked\Model\Application;
48
use LeadersLinked\Model\Notification;
49
use LeadersLinked\Model\Network;
50
use LeadersLinked\Model\Connection;
51
use LeadersLinked\Model\CompanyFollower;
52
use LeadersLinked\Model\User;
53
use LeadersLinked\Model\UserType;
54
use LeadersLinked\Model\UserPassword;
17002 efrain 55
use LeadersLinked\Model\MicrolearningExtendUser;
56
use LeadersLinked\Model\MicrolearningExtendUserCompany;
57
use LeadersLinked\Model\MicrolearningExtendUserFunction;
58
use LeadersLinked\Model\MicrolearningExtendUserGroup;
59
use LeadersLinked\Model\MicrolearningExtendUserInstitution;
60
use LeadersLinked\Model\MicrolearningExtendUserProgram;
61
use LeadersLinked\Model\MicrolearningExtendUserPartner;
62
use LeadersLinked\Model\MicrolearningExtendUserSector;
63
use LeadersLinked\Model\MicrolearningExtendUserStudentType;
64
use LeadersLinked\Model\MicrolearningExtendUserCountry;
17154 stevensc 65
use LeadersLinked\Form\Microlearning\TopicCapsuleForm;
66
use LeadersLinked\Form\Microlearning\PushMicrolearningNotificationForm;
67
use LeadersLinked\Form\Microlearning\CapsuleCustomerUploadForm;
16766 efrain 68
use LeadersLinked\Library\Functions;
16768 efrain 69
use LeadersLinked\Cache\CacheInterface;
70
use LeadersLinked\Cache\CacheImpl;
17154 stevensc 71
use PhpOffice\PhpSpreadsheet\IOFactory;
1 www 72
 
73
class MicrolearningAccessForStudentsController extends AbstractActionController
74
{
75
    /**
17152 stevensc 76
     * @var AdapterInterface
1 www 77
     */
78
    private $adapter;
79
 
80
    /**
17152 stevensc 81
     * @var CacheInterface
1 www 82
     */
16769 efrain 83
    private $cache;
84
 
85
    /**
17152 stevensc 86
     * @var LoggerInterface
16769 efrain 87
     */
1 www 88
    private $logger;
89
 
90
    /**
91
     * @var array
92
     */
93
    private $config;
94
 
95
    /**
17152 stevensc 96
     * @var Translator
16768 efrain 97
     */
16769 efrain 98
    private $translator;
16768 efrain 99
 
100
    /**
17152 stevensc 101
     * @param AdapterInterface $adapter
102
     * @param CacheInterface $cache
103
     * @param LoggerInterface $logger
1 www 104
     * @param array $config
17152 stevensc 105
     * @param Translator $translator
1 www 106
     */
16769 efrain 107
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 108
    {
17152 stevensc 109
        $this->adapter = $adapter;
110
        $this->cache = $cache;
111
        $this->logger = $logger;
112
        $this->config = $config;
113
        $this->translator = $translator;
1 www 114
    }
115
 
116
    public function indexAction()
117
    {
17154 stevensc 118
        try {
119
            $currentUserPlugin = $this->plugin('currentUserPlugin');
120
            $currentUser = $currentUserPlugin->getUser();
121
            $currentCompany = $currentUserPlugin->getCompany();
1 www 122
 
17154 stevensc 123
            $request = $this->getRequest();
1 www 124
 
17154 stevensc 125
            if($request->isGet())
126
            {
127
                $headers  = $request->getHeaders();
128
                $isJson = false;
1 www 129
 
17154 stevensc 130
                if($headers->has('Accept')) {
131
                    $accept = $headers->get('Accept');
132
                    $prioritized = $accept->getPrioritized();
1 www 133
 
17154 stevensc 134
                    foreach($prioritized as $key => $value) {
135
                        $raw = trim($value->getRaw());
136
                        if(!$isJson) $isJson = strpos($raw, 'json');
1 www 137
                    }
138
                }
139
 
17154 stevensc 140
                if($isJson) {
141
                    try {
142
                        $topic_uuid     = Functions::sanitizeFilterString($this->params()->fromQuery('topic_uuid'));
143
                        $capsule_uuid   = Functions::sanitizeFilterString($this->params()->fromQuery('capsule_uuid'));
144
 
145
                        $data = [
146
                            'link_upload' => '',
147
                            'items' => [] ,
148
                            'total' => 0,
149
                            'capsules' => []
150
                        ];
151
 
152
                        if(!$topic_uuid) {
153
                            return new JsonModel([
154
                                'success' => true,
155
                                'data' => $data
156
                            ]);
157
                        }
158
 
159
                        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
160
                        if (!$topicMapper) {
161
                            throw new \Exception('Failed to initialize TopicMapper');
162
                        }
163
 
164
                        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
165
                        if(!$topic) {
166
                            return new JsonModel([
167
                                'success' => true,
168
                                'data' => 'ERROR_TOPIC_NOT_FOUND'
169
                            ]);
170
                        }
171
 
172
                        if($topic->company_id != $currentCompany->id) {
173
                            return new JsonModel([
174
                                'success' => true,
175
                                'data' => 'ERROR_UNAUTHORIZED'
176
                            ]);
177
                        }
178
 
179
                        if(!$capsule_uuid) {
180
                            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
17157 stevensc 181
                            $records = $topicCapsuleMapper->fetchAllByTopicId($topic->id);
1 www 182
 
17154 stevensc 183
                            $capsules = [];
17156 stevensc 184
 
17158 stevensc 185
                            foreach($records as $record)
186
                            {
187
                                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
188
                                $capsule = $capsuleMapper->fetchOneById($record->capsule_id);
17159 stevensc 189
                                $capsules[$capsule->uuid] = $capsule->name;
17158 stevensc 190
                            }
1 www 191
 
17158 stevensc 192
                            $data['capsules']  = $capsules;
17154 stevensc 193
                        }
194
 
195
                        if(!$capsule_uuid) {
196
                            return new JsonModel([
197
                                'success' => true,
198
                                'data' => $data
199
                            ]);
1 www 200
 
17154 stevensc 201
                        }
202
 
203
                        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
204
                        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
205
 
206
                        if(!$capsule) {
207
                            return new JsonModel([
208
                                'success' => true,
209
                                'data' => 'ERROR_CAPSULE_NOT_FOUND'
210
                            ]);
211
                        }
212
 
213
                        $data['link_upload'] = $this->url()->fromRoute('microlearning/access-for-students/upload',['topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid]);
214
                        $data['link_notification'] = $this->url()->fromRoute('microlearning/access-for-students/notification',['topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid]);
215
 
216
                        $search = $this->params()->fromQuery('search', []);
217
                        $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
218
 
219
                        $page               = intval($this->params()->fromQuery('start', 1), 10);
220
                        $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
221
                        $order =  $this->params()->fromQuery('order', []);
222
                        $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
223
                        $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
224
 
225
                        $fields =  ['uuid', 'first_name', 'last_name', 'email'];
226
                        $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
227
 
228
                        if(!in_array($order_direction, ['ASC', 'DESC'])) {
229
                            $order_direction = 'ASC';
230
                        }
231
 
232
                        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
233
                        $allowRevoke = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/revoke');
234
                        $allowUnlimit = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/unlimit');
235
                        $allowCancel = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/cancel');
236
                        $allowReactive = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/reactive');
237
 
238
                        $queryMapper = QueryMapper::getInstance($this->adapter);
239
                        $sql = $queryMapper->getSql();
240
                        $select = $sql->select();
241
                        $select->columns(['access', 'paid_from', 'paid_to', 'added_on', 'updated_on']);
242
                        $select->from(['tb1' => MicrolearningCapsuleUserMapper::_TABLE] );
243
                        $select->join(['tb2' => UserMapper::_TABLE], 'tb1.user_id = tb2.id', ['uuid', 'first_name', 'last_name', 'email']);
244
                        $select->where->equalTo('tb1.company_id', $capsule->company_id);
17161 stevensc 245
                        $select->where->equalTo('tb1.topic_id', $topic->id);
17154 stevensc 246
                        $select->where->equalTo('tb1.capsule_id', $capsule->id);
247
 
248
                        if($search) {
249
                            $select->where->nest()
250
                            ->like('first_name', '%' . $search . '%')
251
                            ->or->like('last_name', '%' . $search . '%')
252
                            ->or->like('email', '%' . $search . '%')
253
                            ->unnest();
1 www 254
 
17154 stevensc 255
                        }
256
 
257
 
258
                        $select->order($order_field . ' ' . $order_direction);
259
 
260
                        $hydrator   = new ArraySerializableHydrator();
261
                        $resultset  = new HydratingResultSet($hydrator);
262
 
263
                        $adapter = new DbSelect($select, $sql, $resultset);
264
                        $paginator = new Paginator($adapter);
265
                        $paginator->setItemCountPerPage($records_x_page);
266
                        $paginator->setCurrentPageNumber($page);
267
 
268
 
269
                        $items = [ ];
270
                        $records = $paginator->getCurrentItems();
271
                        foreach($records as $record)
272
                        {
273
                            $params = [
274
                                'topic_uuid' => $topic->uuid,
275
                                'capsule_uuid' => $capsule->uuid,
276
                                'user_uuid' => $record['uuid']
277
                            ];
1 www 278
 
17154 stevensc 279
                            $actions = [];
1 www 280
 
281
 
282
 
17154 stevensc 283
                            switch($record['access'])
284
                            {
285
                                case MicrolearningCapsuleUser::ACCESS_UNLIMITED :
286
                                    $actions['link_revoke'] = $allowRevoke ? $this->url()->fromRoute('microlearning/access-for-students/revoke', $params) : '';
287
                                    $details['access'] = 'LABEL_UNLIMIT';
288
                                    break;
289
 
290
                                case MicrolearningCapsuleUser::ACCESS_REVOKE :
291
                                    $actions['link_unlimit'] = $allowUnlimit ? $this->url()->fromRoute('microlearning/access-for-students/unlimit', $params) : '';
292
                                    $details['access'] = 'LABEL_REVOKED';
293
                                    break;
294
 
295
                                case MicrolearningCapsuleUser::ACCESS_PAY_PERIOD :
296
                                    $actions['link_cancel'] = $allowCancel ? $this->url()->fromRoute('microlearning/access-for-students/cancel', $params) : '';
297
 
298
                                    $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
299
                                    $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
300
 
301
                                    $details['access'] = 'LABEL_PAY_PERIOD';
302
                                    $details['paid_from'] = $dt_paid_from->format('d/m/Y');
303
                                    $details['paid_to'] = $dt_paid_to->format('d/m/Y');
304
                                    break;
305
 
306
                                case MicrolearningCapsuleUser::ACCESS_SUPENDED :
307
                                    $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
308
                                    $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
309
 
310
                                    $details['access'] = 'LABEL_SUSPENDED';
311
                                    $details['paid_from'] = $dt_paid_from->format('d/m/Y');
312
                                    $details['paid_to'] = $dt_paid_to->format('d/m/Y');
313
                                    break;
314
 
315
                                case MicrolearningCapsuleUser::ACCESS_CANCELLED :
316
 
317
                                    $date = date('Y-m-d');
318
                                    if($allowCancel && $record['paid_from'] <= $date && $record['paid_to'] >= $date) {
319
                                        $actions['link_reactive'] = $allowReactive ? $this->url()->fromRoute('microlearning/access-for-students/reactive', $params) : '';
320
                                    }
321
 
322
                                    $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
323
                                    $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
324
 
325
                                    $details['access'] = 'LABEL_CANCELLED';
326
                                    $details['paid_from'] = $dt_paid_from->format('d/m/Y');
327
                                    $details['paid_to'] = $dt_paid_to->format('d/m/Y');
328
                                    break;
329
 
1 www 330
                            }
331
 
17154 stevensc 332
                            $dt_added_on = \DateTime::createFromFormat('Y-m-d H:i:s', $record['added_on']);
333
                            $details['added_on'] = $dt_added_on->format('d/m/Y h:i a');
1 www 334
 
17154 stevensc 335
                            $dt_updated_on = \DateTime::createFromFormat('Y-m-d H:i:s', $record['updated_on']);
336
                            $details['updated_on'] = $dt_updated_on->format('d/m/Y h:i a');
1 www 337
 
17154 stevensc 338
                            $item = [
339
                                'uuid' => $record['uuid'],
340
                                'first_name' => $record['first_name'],
341
                                'last_name' => $record['last_name'],
342
                                'email' => $record['email'],
343
                                'details' => $details,
344
                                'actions' => $actions
345
                            ];
346
 
347
 
348
                            array_push($items, $item);
349
 
350
 
351
                        }
352
 
353
                        $data['items'] = $items;
354
                        $data['total'] = $paginator->getTotalItemCount();
355
 
356
 
357
                        return new JsonModel([
358
                            'success' => true,
359
                            'data' => $data
360
                        ]);
361
                    } catch (\Exception $e) {
362
                        $this->logger->err('Error in indexAction: ' . $e->getMessage());
363
                        return new JsonModel([
364
                            'success' => false,
365
                            'data' => 'An error occurred while processing your request'
366
                        ]);
1 www 367
                    }
17154 stevensc 368
                } else {
369
                    $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
370
                    $topics = $topicMapper->fetchAllByCompanyId($currentCompany->id);
1 www 371
 
17154 stevensc 372
                    if($topics) {
373
                        $topic_id = $topics[0]->id;
374
                    }  else {
375
                        $topic_id = 0;
376
                    }
1 www 377
 
378
 
17154 stevensc 379
                    $form = new TopicCapsuleForm($this->adapter, $currentCompany->id, $topic_id);
380
                    $formPushNotification = new PushMicrolearningNotificationForm($this->adapter, $currentCompany->id);
381
                    $formCapsuleCustomer = new CapsuleCustomerUploadForm();
1 www 382
 
383
 
384
 
17154 stevensc 385
                    $this->layout()->setTemplate('layout/layout-backend');
386
                    $viewModel = new ViewModel();
387
                    $viewModel->setTemplate('leaders-linked/microlearning-access-for-students/index.phtml');
388
                    $viewModel->setVariables([
389
                        'form' => $form,
390
                        'formPushNotification' => $formPushNotification,
391
                        'formCapsuleCustomer' => $formCapsuleCustomer
392
                    ]);
1 www 393
 
17154 stevensc 394
                    return $viewModel ;
1 www 395
                }
396
 
17154 stevensc 397
            } else {
1 www 398
                return new JsonModel([
17154 stevensc 399
                    'success' => false,
400
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1 www 401
                ]);
402
            }
17154 stevensc 403
        } catch (\Exception $e) {
404
            $this->logger->err('Fatal error in indexAction: ' . $e->getMessage());
17155 stevensc 405
            return new JsonModel([
406
                'success' => false,
407
                'data' => $e->getMessage()
408
            ]);
1 www 409
        }
410
    }
411
 
412
 
413
 
414
 
415
    public function revokeAction()
416
    {
417
        $request = $this->getRequest();
418
 
419
        $currentUserPlugin = $this->plugin('currentUserPlugin');
420
        $currentUser    = $currentUserPlugin->getUser();
421
        $currentCompany = $currentUserPlugin->getCompany();
422
 
423
        $request    = $this->getRequest();
424
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
425
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
426
        $user_uuid   = $this->params()->fromRoute('user_uuid');
427
 
428
 
17002 efrain 429
        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
1 www 430
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
431
        if(!$topic) {
432
            return new JsonModel([
433
                'success'   => false,
434
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
435
            ]);
436
        }
437
 
438
 
439
 
440
        if($topic->company_id != $currentCompany->id) {
441
            return new JsonModel([
442
                'success'   => false,
443
                'data'   => 'ERROR_UNAUTHORIZED'
444
            ]);
445
        }
446
 
17002 efrain 447
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 448
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
449
        if(!$capsule) {
450
            return new JsonModel([
451
                'success'   => false,
452
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
453
            ]);
454
        }
455
 
456
 
457
        if($capsule->topic_id != $topic->id) {
458
            return new JsonModel([
459
                'success'   => false,
460
                'data'   => 'ERROR_UNAUTHORIZED'
461
            ]);
462
        }
463
 
464
        $userMapper = UserMapper::getInstance($this->adapter);
465
        $user = $userMapper->fetchOneByUuid($user_uuid);
466
 
467
        if(!$user) {
468
            return new JsonModel([
469
                'success'   => false,
470
                'data'   => 'ERROR_USER_NOT_FOUND'
471
            ]);
472
        }
473
 
17002 efrain 474
        $capsuleUserMapper = MicrolearningCapsuleUserMapper::getInstance($this->adapter);
1 www 475
        $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
476
        if(!$capsuleUser) {
477
            return new JsonModel([
478
                'success'   => false,
479
                'data'   => 'ERROR_UNAUTHORIZED'
480
            ]);
481
        }
482
 
483
        if($request->isPost()) {
484
 
485
 
17002 efrain 486
            if($capsuleUser->access != MicrolearningCapsuleUser::ACCESS_UNLIMITED) {
1 www 487
                return new JsonModel([
488
                    'success'   => false,
489
                    'data'   => 'ERROR_USER_ACCESS_CANNT_BE_REVOKE'
490
                ]);
491
            }
17002 efrain 492
            $capsuleUser->access = MicrolearningCapsuleUser::ACCESS_REVOKE;
1 www 493
            if($capsuleUserMapper->update($capsuleUser)) {
494
 
495
                $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
496
                if($capsuleUser) {
17002 efrain 497
                    $microlearningUserMapper = MicrolearningUserMapper::getInstance($this->adapter);
498
                    $microlearningUser = $microlearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
499
                    if($microlearningUser) {
500
                        $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 501
 
17002 efrain 502
                        $microlearningUserMapper->update($microlearningUser);
1 www 503
 
504
                    } else {
17002 efrain 505
                        $microlearningUser = new MicrolearningUser();
506
                        $microlearningUser->company_id = $capsuleUser->company_id;
507
                        $microlearningUser->user_id = $capsuleUser->user_id;
508
                        $microlearningUser->added_on = $capsuleUser->added_on;
509
                        $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 510
 
17002 efrain 511
                        $microlearningUserMapper->insert($microlearningUser);
1 www 512
                    }
513
                }
514
 
515
                return new JsonModel([
516
                    'success' => true,
517
                    'data' => 'LABEL_USER_ACCESS_HAS_BEEN_REVOKE'
518
                ]);
519
 
520
            } else {
521
 
522
                return new JsonModel([
523
                    'success'   => false,
524
                    'data'      => $capsuleUserMapper->getError()
525
                ]);
526
            }
527
        }
528
 
529
        return new JsonModel([
530
            'success' => false,
531
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
532
        ]);
533
    }
534
 
535
    public function unlimitAction()
536
    {
537
        $request = $this->getRequest();
538
 
539
        $currentUserPlugin = $this->plugin('currentUserPlugin');
540
        $currentUser    = $currentUserPlugin->getUser();
541
        $currentCompany = $currentUserPlugin->getCompany();
542
 
543
        $request    = $this->getRequest();
544
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
545
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
546
        $user_uuid   = $this->params()->fromRoute('user_uuid');
547
 
548
 
17002 efrain 549
        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
1 www 550
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
551
        if(!$topic) {
552
            return new JsonModel([
553
                'success'   => false,
554
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
555
            ]);
556
        }
557
 
558
 
559
 
560
        if($topic->company_id != $currentCompany->id) {
561
            return new JsonModel([
562
                'success'   => false,
563
                'data'   => 'ERROR_UNAUTHORIZED'
564
            ]);
565
        }
566
 
17002 efrain 567
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 568
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
569
        if(!$capsule) {
570
            return new JsonModel([
571
                'success'   => false,
572
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
573
            ]);
574
        }
575
 
576
 
577
        if($capsule->topic_id != $topic->id) {
578
            return new JsonModel([
579
                'success'   => false,
580
                'data'   => 'ERROR_UNAUTHORIZED'
581
            ]);
582
        }
583
 
584
        $userMapper = UserMapper::getInstance($this->adapter);
585
        $user = $userMapper->fetchOneByUuid($user_uuid);
586
 
587
        if(!$user) {
588
            return new JsonModel([
589
                'success'   => false,
590
                'data'   => 'ERROR_USER_NOT_FOUND'
591
            ]);
592
        }
593
 
17002 efrain 594
        $capsuleUserMapper = MicrolearningCapsuleUserMapper::getInstance($this->adapter);
1 www 595
        $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
596
        if(!$capsuleUser) {
597
            return new JsonModel([
598
                'success'   => false,
599
                'data'   => 'ERROR_UNAUTHORIZED'
600
            ]);
601
        }
602
 
603
        if($request->isPost()) {
604
 
605
 
17002 efrain 606
            if($capsuleUser->access != MicrolearningCapsuleUser::ACCESS_REVOKE) {
1 www 607
                return new JsonModel([
608
                    'success'   => false,
609
                    'data'   => 'ERROR_USER_ACCESS_CANNT_BE_UNLIMIT'
610
                ]);
611
            }
17002 efrain 612
            $capsuleUser->access = MicrolearningCapsuleUser::ACCESS_UNLIMITED;
1 www 613
            if($capsuleUserMapper->update($capsuleUser)) {
614
 
615
                $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
616
                if($capsuleUser) {
17002 efrain 617
                    $microlearningUserMapper = MicrolearningUserMapper::getInstance($this->adapter);
618
                    $microlearningUser = $microlearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
619
                    if($microlearningUser) {
620
                        $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 621
 
17002 efrain 622
                        $microlearningUserMapper->update($microlearningUser);
1 www 623
 
624
                    } else {
17002 efrain 625
                        $microlearningUser = new MicrolearningUser();
626
                        $microlearningUser->company_id = $capsuleUser->company_id;
627
                        $microlearningUser->user_id = $capsuleUser->user_id;
628
                        $microlearningUser->added_on = $capsuleUser->added_on;
629
                        $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 630
 
17002 efrain 631
                        $microlearningUserMapper->insert($microlearningUser);
1 www 632
                    }
633
                }
634
 
635
                return new JsonModel([
636
                    'success' => true,
637
                    'data' => 'LABEL_USER_ACCESS_HAS_BEEN_UNLIMITED'
638
                ]);
639
 
640
            } else {
641
 
642
                return new JsonModel([
643
                    'success'   => false,
644
                    'data'      => $capsuleUserMapper->getError()
645
                ]);
646
            }
647
        }
648
 
649
        return new JsonModel([
650
            'success' => false,
651
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
652
        ]);
653
    }
654
 
655
    public function uploadAction()
656
    {
657
        $request = $this->getRequest();
658
 
659
        $currentUserPlugin = $this->plugin('currentUserPlugin');
660
        $currentUser    = $currentUserPlugin->getUser();
661
        $currentCompany = $currentUserPlugin->getCompany();
662
 
15394 efrain 663
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
664
        $currentNetwork = $currentNetworkPlugin->getNetwork();
665
 
1 www 666
        $request    = $this->getRequest();
667
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
668
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
669
 
670
 
17002 efrain 671
        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
1 www 672
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
673
        if(!$topic) {
674
            return new JsonModel([
675
                'success'   => false,
676
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
677
            ]);
678
        }
679
 
680
 
681
 
682
        if($topic->company_id != $currentCompany->id) {
683
            return new JsonModel([
684
                'success'   => false,
685
                'data'   => 'ERROR_UNAUTHORIZED'
686
            ]);
687
        }
688
 
17002 efrain 689
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 690
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
691
        if(!$capsule) {
692
            return new JsonModel([
693
                'success'   => false,
694
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
695
            ]);
696
        }
697
 
698
 
699
        if($capsule->topic_id != $topic->id) {
700
            return new JsonModel([
701
                'success'   => false,
702
                'data'   => 'ERROR_UNAUTHORIZED'
703
            ]);
704
        }
705
 
706
 
707
 
708
        if($request->isPost()) {
709
 
16766 efrain 710
            $step = Functions::sanitizeFilterString($this->params()->fromPost('step'));
1 www 711
            if($step == 'validation') {
15455 efrain 712
 
713
 
1 www 714
                $userMapper = UserMapper::getInstance($this->adapter);
17002 efrain 715
                $capsuleUserMapper = MicrolearningCapsuleUserMapper::getInstance($this->adapter);
1 www 716
 
717
                $form = new  CapsuleCustomerUploadForm();
718
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
719
 
720
                $form->setData($dataPost);
721
 
722
                if($form->isValid()) {
723
 
724
                    $file = $_FILES['file'];
725
                    $tmp_filename = $file['tmp_name'];
726
                    $final_filename =  'data/' . $file['name'];
727
 
728
                    if(!move_uploaded_file($tmp_filename, $final_filename)) {
729
                        return new JsonModel([
730
                            'success' => false,
731
                            'data' => 'ERROR_UPLOAD_FILE'
732
                        ]);
733
                    }
734
 
15455 efrain 735
 
16983 efrain 736
                    $count_users = 0;
1 www 737
                    $users = [];
16983 efrain 738
                    $count_errors = 0;
739
                    $errors = [];
1 www 740
 
741
 
742
                    $spreadsheet = IOFactory::load($final_filename);
743
                    $records = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
744
 
745
                    $emails = [];
16983 efrain 746
                    $row = 0;
1 www 747
 
748
                    foreach($records as $record)
749
                    {
15452 efrain 750
                        /*
751
                        A = Nombre
752
                        B = Apellido
753
                        C = Email
754
                        D = Contraseña
755
                        E = Empresa
756
                        F = Función
757
                        G = Grupo
758
                        H = Institución
759
                        I = Programa
760
                        J = Socio
761
                        K = Sector
762
                        L = Tipo de Estudiante
763
                        M = País
764
                        N = Es adulto
765
                        */
16983 efrain 766
                        $row++;
1 www 767
 
768
 
16766 efrain 769
                        $first_name = Functions::sanitizeFilterString($record['A']);
770
                        $last_name = Functions::sanitizeFilterString($record['B']);
15394 efrain 771
                        $email = trim(filter_var($record['C'], FILTER_SANITIZE_EMAIL));
16766 efrain 772
                        $password = Functions::sanitizeFilterString($record['D']);
1 www 773
 
16766 efrain 774
                        $company =  isset($record['E']) ? Functions::sanitizeFilterString($record['E']) : '';
775
                        $function = isset($record['F']) ? Functions::sanitizeFilterString($record['F']) : '';
776
                        $group = isset($record['G']) ? Functions::sanitizeFilterString($record['G']) : '';
777
                        $institution = isset($record['H']) ? Functions::sanitizeFilterString($record['H']) : '';
778
                        $program = isset($record['I']) ? Functions::sanitizeFilterString($record['I']) : '';
779
                        $partner = isset($record['J']) ? Functions::sanitizeFilterString($record['J']) : '';
780
                        $sector = isset($record['K']) ? Functions::sanitizeFilterString($record['K']) : '';
781
                        $studentType = isset($record['L']) ? Functions::sanitizeFilterString($record['L']) : '';
782
                        $country =  isset($record['M']) ? Functions::sanitizeFilterString($record['M']) : '';
783
                        $isAdult = isset($record['N']) ? Functions::sanitizeFilterString($record['N']) : '';
15452 efrain 784
 
15394 efrain 785
 
16983 efrain 786
                        if($row == 1) {
787
                            continue;
788
                        }
15394 efrain 789
 
129 efrain 790
                        //||  empty($password)
791
                        if(empty($first_name) || empty($last_name) || !filter_var($email, FILTER_VALIDATE_EMAIL) ) {
16983 efrain 792
 
793
 
794
 
1 www 795
                            continue;
16983 efrain 796
 
1 www 797
                        }
798
 
799
                        if(!in_array($email, $emails)) {
800
 
801
                            $user = $userMapper->fetchOneByEmail($email);
802
                            if($user) {
803
                                $assigned_capsules =  $capsuleUserMapper->fetchCountByCompanyIdAndTopicIdAndUserId($topic->company_id, $topic->id, $user->id);
804
                            } else {
805
                                $assigned_capsules = 0;
806
                            }
807
 
16983 efrain 808
                            $count_users++;
809
 
1 www 810
                            array_push($emails, $email);
811
                            array_push($users, [
16983 efrain 812
                                'id' => $count_users,
1 www 813
                                'first_name' => $first_name,
814
                                'last_name' => $last_name,
815
                                'password'  => $password,
816
                                'email' => $email,
817
                                'assigned_capsules' => $assigned_capsules,
15452 efrain 818
                                'company' => $company,
819
                                'function' => $function,
820
                                'group' => $group,
821
                                'institution' => $institution,
822
                                'program' => $program,
823
                                'partner' => $partner,
824
                                'sector' => $sector,
825
                                'studentType' => $studentType,
826
                                'country' => $country,
827
                                'isAdult' => $isAdult,
1 www 828
                            ]);
16983 efrain 829
                        } else {
830
                            $count_errors++;
831
                            array_push($errors,[
832
                                'id' => $count_errors,
833
                                'first_name' => $first_name,
834
                                'last_name' => $last_name,
835
                                'password'  => $password,
836
                                'email' => $email,
837
                                'status' => 'DUPLICATE IN EXCEL'
838
                            ]);
1 www 839
                        }
840
 
841
 
842
 
843
 
844
 
845
                    }
15457 efrain 846
 
1 www 847
 
848
                    $key = md5($currentUser->id . '-' . $topic->uuid . '-' . $capsule->uuid);
849
                    $this->cache->setItem($key, serialize($users));
850
 
851
                    return new JsonModel([
852
                        'success' => true,
853
                        'data' => [
854
                            'key' => $key,
855
                            'topic' => $topic->name,
856
                            'capsule' => $capsule->name,
16983 efrain 857
                            'items' => [
858
                                'ok' => $users,
859
                                'error' => $errors,
860
                            ],
1 www 861
                        ]
862
                    ]);
863
 
864
 
865
 
866
                } else {
867
                    $messages = [];
868
                    $form_messages = (array) $form->getMessages();
869
                    foreach($form_messages  as $fieldname => $field_messages)
870
                    {
871
 
872
                        $messages[$fieldname] = array_values($field_messages);
873
                    }
874
 
875
                    return new JsonModel([
876
                        'success'   => false,
877
                        'data'   => $messages
878
                    ]);
879
                }
880
            } else if($step == 'process') {
881
 
16766 efrain 882
                $key = Functions::sanitizeFilterString($this->params()->fromPost('key'));
1 www 883
                if(!$key) {
884
                    return new JsonModel([
885
                        'success' => false,
886
                        'data' => 'ERROR_CACHE_KEY_EMPTY'
887
                    ]);
888
                }
889
 
890
                $value = $this->cache->getItem($key);
891
                if(!$value) {
892
 
893
                    return new JsonModel([
894
                        'success' => false,
895
                        'data' => 'ERROR_CACHE_NOT_FOUND'
896
                    ]);
897
                }
898
 
899
                $records = unserialize($value);
900
                if(!$records) {
901
                    return new JsonModel([
902
                        'success' => false,
903
                        'data' => 'ERROR_CACHE_INVALID'
904
                    ]);
905
                }
906
 
16983 efrain 907
 
15455 efrain 908
 
16983 efrain 909
 
15453 efrain 910
                $networkMapper = NetworkMapper::getInstance($this->adapter);
911
                $companyMapper = CompanyMapper::getInstance($this->adapter);
912
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
913
 
914
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1 www 915
                $userMapper = UserMapper::getInstance($this->adapter);
916
                $userPasswordMapper = UserPasswordMapper::getInstance($this->adapter);
17002 efrain 917
                $capsuleUserMapper = MicrolearningCapsuleUserMapper::getInstance($this->adapter);
1 www 918
 
17002 efrain 919
                $microlearningExtendUserMapper = MicrolearningExtendUserMapper::getInstance($this->adapter);
920
                $microlearningExtendUserCompanyMapper = MicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
921
                $microlearningExtendUserFunctionMapper = MicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
922
                $microlearningExtendUserGroupMapper = MicrolearningExtendUserGroupMapper::getInstance($this->adapter);
923
                $microlearningExtendUserInstitutionMapper = MicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
924
                $microlearningExtendUserProgramMapper = MicrolearningExtendUserProgramMapper::getInstance($this->adapter);
925
                $microlearningExtendUserPartnerMapper = MicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
926
                $microlearningExtendUserSectorMapper = MicrolearningExtendUserSectorMapper::getInstance($this->adapter);
927
                $microlearningExtendUserStudentTypeMapper = MicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
928
                $microlearningExtendUserCountryMapper = MicrolearningExtendUserCountryMapper::getInstance($this->adapter);
4 efrain 929
 
1 www 930
 
15453 efrain 931
                $networkDefault = $networkMapper->fetchOneByDefault();
932
                $userDefaultForConnection = $userMapper->fetchOneDefaultForConnection();
933
 
934
                $companyForFollower = $companyMapper->fetchOneDefaultForFollowers();
15457 efrain 935
 
16983 efrain 936
                $csv = "FIRST NAME|LAST NAME|EMAIL|STATUS\r\n";
937
 
4 efrain 938
 
15457 efrain 939
                $users_processed = 0;
1 www 940
                $users_assigned = 0;
941
                $user_ids = [];
942
                foreach($records as $record)
943
                {
944
                    $first_name = $record['first_name'];
945
                    $last_name = $record['last_name'];
946
                    $password = $record['password'];
947
                    $email = $record['email'];
948
 
949
 
15452 efrain 950
                    $company = $record['company'];
951
                    $function = $record['function'];
952
                    $group = $record['group'];
953
                    $institution = $record['institution'];
954
                    $program = $record['program'];
955
                    $partner = $record['partner'];
956
                    $sector = $record['sector'];
957
                    $studentType = $record['studentType'];
958
                    $country = $record['country'];
15453 efrain 959
                    $isAdult = strtolower(trim( $record['isAdult'])) == User::IS_ADULT_YES;
960
 
961
 
1 www 962
                    $user = $userMapper->fetchOneByEmail($email);
963
                    if(!$user) {
964
 
965
 
129 efrain 966
                        if($password) {
967
                            $password_hash = password_hash($password, PASSWORD_DEFAULT);
968
 
969
                            $user = new User();
970
 
15452 efrain 971
                            $user->network_id = $currentNetwork->id;
129 efrain 972
                            $user->blocked = User::BLOCKED_NO;
973
                            $user->email_verified = User::EMAIL_VERIFIED_YES;
974
                            $user->email = $email;
975
                            $user->first_name = $first_name;
976
                            $user->last_name = $last_name;
977
                            $user->password = $password_hash;
978
                            $user->login_attempt = 0;
979
                            $user->usertype_id = UserType::USER;
980
                            $user->status = User::STATUS_ACTIVE;
15453 efrain 981
                            $user->is_adult = $isAdult ? User::IS_ADULT_YES : User::IS_ADULT_NO;
129 efrain 982
 
983
                            $result = $userMapper->insert($user);
984
                            if($result) {
985
                                $userPassword = new UserPassword();
986
                                $userPassword->user_id = $user->id;
987
                                $userPassword->password = $password_hash;
988
                                $userPasswordMapper->insert($userPassword);
16983 efrain 989
 
990
 
991
                                $csv .= "$first_name|$last_name|$email|CREATE USER \r\n";
129 efrain 992
                            } else {
16983 efrain 993
                                $csv .= "$first_name|$last_name|$email|FAIL CREATE USER \r\n";
994
 
129 efrain 995
                                continue;
996
                            }
15453 efrain 997
 
129 efrain 998
                        }
999
                    } else {
15453 efrain 1000
                        $user->is_adult = $isAdult ? User::IS_ADULT_YES : User::IS_ADULT_NO;
129 efrain 1001
                        if($user->email_verified == User::EMAIL_VERIFIED_NO || $user->status != User::STATUS_ACTIVE) {
1002
                            $user->email_verified = User::EMAIL_VERIFIED_YES;
1003
                            $user->status != User::STATUS_ACTIVE;
1004
 
15453 efrain 1005
 
129 efrain 1006
                        }
15453 efrain 1007
                        if(!$userMapper->update($user)) {
16983 efrain 1008
                            $csv .= "$first_name|$last_name|$email|FAIL UPDATE USER \r\n";
15453 efrain 1009
                            continue;
1010
                        }
129 efrain 1011
 
1012
 
1 www 1013
                    }
1014
 
15453 efrain 1015
 
1016
                    $user_id_in_default_network = 0;
1017
                    if($user->is_adult == User::IS_ADULT_YES) {
1018
 
1019
                        if($currentNetwork->default == Network::DEFAULT_YES) {
1020
 
1021
                            $user_id_in_default_network = $user->id;
1022
 
1023
 
1024
 
1025
                        } else {
1026
 
1027
                            $userInDefaultNetwork = $userMapper->fetchOneByEmailAndNetworkId($user->email, $networkDefault->id);
1028
                            if($userInDefaultNetwork) {
1029
                                $user_id_in_default_network = $userInDefaultNetwork->id;
1030
 
1031
                                if($userInDefaultNetwork->email_verified == User::EMAIL_VERIFIED_NO || $userInDefaultNetwork->status != User::STATUS_ACTIVE) {
1032
                                    $userInDefaultNetwork->email_verified = User::EMAIL_VERIFIED_YES;
1033
                                    $userInDefaultNetwork->status != User::STATUS_ACTIVE;
1034
 
1035
                                    if(!$userMapper->update($userInDefaultNetwork)) {
16983 efrain 1036
                                        $csv .= "$first_name|$last_name|$email|FAIL UPDATE USER IN DEFAULT NETWORK \r\n";
15453 efrain 1037
                                        continue;
1038
                                    }
1039
                                }
1040
 
1041
 
1042
                            } else {
1043
                                $userInDefaultNetwork = new User();
1044
                                $userInDefaultNetwork->network_id = $networkDefault->id;
1045
                                $userInDefaultNetwork->blocked = User::BLOCKED_NO;
1046
                                $userInDefaultNetwork->email_verified = User::EMAIL_VERIFIED_YES;
1047
                                $userInDefaultNetwork->email = $email;
1048
                                $userInDefaultNetwork->first_name = $first_name;
1049
                                $userInDefaultNetwork->last_name = $last_name;
1050
                                $userInDefaultNetwork->password = $password_hash;
1051
                                $userInDefaultNetwork->login_attempt = 0;
1052
                                $userInDefaultNetwork->usertype_id = UserType::USER;
1053
                                $userInDefaultNetwork->status = User::STATUS_ACTIVE;
1054
                                $userInDefaultNetwork->is_adult = $isAdult == User::IS_ADULT_YES;
1055
                                $result = $userMapper->insert($userInDefaultNetwork);
1056
                                if($result) {
1057
                                    $user_id_in_default_network = $userInDefaultNetwork->id;
1058
 
1059
 
1060
                                    $userPassword = new UserPassword();
1061
                                    $userPassword->user_id = $userInDefaultNetwork->id;
1062
                                    $userPassword->password = $password_hash;
1063
                                    $userPasswordMapper->insert($userPassword);
16983 efrain 1064
 
1065
                                    $csv .= "$first_name|$last_name|$email|CREATE USER IN DEFAULT NETWORK \r\n";
1066
                                } else {
1067
                                    $csv .= "$first_name|$last_name|$email|FAIL CREATE USER IN DEFAULT NETWORK \r\n";
15453 efrain 1068
                                }
1069
 
1070
                            }
1071
 
1072
 
1073
                        }
1074
                    }
1075
 
1076
                    if($user_id_in_default_network) {
1077
 
1078
                        if($userDefaultForConnection) {
1079
 
1080
                            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($userDefaultForConnection->id, $user_id_in_default_network);
1081
                            if($connection) {
1082
                                if($connection->status != Connection::STATUS_ACCEPTED) {
1083
                                    $connection->status = Connection::STATUS_ACCEPTED;
1084
                                    $connectionMapper->update($connection);
1085
 
1086
                                }
1087
 
1088
 
1089
                            } else {
1090
                                $connection = new Connection();
1091
                                $connection->request_to = $user_id_in_default_network;
1092
                                $connection->request_from = $userDefaultForConnection->id;
1093
                                $connection->status = Connection::STATUS_ACCEPTED;
1094
                                $connectionMapper->insert($connection);
1095
                            }
1096
                        }
1097
 
1098
                        if($companyForFollower) {
1099
                            $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($companyForFollower->id, $user_id_in_default_network);
1100
                            if(!$companyFollower) {
1101
                                $companyFollower = new CompanyFollower();
1102
                                $companyFollower->company_id = $companyForFollower->id;
1103
                                $companyFollower->follower_id = $user_id_in_default_network;
1104
 
1105
                                $companyFollowerMapper->insert($companyFollower);
1106
 
1107
 
1108
                            }
1109
                        }
1110
 
1111
 
1112
                    }
1113
 
1114
 
1 www 1115
                    if(!in_array($user->id, $user_ids)) {
1116
                        array_push($user_ids, $user->id);
1117
                    }
1118
 
4 efrain 1119
                    /*
1120
                    echo '$filterCompany = ' . $filterCompany . PHP_EOL;
1121
                    echo '$filterFunctio = ' . $filterFunction . PHP_EOL;
1122
                    echo '$filterGroup = ' . $filterGroup . PHP_EOL;
1123
                    echo '$filterInstitution = ' . $filterInstitution . PHP_EOL;
1124
                    echo '$filterPartner = ' . $filterPartner . PHP_EOL;
1125
                    echo '$filterProgram = ' . $filterProgram . PHP_EOL;
1126
                    echo '$filterSector = ' . $filterSector . PHP_EOL;
1127
                    echo '$filterStudentType = ' . $filterStudentType . PHP_EOL;
1128
                  */
1129
 
1130
 
17002 efrain 1131
                    $extendUser = $microlearningExtendUserMapper->fetchOneByCompanyIdAndUserId($currentCompany->id, $user->id);
4 efrain 1132
                    if(!$extendUser) {
17002 efrain 1133
                        $extendUser = new MicrolearningExtendUser();
4 efrain 1134
                        $extendUser->company_id = $currentCompany->id;
1135
                        $extendUser->user_id = $user->id;
1136
                    }
1137
 
1138
 
15452 efrain 1139
                    if($company) {
17002 efrain 1140
                        $record = $microlearningExtendUserCompanyMapper->fetchOneByCompanyIdAndName($currentCompany->id, $company);
4 efrain 1141
 
1142
                        if(!$record) {
17002 efrain 1143
                            $record = new MicrolearningExtendUserCompany();
4 efrain 1144
                            $record->company_id = $currentCompany->id;
15452 efrain 1145
                            $record->name = $company;
1 www 1146
 
17002 efrain 1147
                            $microlearningExtendUserCompanyMapper->insert($record);
4 efrain 1148
                        }
1149
 
1150
 
1151
 
1 www 1152
 
4 efrain 1153
                        if($record->id) {
1154
                            $extendUser->extend_company_id = $record->id;
1155
                        }
1156
                    }
1 www 1157
 
15452 efrain 1158
                    if($function) {
17002 efrain 1159
                        $record = $microlearningExtendUserFunctionMapper->fetchOneByCompanyIdAndName($currentCompany->id, $function);
4 efrain 1160
                        if(!$record) {
17002 efrain 1161
                            $record = new MicrolearningExtendUserFunction();
4 efrain 1162
                            $record->company_id = $currentCompany->id;
15452 efrain 1163
                            $record->name = $function;
1 www 1164
 
17002 efrain 1165
                            $microlearningExtendUserFunctionMapper->insert($record);
4 efrain 1166
                        }
1 www 1167
 
4 efrain 1168
                        if($record->id) {
1169
                            $extendUser->extend_function_id = $record->id;
1170
                        }
1171
                    }
1 www 1172
 
15452 efrain 1173
                    if($group) {
17002 efrain 1174
                        $record = $microlearningExtendUserGroupMapper->fetchOneByCompanyIdAndName($currentCompany->id, $group);
4 efrain 1175
                        if(!$record) {
17002 efrain 1176
                            $record = new MicrolearningExtendUserGroup();
4 efrain 1177
                            $record->company_id = $currentCompany->id;
15452 efrain 1178
                            $record->name = $group;
1 www 1179
 
17002 efrain 1180
                            $microlearningExtendUserGroupMapper->insert($record);
4 efrain 1181
                        }
1 www 1182
 
4 efrain 1183
                        if($record->id) {
1184
                            $extendUser->extend_group_id = $record->id;
1185
                        }
1186
                    }
1 www 1187
 
15452 efrain 1188
                    if($institution) {
17002 efrain 1189
                        $record = $microlearningExtendUserInstitutionMapper->fetchOneByCompanyIdAndName($currentCompany->id, $institution);
4 efrain 1190
                        if(!$record) {
17002 efrain 1191
                            $record = new MicrolearningExtendUserInstitution();
4 efrain 1192
                            $record->company_id = $currentCompany->id;
15452 efrain 1193
                            $record->name = $institution;
1 www 1194
 
17002 efrain 1195
                            $microlearningExtendUserInstitutionMapper->insert($record);
4 efrain 1196
                        }
1 www 1197
 
4 efrain 1198
                        if($record->id) {
1199
                            $extendUser->extend_institution_id = $record->id;
1200
                        }
1201
                    }
1 www 1202
 
15452 efrain 1203
                    if($program) {
17002 efrain 1204
                        $record = $microlearningExtendUserProgramMapper->fetchOneByCompanyIdAndName($currentCompany->id, $program);
4 efrain 1205
                        if(!$record) {
17002 efrain 1206
                            $record = new MicrolearningExtendUserProgram();
4 efrain 1207
                            $record->company_id = $currentCompany->id;
15452 efrain 1208
                            $record->name = $program;
1 www 1209
 
17002 efrain 1210
                            $microlearningExtendUserProgramMapper->insert($record);
4 efrain 1211
                        }
1 www 1212
 
4 efrain 1213
                        if($record->id) {
1214
                            $extendUser->extend_program_id = $record->id;
1215
                        }
1216
                    }
1 www 1217
 
15452 efrain 1218
                    if($partner) {
4 efrain 1219
 
1220
 
17002 efrain 1221
                        $record = $microlearningExtendUserPartnerMapper->fetchOneByCompanyIdAndName($currentCompany->id, $partner);
4 efrain 1222
                        if(!$record) {
17002 efrain 1223
                            $record = new MicrolearningExtendUserPartner();
4 efrain 1224
                            $record->company_id = $currentCompany->id;
15452 efrain 1225
                            $record->name = $partner;
1 www 1226
 
17002 efrain 1227
                            $microlearningExtendUserPartnerMapper->insert($record);
4 efrain 1228
                        }
1 www 1229
 
4 efrain 1230
                        if($record->id) {
1231
                            $extendUser->extend_partner_id = $record->id;
1232
                        }
1233
                    }
1 www 1234
 
15452 efrain 1235
                    if($sector) {
17002 efrain 1236
                        $record = $microlearningExtendUserSectorMapper->fetchOneByCompanyIdAndName($currentCompany->id, $sector);
4 efrain 1237
                        if(!$record) {
17002 efrain 1238
                            $record = new MicrolearningExtendUserSector();
4 efrain 1239
                            $record->company_id = $currentCompany->id;
15452 efrain 1240
                            $record->name = $sector;
1 www 1241
 
17002 efrain 1242
                            $microlearningExtendUserSectorMapper->insert($record);
4 efrain 1243
                        }
1 www 1244
 
4 efrain 1245
                        if($record->id) {
1246
                            $extendUser->extend_sector_id = $record->id;
1247
                        }
1248
                    }
1 www 1249
 
15452 efrain 1250
                    if($studentType) {
17002 efrain 1251
                        $record = $microlearningExtendUserStudentTypeMapper->fetchOneByCompanyIdAndName($currentCompany->id, $studentType);
4 efrain 1252
                        if(!$record) {
17002 efrain 1253
                            $record = new MicrolearningExtendUserStudentType();
4 efrain 1254
                            $record->company_id = $currentCompany->id;
15452 efrain 1255
                            $record->name = $studentType;
1 www 1256
 
17002 efrain 1257
                            $microlearningExtendUserStudentTypeMapper->insert($record);
4 efrain 1258
                        }
1259
                        if($record->id) {
1260
                            $extendUser->extend_student_type_id = $record->id;
1261
                        }
1262
                    }
1263
 
15452 efrain 1264
                    if($country) {
17002 efrain 1265
                        $record = $microlearningExtendUserCountryMapper->fetchOneByCompanyIdAndName($currentCompany->id, $country);
15452 efrain 1266
                        if(!$record) {
17002 efrain 1267
                            $record = new MicrolearningExtendUserCountry();
15452 efrain 1268
                            $record->company_id = $currentCompany->id;
1269
                            $record->name = $country;
1270
 
17002 efrain 1271
                            $microlearningExtendUserCountryMapper->insert($record);
15452 efrain 1272
                        }
1273
                        if($record->id) {
1274
                            $extendUser->extend_country_id = $record->id;
1275
                        }
1276
                    }
4 efrain 1277
 
1278
 
15452 efrain 1279
 
1280
 
1 www 1281
 
4 efrain 1282
                    if($extendUser->id) {
17002 efrain 1283
                       $result =   $microlearningExtendUserMapper->update($extendUser);
4 efrain 1284
                    } else {
17002 efrain 1285
                       $result = $microlearningExtendUserMapper->insert($extendUser);
4 efrain 1286
                    }
1287
 
1288
 
1289
 
1 www 1290
                }
1291
 
17000 efrain 1292
                $notificationMapper = NotificationMapper::getInstance($this->adapter);
4 efrain 1293
 
16998 efrain 1294
 
15457 efrain 1295
                $users_processed = 0;
1296
                $users_previous = 0;
1 www 1297
                foreach($user_ids as $user_id)
1298
                {
16983 efrain 1299
                    $user = $userMapper->fetchOne($user_id);
1300
                    $first_name = $user->first_name;
1301
                    $last_name = $user->last_name;
1302
                    $email = $user->email;
15457 efrain 1303
 
16983 efrain 1304
 
15457 efrain 1305
                    $users_processed++;
1 www 1306
                    $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user_id, $capsule->id);
15457 efrain 1307
                    if($capsuleUser) {
1308
                        $users_previous++;
16983 efrain 1309
                        $csv .= "$first_name|$last_name|$email|PREVIOUS FOUND \r\n";
15457 efrain 1310
                    } else {
17002 efrain 1311
                        $capsuleUser = new MicrolearningCapsuleUser();
1 www 1312
                        $capsuleUser->company_id = $capsule->company_id;
1313
                        $capsuleUser->topic_id = $capsule->topic_id;
1314
                        $capsuleUser->capsule_id = $capsule->id;
1315
                        $capsuleUser->user_id = $user_id;
17002 efrain 1316
                        $capsuleUser->access = MicrolearningCapsuleUser::ACCESS_UNLIMITED;
1 www 1317
 
1318
                        if($capsuleUserMapper->insert($capsuleUser)) {
16998 efrain 1319
 
1320
                            $notification = new Notification();
1321
                            $notification->company_id = $capsule->company_id;
1322
                            $notification->user_id = $user_id;
1323
                            $notification->topic_id = $capsule->topic_id;
1324
                            $notification->capsule_id = $capsule->id;
1325
                            $notification->type = Notification::TYPE_NEW_MICROLEARNING_CAPSULE;
17001 efrain 1326
                            $notification->message  = 'LABEL_NOTIFICATION_NEW_MICROLEARNING_CAPSULE' . ' : ' . $capsule->name;
16998 efrain 1327
                            $notification->url      = '/microlearning/capsules/' . $capsule->uuid .  '/detail';
1328
 
1329
                            $notificationMapper->insert($notification);
1330
 
1331
 
16983 efrain 1332
                            $csv .= "$first_name|$last_name|$email|CAPSULE USER ASSIGNED\r\n";
1 www 1333
                            $users_assigned++;
1334
 
1335
 
1336
                            $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
1337
                            if($capsuleUser) {
17002 efrain 1338
                                $microlearningUserMapper = MicrolearningUserMapper::getInstance($this->adapter);
1339
                                $microlearningUser = $microlearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
1340
                                if($microlearningUser) {
1341
                                    $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 1342
 
17002 efrain 1343
                                    $microlearningUserMapper->update($microlearningUser);
1 www 1344
 
1345
                                } else {
17002 efrain 1346
                                    $microlearningUser = new MicrolearningUser();
1347
                                    $microlearningUser->company_id = $capsuleUser->company_id;
1348
                                    $microlearningUser->user_id = $capsuleUser->user_id;
1349
                                    $microlearningUser->added_on = $capsuleUser->added_on;
1350
                                    $microlearningUser->updated_on = $capsuleUser->updated_on;
1 www 1351
 
17002 efrain 1352
                                    $microlearningUserMapper->insert($microlearningUser);
1 www 1353
                                }
1354
                            }
16983 efrain 1355
                        } else {
1356
                            $csv .= "$first_name|$last_name|$email|CAPSULE USER PREVIOUS \r\n";
1 www 1357
                        }
1358
 
1359
                    }
1360
 
1361
 
1362
 
1363
                }
1364
 
17002 efrain 1365
                $users_in_the_capsule = $capsuleUserMapper->fetchCountByCompanyIdAndCapsuleId($capsule->company_id, $capsule->id);
15457 efrain 1366
 
1 www 1367
                return new JsonModel([
1368
                    'success' => true,
1369
                    'data' => [
15457 efrain 1370
                        'users_assigned' => $users_assigned,
1371
                        'users_processed' => $users_processed,
1372
                        'users_in_the_capsule' => $users_in_the_capsule,
16983 efrain 1373
                        'users_previous' => $users_previous,
1374
                        'csv_base64_content' => base64_encode($csv),
1375
                        'csv_filename' => 'capsule-users-' .date('Y-m-d-h-i-s').  '.csv'
1 www 1376
                    ]
1377
                ]);
1378
 
1379
 
1380
 
1381
 
1382
            } else {
1383
                return new JsonModel([
1384
                    'success' => false,
1385
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1386
                ]);
1387
            }
1388
 
1389
 
1390
 
1391
 
1392
        }
1393
 
1394
        return new JsonModel([
1395
            'success' => false,
1396
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1397
        ]);
1398
    }
1399
 
1400
    public function notificationAction()
1401
    {
1402
        $request = $this->getRequest();
1403
 
1404
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1405
        $currentUser    = $currentUserPlugin->getUser();
1406
        $currentCompany = $currentUserPlugin->getCompany();
1407
 
1408
        $request    = $this->getRequest();
1409
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
1410
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
1411
 
1412
 
17002 efrain 1413
        $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
1 www 1414
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
1415
        if(!$topic) {
1416
            return new JsonModel([
1417
                'success'   => false,
1418
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
1419
            ]);
1420
        }
1421
 
1422
 
1423
 
1424
        if($topic->company_id != $currentCompany->id) {
1425
            return new JsonModel([
1426
                'success'   => false,
1427
                'data'   => 'ERROR_UNAUTHORIZED'
1428
            ]);
1429
        }
1430
 
17002 efrain 1431
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 1432
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
1433
        if(!$capsule) {
1434
            return new JsonModel([
1435
                'success'   => false,
1436
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
1437
            ]);
1438
        }
1439
 
1440
 
1441
        if($capsule->topic_id != $topic->id) {
1442
            return new JsonModel([
1443
                'success'   => false,
1444
                'data'   => 'ERROR_UNAUTHORIZED'
1445
            ]);
1446
        }
1447
 
1448
 
1449
        if($request->isPost()) {
1450
            $dataPost = $request->getPost()->toArray();
15390 efrain 1451
            $form = new PushMicrolearningNotificationForm($this->adapter, $currentCompany->id);
1 www 1452
 
1453
            $form->setData($dataPost);
1454
 
1455
            if($form->isValid()) {
1456
                $customer_uuids = $this->params()->fromPost('customer_uuids');
1457
                if(!$customer_uuids) {
1458
                    return new JsonModel([
1459
                        'success' => false,
1460
                        'data' => 'ERROR_NOT_SELECTED_CUSTOMERS'
1461
                    ]);
1462
 
1463
                }
1464
 
16766 efrain 1465
                $push_template_uuid = Functions::sanitizeFilterString($form->get('push_template_id')->getValue());
1 www 1466
                $pushMapper = PushMapper::getInstance($this->adapter);
1467
                $pushTemplateMapper = PushTemplateMapper::getInstance($this->adapter);
1468
                $pushTemplate = $pushTemplateMapper->fetchOneByUuid($push_template_uuid);
1469
 
1470
                if(!$pushTemplate) {
1471
                    return new JsonModel([
1472
                        'success' => false,
1473
                        'data' => 'ERROR_PUSH_TEMPLATE_NOT_FOUND'
1474
                    ]);
1475
                }
1476
 
1477
 
1478
 
1479
                $applicationMapper = ApplicationMapper::getInstance($this->adapter);
1480
                $application = $applicationMapper->fetchOne(Application::TWOGETSKILLS);
1481
 
17002 efrain 1482
                $capsuleUserMapper = MicrolearningCapsuleUserMapper::getInstance($this->adapter);
1 www 1483
 
1484
                $push_to_send = 0;
1485
 
1486
 
1487
 
1488
                $userMapper = UserMapper::getInstance($this->adapter);
1489
                $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
1490
                foreach($customer_uuids as $customer_uuid)
1491
                {
1492
 
1493
 
1494
                    $user = $userMapper->fetchOneByUuid($customer_uuid);
1495
                    if(!$user) {
1496
                        continue;
1497
                    }
1498
 
1499
                    $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
1500
                    if(!$capsuleUser) {
1501
                        continue;
1502
                    }
1503
 
1504
 
13755 efrain 1505
                    //$token = $deviceHistoryMapper->fetchLastDeviceTokenByApplicationIdAndUserId(Application::TWOGETSKILLS, $user->id);
1506
                    $device = $deviceHistoryMapper->fetchLastDeviceByApplicationIdAndUserId(Application::TWOGETSKILLS, $user->id);
1 www 1507
 
13755 efrain 1508
 
1509
 
1510
                    if($device && $device->token) {
1511
 
1512
                        $key = $application->key;
1513
                        if($device->variant_id) {
1514
 
1515
                            $applicationVariantMapper = ApplicationVariantMapper::getInstance($this->adapter);
1516
                            $applicationVariant = $applicationVariantMapper->fetchOneByApplicationIdAndVariantId($device->application_id, $device->variant_id);
1517
                            if($applicationVariant) {
1518
                                $key = $applicationVariant->key;
1519
                            } else {
1520
                                $applicationVariant = $applicationVariantMapper->fetchOneByApplicationIdAndDefault($device->application_id);
1521
                                if($applicationVariant) {
1522
                                    $key = $applicationVariant->key;
1523
                                }
1524
                            }
1525
 
1526
                        }
1527
 
1 www 1528
                        $push = new Push();
1529
                        $push->status = Push::STATUS_PENDING;
1530
                        $push->data = json_encode([
1531
                            'server' => [
13755 efrain 1532
                                'key' => $key,
1 www 1533
                            ],
1534
                            'push' => [
1535
                                'registration_ids'   => [
13755 efrain 1536
                                    $device->token,
1 www 1537
                                ],
1538
                                'notification' => [
1539
                                    'body' =>  $pushTemplate->body,
1540
                                    'title' => $pushTemplate->title,
1541
                                    'vibrate' => 1,
1542
                                    'sound' =>  1
1543
                                ],
1671 efrain 1544
                                'data' => [
10435 efrain 1545
                                    'command' => 'content-refresh',
1546
                                    'new_capsules' => '0',
1671 efrain 1547
                                ]
1 www 1548
                            ]
1549
                        ]);
1550
 
1551
                        if($pushMapper->insert($push)) {
1552
                            $push_to_send = $push_to_send + 1;
1553
                        }
1554
 
1555
                    }
1556
                }
1557
 
1558
                if(0 == $push_to_send) {
1559
                    return new JsonModel([
1560
                        'success' => false,
1561
                        'data' => 'ERROR_NO_USER_DEVICES_WERE_FOUND_TO_SEND_PUSH'
1562
                    ]);
1563
                }
1564
 
1565
 
1566
 
1567
 
1568
 
1569
                return new JsonModel([
1570
                    'success' => true,
1571
                    'data' => [
1572
                        'push_to_send' => $push_to_send,
1573
                    ]
1574
                ]);
1575
 
1576
 
1577
 
1578
 
1579
 
1580
            } else {
1581
 
1582
                $messages = [];
1583
                $form_messages = (array) $form->getMessages();
1584
                foreach($form_messages  as $fieldname => $field_messages)
1585
                {
1586
                    $messages[$fieldname] = array_values($field_messages);
1587
                }
1588
 
1589
                return new JsonModel([
1590
                    'success'   => false,
1591
                    'data'      => $messages
1592
                ]);
1593
            }
1594
        }
1595
 
1596
        return new JsonModel([
1597
            'success' => false,
1598
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1599
        ]);
1600
    }
1601
 
1602
 
1603
}