Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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