Index: /trunk/workflow/inc/local/classes/class.wf_orgchart.php
===================================================================
--- /trunk/workflow/inc/local/classes/class.wf_orgchart.php	(revision 1131)
+++ /trunk/workflow/inc/local/classes/class.wf_orgchart.php	(revision 1245)
@@ -42,5 +42,5 @@
 	function getOrganization($organizationID)
 	{
-		$query = "SELECT organizacao_id, nome, descricao, ativa" .
+		$query = "SELECT organizacao_id, nome, descricao, ativa, sitio" .
 				 "  FROM organizacao" .
 				 " WHERE (organizacao_id = ?)";
@@ -674,5 +674,5 @@
 	function getLocal($localID)
 	{
-		$query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao" .
+		$query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf" .
 				 "  FROM localidade" .
 				 " WHERE (localidade_id = ?)";
@@ -954,5 +954,5 @@
 			return false;
 
-		$query  = "SELECT funcionario_id, area_id, localidade_id, centro_custo_id, organizacao_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id" .
+		$query  = "SELECT funcionario_id, area_id, localidade_id, centro_custo_id, organizacao_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id, titulo" .
 				  "  FROM funcionario" .
 				  " WHERE (funcionario_id = ?)";
Index: /trunk/workflow/inc/class.so_orgchart.inc.php
===================================================================
--- /trunk/workflow/inc/class.so_orgchart.inc.php	(revision 795)
+++ /trunk/workflow/inc/class.so_orgchart.inc.php	(revision 1245)
@@ -142,5 +142,5 @@
 
 		if ($this->isAdmin)
-			$query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem FROM organizacao ORDER BY nome";
+			$query = "SELECT organizacao_id, nome, descricao, ativa, url_imagem, sitio FROM organizacao ORDER BY nome";
 		else
 		{
@@ -169,10 +169,10 @@
 	 * @access public
 	 */
-	function addOrganization($name, $description, $imageURL, $active)
+	function addOrganization($name, $description, $imageURL, $active, $siteURL)
 	{
 		$this->_checkAccess(null, true);
 
-		$query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa) VALUES(?, ?, ?, ?)";
-		$result = $this->db->query($query, array($name, $description, $imageURL, $active));
+		$query = "INSERT INTO organizacao(nome, descricao, url_imagem, ativa, sitio) VALUES(?, ?, ?, ?, ?)";
+		$result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL));
 		$this->_checkError($result);
 
@@ -190,10 +190,10 @@
 	 * @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));
+	function updateOrganization($name, $description, $imageURL, $active, $organizationID, $siteURL)
+	{
+		$this->_checkAccess($organizationID);
+
+		$query = "UPDATE organizacao SET nome = ?, descricao = ?, url_imagem = ?, ativa = ?, sitio = ? WHERE (organizacao_id = ?)";
+		$result = $this->db->query($query, array($name, $description, $imageURL, $active, $siteURL, $organizationID));
 		$this->_checkError($result);
 
@@ -618,5 +618,6 @@
 		$this->_checkAccess($organizationID);
 
-		$query = "SELECT organizacao_id, localidade_id, centro_custo_id, descricao FROM localidade WHERE organizacao_id = ? ORDER BY descricao";
+		$query_fields = 'organizacao_id, localidade_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf';
+		$query = "SELECT {$query_fields} FROM localidade WHERE organizacao_id = ? ORDER BY descricao";
 		$result = $this->db->query($query, array($organizationID));
 		$this->_checkError($result);
@@ -638,10 +639,10 @@
 	 * @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));
+	function addLocal($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state )
+	{
+		$this->_checkAccess($organizationID);
+
+		$query = "INSERT INTO localidade(organizacao_id, centro_custo_id, descricao, empresa, endereco, complemento, cep, bairro, cidade, uf) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+		$result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state ));
 		$this->_checkError($result);
 
@@ -658,10 +659,10 @@
 	 * @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));
+	function updateLocal($organizationID, $costCenter, $description, $localID, $company, $address, $complement, $zipCode, $neighborhood, $city, $state )
+	{
+		$this->_checkAccess($organizationID);
+
+		$query = "UPDATE localidade SET organizacao_id = ?, centro_custo_id = ?, descricao = ?, empresa = ?, endereco = ?, complemento = ?, cep = ?, bairro = ?, cidade = ?, uf = ? WHERE (localidade_id = ?)";
+		$result = $this->db->query($query, array($organizationID, $costCenter, $description, $company, $address, $complement, $zipCode, $neighborhood, $city, $state, $localID) );
 		$this->_checkError($result);
 
@@ -699,5 +700,5 @@
 
 		$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 (?))";
+		$query = "SELECT funcionario_id, funcionario_status_id, centro_custo_id, localidade_id, organizacao_id, area_id, cargo_id, nivel, funcionario_categoria_id, titulo FROM funcionario WHERE ((area_id = ?) AND (organizacao_id = ?)) OR (funcionario_id = ANY (?))";
 		$result = $this->db->query($query, array($areaID, $organizationID, $supervisors));
 		$this->_checkError($result);
@@ -772,5 +773,5 @@
 
 		/* 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))  ."))";
+		$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, f.titulo, 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);
@@ -803,5 +804,5 @@
 	 * @access public
 	 */
-	function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID)
+	function addEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title)
 	{
 		$this->_checkAccess($organizationID);
@@ -818,6 +819,6 @@
 		}
 
-		$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));
+		$query = "INSERT INTO funcionario(funcionario_id, organizacao_id, area_id, centro_custo_id, localidade_id, funcionario_status_id, cargo_id, nivel, funcionario_categoria_id, titulo) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+		$result = $this->db->query($query, array($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title));
 		$this->_checkError($result);
 
@@ -839,10 +840,10 @@
 	 * @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));
+	function updateEmployee($employeeID, $organizationID, $areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title)
+	{
+		$this->_checkAccess($organizationID);
+
+		$query = "UPDATE funcionario SET area_id = ?, centro_custo_id = ?, localidade_id = ?, funcionario_status_id = ?, cargo_id = ?, nivel = ?, funcionario_categoria_id = ?, titulo = ? WHERE (funcionario_id = ?) AND (organizacao_id = ?)";
+		$result = $this->db->query($query, array($areaID, $costCenterID, $localID, $employeeStatusID, $jobTitleID, $level, $employeeCategoryID, $title, $employeeID, $organizationID));
 		$this->_checkError($result);
 
@@ -1084,7 +1085,12 @@
 		if ($entry === false)
 			return array('error' => 'Funcionário não encontrado.');
+
 		$outputInfo[] = array(
 			'name' => 'Nome',
 			'value' => $employeeEntry['cn']);
+
+		$outputInfo[] = array(
+			'name' => 'Telefone',
+			'value' => ( ! empty( $employeeEntry['telephonenumber'] ) ? $employeeEntry['telephonenumber'] : '' ) );
 
 		if (!empty($employeeEntry['employeenumber']))
@@ -1101,4 +1107,5 @@
 		$employeeInfo = $orgchart->getEmployee($employeeID);
 		$employeeStatusInfo = $orgchart->getEmployeeStatus($employeeInfo['funcionario_status_id']);
+
 		$outputInfo[] = array(
 			'name' => 'Status',
@@ -1113,11 +1120,22 @@
 		}
 
-		if (!empty($employeeInfo['cargo_id']))
+		$cargo = NULL;
+		if ( !empty( $employeeInfo['titulo'] ) )
+		{
+			$cargo = $employeeInfo['titulo'];
+		}
+		else 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'] . ')') : ''));
-		}
+			$cargo = $jobTitleInfo['descricao'];
+		}
+
+		if ( $cargo )
+			$cargo .= ( !empty($employeeInfo['nivel']) ? " (Nível: {$employeeInfo['nivel']})" : '' );
+
+		$outputInfo[] = array(
+			'name' => 'Cargo',
+			'value' => ( $cargo ? $cargo : '' )
+		);
 
 		$areaInfo = $orgchart->getArea($employeeInfo['area_id']);
@@ -1130,4 +1148,28 @@
 			'name' => 'Localidade',
 			'value' => $localInfo['descricao']);
+
+		$outputInfo[] = array(
+			'name' => 'Empresa',
+			'value' => ( ! empty( $localInfo['empresa'] ) ? $localInfo['empresa'] : '') );;
+
+		$outputInfo[] = array(
+			'name' => 'Endereço',
+			'value' => ( ! empty( $localInfo['endereco'] ) ? $localInfo['endereco'] : '') );
+
+		$outputInfo[] = array(
+			'name' => 'Complemento',
+			'value' => ( ! empty( $localInfo['complemento'] ) ? $localInfo['complemento'] : '') );;
+
+		$outputInfo[] = array(
+			'name' => 'Cep',
+			'value' => ( ! empty( $localInfo['cep'] ) ? $localInfo['cep'] : '') );
+
+		$outputInfo[] = array(
+			'name' => 'Bairro',
+			'value' => ( ! empty( $localInfo['bairro'] ) ? $localInfo['bairro'] : '') );
+
+		$outputInfo[] = array(
+			'name' => 'Cidade',
+			'value' => ( ! empty( $localInfo['cidade'] ) ? $localInfo['cidade'] : '') );
 
 		if (!empty($employeeInfo['centro_custo_id']))
@@ -1138,4 +1180,14 @@
 			'name' => 'Centro de Custo',
 			'value' => $costCenterInfo['descricao']);
+
+		$outputInfo[] = array(
+			'name' => 'e-mail',
+			'value' => $employeeEntry['mail']);
+
+		$organizationInfo = $orgchart->getOrganization( $employeeInfo['organizacao_id'] );
+
+		$outputInfo[] = array(
+			'name' => 'sitio',
+			'value' => $organizationInfo['sitio']);
 
 		return array('info' => $outputInfo);
@@ -1204,4 +1256,82 @@
 		return array('info' => $outputInfo);
 	}
+
+	/**
+	 * Lista todos os telefones da organização.
+	 * @return array Lista de telefones da organização.
+	 * @access public
+	 */
+	function getTelephones( $organizationID )
+	{
+		$this -> _checkAccess( $organizationID );
+
+		$query = "SELECT organizacao_id, telefone_id, descricao, numero FROM telefone 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 telefone a uma organização.
+	 * @param int $organizationID O ID da organização.
+	 * @param string $description A descrição da localidade.
+	 * @param string $number String com os números de telefones.
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function addTelephone( $organizationID, $description, $number )
+	{
+		$this->_checkAccess( $organizationID );
+
+		$query = "INSERT INTO telefone( organizacao_id, descricao, numero ) VALUES( ?, ?, ? )";
+		$result = $this -> db -> query( $query, array( $organizationID, $description, $number ) );
+		$this -> _checkError( $result );
+
+		return (($result === false) ? false : true);
+	}
+
+	/**
+	 * Remove um telefone.
+	 * @param int $organizationID O ID da organização.
+	 * @param int $telephoneID O ID do telefone.
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function removeTelephone( $organizationID, $telephoneID )
+	{
+		$this->_checkAccess( $organizationID );
+
+		$query = "DELETE FROM telefone WHERE (telefone_id = ?) AND (organizacao_id = ?)";
+		$result = $this -> db -> query( $query, array( $telephoneID, $organizationID ) );
+		$this -> _checkError( $result );
+
+		return ( ( $result === false ) ? false : true );
+	}
+
+	/**
+	 * Atualiza um telefone.
+	 * @param int $organizationID O ID da organização.
+	 * @param int $telephoneID O ID do telefone.
+	 * @param string $description A descrição do telefone.
+	 * @param string $number String com os números de telefones.
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function updateTelephone( $organizationID, $telephoneID, $description, $number )
+	{
+		$this->_checkAccess( $organizationID );
+
+		$query = "UPDATE telefone SET descricao = ?, numero = ? WHERE (telefone_id = ?)";
+		$result = $this -> db -> query( $query, array( $description, $number, $telephoneID ) );
+		$this->_checkError( $result );
+
+		return ( ( $result === false ) ? false : true );
+	}
 }
 ?>
Index: /trunk/workflow/inc/class.so_userinterface.inc.php
===================================================================
--- /trunk/workflow/inc/class.so_userinterface.inc.php	(revision 795)
+++ /trunk/workflow/inc/class.so_userinterface.inc.php	(revision 1245)
@@ -426,4 +426,53 @@
 		return $output;
 	}
+
+	/**
+	 * Get useful phones list
+	 * @param int $organizationID The organization ID
+	 * @return array Useful phones list
+	 * @access public
+	 */
+	function getUsefulPhones( $organizationID )
+	{
+		$result = $this -> db -> query( "SELECT descricao, numero FROM telefone WHERE (organizacao_id = ?) ORDER BY descricao", array( $organizationID ) );
+
+		$output = $result->GetArray(-1);
+		for ($i = 0; $i < count($output); $i++)
+			for ($j = 0; $j < $result->_numOfFields; $j++)
+				unset($output[$i][$j]);
+
+		return $output;
+	}
+
+	/**
+	 * Get areas with substitute boss
+	 * @param int $organizationID The organization ID
+	 * @return array areas with substitute boss
+	 * @access public
+	 */
+	function getAreaWithSubtituteBoss( $organizationID )
+	{
+		$result = $this -> db -> query( "SELECT sigla as area, titular_funcionario_id as titular, substituto_funcionario_id as substituto FROM area WHERE (organizacao_id = ?) and substituto_funcionario_id is not null ORDER BY area", array( $organizationID ) );
+
+		$cachedLDAP = $GLOBALS[ 'workflow' ][ 'factory' ] -> newInstance( 'CachedLDAP' );
+		$cachedLDAP -> setOperationMode( $cachedLDAP -> OPERATION_MODE_LDAP_DATABASE );
+
+		$output = $result->GetArray(-1);
+		for ( $i = 0; $i < count($output); $i++ )
+		{
+			for ($j = 0; $j < $result->_numOfFields; $j++)
+				unset($output[$i][$j]);
+
+			$entry = $cachedLDAP -> getEntryByID( $output[ $i ][ 'titular' ] );
+			if ( $entry && ( ! is_null( $entry[ 'cn' ] ) ) )
+				$output[ $i ][ 'titular' ] = $entry[ 'cn' ];
+
+			$entry = $cachedLDAP -> getEntryByID( $output[ $i ][ 'substituto' ] );
+			if ( $entry && ( ! is_null( $entry[ 'cn' ] ) ) )
+				$output[ $i ][ 'substituto' ] = $entry[ 'cn' ];
+		}
+
+		return $output;
+	}
 }
 ?>
Index: /trunk/workflow/inc/class.bo_userinterface.inc.php
===================================================================
--- /trunk/workflow/inc/class.bo_userinterface.inc.php	(revision 795)
+++ /trunk/workflow/inc/class.bo_userinterface.inc.php	(revision 1245)
@@ -978,4 +978,32 @@
 		return $this->so->getAreaInfo((int) $params['area_id'], $this->organizationInfo['organizacao_id']);
 	}
+
+	/**
+	 * Retorna a lista de telefones úteis da organização
+	 * @return array Lista de telefones
+	 * @access public
+	 */
+	function getUsefulPhones( )
+	{
+		/* check for access */
+		if ( ($checkWarnings = $this->checkOrgchartAccess( ) ) !== true )
+			return $checkWarnings;
+
+		return $this -> so -> getUsefulPhones( $this -> organizationInfo[ 'organizacao_id' ] );
+	}
+
+	/**
+	 * Retorna a lista as áreas com substituição de chefia
+	 * @return array Lista das áreas com substituição de chefia
+	 * @access public
+	 */
+	function getAreaWithSubtituteBoss( )
+	{
+		/* check for access */
+		if ( ($checkWarnings = $this->checkOrgchartAccess( ) ) !== true )
+			return $checkWarnings;
+
+		return $this -> so -> getAreaWithSubtituteBoss( $this -> organizationInfo[ 'organizacao_id' ] );
+	}
 }
 ?>
Index: /trunk/workflow/inc/class.bo_orgchart.inc.php
===================================================================
--- /trunk/workflow/inc/class.bo_orgchart.inc.php	(revision 795)
+++ /trunk/workflow/inc/class.bo_orgchart.inc.php	(revision 1245)
@@ -71,5 +71,5 @@
 	function addOrganization($params)
 	{
-		$result = $this->so->addOrganization($params['nome'], $params['descricao'], $params['url_imagem'], $params['ativa']);
+		$result = $this->so->addOrganization($params['nome'], $params['descricao'], $params['url_imagem'], $params['ativa'], $params['sitio']);
 		$this->disconnect_all();
 
@@ -85,5 +85,5 @@
 	function updateOrganization($params)
 	{
-		$result = $this->so->updateOrganization($params['nome'], $params['descricao'], $params['url_imagem'], $params['ativa'], $params['organizacao_id']);
+		$result = $this->so->updateOrganization($params['nome'], $params['descricao'], $params['url_imagem'], $params['ativa'], $params['organizacao_id'], $params['sitio']);
 		$this->disconnect_all();
 
@@ -407,5 +407,6 @@
 	function addLocal($params)
 	{
-		$result = $this->so->addLocal($params['organizacao_id'], $this->_nullReplace($params['centro_custo_id']), $params['descricao']);
+		extract( $params );
+		$result = $this->so->addLocal($organizacao_id, $this->_nullReplace($centro_custo_id), $descricao, $empresa, $endereco, $complemento, $cep, $bairro, $cidade, $uf );
 		$this->disconnect_all();
 
@@ -421,5 +422,6 @@
 	function updateLocal($params)
 	{
-		$result = $this->so->updateLocal($params['organizacao_id'], $this->_nullReplace($params['centro_custo_id']), $params['descricao'], $params['localidade_id']);
+		extract( $params );
+		$result = $this->so->updateLocal($organizacao_id, $this->_nullReplace($centro_custo_id), $descricao, $localidade_id, $empresa, $endereco, $complemento, $cep, $bairro, $cidade, $uf );
 		$this->disconnect_all();
 
@@ -480,5 +482,5 @@
 	function addEmployee($params)
 	{
-		$result = $this->so->addEmployee($params['funcionario_id'], $params['organizacao_id'], $params['area_id'], $this->_nullReplace($params['centro_custo_id']), $params['localidade_id'], $params['funcionario_status_id'], $this->_nullReplace($params['cargo_id']), $this->_nullReplace($params['nivel']), $this->_nullReplace($params['funcionario_categoria_id']));
+		$result = $this->so->addEmployee($params['funcionario_id'], $params['organizacao_id'], $params['area_id'], $this->_nullReplace($params['centro_custo_id']), $params['localidade_id'], $params['funcionario_status_id'], $this->_nullReplace($params['cargo_id']), $this->_nullReplace($params['nivel']), $this->_nullReplace($params['funcionario_categoria_id']), $params['titulo']);
 		$this->disconnect_all();
 
@@ -494,5 +496,5 @@
 	function updateEmployee($params)
 	{
-		$result = $this->so->updateEmployee($params['funcionario_id'], $params['organizacao_id'], $params['area_id'], $this->_nullReplace($params['centro_custo_id']), $params['localidade_id'], $params['funcionario_status_id'], $this->_nullReplace($params['cargo_id']), $this->_nullReplace($params['nivel']), $this->_nullReplace($params['funcionario_categoria_id']));
+		$result = $this->so->updateEmployee($params['funcionario_id'], $params['organizacao_id'], $params['area_id'], $this->_nullReplace($params['centro_custo_id']), $params['localidade_id'], $params['funcionario_status_id'], $this->_nullReplace($params['cargo_id']), $this->_nullReplace($params['nivel']), $this->_nullReplace($params['funcionario_categoria_id']), $params['titulo']);
 		$this->disconnect_all();
 
@@ -611,4 +613,60 @@
 		return $result;
 	}
+
+	/**
+	 * Lista todos os telefones da organização.
+	 * @param array $params Uma array contendo o ID da organização de onde os telefones serão listados (Ajax).
+	 * @return array Lista de telefones da organização.
+	 * @access public
+	 */
+	function listTelephones( $params )
+	{
+		$result = $this -> so -> getTelephones( $params[ 'organizacao_id' ] );
+		$this -> disconnect_all( );
+
+		return $result;
+	}
+
+	/**
+	 * Adiciona um telefone a uma organização.
+	 * @param array $params Uma array contendo os parâmetros necessários para adicionar um telefone (Ajax).
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function addTelephones( $params )
+	{
+		$result = $this -> so -> addTelephone( $params[ 'organizacao_id' ], $params[ 'descricao' ], $params[ 'numero' ] );
+		$this->disconnect_all( );
+
+		return $result;
+	}
+
+	/**
+	 * Atualiza um telefone de uma organização.
+	 * @param array $params Uma array contendo os parâmetros de telefone da organização que podem ser alterados (Ajax).
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function updateTelephones( $params )
+	{
+		$result = $this -> so -> updateTelephone( $params[ 'organizacao_id' ], $params[ 'telefone_id' ], $params[ 'descricao' ], $params[ 'numero' ] );
+		$this->disconnect_all( );
+
+		return $result;
+	}
+
+	/**
+	 * Remove um telefone de uma organização.
+	 * @param array $params Uma array contendo o ID do telefone que será excluído e de sua organização (Ajax).
+	 * @return bool TRUE se a ação foi concluída com êxito e FALSE caso contrário.
+	 * @access public
+	 */
+	function removeTelephones( $params )
+	{
+		$result = $this -> so -> removeTelephone( $params[ 'organizacao_id' ], $params[ 'telefone_id' ] );
+		$this->disconnect_all( );
+
+		return $result;
+	}
 }
 ?>
Index: /trunk/workflow/js/userinterface/orgchart.js
===================================================================
--- /trunk/workflow/js/userinterface/orgchart.js	(revision 795)
+++ /trunk/workflow/js/userinterface/orgchart.js	(revision 1245)
@@ -34,9 +34,19 @@
 
 	var content = '<ul class="horizontalMenu">';
+	content += '<li style="margin: 5px 5px 0 5px">Visualizar : <select>'
+	content += '<option>-- Selecione uma opção de visualização --</option>'
+	content += '<option onclick="">Alfabética</option>'
+	content += '<option onclick="getHierarchicalArea( );">Áreas</option>'
+	content += '<option onclick="">Lotação</option>'
+	content += '<option onclick="getUsefulPhones( );">Telefones Úteis</option>'
+	content += '<option onclick="getAreaWithSubtituteBoss( )">Substituição de Chefia</option>'
+	content += '<option onclick="getCostCenters( );">Centros de Custo</option>'
+	content += '<option onclick="">Vínculos</option>'
+	content += '</select></li>';
 	content += '<li><a href="#" onclick="window.open(\'' + enderecoImagem + '\', \'extwindow\'); return false;"><img src="templateFile.php?file=images/Process.gif">&nbsp;&nbsp;Gráfico</a></li>';
-	content += '<li><a href="#" onclick="getCostCenters(); return false;"><img src="templateFile.php?file=images/coins.png">&nbsp;Centros de Custo</a></li>';
-	content += '<li><a href="#" onclick="getHierarchicalArea(); return false;"><img src="templateFile.php?file=images/orgchart_tree.png">Lista Hierárquica</a></li>';
-	content += '<li><a href="#" onclick="getAreaList(); return false;"><img src="templateFile.php?file=images/orgchart_list.png">&nbsp;&nbsp;Lista Alfabética</a></li>';
-	content += '<li><a href="#" onclick="getCategoriesList(); return false;"><img src="templateFile.php?file=images/folder_green.png">&nbsp;&nbsp;Listar Vínculos</a></li>';
+	//content += '<li><a href="#" onclick="getCostCenters(); return false;"><img src="templateFile.php?file=images/coins.png">&nbsp;Centros de Custo</a></li>';
+	//content += '<li><a href="#" onclick="getHierarchicalArea(); return false;"><img src="templateFile.php?file=images/orgchart_tree.png">Lista Hierárquica</a></li>';
+	//content += '<li><a href="#" onclick="getAreaList(); return false;"><img src="templateFile.php?file=images/orgchart_list.png">&nbsp;&nbsp;Lista Alfabética</a></li>';
+	//content += '<li><a href="#" onclick="getCategoriesList(); return false;"><img src="templateFile.php?file=images/folder_green.png">&nbsp;&nbsp;Listar Vínculos</a></li>';
 	content += '<li><a href="#" onclick="printArea(); return false;"><img src="templateFile.php?file=images/imprimir.png" width="16">&nbsp;&nbsp;Imprimir</a></li>';
 	content += '<li><a><input type="text" name="search_term" id="search_term" onkeypress="if (((event.which) ? event.which : event.keyCode) == 13) $(\'search_span\').onclick(); return true;" /><span id="search_span" style="cursor: pointer;" onclick="tmp = $$(\'div#orgchartAreas a.destaque\'); if (tmp[0]) tmp[0].removeClassName(\'destaque\'); orgchartSearchEmployee($F(\'search_term\')); return false;">&nbsp;busca</span></a></li>';
@@ -115,4 +125,63 @@
 }
 
+function displayUsefulPhones( data )
+{
+	if ( _checkError( data ) )
+		return;
+
+	var div = $('orgchartEmployees');
+	if (data.length == 0)
+	{
+		div.innerHTML = '<br/><br/><center><strong>Nenhum registro encontrado</strong></center>';
+		return;
+	}
+
+	var content = '<center><h3>TELEFONES ÚTEIS</strong></h3>';
+	content += '<table class="employeeList">';
+	content += '<tr><th>Localidade</th><th>Número</th></tr>';
+	var current;
+	var usefulPhoneCount = data.length;
+	for (var i = 0; i < usefulPhoneCount; i++)
+	{
+		current = data[i];
+		content += '<tr class="linha'+ i%2 + '">';
+		content += '<td>' + current[ 'descricao' ] + '</td>';
+		content += '<td>' + current[ 'numero' ] + '</td>';
+		content += '</tr>';
+	}
+	content += '</table>';
+	div.innerHTML = content;
+}
+
+function displayAreaWithSubtituteBoss( data )
+{
+	if ( _checkError( data ) )
+		return;
+
+	var div = $('orgchartEmployees');
+	if (data.length == 0)
+	{
+		div.innerHTML = '<br/><br/><center><strong>Nenhum registro encontrado</strong></center>';
+		return;
+	}
+
+	var content = '<center><h3>Áreas com Substituição de Chefia</strong></h3>';
+	content += '<table class="employeeList">';
+	content += '<tr><th>Área</th><th>Titular</th><th>Substituto</th></tr>';
+	var current;
+	var usefulPhoneCount = data.length;
+	for (var i = 0; i < usefulPhoneCount; i++)
+	{
+		current = data[i];
+		content += '<tr class="linha'+ i%2 + '">';
+		content += '<td>' + current['area'] + '</td>';
+		content += '<td>' + current['titular'] + '</td>';
+		content += '<td>' + current['substituto'] + '</td>';
+		content += '</tr>';
+	}
+	content += '</table>';
+	div.innerHTML = content;
+}
+
 function displayHierarchicalAreas(data)
 {
@@ -133,4 +202,14 @@
 	div.innerHTML = "<center><strong>ÁREAS</strong></center>";
 	recursivePrint(data);
+}
+
+function getUsefulPhones( )
+{
+	cExecute("$this.bo_userinterface.getUsefulPhones", displayUsefulPhones, "");
+}
+
+function getAreaWithSubtituteBoss( )
+{
+	cExecute("$this.bo_userinterface.getAreaWithSubtituteBoss", displayAreaWithSubtituteBoss, "");
 }
 
Index: /trunk/workflow/js/orgchart/organization.js
===================================================================
--- /trunk/workflow/js/orgchart/organization.js	(revision 795)
+++ /trunk/workflow/js/orgchart/organization.js	(revision 1245)
@@ -178,5 +178,9 @@
 				for (j in data[i])
 					if (typeof data[i][j] != "function")
+					{
 						dataHash[j] = data[i][j];
+						if ( dataHash[j] == null )
+							dataHash[j] = '';
+					}
 
 				for (j in tableHeader)
@@ -355,4 +359,14 @@
 Object.extend(objArea, CadastroArea);
 
+var CadastroTelefone =
+{
+	name: 'telephones',
+	required: new Array('organizacao_id', 'descricao', 'numero'),
+	tableHeader: {'descricao': 'Descrição', 'numero': 'Telefones'},
+	combo: {'id': 'telefone_id', 'name': 'descricao'}
+};
+var objTelephones = new CadastroAjax();
+Object.extend(objTelephones, CadastroTelefone);
+
 function createOrganizationLayout(organizationID, organizationDiv)
 {
@@ -380,4 +394,5 @@
 	content += '<li><a href="#" onclick="loadAddAreaUI(' + organizationID  + '); return false;" class="lbOn">Áreas</a></li>';
 	content += '<li><a href="#" onclick="loadAddEmployeeUI(' + organizationID  + '); return false;" class="lbOn">Funcionários</a></li>';
+	content += '<li><a href="#" onclick="loadAddTelephoneUI(' + organizationID  + '); return false;" class="lbOn">Telefones</a></li>';
 	content += '<li><a><input type="text" name="search_term" id="search_term" onkeypress="if (((window.Event) ? event.which : event.keyCode) == 13) $(\'search_span_' + organizationID  + '\').onclick(); return true;" /> <span id="search_span_' + organizationID + '" onclick="tmp = $$(\'div#orgchartAreas_' + organizationID + ' a.destaque\'); if (tmp[0]) tmp[0].removeClassName(\'destaque\'); searchEmployee(' + organizationID + ', $(\'orgchartEmployees_' + organizationID + '\')); return false;">busca</span></a></li>';
 	content += '</ul>';
@@ -624,4 +639,13 @@
 	content += "<table>";
 	content += '<tr><td><label for="descricao">Nome</label></td><td><input type="text" name="descricao" id="descricao" size="30" /></td></tr>';
+
+	content += '<tr><td><label for="empresa">Empresa</label></td><td><input type="text" name="empresa" id="empresa" size="80" /></td></tr>';
+	content += '<tr><td><label for="endereco">Endereço</label></td><td><input type="text" name="endereco" id="endereco" size="80" /></td></tr>';
+	content += '<tr><td><label for="complemento">Complemento</label></td><td><input type="text" name="complemento" id="complemento" size="50" /></td></tr>';
+	content += '<tr><td><label for="cep">Cep</label></td><td><input type="text" name="cep" id="cep" size="10" /></td></tr>';
+	content += '<tr><td><label for="bairro">Bairro</label></td><td><input type="text" name="bairro" id="bairro" size="30" /></td></tr>';
+	content += '<tr><td><label for="cidade">Cidade</label></td><td><input type="text" name="cidade" id="cidade" size="50" /></td></tr>';
+	content += '<tr><td><label for="uf">UF</label></td><td><input type="text" name="uf" id="uf" size="2" maxlength="2" /></td></tr>';
+
 	content += '<tr><td><label for="centro_custo_id">Centro de Custo</label></td><td id="comboCentroCusto"><i>carregando</i></td></tr>';
 	content += "</table>";
@@ -656,4 +680,7 @@
 	content += '<tr><td><label for="funcionario_categoria_id">Categoria</label></td><td id="comboFuncionarioCategoria"><i>carregando</i></td></tr>';
 	content += '<tr><td><label for="cargo_id">Cargo</label></td><td id="comboCargo"><i>carregando</i></td></tr>';
+
+	content += '<tr><td><label for="titulo">T&iacute;tulo</label></td><td><input type="text" size="30" name="titulo" id="titulo"/></td></tr>';
+
 	content += '<tr><td><label for="nivel">Nível</label></td><td><input type="text" size="3" name="nivel" id="nivel"/></td></tr>';
 	content += '<tr><td><label for="area_id">Área</label></td><td id="comboArea"><i>carregando</i></td></tr>';
@@ -758,4 +785,24 @@
 }
 
+function loadAddTelephoneUI(organizationID)
+{
+	var content;
+	content = '<h2 id="modalTitle">Adicionar Telefones da Organização</h2>';
+	content += '<form name="orgchartForm" id="orgchartForm">';
+	content += '<input type="hidden" name="organizacao_id" id="organizacao_id" value="' + organizationID + '" />';
+	content += '<table>';
+	content += '<tr><td><label for="descricao">Descrição</label></td><td><input type="text" name="descricao" id="descricao" size="50" /></td></tr>';
+	content += '<tr><td><label for="nivel">Telefones</label></td><td><input type="text" name="numero" id="numero" size="50" /></td></tr>';
+	content += "</table>";
+	content += '</form>';
+	content += '<button id="inserir" onclick="objTelephones.add(); return false;">Inserir</button>';
+	content += '<button onclick="valid.deactivate(); return false;">Cancelar</button>';
+
+	var divLB = $( 'lbContent' );
+	divLB.innerHTML = content;
+	$( 'descricao' ).focus( );
+	objTelephones.generateUpdateTable( { 'organizacao_id' : organizationID }, divLB );
+}
+
 function getEmployeeInfoTimer(e, employeeID, organizationID)
 {
Index: /trunk/workflow/js/orgchart/organizations.js
===================================================================
--- /trunk/workflow/js/orgchart/organizations.js	(revision 795)
+++ /trunk/workflow/js/orgchart/organizations.js	(revision 1245)
@@ -58,4 +58,7 @@
 	content += '<tr><td><label for="ativa">Ativa</label></td><td>' + constructSelectBox('ativa', valoresSimNao) + '</td></tr>';
 	content += '<tr><td><label for="url_imagem">Imagem</label></td><td><input tyle="text" name="url_imagem" id="url_imagem" size="50" /></td></tr>';
+
+	content += '<tr><td><label for="sitio">S&iacute;tio</label></td><td><input tyle="text" name="sitio" id="sitio" size="80" /></td></tr>';
+
 	content += "</table>";
 	content += '</form>';
