isAdmin) return true; if ($safeMethod) if ($this->externalCalls) return true; $authorized = false; if ($checkType) $authorized = $this->acl->checkUserAccessToType('ORG', $this->userID); else { if (!is_numeric($organizationID)) $authorized = false; else $authorized = $this->acl->checkUserAccessToResource('ORG', $this->userID, (int) $organizationID); } if (!$authorized) $this->endExecution("Você não tem permissão para executar este procedimento!"); } /** * Finaliza a execução e envia uma mensagem serializada (para ser exibida no retorno do Ajax). * @param mixed A mensagem que será exibida. Pode ser uma array de mensagens ou uma string. * @return void * @access private */ private function endExecution($message) { if (!is_array($message)) $message = array($message); die(serialize(implode("\n", $message))); } /** * Define que alguns métodos desta classe poderão ser chamados. * @param bool $satus O status. true para permitir e false para restringir. * @return void * @access public */ public function setExternalCalls($status) { $this->externalCalls = ($status === true); } /** * Verifica se houve erro em alguma query do Banco de Dados. * @param object $result O resultado de alguma query * @return void * @access private */ private function _checkError($result) { if ($result === false) die(serialize("Ocorreu um erro ao se tentar executar a operação solicitada.")); } /** * Construtor da classe so_orgchart * @return object */ function so_orgchart() { $this->userID = $_SESSION['phpgw_info']['workflow']['account_id']; $this->isAdmin = $_SESSION['phpgw_info']['workflow']['user_is_admin']; $this->acl = &$GLOBALS['ajax']->acl; $this->db = &$GLOBALS['workflow']['workflowObjects']->getDBWorkflow()->Link_ID; $this->db = &$GLOBALS['workflow']['workflowObjects']->getDBWorkflow()->Link_ID; $this->db->SetFetchMode(ADODB_FETCH_ASSOC); } /** * Lista todas as organizações do Organograma. * @return array Lista de organizações. * @access public */ function getOrganizations() { $this->_checkAccess(null, true); if ($this->isAdmin) $query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem FROM organizacao ORDER BY nome"; else { $organizations = $this->acl->getUserPermissions("ORG", $this->userID); $organizations[] = -1; $query = "SELECT organizacao_id, nome, descricao, url_imagem, ativa FROM organizacao WHERE (organizacao_id IN (" . implode(',', $organizations) . ")) ORDER BY nome"; } $result = $this->db->query($query); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona uma organização. * @param string $name O nome da organização. * @param string $description A descrição da organização. * @param string $imageURL O caminho da imagem que representa o organograma da organização. * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addOrganization($name, $description, $imageURL, $active) { $this->_checkAccess(null, true); $query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa) VALUES(?, ?, ?, ?)"; $result = $this->db->query($query, array($name, $description, $imageURL, $active)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza as informações sobre uma organização. * @param string $name O nome da organização. * @param string $description A descrição da organização. * @param string $imageURL O caminho da imagem que representa o organograma da organização. * @param char $active 'S' se a organização estiver ativa e 'N' caso contrário. * @param int $organizationID O ID da organização do Orgranograma. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateOrganization($name, $description, $imageURL, $active, $organizationID) { $this->_checkAccess($organizationID); $query = "UPDATE organizacao SET nome = ?, descricao = ?, url_imagem = ?, ativa = ? WHERE (organizacao_id = ?)"; $result = $this->db->query($query, array($name, $description, $imageURL, $active, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove uma organização. * @param int $organizationID O ID da organização do Orgranograma. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeOrganization($organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM organizacao WHERE (organizacao_id = ?)"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista os possíveis status dos funcionários. * @param int $organizationID O ID da organização do Orgranograma. * @return array Lista dos possíveis status dos empregados. * @access public */ function getEmployeeStatus($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT funcionario_status_id, descricao, exibir, organizacao_id FROM funcionario_status WHERE (organizacao_id = ?) ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); return $output; } /** * Adiciona um Status de funcionário. * @param int $organizationID O ID da organização do Orgranograma. * @param string $description A descrição do status. * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addEmployeeStatus($organizationID, $description, $show) { $this->_checkAccess($organizationID); $query = "INSERT INTO funcionario_status(organizacao_id, descricao, exibir) VALUES(?, ?, ?)"; $result = $this->db->query($query, array($organizationID, $description, $show)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza um Status de funcionário. * @param int $employeeStatusID O ID do status de funcionário. * @param int $organizationID O ID da organização do Orgranograma. * @param string $description A descrição do status. * @param char $show 'S' se o funcionário será exibido na interface de organograma do usuário ou 'N' caso contrário. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateEmployeeStatus($employeeStatusID, $organizationID, $description, $show) { $this->_checkAccess($organizationID); $query = "UPDATE funcionario_status SET descricao = ?, exibir = ? WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($description, $show, $employeeStatusID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove um Status de funcionário. * @param int $employeeStatusID O ID do status de funcionário. * @param int $organizationID O ID da organização do Orgranograma. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeEmployeeStatus($employeeStatusID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM funcionario_status WHERE (funcionario_status_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($employeeStatusID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista as possíveis categorias de uma organização. * @param int $organizationID O ID da organização. * @return array Lista das possíveis categorias de uma organização. * @access public */ function getEmployeeCategory($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT funcionario_categoria_id, organizacao_id, descricao FROM funcionario_categoria WHERE (organizacao_id = ?) ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona uma categoria. * @param int $organizationID O ID da organização. * @param string $description A descrição da categoria. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addEmployeeCategory($organizationID, $description) { $this->_checkAccess($organizationID); $query = "INSERT INTO funcionario_categoria(organizacao_id, descricao) VALUES(?, ?)"; $result = $this->db->query($query, array($organizationID, $description)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza uma categoria. * @param int $employeeCategoryID O ID da categoria. * @param int $organizationID O ID da organização. * @param string $description A descrição da categoria. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateEmployeeCategory($employeeCategoryID, $organizationID, $description) { $this->_checkAccess($organizationID); $query = "UPDATE funcionario_categoria SET descricao = ? WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($description, $employeeCategoryID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove uma categoria. * @param int $employeeCategoryID O ID da categoria. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeEmployeeCategory($employeeCategoryID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM funcionario_categoria WHERE (funcionario_categoria_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($employeeCategoryID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista os possíveis cargos de uma organização. * @param int $organizationID O ID da organização. * @return array Lista dos possíveis cargos de uma organização. * @access public */ function getJobTitle($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT cargo_id, organizacao_id, descricao FROM cargo WHERE (organizacao_id = ?) ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona um cargo. * @param int $organizationID O ID da organização. * @param string $description A descrição do cargo. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addJobTitle($organizationID, $description) { $this->_checkAccess($organizationID); $query = "INSERT INTO cargo(organizacao_id, descricao) VALUES(?, ?)"; $result = $this->db->query($query, array($organizationID, $description)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza um cargo. * @param int $jobTitleID O ID do cargo. * @param int $organizationID O ID da organização. * @param string $description A descrição do cargo. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateJobTitle($jobTitleID, $organizationID, $description) { $this->_checkAccess($organizationID); $query = "UPDATE cargo SET descricao = ? WHERE (cargo_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($description, $jobTitleID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove um cargo. * @param int $jobTitleID O ID do cargo. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeJobTitle($jobTitleID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM cargo WHERE (cargo_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($jobTitleID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista os possíveis status das áreas de uma organização. * @param int $organizationID O ID da organização. * @return array Lista dos possíveis status das áreas de uma organização. * @access public */ function getAreaStatus($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT area_status_id, organizacao_id, descricao, nivel FROM area_status WHERE organizacao_id = ? ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona um status de área. * @param int $organizationID O ID da organização. * @param string $description A descrição do status. * @param int $level O nível do status. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addAreaStatus($organizationID, $description, $level) { $this->_checkAccess($organizationID); $query = "INSERT INTO area_status(organizacao_id, descricao, nivel) VALUES(?, ?, ?)"; $result = $this->db->query($query, array($organizationID, $description, $level)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza um status de área. * @param int $areaStatusID O ID do status da área. * @param int $organizationID O ID da organização. * @param string $description A descrição do status. * @param int $level O nível do status. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateAreaStatus($areaStatusID, $organizationID, $description, $level) { $this->_checkAccess($organizationID); $query = "UPDATE area_status SET descricao = ?, nivel = ? WHERE (area_status_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($description, $level, $areaStatusID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove um status de área. * @param int $areaStatusID O ID do status da área. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeAreaStatus($areaStatusID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM area_status WHERE (area_status_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($areaStatusID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista os centros de custo de uma organização. * @param int $organizationID O ID da organização. * @return array Lista dos centros de custo de uma organização. * @access public */ function getCostCenter($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT organizacao_id, centro_custo_id, nm_centro_custo, descricao, grupo FROM centro_custo WHERE organizacao_id = ? ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona um centro de custo. * @param int $organizationID O ID da organização. * @param int $number O número do centro de custo. * @param string $description A descrição do centro de custo. * @param string $group O grupo do centro de custo. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addCostCenter($organizationID, $number, $description, $group) { $this->_checkAccess($organizationID); $query = "INSERT INTO centro_custo(organizacao_id, nm_centro_custo, descricao, grupo) VALUES(?, ?, ?, ?)"; $result = $this->db->query($query, array($organizationID, $number, $description, $group)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza um centro de custo. * @param int $organizationID O ID da organização. * @param int $number O número do centro de custo. * @param string $description A descrição do centro de custo. * @param string $group O grupo do centro de custo. * @param int $costCenterID O ID do centro de custo. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateCostCenter($organizationID, $number, $description, $group, $costCenterID) { $this->_checkAccess($organizationID); $query = "UPDATE centro_custo SET organizacao_id = ?, nm_centro_custo = ?, descricao = ?, grupo = ? WHERE (centro_custo_id = ?)"; $result = $this->db->query($query, array($organizationID, $number, $description, $group, $costCenterID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove um centro de custo. * @param int $costCenterID O ID do centro de custo. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeCostCenter($costCenterID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM centro_custo WHERE (centro_custo_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($costCenterID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista as localidade de uma organização. * @param int $organizationID O ID da organização. * @return array Lista das localidades de uma organização. * @access public */ function getLocal($organizationID) { $this->_checkAccess($organizationID); $query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao FROM localidade WHERE organizacao_id = ? ORDER BY descricao"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); return $output; } /** * Adiciona uma localidade. * @param int $organizationID O ID da organização. * @param int $costCenterID O ID do centro de custo. * @param string $description A descrição da localidade. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addLocal($organizationID, $costCenter, $description) { $this->_checkAccess($organizationID); $query = "INSERT INTO localidade(organizacao_id, centro_custo_id, descricao) VALUES(?, ?, ?)"; $result = $this->db->query($query, array($organizationID, $costCenter, $description)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza uma localidade. * @param int $organizationID O ID da organização. * @param int $costCenterID O ID do centro de custo. * @param string $description A descrição da localidade. * @param int $localID O ID da localidade. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateLocal($organizationID, $costCenter, $description, $localID) { $this->_checkAccess($organizationID); $query = "UPDATE localidade SET organizacao_id = ?, centro_custo_id = ?, descricao = ? WHERE (localidade_id = ?)"; $result = $this->db->query($query, array($organizationID, $costCenter, $description, $localID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove uma localidade. * @param int $organizationID O ID da organização. * @param int $localID O ID da localidade. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeLocal($localID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM localidade WHERE (localidade_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($localID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista os funcionários de uma determinada área da organização. * @param int $areaID O ID da área. * @param int $organizationID O ID da organização. * @return array Lista dos funcionários de uma determinada área da organização. * @access public */ function getAreaEmployee($areaID, $organizationID) { $this->_checkAccess($organizationID); $supervisors = '{' . implode(', ', $this->db->GetRow('SELECT COALESCE(titular_funcionario_id, -1) AS titular_funcionario_id, COALESCE(substituto_funcionario_id, -1) AS substituto_funcionario_id FROM area WHERE (area_id = ?) AND (organizacao_id = ?)', array($areaID, $organizationID))) . '}'; $query = "SELECT funcionario_id, funcionario_status_id, centro_custo_id, localidade_id, organizacao_id, area_id, cargo_id, nivel, funcionario_categoria_id FROM funcionario WHERE ((area_id = ?) AND (organizacao_id = ?)) OR (funcionario_id = ANY (?))"; $result = $this->db->query($query, array($areaID, $organizationID, $supervisors)); $this->_checkError($result); $output = $result->GetArray(-1); $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); for ($i = 0; $i < count($output); $i++) { $output[$i]['funcionario_id_desc'] = ''; $output[$i]['uid'] = ''; if (($entry = $cachedLDAP->getEntryByID($output[$i]['funcionario_id']))) { $output[$i]['funcionario_id_desc'] = $entry['cn']; $output[$i]['uid'] = $entry['uid']; $output[$i]['removed'] = is_null($entry['last_update']); } } usort($output, create_function('$a,$b', 'return strcasecmp($a[\'funcionario_id_desc\'],$b[\'funcionario_id_desc\']);')); return $output; } /** * Procura por funcionários de acordo com um termo de busca. * @param string $searchTerm O termo de busca. Pode ser referente ao ID do funcionário ou ao nome do mesmo. * @param int $organizationID O ID da organização. * @return array Lista dos funcionários que satisfazem o critério de busca. * @access public */ function searchEmployee($searchTerm, $organizationID) { $organizationID = (int) $organizationID; $this->_checkAccess($organizationID); /* initialize some variables */ $output = array(); $unifiedResult = array(); if (is_numeric($searchTerm)) { $searchTerm = (int) $searchTerm; $ldapSearch = "(&(|(employeenumber={$searchTerm})(uidnumber={$searchTerm}))(phpgwaccounttype=u))"; $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (employeenumber = ?) OR (uidnumber = ?)"; $DBValues = array($searchTerm, $searchTerm); } else { $ldapSearch = "(&(cn=*{$searchTerm}*)(phpgwaccounttype=u))"; $DBSearch = "SELECT uidnumber, cn, uid, last_update FROM egw_wf_user_cache WHERE (cn ILIKE ?)"; $DBValues = array("%{$searchTerm}%"); } /* search for the $searchTerm in the LDAP */ $ldap = &$GLOBALS['workflow']['workflowObjects']->getLDAP(); $list = @ldap_search($ldap, $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getLDAPContext(), $ldapSearch, array('uidnumber', 'cn', 'uid')); if ($list === false) die(serialize("O sistema de busca não pode ser utilizado nesta organização.")); $entries = ldap_get_entries($ldap, $list); for ($i=0; $i < $entries['count']; $i++) $unifiedResult[$entries[$i]['uidnumber'][0]] = array('name' => $entries[$i]['cn'][0], 'uid' => $entries[$i]['uid'][0], 'removed' => false); /* search for the $searchTerm in the DB */ $resultSet = $GLOBALS['workflow']['workflowObjects']->getDBGalaxia()->Link_ID->query($DBSearch, $DBValues)->GetArray(-1); foreach ($resultSet as $row) if (!isset($unifiedResult[$row['uidnumber']])) $unifiedResult[$row['uidnumber']] = array('name' => $row['cn'], 'uid' => $row['uid'], 'removed' => is_null($row['last_update'])); /* check if any result was found */ if (count($unifiedResult) < 1) return $output; /* load employee information */ $query = "SELECT f.funcionario_id, f.funcionario_status_id, f.centro_custo_id, f.localidade_id, f.organizacao_id, f.area_id, f.cargo_id, f.nivel, f.funcionario_categoria_id, a.sigla AS area_sigla FROM funcionario f, area a WHERE (f.area_id = a.area_id) AND (f.organizacao_id = $organizationID) AND (f.funcionario_id IN (" . implode(',', array_keys($unifiedResult)) ."))"; $result = $this->db->query($query); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) { for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); $output[$i]['funcionario_id_desc'] = $unifiedResult[$output[$i]['funcionario_id']]['name']; $output[$i]['uid'] = $unifiedResult[$output[$i]['funcionario_id']]['uid']; $output[$i]['removed'] = $unifiedResult[$output[$i]['funcionario_id']]['removed']; } return $output; } /** * Adiciona um funcionário. * @param int $employeeID O ID do funcionário. * @param int $organizationID O ID da organização. * @param int $areaID O ID da área. * @param int $costCenterID O ID do centro de custo. * @param int $localID O ID da localidade. * @param int $employeeStatusID O ID do status do funcionário. * @param int $jobTitleID O ID do cargo do funcionário. * @param int $level O nível do cargo do funcionário. * @param int $employeeCategoryID O ID da categoria do funcionário. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID) { $this->_checkAccess($organizationID); $query = 'SELECT area.sigla FROM funcionario, area WHERE (funcionario.area_id = area.area_id) AND (funcionario.funcionario_id = ?)'; if (($row = $this->db->query($query, $employeeID)->fetchRow())) { $errors = array( "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($employeeID) . "\" já pertença à área \"{$row['sigla']}\".", '-----------------', 'Caso você queira colocá-lo na área selecionada, siga o procedimento: faça uma busca por seu nome, clique para editá-lo e, troque pela área desejada.' ); $this->endExecution($errors); } $query = "INSERT INTO funcionario(funcionario_id, organizacao_id, area_id, centro_custo_id, localidade_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"; $result = $this->db->query($query, array($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza o funcionário. * @param int $employeeID O ID do funcionário. * @param int $organizationID O ID da organização. * @param int $areaID O ID da área. * @param int $costCenterID O ID do centro de custo. * @param int $localID O ID da localidade. * @param int $employeeStatusID O ID do status do funcionário. * @param int $jobTitleID O ID do cargo do funcionário. * @param int $level O nível do cargo do funcionário. * @param int $employeeCategoryID O ID da categoria do funcionário. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID) { $this->_checkAccess($organizationID); $query = "UPDATE funcionario SET area_id = ?, centro_custo_id = ?, localidade_id = ?, funcionario_status_id = ?, cargo_id = ?, nivel = ?, funcionario_categoria_id = ? WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $employeeID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove um funcionário. * @param int $employeeID O ID do funcionário. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeEmployee($employeeID, $organizationID) { $this->_checkAccess($organizationID); $query = 'SELECT sigla FROM area WHERE (? IN (titular_funcionario_id, substituto_funcionario_id, auxiliar_funcionario_id))'; $areas = array(); $resultSet = $this->db->query($query, $employeeID); while (($row = $resultSet->fetchRow())) $areas[] = $row['sigla']; if (count($areas) > 0) { $errors = array( "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($employeeID) . "\" é titular, substituto ou auxiliar administrativo das seguintes áreas: " . implode(", ", $areas), '-----------------', 'Se você quiser excluir este funcionário, precisa removê-lo dos "cargos" que ele possui nas áreas citadas.' ); $this->endExecution($errors); } $query = "DELETE FROM funcionario WHERE (funcionario_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($employeeID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Lista as áreas de uma organização. * @param int $organizationID O ID da organização. * @return array Lista das áreas de uma organização. * @access public */ function getArea($organizationID) { $this->_checkAccess($organizationID); $output = array(); $query = "SELECT area_id, centro_custo_id, organizacao_id, area_status_id, substituto_funcionario_id, titular_funcionario_id, superior_area_id, sigla, descricao, ativa, auxiliar_funcionario_id FROM area WHERE organizacao_id = ? ORDER BY sigla"; $result = $this->db->query($query, array($organizationID)); $this->_checkError($result); $ldap = &$GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP'); while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) { for ($j = 0; $j < $result->_numOfFields; $j++) unset($row[$j]); $row['substituto_funcionario_id_desc'] = ($row['substituto_funcionario_id'] != '') ? $ldap->getName($row['substituto_funcionario_id']) : ''; $row['titular_funcionario_id_desc'] = ($row['titular_funcionario_id'] != '') ? $ldap->getName($row['titular_funcionario_id']) : ''; $row['auxiliar_funcionario_id_desc'] = ($row['auxiliar_funcionario_id'] != '') ? $ldap->getName($row['auxiliar_funcionario_id']) : ''; $output[] = $row; } return $output; } /** * Lista, hierarquicamente, as áreas de uma organização. * @param int $organizationID O ID da organização. * @param int $parent O ID da área superior (ou NULL para buscar todas as áreas). * @param int $depth O nível hierárquico da área (profundidade do nó na árvore do Organograma). * @return array Lista hierárquica das áreas de uma organização. * @access public */ function getHierarchicalArea($organizationID, $parent, $depth) { $this->_checkAccess($organizationID); if (is_null($parent)) $result = $this->db->query("SELECT area_id, sigla FROM area WHERE (superior_area_id IS NULL) AND (organizacao_id = ?) AND (ativa = 'S') ORDER BY sigla", array($organizationID)); else $result = $this->db->query("SELECT area_id, sigla FROM area WHERE (superior_area_id = ?) AND (ativa = 'S') ORDER BY sigla", array($parent)); $this->_checkError($result); $output = $result->GetArray(-1); for ($i = 0; $i < count($output); $i++) { for ($j = 0; $j < $result->_numOfFields; $j++) unset($output[$i][$j]); $output[$i]['children'] = $this->getHierarchicalArea($organizationID, $output[$i]['area_id'], $depth + 1); $output[$i]['depth'] = $depth; } return $output; } /** * Adiciona uma área em uma organização. * @param int $costCenterID O ID do centro de custo. * @param int $organizationID O ID da organização. * @param int $areaStatusID O ID do status da área. * @param int $backupEmployeeID O ID do funcionário que está substituindo o superior da área. * @param int $supervisorID O ID do funcionário que é superior da área. * @param int $superiorAreaID O ID da área que é superior a que está sendo adicionada (NULL caso não possua área superior). * @param string $acronym A sigla da área. * @param string $description A descrição da área. * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function addArea($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID) { $this->_checkAccess($organizationID); $checkEmployees = array($backupEmployeeID, $supervisorID, $assistantID); $errors = array(); foreach ($checkEmployees as $checkEmployee) { if (is_null($checkEmployee)) continue; $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; if (!$this->db->query($query, $checkEmployee)->fetchRow()) $errors[] = "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; } if (count($errors) > 0) { $errors[] = '-----------------'; $errors[] = 'Se você está iniciando a construção de um organograma, crie as áreas sem titulares/substitutos/auxiliares administrativos e, adicione os funcionários a elas. Só então, adicione os titulares, substitutos, etc. A razão disto, é que estes "cargos" só podem ser ocupados por pessoas que estão vinculadas a alguma área.'; $this->endExecution($errors); } $query = "INSERT INTO area(centro_custo_id, organizacao_id, area_status_id, substituto_funcionario_id, titular_funcionario_id, superior_area_id, sigla, descricao, ativa, auxiliar_funcionario_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Atualiza a área de uma organização. * @param int $costCenterID O ID do centro de custo. * @param int $organizationID O ID da organização. * @param int $areaStatusID O ID do status da área. * @param int $backupEmployeeID O ID do funcionário que está substituindo o superior da área. * @param int $supervisorID O ID do funcionário que é superior da área. * @param int $superiorAreaID O ID da área que é superior a que está sendo atualizada (NULL caso não possua área superior). * @param string $acronym A sigla da área. * @param string $description A descrição da área. * @param char $active 'S' se a área estiver ativa e 'N' caso contrário. * @param int $areaID O ID da área. * @param int $assistantID O ID do funcionário que está auxiliando o superior da área. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function updateArea($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID) { $this->_checkAccess($organizationID); $checkEmployees = array($backupEmployeeID, $supervisorID, $assistantID); $errors = array(); foreach ($checkEmployees as $checkEmployee) { if (is_null($checkEmployee)) continue; $query = 'SELECT 1 FROM funcionario WHERE (funcionario_id = ?)'; if (!$this->db->query($query, $checkEmployee)->fetchRow()) $errors[] = "O funcionário \"" . $GLOBALS['workflow']['factory']->getInstance('WorkflowLDAP')->getName($checkEmployee) . "\" não está vinculado a uma área."; } if (count($errors) > 0) { $errors[] = '-----------------'; $errors[] = 'Somente funcionários que estão vinculados a alguma área podem ser colocados na posição de titular, substituto ou auxiliar administrativo.'; $this->endExecution($errors); } $query = "UPDATE area SET centro_custo_id = ?, organizacao_id = ?, area_status_id = ?, substituto_funcionario_id = ?, titular_funcionario_id = ?, superior_area_id = ?, sigla = ?, descricao = ?, ativa = ?, auxiliar_funcionario_id = ? WHERE (area_id = ?)"; $result = $this->db->query($query, array($costCenterID, $organizationID, $areaStatusID, $backupEmployeeID, $supervisorID, $superiorAreaID, $acronym, $description, $active, $assistantID, $areaID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Remove a área de uma organização. * @param int $areaID O ID da área. * @param int $organizationID O ID da organização. * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário. * @access public */ function removeArea($areaID, $organizationID) { $this->_checkAccess($organizationID); $query = "DELETE FROM area WHERE (area_id = ?) AND (organizacao_id = ?)"; $result = $this->db->query($query, array($areaID, $organizationID)); $this->_checkError($result); return (($result === false) ? false : true); } /** * Busca informações sobre um funcionário. * @param array $params Uma array contendo o ID do funcionário cujas informações serão extraídas e de sua organização (Ajax). * @param int $employeeID O ID do funcionário. * @param int $organizationID O ID da organização. * @return array Informações sobre o funcionário. * @access public */ function getEmployeeInfo($employeeID, $organizationID) { $this->_checkAccess($organizationID, false, true); require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; $orgchart = new wf_orgchart(); $outputInfo = array(); $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); $employeeEntry = $cachedLDAP->getEntryByID($employeeID); if ($entry === false) return array('error' => 'Funcionário não encontrado.'); $outputInfo[] = array( 'name' => 'Nome', 'value' => $employeeEntry['cn']); if (!empty($employeeEntry['employeenumber'])) { $outputInfo[] = array( 'name' => 'Matrícula', 'value' => $employeeEntry['employeenumber']); } $outputInfo[] = array( 'name' => 'UIDNumber', 'value' => $employeeID); $employeeInfo = $orgchart->getEmployee($employeeID); $employeeStatusInfo = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']); $outputInfo[] = array( 'name' => 'Status', 'value' => $employeeStatusInfo['descricao']); if (!empty($employeeInfo['funcionario_categoria_id'])) { $categoryInfo = $orgchart->getEmployeeCategory($employeeInfo['funcionario_categoria_id']); $outputInfo[] = array( 'name' => 'Vínculo', 'value' => $categoryInfo['descricao']); } if (!empty($employeeInfo['cargo_id'])) { $jobTitleInfo = $orgchart->getJobTitle($employeeInfo['cargo_id']); $outputInfo[] = array( 'name' => 'Cargo', 'value' => $jobTitleInfo['descricao'] . ((!empty($employeeInfo['nivel'])) ? (' (Nível: ' . $employeeInfo['nivel'] . ')') : '')); } $areaInfo = $orgchart->getArea($employeeInfo['area_id']); $outputInfo[] = array( 'name' => 'Área', 'value' => $areaInfo['sigla']); $localInfo = $orgchart->getLocal($employeeInfo['localidade_id']); $outputInfo[] = array( 'name' => 'Localidade', 'value' => $localInfo['descricao']); if (!empty($employeeInfo['centro_custo_id'])) $costCenterInfo = $orgchart->getCostCenter($employeeInfo['centro_custo_id']); else $costCenterInfo = $orgchart->getCostCenter($areaInfo['centro_custo_id']); $outputInfo[] = array( 'name' => 'Centro de Custo', 'value' => $costCenterInfo['descricao']); return array('info' => $outputInfo); } /** * Busca informações sobre uma área. * @param array $params Uma array contendo o ID da área cujas informações serão extraídas e de sua organização (Ajax). * @param int $areaID O ID da área. * @param int $organizationID O ID da organização. * @return array Informações sobre o funcionário. * @access public */ function getAreaInfo($areaID, $organizationID) { $this->_checkAccess($organizationID, false, true); $areaID = (int) $areaID; $organizationID = (int) $organizationID; require_once dirname(__FILE__) . '/local/classes/class.wf_orgchart.php'; $orgchart = new wf_orgchart(); $outputInfo = array(); $areaInfo = $orgchart->getArea($areaID); $outputInfo[] = array( 'name' => 'Nome', 'value' => $areaInfo['descricao'] ); $cachedLDAP = $GLOBALS['workflow']['factory']->newInstance('CachedLDAP'); $cachedLDAP->setOperationMode($cachedLDAP->OPERATION_MODE_LDAP_DATABASE); if (!empty($areaInfo['titular_funcionario_id'])) { $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['titular_funcionario_id']); $outputInfo[] = array( 'name' => 'Titular', 'value' => $employeeInfo['cn'] ); } if (!empty($areaInfo['substituto_funcionario_id'])) { $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['substituto_funcionario_id']); $outputInfo[] = array( 'name' => 'Substituto', 'value' => $employeeInfo['cn'] ); } if (!empty($areaInfo['auxiliar_funcionario_id'])) { $employeeInfo = $cachedLDAP->getEntryByID($areaInfo['auxiliar_funcionario_id']); $outputInfo[] = array( 'name' => 'Auxiliar Administrativo', 'value' => $employeeInfo['cn'] ); } $outputInfo[] = array( 'name' => 'No. de Funcionários', 'value' => $this->db->GetOne("SELECT COUNT(*) FROM funcionario f, funcionario_status s WHERE (s.funcionario_status_id = f.funcionario_status_id) AND (s.exibir = 'S') AND (f.area_id = ?) AND (f.organizacao_id = ?)", array($areaID, $organizationID)) ); return array('info' => $outputInfo); } } ?>