Rev 245 | Rev 301 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\View\Model\JsonModel;use LeadersLinked\Library\Functions;use LeadersLinked\Mapper\CompanyMicrolearningCapsuleMapper;use LeadersLinked\Mapper\QueryMapper;use LeadersLinked\Mapper\UserMapper;use Laminas\Db\Sql\Select;use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;use LeadersLinked\Mapper\CompanyMicrolearningCapsuleCommentMapper;use LeadersLinked\Form\Service\CapsuleCommentForm;use LeadersLinked\Model\CompanyMicrolearningCapsuleComment;use LeadersLinked\Model\CompanyMicrolearningCapsuleUser;use LeadersLinked\Model\CompanyMicrolearningAnswer;use LeadersLinked\Mapper\CompanyMicrolearningUserProgressMapper;use LeadersLinked\Mapper\CompanyMicrolearningSlideMapper;use LeadersLinked\Mapper\CompanyMicrolearningUserLogMapper;use LeadersLinked\Model\CompanyMicrolearningUserLog;use LeadersLinked\Mapper\CompanyMicrolearningTopicMapper;use LeadersLinked\Mapper\CompanyMapper;use LeadersLinked\Model\CompanyMicrolearningUserProgress;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCompanyMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserFunctionMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserGroupMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserInstitutionMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserPartnerMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserProgramMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserStudentTypeMapper;use LeadersLinked\Mapper\CompanyMicrolearningExtendUserSectorMapper;use LeadersLinked\Mapper\CompanyMicrolearningQuizMapper;use LeadersLinked\Mapper\CompanyMicrolearningQuestionMapper;use LeadersLinked\Mapper\CompanyMicrolearningAnswerMapper;use LeadersLinked\Model\CompanyMicrolearningSlide;class MicrolearningUserAccessGrantedIds{public $companies;public $topics;public $capsules;public function __construct(){$this->companies = [];$this->topics = [];$this->capsules = [];}}class MicrolearningController extends AbstractActionController{/**** @var \Laminas\Db\Adapter\AdapterInterface*/private $adapter;/**** @var \LeadersLinked\Cache\CacheInterface*/private $cache;/**** @var \Laminas\Log\LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @var \Laminas\Mvc\I18n\Translator*/private $translator;/**** @param \Laminas\Db\Adapter\AdapterInterface $adapter* @param \LeadersLinked\Cache\CacheInterface $cache* @param \Laminas\Log\LoggerInterface LoggerInterface $logger* @param array $config* @param \Laminas\Mvc\I18n\Translator $translator*/public function __construct($adapter, $cache, $logger, $config, $translator){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;$this->translator = $translator;}public function indexAction(){$request = $this->getRequest();if($request->isGet()) {return new JsonModel(['success' => true,'data' => ['link_companies' => $this->url()->fromRoute('microlearning/companies',[], ['force_canonical' => true]),'link_timeline' => $this->url()->fromRoute('microlearning/timeline',[], ['force_canonical' => true]),'link_last_capsule_in_progress' => $this->url()->fromRoute('microlearning/last-capsule-in-progress',[], ['force_canonical' => true]),'link_profile' => $this->url()->fromRoute('microlearning/profile',[], ['force_canonical' => true]),'link_topics' => $this->url()->fromRoute('microlearning/topics',[], ['force_canonical' => true]),'link_capsules_pending' => $this->url()->fromRoute('microlearning/capsules-pending',[], ['force_canonical' => true]),'link_capsules_completed' => $this->url()->fromRoute('microlearning/capsules-completed',[], ['force_canonical' => true]),'link_capsules_in_progress' => $this->url()->fromRoute('microlearning/capsules-in-progress',[], ['force_canonical' => true]),]]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function companiesAction(){$request = $this->getRequest();if($request->isGet()) {$currentNetworkPlugin = $this->plugin('currentNetworkPlugin');$currentNetwork = $currentNetworkPlugin->getNetwork();$accessGrantedIds = $this->getAccessGranted();$companyMapper = CompanyMapper::getInstance($this->adapter);$records = $companyMapper->fetchAllByIdsAndNetworkId($accessGrantedIds->companies, $currentNetwork->id);$companies = [];foreach($records as $record){array_push($companies, ['uuid' => $record->uuid,'name' => $record->name,'image' => $this->url()->fromRoute('storage',['type' => 'company', 'code' => $record->uuid, 'filename' => $record->image], ['force_canonical' => true]),'link_progress' => $this->url()->fromRoute('microlearning/progress',['id' => $record->uuid], ['force_canonical' => true]),]);}return new JsonModel(['success' => true,'data' => $companies]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function capsuleCommentsAction(){$request = $this->getRequest();if($request->isGet()) {$serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$capsule_id = $this->params()->fromRoute('capsule_id');$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}$capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);$capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);if(! $capsuleUser) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',]);}$userMapper = UserMapper::getInstance($this->adapter);$users = [];$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$records = $capsuleCommentMapper->fetchAllByCapsuleId($capsule->id);$comments = [];foreach($records as $record){if(isset($users[$record->user_id])) {$user = $users[$record->user_id];} else {$user = $userMapper->fetchOne($record->user_id);if(!$user) {continue;}$users[$record->user_id] = $user;}$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);array_push($comments, ['date' => $dt->format($serviceDatetimeFormat),'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image], ['force_canonical' => true]),'fullname' => trim(trim($user->first_name) . ' ' . trim($user->last_name)),'rating' => strval($record->rating),'comment' => $record->comment,'link_delete' => $record->user_id == $currentUser->id ? $this->url()->fromRoute('microlearning/capsules-comments/delete', ['capsule_id' => $capsule->uuid, 'comment_id' => $record->uuid], ['force_canonical' => true]) : '',]);}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);return new JsonModel(['success' => true,'data' => ['comments' => $comments,'capsule' => ['total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating'])]]]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function capsuleDeleteMyCommentAction(){$request = $this->getRequest();if($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$capsule_id = $this->params()->fromRoute('capsule_id');$comment_id = $this->params()->fromRoute('comment_id');$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}$capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);$capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);if(! $capsuleUser) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',]);}$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$capsuleComment = $capsuleCommentMapper->fetchOneByUuid($comment_id);if(!$capsuleComment) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_COMMENT_NOT_FOUND',]);}if($capsuleComment->capsule_id != $capsule->id || $capsuleComment->user_id != $currentUser->id) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE_COMMENT',]);}$result = $capsuleCommentMapper->delete($capsuleComment->id);if($result) {$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);return new JsonModel(['success' => true,'data' => ['message' => 'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_DELETE','capsule' => ['total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating'])]],]);} else {return new JsonModel(['success' => false,'data' => $capsuleCommentMapper->getError()]);}}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function capsuleAddMyCommentAction(){$request = $this->getRequest();if($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$capsule_id = $this->params()->fromRoute('capsule_id');$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}$capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);$capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($currentUser->id, $capsule->id);if(! $capsuleUser) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE',]);}//$rawdata = file_get_contents("php://input");// error_log('$rawdata = ' . $rawdata );$form = new CapsuleCommentForm();$dataPost = $request->getPost()->toArray();$dataPost['added_on'] = $capsuleMapper->getDatebaseNow();$form->setData($dataPost);if($form->isValid()) {$dataPost = (array) $form->getData();$capsuleComment = new CompanyMicrolearningCapsuleComment();$capsuleComment->company_id = $capsule->company_id;$capsuleComment->topic_id = $capsule->topic_id;$capsuleComment->capsule_id = $capsule->id;$capsuleComment->user_id = $currentUser->id;$capsuleComment->comment = $dataPost['comment'];$capsuleComment->rating = strval($dataPost['rating']);$capsuleComment->added_on = $dataPost['added_on'];$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$result = $capsuleCommentMapper->insert($capsuleComment);if($result) {$capsuleComment = $capsuleCommentMapper->fetchOne($capsuleComment->id);$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);return new JsonModel(['success' => true,'data' => ['message' =>'LABEL_CAPSULE_COMMENT_HAVE_BEEN_SUCCESSFULLY_ADDED','comment' => ['comment' => $capsuleComment->comment,'rating' => $capsuleComment->rating,'link_delete' => $this->url()->fromRoute('microlearning/capsules-comments/delete', ['capsule_id' => $capsule->uuid, 'comment_id' => $capsuleComment->uuid], ['force_canonical' => true])],'capsule' => ['total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating'])]]]);} else {return new JsonModel(['success' => false,'data' => $capsuleCommentMapper->getError()]);}} else {$messages = [];$form_messages = (array) $form->getMessages();foreach($form_messages as $fieldname => $field_messages){$messages[$fieldname] = array_values($field_messages);}return new JsonModel(['success' => false,'data' => $messages]);}}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function lastCapsuleInProgressAction(){$request = $this->getRequest();if($request->isGet()){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$accessGrantedIds = $this->getAccessGranted();$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$userProgress = $userProgressMapper->fetchOneLastCapsuleInProgressByUserIdAndCapsuleIds($currentUser->id, $accessGrantedIds->capsules);$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);if($userProgress) {$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOne($userProgress->capsule_id);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);$topic = $topicMapper->fetchOne($capsule->topic_id);$response = ['success' => true,'data' => ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'completed' => $userProgress->completed,'progress' => $userProgress->progress,'link_get' => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),'added_on' => $userProgress->added_on,'updated_on' => $userProgress->updated_on]];} else {$response = ['success' => true,'data' => []];}} else {$response = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];}return new JsonModel($response);}public function capsulesPendingAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));$order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));$order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));if(!in_array($order_field,['name', 'added_on'] )) {$order_field = 'name';}if(!in_array( $order_direction,['asc', 'desc'])) {$order_field = 'asc';}$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$accessGranted = $this->getAccessGranted();$topics = [];$capsules = [];foreach($accessGranted->capsules as $capsule_id){$userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);if($userProgress) {continue;}$capsule = $capsuleMapper->fetchOne($capsule_id);if($name) {if(empty($name) || stripos($capsule->name, $name) === false) {continue;}}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);if(isset($topics[$capsule->topic_id])) {$topic = $topics[$capsule->topic_id];} else {$topic = $topicMapper->fetchOne($capsule->topic_id);$topics[ $capsule->topic_id ] = $topic;}array_push($capsules, ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','position' => $capsule->order,'link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'progress' => 0,'link_get' => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),'added_on' => $capsule->added_on,'updated_on' => $capsule->updated_on,]);}if($order_field == 'name') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['name'], $b['name']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['name'], $b['name']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}if($order_field == 'added_on') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['added_on'], $b['added_on']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['added_on'], $b['added_on']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}return new JsonModel(['success' => true,'data' => $capsules]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function capsulesCompletedAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));$order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));$order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));if(!in_array($order_field,['name', 'added_on','last_access_on'] )) {$order_field = 'name';}if(!in_array( $order_direction,['asc', 'desc'])) {$order_field = 'asc';}$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$accessGranted = $this->getAccessGranted();$topics = [];$capsules = [];foreach($accessGranted->capsules as $capsule_id){$userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);if(!$userProgress) {continue;}if(!$userProgress->completed) {continue;}$capsule = $capsuleMapper->fetchOne($capsule_id);if($name) {if(empty($name) || stripos($capsule->name, $name) === false) {continue;}}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);if(isset($topics[$capsule->topic_id])) {$topic = $topics[$capsule->topic_id];} else {$topic = $topicMapper->fetchOne($capsule->topic_id);$topics[ $capsule->topic_id ] = $topic;}array_push($capsules, ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','position' => $capsule->order,'link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'progress' => $userProgress->progress,'link_get' => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),'added_on' => $capsule->added_on,'last_access_on' => $userProgress->updated_on,'updated_on' => $capsule->updated_on,]);}if($order_field == 'name') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['name'], $b['name']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['name'], $b['name']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}if($order_field == 'added_on') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['added_on'], $b['added_on']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['added_on'], $b['added_on']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}if($order_field == 'last_access_on') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['last_access_on'], $b['last_access_on']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['last_access_on'], $b['last_access_on']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}return new JsonModel(['success' => true,'data' => $capsules]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function capsulesInProgressAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$name = Functions::sanitizeFilterString($this->params()->fromQuery('name'));$order_field = Functions::sanitizeFilterString($this->params()->fromQuery('order_field'));$order_direction = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction'));if(!in_array($order_field,['name', 'added_on', 'last_access_on'] )) {$order_field = 'name';}if(!in_array( $order_direction,['asc', 'desc'])) {$order_field = 'asc';}$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$accessGranted = $this->getAccessGranted();$topics = [];$capsules = [];foreach($accessGranted->capsules as $capsule_id){$userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule_id);if(!$userProgress) {continue;}if($userProgress->completed) {continue;}$capsule = $capsuleMapper->fetchOne($capsule_id);if($name) {if(empty($name) || stripos($capsule->name, $name) === false) {continue;}}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);if(isset($topics[$capsule->topic_id])) {$topic = $topics[$capsule->topic_id];} else {$topic = $topicMapper->fetchOne($capsule->topic_id);$topics[ $capsule->topic_id ] = $topic;}array_push($capsules, ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','position' => $capsule->order,'link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'progress' => $userProgress->progress,'link_get' => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),'last_access_on' => $userProgress->updated_on,'added_on' => $capsule->added_on,'updated_on' => $capsule->updated_on,]);}if($order_field == 'name') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['name'], $b['name']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['name'], $b['name']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}if($order_field == 'added_on') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['added_on'], $b['added_on']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['added_on'], $b['added_on']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}if($order_field == 'last_access_on') {if($order_direction == 'asc') {usort($capsules, function($a, $b) {return strcasecmp($a['last_access_on'], $b['last_access_on']);});} else {usort($capsules, function($a, $b) {$result = strcasecmp($a['last_access_on'], $b['last_access_on']);if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});}}return new JsonModel(['success' => true,'data' => $capsules]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function timelineAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$page = intval($this->params()->fromQuery('page'), 10);$activities = [CompanyMicrolearningUserLog::ACTIVITY_SIGNIN => 'LABEL_MICROLEARNING_ACTIVITY_SIGNIN',CompanyMicrolearningUserLog::ACTIVITY_SIGNOUT => 'LABEL_MICROLEARNING_ACTIVITY_SIGNOUT',CompanyMicrolearningUserLog::ACTIVITY_START_TOPIC => 'LABEL_MICROLEARNING_ACTIVITY_START_TOPIC',CompanyMicrolearningUserLog::ACTIVITY_START_CAPSULE => 'LABEL_MICROLEARNING_ACTIVITY_START_CAPSULE',CompanyMicrolearningUserLog::ACTIVITY_VIEW_SLIDE => 'LABEL_MICROLEARNING_ACTIVITY_VIEW_SLIDE',CompanyMicrolearningUserLog::ACTIVITY_TAKE_A_TEST => 'LABEL_MICROLEARNING_ACTIVITY_TAKE_A_TEST',CompanyMicrolearningUserLog::ACTIVITY_RETAKE_A_TEST => 'LABEL_MICROLEARNING_ACTIVITY_RETAKE_A_TEST',CompanyMicrolearningUserLog::ACTIVITY_APPROVED_TEST => 'LABEL_MICROLEARNING_ACTIVITY_APPROVED_TEST',CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_CAPSULE',CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC => 'LABEL_MICROLEARNING_ACTIVITY_COMPLETED_TOPIC',];$companyMicrolearningUserLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);$paginator = $companyMicrolearningUserLogMapper->getAllMessagesPaginatorByUserId($currentUser->id, $page);$items = [];foreach($paginator as $record){$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);array_push($items, ['activity' => $activities[$record->activity],'added_on' => $dt->format('d/m/Y H:i a')]);}return new JsonModel(['success' => true,'data' => ['total' => ['count' => $paginator->getTotalItemCount(),'pages' => $paginator->getPages()->pageCount,],'current' => ['items' => $items,'page' => $paginator->getCurrentPageNumber(),'count' => $paginator->getCurrentItemCount(),]]]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}/*** Valores para la generación de los gráficos de progreso* Para las repuesta afirmativa* [* 'success' => true,* 'data' => [* 'topicTotal' => cantidad total de tópicos,* 'topicStarted' => cantidad de tópicos iniciados,* 'topicIncompleted' => cantidad de tópicos incompletos,* 'topicCompleted' => cantidad de tópicos completos,* 'percentCompleted' => % de diapositivas completados ,* 'percentIncompleted' => % de diapositivas incompletos ,* 'percentWithoutReturning' => % de cápsulas sin retorno después de completada,* 'percentWithReturning' => % de cápsulas con retorno después de completada,* ],* ]*** En caso contrario* [* 'success' => false,* 'data' => mensaje de error* ]*** @return \Laminas\View\Model\JsonModel*/public function progressAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$accessGrantedIds = $this->getAccessGranted();$id = $this->params()->fromRoute('id');$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuid($id);if(!$company) {$response = ['success' => false,'data' => 'ERROR_COMPANY_NOT_FOUND',];return new JsonModel($response);}if(!in_array($company->id, $accessGrantedIds->companies)) {$response = ['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_COMPANY',];return new JsonModel($response);}$capsuleTotal = 0;$capsuleCompleted = 0;$capsuleWithReturning = 0;$capsuleWithoutReturning = 0;$capsuleStarted = 0;$capsuleToStart = 0;$percentCompleted = 0;$percentIncompleted = 100;$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topics = $topicMapper->fetchAllActiveByCompanyIdAndIds($company->id, $accessGrantedIds->topics);$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$progressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);foreach($topics as $topic){$resultCount = $capsuleMapper->fetchCountByCompanyIdAndTopicId($company->id, $topic->id);$capsuleTotal = $capsuleTotal + $resultCount;$resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);$capsuleCompleted = $capsuleCompleted + $resultCount;$resultCount = $progressMapper->fetchCountCapsulesCompletedWithReturningByIdAndTopicId($currentUser->id, $topic->id);$capsuleWithReturning = $capsuleWithReturning + $resultCount;$resultCount = $progressMapper->fetchCountCapsulesCompletedWithoutReturningByIdAndTopicId($currentUser->id, $topic->id);$capsuleWithoutReturning = $capsuleWithoutReturning + $resultCount;$resultCount = $progressMapper->fetchCountCapsulesCompletedByIdAndTopicId($currentUser->id, $topic->id);$capsuleStarted = $capsuleStarted + $resultCount;}$capsuleToStart = $capsuleTotal - $capsuleStarted;if($capsuleTotal > 0) {$percentCompleted = ($capsuleCompleted * 100) / $capsuleTotal;$percentIncompleted = 100 - $percentCompleted;}return new JsonModel(['success' => true,'data' => ['capsuleTotal' => $capsuleTotal,'capsuleCompleted' => $capsuleCompleted,'capsuleStarted' => $capsuleStarted,'capsuleToStart' => $capsuleToStart,'percentCompleted' => number_format($percentCompleted, 2, '.', ','),'percentIncompleted' => number_format($percentIncompleted, 2, '.', ','),'capsuleWithReturning' => $capsuleWithReturning,'capsuleWithoutReturning' => $capsuleWithoutReturning,],]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function topicsAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$data = [];$accessGrantedIds = $this->getAccessGranted();$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);foreach($accessGrantedIds->topics as $id){$topic = $topicMapper->fetchOne($id);if(!$topic) {continue;}$userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);if($userProgress) {$progress = $userProgress->progress;$completed = $userProgress->completed;} else {$progress = 0;$completed = 0;}array_push($data, ['uuid' => $topic->uuid,'name' => $topic->name ? $topic->name : '','description' => $topic->description ? $topic->description : '','image' => $topic->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '','progress' => $progress,'completed' => $completed,'order' => $topic->order,'added_on' => $topic->added_on,'updated_on' => $topic->updated_on,'link_capsules' => $this->url()->fromRoute('microlearning/capsules', ['topic_id' => $topic->uuid], ['force_canonical' => true]),'link_get' => $this->url()->fromRoute('microlearning/get-topic', ['id' => $topic->uuid], ['force_canonical' => true]),]);}usort($data, function($a, $b) {$result = $a['order'] <=> $b['order'];if(0 == $result) {$result = strcasecmp($a['added_on'], $b['added_on']);if(0 == $result) {$result = strcasecmp($a['name'], $b['name']);}}if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function getTopicAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$id = $this->params()->fromRoute('id');$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($id);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$data = [];$accessGrantedIds = $this->getAccessGranted();$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$userProgress = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $id);if($userProgress) {$progress = $userProgress->progress;$completed = $userProgress->completed;} else {$progress = 0;$completed = 0;}$data = ['uuid' => $topic->uuid,'name' => $topic->name ? $topic->name : '','description' => $topic->description ? $topic->description : '','image' => $topic->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-topic', 'code' => $topic->uuid, 'filename' => $topic->image ], ['force_canonical' => true]) : '','progress' => $progress,'completed' => $completed,'order' => $topic->order,'added_on' => $topic->added_on,'updated_on' => $topic->updated_on,'link_capsules' => $this->url()->fromRoute('microlearning/capsules', ['topic_id' => $topic->uuid], ['force_canonical' => true]),];return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function capsulesAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$topic_id = $this->params()->fromRoute('topic_id');$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($topic_id);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$data = [];$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$capsules = $capsuleMapper->fetchAllActiveByCompanyIdAndTopicId($topic->company_id, $topic->id);foreach($capsules as $capsule){if(!in_array($capsule->id, $accessGrantedIds->capsules)) {continue;}$userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);if($userProgress) {$progress = $userProgress->progress;$completed = $userProgress->completed;} else {$progress = 0;$completed = 0;}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);array_push($data, ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_get' => $this->url()->fromRoute('microlearning/get-capsule', ['id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'progress' => $progress,'completed' => $completed,'order' => $capsule->order,'added_on' => $capsule->added_on,'updated_on' => $capsule->updated_on,]);}usort($data, function($a, $b) {$result = $a['order'] <=> $b['order'];if(0 == $result) {$result = strcasecmp($a['added_on'], $b['added_on']);if(0 == $result) {$result = strcasecmp($a['name'], $b['name']);}}if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function takeTestAction(){$request = $this->getRequest();if($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$slide_id = $this->params()->fromRoute('slide_id');$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$slide = $slideMapper->fetchOneByUuid($slide_id);if(!$slide) {return new JsonModel(['success' => false,'data' => 'ERROR_SLIDE_NOT_FOUND']);}if($slide->type != CompanyMicrolearningSlide::TYPE_QUIZ) {return new JsonModel(['success' => false,'data' => 'ERROR_SLIDE_IS_NOT_QUIZ']);}$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOne($slide->capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($capsule->id, $accessGrantedIds->capsules)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);$userLog = $userLogMapper->fetchOneTakeATestByUserIdAndSlideId($currentUser->id, $slide->id);if($userLog) {$activity = CompanyMicrolearningUserLog::ACTIVITY_RETAKE_A_TEST;} else {$activity = CompanyMicrolearningUserLog::ACTIVITY_TAKE_A_TEST;}$added_on = $userLogMapper->getDatebaseNow();$userLog = new CompanyMicrolearningUserLog();$userLog->activity = $activity;$userLog->user_id = $currentUser->id;$userLog->company_id = $slide->company_id;$userLog->topic_id = $slide->topic_id;$userLog->capsule_id = $slide->capsule_id;$userLog->slide_id = $slide->id;$userLog->added_on = $added_on;if($userLogMapper->insert($userLog)) {return new JsonModel(['success' => true,]);} else {return new JsonModel(['success' => false,'data' => $userLogMapper->getError()]);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function getCapsuleAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$capsule_id = $this->params()->fromRoute('id');$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($capsule->id, $accessGrantedIds->capsules)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOne($capsule->topic_id);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$capsuleCommentMapper = CompanyMicrolearningCapsuleCommentMapper::getInstance($this->adapter);$userProgress = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);if($userProgress) {$progress = $userProgress->progress;$completed = $userProgress->completed;} else {$progress = 0;$completed = 0;}$dataCountAndRatingAverage = $capsuleCommentMapper->fetchCountAndRatingAverage($capsule->company_id, $capsule->topic_id, $capsule->id);$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$totalSlides = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);$slide = $slideMapper->fetchFirstByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);if($slide) {$link_first_slide = $this->url()->fromRoute('microlearning/get-slide', ['id' => $slide->uuid], ['force_canonical' => true]);$type_first_slide = $slide->type;} else {$link_first_slide = '';$type_first_slide = '';}$data = ['uuid' => $capsule->uuid,'name' => $capsule->name ? $capsule->name : '','description' => $capsule->description ? $capsule->description : '','image' => $capsule->image ? $this->url()->fromRoute('storage',['type' => 'microlearning-capsule', 'code' => $capsule->uuid, 'filename' => $capsule->image ], ['force_canonical' => true]) : '','link_comments' => $this->url()->fromRoute('microlearning/capsules-comments', ['capsule_id' => $capsule->uuid], ['force_canonical' => true]),'link_comment_add' => $this->url()->fromRoute('microlearning/capsules-comments/add', ['capsule_id' => $capsule->uuid],['force_canonical' => true]),'link_slides' => $this->url()->fromRoute('microlearning/slides', ['topic_id' => $topic->uuid, 'capsule_id' => $capsule->uuid], ['force_canonical' => true]),'total_comments' => strval($dataCountAndRatingAverage['total_comments']),'total_rating' => strval($dataCountAndRatingAverage['total_rating']),'progress' => $progress,'completed' => $completed,'total_slides' => $totalSlides,'link_first_slide' => $link_first_slide,'type_first_slide' => $type_first_slide,'order' => $capsule->order,'added_on' => $capsule->added_on,'updated_on' => $capsule->updated_on,];return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function slidesAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$topic_id = $this->params()->fromRoute('topic_id');$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($topic_id);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$capsule_id = $this->params()->fromRoute('capsule_id');$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_id);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}if(!in_array($capsule->id, $accessGrantedIds->capsules)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$data = [];$quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$slides = $slideMapper->fetchAllByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);foreach($slides as $slide){$userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);if($userProgress) {$completed = $userProgress->completed ;} else {$completed = 0;}$link_take_a_test = '';if($slide->quiz_id) {$quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);$quiz = $quizMapper->fetchOne($slide->quiz_id);if($quiz) {$quiz_uuid = $quiz->uuid;$quiz_data = $this->getQuiz($slide->quiz_id);$link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);}}array_push($data, ['quiz' => $quiz_uuid,'quiz_data' => $quiz_data,'uuid' => $slide->uuid,'name' => $slide->name ? $slide->name : '','description' => $slide->description ? $slide->description : '','type' => $slide->type,'background' => $slide->background ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '','file' => $slide->file ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '','order' => $slide->order,'completed' => $completed,'link_get' => $this->url()->fromRoute('microlearning/get-slide', ['id' => $slide->uuid], ['force_canonical' => true]),'link_sync' => $this->url()->fromRoute('microlearning/sync', ['operation' => 'slide-view', 'topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid, 'slide_uuid' => $slide->uuid], ['force_canonical' => true]),'link_take_a_test' => $link_take_a_test,'added_on' => $slide->added_on,'updated_on' => $slide->updated_on,]);}usort($data, function($a, $b) {$result = $a['order'] <=> $b['order'];if(0 == $result) {$result = strcasecmp($a['added_on'], $b['added_on']);if(0 == $result) {$result = strcasecmp($a['name'], $b['name']);}}if($result < 0) {return 1;} else if($result > 0) {return -1;} else {return 0;}});return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}private function getQuiz($id){$serviceDatetimeFormat = $this->config['leaderslinked.services.datetime'];$data = [];$quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);$quiz = $quizMapper->fetchOne($id);if(!$quiz) {return [];}$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOne($quiz->company_id);$questionMapper = CompanyMicrolearningQuestionMapper::getInstance($this->adapter);$answerMapper = CompanyMicrolearningAnswerMapper::getInstance($this->adapter);$record_questions = [];$questions = $questionMapper->fetchAllByQuizId($quiz->id);foreach($questions as $question){$record_answers = [];$answers = $answerMapper->fetchAllByQuizIdAndQuestionId($question->quiz_id, $question->id);foreach($answers as $answer){$dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->added_on);$dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $answer->updated_on);array_push($record_answers, ['uuid' => $answer->uuid,'text' => trim($answer->text),'correct' => $answer->correct ? $answer->correct : 0 ,'points' => strval(intval($answer->points, 10)),'added_on' => $dtAddedOn->format($serviceDatetimeFormat),'updated_on' => $dtUpdatedOn->format($serviceDatetimeFormat),]);}$dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->added_on);$dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $question->updated_on);array_push($record_questions, ['uuid' => $question->uuid,'text' => trim($question->text),'type' => $question->type,'maxlength' => strval($question->maxlength),'points' => strval($question->points),'answers' => $record_answers,'added_on' => $dtAddedOn->format($serviceDatetimeFormat),'updated_on' => $dtUpdatedOn->format($serviceDatetimeFormat),]);}$dtAddedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->added_on);$dtUpdatedOn = \DateTime::createFromFormat('Y-m-d H:i:s', $quiz->updated_on);array_push($data, ['uuid' => $quiz->uuid,'name' => $quiz->name,'text' => trim($quiz->text ? $quiz->text : ''),'failed' => trim($quiz->failed ? $quiz->failed : ''),'points' => strval($quiz->points),'minimum_points_required' => strval($quiz->minimum_points_required),'max_time' => $quiz->max_time ? $quiz->max_time : 5,'company_uuid' => $company->uuid,'company_name' => $company->name,'company_image' => $this->url()->fromRoute('services/storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),'questions' => $record_questions,'added_on' => $dtAddedOn->format($serviceDatetimeFormat),'updated_on' => $dtUpdatedOn->format($serviceDatetimeFormat),]);return $data;}public function getSlideAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$id = $this->params()->fromRoute('id');$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$slide = $slideMapper->fetchOneByUuid($id);if(!$slide) {return new JsonModel(['success' => false,'data' => 'ERROR_SLIDE_NOT_FOUND']);}$accessGrantedIds = $this->getAccessGranted();if(!in_array($slide->capsule_id, $accessGrantedIds->capsules)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOne($slide->topic_id);$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOne($slide->capsule_id);$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$userProgress = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);if($userProgress) {$completed = $userProgress->completed;} else {$completed = 0;}$quiz_uuid = '';$quiz_data = [];$link_take_a_test = '';if($slide->quiz_id) {$quizMapper = CompanyMicrolearningQuizMapper::getInstance($this->adapter);$quiz = $quizMapper->fetchOne($slide->quiz_id);if($quiz) {$quiz_uuid = $quiz->uuid;$quiz_data = $this->getQuiz($slide->quiz_id);$link_take_a_test = $this->url()->fromRoute('microlearning/take-a-test', ['slide_id' => $slide->uuid], ['force_canonical' => true]);}}$data =['quiz' => $quiz_uuid,'quiz_data' => $quiz_data,'uuid' => $slide->uuid,'name' => $slide->name ? $slide->name : '','description' => $slide->description ? $slide->description : '','type' => $slide->type,'background' => $slide->background ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->background], ['force_canonical' => true]) : '','file' => $slide->file ? $this->url()->fromRoute('storage',['type' => 'microlearning-slide', 'code' => $slide->uuid, 'filename' => $slide->file], ['force_canonical' => true]) : '','order' => $slide->order,'completed' => $completed,'link_sync' => $this->url()->fromRoute('microlearning/sync', ['operation' => 'slide-view', 'topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid, 'slide_uuid' => $slide->uuid], ['force_canonical' => true]),'link_take_a_test' => $link_take_a_test,'added_on' => $slide->added_on,'updated_on' => $slide->updated_on,];return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function profileAction(){$request = $this->getRequest();if($request->isGet()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$accessGrantedIds = $this->getAccessGranted();$companyMapper = CompanyMapper::getInstance($this->adapter);$companyExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);$companyExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);$companyExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);$companyExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);$companyExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);$companyExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);$companyExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);$companyExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);$companyExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);$data = [];foreach($accessGrantedIds->companies as $company_id){$company = $companyMapper->fetchOne($company_id);if(!$company) {continue;}$record = ['name' => $company->name,'image' => $this->url()->fromRoute('storage',['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image], ['force_canonical' => true]),'details' => [],];$companyExtendUser = $companyExtendUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);if(!$companyExtendUser) {continue;}if($companyExtendUser->extend_company_id) {$extendedCompany = $companyExtendUserCompanyMapper->fetchOne($companyExtendUser->company_id);if($extendedCompany) {array_push($record['details'],['uuid' => $extendedCompany->uuid,'label' => 'LABEL_COMPANY','value' => $extendedCompany->name]);}}if($companyExtendUser->extend_function_id) {$extendedFunction = $companyExtendUserFunctionMapper->fetchOne($companyExtendUser->extend_function_id);if($extendedFunction) {array_push($record['details'],['uuid' => $extendedFunction->uuid,'label' => 'LABEL_FUNCTION','value' => $extendedFunction->name]);}}if($companyExtendUser->extend_group_id) {$extendedGroup = $companyExtendUserGroupMapper->fetchOne($companyExtendUser->extend_group_id);if($extendedGroup) {array_push($record['details'],['uuid' => $extendedGroup->uuid,'label' => 'LABEL_GROUP','value' => $extendedGroup->name]);}}if($companyExtendUser->extend_institution_id) {$extendedInstitution= $companyExtendUserInstitutionMapper->fetchOne($companyExtendUser->extend_institution_id);if($extendedInstitution) {array_push($record['details'],['uuid' => $extendedInstitution->uuid,'label' => 'LABEL_INSTITUTION','value' => $extendedInstitution->name]);}}if($companyExtendUser->extend_program_id) {$extendedProgram = $companyExtendUserProgramMapper->fetchOne($companyExtendUser->extend_program_id);if($extendedProgram) {array_push($record['details'],['uuid' => $extendedProgram->uuid,'label' => 'LABEL_PROGRAM','value' => $extendedProgram->name]);}}if($companyExtendUser->extend_sector_id) {$extendedSector = $companyExtendUserSectorMapper->fetchOne($companyExtendUser->extend_sector_id);if($extendedSector) {array_push($record['details'],['uuid' => $extendedSector->uuid,'label' => 'LABEL_SECTOR','value' => $extendedSector->name]);}}if($companyExtendUser->extend_partner_id) {$extendedPartner = $companyExtendUserPartnerMapper->fetchOne($companyExtendUser->extend_partner_id);if($extendedPartner) {array_push($record['details'],['uuid' => $extendedPartner->uuid,'label' => 'LABEL_PARTNER','value' => $extendedPartner->name]);}}if($companyExtendUser->extend_student_type_id) {$extendedStudentType = $companyExtendUserStudentTypeMapper->fetchOne($companyExtendUser->extend_student_type_id);if($extendedStudentType) {array_push($record['details'],['uuid' => $extendedStudentType->uuid,'label' => 'LABEL_TYPE','value' => $extendedStudentType->name]);}}array_push($data, $record);}return new JsonModel(['success' => true,'data' => $data]);} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function syncAction(){$request = $this->getRequest();if($request->isPost()) {$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$operation = $this->params()->fromRoute('operation');if($operation == 'slide-view' || $operation == 'capsule-close' || $operation == 'topic-close') {$accessGrantedIds = $this->getAccessGranted();$topic_uuid = $this->params()->fromRoute('topic_uuid');$capsule_uuid = $this->params()->fromRoute('capsule_uuid');$slide_uuid = $this->params()->fromRoute('slide_uuid');$accessGrantedIds = $this->getAccessGranted();if($operation == 'slide-view') {if(empty($slide_uuid) || empty($capsule_uuid ) || empty($topic_uuid)) {return new JsonModel(['success' => false,'data' => 'ERROR_INVALID_PARAMETERS']);}$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($topic_uuid);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}if(!in_array($capsule->id, $accessGrantedIds->capsules) || $capsule->topic_id != $topic->id) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$slideMapper = CompanyMicrolearningSlideMapper::getInstance($this->adapter);$slide = $slideMapper->fetchOneByUuid($slide_uuid);if(!$slide) {return new JsonModel(['success' => false,'data' => 'ERROR_SLIDE_NOT_FOUND']);}if($slide->capsule_id != $capsule->id && $slide->topic_id != $topic->id) {return new JsonModel(['success' => false,'data' => 'ERROR_SLIDE_NOT_FOUND']);}$userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$added_on = $userProgressMapper->getDatebaseNow();$userProgressTopic = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);if(!$userProgressTopic) {$userProgressTopic = new CompanyMicrolearningUserProgress();$userProgressTopic->company_id = $slide->company_id;$userProgressTopic->topic_id = $slide->topic_id;$userProgressTopic->user_id = $currentUser->id;$userProgressTopic->progress = 0;$userProgressTopic->returning = 0;$userProgressTopic->returning_after_completed = 0;$userProgressTopic->completed = 0;$userProgressTopic->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicId($slide->company_id, $slide->topic_id);$userProgressTopic->view_slides = 0;$userProgressTopic->type = CompanyMicrolearningUserProgress::TYPE_TOPIC;$userProgressTopic->added_on = $added_on;$userProgressTopic->updated_on = $added_on;if($userProgressMapper->insert($userProgressTopic)) {$userLog = new CompanyMicrolearningUserLog();$userLog->activity = CompanyMicrolearningUserLog::ACTIVITY_START_TOPIC;$userLog->user_id = $currentUser->id;$userLog->company_id = $slide->company_id;$userLog->topic_id = $slide->topic_id;$userLog->added_on = $added_on;if(!$userLogMapper->insert($userLog)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}} else {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}}$userProgressCapsule = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);if(!$userProgressCapsule) {$userProgressCapsule = new CompanyMicrolearningUserProgress();$userProgressCapsule->company_id = $slide->company_id;$userProgressCapsule->topic_id = $slide->topic_id;$userProgressCapsule->capsule_id = $slide->capsule_id;$userProgressCapsule->user_id = $currentUser->id;$userProgressCapsule->progress = 0;$userProgressCapsule->returning = 0;$userProgressCapsule->returning_after_completed = 0;$userProgressCapsule->completed = 0;$userProgressCapsule->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($slide->company_id, $slide->topic_id, $slide->capsule_id);$userProgressCapsule->view_slides = 0;$userProgressCapsule->type = CompanyMicrolearningUserProgress::TYPE_CAPSULE;$userProgressCapsule->added_on = $added_on;$userProgressTopic->updated_on = $added_on;if($userProgressMapper->insert($userProgressCapsule)) {$userLog = new CompanyMicrolearningUserLog();$userLog->activity = CompanyMicrolearningUserLog::ACTIVITY_START_CAPSULE;$userLog->user_id = $currentUser->id;$userLog->company_id = $slide->company_id;$userLog->topic_id = $slide->topic_id;$userLog->capsule_id = $slide->capsule_id;$userLog->added_on = $added_on;if(!$userLogMapper->insert($userLog)) {return new JsonModel(['success' => false,'data' => $userLogMapper->getError()]);}} else {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}}$userProgressSlide = $userProgressMapper->fetchOneByUserIdAndSlideId($currentUser->id, $slide->id);if(!$userProgressSlide) {$userProgressSlide = new CompanyMicrolearningUserProgress();$userProgressSlide->company_id = $slide->company_id;$userProgressSlide->topic_id = $slide->topic_id;$userProgressSlide->capsule_id = $slide->capsule_id;$userProgressSlide->slide_id = $slide->id;$userProgressSlide->user_id = $currentUser->id;$userProgressSlide->progress = 0;$userProgressSlide->returning = 0;$userProgressSlide->returning_after_completed = 0;$userProgressSlide->completed = 1;$userProgressSlide->total_slides = 0;$userProgressSlide->view_slides = 0;$userProgressSlide->type = CompanyMicrolearningUserProgress::TYPE_SLIDE;$userProgressSlide->added_on = $added_on;$userProgressSlide->updated_on = $added_on;if(!$userProgressMapper->insert($userProgressSlide)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}}$userLog = new CompanyMicrolearningUserLog();$userLog->activity = CompanyMicrolearningUserLog::ACTIVITY_VIEW_SLIDE;$userLog->user_id = $currentUser->id;$userLog->company_id = $slide->company_id;$userLog->topic_id = $slide->topic_id;$userLog->capsule_id = $slide->capsule_id;$userLog->slide_id = $slide->id;$userLog->added_on = $added_on;if(!$userLogMapper->insert($userLog)) {return new JsonModel(['success' => false,'data' => $userLogMapper->getError()]);}$closeCapsule = false;if($userProgressCapsule->completed) {$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $added_on);$returning_on = $dt->format('Y-m-d');if(!$userProgressCapsule->returning_on || $userProgressCapsule->returning_on != $returning_on) {$userProgressCapsule->returning_on = $returning_on;$userProgressCapsule->returning_after_completed = $userProgressCapsule->returning_after_completed + 1;if(!$userProgressMapper->update($userProgressCapsule)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}}} else {$userProgressCapsule->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicIdAndCapsuleId($slide->company_id, $slide->topic_id, $slide->capsule_id);$userProgressCapsule->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndCapsuleId($currentUser->id, $slide->capsule_id);if($userProgressCapsule->total_slides) {$userProgressCapsule->progress = ($userProgressCapsule->view_slides * 100) / $userProgressCapsule->total_slides;$userProgressCapsule->progress = $userProgressCapsule->progress > 100 ? 100 : $userProgressCapsule->progress;}if(!$userProgressMapper->update($userProgressCapsule)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}if($userProgressCapsule->progress >= 100) {$closeCapsule = true;}// print_r($userProgressCapsule);}$closeTopic = false;if(!$userProgressTopic->completed) {$userProgressTopic->total_slides = $slideMapper->fetchTotalCountByCompanyIdAndTopicId($slide->company_id, $slide->topic_id);$userProgressTopic->view_slides = $userProgressMapper->fetchCountAllSlideCompletedByUserIdAndTopicId($currentUser->id, $slide->topic_id);if($userProgressTopic->total_slides) {$userProgressTopic->progress = ($userProgressTopic->view_slides * 100) / $userProgressTopic->total_slides;$userProgressTopic->progress = $userProgressTopic->progress > 100 ? 100 : $userProgressTopic->progress;}if(!$userProgressMapper->update($userProgressTopic)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}if($userProgressTopic->progress >= 100) {$closeTopic = true;}//print_r($userProgressTopic);}$data = ['message' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_SLIDE_HAS_BEEN_COMPLETED',];if($closeCapsule) {$data['link_close_capsule'] = $this->url()->fromRoute('microlearning/sync', ['operation' => 'capsule-close', 'topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid], ['force_canonical' => true]);}if($closeTopic) {$data['link_close_topic'] = $this->url()->fromRoute('microlearning/sync', ['operation' => 'topic-close', 'topic_uuid' => $topic->uuid], ['force_canonical' => true]);}return new JsonModel(['success' => true,'data' => $data]);} else if($operation == 'capsule-close') {if(empty($capsule_uuid ) || empty($topic_uuid)) {return new JsonModel(['success' => false,'data' => 'ERROR_INVALID_PARAMETERS']);}$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($topic_uuid);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);$capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);if(!$capsule) {return new JsonModel(['success' => false,'data' => 'ERROR_CAPSULE_NOT_FOUND']);}if(!in_array($capsule->id, $accessGrantedIds->capsules) || $capsule->topic_id != $topic->id) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_CAPSULE']);}$userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$updated_on = $userProgressMapper->getDatebaseNow();$userProgressCapsule = $userProgressMapper->fetchOneByUseridAndCapsuleId($currentUser->id, $capsule->id);if(!$userProgressCapsule) {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_NOT_FOUND']);}if($userProgressCapsule->completed) {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_ALREADY_CLOSED']);}$userProgressCapsule->completed = 1;$userProgressCapsule->updated_on = $updated_on;if($userProgressMapper->update($userProgressCapsule)) {$userLog = new CompanyMicrolearningUserLog();$userLog->activity = CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_CAPSULE;$userLog->user_id = $currentUser->id;$userLog->company_id = $capsule->company_id;$userLog->topic_id = $capsule->topic_id;$userLog->capsule_id = $capsule->id;$userLog->added_on = $updated_on;if(!$userLogMapper->insert($userLog)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}return new JsonModel(['success' => true,'data' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_CAPSULE_HAS_BEEN_COMPLETED']);} else {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_CAPSULE_COULD_NOT_BE_COMPLETED']);}} else if($operation == 'topic-close') {if(empty($topic_uuid)) {return new JsonModel(['success' => false,'data' => 'ERROR_INVALID_PARAMETERS']);}$topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);$topic = $topicMapper->fetchOneByUuid($topic_uuid);if(!$topic) {return new JsonModel(['success' => false,'data' => 'ERROR_TOPIC_NOT_FOUND']);}if(!in_array($topic->id, $accessGrantedIds->topics)) {return new JsonModel(['success' => false,'data' => 'ERROR_YOU_DO_NOT_HAVE_ACCESS_TO_THIS_TOPIC']);}$userLogMapper = CompanyMicrolearningUserLogMapper::getInstance($this->adapter);$userProgressMapper = CompanyMicrolearningUserProgressMapper::getInstance($this->adapter);$updated_on = $userProgressMapper->getDatebaseNow();$userProgressTopic = $userProgressMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);if(!$userProgressTopic) {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_NOT_FOUND']);}if($userProgressTopic->completed) {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_ALREADY_CLOSED']);}$userProgressTopic->completed = 1;$userProgressTopic->updated_on = $updated_on;if($userProgressMapper->update($userProgressTopic)) {$userLog = new CompanyMicrolearningUserLog();$userLog->activity = CompanyMicrolearningUserLog::ACTIVITY_COMPLETED_TOPIC;$userLog->user_id = $currentUser->id;$userLog->company_id = $topic->company_id;$userLog->topic_id = $topic->id;$userLog->added_on = $updated_on;if(!$userLogMapper->insert($userLog)) {return new JsonModel(['success' => false,'data' => $userProgressMapper->getError()]);}return new JsonModel(['success' => true,'data' => 'LABEL_THE_USER_PROGRESS_FOR_THIS_TOPIC_HAS_BEEN_COMPLETED']);} else {return new JsonModel(['success' => false,'data' => 'ERROR_THE_USER_PROGRESS_FOR_THIS_TOPIC_COULD_NOT_BE_COMPLETED']);}}} else {return new JsonModel(['success' => false,'data' => 'ERROR_OPERATION_UNKNOWN']);}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}/**** @return \LeadersLinked\Controller\MicrolearningUserAccessGrantedIds*/private function getAccessGranted(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);$now = $capsuleUserMapper->getDatebaseNow();$records = $capsuleUserMapper->fetchAllActiveByUserId($currentUser->id);$accessGrantedIds = new MicrolearningUserAccessGrantedIds();foreach($records as $record){if($record->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED && $record->access != CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {continue;}if($record->access == CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD) {if($now < $record->paid_from || $now > $record->paid_to) {continue;}}if(!in_array($record->company_id, $accessGrantedIds->companies )) {array_push($accessGrantedIds->companies, $record->company_id);}if(!in_array($record->topic_id, $accessGrantedIds->topics )) {array_push( $accessGrantedIds->topics, $record->topic_id);}if(!in_array($record->capsule_id, $accessGrantedIds->capsules)) {array_push( $accessGrantedIds->capsules, $record->capsule_id);}}return $accessGrantedIds;}}