Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14875 | Rev 15351 | 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) ? '' : filter_var($search, 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', 'title'];
                $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();

                $jobCategories = [];
                $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
                $records = $jobCategoryMapper->fetchAllActive();

                foreach ($records as $record) {
                    $jobCategories[$record->uuid] = $record->name;
                }


                $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,
                    'job_categories'            => $jobCategories,
                    '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('m/d/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' => strip_tags($job->description, 'p'),
                ]
            ];

            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' => strip_tags($job->description, 'p'),
                    ]
                ]);
            } 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);
        }

        $employment_types = [];
        $employment_types[Job::EMPLOYMENT_TYPE_FULL_TIME] = 'LABEL_EMPLOYMENT_TYPE_FULL_TIME';
        $employment_types[Job::EMPLOYMENT_TYPE_PART_TIME] = 'LABEL_EMPLOYMENT_TYPE_PART_TIME';
        $employment_types[Job::EMPLOYMENT_TYPE_CONTRACT] = 'LABEL_EMPLOYMENT_TYPE_CONTRACT';
        $employment_types[Job::EMPLOYMENT_TYPE_TEMPORARY] = 'LABEL_EMPLOYMENT_TYPE_TEMPORARY';


        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'employment_type' => $job->employment_type,
                    'employment_types' => $employment_types
                ]
            ];

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

        $jobCategories = [];
        $jobCategoryMapper = JobCategoryMapper::getInstance($this->adapter);
        $records = $jobCategoryMapper->fetchAllActive();

        foreach ($records as $record) {
            $jobCategories[$record->uuid] = $record->name;
        }


        $jobCategory = $jobCategoryMapper->fetchOne($job->job_category_id);


        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => [
                    'job_category' => $jobCategory->uuid,
                    'job_categories' => $jobCategories
                ],
            ];

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

        
        $currencies = [];
        $currencyMapper = CurrencyMapper::getInstance($this->adapter);
        $records =  $currencyMapper->fetchAllActive();
        foreach($records as $record)
        {
            $currencies[$record->currency] = $record->name;
        }
        
        
        
        

        $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, 
                    'currencies' => $currencies,
                ]
            ];

            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()) {

            $skills = [];
            $skillMapper = SkillMapper::getInstance($this->adapter);
            $records = $skillMapper->fetchAllActive();

            foreach ($records as $record) {
                $skills[$record->uuid] = $record->name;
            }

            $jobSkillMapper = JobSkillMapper::getInstance($this->adapter);
            $skillsByjob  = $jobSkillMapper->fetchAllByJobId($job->id);

            $items = [];
            foreach ($skillsByjob as $skill) {
                $skill = $skillMapper->fetchOne($skill->skill_id);


                array_push($items, $skill->uuid);
            }

            $data = [
                'success' => true,
                'data' => [
                    'skills_selected' => $items,
                    'skills_available' => $skills
                ]
            ];

            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()]);

            $languages = [];
            $languageMapper = LanguageMapper::getInstance($this->adapter);
            $records = $languageMapper->fetchAllActive();

            foreach ($records as $record) {
                $languages[$record->id] = $record->name;
            }

            $jobLanguageMapper = JobLanguageMapper::getInstance($this->adapter);
            $languagesSelected  = $jobLanguageMapper->fetchAllByJobId($job->id);

            $items = [];
            foreach ($languagesSelected as $language) {
                array_push($items, $language->language_id);
            }

            $data = [
                'success' => true,
                'data' => [
                    'languages_selected' => $items,
                    'languages_available' => $languages
                ]
            ];

            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()]);


            $degrees_available = [];
            $degreeMapper = DegreeMapper::getInstance($this->adapter);

            $records = $degreeMapper->fetchAllActive();
            foreach ($records as $record) {
                $degrees_available[$record->uuid] = $record->name;
            }

            $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' => [
                    'degrees_selected' => $items,
                    'degrees_available' => $degrees_available
                ]
            ];

            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('m/d/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('m/d/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->where->equalTo('ja.job_id', $job->id);
            $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);
    }
}