Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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