Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15455 | Rev 16768 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php
declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Mapper\CompanyMicrolearningTopicMapper;
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleMapper;
use LeadersLinked\Form\TopicCapsuleForm;
use LeadersLinked\Form\PushMicrolearningNotificationForm;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\CompanyMicrolearningCapsuleUserMapper;
use LeadersLinked\Mapper\UserMapper;
use Laminas\Hydrator\ArraySerializableHydrator;
use Laminas\Db\ResultSet\HydratingResultSet;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use LeadersLinked\Model\CompanyMicrolearningCapsuleUser;
use LeadersLinked\Mapper\ApplicationMapper;
use LeadersLinked\Mapper\PushMapper;
use LeadersLinked\Mapper\PushTemplateMapper;
use LeadersLinked\Mapper\DeviceHistoryMapper;
use LeadersLinked\Model\Push;
use LeadersLinked\Model\Application;
use LeadersLinked\Form\CapsuleCustomerUploadForm;
use PhpOffice\PhpSpreadsheet\IOFactory;
use LeadersLinked\Model\User;
use LeadersLinked\Model\UserType;
use LeadersLinked\Model\UserPassword;
use LeadersLinked\Mapper\CompanyMicrolearningUserMapper;
use LeadersLinked\Mapper\UserPasswordMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCompanyMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserFunctionMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserGroupMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserInstitutionMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserProgramMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserPartnerMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserSectorMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserStudentTypeMapper;
use LeadersLinked\Model\CompanyMicrolearningExtendUser;
use LeadersLinked\Model\CompanyMicrolearningExtendUserCompany;
use LeadersLinked\Model\CompanyMicrolearningExtendUserFunction;
use LeadersLinked\Model\CompanyMicrolearningExtendUserGroup;
use LeadersLinked\Model\CompanyMicrolearningExtendUserInstitution;
use LeadersLinked\Model\CompanyMicrolearningExtendUserProgram;
use LeadersLinked\Model\CompanyMicrolearningExtendUserPartner;
use LeadersLinked\Model\CompanyMicrolearningExtendUserSector;
use LeadersLinked\Model\CompanyMicrolearningExtendUserStudentType;
use LeadersLinked\Model\CompanyMicrolearningUser;
use LeadersLinked\Mapper\ApplicationVariantMapper;
use LeadersLinked\Mapper\CompanyMicrolearningExtendUserCountryMapper;
use LeadersLinked\Model\CompanyMicrolearningExtendUserCountry;
use LeadersLinked\Model\Network;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\NetworkMapper;
use LeadersLinked\Mapper\CompanyFollowerMapper;
use LeadersLinked\Mapper\ConnectionMapper;
use LeadersLinked\Model\Connection;
use LeadersLinked\Model\CompanyFollower;


class MicrolearningAccessForStudentsController extends AbstractActionController
{
    /**
     *
     * @var AdapterInterface
     */
    private $adapter;
    
    
    /**
     *
     * @var AbstractAdapter
     */
    private $cache;
    
    /**
     *
     * @var  LoggerInterface
     */
    private $logger;

    
    /**
     *
     * @var array
     */
    private $config;
    
    /**
     *
     * @param AdapterInterface $adapter
     * @param AbstractAdapter $cache
     * @param LoggerInterface $logger
     * @param array $config
     */
    public function __construct($adapter, $cache , $logger,  $config)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;

    }
    
    public function indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request = $this->getRequest();
        
        if($request->isGet())
        {
            
            $headers  = $request->getHeaders();
            
            $isJson = false;
            if($headers->has('Accept')) {
                $accept = $headers->get('Accept');
                
                $prioritized = $accept->getPrioritized();
                
                foreach($prioritized as $key => $value) {
                    $raw = trim($value->getRaw());
                    
                    if(!$isJson) {
                        $isJson = strpos($raw, 'json');
                    }
                    
                }
            }
            
            if($isJson) {
                $topic_uuid     = filter_var($this->params()->fromQuery('topic_uuid'), FILTER_SANITIZE_STRING);
                $capsule_uuid   = filter_var($this->params()->fromQuery('capsule_uuid'), FILTER_SANITIZE_STRING);
                
                $data = [
                    'link_upload' => '',
                    'items' => [] ,
                    'total' => 0,
                    
                ];
                
                
                if(!$topic_uuid) {
                    return new JsonModel([
                        'success' => true,
                        'data' => $data
                    ]);
                    
                }
                
                
                $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
                $topic = $topicMapper->fetchOneByUuid($topic_uuid);
                if(!$topic) {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'ERROR_TOPIC_NOT_FOUND'
                    ]);
                }
                
                if($topic->company_id != $currentCompany->id) {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'ERROR_UNAUTHORIZED'
                    ]);
                }
                
                
                
                if(!$capsule_uuid) {
                    $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
                    $records = $capsuleMapper->fetchAllByCompanyIdAndTopicId($topic->company_id, $topic->id);
                    
                    $capsules = [];
                    foreach($records as $record)
                    {
                        if(!$capsule_uuid) {
                            $capsule_uuid = $record->uuid;
                        }
                        
                        $capsules[ $record->uuid ] = $record->name;
                    }
                    
                    $data['capsules']  = $capsules;
                }
                
                if(!$capsule_uuid) {
                    return new JsonModel([
                        'success' => true,
                        'data' => $data
                    ]);
                    
                }
                
                $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
                $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
                
                
                
                if(!$capsule) {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'ERROR_CAPSULE_NOT_FOUND'
                    ]);
                }
                
                if($capsule->topic_id != $topic->id) {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'ERROR_UNAUTHORIZED'
                    ]);
                }
                

                $data['link_upload'] = $this->url()->fromRoute('microlearning/access-for-students/upload',['topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid]);
                $data['link_notification'] = $this->url()->fromRoute('microlearning/access-for-students/notification',['topic_uuid' => $topic->uuid, 'capsule_uuid' => $capsule->uuid]);
                
                $search = $this->params()->fromQuery('search', []);
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
                
                $page               = intval($this->params()->fromQuery('start', 1), 10);
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
                $order =  $this->params()->fromQuery('order', []);
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var( $order[0]['dir'], FILTER_SANITIZE_STRING));
                
                $fields =  ['uuid', 'first_name', 'last_name', 'email'];
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'first_name';
                
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
                    $order_direction = 'ASC';
                }
                
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                $allowRevoke = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/revoke');
                $allowUnlimit = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/unlimit');
                $allowCancel = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/cancel');
                $allowReactive = $acl->isAllowed($currentUser->usertype_id, 'microlearning/access-for-students/reactive');
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                $sql = $queryMapper->getSql();
                $select = $sql->select();
                $select->columns(['access', 'paid_from', 'paid_to', 'added_on', 'updated_on']);
                $select->from(['tb1' => CompanyMicrolearningCapsuleUserMapper::_TABLE] );
                $select->join(['tb2' => UserMapper::_TABLE], 'tb1.user_id = tb2.id', ['uuid', 'first_name', 'last_name', 'email']);
                $select->where->equalTo('tb1.company_id', $capsule->company_id);
                $select->where->equalTo('tb1.topic_id', $capsule->topic_id);
                $select->where->equalTo('tb1.capsule_id', $capsule->id);
                
                if($search) {
                    $select->where->nest()
                    ->like('first_name', '%' . $search . '%')
                    ->or->like('last_name', '%' . $search . '%')
                    ->or->like('email', '%' . $search . '%')
                    ->unnest();
                    
                }
                
                
                $select->order($order_field . ' ' . $order_direction);
                
                $hydrator   = new ArraySerializableHydrator();
                $resultset  = new HydratingResultSet($hydrator);
                
                $adapter = new DbSelect($select, $sql, $resultset);
                $paginator = new Paginator($adapter);
                $paginator->setItemCountPerPage($records_x_page);
                $paginator->setCurrentPageNumber($page);
                
                
                $items = [ ];
                $records = $paginator->getCurrentItems();
                foreach($records as $record)
                {
                    $params = [
                        'topic_uuid' => $topic->uuid,
                        'capsule_uuid' => $capsule->uuid,
                        'user_uuid' => $record['uuid']
                    ];
                    
                    $actions = [];
                    
                    
                    
                    switch($record['access'])
                    {
                        case CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED :
                            $actions['link_revoke'] = $allowRevoke ? $this->url()->fromRoute('microlearning/access-for-students/revoke', $params) : '';
                            $details['access'] = 'LABEL_UNLIMIT';
                            break;
                            
                        case CompanyMicrolearningCapsuleUser::ACCESS_REVOKE :
                            $actions['link_unlimit'] = $allowUnlimit ? $this->url()->fromRoute('microlearning/access-for-students/unlimit', $params) : '';
                            $details['access'] = 'LABEL_REVOKED';
                            break;
                            
                        case CompanyMicrolearningCapsuleUser::ACCESS_PAY_PERIOD :
                            $actions['link_cancel'] = $allowCancel ? $this->url()->fromRoute('microlearning/access-for-students/cancel', $params) : '';
                            
                            $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
                            $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
                            
                            $details['access'] = 'LABEL_PAY_PERIOD';
                            $details['paid_from'] = $dt_paid_from->format('d/m/Y');
                            $details['paid_to'] = $dt_paid_to->format('d/m/Y');
                            break;
                            
                        case CompanyMicrolearningCapsuleUser::ACCESS_SUPENDED :
                            $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
                            $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
                            
                            $details['access'] = 'LABEL_SUSPENDED';
                            $details['paid_from'] = $dt_paid_from->format('d/m/Y');
                            $details['paid_to'] = $dt_paid_to->format('d/m/Y');
                            break;
                            
                        case CompanyMicrolearningCapsuleUser::ACCESS_CANCELLED :
                            
                            $date = date('Y-m-d');
                            if($allowCancel && $record['paid_from'] <= $date && $record['paid_to'] >= $date) {
                                $actions['link_reactive'] = $allowReactive ? $this->url()->fromRoute('microlearning/access-for-students/reactive', $params) : '';
                            }
                            
                            $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
                            $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
                            
                            $details['access'] = 'LABEL_CANCELLED';
                            $details['paid_from'] = $dt_paid_from->format('d/m/Y');
                            $details['paid_to'] = $dt_paid_to->format('d/m/Y');
                            break;
                            
                    }
                    
                    $dt_added_on = \DateTime::createFromFormat('Y-m-d H:i:s', $record['added_on']);
                    $details['added_on'] = $dt_added_on->format('d/m/Y h:i a');
                    
                    $dt_updated_on = \DateTime::createFromFormat('Y-m-d H:i:s', $record['updated_on']);
                    $details['updated_on'] = $dt_updated_on->format('d/m/Y h:i a');
                    
                    $item = [
                        'uuid' => $record['uuid'],
                        'first_name' => $record['first_name'],
                        'last_name' => $record['last_name'],
                        'email' => $record['email'],
                        'details' => $details,
                        'actions' => $actions
                    ];
                    
                    
                    array_push($items, $item);
                    
                    
                }
                
                $data['items'] = $items;
                $data['total'] = $paginator->getTotalItemCount();
                
                
                return new JsonModel([
                    'success' => true,
                    'data' => $data
                ]);
            } else {
                $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
                $topics = $topicMapper->fetchAllByCompanyId($currentCompany->id);
                
                if($topics) {
                    $topic_id = $topics[0]->id;
                }  else {
                    $topic_id = 0;
                }
                
                
                $form = new TopicCapsuleForm($this->adapter, $currentCompany->id, $topic_id);
                $formPushNotification = new PushMicrolearningNotificationForm($this->adapter, $currentCompany->id);
                $formCapsuleCustomer = new CapsuleCustomerUploadForm();
                
                
                
                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/microlearning-access-for-students/index.phtml');
                $viewModel->setVariables([
                    'form' => $form,
                    'formPushNotification' => $formPushNotification,
                    'formCapsuleCustomer' => $formCapsuleCustomer
                ]);
                
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    
    
    public function revokeAction()
    {
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser    = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request    = $this->getRequest();
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
        $user_uuid   = $this->params()->fromRoute('user_uuid');
        
        
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
        if(!$topic) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
            ]);
        }
        
        
        
        if($topic->company_id != $currentCompany->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
        if(!$capsule) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
            ]);
        }
        
        
        if($capsule->topic_id != $topic->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $userMapper = UserMapper::getInstance($this->adapter);
        $user = $userMapper->fetchOneByUuid($user_uuid);
        
        if(!$user) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_USER_NOT_FOUND'
            ]);
        }
        
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
        $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);        
        if(!$capsuleUser) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if($request->isPost()) {
           

            if($capsuleUser->access != CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED) {
                return new JsonModel([
                    'success'   => false,
                    'data'   => 'ERROR_USER_ACCESS_CANNT_BE_REVOKE'
                ]);
            }
            $capsuleUser->access = CompanyMicrolearningCapsuleUser::ACCESS_REVOKE;
            if($capsuleUserMapper->update($capsuleUser)) { 
                
                $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
                if($capsuleUser) {
                    $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
                    $companyMicrolearningUser = $companyMicrolearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
                    if($companyMicrolearningUser) {
                        $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                        
                        $companyMicrolearningUserMapper->update($companyMicrolearningUser);
                        
                    } else {
                        $companyMicrolearningUser = new CompanyMicrolearningUser();
                        $companyMicrolearningUser->company_id = $capsuleUser->company_id;
                        $companyMicrolearningUser->user_id = $capsuleUser->user_id;
                        $companyMicrolearningUser->added_on = $capsuleUser->added_on;
                        $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                        
                        $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
                    }
                }
                
                return new JsonModel([
                    'success' => true,
                    'data' => 'LABEL_USER_ACCESS_HAS_BEEN_REVOKE'
                ]);  
                
            } else {
                
                return new JsonModel([
                    'success'   => false,
                    'data'      => $capsuleUserMapper->getError()
                ]);
            }
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
    
    public function unlimitAction()
    {
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser    = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request    = $this->getRequest();
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
        $user_uuid   = $this->params()->fromRoute('user_uuid');
        
        
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
        if(!$topic) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
            ]);
        }
        
        
        
        if($topic->company_id != $currentCompany->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
        if(!$capsule) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
            ]);
        }
        
        
        if($capsule->topic_id != $topic->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $userMapper = UserMapper::getInstance($this->adapter);
        $user = $userMapper->fetchOneByUuid($user_uuid);
        
        if(!$user) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_USER_NOT_FOUND'
            ]);
        }
        
        $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
        $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
        if(!$capsuleUser) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        if($request->isPost()) {
            
            
            if($capsuleUser->access != CompanyMicrolearningCapsuleUser::ACCESS_REVOKE) {
                return new JsonModel([
                    'success'   => false,
                    'data'   => 'ERROR_USER_ACCESS_CANNT_BE_UNLIMIT'
                ]);
            }
            $capsuleUser->access = CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED;
            if($capsuleUserMapper->update($capsuleUser)) {
                
                $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
                if($capsuleUser) {
                    $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
                    $companyMicrolearningUser = $companyMicrolearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
                    if($companyMicrolearningUser) {
                        $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                        
                        $companyMicrolearningUserMapper->update($companyMicrolearningUser);
                        
                    } else {
                        $companyMicrolearningUser = new CompanyMicrolearningUser();
                        $companyMicrolearningUser->company_id = $capsuleUser->company_id;
                        $companyMicrolearningUser->user_id = $capsuleUser->user_id;
                        $companyMicrolearningUser->added_on = $capsuleUser->added_on;
                        $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                        
                        $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
                    }
                }
                
                return new JsonModel([
                    'success' => true,
                    'data' => 'LABEL_USER_ACCESS_HAS_BEEN_UNLIMITED'
                ]);
                
            } else {
                
                return new JsonModel([
                    'success'   => false,
                    'data'      => $capsuleUserMapper->getError()
                ]);
            }
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
    
    public function uploadAction()
    {
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser    = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
        $currentNetwork = $currentNetworkPlugin->getNetwork();
        
        $request    = $this->getRequest();
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
        
        
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
        if(!$topic) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
            ]);
        }
        
        
        
        if($topic->company_id != $currentCompany->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
        if(!$capsule) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
            ]);
        }
        
        
        if($capsule->topic_id != $topic->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        
        
        if($request->isPost()) {
            
            $step = filter_var( $this->params()->fromPost('step'), FILTER_SANITIZE_STRING); 
            if($step == 'validation') {
               
                
                $userMapper = UserMapper::getInstance($this->adapter);
                $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);

                $form = new  CapsuleCustomerUploadForm();
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
                
                $form->setData($dataPost);
                
                if($form->isValid()) {
                    
                    $file = $_FILES['file'];
                    $tmp_filename = $file['tmp_name'];
                    $final_filename =  'data/' . $file['name'];
                    
                    if(!move_uploaded_file($tmp_filename, $final_filename)) {
                        return new JsonModel([
                            'success' => false,
                            'data' => 'ERROR_UPLOAD_FILE'
                        ]);
                    }
                    
                   
                    
                    $users = [];
                    
                    
                    $spreadsheet = IOFactory::load($final_filename);
                    $records = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
                    
                    $emails = [];
                    
                    foreach($records as $record)
                    {
                        /*
                        A = Nombre      
                        B = Apellido    
                        C = Email       
                        D = Contraseña 
                        E = Empresa     
                        F = Función    
                        G = Grupo       
                        H = Institución        
                        I = Programa    
                        J = Socio       
                        K = Sector      
                        L = Tipo de Estudiante  
                        M = País       
                        N = Es adulto
                        */
                        
                        
                        $first_name = trim(filter_var($record['A'], FILTER_SANITIZE_STRING));
                        $last_name = trim(filter_var($record['B'], FILTER_SANITIZE_STRING));
                        $email = trim(filter_var($record['C'], FILTER_SANITIZE_EMAIL));
                        $password = trim(filter_var($record['D'], FILTER_SANITIZE_STRING));
                        
                        $company =  isset($record['E']) ? trim(filter_var($record['E'], FILTER_SANITIZE_STRING)) : '';
                        $function = isset($record['F']) ? trim(filter_var($record['F'], FILTER_SANITIZE_STRING)) : '';
                        $group = isset($record['G']) ? trim(filter_var($record['G'], FILTER_SANITIZE_STRING)) : '';
                        $institution = isset($record['H']) ? trim(filter_var($record['H'], FILTER_SANITIZE_STRING)) : '';
                        $program = isset($record['I']) ? trim(filter_var($record['I'], FILTER_SANITIZE_STRING)) : '';
                        $partner = isset($record['J']) ? trim(filter_var($record['J'], FILTER_SANITIZE_STRING)) : '';
                        $sector = isset($record['K']) ? trim(filter_var($record['K'], FILTER_SANITIZE_STRING)) : '';
                        $studentType = isset($record['L']) ? trim(filter_var($record['L'], FILTER_SANITIZE_STRING)) : '';
                        $country =  isset($record['M']) ? trim(filter_var($record['M'], FILTER_SANITIZE_STRING)) : '';
                        $isAdult = isset($record['N']) ? trim(filter_var($record['N'], FILTER_SANITIZE_STRING)) : '';

                        
                        
                        //||  empty($password)
                        if(empty($first_name) || empty($last_name) || !filter_var($email, FILTER_VALIDATE_EMAIL) ) {
                            continue;
                        }
                        
                        if(!in_array($email, $emails)) {
                            
                            $user = $userMapper->fetchOneByEmail($email);
                            if($user) {
                                $assigned_capsules =  $capsuleUserMapper->fetchCountByCompanyIdAndTopicIdAndUserId($topic->company_id, $topic->id, $user->id);
                            } else {
                                $assigned_capsules = 0;
                            }
                            
                            array_push($emails, $email);
                            array_push($users, [
                                'first_name' => $first_name,
                                'last_name' => $last_name,
                                'password'  => $password,
                                'email' => $email,
                                'assigned_capsules' => $assigned_capsules, 
                                'company' => $company, 
                                'function' => $function, 
                                'group' => $group, 
                                'institution' => $institution, 
                                'program' => $program,
                                'partner' => $partner,
                                'sector' => $sector, 
                                'studentType' => $studentType,
                                'country' => $country,
                                'isAdult' => $isAdult,
                            ]);
                        }
                        
                        
                        
                        
                        
                    }

                    
                    $key = md5($currentUser->id . '-' . $topic->uuid . '-' . $capsule->uuid);
                    $this->cache->setItem($key, serialize($users));
                    
                    return new JsonModel([
                        'success' => true,
                        'data' => [
                            'key' => $key,
                            'topic' => $topic->name,
                            'capsule' => $capsule->name,
                            'items' => $users,
                        ]
                    ]);
                    
                    
                    
                } 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
                    ]);
                }
            } else if($step == 'process') {
            
                $key = filter_var( $this->params()->fromPost('key'), FILTER_SANITIZE_STRING); 
                if(!$key) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_CACHE_KEY_EMPTY'
                    ]); 
                }
                
                $value = $this->cache->getItem($key);
                if(!$value) {
                    
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_CACHE_NOT_FOUND'
                    ]); 
                }
                
                $records = unserialize($value);
                if(!$records) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_CACHE_INVALID'
                    ]);
                }
                
                
                $networkMapper = NetworkMapper::getInstance($this->adapter);
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
                
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
                $userMapper = UserMapper::getInstance($this->adapter);
                $userPasswordMapper = UserPasswordMapper::getInstance($this->adapter);
                $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
                
                $companyMicrolearningExtendUserMapper = CompanyMicrolearningExtendUserMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserCompanyMapper = CompanyMicrolearningExtendUserCompanyMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserFunctionMapper = CompanyMicrolearningExtendUserFunctionMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserGroupMapper = CompanyMicrolearningExtendUserGroupMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserInstitutionMapper = CompanyMicrolearningExtendUserInstitutionMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserProgramMapper = CompanyMicrolearningExtendUserProgramMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserPartnerMapper = CompanyMicrolearningExtendUserPartnerMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserSectorMapper = CompanyMicrolearningExtendUserSectorMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserStudentTypeMapper = CompanyMicrolearningExtendUserStudentTypeMapper::getInstance($this->adapter);
                $companyMicrolearningExtendUserCountryMapper = CompanyMicrolearningExtendUserCountryMapper::getInstance($this->adapter);
 
                
                $networkDefault = $networkMapper->fetchOneByDefault();
                
                //print_r($networkDefault);
                
                $userDefaultForConnection = $userMapper->fetchOneDefaultForConnection();
                
                //print_r($userDefaultForConnection);
                
                
                $companyForFollower = $companyMapper->fetchOneDefaultForFollowers();
                //print_r($companyForFollower);
                
           
                $users_processed = 0;
                $users_assigned = 0;
                $user_ids = [];
                foreach($records as $record)
                {
                    $first_name = $record['first_name'];
                    $last_name = $record['last_name'];
                    $password = $record['password'];
                    $email = $record['email'];
                    
                    
                    $company = $record['company'];
                    $function = $record['function'];
                    $group = $record['group'];
                    $institution = $record['institution'];
                    $program = $record['program'];
                    $partner = $record['partner'];
                    $sector = $record['sector'];
                    $studentType = $record['studentType'];
                    $country = $record['country'];
                    $isAdult = strtolower(trim( $record['isAdult'])) == User::IS_ADULT_YES;
    
    
                    $user = $userMapper->fetchOneByEmail($email);
                    if(!$user) {
                        
                        
                        if($password) {
                            $password_hash = password_hash($password, PASSWORD_DEFAULT);
                            
                            $user = new User();
                            
                            $user->network_id = $currentNetwork->id;
                            $user->blocked = User::BLOCKED_NO;
                            $user->email_verified = User::EMAIL_VERIFIED_YES;
                            $user->email = $email;
                            $user->first_name = $first_name;
                            $user->last_name = $last_name;
                            $user->password = $password_hash;
                            $user->login_attempt = 0;
                            $user->usertype_id = UserType::USER;
                            $user->status = User::STATUS_ACTIVE;
                            $user->is_adult = $isAdult ? User::IS_ADULT_YES : User::IS_ADULT_NO;
                            
                            $result = $userMapper->insert($user);
                            if($result) {
                                $userPassword = new UserPassword();
                                $userPassword->user_id = $user->id;
                                $userPassword->password = $password_hash;
                                $userPasswordMapper->insert($userPassword);
                            } else {
                                continue;
                            } 
                            
                        }
                    } else {
                        $user->is_adult = $isAdult ? User::IS_ADULT_YES : User::IS_ADULT_NO;
                        if($user->email_verified == User::EMAIL_VERIFIED_NO || $user->status != User::STATUS_ACTIVE) {
                            $user->email_verified = User::EMAIL_VERIFIED_YES;
                            $user->status != User::STATUS_ACTIVE;
                            
                            
                        }
                        if(!$userMapper->update($user)) {
                            continue;
                        }
                            
                        
                    }
                    
      
                    $user_id_in_default_network = 0;
                    if($user->is_adult == User::IS_ADULT_YES) {
                        
                        if($currentNetwork->default == Network::DEFAULT_YES) {
                            
                            $user_id_in_default_network = $user->id;
                            
                            
                            
                        } else {
                            
                            $userInDefaultNetwork = $userMapper->fetchOneByEmailAndNetworkId($user->email, $networkDefault->id);
                            if($userInDefaultNetwork) {
                                $user_id_in_default_network = $userInDefaultNetwork->id;
                         
                                if($userInDefaultNetwork->email_verified == User::EMAIL_VERIFIED_NO || $userInDefaultNetwork->status != User::STATUS_ACTIVE) {
                                    $userInDefaultNetwork->email_verified = User::EMAIL_VERIFIED_YES;
                                    $userInDefaultNetwork->status != User::STATUS_ACTIVE;
                                    
                                    if(!$userMapper->update($userInDefaultNetwork)) {
                                        continue;
                                    }
                                }
                                
                                
                            } else {
                                $userInDefaultNetwork = new User();
                                $userInDefaultNetwork->network_id = $networkDefault->id;
                                $userInDefaultNetwork->blocked = User::BLOCKED_NO;
                                $userInDefaultNetwork->email_verified = User::EMAIL_VERIFIED_YES;
                                $userInDefaultNetwork->email = $email;
                                $userInDefaultNetwork->first_name = $first_name;
                                $userInDefaultNetwork->last_name = $last_name;
                                $userInDefaultNetwork->password = $password_hash;
                                $userInDefaultNetwork->login_attempt = 0;
                                $userInDefaultNetwork->usertype_id = UserType::USER;
                                $userInDefaultNetwork->status = User::STATUS_ACTIVE;
                                $userInDefaultNetwork->is_adult = $isAdult == User::IS_ADULT_YES;
                                $result = $userMapper->insert($userInDefaultNetwork);
                                if($result) {
                                    $user_id_in_default_network = $userInDefaultNetwork->id;
                                    
                                    
                                    $userPassword = new UserPassword();
                                    $userPassword->user_id = $userInDefaultNetwork->id;
                                    $userPassword->password = $password_hash;
                                    $userPasswordMapper->insert($userPassword);
                                }
                                
                            }
                            
                            
                        }
                    }
     
                    if($user_id_in_default_network) {
                        
                        if($userDefaultForConnection) {
                        
                            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($userDefaultForConnection->id, $user_id_in_default_network);
                            if($connection) {
                                if($connection->status != Connection::STATUS_ACCEPTED) {
                                    $connection->status = Connection::STATUS_ACCEPTED;
                                    $connectionMapper->update($connection);
                                    
                                }
                                
                                
                            } else {
                                $connection = new Connection();
                                $connection->request_to = $user_id_in_default_network;
                                $connection->request_from = $userDefaultForConnection->id;
                                $connection->status = Connection::STATUS_ACCEPTED;
                                $connectionMapper->insert($connection);
                            }
                        }
                        
                        if($companyForFollower) {
                            $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($companyForFollower->id, $user_id_in_default_network);
                            if(!$companyFollower) {
                                $companyFollower = new CompanyFollower();
                                $companyFollower->company_id = $companyForFollower->id;
                                $companyFollower->follower_id = $user_id_in_default_network;
                                
                                $companyFollowerMapper->insert($companyFollower);
                                
                                
                            }
                        }
                        
                        
                    }
                        
                    
                    if(!in_array($user->id, $user_ids)) {
                        array_push($user_ids, $user->id);
                    }
                    
                    /*
                    echo '$filterCompany = ' . $filterCompany . PHP_EOL;
                    echo '$filterFunctio = ' . $filterFunction . PHP_EOL;
                    echo '$filterGroup = ' . $filterGroup . PHP_EOL;
                    echo '$filterInstitution = ' . $filterInstitution . PHP_EOL;
                    echo '$filterPartner = ' . $filterPartner . PHP_EOL;
                    echo '$filterProgram = ' . $filterProgram . PHP_EOL;
                    echo '$filterSector = ' . $filterSector . PHP_EOL;
                    echo '$filterStudentType = ' . $filterStudentType . PHP_EOL;
                  */
                   
                    
                    $extendUser = $companyMicrolearningExtendUserMapper->fetchOneByCompanyIdAndUserId($currentCompany->id, $user->id);
                    if(!$extendUser) {
                        $extendUser = new CompanyMicrolearningExtendUser();
                        $extendUser->company_id = $currentCompany->id;
                        $extendUser->user_id = $user->id;
                    }
                    
                    
                    if($company) {
                        $record = $companyMicrolearningExtendUserCompanyMapper->fetchOneByCompanyIdAndName($currentCompany->id, $company);
      
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserCompany();
                            $record->company_id = $currentCompany->id;
                            $record->name = $company;
                                    
                            $companyMicrolearningExtendUserCompanyMapper->insert($record);
                        }
                    

                        
                                
                        if($record->id) {
                            $extendUser->extend_company_id = $record->id;
                        }
                    }
                            
                    if($function) {
                        $record = $companyMicrolearningExtendUserFunctionMapper->fetchOneByCompanyIdAndName($currentCompany->id, $function);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserFunction();
                            $record->company_id = $currentCompany->id;
                            $record->name = $function;
                                    
                            $companyMicrolearningExtendUserFunctionMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_function_id = $record->id;
                        }
                    }
                            
                    if($group) {
                        $record = $companyMicrolearningExtendUserGroupMapper->fetchOneByCompanyIdAndName($currentCompany->id, $group);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserGroup();
                            $record->company_id = $currentCompany->id;
                            $record->name = $group;
                                    
                            $companyMicrolearningExtendUserGroupMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_group_id = $record->id;
                        }
                    }
                            
                    if($institution) {
                        $record = $companyMicrolearningExtendUserInstitutionMapper->fetchOneByCompanyIdAndName($currentCompany->id, $institution);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserInstitution();
                            $record->company_id = $currentCompany->id;
                            $record->name = $institution;
                                    
                            $companyMicrolearningExtendUserInstitutionMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_institution_id = $record->id;
                        }
                    }
                            
                    if($program) {
                        $record = $companyMicrolearningExtendUserProgramMapper->fetchOneByCompanyIdAndName($currentCompany->id, $program);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserProgram();
                            $record->company_id = $currentCompany->id;
                            $record->name = $program;
                                    
                            $companyMicrolearningExtendUserProgramMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_program_id = $record->id;
                        }
                    }
                            
                    if($partner) {
                        
                   
                        $record = $companyMicrolearningExtendUserPartnerMapper->fetchOneByCompanyIdAndName($currentCompany->id, $partner);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserPartner();
                            $record->company_id = $currentCompany->id;
                            $record->name = $partner;
                                    
                            $companyMicrolearningExtendUserPartnerMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_partner_id = $record->id;
                        }
                    }
                            
                    if($sector) {
                        $record = $companyMicrolearningExtendUserSectorMapper->fetchOneByCompanyIdAndName($currentCompany->id, $sector);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserSector();
                            $record->company_id = $currentCompany->id;
                            $record->name = $sector;
                                    
                            $companyMicrolearningExtendUserSectorMapper->insert($record);
                        }
                                
                        if($record->id) {
                            $extendUser->extend_sector_id = $record->id;
                        }
                    }
                            
                    if($studentType) {
                        $record = $companyMicrolearningExtendUserStudentTypeMapper->fetchOneByCompanyIdAndName($currentCompany->id, $studentType);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserStudentType();
                            $record->company_id = $currentCompany->id;
                            $record->name = $studentType;
                                    
                            $companyMicrolearningExtendUserStudentTypeMapper->insert($record);
                        }
                        if($record->id) {
                            $extendUser->extend_student_type_id = $record->id;
                        }
                    }
                    
                    if($country) {
                        $record = $companyMicrolearningExtendUserCountryMapper->fetchOneByCompanyIdAndName($currentCompany->id, $country);
                        if(!$record) {
                            $record = new CompanyMicrolearningExtendUserCountry();
                            $record->company_id = $currentCompany->id;
                            $record->name = $country;
                            
                            $companyMicrolearningExtendUserCountryMapper->insert($record);
                        }
                        if($record->id) {
                            $extendUser->extend_country_id = $record->id;
                        }
                    }
                    

                    

                            
                    if($extendUser->id) {
                       $result =   $companyMicrolearningExtendUserMapper->update($extendUser);
                    } else {
                       $result = $companyMicrolearningExtendUserMapper->insert($extendUser);
                    }
                
                
                   
                }
                
                
                $users_processed = 0;
                $users_previous = 0;
                foreach($user_ids as $user_id)
                {
                    
                    $users_processed++;
                    $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user_id, $capsule->id);
                    if($capsuleUser) {
                        $users_previous++;
                    } else {
                        $capsuleUser = new CompanyMicrolearningCapsuleUser();
                        $capsuleUser->company_id = $capsule->company_id;
                        $capsuleUser->topic_id = $capsule->topic_id;
                        $capsuleUser->capsule_id = $capsule->id;
                        $capsuleUser->user_id = $user_id;
                        $capsuleUser->access = CompanyMicrolearningCapsuleUser::ACCESS_UNLIMITED;
                        
                        if($capsuleUserMapper->insert($capsuleUser)) {
                            $users_assigned++;  
                            
                            
                            $capsuleUser = $capsuleUserMapper->fetchOne($capsuleUser->id);
                            if($capsuleUser) {
                                $companyMicrolearningUserMapper = CompanyMicrolearningUserMapper::getInstance($this->adapter);
                                $companyMicrolearningUser = $companyMicrolearningUserMapper->fetchOneByUserIdAndCompanyId($capsuleUser->user_id, $capsuleUser->company_id);
                                if($companyMicrolearningUser) {
                                    $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                                    
                                    $companyMicrolearningUserMapper->update($companyMicrolearningUser);
                                    
                                } else {
                                    $companyMicrolearningUser = new CompanyMicrolearningUser();
                                    $companyMicrolearningUser->company_id = $capsuleUser->company_id;
                                    $companyMicrolearningUser->user_id = $capsuleUser->user_id;
                                    $companyMicrolearningUser->added_on = $capsuleUser->added_on;
                                    $companyMicrolearningUser->updated_on = $capsuleUser->updated_on;
                                    
                                    $companyMicrolearningUserMapper->insert($companyMicrolearningUser);
                                } 
                            }
                        }
                        
                    }
                    
                 
                    
                }
                
                $users_in_the_capsule = $capsuleUserMapper->fetchCountByCompanyIdAndTopicIdAndCapsuleId($capsule->company_id, $capsule->topic_id, $capsule->id);
                
                return new JsonModel([
                    'success' => true, 
                    'data' => [
                        'users_assigned' => $users_assigned, 
                        'users_processed' => $users_processed,
                        'users_in_the_capsule' => $users_in_the_capsule,
                        'users_previous' => $users_previous
                    ]
                ]); 
                
                
                
                
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
                ]); 
            } 
            
            

            
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
    
    public function notificationAction()
    {
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser    = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request    = $this->getRequest();
        $topic_uuid     = $this->params()->fromRoute('topic_uuid');
        $capsule_uuid   = $this->params()->fromRoute('capsule_uuid');
        
        
        $topicMapper = CompanyMicrolearningTopicMapper::getInstance($this->adapter);
        $topic = $topicMapper->fetchOneByUuid($topic_uuid);
        if(!$topic) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_TOPIC_NOT_FOUND'
            ]);
        }
        
        
        
        if($topic->company_id != $currentCompany->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        $capsuleMapper = CompanyMicrolearningCapsuleMapper::getInstance($this->adapter);
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
        if(!$capsule) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
            ]);
        }
        
        
        if($capsule->topic_id != $topic->id) {
            return new JsonModel([
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ]);
        }
        
        
        if($request->isPost()) {
            $dataPost = $request->getPost()->toArray();
            $form = new PushMicrolearningNotificationForm($this->adapter, $currentCompany->id);
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $customer_uuids = $this->params()->fromPost('customer_uuids');
                if(!$customer_uuids) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_NOT_SELECTED_CUSTOMERS'
                    ]);
                    
                }
                
                $push_template_uuid = filter_var($form->get('push_template_id')->getValue(), FILTER_SANITIZE_STRING);
                $pushMapper = PushMapper::getInstance($this->adapter);
                $pushTemplateMapper = PushTemplateMapper::getInstance($this->adapter);
                $pushTemplate = $pushTemplateMapper->fetchOneByUuid($push_template_uuid);
                
                if(!$pushTemplate) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_PUSH_TEMPLATE_NOT_FOUND'
                    ]);
                }
                
                
                
                $applicationMapper = ApplicationMapper::getInstance($this->adapter);
                $application = $applicationMapper->fetchOne(Application::TWOGETSKILLS);
                
                $capsuleUserMapper = CompanyMicrolearningCapsuleUserMapper::getInstance($this->adapter);
                
                $push_to_send = 0;
                
                
                
                $userMapper = UserMapper::getInstance($this->adapter);
                $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
                foreach($customer_uuids as $customer_uuid)
                {
                    
                    
                    $user = $userMapper->fetchOneByUuid($customer_uuid);
                    if(!$user) {
                        continue;
                    }
                    
                    $capsuleUser = $capsuleUserMapper->fetchOneByUserIdAndCapsuleId($user->id, $capsule->id);
                    if(!$capsuleUser) {
                        continue;
                    }
                    
                    
                    //$token = $deviceHistoryMapper->fetchLastDeviceTokenByApplicationIdAndUserId(Application::TWOGETSKILLS, $user->id);
                    $device = $deviceHistoryMapper->fetchLastDeviceByApplicationIdAndUserId(Application::TWOGETSKILLS, $user->id);
                    
                    
                    
                    if($device && $device->token) {
                        
                        $key = $application->key;
                        if($device->variant_id) {
                            
                            $applicationVariantMapper = ApplicationVariantMapper::getInstance($this->adapter);
                            $applicationVariant = $applicationVariantMapper->fetchOneByApplicationIdAndVariantId($device->application_id, $device->variant_id);
                            if($applicationVariant) {
                                $key = $applicationVariant->key;
                            } else {
                                $applicationVariant = $applicationVariantMapper->fetchOneByApplicationIdAndDefault($device->application_id);
                                if($applicationVariant) {
                                    $key = $applicationVariant->key;
                                }
                            }
                            
                        }
                        
                        $push = new Push();
                        $push->status = Push::STATUS_PENDING;
                        $push->data = json_encode([
                            'server' => [
                                'key' => $key,
                            ],
                            'push' => [
                                'registration_ids'   => [
                                    $device->token,
                                ],
                                'notification' => [
                                    'body' =>  $pushTemplate->body,
                                    'title' => $pushTemplate->title,
                                    'vibrate' => 1,
                                    'sound' =>  1
                                ],
                                'data' => [
                                    'command' => 'content-refresh',
                                    'new_capsules' => '0',
                                ]
                            ]
                        ]);
                        
                        if($pushMapper->insert($push)) {
                            $push_to_send = $push_to_send + 1;
                        }
                        
                    }
                }
                
                if(0 == $push_to_send) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_NO_USER_DEVICES_WERE_FOUND_TO_SEND_PUSH'
                    ]);
                }
                
                
                
                
                
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'push_to_send' => $push_to_send,
                    ]
                ]);
                
                
                
                
                
            } 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'
        ]);
    }
    
    
}