Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 1651 | Rev 1683 | 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
 
7
use Laminas\Authentication\AuthenticationService;
8
use Laminas\Authentication\Result as AuthResult;
9
use Laminas\Db\Adapter\AdapterInterface;
10
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
11
use Laminas\Mvc\Controller\AbstractActionController;
12
use Laminas\Log\LoggerInterface;
13
use Laminas\View\Model\JsonModel;
14
 
15
use LeadersLinked\Authentication\AuthAdapter;
16
use LeadersLinked\Mapper\UserMapper;
17
use LeadersLinked\Mapper\EmailTemplateMapper;
18
use LeadersLinked\Model\User;
19
use LeadersLinked\Model\UserType;
20
 
219 efrain 21
use LeadersLinked\Library\AesCipher;
1 www 22
use LeadersLinked\Library\QueueEmail;
23
use LeadersLinked\Library\Functions;
24
use LeadersLinked\Model\EmailTemplate;
25
use LeadersLinked\Mapper\UserPasswordMapper;
26
use LeadersLinked\Mapper\DeviceMapper;
27
use LeadersLinked\Model\Device;
28
use LeadersLinked\Mapper\ApplicationMapper;
29
use LeadersLinked\Model\Application;
30
use LeadersLinked\Validator\PasswordStrengthCheck;
31
 
32
use LeadersLinked\Mapper\CompanyMapper;
33
use LeadersLinked\Model\Company;
34
use LeadersLinked\Mapper\CompanyMicrolearningTopicMapper;
35
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleMapper;
36
use LeadersLinked\Mapper\CompanyMicrolearningSlideMapper;
37
use LeadersLinked\Model\CompanyMicrolearningSlide;
38
use LeadersLinked\Mapper\CompanyMicrolearningUserLogMapper;
39
use LeadersLinked\Mapper\CompanyMicrolearningUserProgressMapper;
40
use LeadersLinked\Mapper\CompanyMicrolearningQuizMapper;
41
use LeadersLinked\Mapper\CompanyMicrolearningQuestionMapper;
42
use LeadersLinked\Mapper\CompanyMicrolearningAnswerMapper;
43
use LeadersLinked\Model\CompanyMicrolearningUserProgress;
44
use LeadersLinked\Model\CompanyMicrolearningUserLog;
45
use LeadersLinked\Mapper\DeviceHistoryMapper;
46
use LeadersLinked\Model\DeviceHistory;
47
use LeadersLinked\Mapper\PushMapper;
48
use LeadersLinked\Model\Push;
49
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;
50
use LeadersLinked\Mapper\CompanyServiceMapper;
51
use LeadersLinked\Model\Service;
52
use LeadersLinked\Model\CompanyService;
53
use LeadersLinked\Model\CompanyMicrolearningCapsuleUser;
54
use LeadersLinked\Model\CompanyMicrolearningUserQuiz;
55
use LeadersLinked\Mapper\CompanyMicrolearningUserQuizMapper;
56
use LeadersLinked\Mapper\CompanyMicrolearningUserMapper;
57
use LeadersLinked\Model\CompanyMicrolearningUser;
58
use LeadersLinked\Mapper\PushTemplateMapper;
59
use LeadersLinked\Model\PushTemplate;
41 efrain 60
use LeadersLinked\Mapper\SyncLogMapper;
61
use LeadersLinked\Model\SyncLog;
47 efrain 62
use LeadersLinked\Model\CompanyMicrolearningExtendUser;
63
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserMapper;
64
use LeadersLinked\Model\CompanyMicrolearningExtendUserCompany;
1323 efrain 65
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleCommentMapper;
47 efrain 66
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCompanyMapper;
67
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserFunctionMapper;
68
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserGroupMapper;
69
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserInstitutionMapper;
70
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserPartnerMapper;
71
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserProgramMapper;
72
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserStudentTypeMapper;
73
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserSectorMapper;
219 efrain 74
use Nullix\CryptoJsAes\CryptoJsAes;
258 efrain 75
use LeadersLinked\Model\CompanyMicrolearningTopic;
76
use LeadersLinked\Model\CompanyMicrolearningCapsule;
1 www 77
 
78
 
79
class ServiceController extends AbstractActionController
80
{
81
 
82
 
83
    /**
84
     *
85
     * @var AdapterInterface
86
     */
87
    private $adapter;
88
 
89
 
90
    /**
91
     *
92
     * @var AbstractAdapter
93
     */
94
    private $cache;
95
 
96
    /**
97
     *
98
     * @var  LoggerInterface
99
     */
100
    private $logger;
101
 
102
    /**
103
     *
104
     * @var array
105
     */
106
    private $config;
107
 
108
    /**
109
     *
110
     * @param AdapterInterface $adapter
111
     * @param AbstractAdapter $cache
112
     * @param LoggerInterface $logger
113
     * @param array $config
114
     */
115
    public function __construct($adapter, $cache , $logger, $config)
116
    {
117
        $this->adapter      = $adapter;
118
        $this->cache        = $cache;
119
        $this->logger       = $logger;
120
        $this->config       = $config;
121
    }
122
 
112 efrain 123
    public function indexAction()
124
    {
125
        return new JsonModel(['ok' => false]);
126
    }
127
 
1 www 128
    public function signoutAction()
129
    {
130
        $currentUser = $this->plugin('currentUserPlugin');
131
        if($currentUser->hasIdentity()) {
132
            $device_uuid = $currentUser->getDeviceId();
133
            if($device_uuid) {
134
                $deviceMapper = DeviceMapper::getInstance($this->adapter);
135
                $device = $deviceMapper->fetchOne($device_uuid);
136
                if($device) {
137
                    $deviceMapper->signout($device);
138
                }
139
            }
140
 
141
 
142
            $this->logger->info('Desconexión del mobile', ['user_id' => $currentUser->getUserId(), 'ip' => Functions::getUserIP()]);
143
        }
144
        $authService = new \Laminas\Authentication\AuthenticationService();
145
        $authService->clearIdentity();
146
 
147
        return new JsonModel([
148
            'success' => true,
149
            'data' => 'LABEL_SIGNOUT_SUCCESSFULL'
150
        ]);
151
    }
152
 
153
    public function fcmAction()
154
    {
155
        $request = $this->getRequest();
156
 
157
        if($request->isPost()) {
158
 
43 efrain 159
            //$rawdata = file_get_contents("php://input");
160
            //error_log('$rawdata = ' . $rawdata );
1 www 161
 
162
            $device_uuid      = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
163
            $token          = filter_var($this->params()->fromPost('token', ''), FILTER_SANITIZE_STRING);
164
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
165
 
166
            /*
167
            echo '$device_uuid = ' . $device_uuid .PHP_EOL;
168
            echo '$token = ' . $token .PHP_EOL;
169
            echo '$sync_id  = ' . $sync_id  .PHP_EOL;
170
            */
171
            $ok = $device_uuid && strlen($device_uuid) == 36 && $sync_id;
172
            $ok = $ok && strlen($token) <= 512;
173
 
174
 
175
            if(!$ok) {
176
                return new JsonModel([
177
                    'success' => false,
178
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
179
                ]);
180
            }
181
 
182
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
183
            $device = $deviceMapper->fetchOne($device_uuid);
184
            if(!$device) {
185
                return new JsonModel([
186
                    'success' => false,
187
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
188
                ]);
189
            }
190
 
191
 
192
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
193
            $application = $applicationMapper->fetchOne($device->application_id);
194
            if(!$application) {
195
                return new JsonModel([
196
                    'success' => false,
197
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
198
                ]);
199
            }
200
 
201
            if($application->status == Application::STATUS_INACTIVE) {
202
                return new JsonModel([
203
                    'success' => false,
204
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
205
                ]);
206
            }
207
 
41 efrain 208
 
209
            $syncLog = new SyncLog();
46 efrain 210
            $syncLog->data = json_encode(['token' => $token]);
41 efrain 211
            $syncLog->type = 'token';
212
            $syncLog->device_uuid = $device->id;
213
            $syncLog->ip = Functions::getUserIP();
214
 
215
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
216
            $syncLogMapper->insert($syncLog);
217
 
1 www 218
            $device->token = $token;
219
            $device->ip = Functions::getUserIP();
220
            $result = $deviceMapper->update($device);
221
 
222
 
223
            if($result) {
224
                return new JsonModel([
225
                    'success' => true,
226
                    'data' => [
227
                        'sync_id' => $sync_id
228
                    ]
229
                ]);
230
            } else {
231
                return new JsonModel([
232
                    'success' => false,
233
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
234
                ]);
235
            }
236
 
237
        }
238
 
239
        return new JsonModel([
240
            'success' => false,
241
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
242
        ]);
243
    }
244
 
245
    public function checkSessionAction()
246
    {
247
        $request = $this->getRequest();
248
 
249
        if($request->isPost()) {
250
            $device_uuid  = trim(filter_var($this->params()->fromPost('device_id', ''), FILTER_SANITIZE_STRING));
251
            $secret     = trim(filter_var($this->params()->fromPost('secret', ''), FILTER_SANITIZE_STRING));
252
            $rand       = filter_var($this->params()->fromPost('rand', ''), FILTER_SANITIZE_NUMBER_INT);
253
            $created    = trim(filter_var($this->params()->fromPost('created', ''), FILTER_SANITIZE_STRING));
254
 
255
            if(!$device_uuid || !$secret || !$rand || !$created) {
256
                return new JsonModel([
257
                    'success' => false,
258
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
259
                ]);
260
            }
261
 
262
            $dt = \DateTime::createFromFormat('Y-m-d\TH:i:s',  $created);
263
            if(!$dt) {
264
                return new JsonModel([
265
                    'success' => false,
266
                    'data' => 'ERROR_PARAMETERS_ARE_INCORRECTLY_FORMATTED'
267
                ]);
268
            }
269
 
270
 
271
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
272
            $device = $deviceMapper->fetchOne($device_uuid);
273
            if(!$device) {
274
                return new JsonModel([
275
                    'success' => false,
276
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
277
                ]);
278
            }
279
 
280
 
281
            $passworVerification = md5($device->password . ':' . $created . ':'  . $rand);
282
            if($secret != $passworVerification) {
283
                return new JsonModel([
284
                    'success' => false,
285
                    'data' => 'ERROR_WEBSERVICE_PASSWORD'
286
                ]);
287
            }
288
 
289
 
290
            $userMapper = UserMapper::getInstance($this->adapter);
291
            $user = $userMapper->fetchOne($device->user_id);
292
 
293
            if(User::BLOCKED_YES == $user->blocked) {
294
                return new JsonModel([
295
                    'success' => false,
296
                    'data' => 'ERROR_USER_IS_BLOCKED'
297
                ]);
298
            }
299
 
300
            if(User::STATUS_INACTIVE == $user->status) {
301
                return new JsonModel([
302
                    'success' => false,
303
                    'data' =>'ERROR_USER_IS_INACTIVE'
304
                ]);
305
            }
306
 
307
 
308
            return new JsonModel([
309
                'success' => true,
310
                'data' => [
311
                    'user_uuid' => $device->user_uuid
312
                ]
313
            ]);
314
 
315
        }
316
 
317
        return new JsonModel([
318
            'success' => false,
319
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
320
        ]);
321
    }
322
 
323
    public function deviceAction()
324
    {
325
 
43 efrain 326
        //$rawdata = file_get_contents("php://input");
327
        //error_log('$rawdata = ' . $rawdata );
1 www 328
 
329
        $request = $this->getRequest();
330
 
331
        if($request->isPost()) {
332
            //print_r($_POST);
333
 
334
 
335
            $application_id = filter_var($this->params()->fromPost('application_id', 0), FILTER_SANITIZE_NUMBER_INT);
336
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
337
            $manufacturer   = filter_var($this->params()->fromPost('manufacturer', ''), FILTER_SANITIZE_STRING);
338
            $platform       = filter_var($this->params()->fromPost('platform', ''), FILTER_SANITIZE_STRING);
339
            $brand          = filter_var($this->params()->fromPost('brand', ''), FILTER_SANITIZE_STRING);
340
            $version        = filter_var($this->params()->fromPost('version', ''), FILTER_SANITIZE_STRING);
341
            $model          = filter_var($this->params()->fromPost('model', ''), FILTER_SANITIZE_STRING);
342
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
343
 
344
            $ok = $application_id && $device_uuid && strlen($device_uuid) == 36 && $sync_id;
345
            $ok = $ok && strlen($manufacturer) <= 250;
346
            $ok = $ok && strlen($brand) <= 250;
347
            $ok = $ok && strlen($version) <= 250;
348
            $ok = $ok && strlen($model) <= 250;
349
 
350
            if(!$ok) {
351
                return new JsonModel([
352
                    'success' => false,
353
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
354
                ]);
355
            }
356
 
357
 
358
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
359
            $application = $applicationMapper->fetchOne($application_id);
360
            if(!$application) {
361
                return new JsonModel([
362
                    'success' => false,
363
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
364
                ]);
365
            }
366
 
367
            if($application->status == Application::STATUS_INACTIVE) {
368
                return new JsonModel([
369
                    'success' => false,
370
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
371
                ]);
372
            }
373
 
41 efrain 374
 
375
            $syncLog = new SyncLog();
376
            $syncLog->data = json_encode([
377
                'platform' => $platform,
378
                'manufacturer' => $manufacturer,
379
                'brand' => $brand,
380
                'version' => $version,
381
                'model' => $model,
382
            ]);
383
            $syncLog->type = 'device';
384
            $syncLog->device_uuid = $device_uuid;
385
            $syncLog->ip = Functions::getUserIP();
386
 
387
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
388
            $syncLogMapper->insert($syncLog);
389
 
390
 
1 www 391
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
392
            $device = $deviceMapper->fetchOne($device_uuid);
393
 
394
 
395
 
396
 
397
            if($device) {
398
                $device->platform       = $platform;
399
                $device->manufacturer   = $manufacturer;
400
                $device->brand          = $brand;
401
                $device->version        = $version;
402
                $device->model          = $model;
403
                $device->ip             = Functions::getUserIP();
404
                $result                 = $deviceMapper->update($device);
405
 
406
            } else {
407
                $device                 = new Device();
408
                $device->id             = $device_uuid;
409
                $device->application_id = $application->id;
410
                $device->manufacturer   = $manufacturer;
411
                $device->brand          = $brand;
412
                $device->version        = $version;
413
                $device->model          = $model;
414
                $device->platform       = $platform;
415
                $device->ip             = Functions::getUserIP();
416
                $device->aes            = Functions::generatePassword(16);
417
                $device->password       = Functions::generatePassword(32);
418
                $result                 = $deviceMapper->insert($device);
419
            }
420
 
421
 
422
 
423
            if($result) {
424
                return new JsonModel([
425
                    'success' => true,
426
                    'data' => [
427
                        'sync_id'   => $sync_id,
428
                        'aes'       => $device->aes,
429
                        'password'  => $device->password,
430
                    ]
431
                ]);
432
            } else {
433
                return new JsonModel([
434
                    'success' => false,
435
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
436
                ]);
437
            }
438
 
439
        }
440
 
441
        return new JsonModel([
442
            'success' => false,
443
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
444
        ]);
445
 
446
    }
447
 
448
    public function microlearningCheckChangesAction()
449
    {
450
        $request = $this->getRequest();
451
 
452
        if($request->isPost()) {
453
            $currentUserPlugin = $this->plugin('currentUserPlugin');
454
            $user = $currentUserPlugin->getUser();
455
 
113 efrain 456
            /*
112 efrain 457
            $rawdata = file_get_contents("php://input");
458
            error_log('url = ' . $_SERVER['REQUEST_URI']);
459
            error_log('query = ' . $_SERVER['QUERY_STRING']);
460
            error_log('$rawdata = ' . $rawdata );
113 efrain 461
            */
1 www 462
 
463
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
464
 
465
 
466
            $device_uuid        = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
467
            $max_date_changes   = filter_var($this->params()->fromPost('max_date_changes', ''), FILTER_SANITIZE_STRING);
112 efrain 468
            $max_ids            = filter_var($this->params()->fromPost('max_ids', 0), FILTER_SANITIZE_NUMBER_INT);
469
            $is_foreground      = filter_var($this->params()->fromPost('is_foreground', 0), FILTER_SANITIZE_NUMBER_INT);
1 www 470
 
471
            $ids = [];
472
            for($i = 1; $i <= $max_ids; $i++)
473
            {
474
                $id = filter_var($this->params()->fromPost('id_' . $i, ''), FILTER_SANITIZE_STRING);
475
                if(empty($id)) {
476
                    continue;
477
                }
478
 
479
                $pattern = '/[A-Za-z0-9\-]+\|[A-Za-z0-9\-]+/';
480
                $matches = [];  preg_match($pattern, $id, $matches, PREG_OFFSET_CAPTURE);
481
                if(count($matches) > 1) {
482
                    array_push($ids, $matches[0]);
483
                }
484
 
485
            }
486
 
112 efrain 487
            if(empty($ids)) {
488
                $max_date_changes = '';
489
            }  else {
1 www 490
 
491
 
112 efrain 492
                if($max_date_changes) {
493
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $max_date_changes);
494
                    if($dt) {
495
                      $max_date_changes = $dt->format('Y-m-d H:i:s');
496
                    } else {
497
                        $max_date_changes = '';
498
                    }
1 www 499
                } else {
500
                    $max_date_changes = '';
112 efrain 501
                }
502
            }
1 www 503
 
504
 
112 efrain 505
 
43 efrain 506
            //error_log('device_uuid = ' . $device_uuid . ' max_date_changes = ' . $max_date_changes);
1 www 507
 
508
            $ok = $device_uuid && strlen($device_uuid);
509
 
510
            if(!$ok) {
511
                return new JsonModel([
512
                    'success' => false,
513
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
514
                ]);
515
            }
516
 
517
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
518
            $device = $deviceMapper->fetchOne($device_uuid);
519
 
520
 
521
            if(!$device) {
522
                return new JsonModel([
523
                    'success' => false,
524
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
525
                ]);
526
            } else {
527
                $device->ip = Functions::getUserIP();
528
                $deviceMapper->update($device);
529
            }
530
 
531
            //Cargamos la fecha máxima del cambio
532
            $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
533
            $max_date_changes_db = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
534
 
112 efrain 535
 
536
 
537
 
1 www 538
            //Si la fecha es vacia agregamos la fecha máxima de la asignación de la capsula
539
            if(!$max_date_changes_db) {
540
                $companyUsers = [];
541
                $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
542
                $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
543
                foreach($capsules as $capsule)
544
                {
545
 
546
 
547
 
548
                    if(empty($companyUsers[$capsule->company_id])) {
549
                        $companyUsers[$capsule->company_id] = $capsule->updated_on;
550
                    } else {
551
 
552
                        if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
553
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
554
                        }
555
 
556
                    }
557
 
558
                }
559
 
560
                $max_date_changes_db = '';
561
                foreach($companyUsers as $company_id => $update_on)
562
                {
563
 
564
                    $max_date_changes_db = $max_date_changes_db < $update_on ? $update_on : $max_date_changes_db;
565
 
566
                    $companyMicrolearningUser = new CompanyMicrolearningUser();
567
                    $companyMicrolearningUser->company_id = $company_id;
568
                    $companyMicrolearningUser->user_id = $user->id;
569
                    $companyMicrolearningUser->added_on = $update_on;
570
                    $companyMicrolearningUser->updated_on = $update_on;
571
 
572
                    $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
573
                }
574
            }
575
 
112 efrain 576
            /*
577
            echo '$max_date_changes  = ' . $max_date_changes  . PHP_EOL;
578
            echo '$max_date_changes_db  = ' . $max_date_changes_db. PHP_EOL;
579
            exit;
580
            */
581
           // $max_date_changes = '';
1 www 582
 
43 efrain 583
 
1 www 584
            //Si la que tiene el dispositivo es diferente a la fecha máxima almacenada
585
            $newCapsules = 0;
586
            if($max_date_changes != $max_date_changes_db) {
587
                if(is_array($ids)) {
258 efrain 588
                    /*
1 www 589
                    $companyMicrolearningTopicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
590
                    $companyMicrolearningTopics = $companyMicrolearningTopicMapper->fetchAllActive();
591
 
592
                    $topics = [];
593
                    foreach($companyMicrolearningTopics as $topic)
594
                    {
595
                        $topics[$topic->id] = $topic->uuid;
596
                    }
597
 
598
                    $companyMicrolearningCapsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
112 efrain 599
                    $companyMicrolearningCapsules = $companyMicrolearningCapsuleMapper->fetchAllActive();
1 www 600
 
601
                    $capsules = [];
602
                    foreach($companyMicrolearningCapsules as $capsule)
603
                    {
604
                        $capsules[$capsule->id] = $capsule->uuid;
605
                    }
258 efrain 606
                    */
607
 
608
                    $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
609
                    $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
610
 
1 www 611
 
612
                    $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
258 efrain 613
                    $userCapsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
1 www 614
 
112 efrain 615
 
616
                    //print_r($user_capsules);
617
 
258 efrain 618
                    foreach($userCapsules as $userCapsule)
1 www 619
                    {
112 efrain 620
 
258 efrain 621
                        $topic  = $topicMapper->fetchOne($userCapsule->topic_id);
622
                        $capsule = $capsuleMapper->fetchOne($userCapsule->capsule_id);
112 efrain 623
 
258 efrain 624
                        if($topic && $capsule) {
625
                            if($topic->status == CompanyMicrolearningTopic::STATUS_ACTIVE && $capsule->status == CompanyMicrolearningCapsule::STATUS_ACTIVE) {
626
                                $key = $topic->uuid . '|' . $capsule->uuid;
627
                                if(!in_array($key, $ids)) {
628
                                    $newCapsules++;
629
                                }
630
                            }
1 www 631
                        }
632
                    }
633
                }
634
            }
635
 
112 efrain 636
            $dataSync = [];
637
 
1 www 638
            //echo 'Vamos a lanzar un PUSH' . PHP_EOL;
639
            if($newCapsules) {
640
 
112 efrain 641
 
642
                if($device->token && $is_foreground)
1 www 643
                {
644
 
645
                    $pushMapper = PushMapper::getInstance($this->adapter);
646
                    $pushTemplateMapper = PushTemplateMapper::getInstance($this->adapter);
647
                    $pushTemplate = $pushTemplateMapper->fetchOne(PushTemplate::ID_MICRO_LEARNING_NEW_CONTENT);
648
 
649
                    //echo 'PushTemplate' . PHP_EOL;
650
                    //print_r($pushTemplate);
651
 
652
                    $applicationMapper = ApplicationMapper::getInstance($this->adapter);
653
                    $application = $applicationMapper->fetchOne(Application::TWOGETSKILLS);
654
 
655
 
656
                    //echo 'Application';
657
                    //print_r($application);
658
                    if($pushTemplate && $application) {
659
                         $push = new Push();
660
                        $push->status = Push::STATUS_PENDING;
661
                        $push->data = json_encode([
662
                            'server' => [
663
                                'key' =>   $application->key,
664
                            ],
665
                            'push' => [
666
                                'registration_ids'   => [
667
                                    $device->token,
668
                                ],
669
                                'notification' => [
670
                                    'body' =>  $pushTemplate->body,
671
                                    'title' => $pushTemplate->title,
672
                                    'vibrate' => 1,
673
                                    'sound' =>  1,
674
 
675
 
676
                                ],
1610 efrain 677
                                'content_available' => true,
1 www 678
                                'data' => [
679
                                    'new_capsules' => $newCapsules,
680
                                ]
681
                            ]
682
                        ]);
112 efrain 683
 
684
 
685
                        //print_r($push);
686
 
1 www 687
                        $pushMapper->insert($push);
688
                    }
689
                }
690
 
258 efrain 691
                /*
112 efrain 692
                if(!$is_foreground) {
693
                    $dataSync = $this->getSyncData($user,false, false);
694
                }
258 efrain 695
                */
112 efrain 696
            }
1 www 697
 
698
 
699
            //error_log('$max_date_changes_db = ' . $max_date_changes_db);
700
 
701
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $max_date_changes_db);
702
            if($dt) {
703
                $max_date_changes_db = $dt->format($serviceDatetimeFormat);
704
            } else {
705
                $max_date_changes_db = '';
706
            }
707
 
1651 efrain 708
            $ratingAndComments = [];
709
 
710
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
711
            $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
712
 
713
            $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
714
            $userCapsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
715
 
716
            foreach($userCapsules as $userCapsule)
717
            {
718
                $capsule = $capsuleMapper->fetchOne($userCapsule->capsule_id);
719
                if($capsule) {
720
 
721
                    $record = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
722
 
723
 
724
                    array_push($ratingAndComments, [
725
                        'uuid' => $capsule->uuid,
726
                        'total_comments' => $record['total_comments'],
727
                        'total_rating' => $record['total_rating'],
728
                    ]);
729
                }
730
 
731
            }
732
 
733
 
734
 
735
 
1 www 736
            $data = [
737
                'success'   => true,
738
                'data'      =>[
739
                    'user' => [
1651 efrain 740
                        'uuid'              => $user->uuid,
741
                        'first_name'        => $user->first_name,
742
                        'last_name'         => $user->last_name,
743
                        'email'             => $user->email,
744
                        'image'             => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
258 efrain 745
                    ],
1651 efrain 746
                    'rating_and_comments'   => $ratingAndComments,
747
                    'new_capsules'          => $newCapsules,
748
                    'max_date_changes'      => $max_date_changes_db,
1610 efrain 749
 
258 efrain 750
                    'topics'            => [],
751
                    'quizzes'           => [],
752
                    'extended'          => [],
753
                ]
754
            ];
755
 
756
            /*
757
 
758
 
759
            $data = [
760
                'success'   => true,
761
                'data'      =>[
762
                    'user' => [
1 www 763
                        'uuid' => $user->uuid,
764
                        'first_name' => $user->first_name,
765
                        'last_name' => $user->last_name,
766
                        'email' => $user->email,
767
                        'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
768
                    ],
112 efrain 769
                    'new_capsules' => $newCapsules,
1 www 770
                    'max_date_changes' => $max_date_changes_db,
771
                    'topics'    => isset( $dataSync['topics'] ) ? $dataSync['topics'] : [],
772
                    'quizzes'   => isset( $dataSync['quizzes'] ) ? $dataSync['quizzes'] : [],
52 efrain 773
                    'extended'=> isset( $dataSync['extended'] ) ? $dataSync['extended'] : [],
1 www 774
                ]
775
            ];
258 efrain 776
            */
1 www 777
            return new JsonModel($data);
778
        }
779
 
780
        return new JsonModel([
781
            'success' => false,
782
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
783
        ]);
784
 
785
    }
786
 
787
 
788
 
789
    public function microlearningRefreshAction()
790
    {
791
        $request = $this->getRequest();
792
 
793
        if($request->isGet()) {
794
            $currentUserPlugin = $this->plugin('currentUserPlugin');
795
            $user = $currentUserPlugin->getUser();
796
 
797
            $dataSync = $this->getSyncData($user,false, false);
798
 
799
            //Cargamos la fecha máxima del cambio
800
            $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
801
            $max_date_changes_db = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
802
 
803
            //Si la fecha es vacia agregamos la fecha máxima de la asignación de la capsula
804
            if(!$max_date_changes_db) {
805
                $companyUsers = [];
806
                $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
807
                $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
808
                foreach($capsules as $capsule)
809
                {
810
 
811
 
812
 
813
                    if(empty($companyUsers[$capsule->company_id])) {
814
                        $companyUsers[$capsule->company_id] = $capsule->updated_on;
815
                    } else {
816
 
817
                        if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
818
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
819
                        }
820
 
821
                    }
822
 
823
                }
824
 
825
                $max_date_changes_db = '';
826
                foreach($companyUsers as $company_id => $update_on)
827
                {
828
 
829
                    $max_date_changes_db = $max_date_changes_db < $update_on ? $update_on : $max_date_changes_db;
830
 
831
                    $companyMicrolearningUser = new CompanyMicrolearningUser();
832
                    $companyMicrolearningUser->company_id = $company_id;
833
                    $companyMicrolearningUser->user_id = $user->id;
834
                    $companyMicrolearningUser->added_on = $update_on;
835
                    $companyMicrolearningUser->updated_on = $update_on;
836
 
837
                    $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
838
                }
839
            }
840
 
841
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $max_date_changes_db);
842
            if($dt) {
843
                $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
844
                $max_date_changes_db = $dt->format($serviceDatetimeFormat);
845
            } else {
846
                $max_date_changes_db = '';
847
            }
848
 
849
            return new JsonModel([
850
                'success'   => true,
851
                'data'      =>[
852
                    'user' => [
853
                        'uuid' => $user->uuid,
854
                        'first_name' => $user->first_name,
855
                        'last_name' => $user->last_name,
856
                        'email' => $user->email,
857
                        'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
858
                    ],
859
                    'max_date_changes' => $max_date_changes_db,
860
                    'topics'    => $dataSync['topics'],
861
                    'quizzes'   => $dataSync['quizzes'],
52 efrain 862
                    'extended'   => $dataSync['extended'],
1 www 863
 
864
                ]
865
            ]);
866
        }
867
 
868
        return new JsonModel([
869
            'success' => false,
870
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
871
        ]);
872
    }
873
 
874
 
875
    public function signinAction()
876
    {
877
        $request = $this->getRequest();
878
 
879
        if($request->isPost()) {
880
 
113 efrain 881
            /*
112 efrain 882
            $rawdata = file_get_contents("php://input");
883
            error_log('url = ' . $_SERVER['REQUEST_URI']);
884
            error_log('query = ' . $_SERVER['QUERY_STRING']);
885
            error_log('$rawdata = ' . $rawdata );
113 efrain 886
            */
1 www 887
 
888
            $application_id = filter_var($this->params()->fromPost('application_id', 0), FILTER_SANITIZE_NUMBER_INT);
889
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
228 efrain 890
            $email          = filter_var($this->params()->fromPost('email', ''), FILTER_SANITIZE_STRING);
1 www 891
            $password       = filter_var($this->params()->fromPost('password', ''), FILTER_SANITIZE_STRING);
219 efrain 892
            $encrypter      = filter_var($this->params()->fromPost('encrypter', ''), FILTER_SANITIZE_STRING);
1 www 893
 
894
 
895
 
896
            $ok = $application_id && $device_uuid && strlen($device_uuid) == 36;
897
            $ok = $ok && $email && $password;
898
            //$ok = $ok && in_array($encrypter, ['CryptoJsAes','RNCryptor','AesCipher']);
899
 
900
            if(!$ok) {
901
                return new JsonModel([
902
                    'success' => false,
903
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
904
                ]);
905
            }
906
 
907
 
908
            $applicationMapper = ApplicationMapper::getInstance($this->adapter);
909
            $application = $applicationMapper->fetchOne($application_id);
910
            if(!$application) {
911
                return new JsonModel([
912
                    'success' => false,
913
                    'data' => 'ERROR_APPLICATION_NOT_FOUND',
914
                ]);
915
            }
916
 
917
            if($application->status == Application::STATUS_INACTIVE) {
918
                return new JsonModel([
919
                    'success' => false,
920
                    'data' => 'ERROR_APPLICATION_IS_INACTIVE',
921
                ]);
922
            }
923
 
924
 
925
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
926
            $device = $deviceMapper->fetchOne($device_uuid);
927
            if(!$device) {
928
                $device                 = new Device();
929
                $device->id             = $device_uuid;
930
                $device->application_id = $application->id;
931
                $device->ip             = Functions::getUserIP();
932
                $device->aes            = Functions::generatePassword(16);
933
                $device->password       = Functions::generatePassword(32);
934
                $result                 = $deviceMapper->insert($device);
935
 
936
                if(!$result) {
937
                    return new JsonModel([
938
                        'success' => false,
939
                        'data' => 'ERROR_DEVICE_NOT_FOUND',
940
                    ]);
941
                }
942
            }
943
 
41 efrain 944
 
945
 
219 efrain 946
 
1 www 947
            if($encrypter == 'CryptoJsAes') {
948
 
949
 
950
                $email = html_entity_decode($email);
951
                $password = html_entity_decode($password);
952
 
953
 
954
                ob_start();
955
 
956
                $email      = CryptoJsAes::decrypt($email, $device->aes);
957
                $password   = CryptoJsAes::decrypt($password, $device->aes);
958
 
959
                ob_end_clean();
960
 
961
                if(!$email || !$password) {
962
                    return new JsonModel([
963
                        'success' => false,
964
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
965
                    ]);
966
                }
967
            } else if($encrypter == 'RNCryptor') {
226 efrain 968
 
228 efrain 969
                error_log("RNCryptor");
231 efrain 970
                error_log("Device UUID : " . $device->id);
228 efrain 971
                error_log("AES : " . $device->aes);
972
                error_log("Email Encrypted : " . $email);
973
                error_log("Password Encrypted : " . $password);
226 efrain 974
 
1 www 975
                $cryptor = new \RNCryptor\RNCryptor\Decryptor;
976
                $email = $cryptor->decrypt($email, $device->aes);
977
                $password = $cryptor->decrypt($password, $device->aes);
978
 
227 efrain 979
                error_log("Email Decrypted : " . $email . PHP_EOL);
980
                error_log("Password Decrypted : " . $password . PHP_EOL);
981
 
1 www 982
                if(!$email || !$password) {
983
                    return new JsonModel([
984
                        'success' => false,
985
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
986
                    ]);
987
                }
988
 
989
 
990
            } else if($encrypter == 'AesCipher') {
991
 
231 efrain 992
                error_log("AesCipher");
993
                error_log("Device UUID : " . $device->id);
994
                error_log("AES : " . $device->aes);
995
                error_log("Email Encrypted : " . $email);
996
                error_log("Password Encrypted : " . $password);
997
 
1 www 998
                $emailDecrypted = AesCipher::decrypt($device->aes,$email);
999
                $passwordDecrypted = AesCipher::decrypt($device->aes,$password);
1000
                if($emailDecrypted->hasError() || $passwordDecrypted->hasError()) {
1001
                    return new JsonModel([
1002
                        'success' => false,
1003
                        'data' => 'ERROR_WEBSERVICE_PASSWORD_ENCRYPTION_FAILED',
1004
                    ]);
1005
                }
1006
 
1007
                $email = $emailDecrypted->getData();
1008
                $password = $passwordDecrypted->getData();
231 efrain 1009
 
1010
                error_log("Email Decrypted : " . $email . PHP_EOL);
1011
                error_log("Password Decrypted : " . $password . PHP_EOL);
1012
 
229 efrain 1013
            } else {
1014
                $email   = filter_var($email, FILTER_SANITIZE_EMAIL);
219 efrain 1015
            }
1 www 1016
 
1017
 
1018
            $authAdapter = new AuthAdapter($this->adapter);
1019
            $authAdapter->setData($email, $password);
1020
 
1021
            $authService = new AuthenticationService();
1022
            $result = $authService->authenticate($authAdapter);
1023
 
1024
            if($result->getCode() == AuthResult::SUCCESS) {
1025
 
1026
                $userMapper = UserMapper::getInstance($this->adapter);
1027
                $user = $userMapper->fetchOneByEmail($email);
1028
 
1029
 
1030
                $device->user_id    = $user->id;
1031
                $device->ip         = Functions::getUserIP();
1032
                if($deviceMapper->update($device)) {
1033
 
1034
                    $ip = Functions::getUserIP();
1035
 
1036
                    $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
1037
                    $deviceHistory = $deviceHistoryMapper->fetchOneByDeviceIdAndUserIdAndIp($device->id, $user->id, $ip);
1038
                    if($deviceHistory) {
1039
                        $deviceHistoryMapper->update($deviceHistory);
1040
                    } else {
1041
                        $deviceHistory = new DeviceHistory();
1042
                        $deviceHistory->device_id = $device->id;
1043
                        $deviceHistory->user_id = $user->id;
1044
                        $deviceHistory->ip = $ip;
1045
                        $deviceHistoryMapper->insert($deviceHistory);
1046
                    }
1047
 
1048
                    $pushMapper = PushMapper::getInstance($this->adapter);
1049
 
1050
                    $userDevices =  $deviceMapper->fetchAllByUserId($user->id);
1051
                    foreach($userDevices as $userDevice)
1052
                    {
1053
 
1054
 
1055
                        if($userDevice->id != $device->id && $userDevice->token) {
1056
 
1057
                            $push = new Push();
1058
                            $push->status = Push::STATUS_PENDING;
1059
                            $push->data = json_encode([
1060
                                'server' => [
1061
                                    'key' =>   $application->key
1062
                                 ],
1063
                                 'push' => [
1064
                                    'registration_ids'   => [
1065
                                        $userDevice->token,
1066
                                     ],
1067
                                     /*'notification' => [
1068
                                         'body' =>  'Se registro un inicio de sessión desde otro dispositivo',
1069
                                         'title' => 'Inicio de sessión',
1070
                                         'vibrate' => 1,
1071
                                         'sound' =>  1
1072
                                     ],*/
1073
                                    'data' => [
1074
                                        'command' => 'signout'
1075
                                    ]
1076
                                 ]
1077
                             ]);
1078
 
1079
                            $pushMapper->insert($push);
1080
 
1081
                        }
1082
                    }
1083
 
1084
 
1085
                    $companyUsers = [];
1086
                    $companyMicrolearningCapsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1087
                    $capsules = $companyMicrolearningCapsuleUserMapper->fetchAllActiveByUserId($user->id);
1088
                    foreach($capsules as $capsule)
1089
                    {
1090
 
1091
 
1092
 
1093
                        if(empty($companyUsers[$capsule->company_id])) {
1094
                            $companyUsers[$capsule->company_id] = $capsule->updated_on;
1095
                        } else {
1096
 
1097
                            if($capsule->updated_on > $companyUsers[$capsule->company_id]) {
1098
                                $companyUsers[$capsule->company_id] = $capsule->updated_on;
1099
                            }
1100
 
1101
                        }
1102
 
1103
                    }
1104
 
1105
                    $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
1106
 
1107
                    $maxDateChanges = $companyMicrolearningUserMapper->fetchMaxDateChanges($user->id);
1108
                    if(!$maxDateChanges) {
1109
 
1110
 
1111
                        $maxDateChanges = '';
1112
                        foreach($companyUsers as $company_id => $update_on)
1113
                        {
1114
 
1115
                            $maxDateChanges = $maxDateChanges < $update_on ? $update_on : $maxDateChanges;
1116
 
1117
                            $companyMicrolearningUser = new CompanyMicrolearningUser();
1118
                            $companyMicrolearningUser->company_id = $company_id;
1119
                            $companyMicrolearningUser->user_id = $user->id;
1120
                            $companyMicrolearningUser->added_on = $update_on;
1121
                            $companyMicrolearningUser->updated_on = $update_on;
1122
 
1123
                            $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
1124
                        }
1125
 
1126
 
1127
                    }
1128
 
1129
 
1130
 
1131
                   $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $maxDateChanges);
1132
                   if($dt) {
1133
                       $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1134
                       $maxDateChanges = $dt->format($serviceDatetimeFormat);
1135
                   } else {
1136
                       $maxDateChanges = '';
1137
                   }
1138
 
1139
 
1140
                    $data = [
1141
                        'success'   => true,
1142
                        'data'      =>[
1143
                            'user' => [
1144
                                'uuid' => $user->uuid,
1145
                                'first_name' => $user->first_name,
1146
                                'last_name' => $user->last_name,
1147
                                'email' => $user->email,
1148
                                'image' => $this->url()->fromRoute('services/storage',['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),
1149
 
1150
                             ],
1151
                            'max_date_changes' => $maxDateChanges,
1152
                            'device' => [
1153
                                'aes' => $device->aes,
1154
                                'password' => $device->password
1155
                            ]
1156
 
1157
                        ]
1158
                    ];
1159
 
1160
                    if($application->id == Application::TWOGETSKILLS) {
1161
                        $dataSync = $this->getSyncData($user);
1162
 
1163
                        $data['data']['topics'] = $dataSync['topics'];
1164
                        $data['data']['quizzes'] = $dataSync['quizzes'];
1165
                        $data['data']['userlog'] = $dataSync['userlog'];
1166
                        $data['data']['progress'] = $dataSync['progress'];
52 efrain 1167
                        $data['data']['extended'] = $dataSync['extended'];
1 www 1168
                    }
1169
 
1170
 
1171
 
1172
                    return new JsonModel($data);
1173
 
1174
 
1175
 
1176
                } else {
1177
                    return new JsonModel([
1178
                        'success' => false,
1179
                        'data' => 'ERROR_THERE_WAS_AN_ERROR',
1180
                    ]);
1181
                }
1182
 
1183
 
1184
            } else {
1185
                $message = $result->getMessages()[0];
1186
                if(!in_array($message, ['ERROR_USER_NOT_FOUND', 'ERROR_USER_PROVIDER_NOT_FOUND', 'ERROR_USER_EMAIL_HASNT_BEEN_VARIFIED', 'ERROR_USER_IS_BLOCKED',
1187
                    'ERROR_USER_IS_INACTIVE', 'ERROR_ENTERED_PASS_INCORRECT_USER_IS_BLOCKED', 'ERROR_ENTERED_PASS_INCORRECT_2',
1188
                    'ERROR_ENTERED_PASS_INCORRECT_1'])) {
1189
                }
1190
 
1191
                switch($message)
1192
                {
1193
                    case 'ERROR_USER_NOT_FOUND' :
1194
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Email no existe', ['ip' => Functions::getUserIP()]);
1195
                        break;
1196
 
1197
                    case 'ERROR_USER_EMAIL_HASNT_BEEN_VARIFIED' :
1198
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Email no verificado', ['ip' => Functions::getUserIP()]);
1199
                        break;
1200
 
1201
                    case 'ERROR_USER_IS_BLOCKED' :
1202
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Usuario bloqueado', ['ip' => Functions::getUserIP()]);
1203
                        break;
1204
 
1205
                    case 'ERROR_USER_IS_INACTIVE' :
1206
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Usuario inactivo', ['ip' => Functions::getUserIP()]);
1207
                        break;
1208
 
1209
 
1210
                    case 'ERROR_ENTERED_PASS_INCORRECT_USER_IS_BLOCKED':
1211
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 3er Intento Usuario bloqueado', ['ip' => Functions::getUserIP()]);
1212
                        break;
1213
 
1214
 
1215
                    case 'ERROR_ENTERED_PASS_INCORRECT_2' :
1216
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 1er Intento', ['ip' => Functions::getUserIP()]);
1217
                        break;
1218
 
1219
 
1220
                    case 'ERROR_ENTERED_PASS_INCORRECT_1' :
1221
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - 2do Intento', ['ip' => Functions::getUserIP()]);
1222
                        break;
1223
 
1224
 
1225
                    default :
1226
                        $message = 'ERROR_UNKNOWN';
1227
                        $this->logger->err('Error de ingreso a LeadersLinked de ' . $email . ' - Error desconocido', ['ip' => Functions::getUserIP()]);
1228
                        break;
1229
 
1230
 
1231
                }
1232
 
1233
 
1234
                return new JsonModel([
1235
                    'success'   => false,
1236
                    'data'   => $message
1237
                ]);
1238
            }
1239
 
1240
        }
1241
 
1242
        return new JsonModel([
1243
            'success' => false,
1244
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1245
        ]);
1246
 
1247
    }
1248
 
1249
 
1250
 
1251
 
1252
    public function storageAction()
1253
    {
1254
 
1255
        // Get the file name from GET variable.
1256
        $code       = $this->params()->fromRoute('code', '');
1257
        $fileName   = $this->params()->fromRoute('filename', '');
1258
        $type       = $this->params()->fromRoute('type', 'user');
1259
 
1260
 
1261
        $no_image = $this->config['leaderslinked.images_default.no_image'];
1262
        $path = '';
1263
        switch($type)
1264
        {
1265
            case 'user' :
1266
                $no_image = $this->config['leaderslinked.images_default.user_image'];
1267
                $path = $this->config['leaderslinked.fullpath.user'];
1268
                break;
1269
 
1270
 
1271
            case 'user-profile' :
1272
                $no_image = $this->config['leaderslinked.images_default.user_profile'];
1273
                $path = $this->config['leaderslinked.fullpath.user'];
1274
                break;
1275
 
1276
            case 'user-cover' :
1277
                $no_image = $this->config['leaderslinked.images_default.user_cover'];
1278
                $path = $this->config['leaderslinked.fullpath.user'];
1279
                break;
1280
 
1281
            case 'company' :
1282
                $no_image = $this->config['leaderslinked.images_default.company_profile'];
1283
                $path = $this->config['leaderslinked.fullpath.company'];
1284
                break;
1285
 
1286
            case 'company-cover' :
1287
                $no_image = $this->config['leaderslinked.images_default.company_cover'];
1288
                $path = $this->config['leaderslinked.fullpath.company'];
1289
                break;
1290
 
1291
            case 'group' :
1292
                $no_image = $this->config['leaderslinked.images_default.group_profile'];
1293
                $path = $this->config['leaderslinked.fullpath.group'];
1294
                break;
1295
 
1296
            case 'group-cover' :
1297
                $no_image = $this->config['leaderslinked.images_default.group_cover'];
1298
                $path = $this->config['leaderslinked.fullpath.group'];
1299
                break;
1300
 
1301
            case 'job' :
1302
                $path = $this->config['leaderslinked.fullpath.job'];
1303
                break;
1304
 
1305
            case 'chat' :
1306
                $path = $this->config['leaderslinked.fullpath.chat'];
1307
                break;
1308
 
1309
            case 'feed' :
1310
                $path = $this->config['leaderslinked.fullpath.feed'];
1311
                break;
1312
 
1313
            case 'post' :
1314
                $path = $this->config['leaderslinked.fullpath.post'];
1315
                break;
1316
 
1317
            case 'microlearning-topic' :
1318
                $path = $this->config['leaderslinked.fullpath.microlearning_topic'];
1319
                break;
1320
 
1321
            case 'microlearning-capsule' :
1322
                $path = $this->config['leaderslinked.fullpath.microlearning_capsule'];
1323
                break;
1324
 
1325
            case 'microlearning-slide' :
1326
                $path = $this->config['leaderslinked.fullpath.microlearning_slide'];
1327
                break;
1328
 
1329
            default :
1330
                $path = $this->config['leaderslinked.fullpath.image'];
1331
                break;
1332
 
1333
        }
1334
        if($code && $fileName) {
1335
            $request_fullpath = $path . $code . DIRECTORY_SEPARATOR . $fileName;
1336
        } else {
1337
            $request_fullpath = $no_image;
1338
        }
1339
 
1340
        if(empty($fileName)) {
1341
            $extensions     = explode('.',$request_fullpath);
1342
            $extension      = strtolower(trim($extensions[count($extensions)-1]));
1343
            if ($extension=='jpg' || $extension=='jpeg' || $extension=='gif' || $extension == 'png') {
1344
                $request_fullpath =  $no_image;
1345
            }
1346
        }
1347
 
1348
 
1349
        if(file_exists($request_fullpath)) {
1350
 
1351
            // Try to open file
1352
            if (!is_readable($request_fullpath)) {
1353
                return $this->getResponse()->setStatusCode(500);
1354
            }
1355
 
1356
            // Get file size in bytes.
1357
            $fileSize = filesize($request_fullpath);
1358
 
1359
            // Get MIME type of the file.
1360
            $mimeType = mime_content_type($request_fullpath);
1361
            if($mimeType===false) {
1362
                $mimeType = 'application/octet-stream';
1363
            }
1364
 
1365
            $request_fullpath = trim($request_fullpath);
1366
            $length = strlen($request_fullpath);
1367
            if(substr($request_fullpath, $length - 1) == '/') {
1368
                $request_fullpath = substr($request_fullpath, 0, $length - 1);
1369
            }
1370
 
1371
 
1372
            $filename = basename($request_fullpath);
1373
 
1374
            header('Content-type: ' . $mimeType);
1375
            readfile($request_fullpath);
1376
 
1377
 
1378
            exit;
1379
            //header("X-Sendfile: $request_fullpath");
1380
            //header("Content-type: application/octet-stream");
1381
            //header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
1382
 
1383
 
1384
            /*
1385
 
1386
 
1387
            if ($fd = fopen ($request_fullpath, "r")) {
1388
 
1389
                $fsize = filesize($request_fullpath);
1390
 
1391
                header("Content-type: $mimeType");
1392
                header("Accept-Ranges: bytes");
1393
 
1394
                //header("Content-Disposition: attachment; filename=\"$filename\"");
1395
 
1396
                header("Content-length: $fsize");
1397
                header("Cache-control: private");
1398
 
1399
                while(!feof($fd)) {
1400
                    $buffer = fread($fd, 2048);
1401
                    echo $buffer;
1402
                }
1403
            }
1404
 
1405
            fclose ($fd);
1406
            exit;*/
1407
 
1408
 
1409
            /*
1410
             $fileContent = file_get_contents($request_fullpath);
1411
            $response = $this->getResponse();
1412
            $headers = $response->getHeaders();
1413
            $headers->addHeaderLine('Accept-Ranges: bytes');
1414
            $headers->addHeaderLine('Content-type: ' . $mimeType);
1415
            $headers->addHeaderLine('Content-length: ' . $fileSize);
1416
 
1417
            /*
1418
            Date: Tue, 13 Jul 2021 03:11:42 GMT
1419
            Server: Apache/2.4.41 (Ubuntu)
1420
            Last-Modified: Mon, 28 Jun 2021 16:43:04 GMT
1421
            ETag: "54e4-5c5d62eed581e"
1422
            Accept-Ranges: bytes
1423
            Content-Length: 21732
1424
            Cache-Control: max-age=1
1425
            Expires: Tue, 13 Jul 2021 03:11:43 GMT
1426
            Keep-Alive: timeout=5, max=100
1427
            Connection: Keep-Alive
1428
            Content-Type: audio/mpeg
1429
            */
1430
 
1431
            /*
1432
            if($fileContent!==false) {
1433
                error_log($_SERVER['REQUEST_URI']);
1434
                error_log($request_fullpath);
1435
                return $response->setContent($fileContent);
1436
 
1437
                header('Content-Type: '.$mimeType );
1438
                readfile_chunked($filename);
1439
                exit;
1440
 
1441
            } else {
1442
                error_log('500');
1443
                $this->getResponse()->setStatusCode(500);
1444
                return;
1445
            }*/
1446
        } else {
1447
            error_log('404');
1448
            return $this->getResponse()->setStatusCode(404);
1449
        }
1450
 
1451
        return $this->getResponse();
1452
    }
1453
 
1454
 
1455
    public function syncAction()
1456
    {
1457
        $request = $this->getRequest();
1458
 
1459
        if($request->isPost()) {
1460
 
221 efrain 1461
 
1 www 1462
 
1463
 
1464
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
1465
 
1466
            $device_uuid    = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
1467
            $sync_id        = filter_var($this->params()->fromPost('sync_id', ''), FILTER_SANITIZE_NUMBER_INT);
1468
            $data           = $this->params()->fromPost('data', '');
1469
 
1470
 
1471
 
41 efrain 1472
            //error_log('device_uuid = ' . $device_uuid);
1473
            //error_log('sync_id = ' . $sync_id);
1474
            //error_log(print_r($data, true));
221 efrain 1475
 
1476
 
1662 efrain 1477
            //$rawdata = file_get_contents("php://input");
1478
           // error_log('$rawdata = ' . $rawdata );
1 www 1479
 
1480
            $ok = $device_uuid && strlen($device_uuid) == 36 && $data && $sync_id;
1481
 
1482
            if(!$ok) {
1483
                return new JsonModel([
1484
                    'success' => false,
1485
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
1486
                ]);
1487
            }
1488
 
1489
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
1490
            $device = $deviceMapper->fetchOne($device_uuid);
1491
 
1492
 
1493
            if(!$device) {
1494
                return new JsonModel([
1495
                    'success' => false,
1496
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
1497
                ]);
1498
            } else {
1499
                $device->ip = Functions::getUserIP();
1500
                $deviceMapper->update($device);
1501
            }
1502
 
44 efrain 1503
 
41 efrain 1504
 
44 efrain 1505
 
1506
 
1507
            $data = json_decode($data, true);
1508
            $sync_type      = isset($data['sync_type']) ? filter_var($data['sync_type'], FILTER_SANITIZE_STRING) : '';
1509
            $user_uuid      = isset($data['user_uuid']) ? filter_var($data['user_uuid'], FILTER_SANITIZE_STRING) : '';
1510
            $company_uuid   = isset($data['company_uuid']) ? filter_var($data['company_uuid'], FILTER_SANITIZE_STRING) :  '';
1511
 
1512
 
41 efrain 1513
            $syncLog = new SyncLog();
224 efrain 1514
            $syncLog->data = json_encode($data);
44 efrain 1515
            $syncLog->type = $sync_type;
41 efrain 1516
            $syncLog->device_uuid = $device->id;
1517
            $syncLog->ip = Functions::getUserIP();
1518
 
222 efrain 1519
 
224 efrain 1520
 
222 efrain 1521
 
41 efrain 1522
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
1523
            $syncLogMapper->insert($syncLog);
1524
 
1 www 1525
 
1526
    //
1527
 
1528
            if($user_uuid && $device->application_id = Application::TWOGETSKILLS  && $company_uuid && in_array($sync_type, ['microlearning-progress', 'microlearning-userlog', 'microlearning-quiz'])) {
1529
                $userMapper = UserMapper::getInstance($this->adapter);
1530
                $user = $userMapper->fetchOneByUuid($user_uuid);
1531
 
1651 efrain 1532
 
1533
 
1 www 1534
                if(!$user) {
1535
                    return new JsonModel([
1536
                        'success' => false,
1537
                        'data' => [
1538
                            'sync_id' => $sync_id,
1539
                            'message' => 'ERROR_USER_NOT_FOUND',
1540
                            'fatal' => true
1541
                        ]
1542
                    ]);
1543
                }
1544
 
1545
 
1546
                if($user->status != User::STATUS_ACTIVE) {
1547
                    return new JsonModel([
1548
                        'success' => false,
1549
                        'data' => [
1550
                            'sync_id' => $sync_id,
1551
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
1552
                            'fatal' => true
1553
                        ]
1554
                    ]);
1555
                }
1556
 
1557
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1558
                $company = $companyMapper->fetchOneByUuid($company_uuid);
1559
                if(!$company) {
1560
                    return new JsonModel([
1561
                        'success' => false,
1562
                        'data' => [
1563
                            'sync_id' => $sync_id,
1564
                            'message' => 'ERROR_COMPANY_NOT_FOUND',
1565
                            'fatal' => true
1566
                        ]
1567
                    ]);
1568
                }
1569
 
1570
                if($company->status != Company::STATUS_ACTIVE) {
1571
                    return new JsonModel([
1572
                        'success' => false,
1573
                        'data' => [
1574
                            'sync_id' => $sync_id,
1575
                            'message' => 'ERROR_COMPANY_IS_NOT_FOUND',
1576
                            'fatal' => true
1577
                        ]
1578
                    ]);
1579
                }
1580
 
1581
 
1582
 
1583
 
1584
 
1585
                $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
1586
                $companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
1587
                if(!$companyService) {
1588
                    return new JsonModel([
1589
                        'success' => false,
1590
                        'data' => [
1591
                            'sync_id' => $sync_id,
1592
                            'message' => 'ERROR_COMPANY_SERVICE_NOT_FOUND',
1593
                            'fatal' => true
1594
                        ]
1595
                    ]);
1596
                }
1597
 
1598
                $serviceActive = true;
1599
                $now = date('Y-m-d H:i:s');
1600
                if($companyService->status == CompanyService::ACTIVE) {
1601
 
1602
                    if($now < $companyService->paid_from || $now > $companyService->paid_to) {
1603
                        $serviceActive = false;
1604
                    }
1605
 
1606
                } else {
1607
                    $serviceActive = false;
1608
                }
1609
 
1610
                if( !$serviceActive) {
1611
                    return new JsonModel([
1612
                        'success' => false,
1613
                        'data' => [
1614
                            'sync_id' => $sync_id,
1615
                            'message' => 'ERROR_COMPANY_SERVICE_IS_NOT_ACTIVE',
1616
                            'fatal' => true
1617
                        ]
1618
                    ]);
1619
                }
1620
 
1621
                $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
1651 efrain 1622
                $topic_uuid = isset($data['topic_uuid']) ? trim(filter_var($data['topic_uuid'], FILTER_SANITIZE_STRING)) :  '';
1 www 1623
                if($topic_uuid) {
1624
                    $topic = $topicMapper->fetchOneByUuid($topic_uuid);
1625
 
1626
                    if(!$topic) {
1627
                        return new JsonModel([
1628
                            'success' => false,
1629
                            'data' => [
1630
                                'sync_id' => $sync_id,
1631
                                'message' => 'ERROR_TOPIC_NOT_FOUND',
1632
                            ]
1633
                        ]);
1634
                    }
1635
 
1636
                    if($topic->company_id != $company->id) {
1637
                        return new JsonModel([
1638
                            'success' => false,
1639
                            'data' => [
1640
                                'sync_id' => $sync_id,
1641
                                'message' => 'ERROR_INVALID_PARAMETERS_TOPIC_COMPANY',
1642
                            ]
1643
                        ]);
1644
                    }
1645
 
1646
                } else {
1647
                    $topic = null;
1648
                }
1649
 
1651 efrain 1650
                $capsule_uuid     = isset($data['capsule_uuid']) ? trim(filter_var($data['capsule_uuid'], FILTER_SANITIZE_STRING)) :  '';
1 www 1651
                $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
1652
                if($capsule_uuid) {
1653
 
1654
                    $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
1655
                    if(!$capsule) {
1656
                        return new JsonModel([
1657
                            'success' => false,
1658
                            'data' => [
1659
                                'sync_id' => $sync_id,
1660
                                'message' => 'ERROR_CAPSULE_NOT_FOUND',
1661
                            ]
1662
                        ]);
1663
                    }
1664
 
1665
                    if(!$topic || $capsule->topic_id != $topic->id) {
1666
                        return new JsonModel([
1667
                            'success' => false,
1668
                            'data' => [
1669
                                'sync_id' => $sync_id,
1670
                                'message' => 'ERROR_INVALID_PARAMETERS_CAPSULE_TOPIC',
1671
                            ]
1672
                        ]);
1673
                    }
1674
                } else {
1675
                    $capsule = null;
1676
                }
1677
 
1678
                if($capsule) {
1679
 
1680
                    $capsuleActive = true;
1681
                    $capsuleMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1682
                    $capsuleUser = $capsuleMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
1683
 
1684
 
1685
                    $now = date('Y-m-d H:i:s');
1686
                    if($capsuleUser && in_array($capsuleUser->access, [CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED,CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD ])) {
1687
 
1688
 
1689
                        if($capsuleUser->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
1690
 
1691
                            if($now < $capsuleUser->paid_from || $now > $capsuleUser->paid_to) {
1692
                                $capsuleActive = false;;
1693
                            }
1694
                        }
1695
 
1696
                    } else {
1697
                        $capsuleActive = false;
1698
                    }
1699
 
1700
                    if(!$capsuleActive) {
1701
                        return new JsonModel([
1702
                            'success' => false,
1703
                            'data' => [
1704
                                'sync_id' => $sync_id,
1705
                                'message' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
1706
                            ]
1707
                        ]);
1708
                    }
1709
                }
1710
 
1651 efrain 1711
 
1712
 
1 www 1713
                $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
1651 efrain 1714
                $slide_uuid      = isset($data['slide_uuid']) ? trim(filter_var($data['slide_uuid'], FILTER_SANITIZE_STRING)) :  '';
1715
 
1716
 
1 www 1717
                if($slide_uuid) {
1651 efrain 1718
 
1 www 1719
                    $slide = $slideMapper->fetchOneByUuid($slide_uuid);
1720
                    if(!$slide) {
1721
                        return new JsonModel([
1722
                            'success' => false,
1723
                            'data' => [
1724
                                'sync_id' => $sync_id,
1725
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
1726
                            ]
1727
                        ]);
1728
                    }
1729
 
1730
                    if(!$capsule || $slide->capsule_id != $capsule->id) {
1731
                        return new JsonModel([
1732
                            'success' => false,
1733
                            'data' => [
1734
                                'sync_id' => $sync_id,
1735
                                'message' => 'ERROR_INVALID_PARAMETERS_SLIDE_CAPSULE',
1736
                            ]
1737
                        ]);
1738
                    }
1739
                } else {
1740
                    $slide = null;
1741
                }
1742
 
1651 efrain 1743
 
1744
 
1745
 
1 www 1746
                if($sync_type == 'microlearning-quiz') {
1747
                    $ok = true;
1748
 
1749
                    $quiz_uuid = isset($data['quiz_uuid']) ? $data['quiz_uuid'] : '';
1750
                    $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
1751
 
1752
                    $quiz = $quizMapper->fetchOneByUuid($quiz_uuid);
1753
                    if(!$quiz) {
1754
                        return new JsonModel([
1755
                            'success' => false,
1756
                            'data' => [
1757
                                'sync_id' => $sync_id,
1758
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
1759
                            ]
1760
                        ]);
1761
                    }
1762
 
1763
                    if(!$capsule || $slide->capsule_id != $capsule->id) {
1764
                        return new JsonModel([
1765
                            'success' => false,
1766
                            'data' => [
1767
                                'sync_id' => $sync_id,
1768
                                'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_SLIDE',
1769
                            ]
1770
                        ]);
1771
                    }
1772
 
1773
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
1774
 
1775
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
1776
                    if(!$dt) {
1777
                        $ok = false;
1778
                    } else {
1779
                        $added_on = $dt->format('Y-m-d H:i:s');
1780
                    }
1781
 
1782
 
1783
                    if(isset($data['points'])) {
1784
                        $points = intval($data['points'], 10);
1785
                    } else {
1786
                        $ok = false;
1787
                    }
1788
 
1789
 
1790
                    if(isset($data['pass'])) {
1791
                        $status = $data['pass'] == 'yes' ? CompanyMicrolearningUserQuiz::STATUS_PASS : CompanyMicrolearningUserQuiz::STATUS_FAIL;
1792
                    } else {
1793
                        $ok = false;
1794
                    }
1795
 
1796
 
1797
                    if(!$ok) {
1798
                        return new JsonModel([
1799
                            'success' => false,
1800
                            'data' => [
1801
                                'sync_id' => $sync_id,
1662 efrain 1802
                                'message' => 'ERROR_INVALID_PARAMETERS 1',
1 www 1803
                            ]
1804
                        ]);
1805
                    }
1806
 
1807
 
1808
                    $array_response = [];
1809
                    $response = isset($data['response']) ? intval($data['response'], 10) : 0;
1810
                    for($i = 0; $i < $response; $i++)
1811
                    {
1812
                        $question_uuid = isset($data["response_{$i}_question_uuid"]) ? $data["response_{$i}_question_uuid"] : '';
1813
                        $answer_uuid = isset($data["response_{$i}_answer_uuid"]) ? $data["response_{$i}_answer_uuid"] : '';
1814
                        $value = isset($data["response_{$i}_value"]) ?  intval($data["response_{$i}_value"], 10) : 0;
1815
                        $points = isset($data["response_{$i}_points"]) ?  intval($data["response_{$i}_points"], 10) : 0;
1816
 
1817
                        if($question_uuid && $answer_uuid)
1818
                        {
1819
                            array_push($array_response, [
1820
                                'question_uuid' => $question_uuid,
1821
                                'answer_uuid' => $answer_uuid,
1822
                                'value' => $value,
1823
                                'points' => $points
1824
 
1825
                            ]);
1826
                        }
1827
 
1828
 
1829
                    }
1830
 
1831
 
1832
                    $userQuiz = new CompanyMicrolearningUserQuiz();
1833
                    $userQuiz->company_id = $company->id;
1834
                    $userQuiz->topic_id = $topic->id;
1835
                    $userQuiz->capsule_id = $capsule->id;
1836
                    $userQuiz->slide_id = $slide->id;
1837
                    $userQuiz->quiz_id = $quiz->id;
1838
                    $userQuiz->user_id = $user->id;
1839
                    $userQuiz->added_on = $added_on;
1840
                    $userQuiz->points = $points;
1841
                    $userQuiz->status = $status;
1842
                    $userQuiz->response = json_encode($array_response);
1843
 
1844
                    $userQuizMapper = CompanyMicrolearningUserQuizMapper::getInstance($this->adapter);
1845
 
1846
                    if($userQuizMapper->insert($userQuiz)) {
1847
                        return new JsonModel([
1848
                            'success' => true,
1849
                            'data' => [
1850
                                'sync_id' => $sync_id
1851
                            ]
1852
                        ]);
1853
                    } else {
1854
                        return new JsonModel([
1855
                            'success' => false,
1856
                            'data' => [
1857
                                'sync_id' => $sync_id,
1858
                                'message' => $userQuizMapper->getError()
1859
                            ]
1860
                        ]);
1861
                    }
1862
 
1863
                }
1864
 
1865
 
1866
                if($sync_type == 'microlearning-progress') {
1867
                    $ok = true;
1651 efrain 1868
 
1 www 1869
 
1870
                    $type = isset($data['type']) ? $data['type'] : '';
1871
                    switch($type)
1872
                    {
1873
                        case CompanyMicrolearningUserProgress::TYPE_TOPIC :
1874
                            if(!$topic) {
1875
                                $ok = false;
1876
                            }
1877
                            break;
1878
 
1879
                        case CompanyMicrolearningUserProgress::TYPE_CAPSULE :
1880
                            if(!$topic || !$capsule) {
1881
                                $ok = false;
1882
                            }
1883
                            break;
1884
 
1885
                        case CompanyMicrolearningUserProgress::TYPE_SLIDE :
1886
                            if(!$topic || !$capsule || !$slide) {
1887
                                $ok = false;
1888
                            }
1889
                            break;
1890
 
1891
                        default :
1892
                            $ok = false;
1893
                            break;
1894
 
1895
                    }
1896
 
1897
 
1898
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
1899
                    $updated_on = isset($data['updated_on'])    ? filter_var($data['updated_on'], FILTER_SANITIZE_STRING) :  '';
1900
 
1901
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
1902
                    if(!$dt) {
1903
                        $ok = false;
1904
                    } else {
1905
                        $added_on = $dt->format('Y-m-d H:i:s');
1906
                    }
1907
 
1908
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $updated_on );
1909
                    if(!$dt) {
1910
                        $ok = false;
1911
                    } else {
1912
                        $updated_on = $dt->format('Y-m-d H:i:s');
1913
                    }
1914
 
1915
                    if(!$ok) {
1916
                        return new JsonModel([
1917
                            'success' => false,
1918
                            'data' => [
1919
                                'sync_id' => $sync_id,
1662 efrain 1920
                                'message' => 'ERROR_INVALID_PARAMETERS 2',
1 www 1921
                            ]
1922
                        ]);
1923
                    }
1924
 
1925
                           //$progress                   = isset($data['progress'])                  ? floatval($data['progress']) :  0;
1926
                    //$total_slides               = isset($data['total_slides'])              ? intval($data['total_slides'], 10) :  0;
1927
                    //$view_slides                = isset($data['view_slides'])               ? intval($data['view_slides'], 10) :  0;
1928
                    $returning                  = isset($data['returning'])                 ? intval($data['returning'], 10) :  0;
1929
                    $returning_after_completed  = isset($data['returning_after_completed']) ? intval($data['returning_after_completed'], 10) :  0;
1930
                    $completed                  = isset($data['completed'])                 ? intval($data['completed'], 10) :  0;
1931
 
1932
                    $progressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
1933
                    $recordProgress = null;
1934
                    switch($type) {
1935
                        case CompanyMicrolearningUserProgress::TYPE_TOPIC  :
1936
                            $recordProgress = $progressMapper->fetchOneByUserIdAndTopicId($user->id, $topic->id);
1937
 
1938
                            break;
1939
 
1940
                        case CompanyMicrolearningUserProgress::TYPE_CAPSULE  :
1941
                            $recordProgress = $progressMapper->fetchOneByUseridAndCapsuleId($user->id, $capsule->id);
1942
                            break;
1943
 
1944
                        case CompanyMicrolearningUserProgress::TYPE_SLIDE  :
1945
                            $recordProgress = $progressMapper->fetchOneByUserIdAndSlideId($user->id, $slide->id);
1946
                            break;
1947
 
1948
                        default :
1949
                            $recordProgress= null;
1950
                    }
1951
 
1952
 
1953
                    if(!$recordProgress) {
1954
                        $recordProgress = new CompanyMicrolearningUserProgress();
1955
 
1956
                        $recordProgress->user_id    = $user->id;
1957
                        $recordProgress->type       = $type;
1958
                        $recordProgress->company_id = $topic->company_id;
1959
                        $recordProgress->topic_id   = $topic->id;
1960
                        $recordProgress->capsule_id = $capsule ? $capsule->id : null;
1961
                        $recordProgress->slide_id   = $slide ? $slide->id : null;
1962
                        $recordProgress->added_on   = $added_on;
1963
                    }
1964
                    $recordProgress->returning                  = $returning;
1965
                    $recordProgress->returning_after_completed  = $returning_after_completed;
1966
                    $recordProgress->completed                  = $completed;
1967
 
1968
                    if($type == CompanyMicrolearningUserProgress::TYPE_TOPIC ) {
1969
 
1970
                        $capsule_ids = [];
1971
                        $companyMicrolearningCapsuleUser = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
1972
                        $records =  $companyMicrolearningCapsuleUser->fetchAllActiveByUserId($user->id);
1973
                        foreach($records as $record)
1974
                        {
1975
                            if($now >= $record->paid_from || $now <= $capsuleUser->paid_to) {
1976
                                if(!in_array($record->capsule_id, $capsule_ids)) {
1977
                                    array_push($capsule_ids, $record->capsule_id);
1978
                                }
1979
                            }
1980
                        }
1981
 
1982
                        $view_slides    = 0;
1983
                        $total_slides   = 0;
1984
                        foreach($capsule_ids as $capsule_id)
1985
                        {
1986
                            $view_slides    += $progressMapper->fetchCountAllSlideViewedByUserIdAndCapsuleId($user->id, $capsule_id);
1987
                            $total_slides   += $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($topic->company_id, $topic->id, $capsule_id);
1988
 
1989
                        }
1990
 
1991
 
1992
                        $recordProgress->progress       = $total_slides > 0 ? (($view_slides * 100) / $total_slides) : 0;
1993
                        $recordProgress->total_slides   = $total_slides;
1994
                        $recordProgress->view_slides    = $view_slides;
1995
                    }
1996
                    else if($type == CompanyMicrolearningUserProgress::TYPE_CAPSULE ) {
1997
                        $view_slides    = $progressMapper->fetchCountAllSlideViewedByUserIdAndCapsuleId($user->id, $capsule->id);
1998
                        $total_slides   = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($topic->company_id, $capsule->topic_id, $capsule->id);
1999
 
2000
                        $recordProgress->progress       = $total_slides > 0 ? (($view_slides * 100) / $total_slides) : 0;
2001
                        $recordProgress->total_slides   = $total_slides;
2002
                        $recordProgress->view_slides    = $view_slides;
2003
                    }
2004
                    else {
2005
                        $recordProgress->progress       = 0;
2006
                        $recordProgress->total_slides   = 0;
2007
                        $recordProgress->view_slides    = 0;
2008
                    }
2009
 
2010
                    $recordProgress->updated_on = $updated_on;
2011
 
2012
 
2013
 
2014
                    if($recordProgress->id) {
2015
                        $result = $progressMapper->update($recordProgress);
2016
                    } else {
2017
                        $result = $progressMapper->insert($recordProgress);
2018
                    }
2019
 
2020
                    if($result) {
2021
                        return new JsonModel([
2022
                            'success' => true,
2023
                            'data' => [
2024
                                'sync_id' => $sync_id
2025
                            ]
2026
                        ]);
2027
                    } else {
2028
                        return new JsonModel([
2029
                            'success' => false,
2030
                            'data' => [
2031
                                'sync_id' => $sync_id,
2032
                                'message' => $progressMapper->getError()
2033
                            ]
2034
                        ]);
2035
                    }
2036
                }
2037
 
2038
 
2039
 
2040
                if($sync_type == 'microlearning-userlog') {
2041
                    $activity   = isset($data['activity'])      ? filter_var($data['activity'], FILTER_SANITIZE_STRING)  :  '';
2042
                    $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
2043
 
2044
 
2045
                    if(empty($activity)) {
2046
                        $ok = false;
2047
                    }
2048
 
2049
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2050
                    if(!$dt) {
2051
                        $ok = false;
2052
                    } else {
2053
                        $added_on = $dt->format('Y-m-d H:i:s');
2054
                    }
2055
 
2056
                    if(!$ok) {
2057
                        return new JsonModel([
2058
                            'success' => false,
2059
                            'data' => [
2060
                                'sync_id' => $sync_id,
1662 efrain 2061
                                'message' => 'ERROR_INVALID_PARAMETERS 3',
1 www 2062
                            ]
2063
                        ]);
2064
                    }
2065
 
2066
                    $userLog = new CompanyMicrolearningUserLog();
2067
                    $userLog->activity      = $activity;
2068
                    $userLog->user_id       = $user->id;
2069
                    $userLog->company_id    = $topic->company_id;
2070
                    $userLog->topic_id      = $topic->id;
2071
                    $userLog->capsule_id    = $capsule ? $capsule->id : null;
2072
                    $userLog->slide_id      = $slide ? $slide->id : null;
2073
                    $userLog->added_on      = $added_on;
2074
 
2075
 
2076
 
2077
                    $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2078
                    if($userLogMapper->insert($userLog)) {
2079
                        return new JsonModel([
2080
                            'success' => true,
2081
                            'data' => [
2082
                                'sync_id' => $sync_id
2083
                            ]
2084
                        ]);
2085
                    } else {
2086
                        return new JsonModel([
2087
                            'success' => false,
2088
                            'data' => [
2089
                                'sync_id' => $sync_id,
2090
                                'message' => $userLogMapper->getError()
2091
                            ]
2092
                        ]);
2093
                    }
2094
                }
2095
 
2096
            }
2097
 
2098
 
2099
 
2100
 
2101
            if($user_uuid && $sync_type == 'userlog' && $device->application_id = Application::TWOGETSKILLS) {
2102
 
2103
                $userMapper = UserMapper::getInstance($this->adapter);
2104
                $user = $userMapper->fetchOneByUuid($user_uuid);
2105
 
2106
                if(!$user) {
2107
                    return new JsonModel([
2108
                        'success' => false,
2109
                        'data' => [
2110
                            'sync_id' => $sync_id,
2111
                            'message' => 'ERROR_USER_NOT_FOUND',
2112
                            'fatal' => true
2113
                        ]
2114
                    ]);
2115
                }
2116
 
2117
 
2118
                if($user->status != User::STATUS_ACTIVE) {
2119
                    return new JsonModel([
2120
                        'success' => false,
2121
                        'data' => [
2122
                            'sync_id' => $sync_id,
2123
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
2124
                            'fatal' => true
2125
                        ]
2126
                    ]);
2127
                }
2128
 
2129
                $activity   = isset($data['activity'])      ? filter_var($data['activity'], FILTER_SANITIZE_STRING)  :  '';
2130
                $added_on   = isset($data['added_on'])      ? filter_var($data['added_on'], FILTER_SANITIZE_STRING)  :  '';
2131
 
2132
                if(empty($activity)) {
2133
                    $ok = false;
2134
                }
2135
 
2136
                $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2137
                if(!$dt) {
2138
                    $ok = false;
2139
                } else {
2140
                    $added_on = $dt->format('Y-m-d H:i:s');
2141
                }
2142
 
2143
                if(!$ok) {
2144
                    return new JsonModel([
2145
                        'success' => false,
2146
                        'data' => [
2147
                            'sync_id' => $sync_id,
1662 efrain 2148
                            'message' => 'ERROR_INVALID_PARAMETERS 4',
1 www 2149
                        ]
2150
                    ]);
2151
                }
2152
 
2153
                $userLog = new CompanyMicrolearningUserLog();
2154
                $userLog->company_id = null;
2155
                $userLog->user_id = $user->id;
2156
                $userLog->activity = $activity;
2157
                $userLog->added_on = $added_on;
2158
 
2159
 
2160
                $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
2161
                if($userLogMapper->insert($userLog)) {
2162
                    return new JsonModel([
2163
                        'success' => true,
2164
                        'data' => [
2165
                            'sync_id' => $sync_id
2166
                        ]
2167
                    ]);
2168
                } else {
2169
                    return new JsonModel([
2170
                        'success' => false,
2171
                        'data' => [
2172
                            'sync_id' => $sync_id,
2173
                            'message' => $userLogMapper->getError()
2174
                        ]
2175
                    ]);
2176
                }
2177
            }
2178
 
2179
            return new JsonModel([
2180
                'success' => true,
2181
                'data' => [
2182
                    'sync_id' => $sync_id
2183
                ]
2184
            ]);
2185
 
2186
        }
2187
 
2188
        return new JsonModel([
2189
            'success' => false,
2190
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2191
        ]);
2192
    }
2193
 
2194
 
2195
    public function syncBatchAction()
2196
    {
2197
        $request = $this->getRequest();
2198
 
2199
        if($request->isPost()) {
2200
 
1662 efrain 2201
            $rawdata = file_get_contents("php://input");
2202
            error_log('$rawdata = ' . $rawdata );
1 www 2203
 
2204
            $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
2205
 
2206
            $device_uuid = filter_var($this->params()->fromPost('device_uuid', ''), FILTER_SANITIZE_STRING);
2207
            $max_records = filter_var($this->params()->fromPost('max_records', 0), FILTER_SANITIZE_NUMBER_INT);
1662 efrain 2208
 
2209
 
41 efrain 2210
 
1 www 2211
            $ok = $device_uuid && strlen($device_uuid) == 36 && $max_records;
2212
 
2213
            if(!$ok) {
2214
                return new JsonModel([
2215
                    'success' => false,
2216
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
2217
                ]);
2218
            }
2219
 
2220
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
2221
            $device = $deviceMapper->fetchOne($device_uuid);
2222
 
2223
 
2224
            if(!$device) {
2225
                return new JsonModel([
2226
                    'success' => false,
2227
                    'data' => 'ERROR_DEVICE_NOT_FOUND'
2228
                ]);
2229
            } else {
2230
                $device->ip = Functions::getUserIP();
2231
                $deviceMapper->update($device);
2232
            }
41 efrain 2233
 
2234
 
1 www 2235
 
41 efrain 2236
 
2237
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
2238
 
2239
 
2240
 
1 www 2241
            $result_sync_ids = [];
2242
 
2243
 
2244
 
2245
 
16 efrain 2246
            $users = [];
2247
            $companies = [];
2248
            $company_services = [];
2249
            $topics = [];
2250
            $capsules = [];
2251
            $capsule_users = [];
2252
            $slides = [];
2253
            $quizzes = [];
2254
            $questions = [];
2255
            $answers = [];
2256
 
2257
            $userMapper = UserMapper::getInstance($this->adapter);
2258
            $companyMapper = CompanyMapper::getInstance($this->adapter);
2259
            $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
2260
            $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
2261
            $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
2262
            $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
2263
            $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
2264
            $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
2265
            $questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);
2266
            $answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);
2267
 
2268
 
2269
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
2270
            $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
1662 efrain 2271
 
16 efrain 2272
 
1 www 2273
            for($i = 1; $i <= $max_records; $i++)
2274
            {
2275
                $sync_id        = filter_var($this->params()->fromPost('record_sync_id' . $i, ''), FILTER_SANITIZE_NUMBER_INT);
2276
                $record_data    = $this->params()->fromPost('record_data' . $i, '');
1662 efrain 2277
 
1 www 2278
                if(empty($record_data) || empty($sync_id )) {
2279
                    continue;
2280
                }
2281
 
45 efrain 2282
 
1 www 2283
                $record         = json_decode($record_data, true);
2284
                $sync_type      = isset($record['sync_type']) ? filter_var($record['sync_type'],  FILTER_SANITIZE_STRING) : '';
2285
                $user_uuid      = isset($record['user_uuid']) ? filter_var($record['user_uuid'],  FILTER_SANITIZE_STRING) : '';
2286
                $company_uuid   = isset($record['company_uuid']) ? filter_var($record['company_uuid'], FILTER_SANITIZE_STRING) : '';
2287
 
2288
                if(!$sync_id) {
2289
                    continue;
2290
                }
2291
 
45 efrain 2292
                $syncLog = new SyncLog();
2293
                $syncLog->data = $record_data;
2294
                $syncLog->type = $sync_type;
2295
                $syncLog->device_uuid = $device->id;
2296
                $syncLog->ip = Functions::getUserIP();
2297
                $syncLogMapper->insert($syncLog);
2298
 
1 www 2299
                /***** INICIO MICROLEARNING *****/
2300
 
2301
                if($user_uuid && $device->application_id = Application::TWOGETSKILLS  && $company_uuid && in_array($sync_type, ['microlearning-progress', 'microlearning-userlog', 'microlearning-quiz'])) {
2302
 
16 efrain 2303
 
2304
                    if(isset($users[$user_uuid])) {
2305
                        $user = $users[$user_uuid];
2306
                    } else {
2307
 
2308
                        $user = $userMapper->fetchOneByUuid($user_uuid);
2309
                        if($user) {
2310
                            $users[$user_uuid] = $user;
2311
                        }
2312
                    }
2313
 
2314
 
1 www 2315
                    if(!$user) {
2316
                        array_push($result_sync_ids, [
2317
                            'success' => false,
2318
                            'sync_id' => $sync_id,
2319
                            'message' => 'ERROR_USER_NOT_FOUND',
2320
                            'fatal' => true
2321
                        ]);
2322
                        continue;
2323
                    }
2324
 
2325
 
2326
                    if($user->status != User::STATUS_ACTIVE) {
2327
                        array_push($result_sync_ids, [
2328
                            'success' => false,
2329
                            'sync_id' => $sync_id,
2330
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
2331
                            'fatal' => true
2332
                        ]);
2333
                        continue;
2334
                    }
2335
 
16 efrain 2336
 
2337
                    if(isset($companies[$company_uuid])) {
2338
                        $company = $companies[$company_uuid];
2339
                    } else {
2340
                        $company = $companyMapper->fetchOneByUuid($company_uuid);
2341
                        if($company) {
2342
                            $companies[$company_uuid] = $company;
2343
                        }
2344
                    }
2345
 
2346
 
2347
 
2348
 
1 www 2349
                    if(!$company) {
2350
                        array_push($result_sync_ids, [
2351
                            'success' => false,
2352
                            'sync_id' => $sync_id,
2353
                            'message' => 'ERROR_COMPANY_NOT_FOUND',
2354
                            'fatal' => true
2355
                        ]);
2356
                        continue;
2357
                    }
2358
 
2359
                    if($company->status != Company::STATUS_ACTIVE) {
2360
                        array_push($result_sync_ids, [
2361
                            'success' => false,
2362
                            'sync_id' => $sync_id,
2363
                            'message' => 'ERROR_COMPANY_IS_NOT_FOUND',
2364
                            'fatal' => true
2365
                        ]);
2366
                        continue;
2367
                    }
2368
 
2369
 
2370
 
16 efrain 2371
                    $key = $company->id . '-' .  Service::MICRO_LEARNING;
2372
                    if(isset($company_services[$key])) {
2373
                        $companyService = $company_services[$key];
2374
                    } else {
2375
                        $companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
2376
                        if($companyService) {
2377
                            $company_services[$key] = $companyService;
2378
                        }
2379
                    }
1 www 2380
 
2381
                    if(!$companyService) {
2382
                        array_push($result_sync_ids, [
2383
                            'success' => false,
2384
                            'sync_id' => $sync_id,
2385
                            'message' => 'ERROR_COMPANY_SERVICE_NOT_FOUND',
2386
                            'fatal' => true
2387
                        ]);
2388
                        continue;
2389
                    }
2390
 
2391
                    $serviceActive = true;
2392
                    $now = date('Y-m-d H:i:s');
2393
                    if($companyService->status == CompanyService::ACTIVE) {
2394
 
2395
                        if($now < $companyService->paid_from || $now > $companyService->paid_to) {
2396
                            $serviceActive = false;
2397
                        }
2398
 
2399
                    } else {
2400
                        $serviceActive = false;
2401
                    }
2402
 
2403
                    if( !$serviceActive) {
2404
                        array_push($result_sync_ids, [
2405
                            'success' => false,
2406
                            'sync_id' => $sync_id,
2407
                            'message' => 'ERROR_COMPANY_SERVICE_IS_NOT_ACTIVE',
2408
                            'fatal' => true
2409
                        ]);
2410
                        continue;
2411
                    }
2412
 
16 efrain 2413
 
1 www 2414
                    $topic_uuid = isset($record['topic_uuid']) ? filter_var($record['topic_uuid'], FILTER_SANITIZE_STRING) :  '';
2415
                    if($topic_uuid) {
2416
 
16 efrain 2417
                        if(isset($topics[$topic_uuid])) {
2418
                            $topic = $topics[$topic_uuid];
2419
                        } else {
2420
                            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
2421
                            if($topic) {
2422
                                $topics[$topic_uuid] = $topic;
2423
                            }
2424
                        }
2425
 
1 www 2426
                        if(!$topic) {
2427
                            array_push($result_sync_ids, [
2428
                                'success' => false,
2429
                                'sync_id' => $sync_id,
2430
                                'message' => 'ERROR_TOPIC_NOT_FOUND',
2431
                            ]);
2432
                            continue;
2433
                        }
2434
 
2435
                        if($topic->company_id != $company->id) {
2436
                            array_push($result_sync_ids, [
2437
                                'success' => false,
2438
                                'sync_id' => $sync_id,
2439
                                'message' => 'ERROR_INVALID_PARAMETERS_TOPIC_COMPANY',
2440
                            ]);
2441
                            continue;
2442
                        }
2443
 
2444
                    } else {
2445
                        $topic = null;
2446
                    }
2447
 
2448
                    $capsule_uuid     = isset($record['capsule_uuid']) ? filter_var($record['capsule_uuid'], FILTER_SANITIZE_STRING) :  '';
16 efrain 2449
 
1 www 2450
                    if($capsule_uuid) {
2451
 
16 efrain 2452
                        if(isset($capsules[$capsule_uuid])) {
2453
                            $capsule = $capsules[$capsule_uuid];
2454
                        } else {
2455
                            $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
2456
                            if($capsule) {
2457
                                $capsules[$capsule_uuid] = $capsule;
2458
                            }
2459
                        }
1 www 2460
                        if(!$capsule) {
2461
                            array_push($result_sync_ids, [
2462
                                'success' => false,
2463
                                'sync_id' => $sync_id,
2464
                                'message' => 'ERROR_CAPSULE_NOT_FOUND',
2465
                            ]);
2466
                            continue;
2467
                        }
2468
 
2469
                        if(!$topic || $capsule->topic_id != $topic->id) {
2470
                            array_push($result_sync_ids, [
2471
                                'success' => false,
2472
                                'sync_id' => $sync_id,
2473
                                'message' => 'ERROR_INVALID_PARAMETERS_CAPSULE_TOPIC',
2474
                            ]);
2475
                            continue;
2476
                        }
2477
                    } else {
2478
                        $capsule = null;
2479
                    }
2480
 
2481
                    if($capsule) {
2482
 
2483
                        $capsuleActive = true;
2484
 
16 efrain 2485
                        $key = $user->id . '-' . $capsule->id;
1 www 2486
 
16 efrain 2487
                        if(isset($capsule_users[$key])) {
2488
                            $capsuleUser = $capsule_users[$key];
2489
                        } else {
2490
 
2491
                            $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
2492
                            if($capsuleUser) {
2493
                                $capsule_users[$key] = $capsuleUser;
2494
                            }
2495
 
2496
                        }
2497
 
1 www 2498
                        $now = date('Y-m-d H:i:s');
2499
                        if($capsuleUser && in_array($capsuleUser->access, [CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED,CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD ])) {
2500
 
2501
 
2502
                            if($capsuleUser->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
2503
 
2504
                                if($now < $capsuleUser->paid_from || $now > $capsuleUser->paid_to) {
2505
                                    $capsuleActive = false;;
2506
                                }
2507
                            }
2508
 
2509
                        } else {
2510
                            $capsuleActive = false;
2511
                        }
2512
 
2513
                        if(!$capsuleActive) {
2514
                            array_push($result_sync_ids, [
2515
                                'success' => false,
2516
                                'sync_id' => $sync_id,
2517
                                'message' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',
2518
                            ]);
2519
                            continue;
2520
                        }
2521
                    }
2522
 
16 efrain 2523
 
1 www 2524
                    $slide_uuid      = isset($record['slide_uuid']) ? filter_var($record['slide_uuid'], FILTER_SANITIZE_STRING) :  '';
2525
                    if($slide_uuid) {
16 efrain 2526
 
2527
                        if(isset($slides[$slide_uuid])) {
2528
                            $slide = $slides[$slide_uuid];
2529
                        } else {
2530
 
2531
                            $slide = $slideMapper->fetchOneByUuid($slide_uuid);
2532
                            if($slide) {
2533
                                $slides[$slide_uuid] = $slide;
2534
                            }
2535
                        }
1 www 2536
                        if(!$slide) {
2537
                            array_push($result_sync_ids, [
2538
                                'success' => false,
2539
                                'sync_id' => $sync_id,
2540
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
2541
                            ]);
2542
                            continue;
2543
                        }
2544
 
2545
                        if(!$capsule || $slide->capsule_id != $capsule->id) {
2546
                            array_push($result_sync_ids, [
2547
                                'success' => false,
2548
                                'sync_id' => $sync_id,
2549
                                'message' => 'ERROR_INVALID_PARAMETERS_SLIDE_CAPSULE',
2550
                            ]);
2551
                            continue;
2552
                        }
2553
                    } else {
2554
                        $slide = null;
2555
                    }
2556
 
2557
                    if($sync_type == 'microlearning-quiz') {
2558
                        $ok = true;
2559
 
2560
                        $quiz_uuid = isset($record['quiz_uuid']) ? $record['quiz_uuid'] : '';
16 efrain 2561
 
2562
                        if(isset($quizzes[$quiz_uuid])) {
2563
                            $quiz = $quizzes[$quiz_uuid];
2564
                        } else {
2565
                            $quiz = $quizMapper->fetchOneByUuid($quiz_uuid);
2566
                            if($quiz) {
2567
                                $quizzes[$quiz_uuid] = $quiz;
2568
                            }
2569
                        }
1 www 2570
                        if(!$quiz) {
2571
                            array_push($result_sync_ids, [
2572
                                'success' => false,
2573
                                'sync_id' => $sync_id,
2574
                                'message' => 'ERROR_SLIDE_NOT_FOUND',
2575
                            ]);
2576
                            continue;
2577
                        }
2578
 
2579
                        if(!$capsule || $slide->capsule_id != $capsule->id) {
2580
                            array_push($result_sync_ids, [
2581
                                'success' => false,
2582
                                'sync_id' => $sync_id,
2583
                                'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_SLIDE',
2584
                            ]);
2585
                            continue;
2586
                        }
2587
 
2588
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2589
 
2590
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2591
                        if(!$dt) {
2592
                            $ok = false;
2593
                        } else {
2594
                            $added_on = $dt->format('Y-m-d H:i:s');
2595
                        }
2596
 
2597
                        if(isset($record['points'])) {
2598
                            $points = intval($record['points'], 10);
2599
                        } else {
2600
                            $ok = false;
2601
                        }
2602
 
2603
                        if(isset($record['pass'])) {
2604
                            $status = $record['pass'] == 'yes' ? CompanyMicrolearningUserQuiz::STATUS_PASS : CompanyMicrolearningUserQuiz::STATUS_FAIL;
2605
                        } else {
2606
                            $ok = false;
2607
                        }
2608
 
2609
                        if(!$ok) {
2610
                            array_push($result_sync_ids, [
2611
                                'success' => false,
2612
                                'sync_id' => $sync_id,
1662 efrain 2613
                                'message' => 'ERROR_INVALID_PARAMETERS 9',
1 www 2614
                            ]);
2615
                            continue;
2616
                        }
2617
 
2618
                        $array_response = [];
2619
                        $response = isset($record['response']) ? intval($record['response'], 10) : 0;
2620
                        for($i = 0; $i < $response; $i++)
2621
                        {
2622
                            $question_uuid = isset($record["response_{$i}_question_uuid"]) ? $record["response_{$i}_question_uuid"] : '';
2623
                            $answer_uuid = isset($record["response_{$i}_answer_uuid"]) ? $record["response_{$i}_answer_uuid"] : '';
2624
                            $value = isset($record["response_{$i}_value"]) ?  intval($record["response_{$i}_value"], 10) : 0;
2625
                            $points = isset($record["response_{$i}_points"]) ?  intval($record["response_{$i}_points"], 10) : 0;
2626
 
16 efrain 2627
 
2628
                            if(isset($questions[$question_uuid])) {
2629
                                $question = $questions[$question_uuid];
2630
                            } else {
2631
                                $question = $questionMapper->fetchOneByUuid($question_uuid);
2632
                                if($question) {
2633
                                    $questions[$question_uuid] = $question;
2634
                                }
2635
                            }
2636
 
2637
                            if(!$question || $question->quiz_id != $quiz->id) {
2638
                                array_push($result_sync_ids, [
2639
                                    'success' => false,
2640
                                    'sync_id' => $sync_id,
2641
                                    'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_QUESTION_SLIDE',
1 www 2642
                                ]);
16 efrain 2643
                                continue;
2644
                            }
2645
 
2646
                            if(isset($answers[$answer_uuid])) {
2647
                                $answer = $answers[$answer_uuid];
2648
                            } else {
2649
                                $answer = $answerMapper->fetchOneByUuid($answer_uuid);
2650
                                if($answer) {
2651
                                    $answers[$answer_uuid] = $answer;
2652
                                }
2653
                            }
2654
 
2655
                            if($answer && $answer->question_id != $question->id) {
2656
                                array_push($result_sync_ids, [
2657
                                    'success' => false,
2658
                                    'sync_id' => $sync_id,
2659
                                    'message' => 'ERROR_INVALID_PARAMETERS_QUIZ_ANSWER_SLIDE',
2660
                                ]);
2661
                                continue;
2662
                            }
2663
 
2664
                            array_push($array_response, [
2665
                                'question_uuid' => $question_uuid,
2666
                                'answer_uuid' => $answer_uuid,
2667
                                'value' => $value,
2668
                                'points' => $points
2669
                            ]);
1 www 2670
                        }
2671
 
2672
                        $userQuiz = new CompanyMicrolearningUserQuiz();
2673
                        $userQuiz->company_id = $company->id;
2674
                        $userQuiz->topic_id = $topic->id;
2675
                        $userQuiz->capsule_id = $capsule->id;
2676
                        $userQuiz->slide_id = $slide->id;
2677
                        $userQuiz->quiz_id = $quiz->id;
2678
                        $userQuiz->user_id = $user->id;
2679
                        $userQuiz->added_on = $added_on;
2680
                        $userQuiz->points = $points;
2681
                        $userQuiz->status = $status;
2682
                        $userQuiz->response = json_encode($array_response);
2683
 
2684
                        $userQuizMapper = CompanyMicrolearningUserQuizMapper::getInstance($this->adapter);
2685
 
2686
                        if($userQuizMapper->insert($userQuiz)) {
2687
                            array_push($result_sync_ids, [
2688
                                'success' => true,
2689
                                'sync_id' => $sync_id
2690
                            ]);
2691
                        } else {
2692
                            array_push($result_sync_ids, [
2693
                                'success' => false,
2694
                                'sync_id' => $sync_id,
2695
                                'message' => $userQuizMapper->getError()
2696
                            ]);
2697
                        }
2698
                        continue;
2699
                    }
2700
 
2701
                    if($sync_type == 'microlearning-progress') {
2702
                        $ok = true;
2703
 
2704
                        $type = isset($record['type']) ? $record['type'] : '';
2705
                        switch($type)
2706
                        {
2707
                            case CompanyMicrolearningUserProgress::TYPE_TOPIC :
2708
                                if(!$topic) {
2709
                                    $ok = false;
2710
                                }
2711
                                break;
2712
 
2713
                            case CompanyMicrolearningUserProgress::TYPE_CAPSULE :
2714
                                if(!$topic || !$capsule) {
2715
                                    $ok = false;
2716
                                }
2717
                                break;
2718
 
2719
                            case CompanyMicrolearningUserProgress::TYPE_SLIDE :
2720
                                if(!$topic || !$capsule || !$slide) {
2721
                                    $ok = false;
2722
                                }
2723
                                break;
2724
 
2725
                            default :
2726
                                $ok = false;
2727
                                break;
2728
                        }
2729
 
2730
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2731
                        $updated_on = isset($record['updated_on'])    ? filter_var($record['updated_on'], FILTER_SANITIZE_STRING) :  '';
2732
 
2733
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2734
                        if(!$dt) {
2735
                            $ok = false;
2736
                        } else {
2737
                            $added_on = $dt->format('Y-m-d H:i:s');
2738
                        }
2739
 
2740
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $updated_on );
2741
                        if(!$dt) {
2742
                            $ok = false;
2743
                        } else {
2744
                            $updated_on = $dt->format('Y-m-d H:i:s');
2745
                        }
2746
 
2747
                        if(!$ok) {
2748
                            array_push($result_sync_ids, [
2749
                                'success' => false,
2750
                                'sync_id' => $sync_id,
1662 efrain 2751
                                'message' => 'ERROR_INVALID_PARAMETERS 10',
1 www 2752
                            ]);
2753
                            continue;
2754
                        }
2755
 
18 efrain 2756
                        $progress                   = isset($record['progress'])                  ? floatval($record['progress']) :  0;
2757
                        $total_slides               = isset($record['total_slides'])              ? intval($record['total_slides'], 10) :  0;
2758
                        $view_slides                = isset($record['view_slides'])               ? intval($record['view_slides'], 10) :  0;
1 www 2759
                        $returning                  = isset($record['returning'])                 ? intval($record['returning'], 10) :  0;
2760
                        $returning_after_completed  = isset($record['returning_after_completed']) ? intval($record['returning_after_completed'], 10) :  0;
2761
                        $completed                  = isset($record['completed'])                 ? intval($record['completed'], 10) :  0;
2762
 
16 efrain 2763
 
1 www 2764
                        $recordProgress = null;
2765
                        switch($type) {
2766
                            case CompanyMicrolearningUserProgress::TYPE_TOPIC  :
16 efrain 2767
                                $recordProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($user->id, $topic->id);
1 www 2768
 
2769
                                break;
2770
 
2771
                            case CompanyMicrolearningUserProgress::TYPE_CAPSULE  :
16 efrain 2772
                                $recordProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($user->id, $capsule->id);
1 www 2773
                                break;
2774
 
2775
                            case CompanyMicrolearningUserProgress::TYPE_SLIDE  :
16 efrain 2776
                                $recordProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($user->id, $slide->id);
1 www 2777
                                break;
2778
 
2779
                            default :
2780
                                $recordProgress= null;
2781
                        }
2782
 
2783
 
2784
                        if(!$recordProgress) {
2785
                            $recordProgress = new CompanyMicrolearningUserProgress();
2786
 
2787
                            $recordProgress->user_id    = $user->id;
2788
                            $recordProgress->type       = $type;
2789
                            $recordProgress->company_id = $topic->company_id;
2790
                            $recordProgress->topic_id   = $topic->id;
2791
                            $recordProgress->capsule_id = $capsule ? $capsule->id : null;
2792
                            $recordProgress->slide_id   = $slide ? $slide->id : null;
2793
                            $recordProgress->added_on   = $added_on;
43 efrain 2794
                        }
2795
                        /*
2796
                        else {
16 efrain 2797
 
2798
                            if($recordProgress->updated_on > $updated_on) {
2799
                                array_push($result_sync_ids, [
2800
                                    'success' => true,
2801
                                    'sync_id' => $sync_id,
2802
                                ]);
2803
                                continue;
2804
                            }
2805
 
2806
 
2807
 
43 efrain 2808
                        }*/
1 www 2809
                        $recordProgress->returning                  = $returning;
2810
                        $recordProgress->returning_after_completed  = $returning_after_completed;
2811
                        $recordProgress->completed                  = $completed;
2812
 
2813
                        if($type == CompanyMicrolearningUserProgress::TYPE_TOPIC ) {
2814
 
2815
                            $capsule_ids = [];
2816
                            $companyMicrolearningCapsuleUser = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
2817
                            $records =  $companyMicrolearningCapsuleUser->fetchAllActiveByUserId($user->id);
2818
                            foreach($records as $record)
2819
                            {
2820
                                if($now >= $record->paid_from || $now <= $capsuleUser->paid_to) {
2821
                                    if(!in_array($record->capsule_id, $capsule_ids)) {
2822
                                        array_push($capsule_ids, $record->capsule_id);
2823
                                    }
2824
                                }
2825
                            }
18 efrain 2826
 
2827
                            $recordProgress->progress       = $progress;
1 www 2828
                            $recordProgress->total_slides   = $total_slides;
2829
                            $recordProgress->view_slides    = $view_slides;
2830
                        }
2831
                        else if($type == CompanyMicrolearningUserProgress::TYPE_CAPSULE ) {
18 efrain 2832
 
2833
                            $recordProgress->progress       = $progress;
1 www 2834
                            $recordProgress->total_slides   = $total_slides;
2835
                            $recordProgress->view_slides    = $view_slides;
2836
                        }
2837
                        else {
2838
                            $recordProgress->progress       = 0;
2839
                            $recordProgress->total_slides   = 0;
2840
                            $recordProgress->view_slides    = 0;
2841
                        }
2842
 
2843
                        $recordProgress->updated_on = $updated_on;
2844
 
2845
 
2846
 
2847
                        if($recordProgress->id) {
16 efrain 2848
                            $result = $userProgressMapper->update($recordProgress);
1 www 2849
                        } else {
16 efrain 2850
                            $result = $userProgressMapper->insert($recordProgress);
1 www 2851
                        }
2852
 
2853
                        if($result) {
2854
                            array_push($result_sync_ids, [
2855
                                'success' => true,
2856
                                'sync_id' => $sync_id
2857
                            ]);
2858
                        } else {
2859
                            array_push($result_sync_ids, [
2860
                                'success' => false,
2861
                                'sync_id' => $sync_id,
16 efrain 2862
                                'message' => $userProgressMapper->getError()
1 www 2863
                            ]);
2864
                        }
2865
                        continue;
2866
                    }
2867
 
2868
 
2869
 
2870
                    if($sync_type == 'microlearning-userlog') {
2871
                        $activity   = isset($record['activity'])      ? filter_var($record['activity'], FILTER_SANITIZE_STRING)  :  '';
2872
                        $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2873
 
2874
                        if(empty($activity)) {
2875
                            $ok = false;
2876
                        }
2877
 
2878
                        $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2879
                        if(!$dt) {
2880
                            $ok = false;
2881
                        } else {
2882
                            $added_on = $dt->format('Y-m-d H:i:s');
2883
                        }
2884
 
2885
                        if(!$ok) {
2886
                            array_push($result_sync_ids, [
2887
                                'success' => false,
2888
                                'sync_id' => $sync_id,
1662 efrain 2889
                                'message' => 'ERROR_INVALID_PARAMETERS 11',
1 www 2890
                            ]);
2891
                            continue;
2892
                        }
2893
 
2894
 
2895
 
2896
 
16 efrain 2897
                        $userLog = $userLogMapper->fetchLastBy($user->id);
2898
                        if($userLog) {
2899
                            $insert = $userLog->added_on <= $added_on;
2900
                        } else {
2901
                            $insert = true;
2902
                        }
2903
 
2904
 
2905
                        if($insert) {
2906
 
2907
                            $userLog = new CompanyMicrolearningUserLog();
2908
                            $userLog->activity      = $activity;
2909
                            $userLog->user_id       = $user->id;
2910
                            $userLog->company_id    = $topic->company_id;
2911
                            $userLog->topic_id      = $topic->id;
2912
                            $userLog->capsule_id    = $capsule ? $capsule->id : null;
2913
                            $userLog->slide_id      = $slide ? $slide->id : null;
2914
                            $userLog->added_on      = $added_on;
2915
 
2916
 
2917
 
2918
 
2919
                            if($userLogMapper->insert($userLog)) {
2920
                                array_push($result_sync_ids, [
2921
                                    'success' => true,
2922
                                    'sync_id' => $sync_id
2923
                                ]);
2924
                            } else {
2925
                                array_push($result_sync_ids, [
2926
                                    'success' => false,
2927
                                    'sync_id' => $sync_id,
2928
                                    'message' => $userLogMapper->getError()
2929
                                ]);
2930
                            }
2931
                        } else {
1 www 2932
                            array_push($result_sync_ids, [
2933
                                'success' => true,
16 efrain 2934
                                'sync_id' => $sync_id
1 www 2935
                            ]);
2936
                        }
2937
                        continue;
2938
                    }
2939
 
2940
                }
2941
 
2942
                /***** FIN MICROLEARNING *****/
2943
 
2944
 
2945
                /***** INICIO LOG DE USUARIO GENERAL *****/
2946
 
2947
                if($user_uuid && $sync_type == 'userlog' && $device->application_id = Application::TWOGETSKILLS) {
2948
 
2949
 
1662 efrain 2950
 
16 efrain 2951
                    if(isset($users[$user_uuid])) {
2952
                        $user = $users[$user_uuid];
2953
                    } else {
2954
                        $user = $userMapper->fetchOneByUuid($user_uuid);
2955
                        if($user) {
2956
                            $users[$user_uuid] = $user;
2957
                        }
2958
                    }
2959
 
2960
 
2961
 
2962
 
1 www 2963
                    if(!$user) {
2964
                        array_push($result_sync_ids, [
2965
                            'success' => false,
2966
                            'sync_id' => $sync_id,
2967
                            'message' => 'ERROR_USER_NOT_FOUND',
2968
                            'fatal' => true
2969
                        ]);
2970
                        continue;
2971
                    }
2972
 
2973
 
2974
                    if($user->status != User::STATUS_ACTIVE) {
2975
                        array_push($result_sync_ids, [
2976
                            'success' => false,
2977
                            'sync_id' => $sync_id,
2978
                            'message' => 'ERROR_USER_IS_NOT_ACTIVE',
2979
                            'fatal' => true
2980
                        ]);
2981
                        continue;
2982
                    }
2983
 
2984
                    $activity   = isset($record['activity'])      ? filter_var($record['activity'], FILTER_SANITIZE_STRING)  :  '';
2985
                    $added_on   = isset($record['added_on'])      ? filter_var($record['added_on'], FILTER_SANITIZE_STRING)  :  '';
2986
 
2987
                    if(empty($activity)) {
2988
                        $ok = false;
2989
                    }
2990
 
2991
                    $dt = \DateTime::createFromFormat($serviceDatetimeFormat, $added_on);
2992
                    if(!$dt) {
2993
                        $ok = false;
2994
                    } else {
2995
                        $added_on = $dt->format('Y-m-d H:i:s');
2996
                    }
2997
 
2998
                    if(!$ok) {
2999
                        array_push($result_sync_ids, [
3000
                            'success' => false,
3001
                            'sync_id' => $sync_id,
1662 efrain 3002
                            'message' => 'ERROR_INVALID_PARAMETERS 12',
1 www 3003
                        ]);
3004
                        continue;
3005
                    }
3006
 
3007
 
16 efrain 3008
                    $userLog = $userLogMapper->fetchLastBy($user->id);
3009
                    if($userLog) {
3010
                        $insert = $userLog->added_on <= $added_on;
3011
                    } else {
3012
                        $insert = true;
3013
                    }
1 www 3014
 
16 efrain 3015
 
3016
                    if($insert) {
3017
                        $userLog = new CompanyMicrolearningUserLog();
3018
                        $userLog->company_id = null;
3019
                        $userLog->user_id = $user->id;
3020
                        $userLog->activity = $activity;
3021
                        $userLog->added_on = $added_on;
3022
 
3023
 
3024
                        $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
3025
                        if($userLogMapper->insert($userLog)) {
3026
                            array_push($result_sync_ids, [
3027
                                'success' => true,
3028
                                'sync_id' => $sync_id
3029
                            ]);
3030
                        } else {
3031
                            array_push($result_sync_ids, [
3032
                                'success' => false,
3033
                                'sync_id' => $sync_id,
3034
                                'message' => $userLogMapper->getError()
3035
                            ]);
3036
                        }
3037
                    } else {
1 www 3038
                        array_push($result_sync_ids, [
3039
                            'success' => true,
3040
                            'sync_id' => $sync_id
3041
                        ]);
3042
                    }
3043
 
16 efrain 3044
 
3045
 
1 www 3046
                    continue;
3047
                }
3048
 
3049
                /***** FIN LOG DE USUARIO GENERAL ******/
3050
            }
3051
 
3052
            if( $result_sync_ids) {
3053
                return new JsonModel([
3054
                    'success' => true,
3055
                    'data' => $result_sync_ids
3056
                ]);
3057
            } else {
3058
                return new JsonModel([
3059
                    'success' => false,
1662 efrain 3060
                    'data' => 'ERROR_INVALID_PARAMETERS 13'
1 www 3061
                ]);
3062
            }
3063
 
3064
 
3065
        }
3066
 
3067
        return new JsonModel([
3068
            'success' => false,
3069
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
3070
        ]);
3071
    }
3072
 
3073
    /**
3074
     *
3075
     * @param User $user
3076
     * @param boolean $includeLogs
3077
     * @param boolean $includeProgress
3078
     * @return array[]
3079
     */
3080
    private function getSyncData($user, $includeLogs = true, $includeProgress = true)
3081
    {
3082
 
3083
        $serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];
3084
 
3085
        $data = [
3086
            'userlog'   => [],
3087
            'progress'  => [],
3088
            'topics'    => [],
3089
            'quizzes'   => [],
47 efrain 3090
            'extended'  => [],
1 www 3091
        ];
3092
 
3093
 
3094
        $companies = [];
3095
        $companyMapper = CompanyMapper::getInstance($this->adapter);
3096
 
3097
        $topics = [];
3098
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
3099
 
3100
        $capsules = [];
3101
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
3102
 
3103
        $slides = [];
3104
        $slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);
3105
 
3106
        $quizzes = [];
3107
        $quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);
3108
 
3109
        $questions = [];
3110
        $questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);
3111
 
3112
        $answers = [];
3113
        $answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);
3114
 
3115
 
3116
        $userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);
3117
 
3118
        if($includeLogs) {
3119
 
54 efrain 3120
            //$records = $userLogMapper->fetchLast20ByUserId($user->id);
3121
            $records = $userLogMapper->fetchAllByUserId($user->id);
1 www 3122
            foreach($records as $record)
3123
            {
3124
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
3125
 
3126
                if($record->company_id) {
3127
 
3128
                    if(isset($companies[$record->company_id])) {
3129
                        $company = $companies[$record->company_id];
3130
                    } else {
3131
                        $company = $companyMapper->fetchOne($record->company_id);
3132
                        $companies[$record->company_id] = $company;
3133
                    }
3134
                } else {
3135
                    $company = null;
3136
                }
3137
 
3138
                if($record->topic_id) {
3139
 
3140
                    if(isset($topics[$record->topic_id])) {
3141
                        $topic = $topics[$record->topic_id];
3142
                    } else {
3143
                        $topic = $topicMapper->fetchOne($record->topic_id);
3144
                        $topics[$record->topic_id] = $topic;
3145
                    }
3146
                } else {
3147
                    $topic = null;
3148
                }
3149
 
3150
 
3151
                if($record->capsule_id) {
3152
 
3153
                    if(isset($capsules[$record->capsule_id])) {
3154
                        $capsule = $capsules[$record->capsule_id];
3155
                    } else {
3156
                        $capsule = $capsuleMapper->fetchOne($record->capsule_id);
3157
                        $capsules[$record->capsule_id] = $capsule;
3158
                    }
3159
                } else {
3160
                    $capsule = null;
3161
                }
3162
 
3163
 
3164
                if($record->slide_id) {
3165
 
3166
                    if(isset($slides[$record->slide_id])) {
3167
                        $slide = $slides[$record->slide_id];
3168
                    } else {
3169
                        $slide = $slideMapper->fetchOne($record->slide_id);
3170
                        $slides[$record->slide_id] = $slide;
3171
                    }
3172
                } else {
3173
                    $slide = null;
3174
                }
3175
 
3176
 
3177
                array_push($data['userlog'], [
3178
                    'user_uuid'     => $user->uuid,
3179
                    'company_uuid'  => $company ? $company->uuid : '',
3180
                    'topic_uuid'    => $topic ? $topic->uuid : '',
3181
                    'capsule_uuid'  => $capsule ? $capsule->uuid : '',
3182
                    'slide_uuid'    => $slide ? $slide->uuid : '',
3183
                    'activity'      => $record->activity,
3184
                    'added_on'      => $dt->format($serviceDatetimeFormat),
3185
                ]);
3186
 
3187
 
3188
            }
3189
        }
3190
 
3191
        if($includeProgress) {
3192
 
3193
            $userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);
3194
            $records = $userProgressMapper->fetchAllByUserId($user->id);
3195
            foreach($records as $record)
3196
            {
3197
                if($record->company_id) {
3198
 
3199
                    if(isset($companies[$record->company_id])) {
3200
                        $company = $companies[$record->company_id];
3201
                    } else {
3202
                        $company = $companyMapper->fetchOne($record->company_id);
3203
                        $companies[$record->company_id] = $company;
3204
                    }
3205
                } else {
3206
                    $company = null;
3207
                }
3208
 
3209
                if($record->topic_id) {
3210
 
3211
                    if(isset($topics[$record->topic_id])) {
3212
                        $topic = $topics[$record->topic_id];
3213
                    } else {
3214
                        $topic = $topicMapper->fetchOne($record->topic_id);
3215
                        $topics[$record->topic_id] = $topic;
3216
                    }
3217
                } else {
3218
                    $topic = null;
3219
                }
3220
 
3221
 
3222
                if($record->capsule_id) {
3223
 
3224
                    if(isset($capsules[$record->capsule_id])) {
3225
                        $capsule = $capsules[$record->capsule_id];
3226
                    } else {
3227
                        $capsule = $capsuleMapper->fetchOne($record->capsule_id);
3228
                        $capsules[$record->capsule_id] = $capsule;
3229
                    }
3230
                } else {
3231
                    $capsule = null;
3232
                }
3233
 
3234
 
3235
                if($record->slide_id) {
3236
 
3237
                    if(isset($slides[$record->slide_id])) {
3238
                        $slide = $slides[$record->slide_id];
3239
                    } else {
3240
                        $slide = $slideMapper->fetchOne($record->slide_id);
3241
                        $slides[$record->slide_id] = $slide;
3242
                    }
3243
                } else {
3244
                    $slide = null;
3245
                }
3246
 
3247
 
3248
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
3249
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
3250
 
3251
                array_push($data['progress'], [
3252
                    'user_uuid'                 => $user->uuid,
3253
                    'company_uuid'              => $company ? $company->uuid : '',
3254
                    'topic_uuid'                => $topic ? $topic->uuid : '',
3255
                    'capsule_uuid'              => $capsule ? $capsule->uuid : '',
3256
                    'slide_uuid'                => $slide ? $slide->uuid : '',
3257
                    'progress'                  => $record->progress ? $record->progress : 0,
3258
                    'total_slides'              => $record->total_slides ? $record->total_slides : 0,
3259
                    'view_slides'               => $record->view_slides ? $record->view_slides : 0,
3260
                    'type'                      => $record->type,
3261
                    'returning'                 => $record->returning ? $record->returning : 0,
3262
                    'returning_after_completed' => $record->returning_after_completed ? $record->returning_after_completed : 0,
3263
                    'completed'                 => $record->completed ? $record->completed : 0,
3264
                    'added_on'                  => $dtAddedOn->format($serviceDatetimeFormat),
3265
                    'updated_on'                => $dtUpdatedOn->format($serviceDatetimeFormat),
3266
                ]);
3267
            }
3268
        }
3269
 
3270
 
3271
        $now = date('Y-m-d H:i:s');
3272
        $companies_with_access  = [];
3273
        $topics_with_access     = [];
3274
        $capsules_with_access   = [];
3275
        $quizzes_with_access    = [];
3276
        $quizzes                = [];
3277
 
3278
 
1323 efrain 3279
        $capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);
1 www 3280
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
3281
        $records = $capsuleUserMapper->fetchAllActiveByUserId($user->id);
3282
 
3283
 
3284
        foreach($records as $record)
3285
        {
3286
            if($record->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED && $record->access != CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
3287
                continue;
3288
            }
3289
            if($record->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {
3290
                if($now < $record->paid_from || $now > $record->paid_to) {
3291
                    continue;
3292
                }
3293
            }
3294
 
3295
 
3296
            if(!in_array($record->company_id,$companies_with_access)) {
3297
                array_push($companies_with_access, $record->company_id);
3298
            }
3299
 
3300
            if(!in_array($record->topic_id,$topics_with_access)) {
3301
                array_push($topics_with_access, $record->topic_id);
3302
            }
3303
 
3304
            if(!in_array($record->capsule_id,$capsules_with_access)) {
3305
                array_push($capsules_with_access, $record->capsule_id);
3306
            }
3307
        }
3308
 
3309
 /*
3310
        echo '$companies_with_access ' . PHP_EOL;
3311
        print_r($companies_with_access);
3312
 
3313
        echo '$topics_with_access ' . PHP_EOL;
3314
        print_r($topics_with_access);
3315
 
3316
        echo '$capsules_with_access' . PHP_EOL;
3317
        print_r($capsules_with_access);
3318
        */
3319
 
3320
        $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
3321
        foreach($companies_with_access as $company_id)
3322
        {
3323
            $companyService =  $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company_id, Service::MICRO_LEARNING);
3324
 
3325
            //print_r($companyService); exit;
3326
 
3327
            if(!$companyService) {
3328
                continue;
3329
            }
3330
 
3331
 
3332
            if(isset($companies[$companyService->company_id])) {
3333
                $company = $companies[$companyService->company_id];
3334
            } else {
3335
                $company = $companyMapper->fetchOne($companyService->company_id);
3336
                $companies[$companyService->company_id] = $company;
3337
            }
3338
 
3339
            $topics = $topicMapper->fetchAllActiveByCompanyId($company_id);
3340
            foreach($topics as $topic)
3341
            {
3342
                if(!in_array($topic->id, $topics_with_access)) {
3343
                    continue;
3344
                }
3345
 
3346
                $record_capsules = [];
3347
                $capsules = $capsuleMapper->fetchAllActiveByCompanyIdAndTopicId($topic->company_id, $topic->id);
3348
                foreach($capsules as $capsule)
3349
                {
3350
                    if(!in_array($capsule->id, $capsules_with_access)) {
3351
                        continue;
3352
                    }
3353
 
3354
 
3355
                    $record_slides = [];
3356
                    $slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
3357
                    foreach($slides as $slide)
3358
                    {
3359
                        if($slide->type == CompanyMicrolearningSlide::TYPE_QUIZ) {
3360
                            if(!in_array($slide->quiz_id, $quizzes_with_access)) {
3361
                                array_push($quizzes_with_access, $slide->quiz_id);
3362
                            }
3363
 
3364
                            if(isset($quizzes[$slide->quiz_id])) {
3365
                                $quiz = $quizzes[$slide->quiz_id];
3366
 
3367
                            } else {
3368
                                $quiz = $quizMapper->fetchOne($slide->quiz_id);
3369
                                $quizzes[$slide->quiz_id] =  $quiz;
3370
                            }
3371
                        } else {
3372
                            $quiz = null;
3373
                        }
3374
 
3375
 
630 efrain 3376
                        $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $slide->added_on);
3377
                        $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $slide->updated_on);
1 www 3378
 
3379
                        array_push($record_slides, [
3380
                            'uuid' => $slide->uuid,
3381
                            'quiz_uuid' => $quiz ? $quiz->uuid : '',
3382
                            'name' => $slide->name ? $slide->name : '',
3383
                            'description' => $slide->description ? $slide->description : '',
3384
                            'position' => $slide->order,
3385
                            'type' => $slide->type,
3386
                            'background' => $slide->background ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '',
3387
                            'file' => $slide->file ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '',
630 efrain 3388
                            'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
3389
                            'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1 www 3390
                        ]);
3391
                    }
3392
 
630 efrain 3393
                    $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $capsule->added_on);
3394
                    $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $capsule->updated_on);
3395
 
1323 efrain 3396
                    $dataCountrAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);
3397
 
3398
 
3399
 
1 www 3400
                    array_push($record_capsules, [
3401
                        'uuid' => $capsule->uuid,
3402
                        'name' => $capsule->name ? $capsule->name : '',
3403
                        'description' => $capsule->description ? $capsule->description : '',
3404
                        'image' => $capsule->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true])  : '',
3405
                        'position' => $capsule->order,
3406
                        'slides' => $record_slides,
1610 efrain 3407
                        'link_comments' => $this->url()->fromRoute('services/microlearning/capsules/comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),
3408
                        'link_comment_add' => $this->url()->fromRoute('services/microlearning/capsules/comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),
1323 efrain 3409
                        'total_comments' => $dataCountrAndRatingAverage['total_comments'],
3410
                        'total_rating' => $dataCountrAndRatingAverage['total_rating'],
630 efrain 3411
                        'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
3412
                        'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1 www 3413
                    ]);
3414
                }
3415
 
630 efrain 3416
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $topic->added_on);
3417
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $topic->updated_on);
3418
 
1 www 3419
                array_push($data['topics'], [
3420
                    'uuid' => $topic->uuid,
3421
                    'name' => $topic->name ? $topic->name : '',
3422
                    'description' => $topic->description ? $topic->description : '',
3423
                    'image' => $topic->image ? $this->url()->fromRoute('services/storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '',
3424
                    'position' => $topic->order,
3425
                    'company_uuid' => $company->uuid,
3426
                    'company_name' => $company->name,
3427
                    'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
630 efrain 3428
                    'capsules' => $record_capsules,
3429
                    'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
3430
                    'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
3431
 
1 www 3432
                ]);
630 efrain 3433
 
3434
 
3435
 
3436
 
1 www 3437
            }
3438
        }
3439
 
3440
 
3441
 
3442
        foreach($quizzes_with_access as $quiz_id)
3443
        {
3444
            if(isset($quizzes[$quiz_id])) {
3445
                $quiz = $quizzes[$quiz_id];
3446
            } else {
3447
                $quiz = $quizMapper->fetchOne($quiz_id);
3448
                array_push($quizzes, $quiz);
3449
            }
3450
 
3451
            if(isset($companies[$quiz->company_id])) {
3452
                $company = $companies[$quiz->company_id];
3453
            } else {
3454
                $company = $companyMapper->fetchOne($quiz->company_id);
3455
                $companies[$quiz->company_id] = $company;
3456
            }
3457
 
3458
 
3459
            $record_questions = [];
3460
            $questions = $questionMapper->fetchAllByQuizId($quiz->id);
3461
            foreach($questions as $question)
3462
            {
3463
                $record_answers = [];
3464
 
3465
                $answers = $answerMapper->fetchAllByQuizIdAndQuestionId($question->quiz_id, $question->id);
3466
                foreach($answers as $answer)
3467
                {
630 efrain 3468
 
3469
                    $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->added_on);
3470
                    $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->updated_on);
3471
 
1 www 3472
                    array_push($record_answers, [
3473
                        'uuid' => $answer->uuid,
3474
                        'text' => trim($answer->text),
3475
                        'correct' => $answer->correct ? $answer->correct  : 0 ,
3476
                        'points' => intval($answer->points, 10),
630 efrain 3477
                        'added_on'  => $dtAddedOn->format($serviceDatetimeFormat),
3478
                        'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1 www 3479
                    ]);
3480
                }
3481
 
630 efrain 3482
                $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->added_on);
3483
                $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->updated_on);
3484
 
1 www 3485
                array_push($record_questions, [
630 efrain 3486
                    'uuid'          => $question->uuid,
3487
                    'text'          => trim($question->text),
3488
                    'type'          => $question->type,
3489
                    'maxlength'     => $question->maxlength,
3490
                    'points'        => $question->points,
3491
                    'answers'       => $record_answers,
3492
                    'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
3493
                    'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1 www 3494
                ]);
3495
            }
3496
 
630 efrain 3497
            $dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->added_on);
3498
            $dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->updated_on);
1 www 3499
 
630 efrain 3500
 
1 www 3501
            array_push($data['quizzes'], [
3502
                'uuid' => $quiz->uuid,
3503
                'name' => $quiz->name,
3504
                'text' => trim($quiz->text ? $quiz->text : ''),
3505
                'failed' => trim($quiz->failed ? $quiz->failed : ''),
3506
                'points' => $quiz->points,
3507
                'minimum_points_required' => $quiz->minimum_points_required,
3508
                'max_time' => $quiz->max_time ? $quiz->max_time : 5,
3509
                'company_uuid' => $company->uuid,
3510
                'company_name' => $company->name,
3511
                'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
630 efrain 3512
                'questions'     => $record_questions,
3513
                'added_on'      => $dtAddedOn->format($serviceDatetimeFormat),
3514
                'updated_on'    => $dtUpdatedOn->format($serviceDatetimeFormat),
1 www 3515
            ]);
3516
        }
47 efrain 3517
 
3518
        $companyExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);
3519
        $companyExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
3520
        $companyExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
3521
        $companyExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);
3522
        $companyExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
3523
        $companyExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
3524
        $companyExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);
3525
        $companyExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
3526
        $companyExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);
3527
 
3528
        $companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);
3529
        foreach($companies_with_access as $company_id)
3530
        {
3531
            $companyService =  $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company_id, Service::MICRO_LEARNING);
3532
 
3533
            //print_r($companyService); exit;
3534
 
3535
            if(!$companyService) {
3536
                continue;
3537
            }
3538
 
3539
 
3540
            if(isset($companies[$companyService->company_id])) {
3541
                $company = $companies[$companyService->company_id];
3542
            } else {
3543
                $company = $companyMapper->fetchOne($companyService->company_id);
3544
                $companies[$companyService->company_id] = $company;
3545
            }
3546
 
3547
            if(!$company) {
3548
                continue;
3549
            }
3550
 
3551
            $record = [
3552
                'company_uuid' => $company->uuid,
3553
                'company_name' => $company->name,
3554
                'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),
48 efrain 3555
                'details' => [],
47 efrain 3556
            ];
3557
 
3558
            $companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
3559
            if(!$companyExtendUser) {
3560
                continue;
3561
            }
3562
 
3563
            if($companyExtendUser->extend_company_id) {
3564
 
3565
                $extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);
3566
                if($extendedCompany) {
48 efrain 3567
                    array_push($record['details'],[
3568
                        'uuid' => $extendedCompany->uuid,
3569
                        'label' => 'LABEL_COMPANY',
3570
                        'value' => $extendedCompany->name
3571
                    ]);
47 efrain 3572
                }
3573
            }
3574
 
3575
            if($companyExtendUser->extend_function_id) {
3576
                $extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);
3577
                if($extendedFunction) {
48 efrain 3578
                    array_push($record['details'],[
3579
                        'uuid' => $extendedFunction->uuid,
3580
                        'label' => 'LABEL_FUNCTION',
3581
                        'value' => $extendedFunction->name
3582
                    ]);
47 efrain 3583
                }
3584
            }
3585
 
3586
            if($companyExtendUser->extend_group_id) {
3587
                $extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);
3588
                if($extendedGroup) {
48 efrain 3589
                    array_push($record['details'],[
3590
                        'uuid' => $extendedGroup->uuid,
3591
                        'label' => 'LABEL_GROUP',
3592
                        'value' => $extendedGroup->name
3593
                    ]);
47 efrain 3594
                }
3595
            }
3596
 
3597
            if($companyExtendUser->extend_institution_id) {
3598
                $extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);
3599
                if($extendedInstitution) {
48 efrain 3600
                    array_push($record['details'],[
3601
                        'uuid' => $extendedInstitution->uuid,
3602
                        'label' => 'LABEL_INSTITUTION',
3603
                        'value' => $extendedInstitution->name
3604
                    ]);
47 efrain 3605
                }
3606
            }
3607
 
3608
            if($companyExtendUser->extend_program_id) {
3609
                $extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);
3610
                if($extendedProgram) {
48 efrain 3611
                    array_push($record['details'],[
3612
                        'uuid' => $extendedProgram->uuid,
3613
                        'label' => 'LABEL_PROGRAM',
3614
                        'value' => $extendedProgram->name
3615
                    ]);
3616
 
47 efrain 3617
                }
3618
            }
3619
 
3620
            if($companyExtendUser->extend_sector_id) {
3621
                $extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);
3622
                if($extendedSector) {
48 efrain 3623
                    array_push($record['details'],[
3624
                        'uuid' => $extendedSector->uuid,
3625
                        'label' => 'LABEL_SECTOR',
3626
                        'value' => $extendedSector->name
3627
                    ]);
47 efrain 3628
                }
3629
            }
3630
 
3631
            if($companyExtendUser->extend_partner_id) {
3632
                $extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);
3633
                if($extendedPartner) {
48 efrain 3634
                    array_push($record['details'],[
3635
                        'uuid' => $extendedPartner->uuid,
3636
                        'label' => 'LABEL_PARTNER',
3637
                        'value' => $extendedPartner->name
3638
                    ]);
47 efrain 3639
                }
3640
            }
3641
 
3642
            if($companyExtendUser->extend_student_type_id) {
3643
                $extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);
3644
                if($extendedStudentType) {
48 efrain 3645
                    array_push($record['details'],[
3646
                        'uuid' => $extendedStudentType->uuid,
3647
                        'label' => 'LABEL_TYPE',
3648
                        'value' => $extendedStudentType->name
3649
                    ]);
47 efrain 3650
                }
3651
            }
3652
 
3653
            array_push($data['extended'], $record);
3654
        }
3655
 
1 www 3656
        return $data;
3657
    }
3658
 
3659
 
3660
    /**
3661
     *
3662
     * @param string $filename
3663
     * @param boolean $retbytes
3664
     * @return boolean|number
3665
     */
3666
    private function readfile_chunked($filename, $retbytes = true) {
3667
        $buffer = '';
3668
        $cnt =0;;
3669
        $handle = fopen($filename,'rb');
3670
        if ($handle === false) {
3671
            return false;
3672
        }
3673
        while (!feof($handle)) {
3674
            $buffer = fread($handle, self::CHUNK_SIZE);
3675
            echo $buffer;
3676
            ob_flush();
3677
            flush();
3678
            if ($retbytes) {
3679
                $cnt += strlen($buffer);
3680
            }
3681
        }
3682
        $status = fclose($handle);
3683
        if ($retbytes && $status) {
3684
            return $cnt; // return num. bytes delivered like readfile() does.
3685
        }
3686
        return $status;
3687
    }
3688
}
1610 efrain 3689
 
3690