Rev 15351 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(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\Mapper\CompanyMapper;use LeadersLinked\Model\Company;use LeadersLinked\Mapper\ServiceMapper;use LeadersLinked\Mapper\CompanyServiceMapper;use LeadersLinked\Mapper\RoleMapper;use LeadersLinked\Mapper\CompanyRoleMapper;use LeadersLinked\Mapper\CompanyUserMapper;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Model\CompanyService;use LeadersLinked\Mapper\CompanyUserRoleMapper;use LeadersLinked\Model\Role;use LeadersLinked\Model\CompanyRole;use LeadersLinked\Model\CompanyUserRole;use LeadersLinked\Model\CompanyUser;use Google\Service\Directory\UserMakeAdmin;class CompanyController 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;}public function indexAction(){$request = $this->getRequest();$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();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) {$acl = $this->getEvent()->getViewModel()->getVariable('acl');$allowServices = $acl->isAllowed($currentUser->usertype_id, 'companies/services');$allowRoles = $acl->isAllowed($currentUser->usertype_id, 'companies/roles');$allowEdit = $acl->isAllowed($currentUser->usertype_id, 'companies/edit');$serviceMapper = ServiceMapper::getInstance($this->adapter);$records = $serviceMapper->fetchAll();$services = [];foreach($records as $record){$services[ $record->id ] = $record->name;}$roleMapper = RoleMapper::getInstance($this->adapter);$records = $roleMapper->fetchAll();$roles = [];foreach($records as $record){$roles[ $record->id ] = $record->name;}$search = $this->params()->fromQuery('search', []);$search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);$page = intval($this->params()->fromQuery('start', 1), 10);$records_x_page = intval($this->params()->fromQuery('length', 10), 10);$order = $this->params()->fromQuery('order', []);$order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);$order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var( $order[0]['dir'], FILTER_SANITIZE_STRING));$fields = ['name'];$order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';if(!in_array($order_direction, ['ASC', 'DESC'])) {$order_direction = 'ASC';}$status = filter_var($this->params()->fromQuery('status'));if(!in_array($status, [Company::STATUS_ACTIVE,Company::STATUS_DELETED,Company::STATUS_INACTIVE,Company::STATUS_PENDING,Company::STATUS_REJECTED])) {$status = '';}$companyMapper = CompanyMapper::getInstance($this->adapter);$paginator = $companyMapper->fetchAllDataTable($search, $page, $status, $records_x_page, $order_field, $order_direction);$companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);$companyRoleMapper = CompanyRoleMapper::getInstance($this->adapter);$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$userMapper = UserMapper::getInstance($this->adapter);$sandbox = $this->config['leaderslinked.runmode.sandbox'];if($sandbox) {$company_profile_url = $this->config['leaderslinked.frontend.sandbox_company_profile'];} else {$company_profile_url = $this->config['leaderslinked.frontend.production_company_profile'];}$items = [];$records = $paginator->getCurrentItems();foreach($records as $record){$security = ['first_name' => '','last_name' => '','email' => '',];$companyUser = $companyUserMapper->fetchCreatorByCompanyId($record->id);if($companyUser) {$user = $userMapper->fetchOne($companyUser->user_id);if($user) {$security['first_name'] = $user->first_name;$security['last_name'] = $user->last_name;$security['email'] = $user->email;}}$companyServices = $companyServiceMapper->fetchAllByCompanyId($record->id);$companyRoles = $companyRoleMapper->fetchAllByCompanyId($record->id);$details['services'] = [] ;foreach($companyServices as $companyService){if($companyService->status == CompanyService::ACTIVE) {array_push($details['services'], $services[$companyService->service_id]);}}$details['roles'] = [] ;foreach($companyRoles as $companyRole){array_push($details['roles'], $roles[$companyRole->role_id]);}$details['internal'] = $record->internal == Company::INTERNAL_YES ? 'LABEL_YES' : 'LABEL_NO';$link_profile = '';switch($record->status){case Company::STATUS_PENDING :$details['status'] = 'LABEL_PENDING';break;case Company::STATUS_ACTIVE :$link_profile = str_replace('[uuid]', $record->uuid, $company_profile_url);$details['status'] = 'LABEL_ACTIVE';break;case Company::STATUS_INACTIVE :$details['status'] = 'LABEL_INACTIVE';break;case Company::STATUS_REJECTED :$details['status'] = 'LABEL_REJECTED';break;case Company::STATUS_DELETED :$details['status'] = 'LABEL_DELETED';break;default :$details['status'] = 'LABEL_UNKNOWN';break;}$item = ['id' => $record->id,'name' => $record->name,'link_profile' => $link_profile,'details' => $details,'security' => $security,'actions' => ['link_services' => $allowServices ? $this->url()->fromRoute('companies/services', ['id' => $record->uuid ]) : '','link_roles' => $allowRoles ? $this->url()->fromRoute('companies/roles', ['id' => $record->uuid ]) : '','link_edit' => $allowEdit ? $this->url()->fromRoute('companies/edit', ['id' => $record->uuid ]) : '',]];array_push($items, $item);}return new JsonModel(['success' => true,'data' => ['items' => $items,'total' => $paginator->getTotalItemCount(),]]);} else {$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/companies/index.phtml');return $viewModel ;}} else {return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}public function servicesAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if(!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuid($uuid);if(!$company) {$data = ['success' => false,'data' => 'ERROR_COMPANY_NOT_FOUND'];return new JsonModel($data);}if($request->isPost()) {$companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);$serviceMapper = ServiceMapper::getInstance($this->adapter);$services = $serviceMapper->fetchAll();foreach($services as $service){$status = filter_var( $this->params()->fromPost('status' . $service->id), FILTER_SANITIZE_STRING);$paid_from = filter_var( $this->params()->fromPost('paid_from' . $service->id), FILTER_SANITIZE_STRING);$paid_to = filter_var( $this->params()->fromPost('paid_to' . $service->id), FILTER_SANITIZE_STRING);$ok = true;switch ($status) {case CompanyService::ACTIVE :case CompanyService::CANCELLED :case CompanyService::SUSPENDED :$dt_paid_from = \DateTime::createFromFormat('d/m/Y', $paid_from);$dt_paid_to = \DateTime::createFromFormat('d/m/Y', $paid_to);if(!$dt_paid_from || !$dt_paid_to) {$ok = false;} else {if($dt_paid_from->getTimestamp() > $dt_paid_to->getTimestamp()) {$ok = false;} else {$dt_paid_from->setTime(0, 0, 0);$paid_from = $dt_paid_from->format('Y-m-d');$dt_paid_to->setTime(23, 59, 59);$paid_to = $dt_paid_to->format('Y-m-d');}}break;case CompanyService::INACTIVE :$paid_from = null;$paid_to = null;break;default :$ok = false;break;}if(!$ok) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, $service->id);if($companyService) {$companyService->status = $status;$companyService->paid_from = $paid_from;$companyService->paid_to = $paid_to;if(!$companyServiceMapper->update($companyService)) {return new JsonModel(['success' => false,'data' => $companyServiceMapper->getError()]);}} else {$companyService = new CompanyService();$companyService->service_id = $service->id;$companyService->company_id = $company->id;$companyService->status = $status;$companyService->paid_from = $paid_from;$companyService->paid_to = $paid_to;if(!$companyServiceMapper->insert($companyService)) {return new JsonModel(['success' => false,'data' => $companyServiceMapper->getError()]);}}}$this->logger->info('Se actualizo los servicios de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);return new JsonModel(['success' => true,'data' => 'LABEL_RECORD_UPDATED']);} else if ($request->isGet()) {$serviceMapper = ServiceMapper::getInstance($this->adapter);$records = $serviceMapper->fetchAll();$services = [];foreach($records as $record){$services[ $record->id ] = ['id' => $record->id,'name' => $record->name,'status' => '','paid_from' => '','paid_to' => '',];}$companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);$records = $companyServiceMapper->fetchAllByCompanyId($company->id);foreach($records as $record){$paid_from = '';if($record->paid_from) {$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->paid_from);if($dt) {$paid_from = $dt->format('d/m/Y');}}$paid_to = '';if($record->paid_to) {$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->paid_to);if($dt) {$paid_to = $dt->format('d/m/Y');}}$services[ $record->service_id ] ['status'] = $record->status;$services[ $record->service_id ] ['paid_from'] = $paid_from;$services[ $record->service_id ] ['paid_to'] = $paid_to;}$data = ['success' => true,'data' => $services,];return new JsonModel($data);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}public function rolesAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentUser = $currentUserPlugin->getUser();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if(!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuid($uuid);if(!$company) {$data = ['success' => false,'data' => 'ERROR_COMPANY_NOT_FOUND'];return new JsonModel($data);}if($request->isPost()) {$companyRoleMapper = CompanyRoleMapper::getInstance($this->adapter);$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUserRoleMapper = CompanyUserRoleMapper::getInstance($this->adapter);$roleMapper = RoleMapper::getInstance($this->adapter);$roles = $roleMapper->fetchAll();foreach($roles as $role){$companyRole = $companyRoleMapper->fetchOneByCompanyIdAndRoleId($company->id, $role->id);$checked = filter_var( $this->params()->fromPost('checked' . $role->id), FILTER_SANITIZE_NUMBER_INT);if($checked) {if(!$companyRole) {$companyRole = new CompanyRole();$companyRole->company_id = $company->id;$companyRole->role_id = $role->id;if(!$companyRoleMapper->insert($companyRole)) {return new JsonModel(['success' => false,'data' => $companyRoleMapper->getError()]);}}} else {if($companyRole) {$companyUserRoleMapper->deleteByCompanyIdAndRoleId($company->id, $role->id);$companyRoleMapper->deleteByCompanyIdAndRoleId($company->id, $role->id);}}}$this->logger->info('Se actualizo los roles de la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);return new JsonModel(['success' => true,'data' => 'LABEL_RECORD_UPDATED']);} else if ($request->isGet()) {$companyServiceMapper = CompanyServiceMapper::getInstance($this->adapter);$roleMapper = RoleMapper::getInstance($this->adapter);$records = $roleMapper->fetchAll();$roles = [];foreach($records as $record){if($record->service_id) {$companyService = $companyServiceMapper->fetchOneByCompanyIdAndServiceId($company->id, $record->service_id);if(!$companyService || $companyService->status == CompanyService::INACTIVE) {continue;}}$roles[ $record->id ] = ['id' => $record->id,'name' => $record->name,'fixed' => $record->creator == Role::CREATOR_YES ? true : false,'checked' => $record->creator == Role::CREATOR_YES ? true : false,];}$companyRoleMapper = CompanyRoleMapper::getInstance($this->adapter);$records = $companyRoleMapper->fetchAllByCompanyId($company->id);foreach($records as $record){$roles[ $record->role_id ]['checked'] = true;}$data = ['success' => true,'data' => $roles,];return new JsonModel($data);} 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();$request = $this->getRequest();$uuid = $this->params()->fromRoute('id');if(!$uuid) {$data = ['success' => false,'data' => 'ERROR_INVALID_PARAMETER'];return new JsonModel($data);}$companyMapper = CompanyMapper::getInstance($this->adapter);$company = $companyMapper->fetchOneByUuid($uuid);if(!$company) {$data = ['success' => false,'data' => 'ERROR_COMPANY_NOT_FOUND'];return new JsonModel($data);}if($request->isPost()) {$status = filter_var( $this->params()->fromPost('status', FILTER_SANITIZE_STRING));$user_uuid = filter_var( $this->params()->fromPost('user_uuid', FILTER_SANITIZE_STRING));if(!in_array($status, [Company::STATUS_ACTIVE,Company::STATUS_INACTIVE,Company::STATUS_DELETED,Company::STATUS_PENDING,Company::STATUS_REJECTED,])) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOneByUuid($user_uuid);if(!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_USER_NOT_FOUND']);}$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);if(!$companyUser) {return new JsonModel(['success' => false,'data' => 'ERROR_COMPANY_USER_NOT_FOUND']);}if($companyUser->status != CompanyUser::STATUS_ACCEPTED && $companyUser->status != CompanyUser::STATUS_ADMIN_WILL_ADD) {return new JsonModel(['success' => false,'data' => 'ERROR_COMPANY_USER_IS_NOT_ACTIVE']);}$creator = $companyUserMapper->fetchCreatorByCompanyId($company->id);if($creator->user_id != $user->id) {$creator->creator = CompanyUser::CREATOR_NO;$creator->backend = CompanyUser::BACKEND_NO;$companyUserMapper->update($creator);$companyUser->creator = CompanyUser::CREATOR_YES;$companyUser->backend = CompanyUser::BACKEND_YES;$companyUserMapper->update($companyUser);}$company->status = $status;if($companyMapper->update($company)) {$this->logger->info('Se edito la empresa ' . $company->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);return new JsonModel(['success' => true,'data' => 'LABEL_RECORD_UPDATED']);} else {return new JsonModel(['success' => false,'data' => $companyMapper->getError(),]);}} else if ($request->isGet()) {$userMapper = UserMapper::getInstance($this->adapter);$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);$records = $companyUserMapper->fetchAllByCompanyId($company->id);$users = [] ;foreach($records as $record){if($record->owner == CompanyUser::OWNER_YES) {continue;}if($record->status != CompanyUser::STATUS_ACCEPTED && $record->status != CompanyUser::STATUS_ADMIN_WILL_ADD) {continue;}$user = $userMapper->fetchOne($record->user_id);array_push($users, ['uuid' => $user->uuid,'name' => trim($user->first_name . ' ' . $user->last_name) . ' (' . $user->email . ')',] );}usort($users, function($a, $b) {return $a['name'] <=> $b['name'];});$creator = $companyUserMapper->fetchCreatorByCompanyId($company->id);if($creator) {$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOne($creator->user_id);if($user) {$creator = $user->uuid;} else {$creator = '';}} else {$creator = '';}$data = ['success' => true,'data' => ['status' => $company->status,'users' => $users,'creator' => $creator,],];return new JsonModel($data);} else {$data = ['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED'];return new JsonModel($data);}return new JsonModel($data);}}