Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 780 | 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\Library\Functions;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
use LeadersLinked\Library\Image;

use LeadersLinked\Mapper\CompanyLocationMapper;
use LeadersLinked\Form\CompanyProfileSocialNetworkForm;
use LeadersLinked\Form\CompanyProfileLocationForm;
use LeadersLinked\Form\CompanyProfileExtendedForm;
use LeadersLinked\Form\CompanyProfileImageForm;
use LeadersLinked\Form\CompanyProfileCoverForm;

use LeadersLinked\Form\CompanyProfileIndustryForm;
use LeadersLinked\Form\CompanyProfileCompanySizeForm;
use LeadersLinked\Form\CompanyProfileFoundationYearForm;
use LeadersLinked\Form\CompanyProfileWebsiteForm;
use LeadersLinked\Model\Location;
use LeadersLinked\Model\CompanyLocation;
use LeadersLinked\Model\CompanyUser;

use LeadersLinked\Mapper\LocationMapper;
use LeadersLinked\Mapper\CompanyFollowerMapper;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Mapper\CompanySizeMapper;

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

    }
    
    

    /**
     * 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 indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        

        $request = $this->getRequest();
        if($request->isGet()) {
            
            $sandbox = $this->config['leaderslinked.runmode.sandbox'];
            if($sandbox) {
                $google_map_key  = $this->config['leaderslinked.google_map.sandbox_api_key'];
            } else {
                $google_map_key  = $this->config['leaderslinked.google_map.production_api_key'];
            }
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            

            $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'],
                    'link_edit' => $this->url()->fromRoute('profile/location', [ 'operation' => 'edit', 'id' =>  $record['company_location_uuid'] ]),
                    'link_delete' => $this->url()->fromRoute('profile/location', ['operation' => 'delete', 'id' => $record['company_location_uuid'] ])
                    
                ];
                
                array_push($locations, $location);
            }
            
            $industryMapper = IndustryMapper::getInstance($this->adapter);
            $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);

            $formSocialNetwork = new CompanyProfileSocialNetworkForm();
            $formLocation = new CompanyProfileLocationForm();
            $formExtended = new CompanyProfileExtendedForm();
            $formFoundationYear = new CompanyProfileFoundationYearForm();
            $formWebsite = new CompanyProfileWebsiteForm();
            $formImage = new CompanyProfileImageForm($this->config);
            $formCover = new CompanyProfileCoverForm($this->config);
            $formCompanySize = new CompanyProfileCompanySizeForm($this->adapter);
            $formIndustry = new CompanyProfileIndustryForm($this->adapter);
            
            $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
            $follower = $companyFollowerMapper->getCountFollowers($currentCompany->id);

            $image_size_cover = $this->config['leaderslinked.image_sizes.company_cover_upload'];
            $image_size_profile = $this->config['leaderslinked.image_sizes.company_image_upload'];
            
            
            $industry = $industryMapper->fetchOne($company->industry_id);
            $companySize = $companySizeMapper->fetchOne($company->company_size_id);
            
            
            $this->layout()->setTemplate('layout/layout-backend');
            $viewModel = new ViewModel();
            $viewModel->setTemplate('leaders-linked/profile/index.phtml');
            $viewModel->setVariables([
                'google_map_key'        => $google_map_key,
                'follower'              => $follower,
                'company_id'            => $currentCompany->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 .')',
                'formLocation'          => $formLocation,
                'formSocialNetwork'     => $formSocialNetwork,
                'formExtended'          => $formExtended,
                'formImage'             => $formImage,
                'formCover'             => $formCover,
                'formFoundationYear'    => $formFoundationYear,
                'formWebsite'           => $formWebsite,
                'formIndustry'          => $formIndustry,
                'formCompanySize'       => $formCompanySize,
                'image_size_cover'      => $image_size_cover,
                'image_size_profile'    => $image_size_profile,
            ]);
            return $viewModel ;
            
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            
            return new JsonModel($data);
        }
        
        return new JsonModel($data);
    }
    
    
    /**
     *
     * Borrar un perfil excepto el público
     * @return \Laminas\View\Model\JsonModel
     */
    public function deleteAction()
    {

        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
        $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($currentCompany->id, $currentUser->id);
        
        if(!$companyUser || $companyUser->type != CompanyUser::CREATOR_YES) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        if($request->isPost()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $result = $companyMapper->delete($companyUser->id);
            if($result) {
                $this->logger->info('Se borro la empresa : ' .  $currentCompany->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $data = [
                    'success' => true,
                    'data' => 'LABEL_RECORD_DELETED'
                ];
            } else {
                
                $data = [
                    'success'   => false,
                    'data'      => $companyUserMapper->getError()
                ];
                
                return new JsonModel($data);
            }
            
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            
            return new JsonModel($data);
        }
        
        return new JsonModel($data);
    }
    
    
    
    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function extendedAction()
    {

        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        

        

        
        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $data = [
                'success' => true,
                'data' => [
                    'description' => $company->description,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            $form = new CompanyProfileExtendedForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);
                
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $company);
                
                $companyMapper->updateExtended($company);
            
                $this->logger->info('Se actualizo las descripción de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'description' => $company->description,
                    ]
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function websiteAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();

        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $data = [
                'success' => true,
                'data' => [
                    'website' => $company->website,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyProfileWebsiteForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);
                
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $company);
                
                $companyMapper->updateWebsite($company);
                
                $this->logger->info('Se actualizo el website de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'website' => $company->website,
                    ]
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function foundationYearAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();

        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $data = [
                'success' => true,
                'data' => [
                    'foundation_year' => $company->foundation_year,
                ]
                
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyProfileFoundationYearForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);
                
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $company);
                
                $companyMapper->updateFoundationYear($company);
                
                $this->logger->info('Se actualizo el año de fundación de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => $company->foundation_year,
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    
    /**
     * Actualización de la ubucación
     * @return \Laminas\View\Model\JsonModel
     */
    public function locationAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $operation = $this->params()->fromRoute('operation');
        if($operation == 'edit' || $operation == 'delete') {
            $id = $this->params()->fromRoute('id');
            if(! $id) {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_INVALID_PARAMETER'
                ];
                
                return new JsonModel($response);
            }
        } else {
            $id = '';
        }

        


        

        

        $request = $this->getRequest();
        if($request->isPost()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $companyLocationMapper = CompanyLocationMapper::getInstance($this->adapter);
            
            
            $companyLocation = null;
            if($id) {
                $companyLocation = $companyLocationMapper->fetchOneByUuid($id);
                if(!$companyLocation) {
                    $response = [
                        'success' => false,
                        'data' => 'ERROR_RECORD_NOT_FOUND'
                    ];
                    
                    return new JsonModel($response);
                }
                
                if($companyLocation->company_id != $company->id) {
                    $response = [
                        'success' => false,
                        'data' => 'ERROR_UNAUTHORIZED'
                    ];
                    return new JsonModel($response);
                }
            }
            
            $locationMapper = LocationMapper::getInstance($this->adapter);
            $response = [];
            

            
            if($operation == 'delete' && $companyLocation ) {

                if($companyLocationMapper->delete($companyLocation->id)) {
                    $this->logger->info('Se borrar una ubicación de la empresa: ' . $company->name, ['user_id' => $currentUser->id,  'ip' => Functions::getUserIP()]);
                    $locationMapper->delete($companyLocation->location_id);
                    
                } else {
                    $response = [
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ];
                }
                
     
            } else {
                $form = new CompanyProfileLocationForm();
                $dataPost = $request->getPost()->toArray();
                
                
                $dataPost['is_main'] = isset($dataPost['is_main']) ? $dataPost['is_main'] : CompanyLocation::IS_MAIN_NO;

                
                $form->setData($dataPost);
                
                if($form->isValid()) {
                    
                    if($operation == 'edit') {
                        $location = $locationMapper->fetchOne($companyLocation->location_id);
                    } else {
                        $location = new Location();
                    }
                    
                    $dataPost = (array) $form->getData();
                    $hydrator = new ObjectPropertyHydrator();
                    $hydrator->hydrate($dataPost, $location);
                    
                    if($operation == 'edit') {
   
                        
                        $companyLocation->is_main = $dataPost['is_main'];
                        $companyLocationMapper->update($companyLocation);
                        
                        
                        $location = $locationMapper->update($location);
                        $this->logger->info('Se actualizo una ubicación de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                        
                        
                    } else {
                        
                        $result = $locationMapper->insert($location);
                        
                        if($result) {
                            $companyLocation = new CompanyLocation();
                            $companyLocation->company_id = $currentCompany->id;
                            $companyLocation->location_id = $location->id;
                            $companyLocation->is_main = $dataPost['is_main'];
                            
                            $companyLocationMapper->insert($companyLocation);
                            $this->logger->info('Se agrego una ubicación a la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                        } else {
                            $response = [
                                'success'   => false,
                                'data' => 'ERROR_THERE_WAS_AN_ERROR'
                            ];
                        }
                    }
                } else {
                    return new JsonModel([
                        'success'   => false,
                        'data'   =>   'ERROR_PLACED_AUTOCOMPLETE_DOES_NOT_CONTAIN_GEOMETRY'
                    ]);
                }
            }
            
            if(!$response) {
                $records = $companyLocationMapper->fetchAllLocationByCompanyId($currentCompany->id);
                
                
                $locations = [];
                foreach($records as $record)
                {
                    $location =  [
                        'formatted_address'  => $record['formatted_address'],
                        'country' => $record['country'],
                        'is_main' => $record['is_main'],
                        'link_edit' => $this->url()->fromRoute('profile/location', ['id' => $company->uuid, 'operation' => 'edit', 'company_location_id' => $record['company_location_uuid'] ]),
                        'link_delete' => $this->url()->fromRoute('profile/location', ['id' => $company->uuid, 'operation' => 'delete', 'company_location_id' => $record['company_location_uuid'] ])
                        
                    ];
                    
                    array_push($locations, $location);
                }
                
                $response = [
                    'success' => true,
                    'data' => $locations
                ];
                
                
            }
            
            return new JsonModel($response);
            
        } else if($request->isGet() && $operation == 'edit') {
        

            
            $companyLocationMapper = CompanyLocationMapper::getInstance($this->adapter);
            $companyLocation = $companyLocationMapper->fetchOneByUuid($id);
            

            
            if(!$companyLocation) {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_RECORD_NOT_FOUND'
                ];
                
                return new JsonModel($response);
            }
            
            if($companyLocation->company_id != $currentCompany->id) {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_UNAUTHORIZED'
                ];
                return new JsonModel($response);
            }
            
            $locationMapper = LocationMapper::getInstance($this->adapter);
            $location = $locationMapper->fetchOne($companyLocation->location_id);

            $hydrator = new ObjectPropertyHydrator();
            $data = $hydrator->extract($location);
            
            $data['is_main'] = $companyLocation->is_main;
            
            $response = [
                'success' => true,
                'data' =>  $data
            ];
            
            return new JsonModel($response);
        
        }
        
        $response = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($response);
    }
    
    /**
     * Actualización de las redes sociales
     * @return \Laminas\View\Model\JsonModel
     */
    public function socialNetworkAction()
    {
    
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();

        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $data = [
                'success' => true,
                'data' => [
                    'facebook' => $company->facebook,
                    'instagram' => $company->instagram,
                    'twitter' => $company->twitter
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyProfileSocialNetworkForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);
                
                $this->logger->info('Se actualizaron las redes sociales de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $company);
                
                $companyMapper->updateSocialNetwork($company);
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'facebook' => $company->facebook,
                        'instagram' => $company->instagram,
                        'twitter' => $company->twitter
                    ]
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
   
    
    /**
     * Cambio de la imagen del image del perfil
     * @return \Laminas\View\Model\JsonModel
     */
    public function imageAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $operation  = $this->params()->fromRoute('operation');


        
       
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $company->uuid;
            
            if($operation == 'delete') {
                $this->logger->info('Se borro la imagen de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                if($company->image) {
                
                    if(!Image::delete($target_path, $company->image)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                    
               
                }
                
                $company->image = '';
                if(!$companyMapper->updateImage($company)) {
                    return new JsonModel([
                        'success'   => false,
                        'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
                
            } else {
                $form = new CompanyProfileImageForm($this->config);
                $data   = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());

                $form->setData($data);
                
                if($form->isValid()) {
                    
                    $files = $request->getFiles()->toArray();
                    if(!empty($files['image']['error'])) {
                        
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_UPLOAD_FILE'
                        ]);
                        
                        
                    }
                    
                    
                    if($company->image) {
                        
                        if(!Image::delete($target_path, $company->image)) {
                            return new JsonModel([
                                'success'   => false,
                                'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                            ]);
                        }

           
                    }
                    
                    list( $target_width, $target_height ) = explode('x', $this->config['leaderslinked.image_sizes.company_image_size']);
                    $source             = $files['image']['tmp_name'];
                    $target_filename    = 'company-image-' . uniqid() . '.png';
                    $crop_to_dimensions = true;

                    if(!Image::uploadImage($source, $target_path, $target_filename, $target_width, $target_height, $crop_to_dimensions)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                    
                    
                    $company->image = $target_filename;
                    if(!$companyMapper->updateImage($company)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                    
                    $this->logger->info('Se actualizo la imagen de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                    
                } 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'   => true,
                'data' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image])
               
            ]);
        }

        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    /**
     * Cambio de la imagen de fondo superior (cover) del perfil 
     * @return \Laminas\View\Model\JsonModel
     */
    public function coverAction()
    {
        $operation          = $this->params()->fromRoute('operation');

        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();

        
        
        
        $request = $this->getRequest();
        if($request->isPost()) {
            
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $target_path = $this->config['leaderslinked.fullpath.company'] . DIRECTORY_SEPARATOR . $company->uuid;
            

            
            if($operation == 'delete') {
                if($company->cover) {
                    
                    if(!Image::delete($target_path, $company->cover)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                }
                
                $this->logger->info('Se borro el cover de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                $company->cover = '';
                if(!$companyMapper->updateCover($company)) {
                    return new JsonModel([
                        'success'   => false,
                        'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
                
            } else {
                $form = new CompanyProfileCoverForm($this->config);
                $data   = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
                
                $form->setData($data);
                
                if($form->isValid()) {
                    

                    $files = $request->getFiles()->toArray();
                    if(!empty($files['cover']['error'])) {
                        
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_UPLOAD_FILE'
                        ]);
                        
                        
                    }
                    
                    if($company->cover) {
                        
                        if(!Image::delete($target_path, $company->cover)) {
                            return new JsonModel([
                                'success'   => false,
                                'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                            ]);
                        }
                    }
                    
                    list( $target_width, $target_height ) = explode('x', $this->config['leaderslinked.image_sizes.company_cover_size']);
                    $source             = $files['cover']['tmp_name'];
                    $target_filename    = 'company-cover-' . uniqid() . '.png';
                    $crop_to_dimensions = false;
                    
                    if(!Image::uploadImage($source, $target_path, $target_filename, $target_width, $target_height, $crop_to_dimensions)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                    
                    
                    $company->cover = $target_filename;
                    if(!$companyMapper->updateCover($company)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                    


                    
                    $this->logger->info('Se actualizo el cover  de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                    
                } 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'   => true,
                'data' => $this->url()->fromRoute('storage', ['type' => 'company-cover', 'code' => $company->uuid, 'filename' => $company->cover])
                
            ]);
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function industryAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        

        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $industryMapper = IndustryMapper::getInstance($this->adapter);
            $industry = $industryMapper->fetchOne($company->industry_id);
            
            $data = [
                'success' => true,
                'data' => [
                    'industry_id' => $industry->uuid,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyProfileIndustryForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);

                $dataPost = (array) $form->getData();
                
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOneByUuid($dataPost['industry_id']);
                
                $company->industry_id = $industry->id;
                $companyMapper->updateIndustry($company);
                
                $this->logger->info('Se actualizo la industria de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOne($company->industry_id);
                
                return new JsonModel([
                    'success'   => true,
                    'data' =>  $industry->name,
                    
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    
    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function companySizeAction()
    {

        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();


        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
            $companySize = $companySizeMapper->fetchOne($company->company_size_id);
            
            $data = [
                'success' => true,
                'data' => [
                    'company_size_id' => $companySize->uuid
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyProfileCompanySizeForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $companyMapper = CompanyMapper::getInstance($this->adapter);
                $company = $companyMapper->fetchOne($currentCompany->id);
                
                $dataPost = (array) $form->getData();
                
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $companySize = $companySizeMapper->fetchOneByUuid($dataPost['company_size_id']);
                
                $company->company_size_id = $companySize->id;
                $companyMapper->updateIndustry($company);
                
                $this->logger->info('Se actualizo la industria de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
                $companySize = $companySizeMapper->fetchOne($company->company_size_id);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => $companySize->name . ' (' . $companySize->minimum_no_of_employee .'-' . $companySize->maximum_no_of_employee . ')',
                   
                ]);
                
            } 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
                ]);
            }
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
}