Rev 16790 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\View\Model\ViewModel;use Laminas\View\Model\JsonModel;use LeadersLinked\Model\Company;use LeadersLinked\Mapper\OrganizationPositionMapper;use LeadersLinked\Library\Functions;use LeadersLinked\Hydrator\ObjectPropertyHydrator;use LeadersLinked\Model\User;use Laminas\Http\Response;use LeadersLinked\Form\Organization\PositionForm;use LeadersLinked\Model\OrganizationPosition;use LeadersLinked\Mapper\JobDescriptionMapper;use LeadersLinked\Mapper\UserMapper;class OrganizationPositionController extends AbstractActionController{/**** @var \Laminas\Db\Adapter\AdapterInterface*/private $adapter;/**** @var \LeadersLinked\Cache\CacheInterface*/private $cache;/**** @var \Laminas\Log\LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @var \Laminas\Mvc\I18n\Translator*/private $translator;/**** @param \Laminas\Db\Adapter\AdapterInterface $adapter* @param \LeadersLinked\Cache\CacheInterface $cache* @param \Laminas\Log\LoggerInterface LoggerInterface $logger* @param array $config* @param \Laminas\Mvc\I18n\Translator $translator*/public function __construct($adapter, $cache, $logger, $config, $translator){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;$this->translator = $translator;}public function indexAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();$headers = $request->getHeaders();if ($request->isGet()) {$headers = $request->getHeaders();$isJson = false;if ($headers->has('Accept')) {$accept = $headers->get('Accept');$prioritized = $accept->getPrioritized();foreach ($prioritized as $key => $value) {$raw = trim($value->getRaw());if (!$isJson) {$isJson = strpos($raw, 'json');}}}if ($isJson) {$items = [];$bossId = 0;$organizationPositionMapper = OrganizationPositionMapper::getInstance($this->adapter);$userMapper = UserMapper::getInstance($this->adapter);$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$items = $this->recursiveLoad($currentUser, $currentCompany, $organizationPositionMapper, $userMapper, $jobDescriptionMapper, $bossId);return new JsonModel(['success' => true,'data' => ['items' => $items,]]);} else {$form = new PositionForm($this->adapter, $currentCompany->id);$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/organization/positions');$viewModel->setVariables(['form' => $form,'company_name' => $currentCompany->name,]);return $viewModel;}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}/**** @param User $currentUser* @param Company $currentCompany* @param OrganizationPositionMapper $organizationPositionMapper* @param UserMapper $userMapper* @param JobDescriptionMapper $jobDescriptionMapper* @param int $bossId* @return array*/private function recursiveLoad($currentUser, $currentCompany, $organizationPositionMapper, $userMapper, $jobDescriptionMapper, $bossId){$acl = $this->getEvent()->getViewModel()->getVariable('acl');$allowEdit = $acl->isAllowed($currentUser->usertype_id, 'organization/positions/edit') ? 1 : 0;$allowDelete = $acl->isAllowed($currentUser->usertype_id, 'organization/positions/delete') ? 1 : 0;$items = [];$records = $organizationPositionMapper->fetchAllByCompanyIdAndBossId($currentCompany->id, $bossId);foreach($records as $record){$user = $userMapper->fetchOne($record->employee_id);$jobDescription = $jobDescriptionMapper->fetchOne($record->job_description_id);array_push($items, ['uuid' => $record->uuid,'name' => trim($user->first_name . ' ' . $user->last_name),'title' => $jobDescription->name,'children' => $this->recursiveLoad($currentUser, $currentCompany, $organizationPositionMapper, $userMapper, $jobDescriptionMapper, $record->employee_id),'status' => $record->status,'link_edit' => $allowEdit ? $this->url()->fromRoute('organization/positions/edit', ['id' => $record->uuid]) : '','link_delete' => $allowDelete ? $this->url()->fromRoute('organization/positions/delete', ['id' => $record->uuid]) : '',]);}return $items;}public function addAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();if ($request->isPost()){$form = new PositionForm($this->adapter, $currentCompany->id);$dataPost = $request->getPost()->toArray();$form->setData($dataPost);if ($form->isValid()) {$userMapper = UserMapper::getInstance($this->adapter);$organizationPositionMapper = OrganizationPositionMapper::getInstance($this->adapter);$dataPost = (array) $form->getData();$boss = null;if(!empty($dataPost['boss_id'])) {$boss = $userMapper->fetchOneByUuid( $dataPost['boss_id'] );}$employee = $userMapper->fetchOneByUuid( $dataPost['employee_id'] );$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOneByUuid( $dataPost['job_description_id'] );$organizationPosition = new OrganizationPosition();$organizationPosition->company_id = $currentCompany->id;$organizationPosition->job_description_id = $jobDescription->id;$organizationPosition->employee_id = $employee->id;$organizationPosition->boss_id = $boss ? $boss->id : null;if(empty($dataPost['status'])) {$organizationPosition->status = OrganizationPosition::STATUS_INACTIVE;} else {$organizationPosition->status = $dataPost['status'] == OrganizationPosition::STATUS_ACTIVE ? OrganizationPosition::STATUS_ACTIVE : OrganizationPosition::STATUS_INACTIVE;}$result = $organizationPositionMapper->insert($organizationPosition);if ($result) {$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOne($organizationPosition->job_description_id);$this->logger->info('Se agrego una posición para la descripción de cargo : ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_ADDED'];} else {$data = ['success' => false,'data' => $organizationPositionMapper->getError()];}return new JsonModel($data);} 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 {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function editAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if (!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$organizationPositionMapper = OrganizationPositionMapper::getInstance($this->adapter);$organizationPosition = $organizationPositionMapper->fetchOneByUuid($uuid);if (!$organizationPosition) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($currentCompany && $organizationPosition->company_id != $currentCompany->id) {$data = ['success' => false,'data' => 'ERROR_UNAUTHORIZED'];return new JsonModel($data);}if ($request->isPost()) {$form = new PositionForm($this->adapter, $currentCompany->id);$dataPost = $request->getPost()->toArray();$form->setData($dataPost);if ($form->isValid()) {$userMapper = UserMapper::getInstance($this->adapter);$boss = null;if(!empty($dataPost['boss_id'])) {$boss = $userMapper->fetchOneByUuid( $dataPost['boss_id'] );}$employee = $userMapper->fetchOneByUuid( $dataPost['employee_id'] );$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOneByUuid( $dataPost['job_description_id'] );$organizationPosition->job_description_id = $jobDescription->id;$organizationPosition->employee_id = $employee->id;$organizationPosition->boss_id = $boss ? $boss->id : null;if(empty($dataPost['status'])) {$organizationPosition->status = OrganizationPosition::STATUS_INACTIVE;} else {$organizationPosition->status = $dataPost['status'] == OrganizationPosition::STATUS_ACTIVE ? OrganizationPosition::STATUS_ACTIVE : OrganizationPosition::STATUS_INACTIVE;}$result = $organizationPositionMapper->update($organizationPosition);if ($result) {$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOne($organizationPosition->job_description_id);$this->logger->info('Se actualizo una posición para la descripción de cargo ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_UPDATED'];} else {$data = ['success' => false,'data' => $organizationPositionMapper->getError()];}return new JsonModel($data);} else {$messages = [];$form_messages = (array) $form->getMessages();foreach ($form_messages as $fieldname => $field_messages) {$messages[$fieldname] = array_values($field_messages);}return new JsonModel(['success' => false,'data' => $messages]);}} else if ($request->isGet()) {$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOne($organizationPosition->job_description_id);$userMapper = UserMapper::getInstance($this->adapter);$employee = $userMapper->fetchOne($organizationPosition->employee_id);$boss = '';if($organizationPosition->boss_id) {$boss = $userMapper->fetchOne($organizationPosition->boss_id);}$options = [];if($jobDescription->job_description_id_boss) {$records = $organizationPositionMapper->fetchAllByCompanyIdAndJobDescriptionId($jobDescription->company_id, $jobDescription->job_description_id_boss);foreach($records as $record){$user = $userMapper->fetchOne($record->employee_id);if($user) {$options[ $user->uuid ] = trim($user->first_name . ' ' . $user->last_name);}}}$data = ['job_description_id' => $jobDescription->uuid,'employee_id' => $employee->uuid,'boss_id' => $boss ? $boss->uuid : '','status' => $organizationPosition->status,'options' => $options,];$response = ['success' => true,'data' => $data];return new JsonModel($response);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function deleteAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if (!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$organizationPositionMapper = OrganizationPositionMapper::getInstance($this->adapter);$organizationPosition = $organizationPositionMapper->fetchOneByUuid($uuid);if (!$organizationPosition) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($currentCompany && $organizationPosition->company_id != $currentCompany->id) {$data = ['success' => false,'data' => 'ERROR_UNAUTHORIZED'];return new JsonModel($data);}if ($request->isPost()) {$organizationPositionMapper->removeParentByEmployeeId($organizationPosition->employee_id);$result = $organizationPositionMapper->delete($organizationPosition);if ($result) {$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOne($organizationPosition->job_description_id);$this->logger->info('Se borro un puesto de la descripción de ' . $jobDescription->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);$data = ['success' => true,'data' => 'LABEL_RECORD_DELETED'];} else {$data = ['success' => false,'data' => $organizationPositionMapper->getError()];return new JsonModel($data);}} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function bossAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();$uuid = $this->params()->fromQuery('job_description_id');if (!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$jobDescriptionMapper = JobDescriptionMapper::getInstance($this->adapter);$jobDescription = $jobDescriptionMapper->fetchOneByUuid($uuid);if (!$jobDescription) {$data = ['success' => false,'data' => 'ERROR_RECORD_NOT_FOUND'];return new JsonModel($data);}if ($currentCompany && $jobDescription->company_id != $currentCompany->id) {$data = ['success' => false,'data' => 'ERROR_UNAUTHORIZED'];return new JsonModel($data);}if ($request->isGet()) {$items = [];if($jobDescription->job_description_id_boss) {$userMapper = UserMapper::getInstance($this->adapter);$organizationPositionMapper = OrganizationPositionMapper::getInstance($this->adapter);$records = $organizationPositionMapper->fetchAllByCompanyIdAndJobDescriptionId($jobDescription->company_id, $jobDescription->job_description_id_boss);foreach($records as $record){$user = $userMapper->fetchOne($record->employee_id);if($user) {$items[ $user->uuid ] = trim( $user->first_name . ' ' . $user->last_name );}}}$data = ['success' => true,'data' => $items];return new JsonModel($data);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}}