Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

<?php
/**
 * 
 * Controlador: Mis Perfiles 
 * 
 */
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\CompanyLocationMapper;
use LeadersLinked\Mapper\CompanyFollowerMapper;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Mapper\CompanySizeMapper;
use LeadersLinked\Model\CompanyFollower;
use LeadersLinked\Mapper\UserBlockedMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Model\CompanyUser;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\NotificationMapper;
use LeadersLinked\Model\Network;

class CompanyController 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;

    }
    
    /**
     * 
     * Generación del listado de perfiles
     * {@inheritDoc}
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
     */
    public function indexAction()
    {
        //$currentUserPlugin = $this->plugin('currentUserPlugin');
        //$currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        if($request->isGet()) {
            

           
            $this->layout()->setTemplate('layout/layout.phtml');
            //$this->layout()->setTemplate('layout/layout-my-company.phtml');
            $viewModel = new ViewModel();
            $viewModel->setTemplate('leaders-linked/my-company/index.phtml');
            return $viewModel ;
            
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    
    /**
     * Presenta el perfil con las opciónes de edición de cada sección
     * @return \Laminas\Http\Response|\Laminas\View\Model\ViewModel|\Laminas\View\Model\JsonModel
     */
    public function viewAction()
    {
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $request = $this->getRequest();
            $id = $this->params()->fromRoute('id');
            
            
            $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) {
                
                $flashMessenger = $this->plugin('FlashMessenger');
                
                if(!$id) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_INVALID_PARAMETER'
                    ]);

                }
                
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
                

                if(!$company) {
                    
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_NOT_FOUND'
                    ]);

                }
                
                if($company->status != Company::STATUS_ACTIVE) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                    ]); 
                }
                

                $companyLocationMapper = CompanyLocationMapper::getInstance($this->adapter);
                $records = $companyLocationMapper->fetchAllLocationByCompanyId($company->id);
                
                $locations = [];
                foreach($records as $record)
                {
                    $location =  [
                        'formatted_address'  => $record['formatted_address'],
                        'country' => $record['country'],
                        'is_main' => $record['is_main'],
                    ];
                    
                    array_push($locations, $location);
                }
                
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOne($company->industry_id);
                
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $companySize = $companySizeMapper->fetchOne($company->company_size_id);
                
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
                $total_followers = $companyFollowerMapper->getCountFollowers($company->id);
                $follower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
                
                $link_inmail = '';
                
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
                $companyUserOwner = $companyUserMapper->fetchOwnerByCompanyId($company->id);
                if($companyUserOwner) {
                    $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
                    $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($currentUser->id, $companyUserOwner->user_id);
                    if(!$userBlocked) {
                        $userMapper = UserMapper::getInstance($this->adapter);
                        $userOwner = $userMapper->fetchOne($companyUserOwner->user_id);
                        
                        $link_inmail = $this->url()->fromRoute('inmail',['id' => $userOwner->uuid]);
                    }
                } else {
                    $userBlocked = false;
                }
                
                $data = [
                    'link_follow' => '',
                    'link_unfollow' => '',
                    'link_request' => '',
                    'link_accept' => '',
                    'link_cancel' => '',
                    'link_reject' =>'',
                    'link_leave' => '',
                    'total_followers'       => $total_followers,
                    'company_name'          => $company->name,
                    'company_uuid'          => $company->uuid,
                    'name'                  => trim($company->name),
                    'image'                 => $company->image,
                    'cover'                 => $company->cover,
                    'overview'              => $company->description,
                    'website'               => $company->website,
                    'foundation_year'       => $company->foundation_year,
                    'facebook'              => $company->facebook,
                    'instagram'             => $company->instagram,
                    'twitter'               => $company->twitter,
                    'locations'             => $locations,
                    'industry'              => $industry->name,
                    'company_size'          => $companySize->name . ' (' . $companySize->minimum_no_of_employee . '-'  . $companySize->maximum_no_of_employee . ')',
                    'is_follower'           => $follower ? 1 : 0,
                    'link_inmail'           => $link_inmail,
                    'show_contact'          => $userBlocked ? 0 : 1,
                ];
                


                
                
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
                if($companyUser) {
                    if($companyUser->status == CompanyUser::STATUS_ADMIN_WILL_ADD) {
                        $data['link_accept'] = $this->url()->fromRoute('company/accept', ['id' => $company->uuid]);
                        $data['link_reject'] = $this->url()->fromRoute('company/reject', ['id' => $company->uuid]);
                    }
                    if($companyUser->status == CompanyUser::STATUS_SENT) {
                        $data['link_cancel'] = $this->url()->fromRoute('company/cancel', ['id' => $company->uuid]);
                    }
                    if($companyUser->owner == CompanyUser::OWNER_NO && $companyUser->creator == CompanyUser::CREATOR_NO && $companyUser->status == CompanyUser::STATUS_ACCEPTED) {
                        $data['link_leave'] = $this->url()->fromRoute('company/leave', ['id' => $company->uuid]);;
                    }
                    if($companyUser->status == CompanyUser::STATUS_CANCELLED) {
                        $data['link_request'] = $this->url()->fromRoute('company/request', ['id' => $company->uuid]);;
                    }
                    
                    
                } else {
                    $data['link_request'] = $this->url()->fromRoute('company/request', ['id' => $company->uuid]);;
                }
                
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
                $data['total_followers'] = $companyFollowerMapper->getCountFollowers($company->id);
                
                $follower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
                if($follower) {
                    $data['link_unfollow'] = $this->url()->fromRoute('company/unfollow', ['id' => $company->uuid]);;
                } else {
                    $data['link_follow'] = $this->url()->fromRoute('company/follow', ['id' => $company->uuid]);
                    
                }
                
                $companyUserOwner = $companyUserMapper->fetchOwnerByCompanyId($company->id);
                if($companyUserOwner) {
                    $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
                    $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($currentUser->id, $companyUserOwner->user_id);
                    if(!$userBlocked) {
                        $data['link_contact'] = $this->url()->fromRoute('inmail', ['id' => $company->uuid]);;
                    }
                } 
                
                return new JsonModel([
                    'success'   => true,
                    'data'      => $data
                ]); 
                
                
                
            } else {
                
   
                $flashMessenger = $this->plugin('FlashMessenger');
                
                if(!$id) {
                    $flashMessenger->addErrorMessage('ERROR_INVALID_PARAMETER');
                    return $this->redirect()->toRoute('dashboard');
                }
                
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
                if(!$company || $company->status != Company::STATUS_ACTIVE) {
                    $flashMessenger->addErrorMessage('ERROR_RECORD_NOT_FOUND');
                    return $this->redirect()->toRoute('dashboard');
                }

                
               // $show_feeds = false;
                
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
                
                /*
                
                if($companyUser && $companyUser->status == CompanyUser::STATUS_ACCEPTED) {
                    $show_feeds = true;
                }
                */

                

                
                $companyLocationMapper = CompanyLocationMapper::getInstance($this->adapter);
                $records = $companyLocationMapper->fetchAllLocationByCompanyId($company->id);
                
                $locations = [];
                foreach($records as $record)
                {
                    $location =  [
                        'formatted_address'  => $record['formatted_address'],
                        'country' => $record['country'],
                        'is_main' => $record['is_main'],
                    ];
                    
                    array_push($locations, $location);
                }
                
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOne($company->industry_id);
                
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $companySize = $companySizeMapper->fetchOne($company->company_size_id);
                
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
                $total_followers = $companyFollowerMapper->getCountFollowers($company->id);
                $follower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
               /*
                if($follower) {
                    $show_feeds = true;
                }
                */
                
                $link_inmail = '';
                $companyUserOwner = $companyUserMapper->fetchOwnerByCompanyId($company->id);
                if($companyUserOwner) {
                    $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
                    $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($currentUser->id, $companyUserOwner->user_id);
                    if(!$userBlocked) {
                        $userMapper = UserMapper::getInstance($this->adapter);
                        $userOwner = $userMapper->fetchOne($companyUserOwner->user_id);
                        
                        $link_inmail = $this->url()->fromRoute('inmail',['id' => $userOwner->uuid]);
                    }
                } else {
                    $userBlocked = false;
                }
                
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                
                /*
                if($show_feeds) {
                    $viewModel->setTemplate('leaders-linked/company/view-with-feeds.phtml');
                } else {
                    $viewModel->setTemplate('leaders-linked/company/view-without-feeds.phtml');
                }
                */
                
                $notificationMapper = NotificationMapper::getInstance($this->adapter);
                $notificationMapper->markAllNotificationsAsReadByUserIdAndCompanyId($currentUser->id, $company->id);
                
                $viewModel->setTemplate('leaders-linked/company/view-without-feeds.phtml');
                $viewModel->setVariables([
                    'total_followers'       => $total_followers,
                    'company_id'            => $company->id,
                    'company_name'          => $company->name,
                    'company_uuid'          => $company->uuid,
                    'name'                  => trim($company->name),
                    'image'                 => $company->image,
                    'cover'                 => $company->cover,
                    'overview'              => $company->description,
                    'website'               => $company->website,
                    'foundation_year'       => $company->foundation_year,
                    'facebook'              => $company->facebook,
                    'instagram'             => $company->instagram,
                    'twitter'               => $company->twitter,
                    'locations'             => $locations,
                    'industry'              => $industry->name,
                    'company_size'          => $companySize->name . ' (' . $companySize->minimum_no_of_employee . '-'  . $companySize->maximum_no_of_employee . ')',
                    'show_contact'          => $userBlocked ? 0 : 1,
                    'is_follower'           => $follower ? 1 : 0,
                    'link_inmail'           => $link_inmail,
                ]);
                
                return $viewModel ;
                
            }
            
            
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function followAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $flashMessenger = $this->plugin('FlashMessenger');
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        if(!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if(!$company) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if($company->status != Company::STATUS_ACTIVE) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_COMPANY_IS_NOT_ACTIVE'
            ];
            
            return new JsonModel($data);
        }
        
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        
        if($request->isPost()) {
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
            $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyFollower) {
                $data = [
                    'success' => false,
                    'data' => 'ERROR_YOU_ALREADY_FOLLOW_THIS_COMPANY'
                ];
                
            } else {
                $companyFollower = new CompanyFollower();
                $companyFollower->company_id = $company->id;
                $companyFollower->follower_id = $currentUser->id;
                
                $result = $companyFollowerMapper->insert($companyFollower);
                if($result) {
                    if($flash) {
                        $flashMessenger->addSuccessMessage('LABEL_STARTED_FOLLOWING_THIS_COMPANY');
                        
                        $data = [
                            'success' => true,
                            'data' => [ 
                                'message' =>'LABEL_STARTED_FOLLOWING_THIS_COMPANY',
                                'reload' => true
                             ]   
                        ];
                    } else {
                        $data = [
                            'success' => true,
                            'data' => 'LABEL_STARTED_FOLLOWING_THIS_COMPANY'
                        ];
                    }
                } else {
                    $data = [
                        'success' => false,
                        'data' => $companyFollowerMapper->getError()
                    ];
                }
            }
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }
        
        return new JsonModel($data);
    }
    
    public function unfollowAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $flashMessenger = $this->plugin('FlashMessenger');
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        if(!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if(!$company) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_RECORD_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if($company->status != Company::STATUS_ACTIVE) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_COMPANY_IS_NOT_ACTIVE'
            ];
            
            return new JsonModel($data);
        }
        
        $request = $this->getRequest();
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        
        if($request->isPost()) {
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            
            $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
            $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyFollower) {
                $result = $companyFollowerMapper->deleteByCompanyIdAndUserId($company->id, $currentUser->id);
                if($result) {
                    if($flash) {
                        $flashMessenger->addSuccessMessage('LABEL_YOU_STOPPED_FOLLOWING_THIS_COMPANY_SUCCESS');
                        
                        $data = [
                            'success' => true,
                            'data' => [
                                'message' => 'LABEL_YOU_STOPPED_FOLLOWING_THIS_COMPANY_SUCCESS',  
                                'reload' => true
                             ],
                        ];
                    } else {
                        $data = [
                            'success' => true,
                            'data' => 'LABEL_YOU_STOPPED_FOLLOWING_THIS_COMPANY_SUCCESS',
                        ];
                    }
                } else {
                    $data = [
                        'success' => false,
                        'data' => $companyFollowerMapper->getError()
                    ];
                }
            } else {
                $data = [
                    'success' => false,
                    'data' => 'ERROR_YOU DONT_FOLLOW_THIS_COMPANY' 
                ];
            }
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }
        
        return new JsonModel($data);
    }
    
    public function leaveAction()
    {
        $flashMessenger = $this->plugin('FlashMessenger');
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        
        $request = $this->getRequest();
        if($request->isPost()) {
            $id = $this->params()->fromRoute('id');
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            
            if(!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ]);
                
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
            
            if(!$company) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_NOT_FOUND'
                ]);
            }
            
            if($company->status != Company::STATUS_ACTIVE) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                ]);
            }
            

            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyUser) {
                
                if($companyUser->status == CompanyUser::STATUS_ACCEPTED ) {
                    
                    $companyUser->status = CompanyUser::STATUS_CANCELLED;
                    if($companyUserMapper->update($companyUser)) {
                        if($flash) {
                            $flashMessenger->addSuccessMessage('LABEL_YOU_STOP_WORKING_WITH_THIS_COMPANY');
                            return new JsonModel([
                                'success' => true,
                                'data' =>  [
                                    'message' => 'LABEL_YOU_STOP_WORKING_WITH_THIS_COMPANY',
                                    'reload' => true
                                ]
                            ]);
                        } else {
                            return new JsonModel([
                                'success' => true,
                                'data' =>  'LABEL_YOU_STOP_WORKING_WITH_THIS_COMPANY',
                            ]);
                        }
                       
                        
                    } else {
                        return new JsonModel([
                            'success' => false,
                            'data' => $companyUserMapper->getError()
                        ]);
                    }
                    
                    
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_YOU_ARE_NOT_AN_ACTIVE_USER_OF_THIS_COMPANY'
                    ]);
                }
                
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_GROUP_YOU_NOT_MEMBER'
                ]);
            }
            
            
            
            
        } else {
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function cancelAction()
    {
        $flashMessenger = $this->plugin('FlashMessenger');
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $id = $this->params()->fromRoute('id');
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            if(!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ]);
                
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuid($id);
            
            if(!$company) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_NOT_FOUND'
                ]);
            }
            
            if($company->status != Company::STATUS_ACTIVE) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                ]);
            }
            
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyUser) {
                
                if( $companyUser->status == CompanyUser::STATUS_SENT) {
                    $companyUser->status = CompanyUser::STATUS_CANCELLED;
                    if($companyUserMapper->update($companyUser)) {
                        if($flash) {
                            $flashMessenger->addSuccessMessage('LABEL_COMPANY_REQUEST_CANCELLED');
                            return new JsonModel([
                                'success' => true,
                                'data' =>  [ 
                                    'message' => 'LABEL_COMPANY_REQUEST_CANCELLED',
                                    'reload' => true,
                                 ]    
                            ]);
                        } else {
                            
                            return new JsonModel([
                                'success' => true,
                                'data' =>  'LABEL_COMPANY_REQUEST_CANCELLED'
                           ]);
                        }
                    } else {
                        return new JsonModel([
                            'success' => false,
                            'data' => $companyUserMapper->getError()
                        ]);
                    }
                    
                    
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_THERE_IS_NO_PENDING_REQUEST_TO_CANCEL'
                    ]);
                }
                
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' =>'ERROR_COMPANY_YOU_HAVE_NOT_INVITED_THIS_COMPANY'
                ]);
            }
            
            
            
            
        } else {
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function rejectAction()
    {
        $flashMessenger = $this->plugin('FlashMessenger');
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $id = $this->params()->fromRoute('id');
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            if(!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ]);
                
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuid($id);
            
            if(!$company) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_NOT_FOUND'
                ]);
            }
            
            if($company->status != Company::STATUS_ACTIVE) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                ]);
            }
            
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyUser) {
                
                if($companyUser->status == CompanyUser::STATUS_ADMIN_WILL_ADD ) {
                    
                    $companyUser->status = CompanyUser::STATUS_CANCELLED;
                    if($companyUserMapper->update($companyUser)) {
                        
                        if($flash) {
                            $flashMessenger->addSuccessMessage('LABEL_YOU_REJECTED_WORKING_WITH_THIS_COMPANY');
                            return new JsonModel([
                                'success' => true,
                                'data' =>  [ 
                                    'message' => 'LABEL_YOU_REJECTED_WORKING_WITH_THIS_COMPANY',
                                    'reload' => true
                                 ]   
                            ]);
                            
                        } else {
                            return new JsonModel([
                                'success' => true,
                                'data' =>  'LABEL_YOU_REJECTED_WORKING_WITH_THIS_COMPANY'
                            ]);
                        }
                       
                        
                    } else {
                        return new JsonModel([
                            'success' => false,
                            'data' => $companyUserMapper->getError()
                        ]);
                    }
                    
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_THERE_IS_NO_PENDING_REQUEST_TO_CANCEL'
                    ]);
                }
                
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' =>'ERROR_COMPANY_YOU_HAVE_NOT_INVITED_THIS_COMPANY'
                ]);
            }
            
            
            
            
        } else {
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function acceptAction()
    {
        $flashMessenger = $this->plugin('FlashMessenger');
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $id = $this->params()->fromRoute('id');
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            if(!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ]);
                
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuid($id);
            
            if(!$company) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_NOT_FOUND'
                ]);
            }
            
            if($company->status != Company::STATUS_ACTIVE) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                ]);
            }
            
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyUser) {
                
                if($companyUser->status == CompanyUser::STATUS_ADMIN_WILL_ADD) {
                    
                    $companyUser->status = CompanyUser::STATUS_ACCEPTED;
                    if($companyUserMapper->update($companyUser)) {
                        if($flash) {
                            $flashMessenger->addSuccessMessage('LABEL_YOU_STARTED_WORKING_WITH_THIS_COMPANY' );
                            
                            return new JsonModel([
                                'success' => true,
                                'data' => [
                                    'message' => 'LABEL_YOU_STARTED_WORKING_WITH_THIS_COMPANY',
                                    'reload' => true
                                ]
                            ]);
                        } else {
                            return new JsonModel([
                                'success' => true,
                                'data' => 'LABEL_YOU_STARTED_WORKING_WITH_THIS_COMPANY',
                            ]);
                        }
                        
                    } else {
                        return new JsonModel([
                            'success' => false,
                            'data' => $companyUserMapper->getError()
                        ]);
                    }
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_YOU_HAVE_NOT_INVITED_THIS_COMPANY'
                    ]);
                }
                
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_YOU_HAVE_NOT_INVITED_THIS_COMPANY'
                ]);
            }
        } else {
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function requestAction()
    {
        $flashMessenger = $this->plugin('FlashMessenger');
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $id = $this->params()->fromRoute('id');
            $flash =  filter_var($this->params()->fromPost('flash', 'false'), FILTER_SANITIZE_STRING);
            $flash = $flash === 'true'? true: false;
            
            if(!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ]);
                
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOneByUuid($id);
            
            if(!$company) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_NOT_FOUND'
                ]);
            }
            
            if($company->status != Company::STATUS_ACTIVE) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_COMPANY_IS_NOT_ACTIVE'
                ]);
            }
            
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
            if($companyUser) {
                if($companyUser->status == CompanyUser::STATUS_ACCEPTED) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_YOU_ARE_USER'
                    ]);
                }
                if($companyUser->status == CompanyUser::STATUS_REJECTED) {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_COMPANY_YOUR REQUEST WAS PREVIOUSLY REJECTED'
                    ]);
                }
                
            }
            
            if($companyUser) {
                $companyUser->status    = CompanyUser::STATUS_SENT;
                $result = $companyUserMapper->update($companyUser);
                
                
            } else {
                $companyUser = new CompanyUser();
                $companyUser->company_id    = $company->id;
                $companyUser->user_id       = $currentUser->id;
                $companyUser->status        = CompanyUser::STATUS_SENT;
                
                $result = $companyUserMapper->insert($companyUser);
            }
            
            if($result) {
                if($flash) {
                    $flashMessenger->addSuccessMessage('LABEL_COMPANY_REQUEST_SENT' );
                    
                    return new JsonModel([
                        'success' => true,
                        'data' => [
                            'message' => 'LABEL_COMPANY_REQUEST_SENT',
                            'reload' => true
                         ]    
                    ]); 
                } else {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'LABEL_COMPANY_REQUEST_SENT'
                    ]); 
                }
                return new JsonModel([
                    'success' => true,
                    'data' => 'LABEL_COMPANY_REQUEST_SENT'
                ]);        
                    
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => $companyUserMapper->getError()
                ]);
            }
            
            
        } else {
            
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
    }
    
    public function invitationsReceivedAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $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) {
                $search = trim(filter_var($this->params()->fromQuery('search', ''), FILTER_SANITIZE_STRING));
                
                
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                

                
                
                $select = $queryMapper->getSql()->select();
                $select->columns([ 'uuid', 'name', 'image']);
                $select->from(['c' => CompanyMapper::_TABLE]);
                $select->join(['cu' => CompanyUserMapper::_TABLE], 'cu.company_id  = c.id', []);
                $select->where->equalTo('cu.user_id', $currentUser->id);
                $select->where->equalTo('cu.status', CompanyUser::STATUS_ADMIN_WILL_ADD);
                $select->where->equalTo('c.status', Company::STATUS_ACTIVE);
                
                if($search) {
                    $select->where->like('c.name', '%' . $search . '%');
                }
                $select->order('name ASC');
                                
               // echo $select->getSqlString($this->adapter->platform); exit;
                
                $records = $queryMapper->fetchAll($select);
                
                $items = [];
                foreach($records as $record)
                {
                    $item = [
                        'name' => $record['name'],
                        'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $record['uuid'], 'filename' => $record['image']]),
                        'link_view' => $this->url()->fromRoute('company/view', ['id' => $record['uuid'] ]),
                        'link_accept' => $this->url()->fromRoute('company/accept', ['id' => $record['uuid'] ]),
                        'link_reject' => $this->url()->fromRoute('company/reject', ['id' => $record['uuid'] ]),
                    ];
                    

                    array_push($items, $item);
                }
                
                $response = [
                    'success' => true,
                    'data' => $items
                ];
                
                return new JsonModel($response);
                
                
            } else {
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/company/invitations-received.phtml');
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function requestsSentAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $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) {
                $search = trim(filter_var($this->params()->fromQuery('search', ''), FILTER_SANITIZE_STRING));
                
                
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                
                $select = $queryMapper->getSql()->select();
                $select->columns([ 'uuid', 'name', 'image']);
                $select->from(['c' => CompanyMapper::_TABLE]);
                $select->join(['cu' => CompanyUserMapper::_TABLE], 'cu.company_id  = c.id', ['status']);
                $select->where->equalTo('cu.user_id', $currentUser->id);
                $select->where->equalTo('cu.status', CompanyUser::STATUS_SENT);
                $select->where->equalTo('c.status', Company::STATUS_ACTIVE);
                
                
                if($search) {
                    $select->where->like('c.name', '%' . $search . '%');
                }
                $select->order('name ASC');
                
                //echo $select2->getSqlString($this->adapter->platform); exit;
                
                $records = $queryMapper->fetchAll($select);
                
                $items = [];
                foreach($records as $record)
                {
                    $item = [
                        'name' => $record['name'],
                        'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $record['uuid'], 'filename' => $record['image']]),
                        'link_view' => $this->url()->fromRoute('company/view', ['id' => $record['uuid'] ]),
                        'link_cancel' => $this->url()->fromRoute('company/cancel', ['id' => $record['uuid'] ]),
                    ];
                    
                    
                    array_push($items, $item);
                }
                
                $response = [
                    'success' => true,
                    'data' => $items
                ];
                
                return new JsonModel($response);
                
                
            } else {
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/company/requests-sent.phtml');
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
   
    
    public function iWorkWithAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $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) {
                $search = trim(filter_var($this->params()->fromQuery('search', ''), FILTER_SANITIZE_STRING));
                
                
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                
                $select = $queryMapper->getSql()->select();
                $select->columns([ 'id', 'uuid', 'name', 'image']);
                $select->from(['c' => CompanyMapper::_TABLE]);
                $select->join(['cu' => CompanyUserMapper::_TABLE], 'cu.company_id  = c.id', []);
                $select->where->equalTo('cu.user_id', $currentUser->id);
                $select->where->equalTo('cu.status', CompanyUser::STATUS_ACCEPTED);
                $select->where->equalTo('c.status', Company::STATUS_ACTIVE);
                $select->where->equalTo('cu.owner', CompanyUser::OWNER_NO);
                $select->where->equalTo('cu.creator', CompanyUser::CREATOR_NO);
                
                if($search) {
                    $select->where->like('c.name', '%' . $search . '%');
                }
                $select->order('name ASC');
                
                /*
                 * select uuid, name, image from tbl_companies  as c
                 inner join tbl_company_users as cu on c.id = cu.company_id
                 and cu.user_id  = 2 and c.status  = 'a' and cu.status = 'aa'
                 */
                
                //echo $select->getSqlString($this->adapter->platform); exit;
                
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);    
 
                
                $records = $queryMapper->fetchAll($select);
                
                $items = [];
                foreach($records as $record)
                {
                    
                    $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($record['id'], $currentUser->id);
                    if($companyUser && $companyUser->status == CompanyUser::STATUS_ACCEPTED && $companyUser->backend == CompanyUser::BACKEND_YES ) {
                        $link_my_company = $this->url()->fromRoute('backend/signin-company', ['id' => $record['uuid'] ]);
                    } else {
                        $link_my_company = '';
                    } 
                    
                    $item = [
                        'name' => $record['name'],
                        'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $record['uuid'], 'filename' => $record['image']]),
                        'link_view' => $this->url()->fromRoute('company/view', ['id' => $record['uuid'] ]),
                        'link_leave' => $this->url()->fromRoute('company/leave', ['id' => $record['uuid'] ]),
                        'link_my_company' => $link_my_company
                    ];
                    
                    array_push($items, $item);
                }
                
                
                
                $response = [
                    'success' => true,
                    'data' => $items
                ];
                
                return new JsonModel($response);
                
                
            } else {
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/company/i-work-with.phtml');
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    /**
     *
     * Generación del listado de perfiles
     * {@inheritDoc}
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
     */
    public function followingCompaniesAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        
        $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) {
                $search = trim(filter_var($this->params()->fromQuery('search', ''), FILTER_SANITIZE_STRING));
                $queryMapper = QueryMapper::getInstance($this->adapter);
                
                $select = $queryMapper->getSql()->select();
                $select->columns(['id', 'uuid', 'name', 'status',  'image']);
                $select->from(['c' => CompanyMapper::_TABLE]);
                $select->join(['cf' => CompanyFollowerMapper::_TABLE],'cf.company_id = c.id' ,['follower_id']);
                $select->where->equalTo('follower_id', $currentUser->id);
                $select->where->equalTo('c.status', Company::STATUS_ACTIVE);
                
                if($search) {
                    $select->where->like('c.name', '%' . $search . '%');
                }
                $select->order('name ASC');
                
                $records = $queryMapper->fetchAll($select);
                
                $items = [];
                foreach($records as $record)
                {
                    $item = [
                        'name' => $record['name'],
                        'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $record['uuid'], 'filename' => $record['image']]),
                        'link_view' => $this->url()->fromRoute('company/view', ['id' => $record['uuid']]),
                        'link_unfollow' => $this->url()->fromRoute('company/unfollow', ['id' => $record['uuid']]),
                    ];
                    
                    array_push($items, $item);
                }
                
                $response = [
                    'success' => true,
                    'data' => $items,
                    'sql' =>  $select->getSqlString($this->adapter->platform)
                    
                ];
                
                return new JsonModel($response);
                
                
            } else {
                $this->layout()->setTemplate('layout/layout.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/company/following-companies.phtml');
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
    }
    
}