Rev 16790 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
declare(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);
}
}