Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 7136 | 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\Mapper\CompanyUserMapper;
use LeadersLinked\Model\Job;
use LeadersLinked\Model\Location;
use LeadersLinked\Mapper\LocationMapper;
use LeadersLinked\Mapper\JobMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\CompanyUser;
use LeadersLinked\Mapper\QueryMapper;

use LeadersLinked\Mapper\JobCategoryMapper;
use LeadersLinked\Form\CompanyJobExtendedForm;
use LeadersLinked\Form\CompanyJobLocationForm;
use LeadersLinked\Form\CompanyJobCreateForm;
use LeadersLinked\Form\CompanyJobCategoryForm;
use LeadersLinked\Form\CompanyJobEmploymentTypeForm;
use LeadersLinked\Form\CompanyJobExperienceForm;
use LeadersLinked\Form\CompanyJobSalaryForm;
use LeadersLinked\Form\CompanyJobDegreeForm;
use LeadersLinked\Form\CompanyJobLanguageForm;
use LeadersLinked\Form\CompanyJobSkillForm;
use LeadersLinked\Form\CompanyJobLastDateOfApplicationForm;
use LeadersLinked\Mapper\JobSkillMapper;
use LeadersLinked\Model\JobSkill;
use LeadersLinked\Model\JobDegree;
use LeadersLinked\Mapper\JobDegreeMapper;
use LeadersLinked\Model\JobLanguage;
use LeadersLinked\Mapper\JobLanguageMapper;
use LeadersLinked\Mapper\DegreeMapper;
use LeadersLinked\Mapper\LanguageMapper;
use LeadersLinked\Mapper\SkillMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Model\User;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use LeadersLinked\Mapper\JobApplicationMapper;
use LeadersLinked\Mapper\UserProfileMapper;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Mapper\CurrencyMapper;
use LeadersLinked\Form\CompanyJobTitleForm;
use LeadersLinked\Form\CompanyJobStatusForm;

class JobController 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();
        $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'];
            }
            
            $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 = $this->params()->fromQuery('search', []);
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
                
                $page               = intval($this->params()->fromQuery('start', 1), 10);
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
                $order =  $this->params()->fromQuery('order', []);
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var( $order[0]['dir'], FILTER_SANITIZE_STRING));
                
                $fields =  ['last_date_of_application', 'titlte'];
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'last_date_of_application';
                
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
                    $order_direction = 'ASC';
                }
                
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'jobs/delete');
               
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'jobs/edit');
                $allowUsersWhoApplied = $acl->isAllowed($currentUser->usertype_id, 'jobs/users-who-applied');
                
                
                
                $jobMapper = JobMapper::getInstance($this->adapter);
                $jobApplicationMapper = JobApplicationMapper::getInstance($this->adapter);
                $paginator = $jobMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
                

                $records = $paginator->getCurrentItems();

                $items = [];
                foreach($records as $record)
                {
                    
                    switch($record->status) {
                        case  Job::STATUS_ACTIVE :
                            $status = 'LABEL_ACTIVE';
                            break;
                            
                        case  Job::STATUS_INACTIVE :
                            $status = 'LABEL_INACTIVE';
                            break;
                            
                            
                        case  Job::STATUS_DELETED :
                            $status = 'LABEL_DELETED';
                            break;
                            
                        default : 
                            $status = '';
                            break;
                    }
                    
                    switch($record->employment_type)
                    {
                        case Job::EMPLOYMENT_TYPE_FULL_TIME : 
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_FULL_TIME';
                            break;
                        case Job::EMPLOYMENT_TYPE_PART_TIME : 
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_PART_TIME';
                            break;
                            
                        case Job::EMPLOYMENT_TYPE_CONTRACT : 
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_CONTRACT';
                            break;
                            
                        case Job::EMPLOYMENT_TYPE_TEMPORARY : 
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_TEMPORARY';
                            break;
                            
                        default : 
                            $employment_type = '';
                            break;
                    }
                    
                    $users_who_applied = $jobApplicationMapper->fetchTotalApplicationsByJobId($record->id);
                    
                   
                    $dt = \DateTime::createFromFormat('Y-m-d', $record->last_date_of_application );
                    

                    $item = [
                        'last_date_of_application' => $dt->format('d/m/Y') ,
                        'title' => $record->title, 
                        
                        
                        'details' => [
                            'status' => $status,
                            'employment_type' => $employment_type, 
                            'users_who_applied' => $users_who_applied,
                        ],
                        'actions' => [
                            'link_edit' => $allowEdit ? $this->url()->fromRoute('jobs/edit', ['id' => $record->uuid  ]) : '' ,
                            'link_delete' => $allowDelete ? $this->url()->fromRoute('jobs/delete', [ 'id' => $record->uuid  ]) : '',
                            'link_users_who_applied'  => $allowUsersWhoApplied && $users_who_applied  ? $this->url()->fromRoute('jobs/users-who-applied', ['id' => $record->uuid ]) : '',
                         ]
                    ];
                    
                    array_push($items, $item);
                }
                

                
                
                $response = [
                    'success' => true,
                    'data' => [
                        'items' => $items,
                        'total' => $paginator->getTotalItemCount(),
                    ]
                ];
                
                return new JsonModel($response);
                
                
            } else {
               
                
                $formAdd = new CompanyJobCreateForm($this->adapter);
                $formExtended = new CompanyJobExtendedForm();
                $formLocation = new CompanyJobLocationForm();
                $formEmploymentType = new CompanyJobEmploymentTypeForm();
                $formJobCategory = new CompanyJobCategoryForm($this->adapter);
                $formExperience = new CompanyJobExperienceForm();
                $formSalary = new CompanyJobSalaryForm($this->adapter);
                $fromLastDateOfApplication = new CompanyJobLastDateOfApplicationForm();
                $formDegree = new CompanyJobDegreeForm($this->adapter);
                $formLanguage = new CompanyJobLanguageForm($this->adapter);
                $formSkill = new CompanyJobSkillForm($this->adapter);
                $formStatus = new CompanyJobStatusForm();
                $formTitle = new CompanyJobTitleForm();
                
                
                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/jobs/index.phtml');
                $viewModel->setVariables([
                    'formAdd'                   => $formAdd,
                    'formLocation'              => $formLocation,
                    'formExtended'              => $formExtended,
                    'formEmploymentType'        => $formEmploymentType,
                    'formJobCategory'           => $formJobCategory,
                    'formExperience'            => $formExperience,
                    'formSalary'                => $formSalary,
                    'fromLastDateOfApplication' => $fromLastDateOfApplication,
                    'formDegree'                => $formDegree,
                    'formLanguage'              => $formLanguage,
                    'formSkill'                 => $formSkill,
                    'formStatus'                => $formStatus,
                    'formTitle'                 => $formTitle,
                    
                    'google_map_key'    => $google_map_key,

                ]);
                return $viewModel ;
            }
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    /**
     * 
     * Agregar un nuevo perfil
     * @return \Laminas\View\Model\JsonModel
     */
    public function addAction()
    {
        $request = $this->getRequest();
       
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        

        
        if($request->isPost()) {
            $form = new  CompanyJobCreateForm($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();
                
                $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
                $jobCategory = $jobCategoryMapper->fetchOneByUuid( $dataPost['job_category_id']);

                
                
                $hydrator = new ObjectPropertyHydrator();
                $location = new Location();
                $hydrator->hydrate($dataPost, $location);
                
                
                $locationMapper= LocationMapper::getInstance($this->adapter);
                $result = $locationMapper->insert($location);
                
                if($result) {

                    $job = new Job();
                    $hydrator->hydrate($dataPost, $job);
                    
                    $job->location_id = $location->id;
                    $job->status = Job::STATUS_INACTIVE;
                    $job->company_id = $company->id;
                    $job->job_category_id = $jobCategory->id;
                    $job->description = '';
                    
                    $last_date_of_application = $job->last_date_of_application;
                    
                    $dt = \DateTime::createFromFormat('d/m/Y', $last_date_of_application);
                    if($dt) {
                        $job->last_date_of_application = $dt->format('Y-m-d');
                    }
                    
                    
                    
                    $jobMapper = JobMapper::getInstance($this->adapter);
                    $result = $jobMapper->insert($job);
                    
                    if($result) {
                        
                        $this->logger->info('Se agrego el empleo : ' . $job->title . ' a  la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                        
                        switch($job->employment_type)
                        {
                            case Job::EMPLOYMENT_TYPE_FULL_TIME :
                                $employment_type = 'LABEL_EMPLOYMENT_TYPE_FULL_TIME';
                                break;
                            case Job::EMPLOYMENT_TYPE_PART_TIME :
                                $employment_type = 'LABEL_EMPLOYMENT_TYPE_PART_TIME';
                                break;
                                
                            case Job::EMPLOYMENT_TYPE_CONTRACT :
                                $employment_type = 'LABEL_EMPLOYMENT_TYPE_CONTRACT';
                                break;
                                
                            case Job::EMPLOYMENT_TYPE_TEMPORARY :
                                $employment_type = 'LABEL_EMPLOYMENT_TYPE_TEMPORARY';
                                break;
                                
                            default :
                                $employment_type = '';
                                break;
                        }
                        
                        $months = [
                            1 => 'LABEL_MONTH_JANUARY',
                            2 => 'LABEL_MONTH_FEBRUARY',
                            3 => 'LABEL_MONTH_MARCH',
                            4 => 'LABEL_MONTH_APRIL',
                            5 => 'LABEL_MONTH_MAY',
                            6 => 'LABEL_MONTH_JUNE',
                            7 => 'LABEL_MONTH_JULY',
                            8 => 'LABEL_MONTH_AUGUST',
                            9 => 'LABEL_MONTH_SEPTEMBER',
                            10 => 'LABEL_MONTH_OCTOBER',
                            11 => 'LABEL_MONTH_NOVEMBER',
                            12 => 'LABEL_MONTH_DECEMBER',
                        ];
                        
                        $dt = \DateTime::createFromFormat('Y-m-d', $job->last_date_of_application);
                        $last_date_of_application = $dt->format('d') . ' de ' . $months[$dt->format('n')] . ' de ' . $dt->format('Y');
                        
                        $job = $jobMapper->fetchOne($job->id);
                        
                        
                        //'LABEL_RECORD_ADDED'
                        $response = [
                            'success'   => true,
                            'data'   => [
                                'title' => $job->title,
                                'status' => 'LABEL_INACTIVE',
                                'employment_type' => $employment_type,
                                'job_category' => $jobCategory->name,
                                'last_date_of_application' => $last_date_of_application,
                                'location'  => $location->formatted_address,
                                'route_status' => $this->url()->fromRoute('jobs/edit/status', [ 'id' => $job->uuid ]),
                                'route_title' => $this->url()->fromRoute('jobs/edit/title', [ 'id' => $job->uuid ]),
                                'route_extended' => $this->url()->fromRoute('jobs/edit/extended', [ 'id' => $job->uuid ]),
                                'route_location' => $this->url()->fromRoute('jobs/edit/location', [ 'id' => $job->uuid ]),
                                'route_job_category' => $this->url()->fromRoute('jobs/edit/job-category', [ 'id' => $job->uuid ]),
                                'route_employment_type' => $this->url()->fromRoute('jobs/edit/employment-type', [ 'id' => $job->uuid ]),
                                'route_salary' => $this->url()->fromRoute('jobs/edit/salary', [ 'id' => $job->uuid ]),
                                'route_experience' => $this->url()->fromRoute('jobs/edit/experience', [ 'id' => $job->uuid ]),
                                'route_languages' => $this->url()->fromRoute('jobs/edit/languages', [ 'id' => $job->uuid ]),
                                'route_degrees' => $this->url()->fromRoute('jobs/edit/degrees', [ 'id' => $job->uuid ]),
                                'route_skills' => $this->url()->fromRoute('jobs/edit/skills', [ 'id' => $job->uuid ]),
                                'route_last_date_of_application' => $this->url()->fromRoute('jobs/edit/last-date-of-application', [ 'id' => $job->uuid ]),
                                
                            ]
                        ];
                    } else {
                        $response = [
                            'success'   => false,
                            'data' => 'ERROR_THERE_WAS_AN_ERROR'
                        ];
                    }
                    
                } else {
                    $response = [
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ];
                }
                
                
                
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach($form_messages  as $fieldname => $field_messages)
                {
                    
                    $messages[$fieldname] = array_values($field_messages);
                }
                
                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
            
        } else {
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            

        }
        
        return new JsonModel($response);
    }
    
    /**
     * 
     * 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();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        if(!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        if(!$job) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if($job->company_id != $currentCompany->id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($data);
        }
        

        
        if($request->isPost()) {
            $companyMapper = CompanyMapper::getInstance($this->adapter);
            $company = $companyMapper->fetchOne($currentCompany->id);
            
            $result = $jobMapper->delete($job);
            if($result) {
                $this->logger->info('Se borro el empleo : ' . $job->title . ' de la empresa : ' .  $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $data = [
                    'success' => true,
                    'data' => 'LABEL_RECORD_DELETED'
                ];
            } else {
                
                $data = [
                    'success'   => false,
                    'data'      => $job->getError()
                ];
                
                return new JsonModel($data);
            }
            
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
            
            return new JsonModel($data);
        }
        
        return new JsonModel($data);
    }
    
    /**
     * 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 editAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        if(!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        if(!$job) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if($job->company_id != $currentCompany->id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($data);
        }
        

        if($request->isGet()) {
            $months = [
                1 => 'LABEL_MONTH_JANUARY',
                2 => 'LABEL_MONTH_FEBRUARY',
                3 => 'LABEL_MONTH_MARCH',
                4 => 'LABEL_MONTH_APRIL',
                5 => 'LABEL_MONTH_MAY',
                6 => 'LABEL_MONTH_JUNE',
                7 => 'LABEL_MONTH_JULY',
                8 => 'LABEL_MONTH_AUGUST',
                9 => 'LABEL_MONTH_SEPTEMBER',
                10 => 'LABEL_MONTH_OCTOBER',
                11 => 'LABEL_MONTH_NOVEMBER',
                12 => 'LABEL_MONTH_DECEMBER',
            ];
            
            $dt = \DateTime::createFromFormat('Y-m-d', $job->last_date_of_application);
            $last_date_of_application = $dt->format('d') . ' de ' . $months[$dt->format('n')] . ' de ' . $dt->format('Y');
            
            
            
            $locationMapper = LocationMapper::getInstance($this->adapter);
            $location = $locationMapper->fetchOne($job->location_id);
            
            $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
            $jobCategory = $jobCategoryMapper->fetchOne($job->job_category_id);
            
            switch($job->employment_type)
            {
                case Job::EMPLOYMENT_TYPE_FULL_TIME :
                    $employment_type = 'LABEL_EMPLOYMENT_TYPE_FULL_TIME';
                    break;
                case Job::EMPLOYMENT_TYPE_PART_TIME :
                    $employment_type = 'LABEL_EMPLOYMENT_TYPE_PART_TIME';
                    break;
                    
                case Job::EMPLOYMENT_TYPE_CONTRACT :
                    $employment_type = 'LABEL_EMPLOYMENT_TYPE_CONTRACT';
                    break;
                    
                case Job::EMPLOYMENT_TYPE_TEMPORARY :
                    $employment_type = 'LABEL_EMPLOYMENT_TYPE_TEMPORARY';
                    break;
                    
                default :
                    $employment_type = '';
                    break;
            }

            switch($job->status)
            {
                case Job::STATUS_ACTIVE : 
                    $status = 'LABEL_ACTIVE';
                    break;
                    
                case Job::STATUS_INACTIVE : 
                    $status = 'LABEL_INACTIVE';
                    break;
                    
                default :
                    $status = '';
                    break;
            }
            
           
            $degreeMapper = DegreeMapper::getInstance($this->adapter);
            
            $jobDegreeMapper = JobDegreeMapper::getInstance($this->adapter);
            $records = $jobDegreeMapper->fetchAllByJobId($job->id);
            
            $job_degrees = [];
            foreach($records as $record) 
            {
                $degree = $degreeMapper->fetchOne($record->degree_id);
                array_push($job_degrees, $degree->name);
            }
                

            $languageMapper = LanguageMapper::getInstance($this->adapter);
            $jobLanguageMapper = JobLanguageMapper::getInstance($this->adapter);
            $records = $jobLanguageMapper->fetchAllByJobId($job->id);
            
            $job_languages = [];
            foreach($records as $record) 
            {
                $language = $languageMapper->fetchOne($record->language_id);
                array_push($job_languages, $language->name);
            }
            
            $skillMapper = SkillMapper::getInstance($this->adapter);
            
            $jobSkillMapper = JobSkillMapper::getInstance($this->adapter);
            $records = $jobSkillMapper->fetchAllByJobId($job->id);
            
            $job_skills = [];
            foreach($records as $record) 
            {
                $skill = $skillMapper->fetchOne($record->skill_id);
                array_push($job_skills, $skill->name);
            }
            


            return new JsonModel([
                'success' => true, 
                'data' => [
                    'title'                     => $job->title,
                    'status'                    => $status,
                    'description'               => $job->description,
                    'location'                  => $location->formatted_address,
                    'employment_type'           => $employment_type,
                    'last_date_of_application'  => $last_date_of_application,
                    'job_category'              => $jobCategory->name,
                    'experience'                => $job->experience_visible ? $job->experience_min . '-' . $job->experience_max : '',
                    'salary'                    => $job->salary_visible ==  Job::SALARY_VISIBLE_YES ? $job->salary_min . '-' . $job->salary_max . ' ' . $job->salary_currency : '',
                    'degrees'                   => $job_degrees,
                    'languages'                 => $job_languages,
                    'skills'                    => $job_skills,
                    
                    'route_status'              => $this->url()->fromRoute('jobs/edit/status', [ 'id' => $job->uuid ]),
                    'route_title'               => $this->url()->fromRoute('jobs/edit/title', [ 'id' => $job->uuid ]),
                    'route_extended'            => $this->url()->fromRoute('jobs/edit/extended', [ 'id' => $job->uuid ]),
                    'route_location'            => $this->url()->fromRoute('jobs/edit/location', [ 'id' => $job->uuid ]),
                    'route_job_category'        => $this->url()->fromRoute('jobs/edit/job-category', [ 'id' => $job->uuid ]),
                    'route_employment_type'     => $this->url()->fromRoute('jobs/edit/employment-type', [ 'id' => $job->uuid ]),
                    'route_salary'              => $this->url()->fromRoute('jobs/edit/salary', [ 'id' => $job->uuid ]),
                    'route_experience'          => $this->url()->fromRoute('jobs/edit/experience', [ 'id' => $job->uuid ]),
                    'route_languages'           => $this->url()->fromRoute('jobs/edit/languages', [ 'id' => $job->uuid ]),
                    'route_degrees'             => $this->url()->fromRoute('jobs/edit/degrees', [ 'id' => $job->uuid ]),
                    'route_skills'              => $this->url()->fromRoute('jobs/edit/skills', [ 'id' => $job->uuid ]),
                    'route_last_date_of_application'    => $this->url()->fromRoute('jobs/edit/last-date-of-application', [ 'id' => $job->uuid ]),
                ]
            ]);
            
        } 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();
        $id = $this->params()->fromRoute('id');

        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }


        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'description' => $job->description,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyJobExtendedForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                $jobMapper->updateExtended($job);
            
                $this->logger->info('Se actualizo las descripción del empleo ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'description' => $job->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);
    }
    
    
    public function locationAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        $request = $this->getRequest();
        if($request->isPost()) {
            $form = new CompanyJobLocationForm();
            $dataPost = $request->getPost()->toArray();
                
            $form->setData($dataPost);
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $locationMapper = LocationMapper::getInstance($this->adapter);
                $location = $locationMapper->fetchOne($job->location_id);
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $location);
   
                if($locationMapper->update($location)) {
                     $this->logger->info('Se actualizo una ubicación del empleo: '. $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                        
                     $response = [
                         'success' => true,
                         'data' =>  $location->formatted_address
                     ];
                } else {
                    $response = [
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ];
                }
            } else {
                $response = [
                    'success'   => false,
                    'data'   =>   'ERROR_PLACED_AUTOCOMPLETE_DOES_NOT_CONTAIN_GEOMETRY'
                ];
            }
            
            return new JsonModel($response);
            
        }
        
        $response = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($response);
    }
    
    public function employmentTypeAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $job->employment_type
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobEmploymentTypeForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                if($jobMapper->updateEmploymentType($job)) {
                    $this->logger->info('Se actualizo tipo de empleo: '. $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                    
                    switch($job->employment_type)
                    {
                        case Job::EMPLOYMENT_TYPE_FULL_TIME :
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_FULL_TIME';
                            break;
                        case Job::EMPLOYMENT_TYPE_PART_TIME :
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_PART_TIME';
                            break;
                            
                        case Job::EMPLOYMENT_TYPE_CONTRACT :
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_CONTRACT';
                            break;
                            
                        case Job::EMPLOYMENT_TYPE_TEMPORARY :
                            $employment_type = 'LABEL_EMPLOYMENT_TYPE_TEMPORARY';
                            break;
                            
                        default :
                            $employment_type = '';
                            break;
                    }

                    
                    
                    return new JsonModel([
                        'success'   => true,
                        'data' => $employment_type
                    ]);
                }  else {
                    return new JsonModel([
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
                
                
            } 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);
    }
    
    public function jobCategoryAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
        $jobCategory = $jobCategoryMapper->fetchOne( $job->job_category_id );
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $jobCategory->uuid,
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobCategoryForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $this->logger->info('Se actualizaron la categoría de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $dataPost = (array) $form->getData();
                   
                $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
                $jobCategory = $jobCategoryMapper->fetchOneByUuid( $dataPost['job_category_id'] );

                $job->job_category_id = $jobCategory->id;
                
                if($jobMapper->updateJobCategory($job)) {
                    
                      
                    return new JsonModel([
                        'success'   => true,
                        'data' => $jobCategory->name
                    ]);
                }  else {
                    return new JsonModel([
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }

                
            } 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);
    }
    

    public function salaryAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'salary_visible' => $job->salary_visible,
                    'salary_currency' => $job->salary_currency,
                    'salary_min' => $job->salary_min,
                    'salary_max' =>  $job->salary_max
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyJobSalaryForm($this->adapter);
            $dataPost = $request->getPost()->toArray();

            $dataPost['salary_visible'] = empty( $dataPost['salary_visible']) ? Job::SALARY_VISIBLE_NO :  $dataPost['salary_visible'];
            $dataPost['salary_currency'] = empty( $dataPost['salary_currency']) ? 'USD' :  $dataPost['salary_currency'];
            
    
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                $jobMapper->updateSalary($job);
                
                $this->logger->info('Se actualizo el salario del empleo ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' =>  $job->salary_visible == Job::SALARY_VISIBLE_YES ?  $job->salary_min . '-' . $job->salary_max . ' ' . $job->salary_currency: ''
                ]);
                
            } 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);
    }
    
    public function experienceAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' =>  [
                    'experience_visible' => $job->experience_visible,
                    'experience_min' => $job->experience_min,
                    'experience_max' => $job->experience_max
                ] 
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyJobExperienceForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                $jobMapper->updateExperience($job);
                
                $this->logger->info('Se actualizo el experiencia del empleo ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => $job->experience_visible ? $job->experience_min . '-' . $job->experience_max . ' LABEL_YEARS' : ''
                ]);
                
            } 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);
    }
    
    public function skillAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            
            $skillMapper = SkillMapper::getInstance($this->adapter);
            
            $jobSkillMapper = JobSkillMapper::getInstance($this->adapter);
            $skills  = $jobSkillMapper->fetchAllByJobId($job->id);
            
            $items = [];
            foreach($skills as $skill)
            {
                $skill = $skillMapper->fetchOne( $skill->skill_id );
                
                
                array_push($items, $skill->uuid );
            }
            
            $data = [
                'success' => true,
                'data' => $items
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobSkillForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $this->logger->info('Se actualizaron las habilidades requeridas del empleo : ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $skillMapper = SkillMapper::getInstance($this->adapter);
                
                $jobSkillMapper = JobSkillMapper::getInstance($this->adapter);
                $jobSkillMapper->deleteByJobId($job->id);
                
                $dataPost = (array) $form->getData();
                $skills = $dataPost['skills'];
                foreach($skills as $skill_id)
                {
                    $skill = $skillMapper->fetchOneByUuid( $skill_id );
                    
                    $jobSkill = new JobSkill();
                    $jobSkill->job_id = $job->id;
                    $jobSkill->skill_id = $skill->id;
                    
                    $jobSkillMapper->insert($jobSkill);
                }
                
                $items = [];
                $records = $jobSkillMapper->fetchAllByJobId( $job->id );
                foreach($records as $record)
                {
                    $skill = $skillMapper->fetchOne($record->skill_id);
                    
                    array_push($items,  ['value' => $skill->uuid, 'label' => $skill->name ]);
                }
                
                return new JsonModel([
                    'success'   => true,
                    'data'   => $items
                ]);
                
            } 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
                ]);
            }
            
            $jobSkillMapper = JobSkillMapper::getInstance($this->adapter);
            
        }
        
        
        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];
        
        
        return new JsonModel($data);
    }
    

    public function languageAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $this->logger->info('Se actualizaron los idiomas requeridos del empleo : ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
            
            $jobLanguageMapper = JobLanguageMapper::getInstance($this->adapter);
            $languages  = $jobLanguageMapper->fetchAllByJobId($job->id);
            
            $items = [];
            foreach($languages as $language)
            {
                array_push($items, $language->language_id);
            }
            
            $data = [
                'success' => true,
                'data' => $items
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobLanguageForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $languageMapper = LanguageMapper::getInstance($this->adapter);
                
                $jobLanguageMapper = JobLanguageMapper::getInstance($this->adapter);
                $jobLanguageMapper->deleteByJobId($job->id);
                
                $dataPost = (array) $form->getData();
                $languages = $dataPost['languages'];
                foreach($languages as $language_id)
                {
                    $language = $languageMapper->fetchOne($language_id);
                    
                    $jobLanguage = new JobLanguage();
                    $jobLanguage->job_id = $job->id;
                    $jobLanguage->language_id = $language->id;
                    
                    $jobLanguageMapper->insert($jobLanguage);
                }
                
                $items = [];
                $records = $jobLanguageMapper->fetchAllByJobId($job->id);
                foreach($records as $record)
                {
                    $language = $languageMapper->fetchOne($record->language_id);
                    
                    array_push($items,  ['value' => $language->id, 'label' => $language->name]);
                }
                
                return new JsonModel([
                    'success'   => true,
                    'data'   => $items
                ]);
                
            } 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);
    }
    
    public function degreeAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $this->logger->info('Se actualizaron los idiomas requeridos del empleo : ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
            
            $degreeMapper = DegreeMapper::getInstance($this->adapter);
            $jobDegreeMapper = JobDegreeMapper::getInstance($this->adapter);
            $records  = $jobDegreeMapper->fetchAllByJobId($job->id);
            
            $items = [];
            foreach($records as $record)
            {
                $degree = $degreeMapper->fetchOne($record->degree_id);
                
                array_push($items, $degree->uuid);
                
            }
            
            $data = [
                'success' => true,
                'data' => $items
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobDegreeForm($this->adapter);
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $degreeMapper = DegreeMapper::getInstance($this->adapter);
                
                $jobDegreeMapper = JobDegreeMapper::getInstance($this->adapter);
                $jobDegreeMapper->deleteByJobId($job->id);
                
                $dataPost = (array) $form->getData();
                $degrees = $dataPost['degrees'];
                foreach($degrees as $degree_id)
                {
                    $degree = $degreeMapper->fetchOneByUuid($degree_id);
                    
                    $jobDegree = new JobDegree();
                    $jobDegree->job_id = $job->id;
                    $jobDegree->degree_id = $degree->id;
                    $jobDegreeMapper->insert($jobDegree);
                }
                
                $items = [];
                $records = $jobDegreeMapper->fetchAllByJobId($job->id);
                foreach($records as $record)
                {
                    $degree = $degreeMapper->fetchOne($record->degree_id);
                    array_push($items,  ['value' => $degree->uuid, 'label' => $degree->name]);
                }
                
                return new JsonModel([
                    'success'   => true,
                    'data'   => $items
                ]);
                
            } 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);
    }
    
    public function lastDateOfApplicationAction()
    {
        
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $dt = \DateTime::createFromFormat('Y-m-d', $job->last_date_of_application);
            
            $data = [
                'success' => true,
                'data' => $dt->format('d/m/Y'),
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            $form = new CompanyJobLastDateOfApplicationForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $this->logger->info('Se actualizo la última fecha de aplicación de la empresa: '. $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                $dt = \DateTime::createFromFormat('d/m/Y', $form->get('last_date_of_application')->getValue());
                $job->last_date_of_application = $dt->format('Y-m-d');
                
                if($jobMapper->updateLastDateOfApplication($job)) {
                    $months = [
                        1 => 'LABEL_MONTH_JANUARY',
                        2 => 'LABEL_MONTH_FEBRUARY',
                        3 => 'LABEL_MONTH_MARCH',
                        4 => 'LABEL_MONTH_APRIL',
                        5 => 'LABEL_MONTH_MAY',
                        6 => 'LABEL_MONTH_JUNE',
                        7 => 'LABEL_MONTH_JULY',
                        8 => 'LABEL_MONTH_AUGUST',
                        9 => 'LABEL_MONTH_SEPTEMBER',
                        10 => 'LABEL_MONTH_OCTOBER',
                        11 => 'LABEL_MONTH_NOVEMBER',
                        12 => 'LABEL_MONTH_DECEMBER',
                    ];
                    
                   $last_date_of_application = $dt->format('d') . ' de ' . $months[$dt->format('n')] . ' de ' . $dt->format('Y');
                    
                    
                    return new JsonModel([
                        'success'   => true,
                        'data' => $last_date_of_application
                    ]);
                }  else {
                    return new JsonModel([
                        'success'   => false,
                        'data' => 'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
                
                
            } 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);
    }
    
    public function usersWhoAppliedAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        if(!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($data);
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        if(!$job) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($data);
        }
        
        if($job->company_id != $currentCompany->id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($data);
        }

        
        $request = $this->getRequest();
        if($request->isGet()) {
            
            $sandbox = $this->config['leaderslinked.runmode.sandbox'];
            if($sandbox) {
                $user_profile_url = $this->config['leaderslinked.frontend.sandbox_user_profile'];
            } else {
                $user_profile_url = $this->config['leaderslinked.frontend.production_user_profile'];
            }
            

            $queryMapper = QueryMapper::getInstance($this->adapter);
            $select = $queryMapper->getSql()->select();
            $select->columns(['id',  'user_uuid' => 'uuid', 'first_name','last_name', 'email']);
            $select->from(['u' => UserMapper::_TABLE]);
            $select->join(['ja' => JobApplicationMapper::_TABLE], 'ja.user_id = u.id', ['user_profile_id']);
            $select->join(['up' => UserProfileMapper::_TABLE], 'ja.user_profile_id = up.id', ['user_profile_uuid' => 'uuid']);
            $select->where->equalTo('u.status', User::STATUS_ACTIVE);
            $select->order(['first_name', 'last_name']);                    
                
            $items = [];
            $records = $queryMapper->fetchAll($select); 
                    
            foreach($records as $record)
            {
                $item = [
                    'first_name' => $record['first_name'],
                    'last_name' => $record['last_name'],
                    'email' => $record['email'],
                    'link_view' => str_replace('[uuid]', $record['user_profile_uuid'], $user_profile_url),

                ];
                     
                array_push($items, $item);
            }

                    
            $response = [
                'success' => true,
                'data' => $items
            ];

            return new JsonModel($response);
   
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    public function statusAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'status' => $job->status,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyJobStatusForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                $jobMapper->updateStatus($job);
                
                $this->logger->info('Se actualizo el estatus del empleo ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                switch($job->status) {
                    case  Job::STATUS_ACTIVE :
                        $status = 'LABEL_ACTIVE';
                        break;
                        
                    case  Job::STATUS_INACTIVE :
                        $status = 'LABEL_INACTIVE';
                        break;
                        
                        
                    case  Job::STATUS_DELETED :
                        $status = 'LABEL_DELETED';
                        break;
                        
                    default :
                        $status = '';
                        break;
                }
                
                
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'status' => $status,
                    ]
                ]);
                
            } 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);
    }
    
    
    public function titleAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        
        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');
        
        
        if(!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];
            
            return new JsonModel($response);
            
        }
        
        $jobMapper = JobMapper::getInstance($this->adapter);
        $job = $jobMapper->fetchOneByUuid($id);
        
        if(!$job) {
            $response = [
                'success' => false,
                'data' => 'ERROR_JOB_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        if($job->company_id != $currentCompany->id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];
            
            return new JsonModel($response);
        }
        
        
        $companyMapper = CompanyMapper::getInstance($this->adapter);
        $company = $companyMapper->fetchOne($currentCompany->id);
        if(!$company) {
            $response = [
                'success' => false,
                'data' => 'ERROR_COMPANY_NOT_FOUND'
            ];
            
            return new JsonModel($response);
        }
        
        
        
        
        $request = $this->getRequest();
        if($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'title' => $job->title,
                ]
            ];
            
            return new JsonModel($data);
            
            
        } else if($request->isPost()) {
            
            
            $form = new CompanyJobTitleForm();
            $dataPost = $request->getPost()->toArray();
            
            $form->setData($dataPost);
            
            if($form->isValid()) {
                $dataPost = (array) $form->getData();
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $job);
                
                $jobMapper->updateTitle($job);
                
                $this->logger->info('Se actualizo el título del empleo ' . $job->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
                
                return new JsonModel([
                    'success'   => true,
                    'data' => [
                        'title' => $job->title,
                    ]
                ]);
                
            } 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);
    }
    
    
    
    
    
 
}