Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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