Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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