Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev 657 Rev 658
Línea 2100... Línea 2100...
2100
                'success' => false,
2100
                'success' => false,
2101
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2101
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2102
            ]);
2102
            ]);
2103
        }
2103
        }
2104
    }
2104
    }
2105
 
-
 
2106
    /**
-
 
2107
     * 
-
 
2108
     * @return \Laminas\View\Model\JsonModel
-
 
2109
     */
-
 
2110
    public function syncAction()
-
 
2111
    {
-
 
2112
        $request = $this->getRequest();
-
 
2113
        if (!$request->isPost()) {
-
 
2114
            return new JsonModel(['success' => false, 'data' => 'ERROR_INVALID_REQUEST']);
-
 
2115
        }
-
 
2116
 
-
 
2117
        $slide_uuid = $this->params()->fromRoute('slide_uuid');
-
 
2118
 
-
 
2119
        if (empty($slide_uuid)) {
-
 
2120
            return new JsonModel(['success' => false, 'data' => 'ERROR_MISSING_PARAMETERS']);
-
 
2121
        }
-
 
2122
 
-
 
2123
        $currentUser = $this->plugin('currentUserPlugin')->getUser();
-
 
2124
        $user_id = $currentUser->id ?? null;
-
 
2125
        if (!$user_id) {
-
 
2126
            return new JsonModel(['success' => false, 'data' => 'ERROR_USER_NOT_FOUND']);
-
 
2127
        }
-
 
2128
 
-
 
2129
        $accessGrantedIds = $this->getAccessGranted();
-
 
2130
 
-
 
2131
        // Obtener Slide
-
 
2132
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
-
 
2133
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
-
 
2134
        if (!$slide) {
-
 
2135
            return new JsonModel(['success' => false, 'data' => 'ERROR_SLIDE_NOT_FOUND']);
-
 
2136
        }
-
 
2137
 
-
 
2138
        // Obtener Cápsula
-
 
2139
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
-
 
2140
        $capsule = $capsuleMapper->fetchOneById($slide->capsule_id);
-
 
2141
        if (!$capsule || !in_array($capsule->id, $accessGrantedIds->capsules)) {
-
 
2142
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_ACCESS_DENIED']);
-
 
2143
        }
-
 
2144
 
-
 
2145
        $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
-
 
2146
        $relations = $topicCapsuleMapper->fetchAllByCapsuleId($capsule->id);
-
 
2147
        
-
 
2148
        if (!$relations) {
-
 
2149
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_DOES_NOT_BELONG_TO_TOPIC']);
-
 
2150
        }
-
 
2151
 
-
 
2152
        foreach ($relations as $relation) {
-
 
2153
            $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
-
 
2154
            $progressMapper->markSlideViewed($user_id, $relation->topic_id, $relation->capsule_id, $slide->id);
-
 
2155
    
-
 
2156
            $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
-
 
2157
    
-
 
2158
            // Si vio todos los slides → marcar cápsula como completada
-
 
2159
            if ($progressMapper->hasViewedAllSlidesInCapsule($user_id, $capsule->id)) {
-
 
2160
                $progressMapper->markCapsuleCompleted($user_id, $relation->topic_id, $relation->capsule_id);
-
 
2161
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED';
-
 
2162
            }
-
 
2163
    
-
 
2164
            // Si completó todas las cápsulas del tópico → marcar tópico como completado
-
 
2165
            if ($progressMapper->hasCompletedAllCapsulesInTopic($user_id, $relation->topic_id)) {
-
 
2166
                $progressMapper->markTopicCompleted($user_id, $relation->topic_id);
-
 
2167
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
-
 
2168
            }
-
 
2169
        }
-
 
2170
 
-
 
2171
        return new JsonModel(['success' => true, 'data' => $data]);
-
 
2172
    }    
-
 
Línea 2173... Línea 2105...
2173
    
2105
    
2174
    /**
2106
    /**
2175
     * 
2107
     * 
2176
     * @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds
2108
     * @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds
Línea 2220... Línea 2152...
2220
        
2152
        
2221
        return $accessGrantedIds;
2153
        return $accessGrantedIds;
Línea 2222... Línea 2154...
2222
    }
2154
    }
2223
    
-
 
2224
    /**
-
 
2225
     * Marks a slide as completed and cascades completion status to capsule and topic if needed
-
 
2226
     * 
-
 
2227
     * @return \Laminas\View\Model\JsonModel
-
 
2228
     */
-
 
2229
    public function completeSlideAction()
-
 
2230
    {
-
 
2231
        $request = $this->getRequest();
-
 
2232
        if($request->isPost()) {
-
 
2233
            $currentUserPlugin = $this->plugin('currentUserPlugin');
-
 
2234
            $currentUser = $currentUserPlugin->getUser();
-
 
2235
            
-
 
2236
            $slide_uuid = $this->params()->fromRoute('slide_uuid');
-
 
2237
            $topic_uuid = $this->params()->fromRoute('topic_uuid');
-
 
2238
            $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
-
 
2239
 
-
 
2240
            if(empty($slide_uuid) || empty($topic_uuid) || empty($capsule_uuid)) {
-
 
2241
                return new JsonModel([
-
 
2242
                    'success' => false,
-
 
2243
                    'data' => 'ERROR_INVALID_PARAMETERS'
-
 
2244
                ]);
-
 
2245
            }
-
 
2246
 
-
 
2247
            // Get slide
-
 
2248
            $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
-
 
2249
            $slide = $slideMapper->fetchOneByUuid($slide_uuid);
-
 
2250
 
-
 
2251
            if(!$slide) {
-
 
2252
                return new JsonModel([
-
 
2253
                    'success' => false,
-
 
2254
                    'data' => 'ERROR_SLIDE_NOT_FOUND'
-
 
2255
                ]);
-
 
2256
            }
-
 
2257
 
-
 
2258
            // Get capsule
-
 
2259
            $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
-
 
2260
            $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
-
 
2261
 
-
 
2262
            if(!$capsule) {
-
 
2263
                return new JsonModel([
-
 
2264
                    'success' => false,
-
 
2265
                    'data' => 'ERROR_CAPSULE_NOT_FOUND'
-
 
2266
                ]);
-
 
2267
            }
-
 
2268
 
-
 
2269
            // Get topic
-
 
2270
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
-
 
2271
            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
-
 
2272
 
-
 
2273
            if(!$topic) {
-
 
2274
                return new JsonModel([
-
 
2275
                    'success' => false,
-
 
2276
                    'data' => 'ERROR_TOPIC_NOT_FOUND'
-
 
2277
                ]);
-
 
2278
            }
-
 
2279
 
-
 
2280
            // Update slide progress
-
 
2281
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
-
 
2282
            $slideProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);
-
 
2283
            $updated_on = $userProgressMapper->getDatebaseNow();
-
 
2284
            
-
 
2285
            if(!$slideProgress) {
-
 
2286
                $slideProgress = new MicrolearningUserProgress();
-
 
2287
                $slideProgress->user_id = $currentUser->id;
-
 
2288
                $slideProgress->slide_id = $slide->id;
-
 
2289
                $slideProgress->topic_id = $topic->id;
-
 
2290
                $slideProgress->capsule_id = $capsule->id;
-
 
2291
            }
-
 
2292
 
-
 
2293
            $slideProgress->completed = 1;
-
 
2294
            $slideProgress->updated_on = $updated_on;
-
 
2295
 
-
 
2296
            if($userProgressMapper->update($slideProgress)) {
-
 
2297
                $closeCapsule = false;
-
 
2298
                $closeTopic = false;
-
 
2299
            }
-
 
2300
 
-
 
2301
            // Check if capsule is completed
-
 
2302
            $capsuleProgress = $userProgressMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);
-
 
2303
 
-
 
2304
            $capsuleProgress->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndCapsuleId($capsule->company_id, $capsule->id);
-
 
2305
            $capsuleProgress->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndCapsuleId($currentUser->id, $capsule->id);
-
 
2306
            
-
 
2307
            if($capsuleProgress->total_slides) {
-
 
2308
                $capsuleProgress->progress = ($capsuleProgress->view_slides * 100) / $capsuleProgress->total_slides;
-
 
2309
                $capsuleProgress->progress = $capsuleProgress->progress > 100 ? 100 : $capsuleProgress->progress;
-
 
2310
            } 
-
 
2311
            
-
 
2312
            if(!$userProgressMapper->update($capsuleProgress)) {
-
 
2313
                return new JsonModel([
-
 
2314
                    'success' => false,
-
 
2315
                    'data' => $userProgressMapper->getError()
-
 
2316
                ]);
-
 
2317
            }
-
 
2318
             
-
 
2319
            if($capsuleProgress->progress >= 100) {
-
 
2320
                $closeCapsule = true;
-
 
2321
            }
-
 
2322
 
-
 
2323
            // Check if topic is completed
-
 
2324
            $topicProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
-
 
2325
            if($topicProgress->completed) {
-
 
2326
                $closeTopic = true;
-
 
2327
            }
-
 
2328
            
-
 
2329
 
-
 
2330
            // Prepare response
-
 
2331
            $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
-
 
2332
 
-
 
2333
            if($closeCapsule) {
-
 
2334
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED';
-
 
2335
            }
-
 
2336
 
-
 
2337
            if($closeTopic) {
-
 
2338
                $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
-
 
2339
            }
-
 
2340
 
-
 
2341
            return new JsonModel([
-
 
2342
                'success' => true,
-
 
2343
                'data' => $data
-
 
2344
            ]);
-
 
2345
        }
-
 
2346
 
-
 
2347
        return new JsonModel([
-
 
2348
            'success' => false,
-
 
2349
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
-
 
2350
        ]);
-
 
2351
    }
-
 
2352
 
2155
    
2353
    /**
2156
    /**
2354
     * Marks a slide as completed and updates progress for capsule and topic
2157
     * Marks a slide as completed and updates progress for capsule and topic
2355
     * 
2158
     * 
2356
     * @return \Laminas\View\Model\JsonModel
2159
     * @return \Laminas\View\Model\JsonModel
Línea 2398... Línea 2201...
2398
        if (!$relations) {
2201
        if (!$relations) {
2399
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_DOES_NOT_BELONG_TO_TOPIC']);
2202
            return new JsonModel(['success' => false, 'data' => 'ERROR_CAPSULE_DOES_NOT_BELONG_TO_TOPIC']);
2400
        }
2203
        }
Línea 2401... Línea 2204...
2401
 
2204
 
-
 
2205
        $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
-
 
2206
        
2402
        $progressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
2207
        // Actualizar progreso de la diapositiva
-
 
2208
        if(!$progressMapper->updateSlideProgress($user_id, $slide->id, $capsule->id)){
-
 
2209
            return new JsonModel(['success' => false, 'data' => 'ERROR_COULD_NOT_UPDATE_SLIDE_PROGRESS']);
Línea -... Línea 2210...
-
 
2210
        }
2403
        $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED';
2211
 
2404
 
-
 
2405
        foreach ($relations as $relation) {
2212
        // Actualizar progreso de los tópicos
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) {
2213
        foreach ($relations as $relation) {
2420
                $capsuleProgress->progress = ($capsuleProgress->view_slides * 100) / $capsuleProgress->total_slides;
2214
            if(!$progressMapper->updateCapsuleProgress($user_id, $relation->capsule_id, $relation->topic_id)){
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)) {
2215
                return new JsonModel(['success' => false, 'data' => 'ERROR_COULD_NOT_UPDATE_CAPSULE_PROGRESS']);
2436
                    // Mark topic as completed
2216
            }
2437
                    $progressMapper->markTopicCompleted($user_id, $relation->topic_id);
-
 
2438
                    $data = 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED';
2217
            if(!$progressMapper->updateTopicProgress($user_id, $relation->topic_id)){
2439
                }
2218
                return new JsonModel(['success' => false, 'data' => 'ERROR_COULD_NOT_UPDATE_TOPIC_PROGRESS']);
Línea 2440... Línea 2219...
2440
            }
2219
            }
2441
        }
2220
        }
2442
 
2221
 
2443
        return new JsonModel(['success' => true, 'data' => $data]);
2222
        return new JsonModel(['success' => true, 'data' => "LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED"]);