Proyectos de Subversion LeadersLinked - Services

Rev

Rev 651 | Rev 658 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 651 Rev 657
Línea 2347... Línea 2347...
2347
        return new JsonModel([
2347
        return new JsonModel([
2348
            'success' => false,
2348
            'success' => false,
2349
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2349
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2350
        ]);
2350
        ]);
2351
    }
2351
    }
-
 
2352
 
-
 
2353
    /**
-
 
2354
     * Marks a slide as completed and updates progress for capsule and topic
-
 
2355
     * 
-
 
2356
     * @return \Laminas\View\Model\JsonModel
-
 
2357
     */
-
 
2358
    public function markSlideCompletedAction()
-
 
2359
    {
-
 
2360
        $request = $this->getRequest();
-
 
2361
        if (!$request->isPost()) {
-
 
2362
            return new JsonModel(['success' => false, 'data' => 'ERROR_INVALID_REQUEST']);
-
 
2363
        }
-
 
2364
 
-
 
2365
        // Get parameters
-
 
2366
        $slide_uuid = $this->params()->fromRoute('slide_uuid');
-
 
2367
        if (empty($slide_uuid)) {
-
 
2368
            return new JsonModel(['success' => false, 'data' => 'ERROR_MISSING_PARAMETERS']);
-
 
2369
        }
-
 
2370
 
-
 
2371
        // Get current user
-
 
2372
        $currentUser = $this->plugin('currentUserPlugin')->getUser();
-
 
2373
        $user_id = $currentUser->id ?? null;
-
 
2374
        if (!$user_id) {
-
 
2375
            return new JsonModel(['success' => false, 'data' => 'ERROR_USER_NOT_FOUND']);
-
 
2376
        }
-
 
2377
 
-
 
2378
        // Get access permissions
-
 
2379
        $accessGrantedIds = $this->getAccessGranted();
-
 
2380
 
-
 
2381
        // Get slide
-
 
2382
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
-
 
2383
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
-
 
2384
        if (!$slide) {
-
 
2385
            return new JsonModel(['success' => false, 'data' => 'ERROR_SLIDE_NOT_FOUND']);
-
 
2386
        }
-
 
2387
 
-
 
2388
        // Get capsule and verify access
-
 
2389
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
-
 
2390
        $capsule = $capsuleMapper->fetchOne($slide->capsule_id);
-
 
2391
        if (!$capsule || !in_array($capsule->id, $accessGrantedIds->capsules)) {
-
 
2392
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_ACCESS_DENIED']);
-
 
2393
        }
-
 
2394
 
-
 
2395
        // Get topic-capsule relations
-
 
2396
        $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
-
 
2397
        $relations = $topicCapsuleMapper->fetchAllByCapsuleId($capsule->id);
-
 
2398
        if (!$relations) {
-
 
2399
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_DOES_NOT_BELONG_TO_TOPIC']);
-
 
2400
        }
-
 
2401
 
-
 
2402
        $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
-
 
2403
        $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
-
 
2404
 
-
 
2405
        foreach ($relations as $relation) {
-
 
2406
            // Mark slide as viewed/completed
-
 
2407
            $progressMapper->markSlideViewed($user_id, $relation->topic_id, $relation->capsule_id, $slide->id);
-
 
2408
 
-
 
2409
            // Update capsule progress
-
 
2410
            $capsuleProgress = $progressMapper->fetchOneByUserIdAndCapsuleId($user_id, $capsule->id);
-
 
2411
            if (!$capsuleProgress) {
-
 
2412
                continue;
-
 
2413
            }
-
 
2414
 
-
 
2415
            // Calculate capsule progress
-
 
2416
            $capsuleProgress->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndCapsuleId($capsule->company_id, $capsule->id);
-
 
2417
            $capsuleProgress->view_slides = $progressMapper->fetchCountAllSlideCompletedByUserIdAndCapsuleId($user_id, $capsule->id);
-
 
2418
            
-
 
2419
            if ($capsuleProgress->total_slides) {
-
 
2420
                $capsuleProgress->progress = ($capsuleProgress->view_slides * 100) / $capsuleProgress->total_slides;
-
 
2421
                $capsuleProgress->progress = $capsuleProgress->progress > 100 ? 100 : $capsuleProgress->progress;
-
 
2422
            }
-
 
2423
 
-
 
2424
            if (!$progressMapper->update($capsuleProgress)) {
-
 
2425
                continue;
-
 
2426
            }
-
 
2427
 
-
 
2428
            // Check if all slides are viewed
-
 
2429
            if ($progressMapper->hasViewedAllSlidesInCapsule($user_id, $capsule->id)) {
-
 
2430
                // Mark capsule as completed
-
 
2431
                $progressMapper->markCapsuleCompleted($user_id, $relation->topic_id, $relation->capsule_id);
-
 
2432
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED';
-
 
2433
 
-
 
2434
                // Check if all capsules in topic are completed
-
 
2435
                if ($progressMapper->hasCompletedAllCapsulesInTopic($user_id, $relation->topic_id)) {
-
 
2436
                    // Mark topic as completed
-
 
2437
                    $progressMapper->markTopicCompleted($user_id, $relation->topic_id);
-
 
2438
                    $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
-
 
2439
                }
-
 
2440
            }
-
 
2441
        }
-
 
2442
 
-
 
2443
        return new JsonModel(['success' => true, 'data' => $data]);
-
 
2444
    }
2352
}
2445
}
2353
2446