Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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